@cdevhub/ngx-tw 0.5.0 → 0.6.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/README.md +78 -15
- package/fesm2022/cdevhub-ngx-tw-accordion.mjs +16 -5
- package/fesm2022/cdevhub-ngx-tw-accordion.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-avatar.mjs +26 -15
- package/fesm2022/cdevhub-ngx-tw-avatar.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-badge.mjs +17 -5
- package/fesm2022/cdevhub-ngx-tw-badge.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-breadcrumbs.mjs +27 -6
- package/fesm2022/cdevhub-ngx-tw-breadcrumbs.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-button.mjs +23 -11
- package/fesm2022/cdevhub-ngx-tw-button.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-calendar-luxon.mjs +5 -5
- package/fesm2022/cdevhub-ngx-tw-calendar-luxon.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-calendar-testing.mjs +3 -3
- package/fesm2022/cdevhub-ngx-tw-calendar-testing.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-calendar.mjs +427 -122
- package/fesm2022/cdevhub-ngx-tw-calendar.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-card.mjs +21 -11
- package/fesm2022/cdevhub-ngx-tw-card.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-carousel.mjs +215 -96
- package/fesm2022/cdevhub-ngx-tw-carousel.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-checkbox.mjs +108 -64
- package/fesm2022/cdevhub-ngx-tw-checkbox.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-code-block.mjs +18 -6
- package/fesm2022/cdevhub-ngx-tw-code-block.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-collapsible.mjs +55 -30
- package/fesm2022/cdevhub-ngx-tw-collapsible.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-combobox-testing.mjs +218 -0
- package/fesm2022/cdevhub-ngx-tw-combobox-testing.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-combobox.mjs +236 -211
- package/fesm2022/cdevhub-ngx-tw-combobox.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-command-palette-testing.mjs +200 -0
- package/fesm2022/cdevhub-ngx-tw-command-palette-testing.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-command-palette.mjs +34 -7
- package/fesm2022/cdevhub-ngx-tw-command-palette.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-core.mjs +135 -15
- package/fesm2022/cdevhub-ngx-tw-core.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-date-picker-testing.mjs +203 -0
- package/fesm2022/cdevhub-ngx-tw-date-picker-testing.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-date-picker.mjs +160 -102
- package/fesm2022/cdevhub-ngx-tw-date-picker.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-date-range-picker-testing.mjs +209 -0
- package/fesm2022/cdevhub-ngx-tw-date-range-picker-testing.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-date-range-picker.mjs +182 -107
- package/fesm2022/cdevhub-ngx-tw-date-range-picker.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-dialog-testing.mjs +122 -0
- package/fesm2022/cdevhub-ngx-tw-dialog-testing.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-dialog.mjs +11 -2
- package/fesm2022/cdevhub-ngx-tw-dialog.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-empty-state.mjs +1 -1
- package/fesm2022/cdevhub-ngx-tw-empty-state.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-file-upload-testing.mjs +149 -0
- package/fesm2022/cdevhub-ngx-tw-file-upload-testing.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-file-upload.mjs +57 -67
- package/fesm2022/cdevhub-ngx-tw-file-upload.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-flip-card.mjs +42 -24
- package/fesm2022/cdevhub-ngx-tw-flip-card.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-form-field.mjs +114 -21
- package/fesm2022/cdevhub-ngx-tw-form-field.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-icon.mjs +16 -6
- package/fesm2022/cdevhub-ngx-tw-icon.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-input.mjs +52 -61
- package/fesm2022/cdevhub-ngx-tw-input.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-item.mjs +28 -4
- package/fesm2022/cdevhub-ngx-tw-item.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-menu-testing.mjs +168 -0
- package/fesm2022/cdevhub-ngx-tw-menu-testing.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-menu.mjs +58 -21
- package/fesm2022/cdevhub-ngx-tw-menu.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-number-input.mjs +34 -1
- package/fesm2022/cdevhub-ngx-tw-number-input.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-paginator.mjs +95 -45
- package/fesm2022/cdevhub-ngx-tw-paginator.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-popover.mjs +81 -32
- package/fesm2022/cdevhub-ngx-tw-popover.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-progress-bar.mjs +1 -1
- package/fesm2022/cdevhub-ngx-tw-progress-bar.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-radio.mjs +131 -98
- package/fesm2022/cdevhub-ngx-tw-radio.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-segmented-control.mjs +207 -42
- package/fesm2022/cdevhub-ngx-tw-segmented-control.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-select-testing.mjs +165 -0
- package/fesm2022/cdevhub-ngx-tw-select-testing.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-select.mjs +386 -210
- package/fesm2022/cdevhub-ngx-tw-select.mjs.map +1 -1
- package/fesm2022/{cdevhub-ngx-tw-sheet-sheet-renderer-ByyNluUd.mjs → cdevhub-ngx-tw-sheet-sheet-renderer-CqVJwgmp.mjs} +3 -3
- package/fesm2022/cdevhub-ngx-tw-sheet-sheet-renderer-CqVJwgmp.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-sheet-testing.mjs +129 -0
- package/fesm2022/cdevhub-ngx-tw-sheet-testing.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-sheet.mjs +23 -7
- package/fesm2022/cdevhub-ngx-tw-sheet.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-slider.mjs +89 -54
- package/fesm2022/cdevhub-ngx-tw-slider.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-sort.mjs +122 -17
- package/fesm2022/cdevhub-ngx-tw-sort.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-split.mjs +72 -19
- package/fesm2022/cdevhub-ngx-tw-split.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-stat.mjs +63 -25
- package/fesm2022/cdevhub-ngx-tw-stat.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-stepper.mjs +35 -8
- package/fesm2022/cdevhub-ngx-tw-stepper.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-switch.mjs +54 -48
- package/fesm2022/cdevhub-ngx-tw-switch.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-tab-nav.mjs +12 -15
- package/fesm2022/cdevhub-ngx-tw-tab-nav.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-table.mjs +74 -13
- package/fesm2022/cdevhub-ngx-tw-table.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-tabs.mjs +84 -30
- package/fesm2022/cdevhub-ngx-tw-tabs.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-tags-input-testing.mjs +172 -0
- package/fesm2022/cdevhub-ngx-tw-tags-input-testing.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-tags-input.mjs +107 -71
- package/fesm2022/cdevhub-ngx-tw-tags-input.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-textarea.mjs +41 -9
- package/fesm2022/cdevhub-ngx-tw-textarea.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-theme.mjs +257 -45
- package/fesm2022/cdevhub-ngx-tw-theme.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-time-picker-testing.mjs +201 -0
- package/fesm2022/cdevhub-ngx-tw-time-picker-testing.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-time-picker.mjs +184 -77
- package/fesm2022/cdevhub-ngx-tw-time-picker.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-timeline.mjs +110 -27
- package/fesm2022/cdevhub-ngx-tw-timeline.mjs.map +1 -1
- package/fesm2022/{cdevhub-ngx-tw-toast-toast-renderer-DSu4YoTy.mjs → cdevhub-ngx-tw-toast-toast-renderer-BlDxemsU.mjs} +107 -19
- package/fesm2022/cdevhub-ngx-tw-toast-toast-renderer-BlDxemsU.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-toast.mjs +21 -13
- package/fesm2022/cdevhub-ngx-tw-toast.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-tooltip.mjs +102 -15
- package/fesm2022/cdevhub-ngx-tw-tooltip.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-transfer-testing.mjs +219 -0
- package/fesm2022/cdevhub-ngx-tw-transfer-testing.mjs.map +1 -0
- package/fesm2022/cdevhub-ngx-tw-transfer.mjs +88 -69
- package/fesm2022/cdevhub-ngx-tw-transfer.mjs.map +1 -1
- package/fesm2022/cdevhub-ngx-tw-tree.mjs +68 -19
- package/fesm2022/cdevhub-ngx-tw-tree.mjs.map +1 -1
- package/index.json +1 -1
- package/package.json +63 -2
- package/theme/_base.css +13 -0
- package/theme/_dark.css +111 -36
- package/theme/_high-contrast-dark.css +367 -0
- package/theme/_high-contrast.css +13 -2
- package/theme/_light.css +332 -0
- package/theme/_semantic.css +60 -26
- package/theme/_typography.css +17 -0
- package/theme/index.css +86 -7
- package/types/cdevhub-ngx-tw-accordion.d.ts +12 -4
- package/types/cdevhub-ngx-tw-avatar.d.ts +10 -3
- package/types/cdevhub-ngx-tw-button.d.ts +1 -0
- package/types/cdevhub-ngx-tw-calendar-luxon.d.ts +2 -2
- package/types/cdevhub-ngx-tw-calendar-testing.d.ts +1 -1
- package/types/cdevhub-ngx-tw-calendar.d.ts +179 -73
- package/types/cdevhub-ngx-tw-card.d.ts +11 -3
- package/types/cdevhub-ngx-tw-carousel.d.ts +89 -20
- package/types/cdevhub-ngx-tw-checkbox.d.ts +40 -12
- package/types/cdevhub-ngx-tw-code-block.d.ts +11 -2
- package/types/cdevhub-ngx-tw-collapsible.d.ts +32 -5
- package/types/cdevhub-ngx-tw-combobox-testing.d.ts +157 -0
- package/types/cdevhub-ngx-tw-combobox.d.ts +94 -53
- package/types/cdevhub-ngx-tw-command-palette-testing.d.ts +136 -0
- package/types/cdevhub-ngx-tw-command-palette.d.ts +33 -5
- package/types/cdevhub-ngx-tw-core.d.ts +152 -21
- package/types/cdevhub-ngx-tw-date-picker-testing.d.ts +141 -0
- package/types/cdevhub-ngx-tw-date-picker.d.ts +37 -29
- package/types/cdevhub-ngx-tw-date-range-picker-testing.d.ts +148 -0
- package/types/cdevhub-ngx-tw-date-range-picker.d.ts +36 -29
- package/types/cdevhub-ngx-tw-dialog-testing.d.ts +98 -0
- package/types/cdevhub-ngx-tw-dialog.d.ts +12 -3
- package/types/cdevhub-ngx-tw-file-upload-testing.d.ts +120 -0
- package/types/cdevhub-ngx-tw-file-upload.d.ts +8 -10
- package/types/cdevhub-ngx-tw-flip-card.d.ts +18 -11
- package/types/cdevhub-ngx-tw-form-field.d.ts +19 -2
- package/types/cdevhub-ngx-tw-icon.d.ts +3 -3
- package/types/cdevhub-ngx-tw-input.d.ts +5 -8
- package/types/cdevhub-ngx-tw-item.d.ts +2 -0
- package/types/cdevhub-ngx-tw-menu-testing.d.ts +131 -0
- package/types/cdevhub-ngx-tw-menu.d.ts +2 -2
- package/types/cdevhub-ngx-tw-number-input.d.ts +20 -0
- package/types/cdevhub-ngx-tw-paginator.d.ts +58 -24
- package/types/cdevhub-ngx-tw-popover.d.ts +41 -10
- package/types/cdevhub-ngx-tw-progress-bar.d.ts +1 -1
- package/types/cdevhub-ngx-tw-radio.d.ts +68 -25
- package/types/cdevhub-ngx-tw-segmented-control.d.ts +79 -16
- package/types/cdevhub-ngx-tw-select-testing.d.ts +114 -0
- package/types/cdevhub-ngx-tw-select.d.ts +104 -33
- package/types/cdevhub-ngx-tw-sheet-testing.d.ts +104 -0
- package/types/cdevhub-ngx-tw-sheet.d.ts +19 -3
- package/types/cdevhub-ngx-tw-slider.d.ts +79 -25
- package/types/cdevhub-ngx-tw-sort.d.ts +45 -4
- package/types/cdevhub-ngx-tw-split.d.ts +32 -2
- package/types/cdevhub-ngx-tw-stat.d.ts +14 -4
- package/types/cdevhub-ngx-tw-stepper.d.ts +16 -2
- package/types/cdevhub-ngx-tw-switch.d.ts +35 -13
- package/types/cdevhub-ngx-tw-tab-nav.d.ts +7 -6
- package/types/cdevhub-ngx-tw-table.d.ts +53 -10
- package/types/cdevhub-ngx-tw-tabs.d.ts +41 -10
- package/types/cdevhub-ngx-tw-tags-input-testing.d.ts +135 -0
- package/types/cdevhub-ngx-tw-tags-input.d.ts +26 -11
- package/types/cdevhub-ngx-tw-textarea.d.ts +3 -2
- package/types/cdevhub-ngx-tw-theme.d.ts +245 -39
- package/types/cdevhub-ngx-tw-time-picker-testing.d.ts +129 -0
- package/types/cdevhub-ngx-tw-time-picker.d.ts +76 -19
- package/types/cdevhub-ngx-tw-timeline.d.ts +36 -12
- package/types/cdevhub-ngx-tw-toast.d.ts +20 -6
- package/types/cdevhub-ngx-tw-tooltip.d.ts +28 -6
- package/types/cdevhub-ngx-tw-transfer-testing.d.ts +152 -0
- package/types/cdevhub-ngx-tw-transfer.d.ts +21 -8
- package/types/cdevhub-ngx-tw-tree.d.ts +6 -1
- package/fesm2022/cdevhub-ngx-tw-sheet-sheet-renderer-ByyNluUd.mjs.map +0 -1
- package/fesm2022/cdevhub-ngx-tw-toast-toast-renderer-DSu4YoTy.mjs.map +0 -1
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
2
|
import { inject, ElementRef, viewChild, signal, computed, ChangeDetectionStrategy, Component, input, booleanAttribute, model, output, ViewContainerRef, Injector, DestroyRef, linkedSignal, effect, untracked, afterNextRender, isDevMode, forwardRef } from '@angular/core';
|
|
3
|
-
import {
|
|
3
|
+
import { NgControl, NG_VALIDATORS, NG_VALUE_ACCESSOR } from '@angular/forms';
|
|
4
4
|
import { Overlay } from '@angular/cdk/overlay';
|
|
5
5
|
import { FocusMonitor, LiveAnnouncer } from '@angular/cdk/a11y';
|
|
6
|
-
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
7
|
-
import { merge } from 'rxjs';
|
|
8
6
|
import { tv } from 'tailwind-variants';
|
|
9
|
-
import { PickerOverlayCoordinator,
|
|
7
|
+
import { PickerOverlayCoordinator, wireErrorState, timeOfDaySeconds, resolveSelectScrollStrategy, buildSelectLikePositions } from '@cdevhub/ngx-tw/core';
|
|
10
8
|
import { FormFieldControl, TW_FORM_FIELD, TW_FORM_FIELD_CONTROL } from '@cdevhub/ngx-tw/form-field';
|
|
11
9
|
import { CalendarComponent, provideSingleSelectionStrategy, DATE_ADAPTER, calendarValidator } from '@cdevhub/ngx-tw/calendar';
|
|
12
10
|
import { ButtonDirective } from '@cdevhub/ngx-tw/button';
|
|
@@ -285,7 +283,7 @@ class DatePickerOverlayComponent {
|
|
|
285
283
|
</div>
|
|
286
284
|
</div>
|
|
287
285
|
}
|
|
288
|
-
`, isInline: true, dependencies: [{ kind: "component", type: CalendarComponent, selector: "tw-calendar", inputs: ["mode", "value", "startAt", "minDate", "maxDate", "dateFilter", "disabledDates", "disabledDaysOfWeek", "constraints", "minRangeLength", "maxRangeLength", "maxSelections", "maxSelectionBehavior", "errorAriaDescribedBy", "rangeClickBehavior", "rangeBehavior", "dateClass", "bordered", "startView", "firstDayOfWeek", "monthColumns", "disabled", "readonly", "resetBehavior", "cellTemplate", "locale", "intl"], outputs: ["valueChange", "selectionStart", "rangePreview", "selectionComplete", "selectionRestart", "selectionCleared", "selectionLimitReached", "presetChange", "viewChange", "activeDateChange", "monthChange", "yearChange", "cellClick", "cellHover", "modeChange"] }, { kind: "component", type: TimePickerComponent, selector: "tw-time-picker", inputs: ["id", "disabled", "required", "readonly", "size", "color", "variant", "format", "showSeconds", "hourStep", "minuteStep", "secondStep", "minTime", "maxTime", "referenceDate", "placeholder", "showSteppers", "showClear", "clearLabel", "errorStateMatcher", "aria-label", "aria-labelledby", "aria-describedby", "value"], outputs: ["valueChange", "timeInput", "timeChange"] }, { kind: "directive", type: ButtonDirective, selector: "[twButton]", inputs: ["variant", "color", "size", "disabled", "loading"], exportAs: ["twButton"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
286
|
+
`, isInline: true, dependencies: [{ kind: "component", type: CalendarComponent, selector: "tw-calendar", inputs: ["mode", "value", "startAt", "minDate", "maxDate", "dateFilter", "disabledDates", "disabledDaysOfWeek", "constraints", "minRangeLength", "maxRangeLength", "maxSelections", "maxSelectionBehavior", "errorAriaDescribedBy", "aria-describedby", "rangeClickBehavior", "rangeBehavior", "dateClass", "bordered", "startView", "firstDayOfWeek", "monthColumns", "disabled", "readonly", "resetBehavior", "cellTemplate", "locale", "intl"], outputs: ["valueChange", "selectionStart", "rangePreview", "selectionComplete", "selectionRestart", "selectionCleared", "selectionLimitReached", "presetChange", "viewChange", "activeDateChange", "monthChange", "yearChange", "cellClick", "cellHover", "modeChange"] }, { kind: "component", type: TimePickerComponent, selector: "tw-time-picker", inputs: ["id", "disabled", "required", "readonly", "size", "color", "variant", "format", "showSeconds", "hourStep", "minuteStep", "secondStep", "minTime", "maxTime", "referenceDate", "placeholder", "showSteppers", "showClear", "clearLabel", "errorStateMatcher", "aria-label", "aria-labelledby", "aria-describedby", "value"], outputs: ["valueChange", "timeInput", "timeChange"] }, { kind: "directive", type: ButtonDirective, selector: "[twButton]", inputs: ["variant", "color", "size", "disabled", "loading"], exportAs: ["twButton"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
289
287
|
}
|
|
290
288
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: DatePickerOverlayComponent, decorators: [{
|
|
291
289
|
type: Component,
|
|
@@ -396,10 +394,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImpor
|
|
|
396
394
|
const datePickerVariants = tv({
|
|
397
395
|
slots: {
|
|
398
396
|
root: 'relative inline-flex items-center w-full text-fg transition-[color,border-color,box-shadow] duration-normal motion-reduce:transition-none',
|
|
399
|
-
|
|
397
|
+
// `self-stretch` so the text field fills the pinned control height — without
|
|
398
|
+
// it the input is only its line box tall and the rest of the box is dead
|
|
399
|
+
// click area (up to 22px at xl).
|
|
400
|
+
input: 'flex-1 min-w-0 self-stretch bg-transparent text-fg placeholder:text-fg-subtle outline-none border-0 p-0 m-0 font-inherit',
|
|
400
401
|
triggerButton: 'inline-flex items-center justify-center shrink-0 rounded-md text-fg-muted hover:text-fg hover:bg-surface-muted transition-colors duration-normal motion-reduce:transition-none focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-500',
|
|
401
402
|
triggerIcon: 'shrink-0',
|
|
402
403
|
// size-6 (24×24 CSS px) is the WCAG AA minimum interactive target — bumping past size-5 keeps the affordance hittable without growing the inline row.
|
|
404
|
+
// Held flat across every size: it fits the 30/34/42/46px content boxes at sm..xl, and at xs it
|
|
405
|
+
// coincides with the root's border-box for the reason spelled out on `triggerButton` below.
|
|
403
406
|
clearButton: 'inline-flex items-center justify-center shrink-0 rounded-md text-fg-muted hover:text-fg hover:bg-surface-muted transition-colors duration-normal motion-reduce:transition-none size-6 focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary-500',
|
|
404
407
|
},
|
|
405
408
|
variants: {
|
|
@@ -407,6 +410,13 @@ const datePickerVariants = tv({
|
|
|
407
410
|
xs: {
|
|
408
411
|
root: 'gap-1 text-xs',
|
|
409
412
|
input: 'text-xs',
|
|
413
|
+
// At xs the pinned root is h-6 (24px border-box), so its content box is
|
|
414
|
+
// only 22px. size-6 is kept anyway: 24×24 is the WCAG 2.2 SC 2.5.8
|
|
415
|
+
// floor and docs/vertical-rhythm.md calls it non-negotiable. The button
|
|
416
|
+
// therefore coincides with the root's *border*-box, overlapping the 1px
|
|
417
|
+
// border row top and bottom. The root's height is unaffected (h-6 is a
|
|
418
|
+
// definite height) and the only visible effect is the hover fill
|
|
419
|
+
// meeting the border at the densest size.
|
|
410
420
|
triggerButton: 'size-6',
|
|
411
421
|
// size-3.5 (14px) is the codified half-step for xs-density chevrons — size-3 (12px) looks pinched next to text-xs and size-4 (16px) crowds the 24px trigger.
|
|
412
422
|
triggerIcon: 'size-3.5',
|
|
@@ -439,12 +449,19 @@ const datePickerVariants = tv({
|
|
|
439
449
|
},
|
|
440
450
|
variant: {
|
|
441
451
|
default: {
|
|
442
|
-
|
|
452
|
+
// No `py-*`: the height is pinned per size in compoundVariants below.
|
|
453
|
+
// See docs/vertical-rhythm.md §3 — padding and a pinned height fight,
|
|
454
|
+
// and under border-box the taller one silently wins.
|
|
455
|
+
root: 'rounded-md border border-border bg-surface px-3 hover:border-border-strong',
|
|
443
456
|
},
|
|
444
457
|
naked: {
|
|
445
458
|
root: 'bg-transparent border-0 rounded-none p-0 focus-within:outline-none',
|
|
446
459
|
},
|
|
447
460
|
},
|
|
461
|
+
// True when a `[slot=trigger]` element is projected. The projected content
|
|
462
|
+
// then owns its own height (it can be a lg button, a card, a badge row),
|
|
463
|
+
// so the pinned control height must not apply.
|
|
464
|
+
customTrigger: { true: {}, false: {} },
|
|
448
465
|
open: { true: { triggerButton: 'bg-surface-muted text-fg' }, false: {} },
|
|
449
466
|
disabled: {
|
|
450
467
|
true: { root: 'opacity-50 pointer-events-none cursor-not-allowed' },
|
|
@@ -464,6 +481,21 @@ const datePickerVariants = tv({
|
|
|
464
481
|
},
|
|
465
482
|
},
|
|
466
483
|
compoundVariants: [
|
|
484
|
+
// ── Pinned control height (docs/vertical-rhythm.md §1) ──
|
|
485
|
+
// Only the `default` variant carries a height. `naked` means somebody else
|
|
486
|
+
// owns the box — either `<tw-form-field>` (which auto-nakeds this picker and
|
|
487
|
+
// supplies its own bordered, padded controlWrapper) or the calendar overlay
|
|
488
|
+
// footer. Pinning naked would stack 36px on top of the form-field's own
|
|
489
|
+
// `py-2`, inflating a wrapped picker from 38px to 54px at md.
|
|
490
|
+
{ variant: 'default', customTrigger: false, size: 'xs', class: { root: 'h-6' } },
|
|
491
|
+
{ variant: 'default', customTrigger: false, size: 'sm', class: { root: 'h-8' } },
|
|
492
|
+
{ variant: 'default', customTrigger: false, size: 'md', class: { root: 'h-9' } },
|
|
493
|
+
{ variant: 'default', customTrigger: false, size: 'lg', class: { root: 'h-11' } },
|
|
494
|
+
{ variant: 'default', customTrigger: false, size: 'xl', class: { root: 'h-12' } },
|
|
495
|
+
// …and the projected-trigger path keeps the vertical padding the pinned
|
|
496
|
+
// sizes drop, so a rich trigger still sits inset from the shell's border
|
|
497
|
+
// exactly as it did before the height migration.
|
|
498
|
+
{ variant: 'default', customTrigger: true, class: { root: 'py-2' } },
|
|
467
499
|
// Default variant — focused border per color
|
|
468
500
|
{ variant: 'default', focused: true, color: 'primary', class: { root: 'border-primary-500' } },
|
|
469
501
|
{ variant: 'default', focused: true, color: 'secondary', class: { root: 'border-secondary-500' } },
|
|
@@ -479,6 +511,7 @@ const datePickerVariants = tv({
|
|
|
479
511
|
defaultVariants: {
|
|
480
512
|
size: 'md',
|
|
481
513
|
variant: 'default',
|
|
514
|
+
customTrigger: false,
|
|
482
515
|
open: false,
|
|
483
516
|
disabled: false,
|
|
484
517
|
errorState: false,
|
|
@@ -511,13 +544,13 @@ class DatePickerComponent extends FormFieldControl {
|
|
|
511
544
|
/** Maximum selectable date. Typed input later than this commits the value and marks the bound control invalid with `calendarMaxDate`; the calendar disables the cell. Defaults to `null`. */
|
|
512
545
|
maxDate = input(null, /* @ts-ignore */
|
|
513
546
|
...(ngDevMode ? [{ debugName: "maxDate" }] : /* istanbul ignore next */ []));
|
|
514
|
-
/** Per-date predicate — return `false` to disable. Applied in the calendar, the text-parse path, and the `calendarDisabledDate` validation error. */
|
|
547
|
+
/** Per-date predicate — return `false` to disable. Applied in the calendar, the text-parse path, and the `calendarDisabledDate` validation error. Defaults to `null`. */
|
|
515
548
|
dateFilter = input(null, /* @ts-ignore */
|
|
516
549
|
...(ngDevMode ? [{ debugName: "dateFilter" }] : /* istanbul ignore next */ []));
|
|
517
550
|
/** Which calendar view opens first — `'day'`, `'month'`, or `'year'`. Defaults to `'day'`. */
|
|
518
551
|
startView = input('day', /* @ts-ignore */
|
|
519
552
|
...(ngDevMode ? [{ debugName: "startView" }] : /* istanbul ignore next */ []));
|
|
520
|
-
/** Date to focus when the calendar opens with no selection. Falls back to today. */
|
|
553
|
+
/** Date to focus when the calendar opens with no selection. Falls back to today. Defaults to `null`. */
|
|
521
554
|
startAt = input(null, /* @ts-ignore */
|
|
522
555
|
...(ngDevMode ? [{ debugName: "startAt" }] : /* istanbul ignore next */ []));
|
|
523
556
|
/** Display format passed to `DateAdapter.format()`. With the default adapter, accepts `{ dateTimeFormat: Intl.DateTimeFormatOptions }`. When `withTime` is true and this is left at the default, hour/minute (and optional seconds) are folded in automatically. */
|
|
@@ -526,7 +559,7 @@ class DatePickerComponent extends FormFieldControl {
|
|
|
526
559
|
/** Optional format hint passed to `DateAdapter.parse()`. Ignored by the native adapter. */
|
|
527
560
|
parseFormat = input(undefined, /* @ts-ignore */
|
|
528
561
|
...(ngDevMode ? [{ debugName: "parseFormat" }] : /* istanbul ignore next */ []));
|
|
529
|
-
/** Placeholder text shown in the input when no value is entered. */
|
|
562
|
+
/** Placeholder text shown in the input when no value is entered. Defaults to `undefined`. */
|
|
530
563
|
placeholder = input(undefined, /* @ts-ignore */
|
|
531
564
|
...(ngDevMode ? [{ debugName: "placeholder" }] : /* istanbul ignore next */ []));
|
|
532
565
|
/** When true, the input is disabled, the trigger cannot open the calendar, and `aria-disabled="true"` is set. Defaults to `false`. */
|
|
@@ -535,7 +568,7 @@ class DatePickerComponent extends FormFieldControl {
|
|
|
535
568
|
/** When true, exposes `aria-required="true"`. Validators.required on a bound NgControl is also honoured. Defaults to `false`. */
|
|
536
569
|
requiredInput = input(false, { ...(ngDevMode ? { debugName: "requiredInput" } : /* istanbul ignore next */ {}), alias: 'required',
|
|
537
570
|
transform: booleanAttribute });
|
|
538
|
-
/** When true, blocks typing but still allows picking via the calendar trigger. Defaults to `false`. */
|
|
571
|
+
/** When true, blocks typing but still allows picking via the calendar trigger. Defaults to `false`. Alias: `readonly`. */
|
|
539
572
|
readonlyInput = input(false, { ...(ngDevMode ? { debugName: "readonlyInput" } : /* istanbul ignore next */ {}), alias: 'readonly',
|
|
540
573
|
transform: booleanAttribute });
|
|
541
574
|
/** Trigger padding, font size, and calendar cell density. Defaults to `'md'`. */
|
|
@@ -547,29 +580,28 @@ class DatePickerComponent extends FormFieldControl {
|
|
|
547
580
|
/** Visual style of the trigger. `'default'` draws its own border; `'naked'` strips chrome. Auto-resolves to `'naked'` when inside `<tw-form-field>`. */
|
|
548
581
|
variant = input(undefined, /* @ts-ignore */
|
|
549
582
|
...(ngDevMode ? [{ debugName: "variant" }] : /* istanbul ignore next */ []));
|
|
550
|
-
/** Whether to show a clear-button affordance inside the trigger when a value is set. Defaults to `true
|
|
551
|
-
// TRUE-default: a picker without a clear affordance forces consumers to wire one — most form pickers expect the inline clear, matching `<tw-input>`'s clear button.
|
|
583
|
+
/** Whether to show a clear-button affordance inside the trigger when a value is set. Defaults to `true` — most form pickers expect the inline clear, matching `<tw-input>`'s clear button; without it consumers must wire one themselves. */
|
|
552
584
|
showClear = input(true, /* @ts-ignore */
|
|
553
585
|
...(ngDevMode ? [{ debugName: "showClear" }] : /* istanbul ignore next */ []));
|
|
554
586
|
/** When true, renders a `Today / Clear / Cancel / Apply` action bar at the bottom of the overlay. Defaults to `false`. */
|
|
555
587
|
showActions = input(false, /* @ts-ignore */
|
|
556
588
|
...(ngDevMode ? [{ debugName: "showActions" }] : /* istanbul ignore next */ []));
|
|
557
|
-
/** Label for the `Today` action in the overlay's action bar. */
|
|
589
|
+
/** Label for the `Today` action in the overlay's action bar. Defaults to `'Today'`. */
|
|
558
590
|
todayLabel = input('Today', /* @ts-ignore */
|
|
559
591
|
...(ngDevMode ? [{ debugName: "todayLabel" }] : /* istanbul ignore next */ []));
|
|
560
|
-
/** Label for the `Clear` action in the overlay's action bar. */
|
|
592
|
+
/** Label for the `Clear` action in the overlay's action bar. Defaults to `'Clear'`. */
|
|
561
593
|
clearLabel = input('Clear', /* @ts-ignore */
|
|
562
594
|
...(ngDevMode ? [{ debugName: "clearLabel" }] : /* istanbul ignore next */ []));
|
|
563
|
-
/** Label for the `Cancel` action in the overlay's action bar. */
|
|
595
|
+
/** Label for the `Cancel` action in the overlay's action bar. Defaults to `'Cancel'`. */
|
|
564
596
|
cancelLabel = input('Cancel', /* @ts-ignore */
|
|
565
597
|
...(ngDevMode ? [{ debugName: "cancelLabel" }] : /* istanbul ignore next */ []));
|
|
566
|
-
/** Label for the `Apply` action in the overlay's action bar. */
|
|
598
|
+
/** Label for the `Apply` action in the overlay's action bar. Defaults to `'Apply'`. */
|
|
567
599
|
applyLabel = input('Apply', /* @ts-ignore */
|
|
568
600
|
...(ngDevMode ? [{ debugName: "applyLabel" }] : /* istanbul ignore next */ []));
|
|
569
601
|
/** When true, focusing the text input opens the overlay. Defaults to `false`. */
|
|
570
602
|
openOnFocus = input(false, /* @ts-ignore */
|
|
571
603
|
...(ngDevMode ? [{ debugName: "openOnFocus" }] : /* istanbul ignore next */ []));
|
|
572
|
-
/** Extra class(es) applied to the overlay panel element. */
|
|
604
|
+
/** Extra class(es) applied to the overlay panel element. Defaults to an empty string. */
|
|
573
605
|
panelClass = input('', /* @ts-ignore */
|
|
574
606
|
...(ngDevMode ? [{ debugName: "panelClass" }] : /* istanbul ignore next */ []));
|
|
575
607
|
/** CDK scroll strategy for the overlay. Defaults to `'reposition'`. */
|
|
@@ -581,6 +613,9 @@ class DatePickerComponent extends FormFieldControl {
|
|
|
581
613
|
/** Accessible name for the calendar trigger button. Defaults to `'Open calendar'`. */
|
|
582
614
|
triggerAriaLabel = input('Open calendar', /* @ts-ignore */
|
|
583
615
|
...(ngDevMode ? [{ debugName: "triggerAriaLabel" }] : /* istanbul ignore next */ []));
|
|
616
|
+
/** Accessible name for the inline clear button shown when a value is set. Mirrors `tw-date-range-picker`'s input of the same name; distinct from `clearLabel`, which is the overlay action bar's visible button text. Defaults to `'Clear date'`. */
|
|
617
|
+
clearAriaLabel = input('Clear date', /* @ts-ignore */
|
|
618
|
+
...(ngDevMode ? [{ debugName: "clearAriaLabel" }] : /* istanbul ignore next */ []));
|
|
584
619
|
/**
|
|
585
620
|
* Bundles the time-of-day configuration. Passing a non-null object turns on the embedded `<tw-time-picker>` and forwards each field.
|
|
586
621
|
*
|
|
@@ -588,32 +623,32 @@ class DatePickerComponent extends FormFieldControl {
|
|
|
588
623
|
*/
|
|
589
624
|
timeConfig = input(null, /* @ts-ignore */
|
|
590
625
|
...(ngDevMode ? [{ debugName: "timeConfig" }] : /* istanbul ignore next */ []));
|
|
591
|
-
/** Per-instance locale override. Forwarded to the embedded calendar and the underlying `DateAdapter` for parse/format. Falls back to Angular `LOCALE_ID` when `null`. */
|
|
626
|
+
/** Per-instance locale override. Forwarded to the embedded calendar and the underlying `DateAdapter` for parse/format. Falls back to Angular `LOCALE_ID` when `null`. Defaults to `null`. */
|
|
592
627
|
locale = input(null, /* @ts-ignore */
|
|
593
628
|
...(ngDevMode ? [{ debugName: "locale" }] : /* istanbul ignore next */ []));
|
|
594
|
-
/** Function producing per-cell CSS classes, forwarded to the embedded calendar. Useful for visually marking special dates (holidays, billing cycles). */
|
|
629
|
+
/** Function producing per-cell CSS classes, forwarded to the embedded calendar. Useful for visually marking special dates (holidays, billing cycles). Defaults to `null`. */
|
|
595
630
|
dateClass = input(null, /* @ts-ignore */
|
|
596
631
|
...(ngDevMode ? [{ debugName: "dateClass" }] : /* istanbul ignore next */ []));
|
|
597
|
-
/** Optional cell-content template, forwarded to the embedded calendar. Use to customize cell visuals beyond `dateClass`. */
|
|
632
|
+
/** Optional cell-content template, forwarded to the embedded calendar. Use to customize cell visuals beyond `dateClass`. Defaults to `null`. */
|
|
598
633
|
cellTemplate = input(null, /* @ts-ignore */
|
|
599
634
|
...(ngDevMode ? [{ debugName: "cellTemplate" }] : /* istanbul ignore next */ []));
|
|
600
|
-
/** Optional quick-select presets rendered as a vertical list before the calendar. Each preset provides a `label` and a `date` factory. An empty array hides the preset panel. */
|
|
635
|
+
/** Optional quick-select presets rendered as a vertical list before the calendar. Each preset provides a `label` and a `date` factory. An empty array hides the preset panel. Defaults to an empty array. */
|
|
601
636
|
presets = input([], /* @ts-ignore */
|
|
602
637
|
...(ngDevMode ? [{ debugName: "presets" }] : /* istanbul ignore next */ []));
|
|
603
|
-
/** Per-instance override of the `ErrorStateMatcher`. */
|
|
638
|
+
/** Per-instance override of the `ErrorStateMatcher`. Defaults to `undefined`. */
|
|
604
639
|
errorStateMatcher = input(undefined, /* @ts-ignore */
|
|
605
640
|
...(ngDevMode ? [{ debugName: "errorStateMatcher" }] : /* istanbul ignore next */ []));
|
|
606
|
-
/** Accessible name for the input. Required when no visible label is supplied. Alias: `aria-label`. */
|
|
641
|
+
/** Accessible name for the input. Required when no visible label is supplied. Alias: `aria-label`. Defaults to `undefined`. */
|
|
607
642
|
ariaLabel = input(undefined, { ...(ngDevMode ? { debugName: "ariaLabel" } : /* istanbul ignore next */ {}), alias: 'aria-label' });
|
|
608
|
-
/** ID of an external element that labels the input. Alias: `aria-labelledby`. */
|
|
643
|
+
/** ID of an external element that labels the input. Alias: `aria-labelledby`. Defaults to `undefined`. */
|
|
609
644
|
ariaLabelledby = input(undefined, { ...(ngDevMode ? { debugName: "ariaLabelledby" } : /* istanbul ignore next */ {}), alias: 'aria-labelledby' });
|
|
610
|
-
/** Consumer-supplied `aria-describedby` ids. The form-field preserves these when merging hint/error ids. Alias: `aria-describedby`. */
|
|
645
|
+
/** Consumer-supplied `aria-describedby` ids. The form-field preserves these when merging hint/error ids. Alias: `aria-describedby`. Defaults to `undefined`. */
|
|
611
646
|
userAriaDescribedByInput = input(undefined, { ...(ngDevMode ? { debugName: "userAriaDescribedByInput" } : /* istanbul ignore next */ {}), alias: 'aria-describedby' });
|
|
612
647
|
// ── Models (two-way) ──
|
|
613
|
-
/** Two-way bound selected date. `null` when no selection. Setting programmatically updates the display; does NOT trigger `onChange`. */
|
|
648
|
+
/** Two-way bound selected date. `null` when no selection. Setting programmatically updates the display; does NOT trigger `onChange`. Defaults to `null`. */
|
|
614
649
|
value = model(null, /* @ts-ignore */
|
|
615
650
|
...(ngDevMode ? [{ debugName: "value" }] : /* istanbul ignore next */ []));
|
|
616
|
-
/** Two-way bound open state of the calendar overlay. */
|
|
651
|
+
/** Two-way bound open state of the calendar overlay. Defaults to `false`. */
|
|
617
652
|
open = model(false, /* @ts-ignore */
|
|
618
653
|
...(ngDevMode ? [{ debugName: "open" }] : /* istanbul ignore next */ []));
|
|
619
654
|
// ── Outputs ──
|
|
@@ -644,9 +679,6 @@ class DatePickerComponent extends FormFieldControl {
|
|
|
644
679
|
// back into this instance while it is still being created. Mirrors
|
|
645
680
|
// `date-range-picker.ts` and `calendar.ts`.
|
|
646
681
|
ngControl = null;
|
|
647
|
-
parentForm = inject(NgForm, { optional: true });
|
|
648
|
-
parentFormGroup = inject(FormGroupDirective, { optional: true });
|
|
649
|
-
defaultMatcher = inject(TW_ERROR_STATE_MATCHER);
|
|
650
682
|
// ── View refs ──
|
|
651
683
|
inputRef = viewChild.required('dateInput', /* @ts-ignore */
|
|
652
684
|
...(ngDevMode ? [{ debugName: "inputRef" }] : /* istanbul ignore next */ []));
|
|
@@ -706,30 +738,42 @@ class DatePickerComponent extends FormFieldControl {
|
|
|
706
738
|
...(ngDevMode ? [{ debugName: "cvaDisabled" }] : /* istanbul ignore next */ []));
|
|
707
739
|
describedByIdsSignal = signal([], /* @ts-ignore */
|
|
708
740
|
...(ngDevMode ? [{ debugName: "describedByIdsSignal" }] : /* istanbul ignore next */ []));
|
|
709
|
-
closingSignal = signal(false, /* @ts-ignore */
|
|
710
|
-
...(ngDevMode ? [{ debugName: "closingSignal" }] : /* istanbul ignore next */ []));
|
|
711
741
|
lastValueBeforeOpen = signal(null, /* @ts-ignore */
|
|
712
742
|
...(ngDevMode ? [{ debugName: "lastValueBeforeOpen" }] : /* istanbul ignore next */ []));
|
|
713
743
|
pendingCalendarValue = signal(null, /* @ts-ignore */
|
|
714
744
|
...(ngDevMode ? [{ debugName: "pendingCalendarValue" }] : /* istanbul ignore next */ []));
|
|
715
745
|
activePresetIdSignal = signal(undefined, /* @ts-ignore */
|
|
716
746
|
...(ngDevMode ? [{ debugName: "activePresetIdSignal" }] : /* istanbul ignore next */ []));
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
747
|
+
/** @internal Shared `errorState` / `required` / `errors` derivation — see `wireErrorState`. */
|
|
748
|
+
errorWiring = wireErrorState({
|
|
749
|
+
ngControl: () => this.ngControl,
|
|
750
|
+
matcher: () => this.errorStateMatcher(),
|
|
751
|
+
required: () => this.requiredInput(),
|
|
752
|
+
track: [() => this.focusedSignal()],
|
|
753
|
+
// An unparseable entry or an out-of-range date is an error regardless of validator status.
|
|
754
|
+
errorStateOverride: () => (this.parseError() || this.rangeError() ? true : undefined),
|
|
755
|
+
});
|
|
721
756
|
onChange = () => { };
|
|
722
757
|
onTouched = () => { };
|
|
723
|
-
|
|
724
|
-
|
|
758
|
+
// Overlay lifecycle bookkeeping. Both are PLAIN FIELDS, not signals, and that
|
|
759
|
+
// is load-bearing: the lifecycle effect in the constructor both reads and
|
|
760
|
+
// writes them, so as signals they would form a read → write → re-trigger
|
|
761
|
+
// cycle of exactly the shape CLAUDE.md forbids. Demoting them is the fix
|
|
762
|
+
// `popover.ts` and `command-palette.ts` already use — see the comment on that
|
|
763
|
+
// effect. Do not promote either back to `signal()`.
|
|
764
|
+
overlayInstance = null;
|
|
765
|
+
closing = false;
|
|
725
766
|
returnFocusTo = null;
|
|
726
|
-
|
|
727
|
-
|
|
728
|
-
|
|
767
|
+
// The one piece of overlay state that must stay a signal: it is the *only*
|
|
768
|
+
// dependency that re-runs the overlay state-push effect when the panel
|
|
769
|
+
// attaches. Written here (openOverlay / closeOverlay), never read by the
|
|
770
|
+
// lifecycle effect, so it cannot cycle. Mirrors `command-palette.ts`.
|
|
771
|
+
isAttached = signal(false, /* @ts-ignore */
|
|
772
|
+
...(ngDevMode ? [{ debugName: "isAttached" }] : /* istanbul ignore next */ []));
|
|
729
773
|
// ── Derived state ──
|
|
730
774
|
/** @internal */
|
|
731
775
|
isDisabled = computed(() => {
|
|
732
|
-
this.
|
|
776
|
+
this.errorWiring.rev();
|
|
733
777
|
return this.disabledInput() || this.cvaDisabled() || !!this.ngControl?.disabled;
|
|
734
778
|
}, /* @ts-ignore */
|
|
735
779
|
...(ngDevMode ? [{ debugName: "isDisabled" }] : /* istanbul ignore next */ []));
|
|
@@ -794,6 +838,7 @@ class DatePickerComponent extends FormFieldControl {
|
|
|
794
838
|
variantResult = computed(() => datePickerVariants({
|
|
795
839
|
size: this.size(),
|
|
796
840
|
variant: this.resolvedVariant(),
|
|
841
|
+
customTrigger: this.hasCustomTrigger(),
|
|
797
842
|
open: this.open(),
|
|
798
843
|
disabled: this.isDisabled(),
|
|
799
844
|
errorState: this.errorState(),
|
|
@@ -827,26 +872,18 @@ class DatePickerComponent extends FormFieldControl {
|
|
|
827
872
|
/** @internal */
|
|
828
873
|
disabled = this.isDisabled;
|
|
829
874
|
/** @internal */
|
|
830
|
-
required =
|
|
831
|
-
this._ngControlRev();
|
|
832
|
-
if (this.requiredInput())
|
|
833
|
-
return true;
|
|
834
|
-
return !!this.ngControl?.control?.hasValidator(Validators.required);
|
|
835
|
-
}, /* @ts-ignore */
|
|
836
|
-
...(ngDevMode ? [{ debugName: "required" }] : /* istanbul ignore next */ []));
|
|
875
|
+
required = this.errorWiring.required;
|
|
837
876
|
/** @internal */
|
|
838
|
-
errorState =
|
|
839
|
-
|
|
840
|
-
|
|
841
|
-
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
}, /* @ts-ignore */
|
|
849
|
-
...(ngDevMode ? [{ debugName: "errorState" }] : /* istanbul ignore next */ []));
|
|
877
|
+
errorState = this.errorWiring.errorState;
|
|
878
|
+
/**
|
|
879
|
+
* @internal Active validation errors map from the bound `NgControl` (or `null` when the
|
|
880
|
+
* control reports none / is unbound). This is what `[twError match="…"]` filters on inside a
|
|
881
|
+
* `<tw-form-field>`; without it every `match`-targeted message — including the
|
|
882
|
+
* `calendarMinDate` / `calendarMaxDate` / `calendarDisabledDate` / `calendarInvalidValue`
|
|
883
|
+
* codes this component's `NG_VALIDATORS` apparatus exists to produce — stays permanently
|
|
884
|
+
* hidden. (Authoritative key list: `CalendarValidationErrors` in `calendar.types.ts`.)
|
|
885
|
+
*/
|
|
886
|
+
errors = this.errorWiring.errors;
|
|
850
887
|
/** @internal */
|
|
851
888
|
controlType = 'date-picker';
|
|
852
889
|
/** @internal */
|
|
@@ -887,24 +924,54 @@ class DatePickerComponent extends FormFieldControl {
|
|
|
887
924
|
});
|
|
888
925
|
});
|
|
889
926
|
// Mirror the `open` model into the overlay lifecycle.
|
|
927
|
+
//
|
|
928
|
+
// The only tracked reads here are `open()` and `isDisabled()`. Everything
|
|
929
|
+
// this effect *writes* — `overlayInstance`, `closing` — is a plain field,
|
|
930
|
+
// never a signal, so opening or closing cannot re-trigger the effect that
|
|
931
|
+
// ordered it. That is the whole reason those two are declared as fields
|
|
932
|
+
// (see their declaration); promoting either back to `signal()` recreates
|
|
933
|
+
// the read → write → re-trigger cycle CLAUDE.md forbids.
|
|
934
|
+
//
|
|
935
|
+
// `openOverlay()` / `closeOverlay()` do write `isAttached`, but this effect
|
|
936
|
+
// never reads it, so that write is a one-way hand-off to the state-push
|
|
937
|
+
// effect below and terminates there.
|
|
938
|
+
//
|
|
939
|
+
// The body is wrapped in `untracked()` because demoting the two fields is
|
|
940
|
+
// NOT sufficient on its own. `openOverlay()` reads roughly twenty-five
|
|
941
|
+
// inputs while pushing them into the freshly attached panel, and it writes
|
|
942
|
+
// two signals it then reads straight back. Called from the tracked phase,
|
|
943
|
+
// every one of those reads becomes a dependency of THIS effect, which both
|
|
944
|
+
// recreates the forbidden write-then-read-back shape and re-runs the whole
|
|
945
|
+
// lifecycle on any of those twenty-five inputs changing. Tracked reads are
|
|
946
|
+
// now exactly `open()` and `isDisabled()`, which is what the paragraph
|
|
947
|
+
// above claims — and only now true.
|
|
890
948
|
effect(() => {
|
|
891
949
|
const shouldOpen = this.open();
|
|
892
950
|
const disabled = this.isDisabled();
|
|
893
|
-
|
|
894
|
-
this.
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
this.
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
this.
|
|
902
|
-
|
|
951
|
+
untracked(() => {
|
|
952
|
+
if (disabled && this.overlayInstance) {
|
|
953
|
+
this.closeOverlay('programmatic');
|
|
954
|
+
return;
|
|
955
|
+
}
|
|
956
|
+
if (shouldOpen && !this.overlayInstance && !disabled && !this.closing) {
|
|
957
|
+
this.openOverlay();
|
|
958
|
+
}
|
|
959
|
+
else if (!shouldOpen && this.overlayInstance && !this.closing) {
|
|
960
|
+
this.closeOverlay('programmatic');
|
|
961
|
+
}
|
|
962
|
+
});
|
|
903
963
|
});
|
|
904
964
|
// Push state into the overlay whenever anything relevant changes.
|
|
905
965
|
// Reads happen in the tracked phase; writes to the overlay instance are
|
|
906
966
|
// wrapped in `untracked()` so they never feed back into this effect.
|
|
967
|
+
//
|
|
968
|
+
// `isAttached()` MUST be read first and unconditionally: it is this
|
|
969
|
+
// effect's only dependency on the overlay's existence, so it is what makes
|
|
970
|
+
// the initial push happen when the panel attaches (`overlayInstance` is a
|
|
971
|
+
// plain field and is invisible to the signal graph). Do not reorder it
|
|
972
|
+
// behind the null check — the effect would then never re-run on open.
|
|
907
973
|
effect(() => {
|
|
974
|
+
this.isAttached();
|
|
908
975
|
const instance = this.overlayInstance;
|
|
909
976
|
if (!instance)
|
|
910
977
|
return;
|
|
@@ -996,15 +1063,16 @@ class DatePickerComponent extends FormFieldControl {
|
|
|
996
1063
|
this.focusedSignal.set(!!origin);
|
|
997
1064
|
if (wasFocused && !origin) {
|
|
998
1065
|
this.onTouched();
|
|
999
|
-
this.
|
|
1066
|
+
this.errorWiring.bump();
|
|
1000
1067
|
}
|
|
1001
1068
|
});
|
|
1002
1069
|
this.destroyRef.onDestroy(() => {
|
|
1003
1070
|
monitorSub.unsubscribe();
|
|
1004
1071
|
this.focusMonitor.stopMonitoring(this.elementRef);
|
|
1005
1072
|
// The coordinator's own DestroyRef.onDestroy disposes the overlay and
|
|
1006
|
-
// clears its timers; we only need to drop the local instance
|
|
1007
|
-
this.
|
|
1073
|
+
// clears its timers; we only need to drop the local instance reference.
|
|
1074
|
+
this.overlayInstance = null;
|
|
1075
|
+
this.isAttached.set(false);
|
|
1008
1076
|
});
|
|
1009
1077
|
}
|
|
1010
1078
|
ngOnInit() {
|
|
@@ -1015,22 +1083,8 @@ class DatePickerComponent extends FormFieldControl {
|
|
|
1015
1083
|
this.ngControl = this.injector.get(NgControl, null, { self: true, optional: true });
|
|
1016
1084
|
// Anything read off `ngControl` before this point saw `null`; bump the
|
|
1017
1085
|
// revision so `isDisabled`, `required` and `errorState` recompute.
|
|
1018
|
-
this.
|
|
1019
|
-
|
|
1020
|
-
if (ctrl) {
|
|
1021
|
-
const streams = [ctrl.statusChanges, ctrl.valueChanges].filter((s) => !!s);
|
|
1022
|
-
if (streams.length) {
|
|
1023
|
-
merge(...streams)
|
|
1024
|
-
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
1025
|
-
.subscribe(() => this._ngControlRev.update((n) => n + 1));
|
|
1026
|
-
}
|
|
1027
|
-
}
|
|
1028
|
-
const submit = this.parentFormGroup?.ngSubmit ?? this.parentForm?.ngSubmit;
|
|
1029
|
-
if (submit) {
|
|
1030
|
-
submit
|
|
1031
|
-
.pipe(takeUntilDestroyed(this.destroyRef))
|
|
1032
|
-
.subscribe(() => this._formSubmitRev.update((n) => n + 1));
|
|
1033
|
-
}
|
|
1086
|
+
this.errorWiring.bump();
|
|
1087
|
+
this.errorWiring.connect();
|
|
1034
1088
|
}
|
|
1035
1089
|
// ── Public imperative API ──
|
|
1036
1090
|
/** Opens the overlay. No-op when disabled or already open. */
|
|
@@ -1323,7 +1377,10 @@ class DatePickerComponent extends FormFieldControl {
|
|
|
1323
1377
|
instance.onApply.set(() => this.onApplyAction());
|
|
1324
1378
|
instance.onPresetSelect.set((preset) => this.onPresetClick(preset));
|
|
1325
1379
|
instance.activePresetId.set(this.activePresetIdSignal());
|
|
1326
|
-
this.
|
|
1380
|
+
this.overlayInstance = instance;
|
|
1381
|
+
// Must follow the assignment above: this is what wakes the state-push
|
|
1382
|
+
// effect, and it reads `overlayInstance` as a plain field.
|
|
1383
|
+
this.isAttached.set(true);
|
|
1327
1384
|
// Per-open streams from the coordinator complete on close, so no
|
|
1328
1385
|
// takeUntilDestroyed is needed — accumulating subscribers across multiple
|
|
1329
1386
|
// open/close cycles is the bug we'd hit otherwise.
|
|
@@ -1344,9 +1401,9 @@ class DatePickerComponent extends FormFieldControl {
|
|
|
1344
1401
|
});
|
|
1345
1402
|
}
|
|
1346
1403
|
closeOverlay(reason, restore = false) {
|
|
1347
|
-
if (this.
|
|
1404
|
+
if (this.closing || !this.overlayInstance)
|
|
1348
1405
|
return;
|
|
1349
|
-
this.
|
|
1406
|
+
this.closing = true;
|
|
1350
1407
|
this.overlayInstance.leaving.set(true);
|
|
1351
1408
|
if (restore) {
|
|
1352
1409
|
const previous = this.lastValueBeforeOpen();
|
|
@@ -1363,11 +1420,12 @@ class DatePickerComponent extends FormFieldControl {
|
|
|
1363
1420
|
// returnFocusTo was never set (e.g. open() flipped programmatically).
|
|
1364
1421
|
(this.returnFocusTo ?? this.resolveFocusTarget()).focus();
|
|
1365
1422
|
this.coordinator.close(() => {
|
|
1366
|
-
this.
|
|
1423
|
+
this.overlayInstance = null;
|
|
1424
|
+
this.isAttached.set(false);
|
|
1367
1425
|
this.pendingCalendarValue.set(null);
|
|
1368
1426
|
this.returnFocusTo = null;
|
|
1369
1427
|
untracked(() => this.open.set(false));
|
|
1370
|
-
this.
|
|
1428
|
+
this.closing = false;
|
|
1371
1429
|
this.closed.emit(reason);
|
|
1372
1430
|
});
|
|
1373
1431
|
}
|
|
@@ -1549,7 +1607,7 @@ class DatePickerComponent extends FormFieldControl {
|
|
|
1549
1607
|
}
|
|
1550
1608
|
}
|
|
1551
1609
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: DatePickerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
1552
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.7", type: DatePickerComponent, isStandalone: true, selector: "tw-date-picker", inputs: { idInput: { classPropertyName: "idInput", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, minDate: { classPropertyName: "minDate", publicName: "minDate", isSignal: true, isRequired: false, transformFunction: null }, maxDate: { classPropertyName: "maxDate", publicName: "maxDate", isSignal: true, isRequired: false, transformFunction: null }, dateFilter: { classPropertyName: "dateFilter", publicName: "dateFilter", isSignal: true, isRequired: false, transformFunction: null }, startView: { classPropertyName: "startView", publicName: "startView", isSignal: true, isRequired: false, transformFunction: null }, startAt: { classPropertyName: "startAt", publicName: "startAt", isSignal: true, isRequired: false, transformFunction: null }, format: { classPropertyName: "format", publicName: "format", isSignal: true, isRequired: false, transformFunction: null }, parseFormat: { classPropertyName: "parseFormat", publicName: "parseFormat", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, disabledInput: { classPropertyName: "disabledInput", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, requiredInput: { classPropertyName: "requiredInput", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, readonlyInput: { classPropertyName: "readonlyInput", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, showClear: { classPropertyName: "showClear", publicName: "showClear", isSignal: true, isRequired: false, transformFunction: null }, showActions: { classPropertyName: "showActions", publicName: "showActions", isSignal: true, isRequired: false, transformFunction: null }, todayLabel: { classPropertyName: "todayLabel", publicName: "todayLabel", isSignal: true, isRequired: false, transformFunction: null }, clearLabel: { classPropertyName: "clearLabel", publicName: "clearLabel", isSignal: true, isRequired: false, transformFunction: null }, cancelLabel: { classPropertyName: "cancelLabel", publicName: "cancelLabel", isSignal: true, isRequired: false, transformFunction: null }, applyLabel: { classPropertyName: "applyLabel", publicName: "applyLabel", isSignal: true, isRequired: false, transformFunction: null }, openOnFocus: { classPropertyName: "openOnFocus", publicName: "openOnFocus", isSignal: true, isRequired: false, transformFunction: null }, panelClass: { classPropertyName: "panelClass", publicName: "panelClass", isSignal: true, isRequired: false, transformFunction: null }, scrollStrategy: { classPropertyName: "scrollStrategy", publicName: "scrollStrategy", isSignal: true, isRequired: false, transformFunction: null }, offset: { classPropertyName: "offset", publicName: "offset", isSignal: true, isRequired: false, transformFunction: null }, triggerAriaLabel: { classPropertyName: "triggerAriaLabel", publicName: "triggerAriaLabel", isSignal: true, isRequired: false, transformFunction: null }, timeConfig: { classPropertyName: "timeConfig", publicName: "timeConfig", isSignal: true, isRequired: false, transformFunction: null }, locale: { classPropertyName: "locale", publicName: "locale", isSignal: true, isRequired: false, transformFunction: null }, dateClass: { classPropertyName: "dateClass", publicName: "dateClass", isSignal: true, isRequired: false, transformFunction: null }, cellTemplate: { classPropertyName: "cellTemplate", publicName: "cellTemplate", isSignal: true, isRequired: false, transformFunction: null }, presets: { classPropertyName: "presets", publicName: "presets", isSignal: true, isRequired: false, transformFunction: null }, errorStateMatcher: { classPropertyName: "errorStateMatcher", publicName: "errorStateMatcher", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "aria-label", isSignal: true, isRequired: false, transformFunction: null }, ariaLabelledby: { classPropertyName: "ariaLabelledby", publicName: "aria-labelledby", isSignal: true, isRequired: false, transformFunction: null }, userAriaDescribedByInput: { classPropertyName: "userAriaDescribedByInput", publicName: "aria-describedby", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, open: { classPropertyName: "open", publicName: "open", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange", open: "openChange", opened: "opened", closed: "closed", dateInput: "dateInput", dateChange: "dateChange", presetSelected: "presetSelected" }, host: { properties: { "class": "rootClasses()" } }, providers: [
|
|
1610
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.7", type: DatePickerComponent, isStandalone: true, selector: "tw-date-picker", inputs: { idInput: { classPropertyName: "idInput", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, minDate: { classPropertyName: "minDate", publicName: "minDate", isSignal: true, isRequired: false, transformFunction: null }, maxDate: { classPropertyName: "maxDate", publicName: "maxDate", isSignal: true, isRequired: false, transformFunction: null }, dateFilter: { classPropertyName: "dateFilter", publicName: "dateFilter", isSignal: true, isRequired: false, transformFunction: null }, startView: { classPropertyName: "startView", publicName: "startView", isSignal: true, isRequired: false, transformFunction: null }, startAt: { classPropertyName: "startAt", publicName: "startAt", isSignal: true, isRequired: false, transformFunction: null }, format: { classPropertyName: "format", publicName: "format", isSignal: true, isRequired: false, transformFunction: null }, parseFormat: { classPropertyName: "parseFormat", publicName: "parseFormat", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, disabledInput: { classPropertyName: "disabledInput", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, requiredInput: { classPropertyName: "requiredInput", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, readonlyInput: { classPropertyName: "readonlyInput", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, color: { classPropertyName: "color", publicName: "color", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, showClear: { classPropertyName: "showClear", publicName: "showClear", isSignal: true, isRequired: false, transformFunction: null }, showActions: { classPropertyName: "showActions", publicName: "showActions", isSignal: true, isRequired: false, transformFunction: null }, todayLabel: { classPropertyName: "todayLabel", publicName: "todayLabel", isSignal: true, isRequired: false, transformFunction: null }, clearLabel: { classPropertyName: "clearLabel", publicName: "clearLabel", isSignal: true, isRequired: false, transformFunction: null }, cancelLabel: { classPropertyName: "cancelLabel", publicName: "cancelLabel", isSignal: true, isRequired: false, transformFunction: null }, applyLabel: { classPropertyName: "applyLabel", publicName: "applyLabel", isSignal: true, isRequired: false, transformFunction: null }, openOnFocus: { classPropertyName: "openOnFocus", publicName: "openOnFocus", isSignal: true, isRequired: false, transformFunction: null }, panelClass: { classPropertyName: "panelClass", publicName: "panelClass", isSignal: true, isRequired: false, transformFunction: null }, scrollStrategy: { classPropertyName: "scrollStrategy", publicName: "scrollStrategy", isSignal: true, isRequired: false, transformFunction: null }, offset: { classPropertyName: "offset", publicName: "offset", isSignal: true, isRequired: false, transformFunction: null }, triggerAriaLabel: { classPropertyName: "triggerAriaLabel", publicName: "triggerAriaLabel", isSignal: true, isRequired: false, transformFunction: null }, clearAriaLabel: { classPropertyName: "clearAriaLabel", publicName: "clearAriaLabel", isSignal: true, isRequired: false, transformFunction: null }, timeConfig: { classPropertyName: "timeConfig", publicName: "timeConfig", isSignal: true, isRequired: false, transformFunction: null }, locale: { classPropertyName: "locale", publicName: "locale", isSignal: true, isRequired: false, transformFunction: null }, dateClass: { classPropertyName: "dateClass", publicName: "dateClass", isSignal: true, isRequired: false, transformFunction: null }, cellTemplate: { classPropertyName: "cellTemplate", publicName: "cellTemplate", isSignal: true, isRequired: false, transformFunction: null }, presets: { classPropertyName: "presets", publicName: "presets", isSignal: true, isRequired: false, transformFunction: null }, errorStateMatcher: { classPropertyName: "errorStateMatcher", publicName: "errorStateMatcher", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "aria-label", isSignal: true, isRequired: false, transformFunction: null }, ariaLabelledby: { classPropertyName: "ariaLabelledby", publicName: "aria-labelledby", isSignal: true, isRequired: false, transformFunction: null }, userAriaDescribedByInput: { classPropertyName: "userAriaDescribedByInput", publicName: "aria-describedby", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, open: { classPropertyName: "open", publicName: "open", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange", open: "openChange", opened: "opened", closed: "closed", dateInput: "dateInput", dateChange: "dateChange", presetSelected: "presetSelected" }, host: { properties: { "class": "rootClasses()" } }, providers: [
|
|
1553
1611
|
{
|
|
1554
1612
|
provide: TW_FORM_FIELD_CONTROL,
|
|
1555
1613
|
useExisting: forwardRef(() => DatePickerComponent),
|
|
@@ -1604,7 +1662,7 @@ class DatePickerComponent extends FormFieldControl {
|
|
|
1604
1662
|
[attr.aria-label]="ariaLabel() || null"
|
|
1605
1663
|
[attr.aria-labelledby]="ariaLabelledby() || null"
|
|
1606
1664
|
[attr.aria-describedby]="describedBy() || null"
|
|
1607
|
-
[attr.aria-required]="
|
|
1665
|
+
[attr.aria-required]="required() || null"
|
|
1608
1666
|
[attr.aria-invalid]="errorState() || null"
|
|
1609
1667
|
[attr.aria-disabled]="isDisabled() || null"
|
|
1610
1668
|
[attr.data-variant]="resolvedVariant()"
|
|
@@ -1619,7 +1677,7 @@ class DatePickerComponent extends FormFieldControl {
|
|
|
1619
1677
|
type="button"
|
|
1620
1678
|
tabindex="-1"
|
|
1621
1679
|
[class]="clearButtonClasses()"
|
|
1622
|
-
[attr.aria-label]="
|
|
1680
|
+
[attr.aria-label]="clearAriaLabel()"
|
|
1623
1681
|
(click)="onClearClick($event)"
|
|
1624
1682
|
>
|
|
1625
1683
|
<svg viewBox="0 0 20 20" fill="currentColor" aria-hidden="true" class="size-4">
|
|
@@ -1728,7 +1786,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImpor
|
|
|
1728
1786
|
[attr.aria-label]="ariaLabel() || null"
|
|
1729
1787
|
[attr.aria-labelledby]="ariaLabelledby() || null"
|
|
1730
1788
|
[attr.aria-describedby]="describedBy() || null"
|
|
1731
|
-
[attr.aria-required]="
|
|
1789
|
+
[attr.aria-required]="required() || null"
|
|
1732
1790
|
[attr.aria-invalid]="errorState() || null"
|
|
1733
1791
|
[attr.aria-disabled]="isDisabled() || null"
|
|
1734
1792
|
[attr.data-variant]="resolvedVariant()"
|
|
@@ -1743,7 +1801,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImpor
|
|
|
1743
1801
|
type="button"
|
|
1744
1802
|
tabindex="-1"
|
|
1745
1803
|
[class]="clearButtonClasses()"
|
|
1746
|
-
[attr.aria-label]="
|
|
1804
|
+
[attr.aria-label]="clearAriaLabel()"
|
|
1747
1805
|
(click)="onClearClick($event)"
|
|
1748
1806
|
>
|
|
1749
1807
|
<svg viewBox="0 0 20 20" fill="currentColor" aria-hidden="true" class="size-4">
|
|
@@ -1794,7 +1852,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImpor
|
|
|
1794
1852
|
'[class]': 'rootClasses()',
|
|
1795
1853
|
},
|
|
1796
1854
|
}]
|
|
1797
|
-
}], ctorParameters: () => [], propDecorators: { idInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: false }] }], minDate: [{ type: i0.Input, args: [{ isSignal: true, alias: "minDate", required: false }] }], maxDate: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxDate", required: false }] }], dateFilter: [{ type: i0.Input, args: [{ isSignal: true, alias: "dateFilter", required: false }] }], startView: [{ type: i0.Input, args: [{ isSignal: true, alias: "startView", required: false }] }], startAt: [{ type: i0.Input, args: [{ isSignal: true, alias: "startAt", required: false }] }], format: [{ type: i0.Input, args: [{ isSignal: true, alias: "format", required: false }] }], parseFormat: [{ type: i0.Input, args: [{ isSignal: true, alias: "parseFormat", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], disabledInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], requiredInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "required", required: false }] }], readonlyInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "readonly", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], color: [{ type: i0.Input, args: [{ isSignal: true, alias: "color", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], showClear: [{ type: i0.Input, args: [{ isSignal: true, alias: "showClear", required: false }] }], showActions: [{ type: i0.Input, args: [{ isSignal: true, alias: "showActions", required: false }] }], todayLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "todayLabel", required: false }] }], clearLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearLabel", required: false }] }], cancelLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "cancelLabel", required: false }] }], applyLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "applyLabel", required: false }] }], openOnFocus: [{ type: i0.Input, args: [{ isSignal: true, alias: "openOnFocus", required: false }] }], panelClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "panelClass", required: false }] }], scrollStrategy: [{ type: i0.Input, args: [{ isSignal: true, alias: "scrollStrategy", required: false }] }], offset: [{ type: i0.Input, args: [{ isSignal: true, alias: "offset", required: false }] }], triggerAriaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "triggerAriaLabel", required: false }] }], timeConfig: [{ type: i0.Input, args: [{ isSignal: true, alias: "timeConfig", required: false }] }], locale: [{ type: i0.Input, args: [{ isSignal: true, alias: "locale", required: false }] }], dateClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "dateClass", required: false }] }], cellTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "cellTemplate", required: false }] }], presets: [{ type: i0.Input, args: [{ isSignal: true, alias: "presets", required: false }] }], errorStateMatcher: [{ type: i0.Input, args: [{ isSignal: true, alias: "errorStateMatcher", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-label", required: false }] }], ariaLabelledby: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-labelledby", required: false }] }], userAriaDescribedByInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-describedby", required: false }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], open: [{ type: i0.Input, args: [{ isSignal: true, alias: "open", required: false }] }, { type: i0.Output, args: ["openChange"] }], opened: [{ type: i0.Output, args: ["opened"] }], closed: [{ type: i0.Output, args: ["closed"] }], dateInput: [{ type: i0.Output, args: ["dateInput"] }], dateChange: [{ type: i0.Output, args: ["dateChange"] }], presetSelected: [{ type: i0.Output, args: ["presetSelected"] }], inputRef: [{ type: i0.ViewChild, args: ['dateInput', { isSignal: true }] }], triggerRef: [{ type: i0.ViewChild, args: ['triggerBtn', { isSignal: true }] }] } });
|
|
1855
|
+
}], ctorParameters: () => [], propDecorators: { idInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: false }] }], minDate: [{ type: i0.Input, args: [{ isSignal: true, alias: "minDate", required: false }] }], maxDate: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxDate", required: false }] }], dateFilter: [{ type: i0.Input, args: [{ isSignal: true, alias: "dateFilter", required: false }] }], startView: [{ type: i0.Input, args: [{ isSignal: true, alias: "startView", required: false }] }], startAt: [{ type: i0.Input, args: [{ isSignal: true, alias: "startAt", required: false }] }], format: [{ type: i0.Input, args: [{ isSignal: true, alias: "format", required: false }] }], parseFormat: [{ type: i0.Input, args: [{ isSignal: true, alias: "parseFormat", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], disabledInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], requiredInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "required", required: false }] }], readonlyInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "readonly", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: false }] }], color: [{ type: i0.Input, args: [{ isSignal: true, alias: "color", required: false }] }], variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], showClear: [{ type: i0.Input, args: [{ isSignal: true, alias: "showClear", required: false }] }], showActions: [{ type: i0.Input, args: [{ isSignal: true, alias: "showActions", required: false }] }], todayLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "todayLabel", required: false }] }], clearLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearLabel", required: false }] }], cancelLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "cancelLabel", required: false }] }], applyLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "applyLabel", required: false }] }], openOnFocus: [{ type: i0.Input, args: [{ isSignal: true, alias: "openOnFocus", required: false }] }], panelClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "panelClass", required: false }] }], scrollStrategy: [{ type: i0.Input, args: [{ isSignal: true, alias: "scrollStrategy", required: false }] }], offset: [{ type: i0.Input, args: [{ isSignal: true, alias: "offset", required: false }] }], triggerAriaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "triggerAriaLabel", required: false }] }], clearAriaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearAriaLabel", required: false }] }], timeConfig: [{ type: i0.Input, args: [{ isSignal: true, alias: "timeConfig", required: false }] }], locale: [{ type: i0.Input, args: [{ isSignal: true, alias: "locale", required: false }] }], dateClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "dateClass", required: false }] }], cellTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "cellTemplate", required: false }] }], presets: [{ type: i0.Input, args: [{ isSignal: true, alias: "presets", required: false }] }], errorStateMatcher: [{ type: i0.Input, args: [{ isSignal: true, alias: "errorStateMatcher", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-label", required: false }] }], ariaLabelledby: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-labelledby", required: false }] }], userAriaDescribedByInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-describedby", required: false }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], open: [{ type: i0.Input, args: [{ isSignal: true, alias: "open", required: false }] }, { type: i0.Output, args: ["openChange"] }], opened: [{ type: i0.Output, args: ["opened"] }], closed: [{ type: i0.Output, args: ["closed"] }], dateInput: [{ type: i0.Output, args: ["dateInput"] }], dateChange: [{ type: i0.Output, args: ["dateChange"] }], presetSelected: [{ type: i0.Output, args: ["presetSelected"] }], inputRef: [{ type: i0.ViewChild, args: ['dateInput', { isSignal: true }] }], triggerRef: [{ type: i0.ViewChild, args: ['triggerBtn', { isSignal: true }] }] } });
|
|
1798
1856
|
|
|
1799
1857
|
/**
|
|
1800
1858
|
* Generated bundle index. Do not edit.
|