@tailng-ui/components 0.13.0 → 0.15.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 (184) hide show
  1. package/package.json +3 -2
  2. package/src/lib/feedback/empty/tng-empty.component.d.ts.map +1 -1
  3. package/src/lib/feedback/empty/tng-empty.component.js +0 -5
  4. package/src/lib/feedback/empty/tng-empty.component.js.map +1 -1
  5. package/src/lib/feedback/progress-bar/tng-progress-bar.component.d.ts.map +1 -1
  6. package/src/lib/feedback/progress-bar/tng-progress-bar.component.js +0 -1
  7. package/src/lib/feedback/progress-bar/tng-progress-bar.component.js.map +1 -1
  8. package/src/lib/feedback/progress-spinner/tng-progress-spinner.component.d.ts.map +1 -1
  9. package/src/lib/feedback/progress-spinner/tng-progress-spinner.component.js +0 -1
  10. package/src/lib/feedback/progress-spinner/tng-progress-spinner.component.js.map +1 -1
  11. package/src/lib/feedback/skeleton/tng-skeleton.component.d.ts.map +1 -1
  12. package/src/lib/feedback/skeleton/tng-skeleton.component.js +0 -1
  13. package/src/lib/feedback/skeleton/tng-skeleton.component.js.map +1 -1
  14. package/src/lib/feedback/toast/tng-toast.component.d.ts.map +1 -1
  15. package/src/lib/feedback/toast/tng-toast.component.js +0 -1
  16. package/src/lib/feedback/toast/tng-toast.component.js.map +1 -1
  17. package/src/lib/form/autocomplete/tng-autocomplete.component.d.ts.map +1 -1
  18. package/src/lib/form/autocomplete/tng-autocomplete.component.js +0 -1
  19. package/src/lib/form/autocomplete/tng-autocomplete.component.js.map +1 -1
  20. package/src/lib/form/button-toggle/tng-button-toggle-group.component.d.ts +2 -2
  21. package/src/lib/form/button-toggle/tng-button-toggle-group.component.d.ts.map +1 -1
  22. package/src/lib/form/button-toggle/tng-button-toggle-group.component.js +0 -1
  23. package/src/lib/form/button-toggle/tng-button-toggle-group.component.js.map +1 -1
  24. package/src/lib/form/button-toggle/tng-button-toggle.component.d.ts.map +1 -1
  25. package/src/lib/form/button-toggle/tng-button-toggle.component.js +0 -1
  26. package/src/lib/form/button-toggle/tng-button-toggle.component.js.map +1 -1
  27. package/src/lib/form/checkbox/tng-checkbox.component.d.ts.map +1 -1
  28. package/src/lib/form/checkbox/tng-checkbox.component.js +0 -1
  29. package/src/lib/form/checkbox/tng-checkbox.component.js.map +1 -1
  30. package/src/lib/form/chips/tng-chips.component.d.ts.map +1 -1
  31. package/src/lib/form/chips/tng-chips.component.js +0 -1
  32. package/src/lib/form/chips/tng-chips.component.js.map +1 -1
  33. package/src/lib/form/combobox/tng-combobox.component.d.ts.map +1 -1
  34. package/src/lib/form/combobox/tng-combobox.component.js +0 -1
  35. package/src/lib/form/combobox/tng-combobox.component.js.map +1 -1
  36. package/src/lib/form/datepicker/tng-datepicker.component.d.ts +236 -0
  37. package/src/lib/form/datepicker/tng-datepicker.component.d.ts.map +1 -0
  38. package/src/lib/form/datepicker/tng-datepicker.component.js +684 -0
  39. package/src/lib/form/datepicker/tng-datepicker.component.js.map +1 -0
  40. package/src/lib/form/index.d.ts +2 -0
  41. package/src/lib/form/index.d.ts.map +1 -1
  42. package/src/lib/form/index.js +2 -0
  43. package/src/lib/form/index.js.map +1 -1
  44. package/src/lib/form/input/tng-input.component.d.ts.map +1 -1
  45. package/src/lib/form/input/tng-input.component.js +0 -1
  46. package/src/lib/form/input/tng-input.component.js.map +1 -1
  47. package/src/lib/form/input-otp/tng-input-otp.component.d.ts.map +1 -1
  48. package/src/lib/form/input-otp/tng-input-otp.component.js +0 -1
  49. package/src/lib/form/input-otp/tng-input-otp.component.js.map +1 -1
  50. package/src/lib/form/label/tng-label.component.d.ts.map +1 -1
  51. package/src/lib/form/label/tng-label.component.js +0 -1
  52. package/src/lib/form/label/tng-label.component.js.map +1 -1
  53. package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.component.d.ts.map +1 -1
  54. package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.component.js +0 -1
  55. package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.component.js.map +1 -1
  56. package/src/lib/form/multiselect/tng-multiselect.component.d.ts.map +1 -1
  57. package/src/lib/form/multiselect/tng-multiselect.component.js +0 -1
  58. package/src/lib/form/multiselect/tng-multiselect.component.js.map +1 -1
  59. package/src/lib/form/radio/tng-radio.component.d.ts.map +1 -1
  60. package/src/lib/form/radio/tng-radio.component.js +0 -1
  61. package/src/lib/form/radio/tng-radio.component.js.map +1 -1
  62. package/src/lib/form/select/tng-select.component.d.ts.map +1 -1
  63. package/src/lib/form/select/tng-select.component.js +0 -1
  64. package/src/lib/form/select/tng-select.component.js.map +1 -1
  65. package/src/lib/form/select/tng-select.slots.d.ts.map +1 -1
  66. package/src/lib/form/select/tng-select.slots.js +0 -2
  67. package/src/lib/form/select/tng-select.slots.js.map +1 -1
  68. package/src/lib/form/slider/tng-slider.component.d.ts.map +1 -1
  69. package/src/lib/form/slider/tng-slider.component.js +0 -1
  70. package/src/lib/form/slider/tng-slider.component.js.map +1 -1
  71. package/src/lib/form/switch/tng-switch.component.d.ts.map +1 -1
  72. package/src/lib/form/switch/tng-switch.component.js +0 -1
  73. package/src/lib/form/switch/tng-switch.component.js.map +1 -1
  74. package/src/lib/form/textarea/tng-textarea.component.d.ts.map +1 -1
  75. package/src/lib/form/textarea/tng-textarea.component.js +0 -1
  76. package/src/lib/form/textarea/tng-textarea.component.js.map +1 -1
  77. package/src/lib/form/toggle/tng-toggle.component.d.ts.map +1 -1
  78. package/src/lib/form/toggle/tng-toggle.component.js +0 -1
  79. package/src/lib/form/toggle/tng-toggle.component.js.map +1 -1
  80. package/src/lib/form/toggle-group/tng-toggle-group.component.d.ts.map +1 -1
  81. package/src/lib/form/toggle-group/tng-toggle-group.component.js +0 -1
  82. package/src/lib/form/toggle-group/tng-toggle-group.component.js.map +1 -1
  83. package/src/lib/layout/accordion/tng-accordion.component.d.ts.map +1 -1
  84. package/src/lib/layout/accordion/tng-accordion.component.js +0 -4
  85. package/src/lib/layout/accordion/tng-accordion.component.js.map +1 -1
  86. package/src/lib/layout/bottom-sheet/tng-bottom-sheet.component.d.ts.map +1 -1
  87. package/src/lib/layout/bottom-sheet/tng-bottom-sheet.component.js +0 -1
  88. package/src/lib/layout/bottom-sheet/tng-bottom-sheet.component.js.map +1 -1
  89. package/src/lib/layout/card/tng-card.component.d.ts +1 -1
  90. package/src/lib/layout/card/tng-card.component.d.ts.map +1 -1
  91. package/src/lib/layout/card/tng-card.component.js +0 -10
  92. package/src/lib/layout/card/tng-card.component.js.map +1 -1
  93. package/src/lib/layout/collapsible/tng-collapsible.component.d.ts.map +1 -1
  94. package/src/lib/layout/collapsible/tng-collapsible.component.js +0 -1
  95. package/src/lib/layout/collapsible/tng-collapsible.component.js.map +1 -1
  96. package/src/lib/layout/drawer/tng-drawer.component.d.ts.map +1 -1
  97. package/src/lib/layout/drawer/tng-drawer.component.js +0 -1
  98. package/src/lib/layout/drawer/tng-drawer.component.js.map +1 -1
  99. package/src/lib/layout/grid/tng-grid.component.d.ts +4 -1
  100. package/src/lib/layout/grid/tng-grid.component.d.ts.map +1 -1
  101. package/src/lib/layout/grid/tng-grid.component.js +101 -5
  102. package/src/lib/layout/grid/tng-grid.component.js.map +1 -1
  103. package/src/lib/layout/index.d.ts +1 -1
  104. package/src/lib/layout/index.d.ts.map +1 -1
  105. package/src/lib/layout/index.js +1 -1
  106. package/src/lib/layout/index.js.map +1 -1
  107. package/src/lib/layout/separator/tng-separator.component.d.ts.map +1 -1
  108. package/src/lib/layout/separator/tng-separator.component.js +0 -1
  109. package/src/lib/layout/separator/tng-separator.component.js.map +1 -1
  110. package/src/lib/layout/stepper/tng-stepper.component.d.ts.map +1 -1
  111. package/src/lib/layout/stepper/tng-stepper.component.js +0 -1
  112. package/src/lib/layout/stepper/tng-stepper.component.js.map +1 -1
  113. package/src/lib/navigation/breadcrumb/tng-breadcrumb-item.component.d.ts.map +1 -1
  114. package/src/lib/navigation/breadcrumb/tng-breadcrumb-item.component.js +0 -1
  115. package/src/lib/navigation/breadcrumb/tng-breadcrumb-item.component.js.map +1 -1
  116. package/src/lib/navigation/breadcrumb/tng-breadcrumb-link.component.d.ts.map +1 -1
  117. package/src/lib/navigation/breadcrumb/tng-breadcrumb-link.component.js +0 -1
  118. package/src/lib/navigation/breadcrumb/tng-breadcrumb-link.component.js.map +1 -1
  119. package/src/lib/navigation/breadcrumb/tng-breadcrumb-list.component.d.ts.map +1 -1
  120. package/src/lib/navigation/breadcrumb/tng-breadcrumb-list.component.js +0 -1
  121. package/src/lib/navigation/breadcrumb/tng-breadcrumb-list.component.js.map +1 -1
  122. package/src/lib/navigation/breadcrumb/tng-breadcrumb-separator-template.directive.d.ts.map +1 -1
  123. package/src/lib/navigation/breadcrumb/tng-breadcrumb-separator-template.directive.js +0 -1
  124. package/src/lib/navigation/breadcrumb/tng-breadcrumb-separator-template.directive.js.map +1 -1
  125. package/src/lib/navigation/breadcrumb/tng-breadcrumb-separator.component.d.ts.map +1 -1
  126. package/src/lib/navigation/breadcrumb/tng-breadcrumb-separator.component.js +0 -1
  127. package/src/lib/navigation/breadcrumb/tng-breadcrumb-separator.component.js.map +1 -1
  128. package/src/lib/navigation/breadcrumb/tng-breadcrumb.component.d.ts.map +1 -1
  129. package/src/lib/navigation/breadcrumb/tng-breadcrumb.component.js +0 -1
  130. package/src/lib/navigation/breadcrumb/tng-breadcrumb.component.js.map +1 -1
  131. package/src/lib/navigation/context-menu/tng-context-menu.component.d.ts.map +1 -1
  132. package/src/lib/navigation/context-menu/tng-context-menu.component.js +0 -1
  133. package/src/lib/navigation/context-menu/tng-context-menu.component.js.map +1 -1
  134. package/src/lib/navigation/dropdown-menu/tng-dropdown-menu.component.d.ts.map +1 -1
  135. package/src/lib/navigation/dropdown-menu/tng-dropdown-menu.component.js +0 -1
  136. package/src/lib/navigation/dropdown-menu/tng-dropdown-menu.component.js.map +1 -1
  137. package/src/lib/navigation/menu/tng-menu-trigger-for.directive.d.ts.map +1 -1
  138. package/src/lib/navigation/menu/tng-menu-trigger-for.directive.js +0 -1
  139. package/src/lib/navigation/menu/tng-menu-trigger-for.directive.js.map +1 -1
  140. package/src/lib/navigation/menu/tng-menu.component.d.ts.map +1 -1
  141. package/src/lib/navigation/menu/tng-menu.component.js +0 -1
  142. package/src/lib/navigation/menu/tng-menu.component.js.map +1 -1
  143. package/src/lib/navigation/menubar/tng-menubar.component.d.ts.map +1 -1
  144. package/src/lib/navigation/menubar/tng-menubar.component.js +0 -1
  145. package/src/lib/navigation/menubar/tng-menubar.component.js.map +1 -1
  146. package/src/lib/navigation/navigation-menu/tng-navigation-menu.component.d.ts.map +1 -1
  147. package/src/lib/navigation/navigation-menu/tng-navigation-menu.component.js +0 -1
  148. package/src/lib/navigation/navigation-menu/tng-navigation-menu.component.js.map +1 -1
  149. package/src/lib/navigation/tabs/tng-tabs.component.d.ts.map +1 -1
  150. package/src/lib/navigation/tabs/tng-tabs.component.js +0 -1
  151. package/src/lib/navigation/tabs/tng-tabs.component.js.map +1 -1
  152. package/src/lib/navigation/toolbar/tng-toolbar.component.d.ts.map +1 -1
  153. package/src/lib/navigation/toolbar/tng-toolbar.component.js +0 -1
  154. package/src/lib/navigation/toolbar/tng-toolbar.component.js.map +1 -1
  155. package/src/lib/overlay/dialog/tng-dialog.component.d.ts.map +1 -1
  156. package/src/lib/overlay/dialog/tng-dialog.component.js +0 -1
  157. package/src/lib/overlay/dialog/tng-dialog.component.js.map +1 -1
  158. package/src/lib/overlay/popover/tng-popover.component.d.ts.map +1 -1
  159. package/src/lib/overlay/popover/tng-popover.component.js +0 -1
  160. package/src/lib/overlay/popover/tng-popover.component.js.map +1 -1
  161. package/src/lib/overlay/tooltip/tng-tooltip.component.d.ts.map +1 -1
  162. package/src/lib/overlay/tooltip/tng-tooltip.component.js +0 -1
  163. package/src/lib/overlay/tooltip/tng-tooltip.component.js.map +1 -1
  164. package/src/lib/utility/avatar/tng-avatar.component.d.ts.map +1 -1
  165. package/src/lib/utility/avatar/tng-avatar.component.js +0 -1
  166. package/src/lib/utility/avatar/tng-avatar.component.js.map +1 -1
  167. package/src/lib/utility/badge/tng-badge.component.d.ts.map +1 -1
  168. package/src/lib/utility/badge/tng-badge.component.js +0 -1
  169. package/src/lib/utility/badge/tng-badge.component.js.map +1 -1
  170. package/src/lib/utility/button/tng-button.component.d.ts.map +1 -1
  171. package/src/lib/utility/button/tng-button.component.js +0 -1
  172. package/src/lib/utility/button/tng-button.component.js.map +1 -1
  173. package/src/lib/utility/code-block/tng-code-block.component.d.ts.map +1 -1
  174. package/src/lib/utility/code-block/tng-code-block.component.js +0 -1
  175. package/src/lib/utility/code-block/tng-code-block.component.js.map +1 -1
  176. package/src/lib/utility/copy-button/tng-copy-button.component.d.ts.map +1 -1
  177. package/src/lib/utility/copy-button/tng-copy-button.component.js +0 -1
  178. package/src/lib/utility/copy-button/tng-copy-button.component.js.map +1 -1
  179. package/src/lib/utility/tag/tng-tag.component.d.ts.map +1 -1
  180. package/src/lib/utility/tag/tng-tag.component.js +0 -1
  181. package/src/lib/utility/tag/tng-tag.component.js.map +1 -1
  182. package/src/lib/utility/tree/tng-tree.component.d.ts.map +1 -1
  183. package/src/lib/utility/tree/tng-tree.component.js +0 -1
  184. package/src/lib/utility/tree/tng-tree.component.js.map +1 -1
