@tailng-ui/primitives 0.54.0 → 0.56.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 (63) hide show
  1. package/package.json +2 -2
  2. package/src/lib/form/date-range-picker/__tests__/tng-date-range-picker.test-helpers.d.ts +25 -0
  3. package/src/lib/form/date-range-picker/__tests__/tng-date-range-picker.test-helpers.d.ts.map +1 -0
  4. package/src/lib/form/date-range-picker/__tests__/tng-date-range-picker.test-helpers.js +109 -0
  5. package/src/lib/form/date-range-picker/__tests__/tng-date-range-picker.test-helpers.js.map +1 -0
  6. package/src/lib/form/date-range-picker/date-range-picker.adapters.d.ts +5 -0
  7. package/src/lib/form/date-range-picker/date-range-picker.adapters.d.ts.map +1 -0
  8. package/src/lib/form/date-range-picker/date-range-picker.adapters.js +9 -0
  9. package/src/lib/form/date-range-picker/date-range-picker.adapters.js.map +1 -0
  10. package/src/lib/form/date-range-picker/date-range-picker.state.d.ts +10 -0
  11. package/src/lib/form/date-range-picker/date-range-picker.state.d.ts.map +1 -0
  12. package/src/lib/form/date-range-picker/date-range-picker.state.js +35 -0
  13. package/src/lib/form/date-range-picker/date-range-picker.state.js.map +1 -0
  14. package/src/lib/form/date-range-picker/date-range-picker.types.d.ts +280 -0
  15. package/src/lib/form/date-range-picker/date-range-picker.types.d.ts.map +1 -0
  16. package/src/lib/form/date-range-picker/date-range-picker.types.js +1 -0
  17. package/src/lib/form/date-range-picker/date-range-picker.types.js.map +1 -0
  18. package/src/lib/form/date-range-picker/date-range-picker.utils.d.ts +54 -0
  19. package/src/lib/form/date-range-picker/date-range-picker.utils.d.ts.map +1 -0
  20. package/src/lib/form/date-range-picker/date-range-picker.utils.js +37 -0
  21. package/src/lib/form/date-range-picker/date-range-picker.utils.js.map +1 -0
  22. package/src/lib/form/date-range-picker/index.d.ts +7 -0
  23. package/src/lib/form/date-range-picker/index.d.ts.map +1 -0
  24. package/src/lib/form/date-range-picker/index.js +7 -0
  25. package/src/lib/form/date-range-picker/index.js.map +1 -0
  26. package/src/lib/form/date-range-picker/tng-date-range-picker.d.ts +5 -0
  27. package/src/lib/form/date-range-picker/tng-date-range-picker.d.ts.map +1 -0
  28. package/src/lib/form/date-range-picker/tng-date-range-picker.js +1970 -0
  29. package/src/lib/form/date-range-picker/tng-date-range-picker.js.map +1 -0
  30. package/src/lib/form/date-range-picker/tng-date-range-picker.overlay.d.ts +87 -0
  31. package/src/lib/form/date-range-picker/tng-date-range-picker.overlay.d.ts.map +1 -0
  32. package/src/lib/form/date-range-picker/tng-date-range-picker.overlay.js +447 -0
  33. package/src/lib/form/date-range-picker/tng-date-range-picker.overlay.js.map +1 -0
  34. package/src/lib/form/date-range-picker/tng-date-range-picker.parts.d.ts +3155 -0
  35. package/src/lib/form/date-range-picker/tng-date-range-picker.parts.d.ts.map +1 -0
  36. package/src/lib/form/date-range-picker/tng-date-range-picker.parts.js +940 -0
  37. package/src/lib/form/date-range-picker/tng-date-range-picker.parts.js.map +1 -0
  38. package/src/lib/form/datepicker/datepicker.adapters.d.ts.map +1 -1
  39. package/src/lib/form/datepicker/datepicker.adapters.js +4 -189
  40. package/src/lib/form/datepicker/datepicker.adapters.js.map +1 -1
  41. package/src/lib/form/datepicker/datepicker.state.d.ts.map +1 -1
  42. package/src/lib/form/datepicker/datepicker.state.js +7 -86
  43. package/src/lib/form/datepicker/datepicker.state.js.map +1 -1
  44. package/src/lib/form/datepicker/datepicker.utils.d.ts +6 -28
  45. package/src/lib/form/datepicker/datepicker.utils.d.ts.map +1 -1
  46. package/src/lib/form/datepicker/datepicker.utils.js +14 -228
  47. package/src/lib/form/datepicker/datepicker.utils.js.map +1 -1
  48. package/src/lib/form/index.d.ts +2 -0
  49. package/src/lib/form/index.d.ts.map +1 -1
  50. package/src/lib/form/index.js +2 -0
  51. package/src/lib/form/index.js.map +1 -1
  52. package/src/lib/form/number-range/index.d.ts +3 -0
  53. package/src/lib/form/number-range/index.d.ts.map +1 -0
  54. package/src/lib/form/number-range/index.js +3 -0
  55. package/src/lib/form/number-range/index.js.map +1 -0
  56. package/src/lib/form/number-range/tng-number-range.d.ts +26 -0
  57. package/src/lib/form/number-range/tng-number-range.d.ts.map +1 -0
  58. package/src/lib/form/number-range/tng-number-range.js +49 -0
  59. package/src/lib/form/number-range/tng-number-range.js.map +1 -0
  60. package/src/lib/form/number-range/tng-number-range.types.d.ts +12 -0
  61. package/src/lib/form/number-range/tng-number-range.types.d.ts.map +1 -0
  62. package/src/lib/form/number-range/tng-number-range.types.js +1 -0
  63. package/src/lib/form/number-range/tng-number-range.types.js.map +1 -0
