ngx-com 0.0.20 → 0.0.22

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.
@@ -1,14 +1,16 @@
1
1
  import * as i0 from '@angular/core';
2
- import { InjectionToken, inject, LOCALE_ID, Injectable, viewChild, input, output, computed, ChangeDetectionStrategy, Component, signal, afterEveryRender, Directive, viewChildren, linkedSignal, ElementRef, DestroyRef, ViewContainerRef, DOCUMENT, effect } from '@angular/core';
2
+ import { InjectionToken, inject, LOCALE_ID, Injectable, viewChild, input, output, computed, ChangeDetectionStrategy, Component, signal, afterEveryRender, Directive, viewChildren, linkedSignal, model, forwardRef, ElementRef, DestroyRef, ViewContainerRef, DOCUMENT, effect } from '@angular/core';
3
3
  import { cva } from 'class-variance-authority';
4
4
  import { NgTemplateOutlet } from '@angular/common';
5
5
  import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
6
- import { NgControl } from '@angular/forms';
6
+ import { NgControl, NgForm, FormGroupDirective } from '@angular/forms';
7
7
  import { Overlay, OverlayModule } from '@angular/cdk/overlay';
8
8
  import { TemplatePortal } from '@angular/cdk/portal';
9
9
  import * as i1 from '@angular/cdk/a11y';
10
10
  import { A11yModule } from '@angular/cdk/a11y';
11
11
  import { ComIcon } from 'ngx-com/components/icon';
12
+ import { mergeClasses } from 'ngx-com/utils';
13
+ import { ErrorStateMatcher, FormFieldControl } from 'ngx-com/components/form-field';
12
14
 
13
15
  /**
14
16
  * Calendar shared types and interfaces
@@ -3145,6 +3147,13 @@ const datepickerTriggerVariants = cva([
3145
3147
  'bg-muted',
3146
3148
  'hover:bg-muted-hover',
3147
3149
  ],
3150
+ naked: [
3151
+ 'border-transparent',
3152
+ 'bg-transparent',
3153
+ 'shadow-none',
3154
+ 'focus-within:outline-none',
3155
+ 'rounded-none',
3156
+ ],
3148
3157
  },
3149
3158
  size: {
3150
3159
  sm: ['h-8', 'px-2', 'text-xs', 'gap-1'],
@@ -3178,6 +3187,24 @@ const datepickerTriggerVariants = cva([
3178
3187
  variant: 'outline',
3179
3188
  class: ['border-primary'],
3180
3189
  },
3190
+ // Naked variant should not show ring when open (form-field provides focus styling)
3191
+ {
3192
+ open: true,
3193
+ variant: 'naked',
3194
+ class: ['outline-none', 'border-transparent'],
3195
+ },
3196
+ // Naked variant should not show error border (form-field provides error styling)
3197
+ {
3198
+ state: 'error',
3199
+ variant: 'naked',
3200
+ class: ['border-transparent', 'focus-within:outline-none'],
3201
+ },
3202
+ // Naked variant should not show success border (form-field provides styling)
3203
+ {
3204
+ state: 'success',
3205
+ variant: 'naked',
3206
+ class: ['border-transparent', 'focus-within:outline-none'],
3207
+ },
3181
3208
  ],
3182
3209
  defaultVariants: {
3183
3210
  variant: 'default',
@@ -3419,7 +3446,7 @@ const timepickerContainerVariants = cva([
3419
3446
  'border-input-border',
3420
3447
  'bg-input-background',
3421
3448
  'text-input-foreground',
3422
- 'focus-within:outline-[1px]',
3449
+ 'focus-within:outline-1',
3423
3450
  'focus-within:outline-offset-2',
3424
3451
  'focus-within:outline-ring',
3425
3452
  ],
@@ -3428,6 +3455,13 @@ const timepickerContainerVariants = cva([
3428
3455
  'bg-transparent',
3429
3456
  'text-foreground',
3430
3457
  ],
3458
+ naked: [
3459
+ 'border-transparent',
3460
+ 'bg-transparent',
3461
+ 'shadow-none',
3462
+ 'focus-within:outline-none',
3463
+ 'rounded-none',
3464
+ ],
3431
3465
  },
3432
3466
  size: {
3433
3467
  sm: ['h-8', 'px-2', 'text-xs', 'gap-0.5'],
@@ -3457,6 +3491,17 @@ const timepickerContainerVariants = cva([
3457
3491
  state: 'success',
3458
3492
  class: [],
3459
3493
  },
3494
+ // Naked variant should not show ring (form-field provides focus styling)
3495
+ {
3496
+ variant: 'naked',
3497
+ state: 'error',
3498
+ class: ['border-transparent', 'focus-within:outline-none'],
3499
+ },
3500
+ {
3501
+ variant: 'naked',
3502
+ state: 'success',
3503
+ class: ['border-transparent', 'focus-within:outline-none'],
3504
+ },
3460
3505
  ],
3461
3506
  defaultVariants: {
3462
3507
  variant: 'standalone',
@@ -3537,10 +3582,11 @@ const timepickerPeriodVariants = cva([
3537
3582
  'font-medium',
3538
3583
  'transition-colors',
3539
3584
  'select-none',
3585
+ 'outline-none',
3540
3586
  'bg-muted',
3541
3587
  'text-muted-foreground',
3542
3588
  'hover:bg-muted-hover',
3543
- 'focus-visible:outline-[1px]',
3589
+ 'focus-visible:outline-1',
3544
3590
  'focus-visible:outline-offset-2',
3545
3591
  'focus-visible:outline-ring',
3546
3592
  ], {
@@ -3651,6 +3697,9 @@ function generateTimePickerId() {
3651
3697
  class ComTimePicker {
3652
3698
  localeId = inject(LOCALE_ID);
3653
3699
  ngControl = inject(NgControl, { optional: true, self: true });
3700
+ defaultErrorStateMatcher = inject(ErrorStateMatcher);
3701
+ parentForm = inject(NgForm, { optional: true });
3702
+ parentFormGroup = inject(FormGroupDirective, { optional: true });
3654
3703
  timepickerId = generateTimePickerId();
3655
3704
  hoursInputRef = viewChild('hoursInput', ...(ngDevMode ? [{ debugName: "hoursInputRef" }] : []));
3656
3705
  minutesInputRef = viewChild('minutesInput', ...(ngDevMode ? [{ debugName: "minutesInputRef" }] : []));
@@ -3658,9 +3707,9 @@ class ComTimePicker {
3658
3707
  periodButtonRef = viewChild('periodButton', ...(ngDevMode ? [{ debugName: "periodButtonRef" }] : []));
3659
3708
  // ============ INPUTS ============
3660
3709
  /** Current time value. */
3661
- value = input(null, ...(ngDevMode ? [{ debugName: "value" }] : []));
3710
+ value = model(null, ...(ngDevMode ? [{ debugName: "value" }] : []));
3662
3711
  /** Whether the time picker is disabled. */
3663
- disabled = input(false, ...(ngDevMode ? [{ debugName: "disabled" }] : []));
3712
+ disabled = model(false, ...(ngDevMode ? [{ debugName: "disabled" }] : []));
3664
3713
  /** Whether the time picker is required. */
3665
3714
  required = input(false, ...(ngDevMode ? [{ debugName: "required" }] : []));
3666
3715
  /** Whether to show the seconds segment. */