@@ -0,0 +1,684 @@
1
+ import { __decorate } from "tslib";
2
+ import { Component, ElementRef, HostBinding, LOCALE_ID, computed, effect, inject, input, output, signal, viewChild, } from '@angular/core';
3
+ import { booleanAttribute } from '@angular/core';
4
+ import { computeOverlayPosition, } from '@tailng-ui/cdk';
5
+ import { createDatepickerController, } from '@tailng-ui/primitives';
6
+ const OVERLAY_VIEWPORT_MARGIN = 12;
7
+ const OVERLAY_OFFSET = 9;
8
+ function rectFromClientRect(rect) {
9
+ return {
10
+ height: rect.height,
11
+ left: rect.left,
12
+ top: rect.top,
13
+ width: rect.width,
14
+ };
15
+ }
16
+ function viewportRect(windowRef) {
17
+ return {
18
+ height: windowRef.innerHeight || 768,
19
+ left: 0,
20
+ top: 0,
21
+ width: windowRef.innerWidth || 1024,
22
+ };
23
+ }
24
+ function normalizeOptionalBooleanInput(value) {
25
+ if (value === null || value === undefined) {
26
+ return undefined;
27
+ }
28
+ return booleanAttribute(value);
29
+ }
30
+ function normalizeNumberInput(value) {
31
+ return typeof value === 'number' ? value : Number(value);
32
+ }
33
+ function normalizeWeekdayInput(value) {
34
+ const normalized = Math.max(0, Math.min(6, Math.trunc(normalizeNumberInput(value))));
35
+ return normalized;
36
+ }
37
+ function isKeyboardEventTarget(value) {
38
+ return value instanceof HTMLElement;
39
+ }
40
+ let nextDatepickerInputId = 0;
41
+ function createDatepickerInputId() {
42
+ nextDatepickerInputId += 1;
43
+ return `tng-datepicker-input-${nextDatepickerInputId}`;
44
+ }
45
+ let TngDatepickerComponent = class TngDatepickerComponent {
46
+ hostElement = inject(ElementRef);
47
+ defaultLocale = inject(LOCALE_ID);
48
+ fallbackInputId = createDatepickerInputId();
49
+ ownerDocument = this.hostElement.nativeElement.ownerDocument ?? null;
50
+ ownerWindow = this.ownerDocument?.defaultView ?? null;
51
+ renderVersion = signal(0);
52
+ overlayOpen = signal(false);
53
+ resolvedOverlayPlacement = signal('bottom');
54
+ anchorRef = viewChild('anchorShell');
55
+ triggerRef = viewChild('triggerButton');
56
+ overlayRef = viewChild('overlayPanel');
57
+ overlayPlaceholder = null;
58
+ overlayOriginalParent = null;
59
+ removeResizeListener = null;
60
+ removeScrollListener = null;
61
+ resizeObserver = null;
62
+ overlayLayoutFrame = null;
63
+ appliedInitialState = false;
64
+ controller = createDatepickerController({
65
+ allowManualInput: true,
66
+ autoCommitView: false,
67
+ closeOnEscape: true,
68
+ closeOnOutsideClick: true,
69
+ closeOnSelect: true,
70
+ locale: this.defaultLocale,
71
+ ownerDocument: this.ownerDocument,
72
+ restoreFocus: true,
73
+ showOutsideDays: true,
74
+ trapFocus: true,
75
+ value: null,
76
+ });
77
+ unsubscribe = this.controller.subscribe((event) => {
78
+ this.renderVersion.update((value) => value + 1);
79
+ switch (event.type) {
80
+ case 'activeChange':
81
+ this.activeDateChange.emit(event.activeDate);
82
+ break;
83
+ case 'closed':
84
+ this.overlayOpen.set(false);
85
+ this.openChange.emit(false);
86
+ this.closed.emit(event.reason);
87
+ break;
88
+ case 'monthChange':
89
+ this.monthChange.emit(event.visibleMonth);
90
+ break;
91
+ case 'opened':
92
+ this.overlayOpen.set(true);
93
+ this.openChange.emit(true);
94
+ this.queueOverlayFocusSync();
95
+ break;
96
+ case 'valueChange':
97
+ this.valueChange.emit(event.value);
98
+ break;
99
+ case 'viewChange':
100
+ this.viewChange.emit(event.view);
101
+ break;
102
+ case 'yearChange':
103
+ this.yearChange.emit(event.year);
104
+ break;
105
+ }
106
+ });
107
+ adapter = input(undefined);
108
+ allowDeselect = input(false, {
109
+ transform: booleanAttribute,
110
+ });
111
+ allowManualInput = input(true, {
112
+ transform: booleanAttribute,
113
+ });
114
+ ariaDescribedBy = input(null);
115
+ ariaLabel = input(null);
116
+ ariaLabelledBy = input(null);
117
+ autoCommitView = input(false, {
118
+ transform: booleanAttribute,
119
+ });
120
+ closeOnEscape = input(true, {
121
+ transform: booleanAttribute,
122
+ });
123
+ closeOnOutsideClick = input(true, {
124
+ transform: booleanAttribute,
125
+ });
126
+ closeOnSelect = input(true, {
127
+ transform: booleanAttribute,
128
+ });
129
+ closeOthersOnOpen = input(false, {
130
+ transform: booleanAttribute,
131
+ });
132
+ defaultOpen = input(false, {
133
+ transform: booleanAttribute,
134
+ });
135
+ defaultValue = input(undefined);
136
+ direction = input('ltr');
137
+ disableDate = input(null);
138
+ disabled = input(false, {
139
+ transform: booleanAttribute,
140
+ });
141
+ fullWidth = input(true, {
142
+ transform: booleanAttribute,
143
+ });
144
+ id = input(null);
145
+ inputAriaLabel = input('Date input');
146
+ invalid = input(false, {
147
+ transform: booleanAttribute,
148
+ });
149
+ locale = input(this.defaultLocale);
150
+ maxDate = input(undefined);
151
+ minDate = input(undefined);
152
+ open = input(undefined, {
153
+ transform: normalizeOptionalBooleanInput,
154
+ });
155
+ overlaySize = input(320, {
156
+ transform: normalizeNumberInput,
157
+ });
158
+ placement = input('auto');
159
+ placeholder = input('MM-DD-YYYY');
160
+ readonly = input(false, {
161
+ transform: booleanAttribute,
162
+ });
163
+ restoreFocus = input(true, {
164
+ transform: booleanAttribute,
165
+ });
166
+ selectionMode = input('single');
167
+ showOutsideDays = input(true, {
168
+ transform: booleanAttribute,
169
+ });
170
+ today = input(undefined);
171
+ trapFocus = input(true, {
172
+ transform: booleanAttribute,
173
+ });
174
+ value = input(undefined);
175
+ weekStartsOn = input(0, {
176
+ transform: normalizeWeekdayInput,
177
+ });
178
+ yearPageSize = input(24, {
179
+ transform: normalizeNumberInput,
180
+ });
181
+ activeDateChange = output();
182
+ closed = output();
183
+ monthChange = output();
184
+ openChange = output();
185
+ valueChange = output();
186
+ viewChange = output();
187
+ yearChange = output();
188
+ outputs = computed(() => {
189
+ this.renderVersion();
190
+ return this.controller.getOutputs();
191
+ });
192
+ invalidState = computed(() => this.invalid() || this.outputs().validationError !== null);
193
+ currentOverlayPlacement = computed(() => this.resolvedOverlayPlacement());
194
+ materialPeriodLabel = computed(() => {
195
+ const outputs = this.outputs();
196
+ if (outputs.view === 'year') {
197
+ const startYear = outputs.yearOptions[0]?.year;
198
+ const endYear = outputs.yearOptions[outputs.yearOptions.length - 1]?.year;
199
+ if (startYear !== undefined && endYear !== undefined) {
200
+ return `${startYear} - ${endYear}`;
201
+ }
202
+ }
203
+ if (outputs.view === 'month') {
204
+ return this.controller.formatDate(outputs.visibleMonth, 'year-label');
205
+ }
206
+ return outputs.labelMonthYear;
207
+ });
208
+ get dataFullWidth() {
209
+ return this.fullWidth() ? '' : null;
210
+ }
211
+ constructor() {
212
+ effect(() => {
213
+ const trigger = this.triggerRef()?.nativeElement ?? null;
214
+ this.controller.registerTrigger(trigger);
215
+ });
216
+ effect(() => {
217
+ const overlay = this.overlayRef()?.nativeElement ?? null;
218
+ this.controller.registerOverlay(overlay);
219
+ this.initializeOverlayPortal(overlay);
220
+ this.renderVersion.update((value) => value + 1);
221
+ });
222
+ effect(() => {
223
+ const overlay = this.overlayRef()?.nativeElement;
224
+ if (overlay === undefined) {
225
+ return;
226
+ }
227
+ if (this.overlayOpen()) {
228
+ this.mountOverlayToBodyAndPosition();
229
+ return;
230
+ }
231
+ this.restoreOverlayToPlaceholder();
232
+ });
233
+ effect(() => {
234
+ this.placement();
235
+ this.direction();
236
+ this.overlaySize();
237
+ if (!this.overlayOpen()) {
238
+ return;
239
+ }
240
+ this.scheduleOverlayLayoutSync();
241
+ });
242
+ effect(() => {
243
+ this.controller.setConfig({
244
+ adapter: this.adapter(),
245
+ allowDeselect: this.allowDeselect(),
246
+ allowManualInput: this.allowManualInput(),
247
+ ariaDescribedBy: this.ariaDescribedBy(),
248
+ ariaLabel: this.ariaLabel(),
249
+ ariaLabelledBy: this.ariaLabelledBy(),
250
+ autoCommitView: this.autoCommitView(),
251
+ closeOnEscape: this.closeOnEscape(),
252
+ closeOnOutsideClick: this.closeOnOutsideClick(),
253
+ closeOnSelect: this.closeOnSelect(),
254
+ closeOthersOnOpen: this.closeOthersOnOpen(),
255
+ direction: this.direction(),
256
+ disableDate: this.disableDate() ?? undefined,
257
+ disabled: this.disabled(),
258
+ id: this.id() ?? undefined,
259
+ locale: this.locale(),
260
+ maxDate: this.maxDate(),
261
+ minDate: this.minDate(),
262
+ overlaySize: this.overlaySize(),
263
+ ownerDocument: this.ownerDocument,
264
+ restoreFocus: this.restoreFocus(),
265
+ selectionMode: this.selectionMode(),
266
+ showOutsideDays: this.showOutsideDays(),
267
+ today: this.today(),
268
+ trapFocus: this.trapFocus(),
269
+ weekStartsOn: this.weekStartsOn(),
270
+ yearPageSize: this.yearPageSize(),
271
+ });
272
+ const controlledValue = this.value();
273
+ if (controlledValue !== undefined) {
274
+ this.controller.setValue(controlledValue);
275
+ }
276
+ const controlledOpen = this.open();
277
+ const currentOpen = this.controller.getOutputs().open;
278
+ if (controlledOpen !== undefined) {
279
+ this.controller.setOpen(controlledOpen);
280
+ }
281
+ if (!this.appliedInitialState) {
282
+ if (controlledValue === undefined && this.defaultValue() !== undefined) {
283
+ this.controller.setValue(this.defaultValue());
284
+ }
285
+ if (controlledOpen === undefined && this.defaultOpen()) {
286
+ this.controller.setOpen(true);
287
+ }
288
+ this.appliedInitialState = true;
289
+ }
290
+ });
291
+ }
292
+ ngOnDestroy() {
293
+ if (this.overlayLayoutFrame !== null && this.ownerWindow !== null) {
294
+ this.ownerWindow.cancelAnimationFrame(this.overlayLayoutFrame);
295
+ this.overlayLayoutFrame = null;
296
+ }
297
+ this.teardownOverlayRepositionListeners();
298
+ this.restoreOverlayToPlaceholder(true);
299
+ this.unsubscribe();
300
+ this.controller.destroy();
301
+ }
302
+ clear() {
303
+ this.controller.clear();
304
+ this.controller.showDaysPanel();
305
+ this.queueOverlayFocusSync();
306
+ }
307
+ close(reason = 'programmatic') {
308
+ this.controller.close(reason);
309
+ }
310
+ openDatepicker() {
311
+ this.controller.open();
312
+ }
313
+ showDaysPanel() {
314
+ this.controller.showDaysPanel();
315
+ this.queueOverlayFocusSync();
316
+ }
317
+ showMonthsPanel() {
318
+ this.controller.showMonthsPanel();
319
+ this.queueOverlayFocusSync();
320
+ }
321
+ showYearsPanel() {
322
+ this.controller.showYearsPanel();
323
+ this.queueOverlayFocusSync();
324
+ }
325
+ toggleOpen() {
326
+ this.controller.toggleOpen();
327
+ }
328
+ resolveInputId() {
329
+ const id = this.id()?.trim();
330
+ if (id !== undefined && id !== '') {
331
+ return `${id}-input`;
332
+ }
333
+ return this.fallbackInputId;
334
+ }
335
+ isDayView() {
336
+ return this.outputs().view === 'day';
337
+ }
338
+ isMonthView() {
339
+ return this.outputs().view === 'month';
340
+ }
341
+ isYearView() {
342
+ return this.outputs().view === 'year';
343
+ }
344
+ onDayCellClick(cell) {
345
+ if (cell.disabled || cell.hidden) {
346
+ return;
347
+ }
348
+ this.controller.handleCellClick(cell.date);
349
+ }
350
+ onInputBlur() {
351
+ if (!this.allowManualInput()) {
352
+ return;
353
+ }
354
+ this.controller.commitInputText();
355
+ this.renderVersion.update((value) => value + 1);
356
+ }
357
+ onInputChange(event) {
358
+ if (!this.allowManualInput()) {
359
+ return;
360
+ }
361
+ const target = event.target;
362
+ if (!(target instanceof HTMLInputElement)) {
363
+ return;
364
+ }
365
+ this.controller.setInputText(target.value);
366
+ this.renderVersion.update((value) => value + 1);
367
+ }
368
+ onInputKeydown(event) {
369
+ if (event.key === 'Enter' && this.allowManualInput()) {
370
+ event.preventDefault();
371
+ this.controller.commitInputText();
372
+ this.renderVersion.update((value) => value + 1);
373
+ return;
374
+ }
375
+ if (event.key === 'ArrowDown' && !this.outputs().open) {
376
+ event.preventDefault();
377
+ this.controller.open();
378
+ }
379
+ }
380
+ onGridKeydown(event) {
381
+ this.controller.handleGridKeyDown(event);
382
+ if (this.shouldSyncOverlayFocusAfterPickerKey(event.key)) {
383
+ this.queueOverlayFocusSync();
384
+ }
385
+ }
386
+ onMonthKeydown(event) {
387
+ this.controller.handleMonthGridKeyDown(event);
388
+ if (this.isPickerActivationKey(event.key)) {
389
+ this.controller.showDaysPanel();
390
+ }
391
+ if (this.shouldSyncOverlayFocusAfterPickerKey(event.key)) {
392
+ this.queueOverlayFocusSync();
393
+ }
394
+ }
395
+ onMonthOptionClick(option) {
396
+ if (option.disabled) {
397
+ return;
398
+ }
399
+ this.controller.selectMonth(option.index);
400
+ this.controller.showDaysPanel();
401
+ this.queueOverlayFocusSync();
402
+ }
403
+ onOverlayKeydown(event) {
404
+ this.controller.handleOverlayKeyDown(event);
405
+ }
406
+ onTriggerClick() {
407
+ if (this.disabled()) {
408
+ return;
409
+ }
410
+ this.controller.toggleOpen();
411
+ }
412
+ onTriggerKeydown(event) {
413
+ this.controller.handleTriggerKeyDown(event);
414
+ }
415
+ onPeriodButtonClick() {
416
+ if (this.isYearView()) {
417
+ return;
418
+ }
419
+ this.controller.showYearsPanel();
420
+ this.queueOverlayFocusSync();
421
+ }
422
+ onYearKeydown(event) {
423
+ this.controller.handleYearGridKeyDown(event);
424
+ if (this.isPickerActivationKey(event.key)) {
425
+ this.controller.showMonthsPanel();
426
+ }
427
+ if (this.shouldSyncOverlayFocusAfterPickerKey(event.key)) {
428
+ this.queueOverlayFocusSync();
429
+ }
430
+ }
431
+ onYearOptionClick(option) {
432
+ if (option.disabled) {
433
+ return;
434
+ }
435
+ this.controller.selectYear(option.year);
436
+ this.controller.showMonthsPanel();
437
+ this.queueOverlayFocusSync();
438
+ }
439
+ pageBackward() {
440
+ if (this.isDayView()) {
441
+ this.controller.prevMonth();
442
+ this.queueOverlayFocusSync();
443
+ return;
444
+ }
445
+ if (this.isMonthView() || this.isYearView()) {
446
+ this.controller.prevYear();
447
+ this.queueOverlayFocusSync();
448
+ return;
449
+ }
450
+ }
451
+ pageForward() {
452
+ if (this.isDayView()) {
453
+ this.controller.nextMonth();
454
+ this.queueOverlayFocusSync();
455
+ return;
456
+ }
457
+ if (this.isMonthView() || this.isYearView()) {
458
+ this.controller.nextYear();
459
+ this.queueOverlayFocusSync();
460
+ return;
461
+ }
462
+ }
463
+ queueOverlayFocusSync() {
464
+ this.scheduleOverlayLayoutSync();
465
+ queueMicrotask(() => {
466
+ const focusActiveTarget = () => {
467
+ const outputs = this.outputs();
468
+ if (!outputs.open || this.ownerDocument === null) {
469
+ return;
470
+ }
471
+ const targetId = this.resolveCurrentFocusTargetId(outputs);
472
+ if (targetId === null) {
473
+ return;
474
+ }
475
+ const target = this.ownerDocument.getElementById(targetId);
476
+ if (!isKeyboardEventTarget(target)) {
477
+ return;
478
+ }
479
+ target.focus();
480
+ };
481
+ if (typeof requestAnimationFrame === 'function') {
482
+ requestAnimationFrame(() => {
483
+ focusActiveTarget();
484
+ });
485
+ return;
486
+ }
487
+ setTimeout(() => {
488
+ focusActiveTarget();
489
+ }, 0);
490
+ });
491
+ }
492
+ resolveCurrentFocusTargetId(outputs) {
493
+ if (outputs.view === 'day') {
494
+ return outputs.cells.find((cell) => cell.active)?.id ?? null;
495
+ }
496
+ if (outputs.view === 'month') {
497
+ return outputs.monthOptions.find((option) => option.active)?.id ?? null;
498
+ }
499
+ if (outputs.view === 'year') {
500
+ return outputs.yearOptions.find((option) => option.active)?.id ?? null;
501
+ }
502
+ return null;
503
+ }
504
+ shouldSyncOverlayFocusAfterPickerKey(key) {
505
+ return (key === 'ArrowUp' ||
506
+ key === 'ArrowDown' ||
507
+ key === 'ArrowLeft' ||
508
+ key === 'ArrowRight' ||
509
+ key === 'Home' ||
510
+ key === 'End' ||
511
+ key === 'PageUp' ||
512
+ key === 'PageDown' ||
513
+ key === 'Enter' ||
514
+ key === ' ' ||
515
+ key === 'Escape');
516
+ }
517
+ isPickerActivationKey(key) {
518
+ return key === 'Enter' || key === ' ';
519
+ }
520
+ scheduleOverlayLayoutSync() {
521
+ if (!this.overlayOpen() || this.ownerWindow === null) {
522
+ return;
523
+ }
524
+ if (this.overlayLayoutFrame !== null) {
525
+ this.ownerWindow.cancelAnimationFrame(this.overlayLayoutFrame);
526
+ }
527
+ this.overlayLayoutFrame = this.ownerWindow.requestAnimationFrame(() => {
528
+ this.overlayLayoutFrame = null;
529
+ this.positionOverlay();
530
+ });
531
+ }
532
+ initializeOverlayPortal(overlay) {
533
+ if (overlay === null || this.overlayPlaceholder !== null) {
534
+ return;
535
+ }
536
+ const placeholderDocument = this.ownerDocument ?? document;
537
+ this.overlayPlaceholder = placeholderDocument.createComment('tng-datepicker-overlay-anchor');
538
+ this.overlayOriginalParent = overlay.parentNode;
539
+ this.overlayOriginalParent?.insertBefore(this.overlayPlaceholder, overlay);
540
+ }
541
+ positionOverlay() {
542
+ const overlay = this.overlayRef()?.nativeElement;
543
+ const anchor = this.anchorRef()?.nativeElement;
544
+ if (overlay === undefined || anchor === undefined || this.ownerWindow === null) {
545
+ return;
546
+ }
547
+ const anchorRect = rectFromClientRect(anchor.getBoundingClientRect());
548
+ const viewport = viewportRect(this.ownerWindow);
549
+ const width = Math.max(0, Math.min(anchorRect.width, viewport.width - OVERLAY_VIEWPORT_MARGIN * 2));
550
+ overlay.style.width = `${width}px`;
551
+ overlay.style.maxWidth = `${Math.max(0, viewport.width - OVERLAY_VIEWPORT_MARGIN * 2)}px`;
552
+ overlay.style.maxHeight = '';
553
+ const overlayRect = rectFromClientRect(overlay.getBoundingClientRect());
554
+ const result = computeOverlayPosition({
555
+ anchorRect,
556
+ collision: this.resolveOverlayCollision(this.placement()),
557
+ direction: this.direction(),
558
+ offset: this.resolveOverlayOffset(),
559
+ overlayRect,
560
+ placement: this.resolveOverlayPlacement(this.placement()),
561
+ viewportRect: viewport,
562
+ });
563
+ overlay.style.left = `${result.x}px`;
564
+ overlay.style.top = `${result.y}px`;
565
+ const anchorBottom = anchorRect.top + anchorRect.height;
566
+ const availableHeight = result.side === 'top'
567
+ ? Math.max(0, Math.floor(anchorRect.top - OVERLAY_VIEWPORT_MARGIN - OVERLAY_OFFSET))
568
+ : Math.max(0, Math.floor(viewport.height - anchorBottom - OVERLAY_VIEWPORT_MARGIN - OVERLAY_OFFSET));
569
+ if (availableHeight > 0) {
570
+ overlay.style.maxHeight = `${availableHeight}px`;
571
+ }
572
+ this.resolvedOverlayPlacement.set(result.side === 'top' ? 'top' : 'bottom');
573
+ overlay.style.visibility = '';
574
+ }
575
+ mountOverlayToBodyAndPosition() {
576
+ const overlay = this.overlayRef()?.nativeElement;
577
+ if (overlay === undefined || this.ownerDocument === null) {
578
+ return;
579
+ }
580
+ this.initializeOverlayPortal(overlay);
581
+ this.setupOverlayRepositionListeners();
582
+ if (overlay.parentNode !== this.ownerDocument.body) {
583
+ this.ownerDocument.body.appendChild(overlay);
584
+ }
585
+ overlay.style.position = 'fixed';
586
+ overlay.style.left = '0px';
587
+ overlay.style.top = '0px';
588
+ overlay.style.visibility = 'hidden';
589
+ overlay.style.zIndex = '1000';
590
+ queueMicrotask(() => {
591
+ if (!this.overlayOpen()) {
592
+ return;
593
+ }
594
+ this.positionOverlay();
595
+ });
596
+ }
597
+ restoreOverlayToPlaceholder(force = false) {
598
+ const overlay = this.overlayRef()?.nativeElement;
599
+ if (overlay === undefined) {
600
+ return;
601
+ }
602
+ if (!force && overlay.parentNode !== this.ownerDocument?.body) {
603
+ return;
604
+ }
605
+ const placeholder = this.overlayPlaceholder;
606
+ if (placeholder?.parentNode !== null && placeholder !== null) {
607
+ placeholder.parentNode.insertBefore(overlay, placeholder);
608
+ }
609
+ else if (this.overlayOriginalParent !== null) {
610
+ this.overlayOriginalParent.appendChild(overlay);
611
+ }
612
+ this.teardownOverlayRepositionListeners();
613
+ this.resolvedOverlayPlacement.set(this.placement() === 'top' ? 'top' : 'bottom');
614
+ overlay.style.left = '';
615
+ overlay.style.maxHeight = '';
616
+ overlay.style.maxWidth = '';
617
+ overlay.style.position = '';
618
+ overlay.style.top = '';
619
+ overlay.style.visibility = '';
620
+ overlay.style.width = '';
621
+ overlay.style.zIndex = '';
622
+ }
623
+ setupOverlayRepositionListeners() {
624
+ if (this.ownerWindow === null || this.removeResizeListener !== null || this.removeScrollListener !== null) {
625
+ return;
626
+ }
627
+ const schedule = () => {
628
+ this.scheduleOverlayLayoutSync();
629
+ };
630
+ this.ownerWindow.addEventListener('resize', schedule);
631
+ this.ownerWindow.addEventListener('scroll', schedule, true);
632
+ this.removeResizeListener = () => this.ownerWindow?.removeEventListener('resize', schedule);
633
+ this.removeScrollListener = () => this.ownerWindow?.removeEventListener('scroll', schedule, true);
634
+ if ('ResizeObserver' in this.ownerWindow) {
635
+ this.resizeObserver = new this.ownerWindow.ResizeObserver(() => {
636
+ this.scheduleOverlayLayoutSync();
637
+ });
638
+ const anchor = this.anchorRef()?.nativeElement;
639
+ if (anchor !== undefined) {
640
+ this.resizeObserver.observe(anchor);
641
+ }
642
+ const overlay = this.overlayRef()?.nativeElement;
643
+ if (overlay !== undefined) {
644
+ this.resizeObserver.observe(overlay);
645
+ }
646
+ }
647
+ }
648
+ teardownOverlayRepositionListeners() {
649
+ this.removeResizeListener?.();
650
+ this.removeScrollListener?.();
651
+ this.removeResizeListener = null;
652
+ this.removeScrollListener = null;
653
+ this.resizeObserver?.disconnect();
654
+ this.resizeObserver = null;
655
+ }
656
+ resolveOverlayCollision(placement) {
657
+ return {
658
+ flip: placement === 'auto',
659
+ padding: OVERLAY_VIEWPORT_MARGIN,
660
+ shift: true,
661
+ };
662
+ }
663
+ resolveOverlayOffset() {
664
+ return { side: OVERLAY_OFFSET };
665
+ }
666
+ resolveOverlayPlacement(placement) {
667
+ return {
668
+ align: 'start',
669
+ side: placement === 'top' ? 'top' : 'bottom',
670
+ };
671
+ }
672
+ };
673
+ __decorate([
674
+ HostBinding('attr.data-full-width')
675
+ ], TngDatepickerComponent.prototype, "dataFullWidth", null);
676
+ TngDatepickerComponent = __decorate([
677
+ Component({
678
+ selector: 'tng-datepicker',
679
+ templateUrl: './tng-datepicker.component.html',
680
+ styleUrl: './tng-datepicker.component.css',
681
+ })
682
+ ], TngDatepickerComponent);
683
+ export { TngDatepickerComponent };
684
+ //# sourceMappingURL=tng-datepicker.component.js.map