@@ -0,0 +1,447 @@
1
+ import { DestroyRef, Directive, ElementRef, HostBinding, HostListener, effect, inject, input, signal, } from '@angular/core';
2
+ import { applyFixedPortalledOverlayBaseStyles, clearFixedPortalledOverlayBaseStyles, clearPortalledThemeVars, createTngIdFactory, getGlobalScrollLockManager, positionFixedAnchoredOverlay, resolveCssCustomPropertyPx, syncPortalledThemeVars, } from '@tailng-ui/cdk';
3
+ import * as i0 from "@angular/core";
4
+ const PORTALLED_DATEPICKER_THEME_VARS = [
5
+ '--tng-date-range-picker-radius',
6
+ '--tng-date-range-picker-field-height',
7
+ '--tng-date-range-picker-overlay-gap',
8
+ '--tng-date-range-picker-day-cell-size',
9
+ '--tng-date-range-picker-picker-cell-size',
10
+ '--tng-date-range-picker-grid-gap',
11
+ '--tng-date-range-picker-inline-gap',
12
+ '--tng-date-range-picker-overlay-padding',
13
+ '--tng-date-range-picker-nav-size',
14
+ '--tng-date-range-picker-border',
15
+ '--tng-date-range-picker-border-strong',
16
+ '--tng-date-range-picker-bg',
17
+ '--tng-date-range-picker-surface',
18
+ '--tng-date-range-picker-canvas',
19
+ '--tng-date-range-picker-fg',
20
+ '--tng-date-range-picker-muted',
21
+ '--tng-date-range-picker-brand',
22
+ '--tng-date-range-picker-danger',
23
+ '--tng-date-range-picker-focus',
24
+ '--tng-date-range-picker-shadow',
25
+ '--tng-date-range-picker-focus-shadow',
26
+ '--tng-date-range-picker-ease',
27
+ '--tng-semantic-background-base',
28
+ '--tng-semantic-background-surface',
29
+ '--tng-semantic-background-canvas',
30
+ '--tng-semantic-border-subtle',
31
+ '--tng-semantic-border-strong',
32
+ '--tng-semantic-foreground-primary',
33
+ '--tng-semantic-foreground-secondary',
34
+ '--tng-semantic-accent-brand',
35
+ '--tng-semantic-accent-danger',
36
+ '--tng-semantic-focus-ring',
37
+ '--tng-date-range-picker-z-overlay',
38
+ '--tng-z-overlay',
39
+ ];
40
+ const OVERLAY_VIEWPORT_MARGIN = 12;
41
+ const OVERLAY_OFFSET = 9;
42
+ const OVERLAY_Z_INDEX = 'var(--tng-date-range-picker-z-overlay, var(--tng-z-overlay, 1000))';
43
+ const createDateRangePickerOverlayLockId = createTngIdFactory('tng-date-range-picker-overlay-lock');
44
+ function resolveAnchorElement(anchor) {
45
+ if (anchor instanceof ElementRef) {
46
+ return anchor.nativeElement;
47
+ }
48
+ return anchor instanceof HTMLElement ? anchor : null;
49
+ }
50
+ function resolveThemeSourceElement(source) {
51
+ return resolveAnchorElement(source);
52
+ }
53
+ /**
54
+ * When the overlay's anchor lives inside a `tng-form-field`, the form-field is
55
+ * the visible frame the consumer sees, so the overlay should span it
56
+ * (width + left/right edges). For the `left` label layout the form-field's
57
+ * root spans the label column too, so anchor on the inner control-row instead.
58
+ */
59
+ function findFormFieldAnchor(host) {
60
+ if (host === null)
61
+ return null;
62
+ const formField = host.closest('[data-slot="form-field"]');
63
+ if (formField === null)
64
+ return null;
65
+ if (formField.getAttribute('data-label-position') === 'left') {
66
+ const row = formField.querySelector('.tng-form-field__control-row');
67
+ return row ?? formField;
68
+ }
69
+ return formField;
70
+ }
71
+ /**
72
+ * Rect to use for overlay positioning. When the anchor is a form-field root,
73
+ * the horizontal extent is taken from the form-field (so the overlay spans
74
+ * the field frame) but the vertical extent is taken from the inner frame
75
+ * element (the input row) so the overlay opens directly under the input
76
+ * rather than below the messages region beneath the frame.
77
+ */
78
+ function anchorRectFor(anchorEl) {
79
+ const widthRect = anchorEl.getBoundingClientRect();
80
+ if (!anchorEl.matches('[data-slot="form-field"]')) {
81
+ return {
82
+ height: widthRect.height,
83
+ left: widthRect.left,
84
+ top: widthRect.top,
85
+ width: widthRect.width,
86
+ };
87
+ }
88
+ const labelPosition = anchorEl.getAttribute('data-label-position');
89
+ const fieldset = anchorEl.querySelector('[data-slot="form-field-control-row"]');
90
+ const innerRow = anchorEl.querySelector('.tng-form-field__control-row');
91
+ const positionEl = labelPosition === 'outline' ? (fieldset ?? innerRow) : (innerRow ?? fieldset);
92
+ if (positionEl === null) {
93
+ return {
94
+ height: widthRect.height,
95
+ left: widthRect.left,
96
+ top: widthRect.top,
97
+ width: widthRect.width,
98
+ };
99
+ }
100
+ const positionRect = positionEl.getBoundingClientRect();
101
+ return {
102
+ height: positionRect.height,
103
+ left: widthRect.left,
104
+ top: positionRect.top,
105
+ width: widthRect.width,
106
+ };
107
+ }
108
+ export class TngDateRangePickerOverlay {
109
+ elRef = inject(ElementRef);
110
+ destroyRef = inject(DestroyRef);
111
+ ownerDocument = this.elRef.nativeElement.ownerDocument ?? null;
112
+ ownerWindow = this.ownerDocument?.defaultView ?? null;
113
+ renderVersion = signal(0, ...(ngDevMode ? [{ debugName: "renderVersion" }] : []));
114
+ resolvedPlacement = signal('bottom', ...(ngDevMode ? [{ debugName: "resolvedPlacement" }] : []));
115
+ instanceId = createDateRangePickerOverlayLockId();
116
+ scrollLock = getGlobalScrollLockManager({
117
+ documentRef: this.ownerDocument,
118
+ });
119
+ overlayPlaceholder = null;
120
+ overlayOriginalParent = null;
121
+ overlayLayoutFrame = null;
122
+ removeResizeListener = null;
123
+ resizeObserver = null;
124
+ controller = input.required({ ...(ngDevMode ? { debugName: "controller" } : {}), alias: 'tngDateRangePickerOverlay' });
125
+ anchor = input(undefined, { ...(ngDevMode ? { debugName: "anchor" } : {}), alias: 'tngDateRangePickerOverlayAnchor' });
126
+ placement = input(undefined, { ...(ngDevMode ? { debugName: "placement" } : {}), alias: 'tngDateRangePickerOverlayPlacement' });
127
+ offset = input(undefined, { ...(ngDevMode ? { debugName: "offset" } : {}), alias: 'tngDateRangePickerOverlayOffset' });
128
+ collision = input(undefined, { ...(ngDevMode ? { debugName: "collision" } : {}), alias: 'tngDateRangePickerOverlayCollision' });
129
+ themeSource = input(undefined, { ...(ngDevMode ? { debugName: "themeSource" } : {}), alias: 'tngDateRangePickerOverlayThemeSource' });
130
+ get hidden() {
131
+ this.renderVersion();
132
+ return this.controller().getOutputs().open ? null : '';
133
+ }
134
+ get display() {
135
+ this.renderVersion();
136
+ return this.controller().getOutputs().open ? null : 'none';
137
+ }
138
+ get dataPlacement() {
139
+ this.renderVersion();
140
+ return this.resolvedPlacement();
141
+ }
142
+ get ariaDescribedby() {
143
+ this.renderVersion();
144
+ return this.controller().getOutputs().getOverlayAttributes()['aria-describedby'] ?? null;
145
+ }
146
+ get ariaLabel() {
147
+ this.renderVersion();
148
+ return this.controller().getOutputs().getOverlayAttributes()['aria-label'] ?? null;
149
+ }
150
+ get ariaLabelledby() {
151
+ this.renderVersion();
152
+ return this.controller().getOutputs().getOverlayAttributes()['aria-labelledby'] ?? null;
153
+ }
154
+ get ariaModal() {
155
+ this.renderVersion();
156
+ return this.controller().getOutputs().getOverlayAttributes()['aria-modal'] ?? null;
157
+ }
158
+ get dataOpen() {
159
+ this.renderVersion();
160
+ return this.controller().getOutputs().getOverlayAttributes()['data-open'] ?? null;
161
+ }
162
+ get dataPosition() {
163
+ this.renderVersion();
164
+ return this.controller().getOutputs().getOverlayAttributes()['data-position'] ?? null;
165
+ }
166
+ get dataSlot() {
167
+ this.renderVersion();
168
+ return this.controller().getOutputs().getOverlayAttributes()['data-slot'] ?? null;
169
+ }
170
+ get id() {
171
+ this.renderVersion();
172
+ return this.controller().getOutputs().getOverlayAttributes()['id'] ?? null;
173
+ }
174
+ get role() {
175
+ this.renderVersion();
176
+ return this.controller().getOutputs().getOverlayAttributes()['role'] ?? null;
177
+ }
178
+ onKeydown(event) {
179
+ this.controller().handleOverlayKeyDown(event);
180
+ }
181
+ constructor() {
182
+ this.initializeOverlayPortal();
183
+ effect((onCleanup) => {
184
+ const controller = this.controller();
185
+ controller.registerOverlay(this.elRef.nativeElement);
186
+ const unsubscribe = controller.subscribe(() => {
187
+ this.renderVersion.update((value) => value + 1);
188
+ });
189
+ onCleanup(() => {
190
+ unsubscribe();
191
+ controller.registerOverlay(null);
192
+ });
193
+ });
194
+ effect(() => {
195
+ const open = this.controller().getOutputs().open;
196
+ this.renderVersion();
197
+ this.placement();
198
+ this.offset();
199
+ this.collision();
200
+ this.themeSource();
201
+ this.anchor();
202
+ if (open) {
203
+ this.mountToBodyAndPosition();
204
+ return;
205
+ }
206
+ this.restoreToPlaceholder();
207
+ });
208
+ this.destroyRef.onDestroy(() => {
209
+ if (this.overlayLayoutFrame !== null && this.ownerWindow !== null) {
210
+ this.ownerWindow.cancelAnimationFrame(this.overlayLayoutFrame);
211
+ this.overlayLayoutFrame = null;
212
+ }
213
+ this.teardownRepositionListeners();
214
+ this.restoreToPlaceholder(true);
215
+ });
216
+ }
217
+ initializeOverlayPortal() {
218
+ if (this.overlayPlaceholder !== null) {
219
+ return;
220
+ }
221
+ const placeholderDocument = this.ownerDocument ?? document;
222
+ const overlay = this.elRef.nativeElement;
223
+ this.overlayPlaceholder = placeholderDocument.createComment('tng-date-range-picker-overlay-anchor');
224
+ this.overlayOriginalParent = overlay.parentNode;
225
+ const placeholder = this.overlayPlaceholder;
226
+ if (this.overlayOriginalParent !== null && placeholder !== null) {
227
+ this.overlayOriginalParent.insertBefore(placeholder, overlay);
228
+ }
229
+ }
230
+ /**
231
+ * Resolve the explicit/date-range-picker-owned anchor (input-shell or trigger).
232
+ * This is the element used to read date-range-picker-scoped CSS custom properties
233
+ * (e.g. `--tng-date-range-picker-overlay-gap`) and to align the overlay vertically.
234
+ */
235
+ findDateRangePickerAnchorEl() {
236
+ const explicitAnchor = resolveAnchorElement(this.anchor());
237
+ if (explicitAnchor !== null) {
238
+ return explicitAnchor;
239
+ }
240
+ const scope = this.overlayPlaceholder?.parentNode instanceof HTMLElement
241
+ ? this.overlayPlaceholder.parentNode
242
+ : this.overlayOriginalParent instanceof HTMLElement
243
+ ? this.overlayOriginalParent
244
+ : null;
245
+ return (scope?.querySelector('[data-slot="date-range-picker-input-shell"]') ??
246
+ scope?.querySelector('[data-slot="date-range-picker-trigger"]'));
247
+ }
248
+ /**
249
+ * Anchor for overlay positioning, width, and dismiss boundary. Prefer the
250
+ * enclosing form-field (so the overlay spans the visible frame) and fall
251
+ * back to the date-range-picker-owned anchor otherwise.
252
+ */
253
+ findAnchorEl() {
254
+ const dateRangePickerAnchor = this.findDateRangePickerAnchorEl();
255
+ return findFormFieldAnchor(dateRangePickerAnchor) ?? dateRangePickerAnchor;
256
+ }
257
+ scheduleReposition() {
258
+ if (!this.controller().getOutputs().open || this.ownerWindow === null) {
259
+ return;
260
+ }
261
+ if (this.overlayLayoutFrame !== null) {
262
+ this.ownerWindow.cancelAnimationFrame(this.overlayLayoutFrame);
263
+ }
264
+ this.overlayLayoutFrame = this.ownerWindow.requestAnimationFrame(() => {
265
+ this.overlayLayoutFrame = null;
266
+ this.positionOverlay();
267
+ });
268
+ }
269
+ positionOverlay() {
270
+ const overlay = this.elRef.nativeElement;
271
+ const anchor = this.findAnchorEl();
272
+ if (anchor === null || this.ownerWindow === null) {
273
+ return;
274
+ }
275
+ const result = positionFixedAnchoredOverlay({
276
+ anchor,
277
+ anchorRect: anchorRectFor(anchor),
278
+ collision: this.resolveCollision(),
279
+ direction: this.resolveDirection(),
280
+ offset: this.resolveOffset(),
281
+ overlay,
282
+ placement: this.resolvePlacement(),
283
+ viewportMargin: OVERLAY_VIEWPORT_MARGIN,
284
+ windowRef: this.ownerWindow,
285
+ });
286
+ this.resolvedPlacement.set(result.side === 'top' ? 'top' : 'bottom');
287
+ overlay.style.visibility = '';
288
+ }
289
+ setupRepositionListeners() {
290
+ if (this.ownerWindow === null || this.removeResizeListener !== null) {
291
+ return;
292
+ }
293
+ const schedule = () => {
294
+ this.scheduleReposition();
295
+ };
296
+ this.ownerWindow.addEventListener('resize', schedule);
297
+ this.removeResizeListener = () => {
298
+ this.ownerWindow?.removeEventListener('resize', schedule);
299
+ };
300
+ if ('ResizeObserver' in this.ownerWindow) {
301
+ const ResizeObserverCtor = this.ownerWindow.ResizeObserver;
302
+ this.resizeObserver = new ResizeObserverCtor(() => {
303
+ this.scheduleReposition();
304
+ });
305
+ const anchor = this.findAnchorEl();
306
+ if (anchor !== null && this.resizeObserver !== null) {
307
+ this.resizeObserver.observe(anchor);
308
+ }
309
+ this.resizeObserver?.observe(this.elRef.nativeElement);
310
+ }
311
+ }
312
+ teardownRepositionListeners() {
313
+ this.removeResizeListener?.();
314
+ this.removeResizeListener = null;
315
+ this.resizeObserver?.disconnect();
316
+ this.resizeObserver = null;
317
+ }
318
+ syncPortalledThemeVars() {
319
+ const overlay = this.elRef.nativeElement;
320
+ const themeSource = resolveThemeSourceElement(this.themeSource()) ?? this.findDateRangePickerAnchorEl();
321
+ if (themeSource === null) {
322
+ return;
323
+ }
324
+ syncPortalledThemeVars({
325
+ cssVars: PORTALLED_DATEPICKER_THEME_VARS,
326
+ panel: overlay,
327
+ source: themeSource,
328
+ });
329
+ }
330
+ clearPortalledThemeVars() {
331
+ clearPortalledThemeVars(this.elRef.nativeElement, PORTALLED_DATEPICKER_THEME_VARS);
332
+ }
333
+ mountToBodyAndPosition() {
334
+ const overlay = this.elRef.nativeElement;
335
+ if (this.ownerDocument === null) {
336
+ return;
337
+ }
338
+ this.setupRepositionListeners();
339
+ this.scrollLock.acquire(this.instanceId);
340
+ if (overlay.parentNode !== this.ownerDocument.body) {
341
+ this.ownerDocument.body.appendChild(overlay);
342
+ }
343
+ applyFixedPortalledOverlayBaseStyles(overlay, OVERLAY_Z_INDEX);
344
+ this.syncPortalledThemeVars();
345
+ queueMicrotask(() => {
346
+ if (!this.controller().getOutputs().open) {
347
+ return;
348
+ }
349
+ this.positionOverlay();
350
+ });
351
+ }
352
+ restoreToPlaceholder(force = false) {
353
+ const overlay = this.elRef.nativeElement;
354
+ if (!force && overlay.parentNode !== this.ownerDocument?.body) {
355
+ return;
356
+ }
357
+ const placeholder = this.overlayPlaceholder;
358
+ if (placeholder?.parentNode !== null && placeholder !== null) {
359
+ placeholder.parentNode.insertBefore(overlay, placeholder);
360
+ }
361
+ else if (this.overlayOriginalParent !== null) {
362
+ this.overlayOriginalParent.appendChild(overlay);
363
+ }
364
+ this.teardownRepositionListeners();
365
+ this.scrollLock.release(this.instanceId);
366
+ this.resolvedPlacement.set(this.resolvePlacement().side === 'top' ? 'top' : 'bottom');
367
+ this.clearPortalledThemeVars();
368
+ clearFixedPortalledOverlayBaseStyles(overlay);
369
+ overlay.style.maxHeight = '';
370
+ overlay.style.maxWidth = '';
371
+ overlay.style.width = '';
372
+ }
373
+ resolvePlacement() {
374
+ return this.placement() ?? { align: 'start', side: 'bottom' };
375
+ }
376
+ resolveOffset() {
377
+ const explicitOffset = this.offset();
378
+ if (explicitOffset !== undefined) {
379
+ return explicitOffset;
380
+ }
381
+ const themeSource = this.findDateRangePickerAnchorEl();
382
+ return {
383
+ side: themeSource === null
384
+ ? OVERLAY_OFFSET
385
+ : resolveCssCustomPropertyPx(themeSource, '--tng-date-range-picker-overlay-gap', OVERLAY_OFFSET),
386
+ };
387
+ }
388
+ resolveCollision() {
389
+ return (this.collision() ?? {
390
+ flip: true,
391
+ padding: OVERLAY_VIEWPORT_MARGIN,
392
+ shift: false,
393
+ });
394
+ }
395
+ resolveDirection() {
396
+ return this.controller().getOutputs().getHostAttributes()['dir'] === 'rtl' ? 'rtl' : 'ltr';
397
+ }
398
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: TngDateRangePickerOverlay, deps: [], target: i0.ɵɵFactoryTarget.Directive });
399
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.1.1", type: TngDateRangePickerOverlay, isStandalone: true, selector: "[tngDateRangePickerOverlay]", inputs: { controller: { classPropertyName: "controller", publicName: "tngDateRangePickerOverlay", isSignal: true, isRequired: true, transformFunction: null }, anchor: { classPropertyName: "anchor", publicName: "tngDateRangePickerOverlayAnchor", isSignal: true, isRequired: false, transformFunction: null }, placement: { classPropertyName: "placement", publicName: "tngDateRangePickerOverlayPlacement", isSignal: true, isRequired: false, transformFunction: null }, offset: { classPropertyName: "offset", publicName: "tngDateRangePickerOverlayOffset", isSignal: true, isRequired: false, transformFunction: null }, collision: { classPropertyName: "collision", publicName: "tngDateRangePickerOverlayCollision", isSignal: true, isRequired: false, transformFunction: null }, themeSource: { classPropertyName: "themeSource", publicName: "tngDateRangePickerOverlayThemeSource", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "keydown": "onKeydown($event)" }, properties: { "attr.hidden": "this.hidden", "style.display": "this.display", "attr.data-placement": "this.dataPlacement", "attr.aria-describedby": "this.ariaDescribedby", "attr.aria-label": "this.ariaLabel", "attr.aria-labelledby": "this.ariaLabelledby", "attr.aria-modal": "this.ariaModal", "attr.data-open": "this.dataOpen", "attr.data-position": "this.dataPosition", "attr.data-slot": "this.dataSlot", "attr.id": "this.id", "attr.role": "this.role" } }, exportAs: ["tngDateRangePickerOverlay"], ngImport: i0 });
400
+ }
401
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: TngDateRangePickerOverlay, decorators: [{
402
+ type: Directive,
403
+ args: [{
404
+ selector: '[tngDateRangePickerOverlay]',
405
+ exportAs: 'tngDateRangePickerOverlay',
406
+ }]
407
+ }], ctorParameters: () => [], propDecorators: { controller: [{ type: i0.Input, args: [{ isSignal: true, alias: "tngDateRangePickerOverlay", required: true }] }], anchor: [{ type: i0.Input, args: [{ isSignal: true, alias: "tngDateRangePickerOverlayAnchor", required: false }] }], placement: [{ type: i0.Input, args: [{ isSignal: true, alias: "tngDateRangePickerOverlayPlacement", required: false }] }], offset: [{ type: i0.Input, args: [{ isSignal: true, alias: "tngDateRangePickerOverlayOffset", required: false }] }], collision: [{ type: i0.Input, args: [{ isSignal: true, alias: "tngDateRangePickerOverlayCollision", required: false }] }], themeSource: [{ type: i0.Input, args: [{ isSignal: true, alias: "tngDateRangePickerOverlayThemeSource", required: false }] }], hidden: [{
408
+ type: HostBinding,
409
+ args: ['attr.hidden']
410
+ }], display: [{
411
+ type: HostBinding,
412
+ args: ['style.display']
413
+ }], dataPlacement: [{
414
+ type: HostBinding,
415
+ args: ['attr.data-placement']
416
+ }], ariaDescribedby: [{
417
+ type: HostBinding,
418
+ args: ['attr.aria-describedby']
419
+ }], ariaLabel: [{
420
+ type: HostBinding,
421
+ args: ['attr.aria-label']
422
+ }], ariaLabelledby: [{
423
+ type: HostBinding,
424
+ args: ['attr.aria-labelledby']
425
+ }], ariaModal: [{
426
+ type: HostBinding,
427
+ args: ['attr.aria-modal']
428
+ }], dataOpen: [{
429
+ type: HostBinding,
430
+ args: ['attr.data-open']
431
+ }], dataPosition: [{
432
+ type: HostBinding,
433
+ args: ['attr.data-position']
434
+ }], dataSlot: [{
435
+ type: HostBinding,
436
+ args: ['attr.data-slot']
437
+ }], id: [{
438
+ type: HostBinding,
439
+ args: ['attr.id']
440
+ }], role: [{
441
+ type: HostBinding,
442
+ args: ['attr.role']
443
+ }], onKeydown: [{
444
+ type: HostListener,
445
+ args: ['keydown', ['$event']]
446
+ }] } });
447
+ //# sourceMappingURL=tng-date-range-picker.overlay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tng-date-range-picker.overlay.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/form/date-range-picker/tng-date-range-picker.overlay.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n DestroyRef,\n Directive,\n ElementRef,\n HostBinding,\n HostListener,\n effect,\n inject,\n input,\n signal,\n} from '@angular/core';\nimport {\n applyFixedPortalledOverlayBaseStyles,\n clearFixedPortalledOverlayBaseStyles,\n clearPortalledThemeVars,\n createTngIdFactory,\n getGlobalScrollLockManager,\n positionFixedAnchoredOverlay,\n resolveCssCustomPropertyPx,\n syncPortalledThemeVars,\n type TngOverlayCollisionOptions,\n type TngOverlayOffset,\n type TngOverlayPlacement,\n type TngOverlayRect,\n} from '@tailng-ui/cdk';\nimport type { TngDateRangePickerAttributeMap } from './date-range-picker.types';\n\ntype TngDateRangePickerOverlayController = Readonly<{\n handleOverlayKeyDown: (event: KeyboardEvent) => void;\n getOutputs: () => Readonly<{\n getHostAttributes: () => TngDateRangePickerAttributeMap;\n getOverlayAttributes: () => TngDateRangePickerAttributeMap;\n open: boolean;\n }>;\n registerOverlay: (element: HTMLElement | null) => void;\n subscribe: (listener: (event: unknown) => void) => () => void;\n}>;\n\ntype OverlayAnchorInput = ElementRef<HTMLElement> | HTMLElement | null | undefined;\ntype OverlayThemeSourceInput = OverlayAnchorInput;\n\nconst PORTALLED_DATEPICKER_THEME_VARS = [\n '--tng-date-range-picker-radius',\n '--tng-date-range-picker-field-height',\n '--tng-date-range-picker-overlay-gap',\n '--tng-date-range-picker-day-cell-size',\n '--tng-date-range-picker-picker-cell-size',\n '--tng-date-range-picker-grid-gap',\n '--tng-date-range-picker-inline-gap',\n '--tng-date-range-picker-overlay-padding',\n '--tng-date-range-picker-nav-size',\n '--tng-date-range-picker-border',\n '--tng-date-range-picker-border-strong',\n '--tng-date-range-picker-bg',\n '--tng-date-range-picker-surface',\n '--tng-date-range-picker-canvas',\n '--tng-date-range-picker-fg',\n '--tng-date-range-picker-muted',\n '--tng-date-range-picker-brand',\n '--tng-date-range-picker-danger',\n '--tng-date-range-picker-focus',\n '--tng-date-range-picker-shadow',\n '--tng-date-range-picker-focus-shadow',\n '--tng-date-range-picker-ease',\n '--tng-semantic-background-base',\n '--tng-semantic-background-surface',\n '--tng-semantic-background-canvas',\n '--tng-semantic-border-subtle',\n '--tng-semantic-border-strong',\n '--tng-semantic-foreground-primary',\n '--tng-semantic-foreground-secondary',\n '--tng-semantic-accent-brand',\n '--tng-semantic-accent-danger',\n '--tng-semantic-focus-ring',\n '--tng-date-range-picker-z-overlay',\n '--tng-z-overlay',\n] as const;\n\nconst OVERLAY_VIEWPORT_MARGIN = 12;\nconst OVERLAY_OFFSET = 9;\nconst OVERLAY_Z_INDEX = 'var(--tng-date-range-picker-z-overlay, var(--tng-z-overlay, 1000))';\nconst createDateRangePickerOverlayLockId = createTngIdFactory('tng-date-range-picker-overlay-lock');\n\nfunction resolveAnchorElement(anchor: OverlayAnchorInput): HTMLElement | null {\n if (anchor instanceof ElementRef) {\n return anchor.nativeElement;\n }\n\n return anchor instanceof HTMLElement ? anchor : null;\n}\n\nfunction resolveThemeSourceElement(source: OverlayThemeSourceInput): HTMLElement | null {\n return resolveAnchorElement(source);\n}\n\n/**\n * When the overlay's anchor lives inside a `tng-form-field`, the form-field is\n * the visible frame the consumer sees, so the overlay should span it\n * (width + left/right edges). For the `left` label layout the form-field's\n * root spans the label column too, so anchor on the inner control-row instead.\n */\nfunction findFormFieldAnchor(host: HTMLElement | null): HTMLElement | null {\n if (host === null) return null;\n const formField = host.closest('[data-slot=\"form-field\"]') as HTMLElement | null;\n if (formField === null) return null;\n if (formField.getAttribute('data-label-position') === 'left') {\n const row = formField.querySelector('.tng-form-field__control-row') as HTMLElement | null;\n return row ?? formField;\n }\n return formField;\n}\n\n/**\n * Rect to use for overlay positioning. When the anchor is a form-field root,\n * the horizontal extent is taken from the form-field (so the overlay spans\n * the field frame) but the vertical extent is taken from the inner frame\n * element (the input row) so the overlay opens directly under the input\n * rather than below the messages region beneath the frame.\n */\nfunction anchorRectFor(anchorEl: HTMLElement): TngOverlayRect {\n const widthRect = anchorEl.getBoundingClientRect();\n if (!anchorEl.matches('[data-slot=\"form-field\"]')) {\n return {\n height: widthRect.height,\n left: widthRect.left,\n top: widthRect.top,\n width: widthRect.width,\n };\n }\n const labelPosition = anchorEl.getAttribute('data-label-position');\n const fieldset = anchorEl.querySelector(\n '[data-slot=\"form-field-control-row\"]',\n ) as HTMLElement | null;\n const innerRow = anchorEl.querySelector('.tng-form-field__control-row') as HTMLElement | null;\n const positionEl = labelPosition === 'outline' ? (fieldset ?? innerRow) : (innerRow ?? fieldset);\n if (positionEl === null) {\n return {\n height: widthRect.height,\n left: widthRect.left,\n top: widthRect.top,\n width: widthRect.width,\n };\n }\n const positionRect = positionEl.getBoundingClientRect();\n return {\n height: positionRect.height,\n left: widthRect.left,\n top: positionRect.top,\n width: widthRect.width,\n };\n}\n\n@Directive({\n selector: '[tngDateRangePickerOverlay]',\n exportAs: 'tngDateRangePickerOverlay',\n})\nexport class TngDateRangePickerOverlay {\n private readonly elRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly destroyRef = inject(DestroyRef);\n\n private readonly ownerDocument = this.elRef.nativeElement.ownerDocument ?? null;\n private readonly ownerWindow = this.ownerDocument?.defaultView ?? null;\n private readonly renderVersion = signal(0);\n private readonly resolvedPlacement = signal<'bottom' | 'top'>('bottom');\n private readonly instanceId = createDateRangePickerOverlayLockId();\n private readonly scrollLock = getGlobalScrollLockManager({\n documentRef: this.ownerDocument,\n });\n\n private overlayPlaceholder: Comment | null = null;\n private overlayOriginalParent: Node | null = null;\n private overlayLayoutFrame: number | null = null;\n private removeResizeListener: (() => void) | null = null;\n private resizeObserver: ResizeObserver | null = null;\n\n public readonly controller = input.required<TngDateRangePickerOverlayController>({\n alias: 'tngDateRangePickerOverlay',\n });\n public readonly anchor = input<OverlayAnchorInput>(undefined, {\n alias: 'tngDateRangePickerOverlayAnchor',\n });\n public readonly placement = input<TngOverlayPlacement | undefined>(undefined, {\n alias: 'tngDateRangePickerOverlayPlacement',\n });\n public readonly offset = input<TngOverlayOffset | undefined>(undefined, {\n alias: 'tngDateRangePickerOverlayOffset',\n });\n public readonly collision = input<TngOverlayCollisionOptions | undefined>(undefined, {\n alias: 'tngDateRangePickerOverlayCollision',\n });\n public readonly themeSource = input<OverlayThemeSourceInput>(undefined, {\n alias: 'tngDateRangePickerOverlayThemeSource',\n });\n\n @HostBinding('attr.hidden')\n protected get hidden(): '' | null {\n this.renderVersion();\n return this.controller().getOutputs().open ? null : '';\n }\n\n @HostBinding('style.display')\n protected get display(): string | null {\n this.renderVersion();\n return this.controller().getOutputs().open ? null : 'none';\n }\n\n @HostBinding('attr.data-placement')\n protected get dataPlacement(): 'bottom' | 'top' {\n this.renderVersion();\n return this.resolvedPlacement();\n }\n\n @HostBinding('attr.aria-describedby')\n protected get ariaDescribedby(): string | null {\n this.renderVersion();\n return this.controller().getOutputs().getOverlayAttributes()['aria-describedby'] ?? null;\n }\n\n @HostBinding('attr.aria-label')\n protected get ariaLabel(): string | null {\n this.renderVersion();\n return this.controller().getOutputs().getOverlayAttributes()['aria-label'] ?? null;\n }\n\n @HostBinding('attr.aria-labelledby')\n protected get ariaLabelledby(): string | null {\n this.renderVersion();\n return this.controller().getOutputs().getOverlayAttributes()['aria-labelledby'] ?? null;\n }\n\n @HostBinding('attr.aria-modal')\n protected get ariaModal(): string | null {\n this.renderVersion();\n return this.controller().getOutputs().getOverlayAttributes()['aria-modal'] ?? null;\n }\n\n @HostBinding('attr.data-open')\n protected get dataOpen(): string | null {\n this.renderVersion();\n return this.controller().getOutputs().getOverlayAttributes()['data-open'] ?? null;\n }\n\n @HostBinding('attr.data-position')\n protected get dataPosition(): string | null {\n this.renderVersion();\n return this.controller().getOutputs().getOverlayAttributes()['data-position'] ?? null;\n }\n\n @HostBinding('attr.data-slot')\n protected get dataSlot(): string | null {\n this.renderVersion();\n return this.controller().getOutputs().getOverlayAttributes()['data-slot'] ?? null;\n }\n\n @HostBinding('attr.id')\n protected get id(): string | null {\n this.renderVersion();\n return this.controller().getOutputs().getOverlayAttributes()['id'] ?? null;\n }\n\n @HostBinding('attr.role')\n protected get role(): string | null {\n this.renderVersion();\n return this.controller().getOutputs().getOverlayAttributes()['role'] ?? null;\n }\n\n @HostListener('keydown', ['$event'])\n protected onKeydown(event: KeyboardEvent): void {\n this.controller().handleOverlayKeyDown(event);\n }\n\n public constructor() {\n this.initializeOverlayPortal();\n\n effect((onCleanup) => {\n const controller = this.controller();\n controller.registerOverlay(this.elRef.nativeElement);\n const unsubscribe = controller.subscribe(() => {\n this.renderVersion.update((value) => value + 1);\n });\n\n onCleanup(() => {\n unsubscribe();\n controller.registerOverlay(null);\n });\n });\n\n effect(() => {\n const open = this.controller().getOutputs().open;\n this.renderVersion();\n this.placement();\n this.offset();\n this.collision();\n this.themeSource();\n this.anchor();\n\n if (open) {\n this.mountToBodyAndPosition();\n return;\n }\n\n this.restoreToPlaceholder();\n });\n\n this.destroyRef.onDestroy(() => {\n if (this.overlayLayoutFrame !== null && this.ownerWindow !== null) {\n this.ownerWindow.cancelAnimationFrame(this.overlayLayoutFrame);\n this.overlayLayoutFrame = null;\n }\n\n this.teardownRepositionListeners();\n this.restoreToPlaceholder(true);\n });\n }\n\n private initializeOverlayPortal(): void {\n if (this.overlayPlaceholder !== null) {\n return;\n }\n\n const placeholderDocument = this.ownerDocument ?? document;\n const overlay = this.elRef.nativeElement;\n this.overlayPlaceholder = placeholderDocument.createComment(\n 'tng-date-range-picker-overlay-anchor',\n );\n this.overlayOriginalParent = overlay.parentNode;\n const placeholder = this.overlayPlaceholder;\n if (this.overlayOriginalParent !== null && placeholder !== null) {\n this.overlayOriginalParent.insertBefore(placeholder, overlay);\n }\n }\n\n /**\n * Resolve the explicit/date-range-picker-owned anchor (input-shell or trigger).\n * This is the element used to read date-range-picker-scoped CSS custom properties\n * (e.g. `--tng-date-range-picker-overlay-gap`) and to align the overlay vertically.\n */\n private findDateRangePickerAnchorEl(): HTMLElement | null {\n const explicitAnchor = resolveAnchorElement(this.anchor());\n if (explicitAnchor !== null) {\n return explicitAnchor;\n }\n\n const scope =\n this.overlayPlaceholder?.parentNode instanceof HTMLElement\n ? this.overlayPlaceholder.parentNode\n : this.overlayOriginalParent instanceof HTMLElement\n ? this.overlayOriginalParent\n : null;\n\n return (scope?.querySelector('[data-slot=\"date-range-picker-input-shell\"]') ??\n scope?.querySelector('[data-slot=\"date-range-picker-trigger\"]')) as HTMLElement | null;\n }\n\n /**\n * Anchor for overlay positioning, width, and dismiss boundary. Prefer the\n * enclosing form-field (so the overlay spans the visible frame) and fall\n * back to the date-range-picker-owned anchor otherwise.\n */\n private findAnchorEl(): HTMLElement | null {\n const dateRangePickerAnchor = this.findDateRangePickerAnchorEl();\n return findFormFieldAnchor(dateRangePickerAnchor) ?? dateRangePickerAnchor;\n }\n\n private scheduleReposition(): void {\n if (!this.controller().getOutputs().open || this.ownerWindow === null) {\n return;\n }\n\n if (this.overlayLayoutFrame !== null) {\n this.ownerWindow.cancelAnimationFrame(this.overlayLayoutFrame);\n }\n\n this.overlayLayoutFrame = this.ownerWindow.requestAnimationFrame(() => {\n this.overlayLayoutFrame = null;\n this.positionOverlay();\n });\n }\n\n private positionOverlay(): void {\n const overlay = this.elRef.nativeElement;\n const anchor = this.findAnchorEl();\n if (anchor === null || this.ownerWindow === null) {\n return;\n }\n\n const result = positionFixedAnchoredOverlay({\n anchor,\n anchorRect: anchorRectFor(anchor),\n collision: this.resolveCollision(),\n direction: this.resolveDirection(),\n offset: this.resolveOffset(),\n overlay,\n placement: this.resolvePlacement(),\n viewportMargin: OVERLAY_VIEWPORT_MARGIN,\n windowRef: this.ownerWindow,\n });\n this.resolvedPlacement.set(result.side === 'top' ? 'top' : 'bottom');\n overlay.style.visibility = '';\n }\n\n private setupRepositionListeners(): void {\n if (this.ownerWindow === null || this.removeResizeListener !== null) {\n return;\n }\n\n const schedule = (): void => {\n this.scheduleReposition();\n };\n\n this.ownerWindow.addEventListener('resize', schedule);\n this.removeResizeListener = (): void => {\n this.ownerWindow?.removeEventListener('resize', schedule);\n };\n\n if ('ResizeObserver' in this.ownerWindow) {\n const ResizeObserverCtor = this.ownerWindow.ResizeObserver;\n this.resizeObserver = new ResizeObserverCtor(() => {\n this.scheduleReposition();\n });\n\n const anchor = this.findAnchorEl();\n if (anchor !== null && this.resizeObserver !== null) {\n this.resizeObserver.observe(anchor);\n }\n\n this.resizeObserver?.observe(this.elRef.nativeElement);\n }\n }\n\n private teardownRepositionListeners(): void {\n this.removeResizeListener?.();\n this.removeResizeListener = null;\n this.resizeObserver?.disconnect();\n this.resizeObserver = null;\n }\n\n private syncPortalledThemeVars(): void {\n const overlay = this.elRef.nativeElement;\n const themeSource =\n resolveThemeSourceElement(this.themeSource()) ?? this.findDateRangePickerAnchorEl();\n if (themeSource === null) {\n return;\n }\n\n syncPortalledThemeVars({\n cssVars: PORTALLED_DATEPICKER_THEME_VARS,\n panel: overlay,\n source: themeSource,\n });\n }\n\n private clearPortalledThemeVars(): void {\n clearPortalledThemeVars(this.elRef.nativeElement, PORTALLED_DATEPICKER_THEME_VARS);\n }\n\n private mountToBodyAndPosition(): void {\n const overlay = this.elRef.nativeElement;\n if (this.ownerDocument === null) {\n return;\n }\n\n this.setupRepositionListeners();\n this.scrollLock.acquire(this.instanceId);\n\n if (overlay.parentNode !== this.ownerDocument.body) {\n this.ownerDocument.body.appendChild(overlay);\n }\n\n applyFixedPortalledOverlayBaseStyles(overlay, OVERLAY_Z_INDEX);\n this.syncPortalledThemeVars();\n\n queueMicrotask(() => {\n if (!this.controller().getOutputs().open) {\n return;\n }\n\n this.positionOverlay();\n });\n }\n\n private restoreToPlaceholder(force = false): void {\n const overlay = this.elRef.nativeElement;\n if (!force && overlay.parentNode !== this.ownerDocument?.body) {\n return;\n }\n\n const placeholder = this.overlayPlaceholder;\n if (placeholder?.parentNode !== null && placeholder !== null) {\n placeholder.parentNode.insertBefore(overlay, placeholder);\n } else if (this.overlayOriginalParent !== null) {\n this.overlayOriginalParent.appendChild(overlay);\n }\n\n this.teardownRepositionListeners();\n this.scrollLock.release(this.instanceId);\n this.resolvedPlacement.set(this.resolvePlacement().side === 'top' ? 'top' : 'bottom');\n this.clearPortalledThemeVars();\n clearFixedPortalledOverlayBaseStyles(overlay);\n overlay.style.maxHeight = '';\n overlay.style.maxWidth = '';\n overlay.style.width = '';\n }\n\n private resolvePlacement(): TngOverlayPlacement {\n return this.placement() ?? { align: 'start', side: 'bottom' };\n }\n\n private resolveOffset(): TngOverlayOffset {\n const explicitOffset = this.offset();\n if (explicitOffset !== undefined) {\n return explicitOffset;\n }\n\n const themeSource = this.findDateRangePickerAnchorEl();\n return {\n side:\n themeSource === null\n ? OVERLAY_OFFSET\n : resolveCssCustomPropertyPx(\n themeSource,\n '--tng-date-range-picker-overlay-gap',\n OVERLAY_OFFSET,\n ),\n };\n }\n\n private resolveCollision(): TngOverlayCollisionOptions {\n return (\n this.collision() ?? {\n flip: true,\n padding: OVERLAY_VIEWPORT_MARGIN,\n shift: false,\n }\n );\n }\n\n private resolveDirection(): 'ltr' | 'rtl' {\n return this.controller().getOutputs().getHostAttributes()['dir'] === 'rtl' ? 'rtl' : 'ltr';\n }\n}\n"]}