@styloviz/input-field 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +56 -0
- package/fesm2022/styloviz-input-field.mjs +980 -0
- package/fesm2022/styloviz-input-field.mjs.map +1 -0
- package/package.json +43 -0
- package/types/styloviz-input-field.d.ts +341 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"styloviz-input-field.mjs","sources":["../../../../projects/input-field-free/src/lib/input-field.component.ts","../../../../projects/input-field-free/src/lib/input-field.component.html","../../../../projects/input-field-free/src/lib/date-picker.component.ts","../../../../projects/input-field-free/src/lib/date-picker.component.html","../../../../projects/input-field-free/src/styloviz-input-field.ts"],"sourcesContent":["import {\n Component,\n input,\n output,\n model,\n computed,\n signal,\n viewChild,\n ElementRef,\n ChangeDetectionStrategy,\n forwardRef,\n} from '@angular/core';\nimport { NgClass } from '@angular/common';\nimport {\n ControlValueAccessor,\n NG_VALUE_ACCESSOR,\n NG_VALIDATORS,\n Validator,\n AbstractControl,\n ValidationErrors,\n} from '@angular/forms';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport type InputType =\n | 'text' | 'email' | 'password' | 'number' | 'tel'\n | 'url' | 'search' | 'date' | 'datetime-local' | 'time'\n | 'month' | 'week' | 'color';\n\nexport type InputSize = 'sm' | 'md' | 'lg';\nexport type InputVariant = 'default' | 'filled' | 'flushed';\nexport type InputState = 'default' | 'error' | 'success' | 'warning';\n\nexport type InputMode =\n | 'none' | 'text' | 'decimal' | 'numeric'\n | 'tel' | 'search' | 'email' | 'url';\n\n/**\n * A single option for select / datalist suggestion.\n */\nexport interface InputOption {\n value: string;\n label: string;\n disabled?: boolean;\n}\n\n/** Process-wide counter for generating unique fallback ids. */\nlet _svInputUid = 0;\n\n// ─── Component ───────────────────────────────────────────────────────────────\n\n/**\n * InputField — A premium form input for dashboards.\n *\n * Features:\n * - text, email, password, number, tel, url, date, time, color, …\n * - Textarea mode (multiline) via `multiline` input\n * - Select mode via `options` input\n * - 3 visual variants: default (bordered) · filled · flushed (underline)\n * - 3 sizes: sm · md · lg\n * - 4 validation states: default · error · success · warning\n * - Leading / trailing icon slots (SVG path)\n * - Inline leading / trailing text addons (e.g. \"https://\", \".com\")\n * - Password show/hide toggle built-in\n * - Character counter with optional max-length\n * - Helper text and error message slots\n * - Full ControlValueAccessor — works with `formControl`, `formControlName`, `ngModel`\n * - Accessible: `<label>`, `aria-describedby`, `aria-invalid`, focus-visible ring\n */\n@Component({\n selector: 'sv-input-field',\n standalone: true,\n imports: [NgClass],\n templateUrl: './input-field.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => SvInputFieldComponent),\n multi: true,\n },\n {\n provide: NG_VALIDATORS,\n useExisting: forwardRef(() => SvInputFieldComponent),\n multi: true,\n },\n ],\n})\nexport class SvInputFieldComponent implements ControlValueAccessor, Validator {\n // ── Core ──────────────────────────────────────────────────────────────────\n\n /** Current value. Use `[(value)]` for signal two-way binding. */\n value = model<string>('');\n\n /** Input type. @default 'text' */\n type = input<InputType>('text');\n\n /** Renders a `<textarea>` instead of `<input>`. @default false */\n multiline = input<boolean>(false);\n\n /**\n * When set, renders a `<select>` element.\n * Use `type` is ignored when options are provided.\n */\n options = input<InputOption[]>([]);\n\n // ── Labels & helpers ──────────────────────────────────────────────────────\n\n /** Label text shown above the input. */\n label = input<string>('');\n\n /** Marks the label with a red asterisk. @default false */\n required = input<boolean>(false);\n\n /** Optional label (replaces asterisk with a soft \"(optional)\" tag). @default false */\n optionalTag = input<boolean>(false);\n\n /** Placeholder text. */\n placeholder = input<string>('');\n\n /** Helper text shown below the input (hidden when `errorMessage` is set). */\n hint = input<string>('');\n\n /** Error message — switches state to `error` automatically when non-empty. */\n errorMessage = input<string>('');\n\n /** Success message — shown below when state is `success`. */\n successMessage = input<string>('');\n\n // ── Appearance ────────────────────────────────────────────────────────────\n\n /** Visual style. @default 'default' */\n variant = input<InputVariant>('default');\n\n /** Size. @default 'md' */\n size = input<InputSize>('md');\n\n /**\n * Explicit validation state override.\n * Automatically set to `'error'` when `errorMessage` is non-empty.\n * @default 'default'\n */\n state = input<InputState>('default');\n\n // ── Icons & addons ────────────────────────────────────────────────────────\n\n /** SVG `<path d=\"...\">` for the leading (left) icon. */\n leadingIconPath = input<string>('');\n\n /** SVG `<path d=\"...\">` for the trailing (right) icon. */\n trailingIconPath = input<string>('');\n\n /**\n * Short text prepended inside the input (e.g. `'https://'`, `'$'`).\n * Ignored when `leadingIconPath` is set.\n */\n leadingAddon = input<string>('');\n\n /**\n * Short text appended inside the input (e.g. `'.com'`, `'USD'`).\n * Ignored when `trailingIconPath` is set.\n */\n trailingAddon = input<string>('');\n\n // ── Character counter ─────────────────────────────────────────────────────\n\n /**\n * Maximum character count shown as a counter below the input.\n * Set to 0 to disable. @default 0\n */\n maxLength = input<number>(0);\n\n // ── State ─────────────────────────────────────────────────────────────────\n\n /** Disable the input. @default false */\n disabled = input<boolean>(false);\n\n /** Read-only mode. @default false */\n readonly = input<boolean>(false);\n\n /** Show a loading spinner in the trailing position. @default false */\n loading = input<boolean>(false);\n\n /** id forwarded to the native input — required for external `<label for>`. */\n inputId = input<string>('');\n\n /** name attribute for the native input. */\n inputName = input<string>('');\n\n /** Additional CSS classes on the root wrapper. */\n customClass = input<string>('');\n\n // ── Native constraints & hints ──────────────────────────────────────────────\n\n /**\n * `autocomplete` token (e.g. 'email', 'name', 'current-password', 'one-time-code').\n * Defaults to 'current-password' for password type, otherwise the browser default.\n */\n autocomplete = input<string>('');\n\n /** Virtual-keyboard hint for mobile (e.g. 'numeric', 'email', 'tel'). */\n inputMode = input<InputMode | ''>('');\n\n /** Native validation regex (without anchors — anchored automatically). */\n pattern = input<string>('');\n\n /** Minimum length used by the built-in Validator and native `minlength`. @default 0 */\n minLength = input<number>(0);\n\n /** Native `min` for number/date/range types. */\n min = input<string | number | null>(null);\n\n /** Native `max` for number/date/range types. */\n max = input<string | number | null>(null);\n\n /** Native `step` for number/date/range types. */\n step = input<string | number | null>(null);\n\n /** Native spellcheck toggle. null = browser default. */\n spellcheck = input<boolean | null>(null);\n\n /** Autofocus the control on render. @default false */\n autofocus = input<boolean>(false);\n\n // ── Outputs ───────────────────────────────────────────────────────────────\n // Note: `value = model<string>('')` already auto-emits `valueChange` when\n // value.set() is called — no separate output needed.\n\n /** Emits when the input gains focus. */\n focused = output<FocusEvent>();\n\n /** Emits when the input loses focus. */\n blurred = output<FocusEvent>();\n\n /** Emits when Enter is pressed. */\n submitted = output<string>();\n\n // ── Internal state ────────────────────────────────────────────────────────\n\n readonly isFocused = signal(false);\n readonly showPassword = signal(false);\n\n readonly inputRef = viewChild<ElementRef<HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement>>('inputEl');\n\n // ── CVA ───────────────────────────────────────────────────────────────────\n\n private _onChange: (v: string) => void = () => {};\n private _onTouched: () => void = () => {};\n\n /** Tracks disabled state set programmatically via formControl.disable(). */\n private readonly _formDisabled = signal(false);\n\n /**\n * Merged disabled state — true when either the [disabled] input or the\n * parent FormControl is disabled. Use this everywhere instead of disabled().\n */\n readonly resolvedDisabled = computed(() => this.disabled() || this._formDisabled());\n\n writeValue(val: string): void { this.value.set(val ?? ''); }\n registerOnChange(fn: (v: string) => void): void { this._onChange = fn; }\n registerOnTouched(fn: () => void): void { this._onTouched = fn; }\n setDisabledState(isDisabled: boolean): void { this._formDisabled.set(isDisabled); }\n\n validate(_: AbstractControl): ValidationErrors | null {\n const errors: ValidationErrors = {};\n const v = this.value() ?? '';\n const max = this.maxLength();\n const min = this.minLength();\n\n if (this.required() && v.length === 0) {\n errors['required'] = true;\n }\n if (max > 0 && v.length > max) {\n errors['maxlength'] = { requiredLength: max, actualLength: v.length };\n }\n if (min > 0 && v.length > 0 && v.length < min) {\n errors['minlength'] = { requiredLength: min, actualLength: v.length };\n }\n const pat = this.pattern();\n if (pat && v.length > 0) {\n try {\n if (!new RegExp(`^(?:${pat})$`).test(v)) {\n errors['pattern'] = { requiredPattern: pat, actualValue: v };\n }\n } catch {\n // Invalid regex supplied — skip pattern validation rather than throw.\n }\n }\n return Object.keys(errors).length > 0 ? errors : null;\n }\n\n // ── Event handlers ────────────────────────────────────────────────────────\n\n onNativeChange(event: Event): void {\n const val = (event.target as HTMLInputElement).value;\n this.value.set(val); // model().set() auto-emits valueChange\n this._onChange(val);\n }\n\n onFocus(e: FocusEvent): void {\n this.isFocused.set(true);\n this.focused.emit(e);\n }\n onBlur(e: FocusEvent): void {\n this.isFocused.set(false);\n this._onTouched();\n this.blurred.emit(e);\n }\n\n onKeydown(event: KeyboardEvent): void {\n if (event.key === 'Enter' && !this.multiline()) {\n this.submitted.emit(this.value());\n }\n }\n\n togglePassword(): void { this.showPassword.update(v => !v); }\n\n // ── Computed helpers ──────────────────────────────────────────────────────\n\n /** Stable unique fallback id so label + aria associations always work. */\n private readonly _autoId = `sv-input-${++_svInputUid}`;\n /** Effective id used by the native control and its <label for>. */\n readonly resolvedId = computed(() => this.inputId() || this._autoId);\n /** Id of the hint/error/success description element. */\n readonly describedById = computed(() => `${this.resolvedId()}-desc`);\n\n isSelect = computed(() => this.options().length > 0);\n isPassword = computed(() => this.type() === 'password');\n isColor = computed(() => this.type() === 'color');\n isFloating = computed(() => false);\n labelIsFloated = computed(() => this.isFocused() || !!this.value());\n\n resolvedType = computed<string>(() => {\n if (this.isPassword()) return this.showPassword() ? 'text' : 'password';\n return this.type();\n });\n\n resolvedState = computed<InputState>(() =>\n this.errorMessage() ? 'error' : this.state()\n );\n\n charCount = computed(() => this.value().length);\n showCounter = computed(() => this.maxLength() > 0);\n counterOver = computed(() => this.maxLength() > 0 && this.charCount() > this.maxLength());\n\n showHint = computed(() => !!this.hint() && !this.errorMessage() && !this.successMessage());\n showError = computed(() => !!this.errorMessage());\n showSuccess = computed(() => !!this.successMessage() && !this.errorMessage());\n\n /** True when any below-field description (hint/error/success) is rendered. */\n hasDescription = computed(() => this.showHint() || this.showError() || this.showSuccess());\n\n /** Resolved autocomplete token. Smart default for passwords, else explicit value. */\n resolvedAutocomplete = computed<string | null>(() => {\n if (this.autocomplete()) return this.autocomplete();\n if (this.isPassword()) return 'current-password';\n return null;\n });\n\n hasLeading = computed(() => !!this.leadingIconPath() || !!this.leadingAddon());\n hasTrailing = computed(() =>\n !!this.trailingIconPath() || !!this.trailingAddon() ||\n this.isPassword() || this.loading()\n );\n\n // ── Class maps ────────────────────────────────────────────────────────────\n\n rootClasses = computed(() => ['w-full', this.customClass()].filter(Boolean).join(' '));\n\n floatingLabelClasses = computed<string>(() => {\n const floated = this.labelIsFloated();\n const s = this.resolvedState();\n const focused = this.isFocused();\n\n // When leading icon/addon present, offset label so it doesn't overlap\n const notFloatedLeft = this.hasLeading() ? 'left-10' : 'left-3.5';\n const floatedLeft = this.hasLeading() ? 'left-8' : 'left-3';\n const left = floated ? floatedLeft : notFloatedLeft;\n\n // For multiline, label sits near the top (not vertical-center) when not floated\n const isMulti = this.multiline();\n const notFloatedTopMap: Record<InputSize, string> = { sm: 'top-3', md: 'top-4', lg: 'top-5' };\n const notFloatedTop = isMulti ? notFloatedTopMap[this.size()] : 'top-1/2';\n const notFloatedTranslate = isMulti ? '' : '-translate-y-1/2';\n\n const textSize = floated ? 'text-[0.7rem] leading-none' : this.labelSizeClass();\n const bg = floated ? 'px-1 bg-white dark:bg-gray-900' : '';\n\n let color: string;\n if (floated && focused) {\n color = s === 'error' ? 'text-red-500'\n : s === 'success' ? 'text-emerald-500'\n : s === 'warning' ? 'text-amber-500'\n : 'text-blue-600 dark:text-blue-400';\n } else if (floated) {\n color = s === 'error' ? 'text-red-500 dark:text-red-400'\n : s === 'success' ? 'text-emerald-600 dark:text-emerald-400'\n : s === 'warning' ? 'text-amber-600 dark:text-amber-400'\n : 'text-gray-500 dark:text-gray-400';\n } else {\n color = 'text-gray-500 dark:text-gray-400';\n }\n\n const position = floated\n ? `${left} -top-px -translate-y-1/2`\n : `${left} ${notFloatedTop} ${notFloatedTranslate}`.trim();\n\n return [\n 'absolute z-10 pointer-events-none select-none',\n 'transition-[top,left,font-size,color,padding,background-color] duration-200 ease-in-out',\n position,\n textSize,\n bg,\n color,\n ].filter(Boolean).join(' ');\n });\n\n labelSizeClass = computed<string>(() => {\n switch (this.size()) {\n case 'sm': return 'text-xs';\n case 'lg': return 'text-base';\n default: return 'text-sm';\n }\n });\n\n /** Outer track that wraps the native input + addons + icons. */\n trackClasses = computed<string>(() => {\n const v = this.variant();\n const s = this.resolvedState();\n const focused = this.isFocused();\n\n // Base layout — multiline uses items-start so leading icons align to the top\n const base = `relative flex ${this.multiline() ? 'items-start' : 'items-center'} w-full transition-all duration-150`;\n\n // Height / font size\n const sizeMap: Record<InputSize, string> = {\n sm: 'text-xs',\n md: 'text-sm',\n lg: 'text-base',\n };\n\n // Variant shape & surface\n const variantBase: Record<InputVariant, string> = {\n default: 'rounded-md border bg-white dark:bg-gray-900',\n filled: 'rounded-md border-0 bg-gray-100 dark:bg-gray-800',\n flushed: 'border-b-2 bg-transparent rounded-none',\n };\n\n // State-driven border/ring\n const isFlushed = v === 'flushed';\n const stateIdle: Record<InputState, string> = {\n default: isFlushed\n ? 'border-gray-300 dark:border-gray-600'\n : 'border-gray-300 dark:border-gray-700',\n error: isFlushed\n ? 'border-red-500 dark:border-red-500'\n : 'border-red-400 dark:border-red-500',\n success: isFlushed\n ? 'border-emerald-500 dark:border-emerald-500'\n : 'border-emerald-400 dark:border-emerald-500',\n warning: isFlushed\n ? 'border-amber-500 dark:border-amber-500'\n : 'border-amber-400 dark:border-amber-500',\n };\n\n const stateFocus: Record<InputState, string> = {\n default: isFlushed\n ? 'border-blue-500 dark:border-blue-400'\n : 'border-blue-500 ring-2 ring-blue-500/20 dark:border-blue-400 dark:ring-blue-400/20',\n error: isFlushed\n ? 'border-red-500'\n : 'border-red-500 ring-2 ring-red-500/20',\n success: isFlushed\n ? 'border-emerald-500'\n : 'border-emerald-500 ring-2 ring-emerald-500/20',\n warning: isFlushed\n ? 'border-amber-500'\n : 'border-amber-500 ring-2 ring-amber-500/20',\n };\n\n const disabledClass = this.resolvedDisabled()\n ? 'cursor-not-allowed opacity-60 pointer-events-none'\n : '';\n\n return [\n base,\n sizeMap[this.size()],\n variantBase[v],\n focused ? stateFocus[s] : stateIdle[s],\n disabledClass,\n ].filter(Boolean).join(' ');\n });\n\n /** The native `<input>`, `<textarea>` or `<select>` element. */\n nativeInputClasses = computed<string>(() => {\n const padL = this.hasLeading() ? 'pl-0' : this.sidepadding();\n const padR = this.hasTrailing() ? 'pr-0' : this.sidepadding();\n const multi = this.multiline();\n\n return [\n 'flex-1 min-w-0 bg-transparent outline-none',\n 'text-gray-900 dark:text-white',\n 'placeholder-gray-400 dark:placeholder-gray-500',\n 'disabled:cursor-not-allowed',\n padL, padR,\n multi ? `resize-y ${this.multilineVertPadding()} min-h-[5rem]` : this.heightClass(),\n this.isColor() ? 'h-10 w-full cursor-pointer rounded-lg p-1' : '',\n ].filter(Boolean).join(' ');\n });\n\n private sidepadding = computed<string>(() => {\n switch (this.size()) {\n case 'sm': return 'px-2.5';\n case 'lg': return 'px-4';\n default: return 'px-3.5';\n }\n });\n\n private vertPadding = computed<string>(() => {\n switch (this.size()) {\n case 'sm': return 'py-1.5';\n case 'lg': return 'py-3';\n default: return 'py-2';\n }\n });\n\n /** Vertical padding for multiline (textarea) — adds extra top space when floating. */\n private multilineVertPadding = computed<string>(() => {\n if (this.isFloating()) {\n switch (this.size()) {\n case 'sm': return 'pt-4 pb-2';\n case 'lg': return 'pt-5 pb-3';\n default: return 'pt-5 pb-3';\n }\n }\n return this.vertPadding();\n });\n\n private heightClass = computed<string>(() => {\n if (this.isFloating()) {\n switch (this.size()) {\n case 'sm': return 'h-12 pt-2 pb-1';\n case 'lg': return 'h-16 pt-4 pb-2';\n default: return 'h-14 pt-3 pb-2';\n }\n }\n switch (this.size()) {\n case 'sm': return 'h-8 py-0';\n case 'lg': return 'h-12 py-0';\n default: return 'h-10 py-0';\n }\n });\n\n addonClasses = computed<string>(() =>\n `flex shrink-0 items-center ${this.vertPadding()} text-gray-500 dark:text-gray-400 text-sm select-none`\n );\n\n leadingAddonClasses = computed<string>(() =>\n `${this.addonClasses()} pl-3.5 border-r border-gray-200 dark:border-gray-700 mr-3.5 pr-3`\n );\n\n trailingAddonClasses = computed<string>(() =>\n `${this.addonClasses()} pr-3.5 border-l border-gray-200 dark:border-gray-700 ml-3.5 pl-3`\n );\n\n iconClass = computed<string>(() => {\n switch (this.size()) {\n case 'sm': return 'h-3.5 w-3.5';\n case 'lg': return 'h-5 w-5';\n default: return 'h-4 w-4';\n }\n });\n\n iconPadClass = computed<string>(() => {\n switch (this.size()) {\n case 'sm': return 'px-2';\n case 'lg': return 'px-3.5';\n default: return 'px-3';\n }\n });\n\n stateIconPath = computed<string>(() => {\n switch (this.resolvedState()) {\n case 'error': return 'M12 8v4m0 4h.01M10.29 3.86 1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z';\n case 'success': return 'M22 11.08V12a10 10 0 1 1-5.93-9.14M22 4 12 14.01l-3-3';\n case 'warning': return 'M10.29 3.86 1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0zM12 9v4M12 17h.01';\n default: return '';\n }\n });\n\n stateIconColorClass = computed<string>(() => {\n switch (this.resolvedState()) {\n case 'error': return 'text-red-500';\n case 'success': return 'text-emerald-500';\n case 'warning': return 'text-amber-500';\n default: return 'text-gray-400';\n }\n });\n\n hintColorClass = computed<string>(() => {\n switch (this.resolvedState()) {\n case 'error': return 'text-red-600 dark:text-red-400';\n case 'success': return 'text-emerald-600 dark:text-emerald-400';\n case 'warning': return 'text-amber-600 dark:text-amber-400';\n default: return 'text-gray-500 dark:text-gray-400';\n }\n });\n\n // ── Public API ────────────────────────────────────────────────────────────\n\n focus(): void {\n (this.inputRef()?.nativeElement as HTMLElement | undefined)?.focus();\n }\n}\n","<!-- Root wrapper -->\n<div [ngClass]=\"rootClasses()\" class=\"flex flex-col gap-1.5\">\n\n <!-- ── Label row (hidden for floating variant) ────────────────────────────── -->\n @if (label()) {\n <div class=\"flex items-baseline justify-between gap-2\">\n <label\n [ngClass]=\"['font-medium text-gray-700 dark:text-gray-200', labelSizeClass()]\"\n [attr.for]=\"resolvedId()\"\n >\n {{ label() }}\n @if (required()) {\n <span class=\"ml-0.5 text-red-500\" aria-hidden=\"true\">*</span>\n }\n @if (optionalTag() && !required()) {\n <span class=\"ml-1.5 font-normal text-gray-500 dark:text-gray-400 text-xs\">(optional)</span>\n }\n </label>\n </div>\n }\n\n <!-- ── Input track ────────────────────────────────────────────────────── -->\n <div [ngClass]=\"trackClasses()\">\n <!-- Floating label (renders inside track, animates to border on focus/value) -->\n @if (isFloating() && label()) {\n <label\n [ngClass]=\"floatingLabelClasses()\"\n [attr.for]=\"resolvedId()\"\n >\n {{ label() }}\n @if (required()) {\n <span class=\"ml-0.5 text-red-500\" aria-hidden=\"true\">*</span>\n }\n </label>\n }\n <!-- Leading icon -->\n @if (leadingIconPath() && !leadingAddon()) {\n <span\n class=\"flex shrink-0 items-center\"\n [ngClass]=\"[iconPadClass(), 'text-gray-500 dark:text-gray-400']\"\n aria-hidden=\"true\"\n >\n <svg [ngClass]=\"iconClass()\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path [attr.d]=\"leadingIconPath()\" />\n </svg>\n </span>\n }\n\n <!-- Leading text addon (e.g. \"https://\") -->\n @if (leadingAddon() && !leadingIconPath()) {\n <span [ngClass]=\"leadingAddonClasses()\">{{ leadingAddon() }}</span>\n }\n\n <!-- ── Native <select> ── -->\n @if (isSelect()) {\n <select\n #inputEl\n [ngClass]=\"nativeInputClasses()\"\n [attr.id]=\"resolvedId()\"\n [attr.name]=\"inputName() || null\"\n [disabled]=\"resolvedDisabled()\"\n [attr.autofocus]=\"autofocus() ? '' : null\"\n [attr.aria-required]=\"required() || null\"\n [attr.aria-invalid]=\"resolvedState() === 'error' || null\"\n [attr.aria-describedby]=\"hasDescription() ? describedById() : null\"\n [value]=\"value()\"\n (change)=\"onNativeChange($event)\"\n (focus)=\"onFocus($event)\"\n (blur)=\"onBlur($event)\"\n >\n @if (placeholder()) {\n <option value=\"\" disabled [selected]=\"!value()\">{{ isFloating() && !labelIsFloated() ? '' : placeholder() }}</option>\n }\n @for (opt of options(); track opt.value) {\n <option\n [value]=\"opt.value\"\n [disabled]=\"opt.disabled ?? false\"\n [selected]=\"value() === opt.value\"\n >{{ opt.label }}</option>\n }\n </select>\n\n <!-- ── Native <textarea> ── -->\n } @else if (multiline()) {\n <textarea\n #inputEl\n [ngClass]=\"nativeInputClasses()\"\n [attr.id]=\"resolvedId()\"\n [attr.name]=\"inputName() || null\"\n [placeholder]=\"isFloating() && !labelIsFloated() ? ' ' : placeholder()\"\n [disabled]=\"resolvedDisabled()\"\n [readOnly]=\"readonly()\"\n [attr.maxlength]=\"maxLength() > 0 ? maxLength() : null\"\n [attr.minlength]=\"minLength() > 0 ? minLength() : null\"\n [attr.spellcheck]=\"spellcheck()\"\n [attr.autofocus]=\"autofocus() ? '' : null\"\n [attr.aria-required]=\"required() || null\"\n [attr.aria-invalid]=\"resolvedState() === 'error' || null\"\n [attr.aria-describedby]=\"hasDescription() ? describedById() : null\"\n [value]=\"value()\"\n (input)=\"onNativeChange($event)\"\n (focus)=\"onFocus($event)\"\n (blur)=\"onBlur($event)\"\n ></textarea>\n\n <!-- ── Native <input> (default) ── -->\n } @else {\n <input\n #inputEl\n [ngClass]=\"nativeInputClasses()\"\n [type]=\"resolvedType()\"\n [attr.id]=\"resolvedId()\"\n [attr.name]=\"inputName() || null\"\n [placeholder]=\"isFloating() && !labelIsFloated() ? ' ' : placeholder()\"\n [disabled]=\"resolvedDisabled()\"\n [readOnly]=\"readonly()\"\n [attr.maxlength]=\"maxLength() > 0 ? maxLength() : null\"\n [attr.minlength]=\"minLength() > 0 ? minLength() : null\"\n [attr.pattern]=\"pattern() || null\"\n [attr.min]=\"min()\"\n [attr.max]=\"max()\"\n [attr.step]=\"step()\"\n [attr.inputmode]=\"inputMode() || null\"\n [attr.spellcheck]=\"spellcheck()\"\n [attr.autofocus]=\"autofocus() ? '' : null\"\n [attr.autocomplete]=\"resolvedAutocomplete()\"\n [attr.aria-required]=\"required() || null\"\n [attr.aria-invalid]=\"resolvedState() === 'error' || null\"\n [attr.aria-describedby]=\"hasDescription() ? describedById() : null\"\n [value]=\"value()\"\n (input)=\"onNativeChange($event)\"\n (keydown)=\"onKeydown($event)\"\n (focus)=\"onFocus($event)\"\n (blur)=\"onBlur($event)\"\n />\n }\n\n <!-- Loading spinner -->\n @if (loading()) {\n <span class=\"flex shrink-0 items-center pr-3 text-gray-400\" aria-hidden=\"true\">\n <svg [ngClass]=\"iconClass()\" class=\"animate-spin\" fill=\"none\" viewBox=\"0 0 24 24\">\n <circle class=\"opacity-25\" cx=\"12\" cy=\"12\" r=\"10\"\n stroke=\"currentColor\" stroke-width=\"4\"/>\n <path class=\"opacity-75\" fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z\"/>\n </svg>\n </span>\n\n <!-- Password eye toggle -->\n } @else if (isPassword() && !loading()) {\n <button\n type=\"button\"\n class=\"flex shrink-0 items-center pr-3 text-gray-400 hover:text-gray-600\n dark:hover:text-gray-300 focus:outline-none focus-visible:ring-2\n focus-visible:ring-blue-400 rounded\"\n (click)=\"togglePassword()\"\n [attr.aria-label]=\"showPassword() ? 'Hide password' : 'Show password'\"\n [attr.aria-pressed]=\"showPassword()\"\n [attr.aria-controls]=\"resolvedId()\"\n >\n @if (showPassword()) {\n <!-- Eye-off -->\n <svg [ngClass]=\"iconClass()\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M17.94 17.94A10.07 10.07 0 0 1 12 20c-7 0-11-8-11-8a18.45 18.45 0 0 1 5.06-5.94M9.9 4.24A9.12 9.12 0 0 1 12 4c7 0 11 8 11 8a18.5 18.5 0 0 1-2.16 3.19m-6.72-1.07a3 3 0 1 1-4.24-4.24M1 1l22 22\"/>\n </svg>\n } @else {\n <!-- Eye -->\n <svg [ngClass]=\"iconClass()\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\"/>\n <circle cx=\"12\" cy=\"12\" r=\"3\"/>\n </svg>\n }\n </button>\n\n <!-- State icon (error / success / warning) — only when no trailing icon/addon -->\n } @else if (stateIconPath() && !trailingIconPath() && !trailingAddon()) {\n <span\n class=\"flex shrink-0 items-center pr-3\"\n [ngClass]=\"stateIconColorClass()\"\n aria-hidden=\"true\"\n >\n <svg [ngClass]=\"iconClass()\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path [attr.d]=\"stateIconPath()\" />\n </svg>\n </span>\n\n <!-- Custom trailing icon -->\n } @else if (trailingIconPath() && !trailingAddon()) {\n <span\n class=\"flex shrink-0 items-center text-gray-500 dark:text-gray-400\"\n [ngClass]=\"iconPadClass()\"\n aria-hidden=\"true\"\n >\n <svg [ngClass]=\"iconClass()\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\">\n <path [attr.d]=\"trailingIconPath()\" />\n </svg>\n </span>\n }\n\n <!-- Trailing text addon (e.g. \".com\", \"USD\") -->\n @if (trailingAddon() && !trailingIconPath()) {\n <span [ngClass]=\"trailingAddonClasses()\">{{ trailingAddon() }}</span>\n }\n\n </div>\n\n <!-- ── Below-input row: hint / error / counter ───────────────────────── -->\n @if (showHint() || showError() || showSuccess() || showCounter()) {\n <div class=\"flex items-start justify-between gap-2\">\n\n <!-- Left: hint / error / success message -->\n <div>\n @if (showError()) {\n <p\n [attr.id]=\"describedById()\"\n class=\"flex items-center gap-1 text-xs font-medium text-red-600 dark:text-red-400\"\n role=\"alert\"\n >\n <svg class=\"h-3.5 w-3.5 shrink-0\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"10\"/>\n <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"/>\n <line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"/>\n </svg>\n {{ errorMessage() }}\n </p>\n }\n @if (showSuccess()) {\n <p\n [attr.id]=\"describedById()\"\n class=\"flex items-center gap-1 text-xs font-medium text-emerald-600 dark:text-emerald-400\"\n >\n <svg class=\"h-3.5 w-3.5 shrink-0\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"currentColor\" stroke-width=\"2\"\n stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M22 11.08V12a10 10 0 1 1-5.93-9.14M22 4 12 14.01l-3-3\"/>\n </svg>\n {{ successMessage() }}\n </p>\n }\n @if (showHint()) {\n <p\n [attr.id]=\"describedById()\"\n [ngClass]=\"['text-xs', hintColorClass()]\"\n >\n {{ hint() }}\n </p>\n }\n </div>\n\n <!-- Right: character counter -->\n @if (showCounter()) {\n <p\n class=\"shrink-0 text-xs tabular-nums\"\n [ngClass]=\"counterOver()\n ? 'font-semibold text-red-600 dark:text-red-400'\n : 'text-gray-500 dark:text-gray-400'\"\n aria-live=\"polite\"\n >\n {{ charCount() }} / {{ maxLength() }}\n </p>\n }\n\n </div>\n }\n\n</div>\n","import {\n ApplicationRef,\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n EmbeddedViewRef,\n forwardRef,\n HostListener,\n inject,\n input,\n model,\n OnDestroy,\n OnInit,\n output,\n signal,\n TemplateRef,\n ViewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport { NgClass } from '@angular/common';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\n/** A single cell in the calendar day grid. */\nexport interface CalendarDay {\n readonly date: Date;\n readonly label: number;\n readonly isCurrentMonth: boolean;\n readonly isToday: boolean;\n readonly isSelected: boolean;\n readonly isDisabled: boolean;\n readonly key: string;\n}\n\nconst WEEKDAYS = ['Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su'] as const;\nconst MONTH_NAMES = [\n 'January', 'February', 'March', 'April',\n 'May', 'June', 'July', 'August',\n 'September', 'October', 'November', 'December',\n] as const;\n\n/** Panel width (px) — matches the 17.5 rem CSS width in the template. */\nconst PANEL_W = 280;\n/** Conservative day-view panel height for flip calculation (px). */\nconst PANEL_H = 390;\n/** Gap between trigger edge and panel (px). */\nconst GAP = 6;\n\n/**\n * SvDatePickerComponent — premium custom calendar date picker.\n *\n * The popover panel is rendered directly into `document.body` via a lightweight\n * Angular embedded-view portal so it is completely outside any parent\n * `overflow:hidden`, `overflow:auto`, or CSS `transform` containment.\n * A capture-phase, RAF-throttled scroll listener keeps the panel anchored to\n * the trigger — including when a nested scrollable ancestor scrolls, not just\n * the window — and the horizontal position is clamped so it never renders\n * partially outside the viewport. Resize closes the panel instead of\n * repositioning it with stale coordinates.\n *\n * @example\n * ```html\n * <sv-date-picker label=\"Start Date\" [(value)]=\"dateStr\" minDate=\"2024-01-01\" />\n * ```\n */\n@Component({\n selector: 'sv-date-picker',\n standalone: true,\n imports: [NgClass],\n templateUrl: './date-picker.component.html',\n styleUrl: './date-picker.component.css',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => SvDatePickerComponent),\n multi: true,\n },\n ],\n})\nexport class SvDatePickerComponent implements OnInit, OnDestroy, ControlValueAccessor {\n\n // ─── Inputs ───────────────────────────────────────────────────────────────\n\n /** Two-way bindable YYYY-MM-DD date string. */\n readonly value = model<string>('');\n\n /** Label rendered above the trigger. */\n readonly label = input<string>('');\n\n /** Placeholder shown when no date is selected. */\n readonly placeholder = input<string>('Select date');\n\n /** Minimum selectable date (YYYY-MM-DD). Cells before it are disabled. */\n readonly minDate = input<string>('');\n\n /** Maximum selectable date (YYYY-MM-DD). Cells after it are disabled. */\n readonly maxDate = input<string>('');\n\n /** Disables the trigger and prevents the popover from opening. */\n readonly disabled = input<boolean>(false);\n\n /** Shows a red asterisk in the label. */\n readonly required = input<boolean>(false);\n\n /** Explicit accessible name for the trigger (falls back to `label`). */\n readonly ariaLabel = input<string>('');\n\n // ─── Outputs ──────────────────────────────────────────────────────────────\n // Note: the `value` model already emits `valueChange` for `[(value)]`.\n\n /** Emitted when the calendar popover opens. */\n readonly opened = output<void>();\n /** Emitted when the calendar popover closes. */\n readonly closed = output<void>();\n\n // ─── ControlValueAccessor ───────────────────────────────────────────────────\n // Lets the picker bind to reactive forms (`formControlName` / `[formControl]`)\n // and template-driven forms (`[(ngModel)]`) in addition to `[(value)]`.\n\n private _onChange: (v: string) => void = () => {};\n private _onTouched: () => void = () => {};\n private readonly _formDisabled = signal(false);\n\n /** Merged disabled — the `[disabled]` input OR a disabled parent FormControl. */\n readonly resolvedDisabled = computed(() => this.disabled() || this._formDisabled());\n\n writeValue(v: string): void { this.value.set(v ?? ''); }\n registerOnChange(fn: (v: string) => void): void { this._onChange = fn; }\n registerOnTouched(fn: () => void): void { this._onTouched = fn; }\n setDisabledState(isDisabled: boolean): void {\n this._formDisabled.set(isDisabled);\n if (isDisabled && this.isOpen()) this.close();\n }\n\n /** Sets the value from a user gesture and notifies the form (change + touched). */\n private commitValue(v: string): void {\n this.value.set(v);\n this._onChange(v);\n this._onTouched();\n }\n\n // ─── View refs ────────────────────────────────────────────────────────────\n\n /** The ng-template that holds the calendar panel markup. */\n @ViewChild('panelTpl', { read: TemplateRef })\n private readonly panelTpl!: TemplateRef<object>;\n\n // ─── Internal state ───────────────────────────────────────────────────────\n\n readonly isOpen = signal(false);\n readonly viewYear = signal(new Date().getFullYear());\n readonly viewMonth = signal(new Date().getMonth());\n readonly viewMode = signal<'days' | 'months' | 'years'>('days');\n readonly openAbove = signal(false);\n readonly alignRight = signal(false);\n\n /** YYYY-MM-DD of the keyboard-focused day cell (roving tabindex). */\n readonly activeKey = signal<string>('');\n\n /**\n * Inline style object applied to the panel.\n * Uses position:fixed with exact viewport coords so the panel\n * escapes all parent overflow and transform containment.\n */\n readonly panelStyle = signal<Record<string, string>>({});\n\n // ─── Portal state ─────────────────────────────────────────────────────────\n\n /** Container div appended to document.body while the panel is open. */\n private portalEl: HTMLElement | null = null;\n /** Embedded view holding the panel template nodes. */\n private portalView: EmbeddedViewRef<object> | null = null;\n\n /**\n * Capture-phase scroll listener — fires for ANY scrollable ancestor\n * (not just the window), RAF-throttled so it never runs more than once\n * per frame. Repositions the panel to keep it anchored to the trigger\n * instead of drifting or closing (see dropdown-instruction.md §6).\n */\n private _rafId: number | null = null;\n private readonly _scrollHandler = (): void => {\n if (!this.isOpen()) return;\n if (this._rafId !== null) return;\n this._rafId = requestAnimationFrame(() => {\n this._rafId = null;\n if (this.isOpen()) {\n this._calcPos();\n this.portalView?.detectChanges();\n }\n });\n };\n\n // ─── Static data ──────────────────────────────────────────────────────────\n\n readonly weekDays = WEEKDAYS;\n readonly monthNames = MONTH_NAMES;\n\n readonly yearRange = computed(() => {\n const base = Math.floor(this.viewYear() / 10) * 10 - 5;\n return Array.from({ length: 20 }, (_, i) => base + i);\n });\n\n readonly displayValue = computed(() => {\n const v = this.value();\n if (!v) return '';\n return new Date(v + 'T00:00:00').toLocaleDateString('en-US', {\n month: 'short', day: 'numeric', year: 'numeric',\n });\n });\n\n readonly monthName = computed(() => MONTH_NAMES[this.viewMonth()]);\n\n /** Accessible name for the trigger — combines the field name with the selection. */\n readonly triggerAriaLabel = computed<string | null>(() => {\n const name = this.ariaLabel() || this.label();\n if (!name) return null;\n return this.displayValue() ? `${name}: ${this.displayValue()}` : `${name}: ${this.placeholder()}`;\n });\n\n readonly calendarDays = computed<CalendarDay[]>(() => {\n const year = this.viewYear();\n const month = this.viewMonth();\n const today = new Date(); today.setHours(0, 0, 0, 0);\n const sel = this.value();\n const selTs = sel ? new Date(sel + 'T00:00:00').getTime() : NaN;\n\n const firstOfMonth = new Date(year, month, 1);\n const mondayOffset = (firstOfMonth.getDay() + 6) % 7;\n const cursor = new Date(firstOfMonth);\n cursor.setDate(1 - mondayOffset);\n\n const days: CalendarDay[] = [];\n for (let i = 0; i < 42; i++) {\n const ts = cursor.getTime();\n days.push({\n date: new Date(cursor),\n label: cursor.getDate(),\n isCurrentMonth: cursor.getMonth() === month,\n isToday: ts === today.getTime(),\n isSelected: ts === selTs,\n isDisabled: this.isDateDisabled(cursor),\n key: this.toDateStr(cursor),\n });\n cursor.setDate(cursor.getDate() + 1);\n }\n return days;\n });\n\n /** The 42 calendar days grouped into 6 weeks for `role=\"row\"` grid semantics. */\n readonly calendarWeeks = computed<CalendarDay[][]>(() => {\n const days = this.calendarDays();\n const weeks: CalendarDay[][] = [];\n for (let i = 0; i < days.length; i += 7) {\n weeks.push(days.slice(i, i + 7));\n }\n return weeks;\n });\n\n // ─── DI ───────────────────────────────────────────────────────────────────\n\n private readonly el = inject(ElementRef);\n private readonly appRef = inject(ApplicationRef);\n\n // ─── Lifecycle ────────────────────────────────────────────────────────────\n\n ngOnInit(): void {\n // Capture phase catches scroll from any scrollable ancestor, not just window.\n window.addEventListener('scroll', this._scrollHandler, { passive: true, capture: true });\n }\n\n ngOnDestroy(): void {\n window.removeEventListener('scroll', this._scrollHandler, true);\n if (this._rafId !== null) cancelAnimationFrame(this._rafId);\n this.destroyPortal();\n }\n\n // ─── Global listeners ─────────────────────────────────────────────────────\n\n @HostListener('document:click', ['$event'])\n onDocumentClick(event: MouseEvent): void {\n if (!this.isOpen()) return;\n const t = event.target as Node;\n // Keep open if click is inside the trigger OR inside the portal panel\n if (this.el.nativeElement.contains(t)) return;\n if (this.portalEl?.contains(t)) return;\n this.close();\n }\n\n @HostListener('keydown.escape')\n onEscape(): void {\n if (this.isOpen()) this.close();\n }\n\n @HostListener('window:resize')\n onResize(): void {\n // Viewport resize invalidates the layout — close rather than reposition\n // with now-stale coordinates (dropdown-instruction.md §8).\n if (this.isOpen()) this.close();\n }\n\n // ─── Public API ───────────────────────────────────────────────────────────\n\n toggle(): void {\n if (this.resolvedDisabled()) return;\n if (this.isOpen()) { this.close(); return; }\n\n // 1. Sync view to selected date / today\n const sel = this.value();\n const ref = sel ? new Date(sel + 'T00:00:00') : new Date();\n this.viewYear.set(ref.getFullYear());\n this.viewMonth.set(ref.getMonth());\n this.viewMode.set('days');\n this.activeKey.set(this.toDateStr(ref));\n\n // 2. Calculate fixed-position coordinates from the trigger's viewport rect.\n this._calcPos();\n\n // 3. Mount the panel into document.body via a lightweight portal.\n // This escapes ALL parent overflow:hidden and CSS transform contexts.\n if (!this.panelTpl) return;\n\n this.portalEl = document.createElement('div');\n this.portalEl.className = 'sv-dp-portal';\n document.body.appendChild(this.portalEl);\n\n this.portalView = this.panelTpl.createEmbeddedView({});\n this.appRef.attachView(this.portalView);\n this.portalView.rootNodes.forEach((n: Node) => this.portalEl!.appendChild(n));\n this.portalView.detectChanges();\n\n this.isOpen.set(true);\n this.opened.emit();\n // Move focus into the calendar grid for keyboard users.\n this.focusActiveDayDeferred();\n }\n\n close(returnFocus = false): void {\n if (!this.isOpen()) return;\n this.destroyPortal();\n this.isOpen.set(false);\n this.viewMode.set('days');\n this._onTouched();\n this.closed.emit();\n if (returnFocus) {\n (this.el.nativeElement as HTMLElement)\n .querySelector<HTMLElement>('.sv-dp-trigger')?.focus();\n }\n }\n\n selectDay(day: CalendarDay): void {\n if (day.isDisabled) return;\n this.commitValue(day.key);\n this.close(true);\n }\n\n // ─── Keyboard navigation (day grid) ─────────────────────────────────────────\n\n /** Roving tabindex — only the active day cell is in the tab order. */\n dayTabIndex(day: CalendarDay): number {\n return day.key === this.activeKey() ? 0 : -1;\n }\n\n /** Arrow / Home / End / PageUp / PageDown navigation + Enter/Space to select. */\n onDayKeydown(event: KeyboardEvent): void {\n if (this.viewMode() !== 'days') return;\n const base = this.activeKey() || this.value() || this.toDateStr(new Date());\n const d = new Date(base + 'T00:00:00');\n\n switch (event.key) {\n case 'ArrowLeft': d.setDate(d.getDate() - 1); break;\n case 'ArrowRight': d.setDate(d.getDate() + 1); break;\n case 'ArrowUp': d.setDate(d.getDate() - 7); break;\n case 'ArrowDown': d.setDate(d.getDate() + 7); break;\n case 'Home': d.setDate(d.getDate() - ((d.getDay() + 6) % 7)); break; // Monday\n case 'End': d.setDate(d.getDate() + (6 - ((d.getDay() + 6) % 7))); break; // Sunday\n case 'PageUp': event.shiftKey ? d.setFullYear(d.getFullYear() - 1) : d.setMonth(d.getMonth() - 1); break;\n case 'PageDown': event.shiftKey ? d.setFullYear(d.getFullYear() + 1) : d.setMonth(d.getMonth() + 1); break;\n case 'Enter':\n case ' ': {\n event.preventDefault();\n const target = this.calendarDays().find(c => c.key === this.activeKey());\n if (target) this.selectDay(target);\n return;\n }\n default: return;\n }\n\n event.preventDefault();\n this.viewYear.set(d.getFullYear());\n this.viewMonth.set(d.getMonth());\n this.activeKey.set(this.toDateStr(d));\n this.portalView?.detectChanges();\n this.focusActiveDayDeferred();\n }\n\n private focusActiveDayDeferred(): void {\n setTimeout(() => {\n const btn = this.portalEl?.querySelector<HTMLElement>(`[data-day=\"${this.activeKey()}\"]`);\n btn?.focus();\n });\n }\n\n selectMonth(monthIndex: number): void {\n this.viewMonth.set(monthIndex);\n this.viewMode.set('days');\n }\n\n selectYear(year: number): void {\n this.viewYear.set(year);\n this.viewMode.set('months');\n }\n\n prevPeriod(): void {\n if (this.viewMode() === 'years') { this.viewYear.update(y => y - 20); return; }\n if (this.viewMode() === 'months') { this.viewYear.update(y => y - 1); return; }\n let m = this.viewMonth() - 1, y = this.viewYear();\n if (m < 0) { m = 11; y--; }\n this.viewMonth.set(m); this.viewYear.set(y);\n }\n\n nextPeriod(): void {\n if (this.viewMode() === 'years') { this.viewYear.update(y => y + 20); return; }\n if (this.viewMode() === 'months') { this.viewYear.update(y => y + 1); return; }\n let m = this.viewMonth() + 1, y = this.viewYear();\n if (m > 11) { m = 0; y++; }\n this.viewMonth.set(m); this.viewYear.set(y);\n }\n\n goToToday(): void {\n this.commitValue(this.toDateStr(new Date()));\n this.close(true);\n }\n\n clearDate(): void {\n this.commitValue('');\n this.close(true);\n }\n\n // ─── Helpers ──────────────────────────────────────────────────────────────\n\n toDateStr(d: Date): string {\n const y = d.getFullYear();\n const m = String(d.getMonth() + 1).padStart(2, '0');\n const day = String(d.getDate()).padStart(2, '0');\n return `${y}-${m}-${day}`;\n }\n\n private isDateDisabled(d: Date): boolean {\n const str = this.toDateStr(d);\n const min = this.minDate(), max = this.maxDate();\n return (!!min && str < min) || (!!max && str > max);\n }\n\n isMonthDisabled(idx: number): boolean {\n const y = this.viewYear(), min = this.minDate(), max = this.maxDate();\n if (min && this.toDateStr(new Date(y, idx + 1, 0)) < min) return true;\n if (max && this.toDateStr(new Date(y, idx, 1)) > max) return true;\n return false;\n }\n\n isYearDisabled(year: number): boolean {\n const min = this.minDate(), max = this.maxDate();\n if (min && this.toDateStr(new Date(year, 11, 31)) < min) return true;\n if (max && this.toDateStr(new Date(year, 0, 1)) > max) return true;\n return false;\n }\n\n isViewMonthSelected(idx: number): boolean {\n const v = this.value(); if (!v) return false;\n const d = new Date(v + 'T00:00:00');\n return d.getFullYear() === this.viewYear() && d.getMonth() === idx;\n }\n\n isViewYearSelected(year: number): boolean {\n const v = this.value(); if (!v) return false;\n return new Date(v + 'T00:00:00').getFullYear() === year;\n }\n\n headerLabel(): string {\n if (this.viewMode() === 'months') return String(this.viewYear());\n if (this.viewMode() === 'years') {\n const r = this.yearRange(); return `${r[0]} – ${r[r.length - 1]}`;\n }\n return `${this.monthName()} ${this.viewYear()}`;\n }\n\n // ─── Position calculation ───────────────────────────────────────────────────\n\n /**\n * Computes fixed-position coordinates from the trigger's current viewport\n * rect. position:fixed is viewport-relative — getBoundingClientRect() gives\n * exactly that, regardless of scroll position. Called on open and again on\n * every scroll (see _scrollHandler) so the panel tracks the trigger instead\n * of drifting away from it as the page (or a nested container) scrolls.\n */\n private _calcPos(): void {\n const rect = (this.el.nativeElement as HTMLElement).getBoundingClientRect();\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n\n const spaceBelow = vh - rect.bottom;\n const spaceAbove = rect.top;\n const above = spaceBelow < PANEL_H && spaceAbove > spaceBelow;\n const right = rect.left + PANEL_W > vw;\n\n this.openAbove.set(above);\n this.alignRight.set(right);\n\n // Unify left/right alignment into a single clamped `left` value so the\n // panel can never render partially outside the viewport horizontally.\n const desiredLeft = right ? rect.right - PANEL_W : rect.left;\n const maxLeft = Math.max(GAP, vw - PANEL_W - GAP);\n const clampedLeft = Math.min(Math.max(desiredLeft, GAP), maxLeft);\n\n const style: Record<string, string> = {\n position: 'fixed',\n zIndex: '9999',\n width: `${PANEL_W}px`,\n left: `${clampedLeft}px`,\n };\n style[above ? 'bottom' : 'top'] = above\n ? `${vh - rect.top + GAP}px`\n : `${rect.bottom + GAP}px`;\n\n this.panelStyle.set(style);\n }\n\n // ─── Portal lifecycle ──────────────────────────────────────────────────────\n\n private destroyPortal(): void {\n if (this.portalView) {\n this.appRef.detachView(this.portalView);\n this.portalView.destroy();\n this.portalView = null;\n }\n this.portalEl?.remove();\n this.portalEl = null;\n }\n}\n","<!-- ══════════════════════════════════════════════════════════════════════════\n SvDatePickerComponent — premium custom calendar date picker\n ══════════════════════════════════════════════════════════════════════════ -->\n\n<div class=\"sv-dp relative w-full\">\n\n <!-- ── Label ───────────────────────────────────────────────────────────── -->\n @if (label()) {\n <label class=\"mb-1.5 block text-xs font-semibold text-gray-600 dark:text-gray-400\">\n {{ label() }}\n @if (required()) {\n <span class=\"ml-0.5 text-rose-500\" aria-hidden=\"true\">*</span>\n }\n </label>\n }\n\n <!-- ── Trigger Button ──────────────────────────────────────────────────── -->\n <div class=\"relative\">\n <button\n type=\"button\"\n class=\"sv-dp-trigger flex w-full items-center gap-2.5 rounded-md border border-gray-200 bg-white px-3.5 py-2.5 text-left text-sm shadow-sm transition-all duration-150 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-400/70 dark:border-gray-700 dark:bg-gray-900\"\n [class.opacity-50]=\"resolvedDisabled()\"\n [class.cursor-not-allowed]=\"resolvedDisabled()\"\n [class.hover:border-primary-400]=\"!resolvedDisabled()\"\n [class.hover:shadow-md]=\"!resolvedDisabled()\"\n [class.border-primary-400]=\"isOpen()\"\n [class.ring-2]=\"isOpen()\"\n [class.ring-primary-400\\/30]=\"isOpen()\"\n [disabled]=\"resolvedDisabled()\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-label]=\"triggerAriaLabel()\"\n aria-haspopup=\"dialog\"\n (click)=\"toggle()\">\n\n <!-- Calendar icon -->\n <svg class=\"h-4 w-4 shrink-0 text-gray-400 transition-colors duration-150 dark:text-gray-300\"\n [class.text-primary-500]=\"isOpen()\"\n [class.dark:text-primary-400]=\"isOpen()\"\n fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.75\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\"\n d=\"M6.75 3v2.25M17.25 3v2.25M3 18.75V7.5a2.25 2.25 0 0 1 2.25-2.25h13.5A2.25 2.25 0 0 1 21 7.5v11.25m-18 0A2.25 2.25 0 0 0 5.25 21h13.5A2.25 2.25 0 0 0 21 18.75m-18 0v-7.5A2.25 2.25 0 0 1 5.25 9h13.5A2.25 2.25 0 0 1 21 11.25v7.5\"/>\n </svg>\n\n <!-- Date display / placeholder -->\n <span class=\"flex-1 truncate\" [class.pr-6]=\"value() && !resolvedDisabled()\">\n @if (displayValue()) {\n <span class=\"font-medium text-gray-800 dark:text-gray-100\">{{ displayValue() }}</span>\n } @else {\n <span class=\"text-gray-500 dark:text-gray-400\">{{ placeholder() }}</span>\n }\n </span>\n\n <!-- Chevron indicator -->\n <svg\n class=\"h-4 w-4 shrink-0 text-gray-300 transition-transform duration-200 dark:text-gray-500\"\n [class.rotate-180]=\"isOpen()\"\n fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"m6 9 6 6 6-6\"/>\n </svg>\n </button>\n\n <!-- Clear button — sibling of the trigger (not nested inside it) -->\n @if (value() && !resolvedDisabled()) {\n <button\n type=\"button\"\n class=\"absolute right-9 top-1/2 flex h-4 w-4 -translate-y-1/2 items-center justify-center rounded-full text-gray-300 transition-colors duration-100 hover:bg-gray-100 hover:text-gray-500 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-400 dark:hover:bg-gray-800 dark:hover:text-gray-400\"\n aria-label=\"Clear date\"\n (click)=\"clearDate(); $event.stopPropagation()\">\n <svg class=\"h-3 w-3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M6 18 18 6M6 6l12 12\"/>\n </svg>\n </button>\n }\n </div>\n\n <!-- ── Calendar Popover ─────────────────────────────────────────────────────\n Rendered into document.body via a body portal in toggle() so it escapes\n all parent overflow:hidden / CSS transform containment.\n ───────────────────────────────────────────────────────────────────────── -->\n <ng-template #panelTpl>\n <div\n class=\"sv-dp-panel overflow-hidden rounded-2xl border border-gray-100/80 bg-white shadow-[0_24px_64px_-12px_rgba(0,0,0,0.18),0_8px_24px_-8px_rgba(0,0,0,0.08)] dark:border-gray-700/50 dark:bg-gray-900 dark:shadow-[0_24px_64px_-12px_rgba(0,0,0,0.7),0_8px_24px_-8px_rgba(0,0,0,0.5)]\"\n [class.sv-dp-panel--above]=\"openAbove()\"\n [class.sv-dp-panel--right]=\"alignRight()\"\n [style.position]=\"panelStyle()['position']\"\n [style.zIndex]=\"panelStyle()['zIndex']\"\n [style.width]=\"panelStyle()['width']\"\n [style.top]=\"panelStyle()['top']\"\n [style.bottom]=\"panelStyle()['bottom']\"\n [style.left]=\"panelStyle()['left']\"\n [style.right]=\"panelStyle()['right']\"\n role=\"dialog\"\n aria-modal=\"false\"\n aria-label=\"Date picker calendar\">\n\n <!-- ── Gradient Header ─────────────────────────────────────────────── -->\n <div class=\"sv-dp-header bg-gradient-to-br from-primary-500 via-primary-600 to-indigo-600 px-4 pt-3.5 pb-3\">\n <div class=\"flex items-center justify-between gap-2\">\n\n <!-- Prev button -->\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-lg text-white/80 transition-all duration-150 hover:bg-white/15 hover:text-white focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-white/50\"\n aria-label=\"Previous\"\n (click)=\"prevPeriod()\">\n <svg class=\"h-4 w-4\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"m15 19-7-7 7-7\"/>\n </svg>\n </button>\n\n <!-- Month / Year title — clicking cycles view mode -->\n <button\n type=\"button\"\n class=\"flex flex-1 items-center justify-center gap-1.5 rounded-lg px-2 py-1 text-sm font-semibold tracking-wide text-white transition-all duration-150 hover:bg-white/15 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-white/50\"\n [attr.aria-label]=\"'Switch view, currently ' + headerLabel()\"\n (click)=\"viewMode.set(viewMode() === 'days' ? 'months' : viewMode() === 'months' ? 'years' : 'days')\">\n {{ headerLabel() }}\n <svg class=\"h-3.5 w-3.5 text-white/70\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"m6 9 6 6 6-6\"/>\n </svg>\n </button>\n\n <!-- Next button -->\n <button\n type=\"button\"\n class=\"flex h-7 w-7 items-center justify-center rounded-lg text-white/80 transition-all duration-150 hover:bg-white/15 hover:text-white focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-white/50\"\n aria-label=\"Next\"\n (click)=\"nextPeriod()\">\n <svg class=\"h-4 w-4\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"m9 5 7 7-7 7\"/>\n </svg>\n </button>\n </div>\n @if (displayValue()) {\n <div class=\"mt-2.5 rounded-xl bg-white/15 py-1.5 text-center text-[13px] font-semibold tracking-wide text-white backdrop-blur-sm\">\n {{ displayValue() }}\n </div>\n }\n </div>\n\n <!-- ── Day View ────────────────────────────────────────────────────── -->\n @if (viewMode() === 'days') {\n <div class=\"sv-dp-body p-3\">\n\n <!-- Calendar grid -->\n <div role=\"grid\" [attr.aria-label]=\"monthName() + ' ' + viewYear()\">\n\n <!-- Weekday headers -->\n <div role=\"row\" class=\"mb-2 grid grid-cols-7 overflow-hidden rounded-xl bg-gray-50 dark:bg-gray-800/60\">\n @for (wd of weekDays; track wd) {\n <div role=\"columnheader\" class=\"py-1.5 text-center text-[10px] font-bold uppercase tracking-widest text-gray-500 dark:text-gray-400\">\n {{ wd }}\n </div>\n }\n </div>\n\n <!-- Day rows -->\n <div role=\"rowgroup\" class=\"grid grid-cols-7\" (keydown)=\"onDayKeydown($event)\">\n @for (week of calendarWeeks(); track $index) {\n <div role=\"row\" class=\"contents\">\n @for (day of week; track day.key) {\n <div role=\"gridcell\" [attr.aria-selected]=\"day.isSelected\" class=\"flex items-center justify-center p-0.5\">\n <button\n type=\"button\"\n [attr.data-day]=\"day.key\"\n [attr.tabindex]=\"dayTabIndex(day)\"\n class=\"sv-dp-day relative flex h-8 w-8 items-center justify-center rounded-md text-[13px] font-medium transition-all duration-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-400/60\"\n [ngClass]=\"{\n 'bg-gradient-to-br from-primary-500 to-indigo-600 text-white shadow-md shadow-primary-500/30 hover:from-primary-400 hover:to-indigo-500 scale-105': day.isSelected,\n 'text-gray-800 hover:bg-primary-50 hover:text-primary-700 dark:text-gray-200 dark:hover:bg-primary-950/60 dark:hover:text-primary-300': !day.isSelected && !day.isDisabled && day.isCurrentMonth,\n 'font-semibold text-primary-600 dark:text-primary-400': day.isToday && !day.isSelected,\n 'text-gray-300 hover:bg-gray-50 dark:text-gray-700 dark:hover:bg-gray-900': !day.isSelected && !day.isDisabled && !day.isCurrentMonth,\n 'cursor-not-allowed text-gray-200 dark:text-gray-800': day.isDisabled\n }\"\n [disabled]=\"day.isDisabled\"\n [attr.aria-label]=\"day.date.toLocaleDateString('en-US', { month: 'long', day: 'numeric', year: 'numeric' })\"\n [attr.aria-current]=\"day.isToday ? 'date' : null\"\n (click)=\"selectDay(day)\">\n {{ day.label }}\n <!-- Today dot -->\n @if (day.isToday && !day.isSelected) {\n <span class=\"absolute bottom-0.5 left-1/2 h-1.5 w-1.5 -translate-x-1/2 rounded-full bg-primary-500 dark:bg-primary-400\"></span>\n }\n </button>\n </div>\n }\n </div>\n }\n </div>\n\n </div>\n\n <!-- Footer actions -->\n <div class=\"mt-2 flex items-center justify-between border-t border-gray-100 pt-2.5 dark:border-gray-800/80\">\n <button\n type=\"button\"\n class=\"rounded-lg px-2.5 py-1.5 text-xs font-medium text-gray-400 transition-all duration-100 hover:bg-gray-100 hover:text-gray-600 dark:text-gray-500 dark:hover:bg-gray-800 dark:hover:text-gray-300\"\n (click)=\"clearDate()\">\n Clear\n </button>\n <button\n type=\"button\"\n class=\"rounded-lg bg-primary-500 px-3.5 py-1.5 text-xs font-semibold text-white shadow-sm shadow-primary-500/30 transition-all duration-100 hover:bg-primary-600 active:bg-primary-700\"\n (click)=\"goToToday()\">\n Today\n </button>\n </div>\n </div>\n }\n\n <!-- ── Month View ──────────────────────────────────────────────────── -->\n @if (viewMode() === 'months') {\n <div class=\"sv-dp-body grid grid-cols-3 gap-1.5 p-4\">\n @for (month of monthNames; track $index) {\n <button\n type=\"button\"\n class=\"rounded-md px-1 py-2.5 text-center text-[12px] font-medium transition-all duration-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-400/60\"\n [ngClass]=\"{\n 'bg-gradient-to-br from-primary-500 to-indigo-600 text-white shadow-sm shadow-primary-500/25': isViewMonthSelected($index),\n 'bg-primary-50 text-primary-700 dark:bg-primary-950/60 dark:text-primary-300': !isViewMonthSelected($index) && $index === viewMonth() && !isMonthDisabled($index),\n 'text-gray-700 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-800/70': !isViewMonthSelected($index) && $index !== viewMonth() && !isMonthDisabled($index),\n 'cursor-not-allowed text-gray-300 dark:text-gray-700': isMonthDisabled($index)\n }\"\n [disabled]=\"isMonthDisabled($index)\"\n (click)=\"selectMonth($index)\">\n {{ month.slice(0, 3) }}\n </button>\n }\n </div>\n }\n\n <!-- ── Year View ───────────────────────────────────────────────────── -->\n @if (viewMode() === 'years') {\n <div class=\"sv-dp-body grid grid-cols-4 gap-1 p-4\">\n @for (year of yearRange(); track year) {\n <button\n type=\"button\"\n class=\"rounded-md px-1 py-2.5 text-center text-[12px] font-medium transition-all duration-100 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary-400/60\"\n [ngClass]=\"{\n 'bg-gradient-to-br from-primary-500 to-indigo-600 text-white shadow-sm shadow-primary-500/25': isViewYearSelected(year),\n 'bg-primary-50 text-primary-700 dark:bg-primary-950/60 dark:text-primary-300': !isViewYearSelected(year) && year === viewYear() && !isYearDisabled(year),\n 'text-gray-700 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-800/70': !isViewYearSelected(year) && year !== viewYear() && !isYearDisabled(year),\n 'cursor-not-allowed text-gray-300 dark:text-gray-700': isYearDisabled(year)\n }\"\n [disabled]=\"isYearDisabled(year)\"\n (click)=\"selectYear(year)\">\n {{ year }}\n </button>\n }\n </div>\n }\n\n </div><!-- /sv-dp-panel -->\n </ng-template>\n\n</div><!-- /sv-dp -->\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@styloviz/input-field",
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"description": "Accessible text input with labels, hints, validation states and adornments.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"author": "sazzad-bs23",
|
|
7
|
+
"homepage": "https://styloviz.dev",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "git+https://github.com/rhossain/angular-tailwind-dashboard-components.git",
|
|
11
|
+
"directory": "projects/input-field-free"
|
|
12
|
+
},
|
|
13
|
+
"bugs": {
|
|
14
|
+
"url": "https://github.com/rhossain/angular-tailwind-dashboard-components/issues"
|
|
15
|
+
},
|
|
16
|
+
"peerDependencies": {
|
|
17
|
+
"@angular/common": ">=21.0.0",
|
|
18
|
+
"@angular/core": ">=21.0.0",
|
|
19
|
+
"@angular/forms": ">=21.0.0"
|
|
20
|
+
},
|
|
21
|
+
"publishConfig": {
|
|
22
|
+
"access": "public"
|
|
23
|
+
},
|
|
24
|
+
"engines": {
|
|
25
|
+
"node": "^20.19.0 || ^22.12.0 || >=24.0.0"
|
|
26
|
+
},
|
|
27
|
+
"sideEffects": false,
|
|
28
|
+
"module": "fesm2022/styloviz-input-field.mjs",
|
|
29
|
+
"typings": "types/styloviz-input-field.d.ts",
|
|
30
|
+
"exports": {
|
|
31
|
+
"./package.json": {
|
|
32
|
+
"default": "./package.json"
|
|
33
|
+
},
|
|
34
|
+
".": {
|
|
35
|
+
"types": "./types/styloviz-input-field.d.ts",
|
|
36
|
+
"default": "./fesm2022/styloviz-input-field.mjs"
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
"type": "module",
|
|
40
|
+
"dependencies": {
|
|
41
|
+
"tslib": "^2.3.0"
|
|
42
|
+
}
|
|
43
|
+
}
|