@@ -3687,6 +3736,12 @@ class ComTimePicker {
3687
3736
  userClass = input('', { ...(ngDevMode ? { debugName: "userClass" } : {}), alias: 'class' });
3688
3737
  /** Placeholder text for empty segments. */
3689
3738
  placeholder = input('--', ...(ngDevMode ? [{ debugName: "placeholder" }] : []));
3739
+ /** Custom error state matcher for determining when to show errors. */
3740
+ errorStateMatcher = input(...(ngDevMode ? [undefined, { debugName: "errorStateMatcher" }] : []));
3741
+ // Signal Forms inputs — set automatically by [formField] via setInputOnDirectives
3742
+ touched = model(false, ...(ngDevMode ? [{ debugName: "touched" }] : []));
3743
+ invalid = input(false, ...(ngDevMode ? [{ debugName: "invalid" }] : []));
3744
+ sfErrors = input([], { ...(ngDevMode ? { debugName: "sfErrors" } : {}), alias: 'errors' });
3690
3745
  // ============ OUTPUTS ============
3691
3746
  /** Emitted when time value changes. */
3692
3747
  timeChange = output();
@@ -3699,6 +3754,39 @@ class ComTimePicker {
3699
3754
  pendingDigits = signal('', ...(ngDevMode ? [{ debugName: "pendingDigits" }] : []));
3700
3755
  /** Live announcements for screen readers. */
3701
3756
  liveAnnouncement = signal('', ...(ngDevMode ? [{ debugName: "liveAnnouncement" }] : []));
3757
+ /** IDs for aria-describedby (set by form-field). */
3758
+ _describedByIds = signal('', ...(ngDevMode ? [{ debugName: "_describedByIds" }] : []));
3759
+ /** Form field appearance (set by form-field). */
3760
+ _appearance = signal('outline', ...(ngDevMode ? [{ debugName: "_appearance" }] : []));
3761
+ // ============ FormFieldControl SIGNALS ============
3762
+ /** Whether the time picker is focused. Implements FormFieldControl. */
3763
+ focused = computed(() => this.activeSegment() !== null, ...(ngDevMode ? [{ debugName: "focused" }] : []));
3764
+ /** Whether the label should float. */
3765
+ shouldLabelFloat = computed(() => this.focused() || this.internalValue() !== null, ...(ngDevMode ? [{ debugName: "shouldLabelFloat" }] : []));
3766
+ /** Whether the control is in an error state. Implements FormFieldControl. */
3767
+ errorState = computed(() => {
3768
+ if (!this.ngControl) {
3769
+ return this.invalid() && this.touched();
3770
+ }
3771
+ const matcher = this.errorStateMatcher() ?? this.defaultErrorStateMatcher;
3772
+ const form = this.parentFormGroup ?? this.parentForm;
3773
+ return matcher.isErrorState(this.ngControl.control ?? null, form);
3774
+ }, ...(ngDevMode ? [{ debugName: "errorState" }] : []));
3775
+ /** Structured validation errors from Signal Forms. */
3776
+ errors = computed(() => !this.ngControl ? this.sfErrors() : null, ...(ngDevMode ? [{ debugName: "errors" }] : []));
3777
+ /** Unique ID for the control (maps to hours input). Implements FormFieldControl. */
3778
+ id = computed(() => `${this.timepickerId}-hours`, ...(ngDevMode ? [{ debugName: "id" }] : []));
3779
+ /**
3780
+ * Effective state combining manual state with automatic error detection.
3781
+ */
3782
+ effectiveState = computed(() => {
3783
+ const manualState = this.state();
3784
+ if (manualState !== 'default')
3785
+ return manualState;
3786
+ return this.errorState() ? 'error' : 'default';
3787
+ }, ...(ngDevMode ? [{ debugName: "effectiveState" }] : []));
3788
+ /** Combined aria-describedby from form-field. */
3789
+ effectiveAriaDescribedBy = computed(() => this._describedByIds() || null, ...(ngDevMode ? [{ debugName: "effectiveAriaDescribedBy" }] : []));
3702
3790
  // ============ COMPUTED STATE ============
3703
3791
  /** Whether to use 12-hour format. */
3704
3792
  is12Hour = computed(() => {
@@ -3756,10 +3844,15 @@ class ComTimePicker {
3756
3844
  const base = timepickerContainerVariants({
3757
3845
  variant: this.variant(),
3758
3846
  size: this.size(),
3759
- state: this.state(),
3847
+ state: this.effectiveState(),
3760
3848
  });
3761
3849
  const disabled = this.disabled() ? timepickerDisabledVariants() : '';
3762
- return joinClasses(base, disabled, this.userClass());
3850
+ // For naked variant, add padding based on form-field appearance
3851
+ let paddingClasses = '';
3852
+ if (this.variant() === 'naked') {
3853
+ paddingClasses = this._appearance() === 'fill' ? 'pt-5 pb-1.5 px-3' : 'py-2.5 px-3';
3854
+ }
3855
+ return mergeClasses(base, disabled, paddingClasses, this.userClass());
3763
3856
  }, ...(ngDevMode ? [{ debugName: "containerClasses" }] : []));
3764
3857
  /** Segment input classes. */
3765
3858
  segmentClasses = computed(() => {
@@ -3792,8 +3885,8 @@ class ComTimePicker {
3792
3885
  registerOnTouched(fn) {
3793
3886
  this.onTouched = fn;
3794
3887
  }
3795
- setDisabledState(_isDisabled) {
3796
- // Disabled state is handled via the disabled input
3888
+ setDisabledState(isDisabled) {
3889
+ this.disabled.set(isDisabled);
3797
3890
  }
3798
3891
  // ============ VALIDATOR IMPLEMENTATION ============
3799
3892
  validate() {
@@ -3826,11 +3919,11 @@ class ComTimePicker {
3826
3919
  this.pendingDigits.set('');
3827
3920
  this.snapToStep(segment);
3828
3921
  this.onTouched();
3922
+ this.touched.set(true);
3829
3923
  }
3830
3924
  onSegmentInput(event, segment) {
3831
3925
  // Prevent default browser input handling — we manage value via keydown
3832
3926
  const input = event.target;
3833
- const value = this.internalValue();
3834
3927
  // Restore the formatted value to prevent browser from changing display
3835
3928
  if (segment === 'hours') {
3836
3929
  input.value = this.formattedHours();
@@ -3913,6 +4006,30 @@ class ComTimePicker {
3913
4006
  const newHours = value.hours >= 12 ? value.hours - 12 : value.hours + 12;
3914
4007
  this.updateValue({ ...value, hours: newHours });
3915
4008
  }
4009
+ // ============ FormFieldControl IMPLEMENTATION ============
4010
+ /**
4011
+ * Called when the form field container is clicked.
4012
+ * Implements FormFieldControl.
4013
+ */
4014
+ onContainerClick(_event) {
4015
+ if (!this.disabled()) {
4016
+ this.hoursInputRef()?.nativeElement.focus();
4017
+ }
4018
+ }
4019
+ /**
4020
+ * Sets the describedBy IDs from the form field.
4021
+ * Called by the parent form field component.
4022
+ */
4023
+ setDescribedByIds(ids) {
4024
+ this._describedByIds.set(ids);
4025
+ }
4026
+ /**
4027
+ * Sets the appearance for styling.
4028
+ * Called by the parent form field component.
4029
+ */
4030
+ setAppearance(appearance) {
4031
+ this._appearance.set(appearance);
4032
+ }
3916
4033
  // ============ PRIVATE METHODS ============
3917
4034
  setPeriod(period) {
3918
4035
  const value = this.internalValue();
@@ -4132,7 +4249,7 @@ class ComTimePicker {
4132
4249
  }
4133
4250
  }
4134
4251
  updateValue(value) {
4135
- this.internalValue.set(value);
4252
+ this.value.set(value);
4136
4253
  this.onChange(value);
4137
4254
  this.timeChange.emit(value);
4138
4255
  this.onValidatorChange();
@@ -4144,7 +4261,7 @@ class ComTimePicker {
4144
4261
  }
4145
4262
  }
4146
4263
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ComTimePicker, deps: [], target: i0.ɵɵFactoryTarget.Component });
4147
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: ComTimePicker, isStandalone: true, selector: "com-time-picker", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, required: { classPropertyName: "required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, showSeconds: { classPropertyName: "showSeconds", publicName: "showSeconds", isSignal: true, isRequired: false, transformFunction: null }, use12HourFormat: { classPropertyName: "use12HourFormat", publicName: "use12HourFormat", isSignal: true, isRequired: false, transformFunction: null }, minuteStep: { classPropertyName: "minuteStep", publicName: "minuteStep", isSignal: true, isRequired: false, transformFunction: null }, secondStep: { classPropertyName: "secondStep", publicName: "secondStep", isSignal: true, isRequired: false, transformFunction: null }, minTime: { classPropertyName: "minTime", publicName: "minTime", isSignal: true, isRequired: false, transformFunction: null }, maxTime: { classPropertyName: "maxTime", publicName: "maxTime", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, state: { classPropertyName: "state", publicName: "state", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { timeChange: "timeChange" }, host: { properties: { "class.com-time-picker-disabled": "disabled()", "attr.role": "\"group\"", "attr.aria-label": "ariaLabel() || \"Time picker\"", "attr.aria-disabled": "disabled() || null" }, classAttribute: "com-time-picker-host inline-block" }, viewQueries: [{ propertyName: "hoursInputRef", first: true, predicate: ["hoursInput"], descendants: true, isSignal: true }, { propertyName: "minutesInputRef", first: true, predicate: ["minutesInput"], descendants: true, isSignal: true }, { propertyName: "secondsInputRef", first: true, predicate: ["secondsInput"], descendants: true, isSignal: true }, { propertyName: "periodButtonRef", first: true, predicate: ["periodButton"], descendants: true, isSignal: true }], exportAs: ["comTimePicker"], ngImport: i0, template: `
4264
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: ComTimePicker, isStandalone: true, selector: "com-time-picker", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, required: { classPropertyName: "required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, showSeconds: { classPropertyName: "showSeconds", publicName: "showSeconds", isSignal: true, isRequired: false, transformFunction: null }, use12HourFormat: { classPropertyName: "use12HourFormat", publicName: "use12HourFormat", isSignal: true, isRequired: false, transformFunction: null }, minuteStep: { classPropertyName: "minuteStep", publicName: "minuteStep", isSignal: true, isRequired: false, transformFunction: null }, secondStep: { classPropertyName: "secondStep", publicName: "secondStep", isSignal: true, isRequired: false, transformFunction: null }, minTime: { classPropertyName: "minTime", publicName: "minTime", isSignal: true, isRequired: false, transformFunction: null }, maxTime: { classPropertyName: "maxTime", publicName: "maxTime", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, state: { classPropertyName: "state", publicName: "state", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, errorStateMatcher: { classPropertyName: "errorStateMatcher", publicName: "errorStateMatcher", isSignal: true, isRequired: false, transformFunction: null }, touched: { classPropertyName: "touched", publicName: "touched", isSignal: true, isRequired: false, transformFunction: null }, invalid: { classPropertyName: "invalid", publicName: "invalid", isSignal: true, isRequired: false, transformFunction: null }, sfErrors: { classPropertyName: "sfErrors", publicName: "errors", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange", disabled: "disabledChange", touched: "touchedChange", timeChange: "timeChange" }, host: { properties: { "class.com-time-picker-disabled": "disabled()", "attr.role": "\"group\"", "attr.aria-label": "ariaLabel() || \"Time picker\"", "attr.aria-disabled": "disabled() || null" }, classAttribute: "com-time-picker-host inline-block" }, providers: [{ provide: FormFieldControl, useExisting: forwardRef(() => ComTimePicker) }], viewQueries: [{ propertyName: "hoursInputRef", first: true, predicate: ["hoursInput"], descendants: true, isSignal: true }, { propertyName: "minutesInputRef", first: true, predicate: ["minutesInput"], descendants: true, isSignal: true }, { propertyName: "secondsInputRef", first: true, predicate: ["secondsInput"], descendants: true, isSignal: true }, { propertyName: "periodButtonRef", first: true, predicate: ["periodButton"], descendants: true, isSignal: true }], exportAs: ["comTimePicker"], ngImport: i0, template: `
4148
4265
  <div [class]="containerClasses()">
4149
4266
  <!-- Hours -->
4150
4267
  <input
@@ -4153,7 +4270,9 @@ class ComTimePicker {
4153
4270
  inputmode="numeric"
4154
4271
  role="spinbutton"
4155
4272
  [class]="segmentClasses()"
4273
+ [attr.id]="id()"
4156
4274
  [attr.aria-label]="'Hours'"
4275
+ [attr.aria-describedby]="effectiveAriaDescribedBy() || null"
4157
4276
  [attr.aria-valuenow]="displayHours()"
4158
4277
  [attr.aria-valuemin]="is12Hour() ? 1 : 0"
4159
4278
  [attr.aria-valuemax]="is12Hour() ? 12 : 23"
@@ -4246,7 +4365,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
4246
4365
  inputmode="numeric"
4247
4366
  role="spinbutton"
4248
4367
  [class]="segmentClasses()"
4368
+ [attr.id]="id()"
4249
4369
  [attr.aria-label]="'Hours'"
4370
+ [attr.aria-describedby]="effectiveAriaDescribedBy() || null"
4250
4371
  [attr.aria-valuenow]="displayHours()"
4251
4372
  [attr.aria-valuemin]="is12Hour() ? 1 : 0"
4252
4373
  [attr.aria-valuemax]="is12Hour() ? 12 : 23"
@@ -4326,14 +4447,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
4326
4447
  <div class="sr-only" aria-live="polite" aria-atomic="true">
4327
4448
  {{ liveAnnouncement() }}
4328
4449
  </div>
4329
- `, changeDetection: ChangeDetectionStrategy.OnPush, host: {
4450
+ `, providers: [{ provide: FormFieldControl, useExisting: forwardRef(() => ComTimePicker) }], changeDetection: ChangeDetectionStrategy.OnPush, host: {
4330
4451
  class: 'com-time-picker-host inline-block',
4331
4452
  '[class.com-time-picker-disabled]': 'disabled()',
4332
4453
  '[attr.role]': '"group"',
4333
4454
  '[attr.aria-label]': 'ariaLabel() || "Time picker"',
4334
4455
  '[attr.aria-disabled]': 'disabled() || null',
4335
4456
  }, styles: [".sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}\n"] }]
4336
- }], ctorParameters: () => [], propDecorators: { hoursInputRef: [{ type: i0.ViewChild, args: ['hoursInput', { isSignal: true }] }], minutesInputRef: [{ type: i0.ViewChild, args: ['minutesInput', { isSignal: true }] }], secondsInputRef: [{ type: i0.ViewChild, args: ['secondsInput', { isSignal: true }] }], periodButtonRef: [{ type: i0.ViewChild, args: ['periodButton', { isSignal: true }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], required: [{ type: i0.Input, args: [{ isSignal: true, alias: "required", required: false }] }], showSeconds: [{ type: i0.Input, args: [{ isSignal: true, alias: "showSeconds", required: false }] }], use12HourFormat: [{ type: i0.Input, args: [{ isSignal: true, alias: "use12HourFormat", required: false }] }], minuteStep: [{ type: i0.Input, args: [{ isSignal: true, alias: "minuteStep", required: false }] }], secondStep: [{ type: i0.Input, args: [{ isSignal: true, alias: "secondStep", required: false }] }], minTime: [{ type: i0.Input, args: [{ isSignal: true, alias: "minTime", required: false }] }], maxTime: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxTime", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], state: [{ type: i0.Input, args: [{ isSignal: true, alias: "state", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], timeChange: [{ type: i0.Output, args: ["timeChange"] }] } });
4457
+ }], ctorParameters: () => [], propDecorators: { hoursInputRef: [{ type: i0.ViewChild, args: ['hoursInput', { isSignal: true }] }], minutesInputRef: [{ type: i0.ViewChild, args: ['minutesInput', { isSignal: true }] }], secondsInputRef: [{ type: i0.ViewChild, args: ['secondsInput', { isSignal: true }] }], periodButtonRef: [{ type: i0.ViewChild, args: ['periodButton', { isSignal: true }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }, { type: i0.Output, args: ["disabledChange"] }], required: [{ type: i0.Input, args: [{ isSignal: true, alias: "required", required: false }] }], showSeconds: [{ type: i0.Input, args: [{ isSignal: true, alias: "showSeconds", required: false }] }], use12HourFormat: [{ type: i0.Input, args: [{ isSignal: true, alias: "use12HourFormat", required: false }] }], minuteStep: [{ type: i0.Input, args: [{ isSignal: true, alias: "minuteStep", required: false }] }], secondStep: [{ type: i0.Input, args: [{ isSignal: true, alias: "secondStep", required: false }] }], minTime: [{ type: i0.Input, args: [{ isSignal: true, alias: "minTime", required: false }] }], maxTime: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxTime", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], state: [{ type: i0.Input, args: [{ isSignal: true, alias: "state", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], errorStateMatcher: [{ type: i0.Input, args: [{ isSignal: true, alias: "errorStateMatcher", required: false }] }], touched: [{ type: i0.Input, args: [{ isSignal: true, alias: "touched", required: false }] }, { type: i0.Output, args: ["touchedChange"] }], invalid: [{ type: i0.Input, args: [{ isSignal: true, alias: "invalid", required: false }] }], sfErrors: [{ type: i0.Input, args: [{ isSignal: true, alias: "errors", required: false }] }], timeChange: [{ type: i0.Output, args: ["timeChange"] }] } });
4337
4458
 
4338
4459
  /** Default position for the datepicker panel. */
4339
4460
  const DEFAULT_POSITIONS$1 = [
@@ -4375,8 +4496,11 @@ class ComDatepicker {
4375
4496
  viewContainerRef = inject(ViewContainerRef);
4376
4497
  document = inject(DOCUMENT);
4377
4498
  dateAdapter = inject(DATE_ADAPTER);
4378
- /** Optional NgControl for form integration. */
4499
+ /** NgControl bound to this datepicker (if using reactive forms). */
4379
4500
  ngControl = inject(NgControl, { optional: true, self: true });
4501
+ defaultErrorStateMatcher = inject(ErrorStateMatcher);
4502
+ parentForm = inject(NgForm, { optional: true });
4503
+ parentFormGroup = inject(FormGroupDirective, { optional: true });
4380
4504
  /** Reference to the trigger element. */
4381
4505
  triggerRef = viewChild.required('triggerElement');
4382
4506
  /** Reference to the input element. */
@@ -4389,7 +4513,7 @@ class ComDatepicker {
4389
4513
  datepickerId = generateDatepickerId();
4390
4514
  // ============ INPUTS ============
4391
4515
  /** Current value. */
4392
- value = input(null, ...(ngDevMode ? [{ debugName: "value" }] : []));
4516
+ value = model(null, ...(ngDevMode ? [{ debugName: "value" }] : []));
4393
4517
  /** Minimum selectable date. */
4394
4518
  min = input(null, ...(ngDevMode ? [{ debugName: "min" }] : []));
4395
4519
  /** Maximum selectable date. */
@@ -4436,6 +4560,12 @@ class ComDatepicker {
4436
4560
  ariaLabel = input(null, ...(ngDevMode ? [{ debugName: "ariaLabel" }] : []));
4437
4561
  /** ID of element describing the input. */
4438
4562
  ariaDescribedBy = input(null, ...(ngDevMode ? [{ debugName: "ariaDescribedBy" }] : []));
4563
+ /** Custom error state matcher for determining when to show errors. */
4564
+ errorStateMatcher = input(...(ngDevMode ? [undefined, { debugName: "errorStateMatcher" }] : []));
4565
+ // Signal Forms inputs — set automatically by [formField] via setInputOnDirectives
4566
+ touched = model(false, ...(ngDevMode ? [{ debugName: "touched" }] : []));
4567
+ invalid = input(false, ...(ngDevMode ? [{ debugName: "invalid" }] : []));
4568
+ sfErrors = input([], { ...(ngDevMode ? { debugName: "sfErrors" } : {}), alias: 'errors' });
4439
4569
  /** Whether to show the time picker below the calendar. */
4440
4570
  showTimePicker = input(false, ...(ngDevMode ? [{ debugName: "showTimePicker" }] : []));
4441
4571
  /** 12h vs 24h format for the time picker. `null` = auto-detect. */
@@ -4460,9 +4590,49 @@ class ComDatepicker {
4460
4590
  calendarActiveDate = signal(this.dateAdapter.today(), ...(ngDevMode ? [{ debugName: "calendarActiveDate" }] : []));
4461
4591
  /** Live announcements for screen readers. */
4462
4592
  liveAnnouncement = signal('', ...(ngDevMode ? [{ debugName: "liveAnnouncement" }] : []));
4593
+ /** Whether the input is focused (not panel). */
4594
+ _inputFocused = signal(false, ...(ngDevMode ? [{ debugName: "_inputFocused" }] : []));
4595
+ /** IDs for aria-describedby (set by form-field). */
4596
+ _describedByIds = signal('', ...(ngDevMode ? [{ debugName: "_describedByIds" }] : []));
4597
+ /** Form field appearance (set by form-field). */
4598
+ _appearance = signal('outline', ...(ngDevMode ? [{ debugName: "_appearance" }] : []));
4599
+ // ============ FormFieldControl SIGNALS ============
4600
+ /** Whether the datepicker is focused (input focused or panel open). Implements FormFieldControl. */
4601
+ focused = computed(() => this._inputFocused() || this.isOpen(), ...(ngDevMode ? [{ debugName: "focused" }] : []));
4602
+ /** Whether the label should float. Label floats when focused or has a value. */
4603
+ shouldLabelFloat = computed(() => this.focused() || this.hasValue(), ...(ngDevMode ? [{ debugName: "shouldLabelFloat" }] : []));
4604
+ /** Whether the control is in an error state. Implements FormFieldControl. */
4605
+ errorState = computed(() => {
4606
+ if (!this.ngControl) {
4607
+ // Signal Forms: gate on invalid AND touched
4608
+ return this.invalid() && this.touched();
4609
+ }
4610
+ // Reactive Forms: use ErrorStateMatcher
4611
+ this.isOpen();
4612
+ this.hasValue();
4613
+ const matcher = this.errorStateMatcher() ?? this.defaultErrorStateMatcher;
4614
+ const form = this.parentFormGroup ?? this.parentForm;
4615
+ return matcher.isErrorState(this.ngControl.control ?? null, form);
4616
+ }, ...(ngDevMode ? [{ debugName: "errorState" }] : []));
4617
+ /** Structured validation errors from Signal Forms, exposed for the parent form field. */
4618
+ errors = computed(() => !this.ngControl ? this.sfErrors() : null, ...(ngDevMode ? [{ debugName: "errors" }] : []));
4619
+ /** Unique ID for the control. Implements FormFieldControl. */
4620
+ id = computed(() => `${this.datepickerId}-input`, ...(ngDevMode ? [{ debugName: "id" }] : []));
4621
+ /**
4622
+ * Effective state combining manual state with automatic error detection.
4623
+ * Manual state takes precedence over auto-detected error state.
4624
+ */
4625
+ effectiveState = computed(() => {
4626
+ const manualState = this.state();
4627
+ if (manualState !== 'default')
4628
+ return manualState;
4629
+ return this.errorState() ? 'error' : 'default';
4630
+ }, ...(ngDevMode ? [{ debugName: "effectiveState" }] : []));
4631
+ /** Combined aria-describedby from form-field and manual input. */
4632
+ effectiveAriaDescribedBy = computed(() => this._describedByIds() || this.ariaDescribedBy() || null, ...(ngDevMode ? [{ debugName: "effectiveAriaDescribedBy" }] : []));
4463
4633
  // ============ COMPUTED STATE ============
4464
- /** Input element ID. */
4465
- inputId = computed(() => `${this.datepickerId}-input`, ...(ngDevMode ? [{ debugName: "inputId" }] : []));
4634
+ /** Input element ID (alias for FormFieldControl id). */
4635
+ inputId = this.id;
4466
4636
  /** Panel element ID. */
4467
4637
  panelId = computed(() => `${this.datepickerId}-panel`, ...(ngDevMode ? [{ debugName: "panelId" }] : []));
4468
4638
  /** Whether the datepicker has a value. */
@@ -4488,11 +4658,16 @@ class ComDatepicker {
4488
4658
  const baseClasses = datepickerTriggerVariants({
4489
4659
  variant: this.variant(),
4490
4660
  size: this.size(),
4491
- state: this.state(),
4661
+ state: this.effectiveState(),
4492
4662
  open: this.isOpen(),
4493
4663
  });
4494
4664
  const disabledClasses = this.disabled() ? datepickerDisabledVariants() : '';
4495
- return joinClasses(baseClasses, disabledClasses, this.userClass());
4665
+ // For naked variant, add padding based on form-field appearance
4666
+ let paddingClasses = '';
4667
+ if (this.variant() === 'naked') {
4668
+ paddingClasses = this._appearance() === 'fill' ? 'pt-5 pb-1.5 px-3' : 'py-2.5 px-3';
4669
+ }
4670
+ return mergeClasses(baseClasses, disabledClasses, paddingClasses, this.userClass());
4496
4671
  }, ...(ngDevMode ? [{ debugName: "triggerClasses" }] : []));
4497
4672
  /** Computed input classes. */
4498
4673
  inputClasses = computed(() => {
@@ -4634,6 +4809,7 @@ class ComDatepicker {
4634
4809
  this.isOpen.set(false);
4635
4810
  this.closed.emit();
4636
4811
  this.onTouched();
4812
+ this.touched.set(true);
4637
4813
  // Return focus to trigger
4638
4814
  this.inputRef().nativeElement.focus();
4639
4815
  }
@@ -4662,6 +4838,9 @@ class ComDatepicker {
4662
4838
  }
4663
4839
  }
4664
4840
  // ============ EVENT HANDLERS ============
4841
+ onInputFocus() {
4842
+ this._inputFocused.set(true);
4843
+ }
4665
4844
  onTriggerClick() {
4666
4845
  if (!this.disabled()) {
4667
4846
  this.toggle();
@@ -4717,10 +4896,12 @@ class ComDatepicker {
4717
4896
  // For now, we just allow typing without immediate parsing
4718
4897
  }
4719
4898
  onInputBlur() {
4899
+ this._inputFocused.set(false);
4720
4900
  if (this.allowManualInput()) {
4721
4901
  this.parseAndSetValue(this.inputRef().nativeElement.value);
4722
4902
  }
4723
4903
  this.onTouched();
4904
+ this.touched.set(true);
4724
4905
  }
4725
4906
  onPanelKeydown(event) {
4726
4907
  switch (event.key) {
@@ -4760,6 +4941,31 @@ class ComDatepicker {
4760
4941
  onActiveDateChange(date) {
4761
4942
  this.calendarActiveDate.set(date);
4762
4943
  }
4944
+ // ============ FormFieldControl IMPLEMENTATION ============
4945
+ /**
4946
+ * Called when the form field container is clicked.
4947
+ * Implements FormFieldControl.
4948
+ */
4949
+ onContainerClick(event) {
4950
+ const target = event.target;
4951
+ if (!this.disabled() && !this.triggerRef().nativeElement.contains(target)) {
4952
+ this.toggle();
4953
+ }
4954
+ }
4955
+ /**
4956
+ * Sets the describedBy IDs from the form field.
4957
+ * Called by the parent form field component.
4958
+ */
4959
+ setDescribedByIds(ids) {
4960
+ this._describedByIds.set(ids);
4961
+ }
4962
+ /**
4963
+ * Sets the appearance for styling.
4964
+ * Called by the parent form field component.
4965
+ */
4966
+ setAppearance(appearance) {
4967
+ this._appearance.set(appearance);
4968
+ }
4763
4969
  // ============ PRIVATE METHODS ============
4764
4970
  createOverlay() {
4765
4971
  if (this.overlayRef) {
@@ -4799,7 +5005,7 @@ class ComDatepicker {
4799
5005
  }
4800
5006
  }
4801
5007
  updateValue(value) {
4802
- this.internalValue.set(value);
5008
+ this.value.set(value);
4803
5009
  this.onChange(value);
4804
5010
  this.dateChange.emit(value);
4805
5011
  this.onValidatorChange();
@@ -4847,9 +5053,10 @@ class ComDatepicker {
4847
5053
  this.liveAnnouncement.set(message);
4848
5054
  }
4849
5055
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ComDatepicker, deps: [], target: i0.ɵɵFactoryTarget.Component });
4850
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: ComDatepicker, isStandalone: true, selector: "com-datepicker", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, min: { classPropertyName: "min", publicName: "min", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, dateFilter: { classPropertyName: "dateFilter", publicName: "dateFilter", isSignal: true, isRequired: false, transformFunction: null }, startAt: { classPropertyName: "startAt", publicName: "startAt", isSignal: true, isRequired: false, transformFunction: null }, startView: { classPropertyName: "startView", publicName: "startView", isSignal: true, isRequired: false, transformFunction: null }, firstDayOfWeek: { classPropertyName: "firstDayOfWeek", publicName: "firstDayOfWeek", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, required: { classPropertyName: "required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, dateFormat: { classPropertyName: "dateFormat", publicName: "dateFormat", isSignal: true, isRequired: false, transformFunction: null }, showClearButton: { classPropertyName: "showClearButton", publicName: "showClearButton", isSignal: true, isRequired: false, transformFunction: null }, showTodayButton: { classPropertyName: "showTodayButton", publicName: "showTodayButton", isSignal: true, isRequired: false, transformFunction: null }, showFooterClearButton: { classPropertyName: "showFooterClearButton", publicName: "showFooterClearButton", isSignal: true, isRequired: false, transformFunction: null }, keepOpen: { classPropertyName: "keepOpen", publicName: "keepOpen", isSignal: true, isRequired: false, transformFunction: null }, allowManualInput: { classPropertyName: "allowManualInput", publicName: "allowManualInput", isSignal: true, isRequired: false, transformFunction: null }, panelClass: { classPropertyName: "panelClass", publicName: "panelClass", isSignal: true, isRequired: false, transformFunction: null }, panelWidth: { classPropertyName: "panelWidth", publicName: "panelWidth", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, state: { classPropertyName: "state", publicName: "state", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, ariaDescribedBy: { classPropertyName: "ariaDescribedBy", publicName: "ariaDescribedBy", isSignal: true, isRequired: false, transformFunction: null }, showTimePicker: { classPropertyName: "showTimePicker", publicName: "showTimePicker", isSignal: true, isRequired: false, transformFunction: null }, use12HourFormat: { classPropertyName: "use12HourFormat", publicName: "use12HourFormat", isSignal: true, isRequired: false, transformFunction: null }, showSeconds: { classPropertyName: "showSeconds", publicName: "showSeconds", isSignal: true, isRequired: false, transformFunction: null }, minuteStep: { classPropertyName: "minuteStep", publicName: "minuteStep", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { dateChange: "dateChange", opened: "opened", closed: "closed" }, host: { properties: { "class.com-datepicker-disabled": "disabled()", "class.com-datepicker-open": "isOpen()" }, classAttribute: "com-datepicker-host inline-block" }, providers: [
5056
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: ComDatepicker, isStandalone: true, selector: "com-datepicker", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, min: { classPropertyName: "min", publicName: "min", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, dateFilter: { classPropertyName: "dateFilter", publicName: "dateFilter", isSignal: true, isRequired: false, transformFunction: null }, startAt: { classPropertyName: "startAt", publicName: "startAt", isSignal: true, isRequired: false, transformFunction: null }, startView: { classPropertyName: "startView", publicName: "startView", isSignal: true, isRequired: false, transformFunction: null }, firstDayOfWeek: { classPropertyName: "firstDayOfWeek", publicName: "firstDayOfWeek", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, required: { classPropertyName: "required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, dateFormat: { classPropertyName: "dateFormat", publicName: "dateFormat", isSignal: true, isRequired: false, transformFunction: null }, showClearButton: { classPropertyName: "showClearButton", publicName: "showClearButton", isSignal: true, isRequired: false, transformFunction: null }, showTodayButton: { classPropertyName: "showTodayButton", publicName: "showTodayButton", isSignal: true, isRequired: false, transformFunction: null }, showFooterClearButton: { classPropertyName: "showFooterClearButton", publicName: "showFooterClearButton", isSignal: true, isRequired: false, transformFunction: null }, keepOpen: { classPropertyName: "keepOpen", publicName: "keepOpen", isSignal: true, isRequired: false, transformFunction: null }, allowManualInput: { classPropertyName: "allowManualInput", publicName: "allowManualInput", isSignal: true, isRequired: false, transformFunction: null }, panelClass: { classPropertyName: "panelClass", publicName: "panelClass", isSignal: true, isRequired: false, transformFunction: null }, panelWidth: { classPropertyName: "panelWidth", publicName: "panelWidth", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, state: { classPropertyName: "state", publicName: "state", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, ariaDescribedBy: { classPropertyName: "ariaDescribedBy", publicName: "ariaDescribedBy", isSignal: true, isRequired: false, transformFunction: null }, errorStateMatcher: { classPropertyName: "errorStateMatcher", publicName: "errorStateMatcher", isSignal: true, isRequired: false, transformFunction: null }, touched: { classPropertyName: "touched", publicName: "touched", isSignal: true, isRequired: false, transformFunction: null }, invalid: { classPropertyName: "invalid", publicName: "invalid", isSignal: true, isRequired: false, transformFunction: null }, sfErrors: { classPropertyName: "sfErrors", publicName: "errors", isSignal: true, isRequired: false, transformFunction: null }, showTimePicker: { classPropertyName: "showTimePicker", publicName: "showTimePicker", isSignal: true, isRequired: false, transformFunction: null }, use12HourFormat: { classPropertyName: "use12HourFormat", publicName: "use12HourFormat", isSignal: true, isRequired: false, transformFunction: null }, showSeconds: { classPropertyName: "showSeconds", publicName: "showSeconds", isSignal: true, isRequired: false, transformFunction: null }, minuteStep: { classPropertyName: "minuteStep", publicName: "minuteStep", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange", touched: "touchedChange", dateChange: "dateChange", opened: "opened", closed: "closed" }, host: { properties: { "class.com-datepicker-disabled": "disabled()", "class.com-datepicker-open": "isOpen()" }, classAttribute: "com-datepicker-host inline-block" }, providers: [
4851
5057
  SingleSelectionStrategy,
4852
5058
  { provide: CALENDAR_SELECTION_STRATEGY, useExisting: SingleSelectionStrategy },
5059
+ { provide: FormFieldControl, useExisting: forwardRef(() => ComDatepicker) },
4853
5060
  ], viewQueries: [{ propertyName: "triggerRef", first: true, predicate: ["triggerElement"], descendants: true, isSignal: true }, { propertyName: "inputRef", first: true, predicate: ["inputElement"], descendants: true, isSignal: true }, { propertyName: "panelTemplateRef", first: true, predicate: ["panelTemplate"], descendants: true, isSignal: true }], exportAs: ["comDatepicker"], ngImport: i0, template: `
4854
5061
  <!-- Trigger container -->
4855
5062
  <div
@@ -4873,9 +5080,10 @@ class ComDatepicker {
4873
5080
  [readonly]="!allowManualInput()"
4874
5081
  [attr.id]="inputId()"
4875
5082
  [attr.aria-label]="ariaLabel() || placeholder()"
4876
- [attr.aria-describedby]="ariaDescribedBy() || null"
4877
- [attr.aria-invalid]="state() === 'error' || null"
5083
+ [attr.aria-describedby]="effectiveAriaDescribedBy() || null"
5084
+ [attr.aria-invalid]="effectiveState() === 'error' || null"
4878
5085
  [attr.aria-required]="required() || null"
5086
+ (focus)="onInputFocus()"
4879
5087
  (input)="onInputChange($event)"
4880
5088
  (blur)="onInputBlur()"
4881
5089
  (keydown)="onInputKeydown($event)"
@@ -4983,7 +5191,7 @@ class ComDatepicker {
4983
5191
  <div class="sr-only" aria-live="polite" aria-atomic="true">
4984
5192
  {{ liveAnnouncement() }}
4985
5193
  </div>
4986
- `, isInline: true, styles: [".sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}\n"], dependencies: [{ kind: "ngmodule", type: OverlayModule }, { kind: "ngmodule", type: A11yModule }, { kind: "directive", type: i1.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "component", type: ComCalendar, selector: "com-calendar", inputs: ["activeDate", "selected", "minDate", "maxDate", "dateFilter", "dateClass", "bordered", "startView", "firstDayOfWeek", "monthColumns", "cellTemplate"], outputs: ["selectedChange", "viewChanged", "activeDateChange"] }, { kind: "component", type: ComIcon, selector: "com-icon", inputs: ["name", "img", "color", "size", "strokeWidth", "absoluteStrokeWidth", "ariaLabel"] }, { kind: "component", type: ComTimePicker, selector: "com-time-picker", inputs: ["value", "disabled", "required", "showSeconds", "use12HourFormat", "minuteStep", "secondStep", "minTime", "maxTime", "variant", "size", "state", "ariaLabel", "class", "placeholder"], outputs: ["timeChange"], exportAs: ["comTimePicker"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
5194
+ `, isInline: true, styles: [".sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}\n"], dependencies: [{ kind: "ngmodule", type: OverlayModule }, { kind: "ngmodule", type: A11yModule }, { kind: "directive", type: i1.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "component", type: ComCalendar, selector: "com-calendar", inputs: ["activeDate", "selected", "minDate", "maxDate", "dateFilter", "dateClass", "bordered", "startView", "firstDayOfWeek", "monthColumns", "cellTemplate"], outputs: ["selectedChange", "viewChanged", "activeDateChange"] }, { kind: "component", type: ComIcon, selector: "com-icon", inputs: ["name", "img", "color", "size", "strokeWidth", "absoluteStrokeWidth", "ariaLabel"] }, { kind: "component", type: ComTimePicker, selector: "com-time-picker", inputs: ["value", "disabled", "required", "showSeconds", "use12HourFormat", "minuteStep", "secondStep", "minTime", "maxTime", "variant", "size", "state", "ariaLabel", "class", "placeholder", "errorStateMatcher", "touched", "invalid", "errors"], outputs: ["valueChange", "disabledChange", "touchedChange", "timeChange"], exportAs: ["comTimePicker"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
4987
5195
  }
4988
5196
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ComDatepicker, decorators: [{
4989
5197
  type: Component,
@@ -5010,9 +5218,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
5010
5218
  [readonly]="!allowManualInput()"
5011
5219
  [attr.id]="inputId()"
5012
5220
  [attr.aria-label]="ariaLabel() || placeholder()"
5013
- [attr.aria-describedby]="ariaDescribedBy() || null"
5014
- [attr.aria-invalid]="state() === 'error' || null"
5221
+ [attr.aria-describedby]="effectiveAriaDescribedBy() || null"
5222
+ [attr.aria-invalid]="effectiveState() === 'error' || null"
5015
5223
  [attr.aria-required]="required() || null"
5224
+ (focus)="onInputFocus()"
5016
5225
  (input)="onInputChange($event)"
5017
5226
  (blur)="onInputBlur()"
5018
5227
  (keydown)="onInputKeydown($event)"
@@ -5129,12 +5338,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
5129
5338
  ], providers: [
5130
5339
  SingleSelectionStrategy,
5131
5340
  { provide: CALENDAR_SELECTION_STRATEGY, useExisting: SingleSelectionStrategy },
5341
+ { provide: FormFieldControl, useExisting: forwardRef(() => ComDatepicker) },
5132
5342
  ], changeDetection: ChangeDetectionStrategy.OnPush, host: {
5133
5343
  class: 'com-datepicker-host inline-block',
5134
5344
  '[class.com-datepicker-disabled]': 'disabled()',
5135
5345
  '[class.com-datepicker-open]': 'isOpen()',
5136
5346
  }, styles: [".sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}\n"] }]
5137
- }], ctorParameters: () => [], propDecorators: { triggerRef: [{ type: i0.ViewChild, args: ['triggerElement', { isSignal: true }] }], inputRef: [{ type: i0.ViewChild, args: ['inputElement', { isSignal: true }] }], panelTemplateRef: [{ type: i0.ViewChild, args: ['panelTemplate', { isSignal: true }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }], min: [{ type: i0.Input, args: [{ isSignal: true, alias: "min", required: false }] }], max: [{ type: i0.Input, args: [{ isSignal: true, alias: "max", required: false }] }], dateFilter: [{ type: i0.Input, args: [{ isSignal: true, alias: "dateFilter", required: false }] }], startAt: [{ type: i0.Input, args: [{ isSignal: true, alias: "startAt", required: false }] }], startView: [{ type: i0.Input, args: [{ isSignal: true, alias: "startView", required: false }] }], firstDayOfWeek: [{ type: i0.Input, args: [{ isSignal: true, alias: "firstDayOfWeek", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], required: [{ type: i0.Input, args: [{ isSignal: true, alias: "required", required: false }] }], dateFormat: [{ type: i0.Input, args: [{ isSignal: true, alias: "dateFormat", required: false }] }], showClearButton: [{ type: i0.Input, args: [{ isSignal: true, alias: "showClearButton", required: false }] }], showTodayButton: [{ type: i0.Input, args: [{ isSignal: true, alias: "showTodayButton", required: false }] }], showFooterClearButton: [{ type: i0.Input, args: [{ isSignal: true, alias: "showFooterClearButton", required: false }] }], keepOpen: [{ type: i0.Input, args: [{ isSignal: true, alias: "keepOpen", required: false }] }], allowManualInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "allowManualInput", required: false }] }], panelClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "panelClass", required: false }] }], panelWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "panelWidth", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], state: [{ type: i0.Input, args: [{ isSignal: true, alias: "state", required: false }] }], userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], ariaDescribedBy: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaDescribedBy", required: false }] }], showTimePicker: [{ type: i0.Input, args: [{ isSignal: true, alias: "showTimePicker", required: false }] }], use12HourFormat: [{ type: i0.Input, args: [{ isSignal: true, alias: "use12HourFormat", required: false }] }], showSeconds: [{ type: i0.Input, args: [{ isSignal: true, alias: "showSeconds", required: false }] }], minuteStep: [{ type: i0.Input, args: [{ isSignal: true, alias: "minuteStep", required: false }] }], dateChange: [{ type: i0.Output, args: ["dateChange"] }], opened: [{ type: i0.Output, args: ["opened"] }], closed: [{ type: i0.Output, args: ["closed"] }] } });
5347
+ }], ctorParameters: () => [], propDecorators: { triggerRef: [{ type: i0.ViewChild, args: ['triggerElement', { isSignal: true }] }], inputRef: [{ type: i0.ViewChild, args: ['inputElement', { isSignal: true }] }], panelTemplateRef: [{ type: i0.ViewChild, args: ['panelTemplate', { isSignal: true }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], min: [{ type: i0.Input, args: [{ isSignal: true, alias: "min", required: false }] }], max: [{ type: i0.Input, args: [{ isSignal: true, alias: "max", required: false }] }], dateFilter: [{ type: i0.Input, args: [{ isSignal: true, alias: "dateFilter", required: false }] }], startAt: [{ type: i0.Input, args: [{ isSignal: true, alias: "startAt", required: false }] }], startView: [{ type: i0.Input, args: [{ isSignal: true, alias: "startView", required: false }] }], firstDayOfWeek: [{ type: i0.Input, args: [{ isSignal: true, alias: "firstDayOfWeek", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], required: [{ type: i0.Input, args: [{ isSignal: true, alias: "required", required: false }] }], dateFormat: [{ type: i0.Input, args: [{ isSignal: true, alias: "dateFormat", required: false }] }], showClearButton: [{ type: i0.Input, args: [{ isSignal: true, alias: "showClearButton", required: false }] }], showTodayButton: [{ type: i0.Input, args: [{ isSignal: true, alias: "showTodayButton", required: false }] }], showFooterClearButton: [{ type: i0.Input, args: [{ isSignal: true, alias: "showFooterClearButton", required: false }] }], keepOpen: [{ type: i0.Input, args: [{ isSignal: true, alias: "keepOpen", required: false }] }], allowManualInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "allowManualInput", required: false }] }], panelClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "panelClass", required: false }] }], panelWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "panelWidth", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], state: [{ type: i0.Input, args: [{ isSignal: true, alias: "state", required: false }] }], userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], ariaDescribedBy: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaDescribedBy", required: false }] }], errorStateMatcher: [{ type: i0.Input, args: [{ isSignal: true, alias: "errorStateMatcher", required: false }] }], touched: [{ type: i0.Input, args: [{ isSignal: true, alias: "touched", required: false }] }, { type: i0.Output, args: ["touchedChange"] }], invalid: [{ type: i0.Input, args: [{ isSignal: true, alias: "invalid", required: false }] }], sfErrors: [{ type: i0.Input, args: [{ isSignal: true, alias: "errors", required: false }] }], showTimePicker: [{ type: i0.Input, args: [{ isSignal: true, alias: "showTimePicker", required: false }] }], use12HourFormat: [{ type: i0.Input, args: [{ isSignal: true, alias: "use12HourFormat", required: false }] }], showSeconds: [{ type: i0.Input, args: [{ isSignal: true, alias: "showSeconds", required: false }] }], minuteStep: [{ type: i0.Input, args: [{ isSignal: true, alias: "minuteStep", required: false }] }], dateChange: [{ type: i0.Output, args: ["dateChange"] }], opened: [{ type: i0.Output, args: ["opened"] }], closed: [{ type: i0.Output, args: ["closed"] }] } });
5138
5348
 
5139
5349
  /** Default position for the datepicker panel. */
5140
5350
  const DEFAULT_POSITIONS = [
@@ -5177,8 +5387,11 @@ class ComDateRangePicker {
5177
5387
  viewContainerRef = inject(ViewContainerRef);
5178
5388
  document = inject(DOCUMENT);
5179
5389
  dateAdapter = inject(DATE_ADAPTER);
5180
- /** Optional NgControl for form integration. */
5390
+ /** NgControl bound to this date range picker (if using reactive forms). */
5181
5391
  ngControl = inject(NgControl, { optional: true, self: true });
5392
+ defaultErrorStateMatcher = inject(ErrorStateMatcher);
5393
+ parentForm = inject(NgForm, { optional: true });
5394
+ parentFormGroup = inject(FormGroupDirective, { optional: true });
5182
5395
  /** Reference to the trigger element. */
5183
5396
  triggerRef = viewChild.required('triggerElement');
5184
5397
  /** Reference to the start input element. */
@@ -5193,7 +5406,7 @@ class ComDateRangePicker {
5193
5406
  datepickerId = generateDatepickerId();
5194
5407
  // ============ INPUTS ============
5195
5408
  /** Current value. */
5196
- value = input(null, ...(ngDevMode ? [{ debugName: "value" }] : []));
5409
+ value = model(null, ...(ngDevMode ? [{ debugName: "value" }] : []));
5197
5410
  /** Minimum selectable date. */
5198
5411
  min = input(null, ...(ngDevMode ? [{ debugName: "min" }] : []));
5199
5412
  /** Maximum selectable date. */
@@ -5242,6 +5455,12 @@ class ComDateRangePicker {
5242
5455
  startAriaLabel = input(null, ...(ngDevMode ? [{ debugName: "startAriaLabel" }] : []));
5243
5456
  /** Accessible label for the end input. */
5244
5457
  endAriaLabel = input(null, ...(ngDevMode ? [{ debugName: "endAriaLabel" }] : []));
5458
+ /** Custom error state matcher for determining when to show errors. */
5459
+ errorStateMatcher = input(...(ngDevMode ? [undefined, { debugName: "errorStateMatcher" }] : []));
5460
+ // Signal Forms inputs — set automatically by [formField] via setInputOnDirectives
5461
+ touched = model(false, ...(ngDevMode ? [{ debugName: "touched" }] : []));
5462
+ invalid = input(false, ...(ngDevMode ? [{ debugName: "invalid" }] : []));
5463
+ sfErrors = input([], { ...(ngDevMode ? { debugName: "sfErrors" } : {}), alias: 'errors' });
5245
5464
  /** Whether to show time pickers below the calendar. */
5246
5465
  showTimePicker = input(false, ...(ngDevMode ? [{ debugName: "showTimePicker" }] : []));
5247
5466
  /** 12h vs 24h format for the time pickers. `null` = auto-detect. */
@@ -5268,9 +5487,46 @@ class ComDateRangePicker {
5268
5487
  calendarActiveDate = signal(this.dateAdapter.today(), ...(ngDevMode ? [{ debugName: "calendarActiveDate" }] : []));
5269
5488
  /** Live announcements for screen readers. */
5270
5489
  liveAnnouncement = signal('', ...(ngDevMode ? [{ debugName: "liveAnnouncement" }] : []));
5490
+ /** Whether any input is focused. */
5491
+ _inputFocused = signal(false, ...(ngDevMode ? [{ debugName: "_inputFocused" }] : []));
5492
+ /** IDs for aria-describedby (set by form-field). */
5493
+ _describedByIds = signal('', ...(ngDevMode ? [{ debugName: "_describedByIds" }] : []));
5494
+ /** Form field appearance (set by form-field). */
5495
+ _appearance = signal('outline', ...(ngDevMode ? [{ debugName: "_appearance" }] : []));
5496
+ // ============ FormFieldControl SIGNALS ============
5497
+ /** Whether the date range picker is focused. Implements FormFieldControl. */
5498
+ focused = computed(() => this._inputFocused() || this.isOpen(), ...(ngDevMode ? [{ debugName: "focused" }] : []));
5499
+ /** Whether the label should float. */
5500
+ shouldLabelFloat = computed(() => this.focused() || this.hasValue(), ...(ngDevMode ? [{ debugName: "shouldLabelFloat" }] : []));
5501
+ /** Whether the control is in an error state. Implements FormFieldControl. */
5502
+ errorState = computed(() => {
5503
+ if (!this.ngControl) {
5504
+ return this.invalid() && this.touched();
5505
+ }
5506
+ this.isOpen();
5507
+ this.hasValue();
5508
+ const matcher = this.errorStateMatcher() ?? this.defaultErrorStateMatcher;
5509
+ const form = this.parentFormGroup ?? this.parentForm;
5510
+ return matcher.isErrorState(this.ngControl.control ?? null, form);
5511
+ }, ...(ngDevMode ? [{ debugName: "errorState" }] : []));
5512
+ /** Structured validation errors from Signal Forms. */
5513
+ errors = computed(() => !this.ngControl ? this.sfErrors() : null, ...(ngDevMode ? [{ debugName: "errors" }] : []));
5514
+ /** Unique ID for the control (maps to start input). Implements FormFieldControl. */
5515
+ id = computed(() => `${this.datepickerId}-start`, ...(ngDevMode ? [{ debugName: "id" }] : []));
5516
+ /**
5517
+ * Effective state combining manual state with automatic error detection.
5518
+ */
5519
+ effectiveState = computed(() => {
5520
+ const manualState = this.state();
5521
+ if (manualState !== 'default')
5522
+ return manualState;
5523
+ return this.errorState() ? 'error' : 'default';
5524
+ }, ...(ngDevMode ? [{ debugName: "effectiveState" }] : []));
5525
+ /** Combined aria-describedby from form-field. */
5526
+ effectiveAriaDescribedBy = computed(() => this._describedByIds() || null, ...(ngDevMode ? [{ debugName: "effectiveAriaDescribedBy" }] : []));
5271
5527
  // ============ COMPUTED STATE ============
5272
- /** Start input element ID. */
5273
- startInputId = computed(() => `${this.datepickerId}-start`, ...(ngDevMode ? [{ debugName: "startInputId" }] : []));
5528
+ /** Start input element ID (alias for FormFieldControl id). */
5529
+ startInputId = this.id;
5274
5530
  /** End input element ID. */
5275
5531
  endInputId = computed(() => `${this.datepickerId}-end`, ...(ngDevMode ? [{ debugName: "endInputId" }] : []));
5276
5532
  /** Panel element ID. */
@@ -5315,11 +5571,16 @@ class ComDateRangePicker {
5315
5571
  const baseClasses = datepickerTriggerVariants({
5316
5572
  variant: this.variant(),
5317
5573
  size: this.size(),
5318
- state: this.state(),
5574
+ state: this.effectiveState(),
5319
5575
  open: this.isOpen(),
5320
5576
  });
5321
5577
  const disabledClasses = this.disabled() ? datepickerDisabledVariants() : '';
5322
- return joinClasses(baseClasses, disabledClasses, this.userClass());
5578
+ // For naked variant, add padding based on form-field appearance
5579
+ let paddingClasses = '';
5580
+ if (this.variant() === 'naked') {
5581
+ paddingClasses = this._appearance() === 'fill' ? 'pt-5 pb-1.5 px-3' : 'py-2.5 px-3';
5582
+ }
5583
+ return mergeClasses(baseClasses, disabledClasses, paddingClasses, this.userClass());
5323
5584
  }, ...(ngDevMode ? [{ debugName: "triggerClasses" }] : []));
5324
5585
  /** Computed input classes. */
5325
5586
  inputClasses = computed(() => {
@@ -5484,6 +5745,7 @@ class ComDateRangePicker {
5484
5745
  this.isOpen.set(false);
5485
5746
  this.closed.emit();
5486
5747
  this.onTouched();
5748
+ this.touched.set(true);
5487
5749
  // Return focus to appropriate input
5488
5750
  const activeInput = this.activeInput();
5489
5751
  if (activeInput === 'end') {
@@ -5547,9 +5809,11 @@ class ComDateRangePicker {
5547
5809
  }
5548
5810
  onStartInputFocus() {
5549
5811
  this.activeInput.set('start');
5812
+ this._inputFocused.set(true);
5550
5813
  }
5551
5814
  onEndInputFocus() {
5552
5815
  this.activeInput.set('end');
5816
+ this._inputFocused.set(true);
5553
5817
  }
5554
5818
  onInputKeydown(event, inputType) {
5555
5819
  switch (event.key) {
@@ -5592,16 +5856,20 @@ class ComDateRangePicker {
5592
5856
  // Debounced in blur handler
5593
5857
  }
5594
5858
  onStartInputBlur() {
5859
+ this._inputFocused.set(false);
5595
5860
  if (this.allowManualInput()) {
5596
5861
  this.parseAndSetStart(this.startInputRef().nativeElement.value);
5597
5862
  }
5598
5863
  this.onTouched();
5864
+ this.touched.set(true);
5599
5865
  }
5600
5866
  onEndInputBlur() {
5867
+ this._inputFocused.set(false);
5601
5868
  if (this.allowManualInput()) {
5602
5869
  this.parseAndSetEnd(this.endInputRef().nativeElement.value);
5603
5870
  }
5604
5871
  this.onTouched();
5872
+ this.touched.set(true);
5605
5873
  }
5606
5874
  onPanelKeydown(event) {
5607
5875
  switch (event.key) {
@@ -5648,6 +5916,32 @@ class ComDateRangePicker {
5648
5916
  const updated = this.dateAdapter.setTime(endDate, time.hours, time.minutes, time.seconds);
5649
5917
  this.updateValue(createDateRangeValue(value?.start ?? null, updated));
5650
5918
  }
5919
+ // ============ FormFieldControl IMPLEMENTATION ============
5920
+ /**
5921
+ * Called when the form field container is clicked.
5922
+ * Implements FormFieldControl.
5923
+ */
5924
+ onContainerClick(event) {
5925
+ const target = event.target;
5926
+ if (!this.disabled() && !this.triggerRef().nativeElement.contains(target)) {
5927
+ this.open();
5928
+ this.startInputRef().nativeElement.focus();
5929
+ }
5930
+ }
5931
+ /**
5932
+ * Sets the describedBy IDs from the form field.
5933
+ * Called by the parent form field component.
5934
+ */
5935
+ setDescribedByIds(ids) {
5936
+ this._describedByIds.set(ids);
5937
+ }
5938
+ /**
5939
+ * Sets the appearance for styling.
5940
+ * Called by the parent form field component.
5941
+ */
5942
+ setAppearance(appearance) {
5943
+ this._appearance.set(appearance);
5944
+ }
5651
5945
  // ============ PRIVATE METHODS ============
5652
5946
  createOverlay() {
5653
5947
  if (this.overlayRef) {
@@ -5687,7 +5981,7 @@ class ComDateRangePicker {
5687
5981
  }
5688
5982
  }
5689
5983
  updateValue(value) {
5690
- this.internalValue.set(value);
5984
+ this.value.set(value);
5691
5985
  this.onChange(value);
5692
5986
  this.rangeChange.emit(value);
5693
5987
  this.onValidatorChange();
@@ -5764,9 +6058,10 @@ class ComDateRangePicker {
5764
6058
  this.liveAnnouncement.set(message);
5765
6059
  }
5766
6060
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ComDateRangePicker, deps: [], target: i0.ɵɵFactoryTarget.Component });
5767
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: ComDateRangePicker, isStandalone: true, selector: "com-date-range-picker", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, min: { classPropertyName: "min", publicName: "min", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, dateFilter: { classPropertyName: "dateFilter", publicName: "dateFilter", isSignal: true, isRequired: false, transformFunction: null }, startAt: { classPropertyName: "startAt", publicName: "startAt", isSignal: true, isRequired: false, transformFunction: null }, startView: { classPropertyName: "startView", publicName: "startView", isSignal: true, isRequired: false, transformFunction: null }, firstDayOfWeek: { classPropertyName: "firstDayOfWeek", publicName: "firstDayOfWeek", isSignal: true, isRequired: false, transformFunction: null }, startPlaceholder: { classPropertyName: "startPlaceholder", publicName: "startPlaceholder", isSignal: true, isRequired: false, transformFunction: null }, endPlaceholder: { classPropertyName: "endPlaceholder", publicName: "endPlaceholder", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, required: { classPropertyName: "required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, dateFormat: { classPropertyName: "dateFormat", publicName: "dateFormat", isSignal: true, isRequired: false, transformFunction: null }, showClearButton: { classPropertyName: "showClearButton", publicName: "showClearButton", isSignal: true, isRequired: false, transformFunction: null }, showTodayButton: { classPropertyName: "showTodayButton", publicName: "showTodayButton", isSignal: true, isRequired: false, transformFunction: null }, showFooterClearButton: { classPropertyName: "showFooterClearButton", publicName: "showFooterClearButton", isSignal: true, isRequired: false, transformFunction: null }, keepOpen: { classPropertyName: "keepOpen", publicName: "keepOpen", isSignal: true, isRequired: false, transformFunction: null }, allowManualInput: { classPropertyName: "allowManualInput", publicName: "allowManualInput", isSignal: true, isRequired: false, transformFunction: null }, panelClass: { classPropertyName: "panelClass", publicName: "panelClass", isSignal: true, isRequired: false, transformFunction: null }, panelWidth: { classPropertyName: "panelWidth", publicName: "panelWidth", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, state: { classPropertyName: "state", publicName: "state", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, startAriaLabel: { classPropertyName: "startAriaLabel", publicName: "startAriaLabel", isSignal: true, isRequired: false, transformFunction: null }, endAriaLabel: { classPropertyName: "endAriaLabel", publicName: "endAriaLabel", isSignal: true, isRequired: false, transformFunction: null }, showTimePicker: { classPropertyName: "showTimePicker", publicName: "showTimePicker", isSignal: true, isRequired: false, transformFunction: null }, use12HourFormat: { classPropertyName: "use12HourFormat", publicName: "use12HourFormat", isSignal: true, isRequired: false, transformFunction: null }, showSeconds: { classPropertyName: "showSeconds", publicName: "showSeconds", isSignal: true, isRequired: false, transformFunction: null }, minuteStep: { classPropertyName: "minuteStep", publicName: "minuteStep", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { rangeChange: "rangeChange", opened: "opened", closed: "closed" }, host: { properties: { "class.com-date-range-picker-disabled": "disabled()", "class.com-date-range-picker-open": "isOpen()" }, classAttribute: "com-date-range-picker-host inline-block" }, providers: [
6061
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.0", type: ComDateRangePicker, isStandalone: true, selector: "com-date-range-picker", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, min: { classPropertyName: "min", publicName: "min", isSignal: true, isRequired: false, transformFunction: null }, max: { classPropertyName: "max", publicName: "max", isSignal: true, isRequired: false, transformFunction: null }, dateFilter: { classPropertyName: "dateFilter", publicName: "dateFilter", isSignal: true, isRequired: false, transformFunction: null }, startAt: { classPropertyName: "startAt", publicName: "startAt", isSignal: true, isRequired: false, transformFunction: null }, startView: { classPropertyName: "startView", publicName: "startView", isSignal: true, isRequired: false, transformFunction: null }, firstDayOfWeek: { classPropertyName: "firstDayOfWeek", publicName: "firstDayOfWeek", isSignal: true, isRequired: false, transformFunction: null }, startPlaceholder: { classPropertyName: "startPlaceholder", publicName: "startPlaceholder", isSignal: true, isRequired: false, transformFunction: null }, endPlaceholder: { classPropertyName: "endPlaceholder", publicName: "endPlaceholder", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, required: { classPropertyName: "required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, dateFormat: { classPropertyName: "dateFormat", publicName: "dateFormat", isSignal: true, isRequired: false, transformFunction: null }, showClearButton: { classPropertyName: "showClearButton", publicName: "showClearButton", isSignal: true, isRequired: false, transformFunction: null }, showTodayButton: { classPropertyName: "showTodayButton", publicName: "showTodayButton", isSignal: true, isRequired: false, transformFunction: null }, showFooterClearButton: { classPropertyName: "showFooterClearButton", publicName: "showFooterClearButton", isSignal: true, isRequired: false, transformFunction: null }, keepOpen: { classPropertyName: "keepOpen", publicName: "keepOpen", isSignal: true, isRequired: false, transformFunction: null }, allowManualInput: { classPropertyName: "allowManualInput", publicName: "allowManualInput", isSignal: true, isRequired: false, transformFunction: null }, panelClass: { classPropertyName: "panelClass", publicName: "panelClass", isSignal: true, isRequired: false, transformFunction: null }, panelWidth: { classPropertyName: "panelWidth", publicName: "panelWidth", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, state: { classPropertyName: "state", publicName: "state", isSignal: true, isRequired: false, transformFunction: null }, userClass: { classPropertyName: "userClass", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, startAriaLabel: { classPropertyName: "startAriaLabel", publicName: "startAriaLabel", isSignal: true, isRequired: false, transformFunction: null }, endAriaLabel: { classPropertyName: "endAriaLabel", publicName: "endAriaLabel", isSignal: true, isRequired: false, transformFunction: null }, errorStateMatcher: { classPropertyName: "errorStateMatcher", publicName: "errorStateMatcher", isSignal: true, isRequired: false, transformFunction: null }, touched: { classPropertyName: "touched", publicName: "touched", isSignal: true, isRequired: false, transformFunction: null }, invalid: { classPropertyName: "invalid", publicName: "invalid", isSignal: true, isRequired: false, transformFunction: null }, sfErrors: { classPropertyName: "sfErrors", publicName: "errors", isSignal: true, isRequired: false, transformFunction: null }, showTimePicker: { classPropertyName: "showTimePicker", publicName: "showTimePicker", isSignal: true, isRequired: false, transformFunction: null }, use12HourFormat: { classPropertyName: "use12HourFormat", publicName: "use12HourFormat", isSignal: true, isRequired: false, transformFunction: null }, showSeconds: { classPropertyName: "showSeconds", publicName: "showSeconds", isSignal: true, isRequired: false, transformFunction: null }, minuteStep: { classPropertyName: "minuteStep", publicName: "minuteStep", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange", touched: "touchedChange", rangeChange: "rangeChange", opened: "opened", closed: "closed" }, host: { properties: { "class.com-date-range-picker-disabled": "disabled()", "class.com-date-range-picker-open": "isOpen()" }, classAttribute: "com-date-range-picker-host inline-block" }, providers: [
5768
6062
  RangeSelectionStrategy,
5769
6063
  { provide: CALENDAR_SELECTION_STRATEGY, useExisting: RangeSelectionStrategy },
6064
+ { provide: FormFieldControl, useExisting: forwardRef(() => ComDateRangePicker) },
5770
6065
  ], viewQueries: [{ propertyName: "triggerRef", first: true, predicate: ["triggerElement"], descendants: true, isSignal: true }, { propertyName: "startInputRef", first: true, predicate: ["startInputElement"], descendants: true, isSignal: true }, { propertyName: "endInputRef", first: true, predicate: ["endInputElement"], descendants: true, isSignal: true }, { propertyName: "panelTemplateRef", first: true, predicate: ["panelTemplate"], descendants: true, isSignal: true }], exportAs: ["comDateRangePicker"], ngImport: i0, template: `
5771
6066
  <!-- Trigger container -->
5772
6067
  <div
@@ -5790,7 +6085,8 @@ class ComDateRangePicker {
5790
6085
  [readonly]="!allowManualInput()"
5791
6086
  [attr.id]="startInputId()"
5792
6087
  [attr.aria-label]="startAriaLabel() || startPlaceholder()"
5793
- [attr.aria-invalid]="state() === 'error' || null"
6088
+ [attr.aria-describedby]="effectiveAriaDescribedBy() || null"
6089
+ [attr.aria-invalid]="effectiveState() === 'error' || null"
5794
6090
  [attr.aria-required]="required() || null"
5795
6091
  (focus)="onStartInputFocus()"
5796
6092
  (input)="onStartInputChange($event)"
@@ -5814,7 +6110,7 @@ class ComDateRangePicker {
5814
6110
  [readonly]="!allowManualInput()"
5815
6111
  [attr.id]="endInputId()"
5816
6112
  [attr.aria-label]="endAriaLabel() || endPlaceholder()"
5817
- [attr.aria-invalid]="state() === 'error' || null"
6113
+ [attr.aria-invalid]="effectiveState() === 'error' || null"
5818
6114
  (focus)="onEndInputFocus()"
5819
6115
  (input)="onEndInputChange($event)"
5820
6116
  (blur)="onEndInputBlur()"
@@ -5947,7 +6243,7 @@ class ComDateRangePicker {
5947
6243
  <div class="sr-only" aria-live="polite" aria-atomic="true">
5948
6244
  {{ liveAnnouncement() }}
5949
6245
  </div>
5950
- `, isInline: true, styles: [".sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}\n"], dependencies: [{ kind: "ngmodule", type: OverlayModule }, { kind: "ngmodule", type: A11yModule }, { kind: "directive", type: i1.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "component", type: ComCalendar, selector: "com-calendar", inputs: ["activeDate", "selected", "minDate", "maxDate", "dateFilter", "dateClass", "bordered", "startView", "firstDayOfWeek", "monthColumns", "cellTemplate"], outputs: ["selectedChange", "viewChanged", "activeDateChange"] }, { kind: "component", type: ComIcon, selector: "com-icon", inputs: ["name", "img", "color", "size", "strokeWidth", "absoluteStrokeWidth", "ariaLabel"] }, { kind: "component", type: ComTimePicker, selector: "com-time-picker", inputs: ["value", "disabled", "required", "showSeconds", "use12HourFormat", "minuteStep", "secondStep", "minTime", "maxTime", "variant", "size", "state", "ariaLabel", "class", "placeholder"], outputs: ["timeChange"], exportAs: ["comTimePicker"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
6246
+ `, isInline: true, styles: [".sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}\n"], dependencies: [{ kind: "ngmodule", type: OverlayModule }, { kind: "ngmodule", type: A11yModule }, { kind: "directive", type: i1.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "component", type: ComCalendar, selector: "com-calendar", inputs: ["activeDate", "selected", "minDate", "maxDate", "dateFilter", "dateClass", "bordered", "startView", "firstDayOfWeek", "monthColumns", "cellTemplate"], outputs: ["selectedChange", "viewChanged", "activeDateChange"] }, { kind: "component", type: ComIcon, selector: "com-icon", inputs: ["name", "img", "color", "size", "strokeWidth", "absoluteStrokeWidth", "ariaLabel"] }, { kind: "component", type: ComTimePicker, selector: "com-time-picker", inputs: ["value", "disabled", "required", "showSeconds", "use12HourFormat", "minuteStep", "secondStep", "minTime", "maxTime", "variant", "size", "state", "ariaLabel", "class", "placeholder", "errorStateMatcher", "touched", "invalid", "errors"], outputs: ["valueChange", "disabledChange", "touchedChange", "timeChange"], exportAs: ["comTimePicker"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
5951
6247
  }
5952
6248
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImport: i0, type: ComDateRangePicker, decorators: [{
5953
6249
  type: Component,
@@ -5974,7 +6270,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
5974
6270
  [readonly]="!allowManualInput()"
5975
6271
  [attr.id]="startInputId()"
5976
6272
  [attr.aria-label]="startAriaLabel() || startPlaceholder()"
5977
- [attr.aria-invalid]="state() === 'error' || null"
6273
+ [attr.aria-describedby]="effectiveAriaDescribedBy() || null"
6274
+ [attr.aria-invalid]="effectiveState() === 'error' || null"
5978
6275
  [attr.aria-required]="required() || null"
5979
6276
  (focus)="onStartInputFocus()"
5980
6277
  (input)="onStartInputChange($event)"
@@ -5998,7 +6295,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
5998
6295
  [readonly]="!allowManualInput()"
5999
6296
  [attr.id]="endInputId()"
6000
6297
  [attr.aria-label]="endAriaLabel() || endPlaceholder()"
6001
- [attr.aria-invalid]="state() === 'error' || null"
6298
+ [attr.aria-invalid]="effectiveState() === 'error' || null"
6002
6299
  (focus)="onEndInputFocus()"
6003
6300
  (input)="onEndInputChange($event)"
6004
6301
  (blur)="onEndInputBlur()"
@@ -6140,12 +6437,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.0", ngImpor
6140
6437
  ], providers: [
6141
6438
  RangeSelectionStrategy,
6142
6439
  { provide: CALENDAR_SELECTION_STRATEGY, useExisting: RangeSelectionStrategy },
6440
+ { provide: FormFieldControl, useExisting: forwardRef(() => ComDateRangePicker) },
6143
6441
  ], changeDetection: ChangeDetectionStrategy.OnPush, host: {
6144
6442
  class: 'com-date-range-picker-host inline-block',
6145
6443
  '[class.com-date-range-picker-disabled]': 'disabled()',
6146
6444
  '[class.com-date-range-picker-open]': 'isOpen()',
6147
6445
  }, styles: [".sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}\n"] }]
6148
- }], ctorParameters: () => [], propDecorators: { triggerRef: [{ type: i0.ViewChild, args: ['triggerElement', { isSignal: true }] }], startInputRef: [{ type: i0.ViewChild, args: ['startInputElement', { isSignal: true }] }], endInputRef: [{ type: i0.ViewChild, args: ['endInputElement', { isSignal: true }] }], panelTemplateRef: [{ type: i0.ViewChild, args: ['panelTemplate', { isSignal: true }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }], min: [{ type: i0.Input, args: [{ isSignal: true, alias: "min", required: false }] }], max: [{ type: i0.Input, args: [{ isSignal: true, alias: "max", required: false }] }], dateFilter: [{ type: i0.Input, args: [{ isSignal: true, alias: "dateFilter", required: false }] }], startAt: [{ type: i0.Input, args: [{ isSignal: true, alias: "startAt", required: false }] }], startView: [{ type: i0.Input, args: [{ isSignal: true, alias: "startView", required: false }] }], firstDayOfWeek: [{ type: i0.Input, args: [{ isSignal: true, alias: "firstDayOfWeek", required: false }] }], startPlaceholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "startPlaceholder", required: false }] }], endPlaceholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "endPlaceholder", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], required: [{ type: i0.Input, args: [{ isSignal: true, alias: "required", required: false }] }], dateFormat: [{ type: i0.Input, args: [{ isSignal: true, alias: "dateFormat", required: false }] }], showClearButton: [{ type: i0.Input, args: [{ isSignal: true, alias: "showClearButton", required: false }] }], showTodayButton: [{ type: i0.Input, args: [{ isSignal: true, alias: "showTodayButton", required: false }] }], showFooterClearButton: [{ type: i0.Input, args: [{ isSignal: true, alias: "showFooterClearButton", required: false }] }], keepOpen: [{ type: i0.Input, args: [{ isSignal: true, alias: "keepOpen", required: false }] }], allowManualInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "allowManualInput", required: false }] }], panelClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "panelClass", required: false }] }], panelWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "panelWidth", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], state: [{ type: i0.Input, args: [{ isSignal: true, alias: "state", required: false }] }], userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }], startAriaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "startAriaLabel", required: false }] }], endAriaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "endAriaLabel", required: false }] }], showTimePicker: [{ type: i0.Input, args: [{ isSignal: true, alias: "showTimePicker", required: false }] }], use12HourFormat: [{ type: i0.Input, args: [{ isSignal: true, alias: "use12HourFormat", required: false }] }], showSeconds: [{ type: i0.Input, args: [{ isSignal: true, alias: "showSeconds", required: false }] }], minuteStep: [{ type: i0.Input, args: [{ isSignal: true, alias: "minuteStep", required: false }] }], rangeChange: [{ type: i0.Output, args: ["rangeChange"] }], opened: [{ type: i0.Output, args: ["opened"] }], closed: [{ type: i0.Output, args: ["closed"] }] } });
6446
+ }], ctorParameters: () => [], propDecorators: { triggerRef: [{ type: i0.ViewChild, args: ['triggerElement', { isSignal: true }] }], startInputRef: [{ type: i0.ViewChild, args: ['startInputElement', { isSignal: true }] }], endInputRef: [{ type: i0.ViewChild, args: ['endInputElement', { isSignal: true }] }], panelTemplateRef: [{ type: i0.ViewChild, args: ['panelTemplate', { isSignal: true }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], min: [{ type: i0.Input, args: [{ isSignal: true, alias: "min", required: false }] }], max: [{ type: i0.Input, args: [{ isSignal: true, alias: "max", required: false }] }], dateFilter: [{ type: i0.Input, args: [{ isSignal: true, alias: "dateFilter", required: false }] }], startAt: [{ type: i0.Input, args: [{ isSignal: true, alias: "startAt", required: false }] }], startView: [{ type: i0.Input, args: [{ isSignal: true, alias: "startView", required: false }] }], firstDayOfWeek: [{ type: i0.Input, args: [{ isSignal: true, alias: "firstDayOfWeek", required: false }] }], startPlaceholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "startPlaceholder", required: false }] }], endPlaceholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "endPlaceholder", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], required: [{ type: i0.Input, args: [{ isSignal: true, alias: "required", required: false }] }], dateFormat: [{ type: i0.Input, args: [{ isSignal: true, alias: "dateFormat", required: false }] }], showClearButton: [{ type: i0.Input, args: [{ isSignal: true, alias: "showClearButton", required: false }] }], showTodayButton: [{ type: i0.Input, args: [{ isSignal: true, alias: "showTodayButton", required: false }] }], showFooterClearButton: [{ type: i0.Input, args: [{ isSignal: true, alias: "showFooterClearButton", required: false }] }], keepOpen: [{ type: i0.Input, args: [{ isSignal: true, alias: "keepOpen", required: false }] }], allowManualInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "allowManualInput", required: false }] }], panelClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "panelClass", required: false }] }], panelWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "panelWidth", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], state: [{ type: i0.Input, args: [{ isSignal: true, alias: "state", required: false }] }], userClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }], startAriaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "startAriaLabel", required: false }] }], endAriaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "endAriaLabel", required: false }] }], errorStateMatcher: [{ type: i0.Input, args: [{ isSignal: true, alias: "errorStateMatcher", required: false }] }], touched: [{ type: i0.Input, args: [{ isSignal: true, alias: "touched", required: false }] }, { type: i0.Output, args: ["touchedChange"] }], invalid: [{ type: i0.Input, args: [{ isSignal: true, alias: "invalid", required: false }] }], sfErrors: [{ type: i0.Input, args: [{ isSignal: true, alias: "errors", required: false }] }], showTimePicker: [{ type: i0.Input, args: [{ isSignal: true, alias: "showTimePicker", required: false }] }], use12HourFormat: [{ type: i0.Input, args: [{ isSignal: true, alias: "use12HourFormat", required: false }] }], showSeconds: [{ type: i0.Input, args: [{ isSignal: true, alias: "showSeconds", required: false }] }], minuteStep: [{ type: i0.Input, args: [{ isSignal: true, alias: "minuteStep", required: false }] }], rangeChange: [{ type: i0.Output, args: ["rangeChange"] }], opened: [{ type: i0.Output, args: ["opened"] }], closed: [{ type: i0.Output, args: ["closed"] }] } });
6149
6447
 
6150
6448
  /**
6151
6449
  * Datepicker components public API.