@cdevhub/ngx-tw 0.5.0 → 0.6.0

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.
Files changed (209) hide show
  1. package/README.md +78 -15
  2. package/fesm2022/cdevhub-ngx-tw-accordion.mjs +16 -5
  3. package/fesm2022/cdevhub-ngx-tw-accordion.mjs.map +1 -1
  4. package/fesm2022/cdevhub-ngx-tw-avatar.mjs +26 -15
  5. package/fesm2022/cdevhub-ngx-tw-avatar.mjs.map +1 -1
  6. package/fesm2022/cdevhub-ngx-tw-badge.mjs +17 -5
  7. package/fesm2022/cdevhub-ngx-tw-badge.mjs.map +1 -1
  8. package/fesm2022/cdevhub-ngx-tw-breadcrumbs.mjs +27 -6
  9. package/fesm2022/cdevhub-ngx-tw-breadcrumbs.mjs.map +1 -1
  10. package/fesm2022/cdevhub-ngx-tw-button.mjs +23 -11
  11. package/fesm2022/cdevhub-ngx-tw-button.mjs.map +1 -1
  12. package/fesm2022/cdevhub-ngx-tw-calendar-luxon.mjs +5 -5
  13. package/fesm2022/cdevhub-ngx-tw-calendar-luxon.mjs.map +1 -1
  14. package/fesm2022/cdevhub-ngx-tw-calendar-testing.mjs +3 -3
  15. package/fesm2022/cdevhub-ngx-tw-calendar-testing.mjs.map +1 -1
  16. package/fesm2022/cdevhub-ngx-tw-calendar.mjs +427 -122
  17. package/fesm2022/cdevhub-ngx-tw-calendar.mjs.map +1 -1
  18. package/fesm2022/cdevhub-ngx-tw-card.mjs +21 -11
  19. package/fesm2022/cdevhub-ngx-tw-card.mjs.map +1 -1
  20. package/fesm2022/cdevhub-ngx-tw-carousel.mjs +215 -96
  21. package/fesm2022/cdevhub-ngx-tw-carousel.mjs.map +1 -1
  22. package/fesm2022/cdevhub-ngx-tw-checkbox.mjs +108 -64
  23. package/fesm2022/cdevhub-ngx-tw-checkbox.mjs.map +1 -1
  24. package/fesm2022/cdevhub-ngx-tw-code-block.mjs +18 -6
  25. package/fesm2022/cdevhub-ngx-tw-code-block.mjs.map +1 -1
  26. package/fesm2022/cdevhub-ngx-tw-collapsible.mjs +55 -30
  27. package/fesm2022/cdevhub-ngx-tw-collapsible.mjs.map +1 -1
  28. package/fesm2022/cdevhub-ngx-tw-combobox-testing.mjs +218 -0
  29. package/fesm2022/cdevhub-ngx-tw-combobox-testing.mjs.map +1 -0
  30. package/fesm2022/cdevhub-ngx-tw-combobox.mjs +236 -211
  31. package/fesm2022/cdevhub-ngx-tw-combobox.mjs.map +1 -1
  32. package/fesm2022/cdevhub-ngx-tw-command-palette-testing.mjs +200 -0
  33. package/fesm2022/cdevhub-ngx-tw-command-palette-testing.mjs.map +1 -0
  34. package/fesm2022/cdevhub-ngx-tw-command-palette.mjs +34 -7
  35. package/fesm2022/cdevhub-ngx-tw-command-palette.mjs.map +1 -1
  36. package/fesm2022/cdevhub-ngx-tw-core.mjs +135 -15
  37. package/fesm2022/cdevhub-ngx-tw-core.mjs.map +1 -1
  38. package/fesm2022/cdevhub-ngx-tw-date-picker-testing.mjs +203 -0
  39. package/fesm2022/cdevhub-ngx-tw-date-picker-testing.mjs.map +1 -0
  40. package/fesm2022/cdevhub-ngx-tw-date-picker.mjs +160 -102
  41. package/fesm2022/cdevhub-ngx-tw-date-picker.mjs.map +1 -1
  42. package/fesm2022/cdevhub-ngx-tw-date-range-picker-testing.mjs +209 -0
  43. package/fesm2022/cdevhub-ngx-tw-date-range-picker-testing.mjs.map +1 -0
  44. package/fesm2022/cdevhub-ngx-tw-date-range-picker.mjs +182 -107
  45. package/fesm2022/cdevhub-ngx-tw-date-range-picker.mjs.map +1 -1
  46. package/fesm2022/cdevhub-ngx-tw-dialog-testing.mjs +122 -0
  47. package/fesm2022/cdevhub-ngx-tw-dialog-testing.mjs.map +1 -0
  48. package/fesm2022/cdevhub-ngx-tw-dialog.mjs +11 -2
  49. package/fesm2022/cdevhub-ngx-tw-dialog.mjs.map +1 -1
  50. package/fesm2022/cdevhub-ngx-tw-empty-state.mjs +1 -1
  51. package/fesm2022/cdevhub-ngx-tw-empty-state.mjs.map +1 -1
  52. package/fesm2022/cdevhub-ngx-tw-file-upload-testing.mjs +149 -0
  53. package/fesm2022/cdevhub-ngx-tw-file-upload-testing.mjs.map +1 -0
  54. package/fesm2022/cdevhub-ngx-tw-file-upload.mjs +57 -67
  55. package/fesm2022/cdevhub-ngx-tw-file-upload.mjs.map +1 -1
  56. package/fesm2022/cdevhub-ngx-tw-flip-card.mjs +42 -24
  57. package/fesm2022/cdevhub-ngx-tw-flip-card.mjs.map +1 -1
  58. package/fesm2022/cdevhub-ngx-tw-form-field.mjs +114 -21
  59. package/fesm2022/cdevhub-ngx-tw-form-field.mjs.map +1 -1
  60. package/fesm2022/cdevhub-ngx-tw-icon.mjs +16 -6
  61. package/fesm2022/cdevhub-ngx-tw-icon.mjs.map +1 -1
  62. package/fesm2022/cdevhub-ngx-tw-input.mjs +52 -61
  63. package/fesm2022/cdevhub-ngx-tw-input.mjs.map +1 -1
  64. package/fesm2022/cdevhub-ngx-tw-item.mjs +18 -3
  65. package/fesm2022/cdevhub-ngx-tw-item.mjs.map +1 -1
  66. package/fesm2022/cdevhub-ngx-tw-menu-testing.mjs +168 -0
  67. package/fesm2022/cdevhub-ngx-tw-menu-testing.mjs.map +1 -0
  68. package/fesm2022/cdevhub-ngx-tw-menu.mjs +58 -21
  69. package/fesm2022/cdevhub-ngx-tw-menu.mjs.map +1 -1
  70. package/fesm2022/cdevhub-ngx-tw-number-input.mjs +34 -1
  71. package/fesm2022/cdevhub-ngx-tw-number-input.mjs.map +1 -1
  72. package/fesm2022/cdevhub-ngx-tw-paginator.mjs +95 -45
  73. package/fesm2022/cdevhub-ngx-tw-paginator.mjs.map +1 -1
  74. package/fesm2022/cdevhub-ngx-tw-popover.mjs +81 -32
  75. package/fesm2022/cdevhub-ngx-tw-popover.mjs.map +1 -1
  76. package/fesm2022/cdevhub-ngx-tw-progress-bar.mjs +1 -1
  77. package/fesm2022/cdevhub-ngx-tw-progress-bar.mjs.map +1 -1
  78. package/fesm2022/cdevhub-ngx-tw-radio.mjs +131 -98
  79. package/fesm2022/cdevhub-ngx-tw-radio.mjs.map +1 -1
  80. package/fesm2022/cdevhub-ngx-tw-segmented-control.mjs +207 -42
  81. package/fesm2022/cdevhub-ngx-tw-segmented-control.mjs.map +1 -1
  82. package/fesm2022/cdevhub-ngx-tw-select-testing.mjs +165 -0
  83. package/fesm2022/cdevhub-ngx-tw-select-testing.mjs.map +1 -0
  84. package/fesm2022/cdevhub-ngx-tw-select.mjs +386 -210
  85. package/fesm2022/cdevhub-ngx-tw-select.mjs.map +1 -1
  86. package/fesm2022/{cdevhub-ngx-tw-sheet-sheet-renderer-ByyNluUd.mjs → cdevhub-ngx-tw-sheet-sheet-renderer-CqVJwgmp.mjs} +3 -3
  87. package/fesm2022/cdevhub-ngx-tw-sheet-sheet-renderer-CqVJwgmp.mjs.map +1 -0
  88. package/fesm2022/cdevhub-ngx-tw-sheet-testing.mjs +129 -0
  89. package/fesm2022/cdevhub-ngx-tw-sheet-testing.mjs.map +1 -0
  90. package/fesm2022/cdevhub-ngx-tw-sheet.mjs +23 -7
  91. package/fesm2022/cdevhub-ngx-tw-sheet.mjs.map +1 -1
  92. package/fesm2022/cdevhub-ngx-tw-slider.mjs +89 -54
  93. package/fesm2022/cdevhub-ngx-tw-slider.mjs.map +1 -1
  94. package/fesm2022/cdevhub-ngx-tw-sort.mjs +122 -17
  95. package/fesm2022/cdevhub-ngx-tw-sort.mjs.map +1 -1
  96. package/fesm2022/cdevhub-ngx-tw-split.mjs +72 -19
  97. package/fesm2022/cdevhub-ngx-tw-split.mjs.map +1 -1
  98. package/fesm2022/cdevhub-ngx-tw-stat.mjs +63 -25
  99. package/fesm2022/cdevhub-ngx-tw-stat.mjs.map +1 -1
  100. package/fesm2022/cdevhub-ngx-tw-stepper.mjs +35 -8
  101. package/fesm2022/cdevhub-ngx-tw-stepper.mjs.map +1 -1
  102. package/fesm2022/cdevhub-ngx-tw-switch.mjs +54 -48
  103. package/fesm2022/cdevhub-ngx-tw-switch.mjs.map +1 -1
  104. package/fesm2022/cdevhub-ngx-tw-tab-nav.mjs +12 -15
  105. package/fesm2022/cdevhub-ngx-tw-tab-nav.mjs.map +1 -1
  106. package/fesm2022/cdevhub-ngx-tw-table.mjs +74 -13
  107. package/fesm2022/cdevhub-ngx-tw-table.mjs.map +1 -1
  108. package/fesm2022/cdevhub-ngx-tw-tabs.mjs +84 -30
  109. package/fesm2022/cdevhub-ngx-tw-tabs.mjs.map +1 -1
  110. package/fesm2022/cdevhub-ngx-tw-tags-input-testing.mjs +172 -0
  111. package/fesm2022/cdevhub-ngx-tw-tags-input-testing.mjs.map +1 -0
  112. package/fesm2022/cdevhub-ngx-tw-tags-input.mjs +107 -71
  113. package/fesm2022/cdevhub-ngx-tw-tags-input.mjs.map +1 -1
  114. package/fesm2022/cdevhub-ngx-tw-textarea.mjs +41 -9
  115. package/fesm2022/cdevhub-ngx-tw-textarea.mjs.map +1 -1
  116. package/fesm2022/cdevhub-ngx-tw-theme.mjs +257 -45
  117. package/fesm2022/cdevhub-ngx-tw-theme.mjs.map +1 -1
  118. package/fesm2022/cdevhub-ngx-tw-time-picker-testing.mjs +201 -0
  119. package/fesm2022/cdevhub-ngx-tw-time-picker-testing.mjs.map +1 -0
  120. package/fesm2022/cdevhub-ngx-tw-time-picker.mjs +184 -77
  121. package/fesm2022/cdevhub-ngx-tw-time-picker.mjs.map +1 -1
  122. package/fesm2022/cdevhub-ngx-tw-timeline.mjs +110 -27
  123. package/fesm2022/cdevhub-ngx-tw-timeline.mjs.map +1 -1
  124. package/fesm2022/{cdevhub-ngx-tw-toast-toast-renderer-DSu4YoTy.mjs → cdevhub-ngx-tw-toast-toast-renderer-BlDxemsU.mjs} +107 -19
  125. package/fesm2022/cdevhub-ngx-tw-toast-toast-renderer-BlDxemsU.mjs.map +1 -0
  126. package/fesm2022/cdevhub-ngx-tw-toast.mjs +21 -13
  127. package/fesm2022/cdevhub-ngx-tw-toast.mjs.map +1 -1
  128. package/fesm2022/cdevhub-ngx-tw-tooltip.mjs +102 -15
  129. package/fesm2022/cdevhub-ngx-tw-tooltip.mjs.map +1 -1
  130. package/fesm2022/cdevhub-ngx-tw-transfer-testing.mjs +219 -0
  131. package/fesm2022/cdevhub-ngx-tw-transfer-testing.mjs.map +1 -0
  132. package/fesm2022/cdevhub-ngx-tw-transfer.mjs +88 -69
  133. package/fesm2022/cdevhub-ngx-tw-transfer.mjs.map +1 -1
  134. package/fesm2022/cdevhub-ngx-tw-tree.mjs +68 -19
  135. package/fesm2022/cdevhub-ngx-tw-tree.mjs.map +1 -1
  136. package/index.json +1 -1
  137. package/package.json +63 -2
  138. package/theme/_base.css +13 -0
  139. package/theme/_dark.css +110 -36
  140. package/theme/_high-contrast-dark.css +367 -0
  141. package/theme/_high-contrast.css +13 -2
  142. package/theme/_light.css +276 -0
  143. package/theme/_semantic.css +47 -12
  144. package/theme/_typography.css +17 -0
  145. package/theme/index.css +86 -7
  146. package/types/cdevhub-ngx-tw-accordion.d.ts +12 -4
  147. package/types/cdevhub-ngx-tw-avatar.d.ts +10 -3
  148. package/types/cdevhub-ngx-tw-button.d.ts +1 -0
  149. package/types/cdevhub-ngx-tw-calendar-luxon.d.ts +2 -2
  150. package/types/cdevhub-ngx-tw-calendar-testing.d.ts +1 -1
  151. package/types/cdevhub-ngx-tw-calendar.d.ts +179 -73
  152. package/types/cdevhub-ngx-tw-card.d.ts +11 -3
  153. package/types/cdevhub-ngx-tw-carousel.d.ts +89 -20
  154. package/types/cdevhub-ngx-tw-checkbox.d.ts +40 -12
  155. package/types/cdevhub-ngx-tw-code-block.d.ts +11 -2
  156. package/types/cdevhub-ngx-tw-collapsible.d.ts +32 -5
  157. package/types/cdevhub-ngx-tw-combobox-testing.d.ts +157 -0
  158. package/types/cdevhub-ngx-tw-combobox.d.ts +94 -53
  159. package/types/cdevhub-ngx-tw-command-palette-testing.d.ts +136 -0
  160. package/types/cdevhub-ngx-tw-command-palette.d.ts +33 -5
  161. package/types/cdevhub-ngx-tw-core.d.ts +152 -21
  162. package/types/cdevhub-ngx-tw-date-picker-testing.d.ts +141 -0
  163. package/types/cdevhub-ngx-tw-date-picker.d.ts +37 -29
  164. package/types/cdevhub-ngx-tw-date-range-picker-testing.d.ts +148 -0
  165. package/types/cdevhub-ngx-tw-date-range-picker.d.ts +36 -29
  166. package/types/cdevhub-ngx-tw-dialog-testing.d.ts +98 -0
  167. package/types/cdevhub-ngx-tw-dialog.d.ts +12 -3
  168. package/types/cdevhub-ngx-tw-file-upload-testing.d.ts +120 -0
  169. package/types/cdevhub-ngx-tw-file-upload.d.ts +8 -10
  170. package/types/cdevhub-ngx-tw-flip-card.d.ts +18 -11
  171. package/types/cdevhub-ngx-tw-form-field.d.ts +19 -2
  172. package/types/cdevhub-ngx-tw-icon.d.ts +3 -3
  173. package/types/cdevhub-ngx-tw-input.d.ts +5 -8
  174. package/types/cdevhub-ngx-tw-item.d.ts +2 -0
  175. package/types/cdevhub-ngx-tw-menu-testing.d.ts +131 -0
  176. package/types/cdevhub-ngx-tw-menu.d.ts +2 -2
  177. package/types/cdevhub-ngx-tw-number-input.d.ts +20 -0
  178. package/types/cdevhub-ngx-tw-paginator.d.ts +58 -24
  179. package/types/cdevhub-ngx-tw-popover.d.ts +41 -10
  180. package/types/cdevhub-ngx-tw-progress-bar.d.ts +1 -1
  181. package/types/cdevhub-ngx-tw-radio.d.ts +68 -25
  182. package/types/cdevhub-ngx-tw-segmented-control.d.ts +79 -16
  183. package/types/cdevhub-ngx-tw-select-testing.d.ts +114 -0
  184. package/types/cdevhub-ngx-tw-select.d.ts +104 -33
  185. package/types/cdevhub-ngx-tw-sheet-testing.d.ts +104 -0
  186. package/types/cdevhub-ngx-tw-sheet.d.ts +19 -3
  187. package/types/cdevhub-ngx-tw-slider.d.ts +79 -25
  188. package/types/cdevhub-ngx-tw-sort.d.ts +45 -4
  189. package/types/cdevhub-ngx-tw-split.d.ts +32 -2
  190. package/types/cdevhub-ngx-tw-stat.d.ts +14 -4
  191. package/types/cdevhub-ngx-tw-stepper.d.ts +16 -2
  192. package/types/cdevhub-ngx-tw-switch.d.ts +35 -13
  193. package/types/cdevhub-ngx-tw-tab-nav.d.ts +7 -6
  194. package/types/cdevhub-ngx-tw-table.d.ts +53 -10
  195. package/types/cdevhub-ngx-tw-tabs.d.ts +41 -10
  196. package/types/cdevhub-ngx-tw-tags-input-testing.d.ts +135 -0
  197. package/types/cdevhub-ngx-tw-tags-input.d.ts +26 -11
  198. package/types/cdevhub-ngx-tw-textarea.d.ts +3 -2
  199. package/types/cdevhub-ngx-tw-theme.d.ts +245 -39
  200. package/types/cdevhub-ngx-tw-time-picker-testing.d.ts +129 -0
  201. package/types/cdevhub-ngx-tw-time-picker.d.ts +76 -19
  202. package/types/cdevhub-ngx-tw-timeline.d.ts +36 -12
  203. package/types/cdevhub-ngx-tw-toast.d.ts +20 -6
  204. package/types/cdevhub-ngx-tw-tooltip.d.ts +28 -6
  205. package/types/cdevhub-ngx-tw-transfer-testing.d.ts +152 -0
  206. package/types/cdevhub-ngx-tw-transfer.d.ts +21 -8
  207. package/types/cdevhub-ngx-tw-tree.d.ts +6 -1
  208. package/fesm2022/cdevhub-ngx-tw-sheet-sheet-renderer-ByyNluUd.mjs.map +0 -1
  209. 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 { NgForm, FormGroupDirective, Validators, NgControl, NG_VALIDATORS, NG_VALUE_ACCESSOR } from '@angular/forms';
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, TW_ERROR_STATE_MATCHER, timeOfDaySeconds, resolveSelectScrollStrategy, buildSelectLikePositions } from '@cdevhub/ngx-tw/core';
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
- input: 'flex-1 min-w-0 bg-transparent text-fg placeholder:text-fg-subtle outline-none border-0 p-0 m-0 font-inherit',
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
- root: 'rounded-md border border-border bg-surface px-3 py-2 hover:border-border-strong',
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
- _ngControlRev = signal(0, /* @ts-ignore */
718
- ...(ngDevMode ? [{ debugName: "_ngControlRev" }] : /* istanbul ignore next */ []));
719
- _formSubmitRev = signal(0, /* @ts-ignore */
720
- ...(ngDevMode ? [{ debugName: "_formSubmitRev" }] : /* istanbul ignore next */ []));
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
- overlayInstanceSignal = signal(null, /* @ts-ignore */
724
- ...(ngDevMode ? [{ debugName: "overlayInstanceSignal" }] : /* istanbul ignore next */ []));
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
- get overlayInstance() {
727
- return this.overlayInstanceSignal();
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._ngControlRev();
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 = computed(() => {
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 = computed(() => {
839
- this._ngControlRev();
840
- this._formSubmitRev();
841
- this.focusedSignal();
842
- if (this.parseError() || this.rangeError())
843
- return true;
844
- const matcher = this.errorStateMatcher() ?? this.defaultMatcher;
845
- const form = this.parentFormGroup ??
846
- this.parentForm;
847
- return matcher.isErrorState(this.ngControl?.control ?? null, form);
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
- if (disabled && this.overlayInstance) {
894
- this.closeOverlay('programmatic');
895
- return;
896
- }
897
- if (shouldOpen && !this.overlayInstance && !disabled && !this.closingSignal()) {
898
- this.openOverlay();
899
- }
900
- else if (!shouldOpen && this.overlayInstance && !this.closingSignal()) {
901
- this.closeOverlay('programmatic');
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._ngControlRev.update((n) => n + 1);
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 signal.
1007
- this.overlayInstanceSignal.set(null);
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._ngControlRev.update((n) => n + 1);
1019
- const ctrl = this.ngControl?.control;
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.overlayInstanceSignal.set(instance);
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.closingSignal() || !this.overlayInstance)
1404
+ if (this.closing || !this.overlayInstance)
1348
1405
  return;
1349
- this.closingSignal.set(true);
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.overlayInstanceSignal.set(null);
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.closingSignal.set(false);
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]="requiredInput() || null"
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]="'Clear date'"
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]="requiredInput() || null"
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]="'Clear date'"
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.