@tailng-ui/primitives 0.51.0 → 0.52.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.
- package/package.json +2 -2
- package/src/lib/form/_shared/select/tng-select.overlay.shared.d.ts +6 -0
- package/src/lib/form/_shared/select/tng-select.overlay.shared.d.ts.map +1 -1
- package/src/lib/form/_shared/select/tng-select.overlay.shared.js +65 -11
- package/src/lib/form/_shared/select/tng-select.overlay.shared.js.map +1 -1
- package/src/lib/form/autocomplete/tng-autocomplete.overlay.d.ts +6 -1
- package/src/lib/form/autocomplete/tng-autocomplete.overlay.d.ts.map +1 -1
- package/src/lib/form/autocomplete/tng-autocomplete.overlay.js +59 -3
- package/src/lib/form/autocomplete/tng-autocomplete.overlay.js.map +1 -1
- package/src/lib/form/datepicker/tng-datepicker.overlay.d.ts +11 -0
- package/src/lib/form/datepicker/tng-datepicker.overlay.d.ts.map +1 -1
- package/src/lib/form/datepicker/tng-datepicker.overlay.js +73 -3
- package/src/lib/form/datepicker/tng-datepicker.overlay.js.map +1 -1
- package/src/lib/form/index.d.ts +1 -0
- package/src/lib/form/index.d.ts.map +1 -1
- package/src/lib/form/index.js +1 -0
- package/src/lib/form/index.js.map +1 -1
- package/src/lib/form/input/tng-adornment.d.ts +6 -6
- package/src/lib/form/input/tng-adornment.d.ts.map +1 -1
- package/src/lib/form/input/tng-adornment.js +12 -12
- package/src/lib/form/input/tng-adornment.js.map +1 -1
- package/src/lib/form/input/tng-input-group.d.ts +4 -4
- package/src/lib/form/input/tng-input-group.d.ts.map +1 -1
- package/src/lib/form/input/tng-input-group.js +8 -8
- package/src/lib/form/input/tng-input-group.js.map +1 -1
- package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.overlay.d.ts +5 -0
- package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.overlay.d.ts.map +1 -1
- package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.overlay.js +51 -4
- package/src/lib/form/multi-autocomplete/tng-multi-autocomplete.overlay.js.map +1 -1
|
@@ -50,6 +50,61 @@ function resolveAnchorElement(anchor) {
|
|
|
50
50
|
function resolveThemeSourceElement(source) {
|
|
51
51
|
return resolveAnchorElement(source);
|
|
52
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
|
+
}
|
|
53
108
|
export class TngDatepickerOverlay {
|
|
54
109
|
elRef = inject(ElementRef);
|
|
55
110
|
destroyRef = inject(DestroyRef);
|
|
@@ -172,7 +227,12 @@ export class TngDatepickerOverlay {
|
|
|
172
227
|
this.overlayOriginalParent.insertBefore(placeholder, overlay);
|
|
173
228
|
}
|
|
174
229
|
}
|
|
175
|
-
|
|
230
|
+
/**
|
|
231
|
+
* Resolve the explicit/datepicker-owned anchor (input-shell or trigger).
|
|
232
|
+
* This is the element used to read datepicker-scoped CSS custom properties
|
|
233
|
+
* (e.g. `--tng-datepicker-overlay-gap`) and to align the overlay vertically.
|
|
234
|
+
*/
|
|
235
|
+
findDatepickerAnchorEl() {
|
|
176
236
|
const explicitAnchor = resolveAnchorElement(this.anchor());
|
|
177
237
|
if (explicitAnchor !== null) {
|
|
178
238
|
return explicitAnchor;
|
|
@@ -185,6 +245,15 @@ export class TngDatepickerOverlay {
|
|
|
185
245
|
return (scope?.querySelector('[data-slot="datepicker-input-shell"]') ??
|
|
186
246
|
scope?.querySelector('[data-slot="datepicker-trigger"]'));
|
|
187
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 datepicker-owned anchor otherwise.
|
|
252
|
+
*/
|
|
253
|
+
findAnchorEl() {
|
|
254
|
+
const datepickerAnchor = this.findDatepickerAnchorEl();
|
|
255
|
+
return findFormFieldAnchor(datepickerAnchor) ?? datepickerAnchor;
|
|
256
|
+
}
|
|
188
257
|
scheduleReposition() {
|
|
189
258
|
if (!this.controller().getOutputs().open || this.ownerWindow === null) {
|
|
190
259
|
return;
|
|
@@ -205,6 +274,7 @@ export class TngDatepickerOverlay {
|
|
|
205
274
|
}
|
|
206
275
|
const result = positionFixedAnchoredOverlay({
|
|
207
276
|
anchor,
|
|
277
|
+
anchorRect: anchorRectFor(anchor),
|
|
208
278
|
collision: this.resolveCollision(),
|
|
209
279
|
direction: this.resolveDirection(),
|
|
210
280
|
offset: this.resolveOffset(),
|
|
@@ -247,7 +317,7 @@ export class TngDatepickerOverlay {
|
|
|
247
317
|
}
|
|
248
318
|
syncPortalledThemeVars() {
|
|
249
319
|
const overlay = this.elRef.nativeElement;
|
|
250
|
-
const themeSource = resolveThemeSourceElement(this.themeSource()) ?? this.
|
|
320
|
+
const themeSource = resolveThemeSourceElement(this.themeSource()) ?? this.findDatepickerAnchorEl();
|
|
251
321
|
if (themeSource === null) {
|
|
252
322
|
return;
|
|
253
323
|
}
|
|
@@ -308,7 +378,7 @@ export class TngDatepickerOverlay {
|
|
|
308
378
|
if (explicitOffset !== undefined) {
|
|
309
379
|
return explicitOffset;
|
|
310
380
|
}
|
|
311
|
-
const themeSource = this.
|
|
381
|
+
const themeSource = this.findDatepickerAnchorEl();
|
|
312
382
|
return {
|
|
313
383
|
side: themeSource === null
|
|
314
384
|
? OVERLAY_OFFSET
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tng-datepicker.overlay.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/form/datepicker/tng-datepicker.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} from '@tailng-ui/cdk';\nimport type {\n TngDatepickerAttributeMap,\n} from './datepicker.types';\n\ntype TngDatepickerOverlayController = Readonly<{\n handleOverlayKeyDown: (event: KeyboardEvent) => void;\n getOutputs: () => Readonly<{\n getHostAttributes: () => TngDatepickerAttributeMap;\n getOverlayAttributes: () => TngDatepickerAttributeMap;\n open: boolean;\n }>;\n registerOverlay: (element: HTMLElement | null) => void;\n subscribe: (listener: (event: unknown) => void) => () => void;\n}>;\n\ntype OverlayAnchorInput =\n | ElementRef<HTMLElement>\n | HTMLElement\n | null\n | undefined;\ntype OverlayThemeSourceInput = OverlayAnchorInput;\n\nconst PORTALLED_DATEPICKER_THEME_VARS = [\n '--tng-datepicker-radius',\n '--tng-datepicker-field-height',\n '--tng-datepicker-overlay-gap',\n '--tng-datepicker-day-cell-size',\n '--tng-datepicker-picker-cell-size',\n '--tng-datepicker-grid-gap',\n '--tng-datepicker-inline-gap',\n '--tng-datepicker-overlay-padding',\n '--tng-datepicker-nav-size',\n '--tng-datepicker-border',\n '--tng-datepicker-border-strong',\n '--tng-datepicker-bg',\n '--tng-datepicker-surface',\n '--tng-datepicker-canvas',\n '--tng-datepicker-fg',\n '--tng-datepicker-muted',\n '--tng-datepicker-brand',\n '--tng-datepicker-danger',\n '--tng-datepicker-focus',\n '--tng-datepicker-shadow',\n '--tng-datepicker-focus-shadow',\n '--tng-datepicker-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-datepicker-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-datepicker-z-overlay, var(--tng-z-overlay, 1000))';\nconst createDatepickerOverlayLockId = createTngIdFactory('tng-datepicker-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@Directive({\n selector: '[tngDatepickerOverlay]',\n exportAs: 'tngDatepickerOverlay',\n})\nexport class TngDatepickerOverlay {\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 = createDatepickerOverlayLockId();\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<TngDatepickerOverlayController>({\n alias: 'tngDatepickerOverlay',\n });\n public readonly anchor = input<OverlayAnchorInput>(undefined, {\n alias: 'tngDatepickerOverlayAnchor',\n });\n public readonly placement = input<TngOverlayPlacement | undefined>(undefined, {\n alias: 'tngDatepickerOverlayPlacement',\n });\n public readonly offset = input<TngOverlayOffset | undefined>(undefined, {\n alias: 'tngDatepickerOverlayOffset',\n });\n public readonly collision = input<TngOverlayCollisionOptions | undefined>(undefined, {\n alias: 'tngDatepickerOverlayCollision',\n });\n public readonly themeSource = input<OverlayThemeSourceInput>(undefined, {\n alias: 'tngDatepickerOverlayThemeSource',\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('tng-datepicker-overlay-anchor');\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 private findAnchorEl(): 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 (\n scope?.querySelector('[data-slot=\"datepicker-input-shell\"]') ??\n scope?.querySelector('[data-slot=\"datepicker-trigger\"]')\n ) as HTMLElement | null;\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 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 = resolveThemeSourceElement(this.themeSource()) ?? this.findAnchorEl();\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.findAnchorEl();\n return {\n side:\n themeSource === null\n ? OVERLAY_OFFSET\n : resolveCssCustomPropertyPx(\n themeSource,\n '--tng-datepicker-overlay-gap',\n OVERLAY_OFFSET,\n ),\n };\n }\n\n private resolveCollision(): TngOverlayCollisionOptions {\n return this.collision() ?? {\n flip: true,\n padding: OVERLAY_VIEWPORT_MARGIN,\n shift: false,\n };\n }\n\n private resolveDirection(): 'ltr' | 'rtl' {\n return this.controller().getOutputs().getHostAttributes()['dir'] === 'rtl' ? 'rtl' : 'ltr';\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"tng-datepicker.overlay.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/form/datepicker/tng-datepicker.overlay.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,SAAS,EACT,UAAU,EACV,WAAW,EACX,YAAY,EACZ,MAAM,EACN,MAAM,EACN,KAAK,EACL,MAAM,GACP,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,oCAAoC,EACpC,oCAAoC,EACpC,uBAAuB,EACvB,kBAAkB,EAClB,0BAA0B,EAC1B,4BAA4B,EAC5B,0BAA0B,EAC1B,sBAAsB,GAKvB,MAAM,gBAAgB,CAAC;;AAuBxB,MAAM,+BAA+B,GAAG;IACtC,yBAAyB;IACzB,+BAA+B;IAC/B,8BAA8B;IAC9B,gCAAgC;IAChC,mCAAmC;IACnC,2BAA2B;IAC3B,6BAA6B;IAC7B,kCAAkC;IAClC,2BAA2B;IAC3B,yBAAyB;IACzB,gCAAgC;IAChC,qBAAqB;IACrB,0BAA0B;IAC1B,yBAAyB;IACzB,qBAAqB;IACrB,wBAAwB;IACxB,wBAAwB;IACxB,yBAAyB;IACzB,wBAAwB;IACxB,yBAAyB;IACzB,+BAA+B;IAC/B,uBAAuB;IACvB,gCAAgC;IAChC,mCAAmC;IACnC,kCAAkC;IAClC,8BAA8B;IAC9B,8BAA8B;IAC9B,mCAAmC;IACnC,qCAAqC;IACrC,6BAA6B;IAC7B,8BAA8B;IAC9B,2BAA2B;IAC3B,4BAA4B;IAC5B,iBAAiB;CACT,CAAC;AAEX,MAAM,uBAAuB,GAAG,EAAE,CAAC;AACnC,MAAM,cAAc,GAAG,CAAC,CAAC;AACzB,MAAM,eAAe,GAAG,6DAA6D,CAAC;AACtF,MAAM,6BAA6B,GAAG,kBAAkB,CAAC,6BAA6B,CAAC,CAAC;AAExF,SAAS,oBAAoB,CAAC,MAA0B;IACtD,IAAI,MAAM,YAAY,UAAU,EAAE,CAAC;QACjC,OAAO,MAAM,CAAC,aAAa,CAAC;IAC9B,CAAC;IAED,OAAO,MAAM,YAAY,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;AACvD,CAAC;AAED,SAAS,yBAAyB,CAAC,MAA+B;IAChE,OAAO,oBAAoB,CAAC,MAAM,CAAC,CAAC;AACtC,CAAC;AAED;;;;;GAKG;AACH,SAAS,mBAAmB,CAAC,IAAwB;IACnD,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAC/B,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,0BAA0B,CAAuB,CAAC;IACjF,IAAI,SAAS,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACpC,IAAI,SAAS,CAAC,YAAY,CAAC,qBAAqB,CAAC,KAAK,MAAM,EAAE,CAAC;QAC7D,MAAM,GAAG,GAAG,SAAS,CAAC,aAAa,CAAC,8BAA8B,CAAuB,CAAC;QAC1F,OAAO,GAAG,IAAI,SAAS,CAAC;IAC1B,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;GAMG;AACH,SAAS,aAAa,CAAC,QAAqB;IAC1C,MAAM,SAAS,GAAG,QAAQ,CAAC,qBAAqB,EAAE,CAAC;IACnD,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,0BAA0B,CAAC,EAAE,CAAC;QAClD,OAAO;YACL,MAAM,EAAE,SAAS,CAAC,MAAM;YACxB,IAAI,EAAE,SAAS,CAAC,IAAI;YACpB,GAAG,EAAE,SAAS,CAAC,GAAG;YAClB,KAAK,EAAE,SAAS,CAAC,KAAK;SACvB,CAAC;IACJ,CAAC;IACD,MAAM,aAAa,GAAG,QAAQ,CAAC,YAAY,CAAC,qBAAqB,CAAC,CAAC;IACnE,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,sCAAsC,CAAuB,CAAC;IACtG,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,8BAA8B,CAAuB,CAAC;IAC9F,MAAM,UAAU,GAAG,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,IAAI,QAAQ,CAAC,CAAC;IACjG,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;QACxB,OAAO;YACL,MAAM,EAAE,SAAS,CAAC,MAAM;YACxB,IAAI,EAAE,SAAS,CAAC,IAAI;YACpB,GAAG,EAAE,SAAS,CAAC,GAAG;YAClB,KAAK,EAAE,SAAS,CAAC,KAAK;SACvB,CAAC;IACJ,CAAC;IACD,MAAM,YAAY,GAAG,UAAU,CAAC,qBAAqB,EAAE,CAAC;IACxD,OAAO;QACL,MAAM,EAAE,YAAY,CAAC,MAAM;QAC3B,IAAI,EAAE,SAAS,CAAC,IAAI;QACpB,GAAG,EAAE,YAAY,CAAC,GAAG;QACrB,KAAK,EAAE,SAAS,CAAC,KAAK;KACvB,CAAC;AACJ,CAAC;AAMD,MAAM,OAAO,oBAAoB;IACd,KAAK,GAAG,MAAM,CAA0B,UAAU,CAAC,CAAC;IACpD,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;IAEhC,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,aAAa,IAAI,IAAI,CAAC;IAC/D,WAAW,GAAG,IAAI,CAAC,aAAa,EAAE,WAAW,IAAI,IAAI,CAAC;IACtD,aAAa,GAAG,MAAM,CAAC,CAAC,yDAAC,CAAC;IAC1B,iBAAiB,GAAG,MAAM,CAAmB,QAAQ,6DAAC,CAAC;IACvD,UAAU,GAAG,6BAA6B,EAAE,CAAC;IAC7C,UAAU,GAAG,0BAA0B,CAAC;QACvD,WAAW,EAAE,IAAI,CAAC,aAAa;KAChC,CAAC,CAAC;IAEK,kBAAkB,GAAmB,IAAI,CAAC;IAC1C,qBAAqB,GAAgB,IAAI,CAAC;IAC1C,kBAAkB,GAAkB,IAAI,CAAC;IACzC,oBAAoB,GAAwB,IAAI,CAAC;IACjD,cAAc,GAA0B,IAAI,CAAC;IAErC,UAAU,GAAG,KAAK,CAAC,QAAQ,sDACzC,KAAK,EAAE,sBAAsB,GAC7B,CAAC;IACa,MAAM,GAAG,KAAK,CAAqB,SAAS,mDAC1D,KAAK,EAAE,4BAA4B,GACnC,CAAC;IACa,SAAS,GAAG,KAAK,CAAkC,SAAS,sDAC1E,KAAK,EAAE,+BAA+B,GACtC,CAAC;IACa,MAAM,GAAG,KAAK,CAA+B,SAAS,mDACpE,KAAK,EAAE,4BAA4B,GACnC,CAAC;IACa,SAAS,GAAG,KAAK,CAAyC,SAAS,sDACjF,KAAK,EAAE,+BAA+B,GACtC,CAAC;IACa,WAAW,GAAG,KAAK,CAA0B,SAAS,wDACpE,KAAK,EAAE,iCAAiC,GACxC,CAAC;IAEH,IACc,MAAM;QAClB,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IACzD,CAAC;IAED,IACc,OAAO;QACnB,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;IAC7D,CAAC;IAED,IACc,aAAa;QACzB,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC,iBAAiB,EAAE,CAAC;IAClC,CAAC;IAED,IACc,eAAe;QAC3B,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC,UAAU,EAAE,CAAC,oBAAoB,EAAE,CAAC,kBAAkB,CAAC,IAAI,IAAI,CAAC;IAC3F,CAAC;IAED,IACc,SAAS;QACrB,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC,UAAU,EAAE,CAAC,oBAAoB,EAAE,CAAC,YAAY,CAAC,IAAI,IAAI,CAAC;IACrF,CAAC;IAED,IACc,cAAc;QAC1B,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC,UAAU,EAAE,CAAC,oBAAoB,EAAE,CAAC,iBAAiB,CAAC,IAAI,IAAI,CAAC;IAC1F,CAAC;IAED,IACc,SAAS;QACrB,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC,UAAU,EAAE,CAAC,oBAAoB,EAAE,CAAC,YAAY,CAAC,IAAI,IAAI,CAAC;IACrF,CAAC;IAED,IACc,QAAQ;QACpB,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC,UAAU,EAAE,CAAC,oBAAoB,EAAE,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC;IACpF,CAAC;IAED,IACc,YAAY;QACxB,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC,UAAU,EAAE,CAAC,oBAAoB,EAAE,CAAC,eAAe,CAAC,IAAI,IAAI,CAAC;IACxF,CAAC;IAED,IACc,QAAQ;QACpB,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC,UAAU,EAAE,CAAC,oBAAoB,EAAE,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC;IACpF,CAAC;IAED,IACc,EAAE;QACd,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC,UAAU,EAAE,CAAC,oBAAoB,EAAE,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;IAC7E,CAAC;IAED,IACc,IAAI;QAChB,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC,UAAU,EAAE,CAAC,oBAAoB,EAAE,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC;IAC/E,CAAC;IAGS,SAAS,CAAC,KAAoB;QACtC,IAAI,CAAC,UAAU,EAAE,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAChD,CAAC;IAED;QACE,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAE/B,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE;YACnB,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;YACrC,UAAU,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;YACrD,MAAM,WAAW,GAAG,UAAU,CAAC,SAAS,CAAC,GAAG,EAAE;gBAC5C,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;YAClD,CAAC,CAAC,CAAC;YAEH,SAAS,CAAC,GAAG,EAAE;gBACb,WAAW,EAAE,CAAC;gBACd,UAAU,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;YACnC,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,GAAG,EAAE;YACV,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC;YACjD,IAAI,CAAC,aAAa,EAAE,CAAC;YACrB,IAAI,CAAC,SAAS,EAAE,CAAC;YACjB,IAAI,CAAC,MAAM,EAAE,CAAC;YACd,IAAI,CAAC,SAAS,EAAE,CAAC;YACjB,IAAI,CAAC,WAAW,EAAE,CAAC;YACnB,IAAI,CAAC,MAAM,EAAE,CAAC;YAEd,IAAI,IAAI,EAAE,CAAC;gBACT,IAAI,CAAC,sBAAsB,EAAE,CAAC;gBAC9B,OAAO;YACT,CAAC;YAED,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC9B,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,GAAG,EAAE;YAC7B,IAAI,IAAI,CAAC,kBAAkB,KAAK,IAAI,IAAI,IAAI,CAAC,WAAW,KAAK,IAAI,EAAE,CAAC;gBAClE,IAAI,CAAC,WAAW,CAAC,oBAAoB,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;gBAC/D,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;YACjC,CAAC;YAED,IAAI,CAAC,2BAA2B,EAAE,CAAC;YACnC,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,uBAAuB;QAC7B,IAAI,IAAI,CAAC,kBAAkB,KAAK,IAAI,EAAE,CAAC;YACrC,OAAO;QACT,CAAC;QAED,MAAM,mBAAmB,GAAG,IAAI,CAAC,aAAa,IAAI,QAAQ,CAAC;QAC3D,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC;QACzC,IAAI,CAAC,kBAAkB,GAAG,mBAAmB,CAAC,aAAa,CAAC,+BAA+B,CAAC,CAAC;QAC7F,IAAI,CAAC,qBAAqB,GAAG,OAAO,CAAC,UAAU,CAAC;QAChD,MAAM,WAAW,GAAG,IAAI,CAAC,kBAAkB,CAAC;QAC5C,IAAI,IAAI,CAAC,qBAAqB,KAAK,IAAI,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;YAChE,IAAI,CAAC,qBAAqB,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;IAED;;;;OAIG;IACK,sBAAsB;QAC5B,MAAM,cAAc,GAAG,oBAAoB,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QAC3D,IAAI,cAAc,KAAK,IAAI,EAAE,CAAC;YAC5B,OAAO,cAAc,CAAC;QACxB,CAAC;QAED,MAAM,KAAK,GACT,IAAI,CAAC,kBAAkB,EAAE,UAAU,YAAY,WAAW;YACxD,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,UAAU;YACpC,CAAC,CAAC,IAAI,CAAC,qBAAqB,YAAY,WAAW;gBACjD,CAAC,CAAC,IAAI,CAAC,qBAAqB;gBAC5B,CAAC,CAAC,IAAI,CAAC;QAEb,OAAO,CACL,KAAK,EAAE,aAAa,CAAC,sCAAsC,CAAC;YAC5D,KAAK,EAAE,aAAa,CAAC,kCAAkC,CAAC,CACnC,CAAC;IAC1B,CAAC;IAED;;;;OAIG;IACK,YAAY;QAClB,MAAM,gBAAgB,GAAG,IAAI,CAAC,sBAAsB,EAAE,CAAC;QACvD,OAAO,mBAAmB,CAAC,gBAAgB,CAAC,IAAI,gBAAgB,CAAC;IACnE,CAAC;IAEO,kBAAkB;QACxB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,UAAU,EAAE,CAAC,IAAI,IAAI,IAAI,CAAC,WAAW,KAAK,IAAI,EAAE,CAAC;YACtE,OAAO;QACT,CAAC;QAED,IAAI,IAAI,CAAC,kBAAkB,KAAK,IAAI,EAAE,CAAC;YACrC,IAAI,CAAC,WAAW,CAAC,oBAAoB,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACjE,CAAC;QAED,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,WAAW,CAAC,qBAAqB,CAAC,GAAG,EAAE;YACpE,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;YAC/B,IAAI,CAAC,eAAe,EAAE,CAAC;QACzB,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,eAAe;QACrB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC;QACzC,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QACnC,IAAI,MAAM,KAAK,IAAI,IAAI,IAAI,CAAC,WAAW,KAAK,IAAI,EAAE,CAAC;YACjD,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GAAG,4BAA4B,CAAC;YAC1C,MAAM;YACN,UAAU,EAAE,aAAa,CAAC,MAAM,CAAC;YACjC,SAAS,EAAE,IAAI,CAAC,gBAAgB,EAAE;YAClC,SAAS,EAAE,IAAI,CAAC,gBAAgB,EAAE;YAClC,MAAM,EAAE,IAAI,CAAC,aAAa,EAAE;YAC5B,OAAO;YACP,SAAS,EAAE,IAAI,CAAC,gBAAgB,EAAE;YAClC,cAAc,EAAE,uBAAuB;YACvC,SAAS,EAAE,IAAI,CAAC,WAAW;SAC5B,CAAC,CAAC;QACH,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QACrE,OAAO,CAAC,KAAK,CAAC,UAAU,GAAG,EAAE,CAAC;IAChC,CAAC;IAEO,wBAAwB;QAC9B,IAAI,IAAI,CAAC,WAAW,KAAK,IAAI,IAAI,IAAI,CAAC,oBAAoB,KAAK,IAAI,EAAE,CAAC;YACpE,OAAO;QACT,CAAC;QAED,MAAM,QAAQ,GAAG,GAAS,EAAE;YAC1B,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC5B,CAAC,CAAC;QAEF,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACtD,IAAI,CAAC,oBAAoB,GAAG,GAAS,EAAE;YACrC,IAAI,CAAC,WAAW,EAAE,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAC5D,CAAC,CAAC;QAEF,IAAI,gBAAgB,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACzC,MAAM,kBAAkB,GAAG,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC;YAC3D,IAAI,CAAC,cAAc,GAAG,IAAI,kBAAkB,CAAC,GAAG,EAAE;gBAChD,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC5B,CAAC,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;YACnC,IAAI,MAAM,KAAK,IAAI,IAAI,IAAI,CAAC,cAAc,KAAK,IAAI,EAAE,CAAC;gBACpD,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACtC,CAAC;YAED,IAAI,CAAC,cAAc,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;IAEO,2BAA2B;QACjC,IAAI,CAAC,oBAAoB,EAAE,EAAE,CAAC;QAC9B,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC;QACjC,IAAI,CAAC,cAAc,EAAE,UAAU,EAAE,CAAC;QAClC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;IAC7B,CAAC;IAEO,sBAAsB;QAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC;QACzC,MAAM,WAAW,GAAG,yBAAyB,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,IAAI,CAAC,sBAAsB,EAAE,CAAC;QACnG,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;YACzB,OAAO;QACT,CAAC;QAED,sBAAsB,CAAC;YACrB,OAAO,EAAE,+BAA+B;YACxC,KAAK,EAAE,OAAO;YACd,MAAM,EAAE,WAAW;SACpB,CAAC,CAAC;IACL,CAAC;IAEO,uBAAuB;QAC7B,uBAAuB,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,+BAA+B,CAAC,CAAC;IACrF,CAAC;IAEO,sBAAsB;QAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC;QACzC,IAAI,IAAI,CAAC,aAAa,KAAK,IAAI,EAAE,CAAC;YAChC,OAAO;QACT,CAAC;QAED,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAChC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAEzC,IAAI,OAAO,CAAC,UAAU,KAAK,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;YACnD,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAC/C,CAAC;QAED,oCAAoC,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;QAC/D,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAE9B,cAAc,CAAC,GAAG,EAAE;YAClB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,CAAC;gBACzC,OAAO;YACT,CAAC;YAED,IAAI,CAAC,eAAe,EAAE,CAAC;QACzB,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,oBAAoB,CAAC,KAAK,GAAG,KAAK;QACxC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC;QACzC,IAAI,CAAC,KAAK,IAAI,OAAO,CAAC,UAAU,KAAK,IAAI,CAAC,aAAa,EAAE,IAAI,EAAE,CAAC;YAC9D,OAAO;QACT,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,kBAAkB,CAAC;QAC5C,IAAI,WAAW,EAAE,UAAU,KAAK,IAAI,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;YAC7D,WAAW,CAAC,UAAU,CAAC,YAAY,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;QAC5D,CAAC;aAAM,IAAI,IAAI,CAAC,qBAAqB,KAAK,IAAI,EAAE,CAAC;YAC/C,IAAI,CAAC,qBAAqB,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAClD,CAAC;QAED,IAAI,CAAC,2BAA2B,EAAE,CAAC;QACnC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACzC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QACtF,IAAI,CAAC,uBAAuB,EAAE,CAAC;QAC/B,oCAAoC,CAAC,OAAO,CAAC,CAAC;QAC9C,OAAO,CAAC,KAAK,CAAC,SAAS,GAAG,EAAE,CAAC;QAC7B,OAAO,CAAC,KAAK,CAAC,QAAQ,GAAG,EAAE,CAAC;QAC5B,OAAO,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC;IAC3B,CAAC;IAEO,gBAAgB;QACtB,OAAO,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAChE,CAAC;IAEO,aAAa;QACnB,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACrC,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;YACjC,OAAO,cAAc,CAAC;QACxB,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAClD,OAAO;YACL,IAAI,EACF,WAAW,KAAK,IAAI;gBAClB,CAAC,CAAC,cAAc;gBAChB,CAAC,CAAC,0BAA0B,CACxB,WAAW,EACX,8BAA8B,EAC9B,cAAc,CACf;SACR,CAAC;IACJ,CAAC;IAEO,gBAAgB;QACtB,OAAO,IAAI,CAAC,SAAS,EAAE,IAAI;YACzB,IAAI,EAAE,IAAI;YACV,OAAO,EAAE,uBAAuB;YAChC,KAAK,EAAE,KAAK;SACb,CAAC;IACJ,CAAC;IAEO,gBAAgB;QACtB,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC,UAAU,EAAE,CAAC,iBAAiB,EAAE,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;IAC7F,CAAC;uGA5XU,oBAAoB;2FAApB,oBAAoB;;2FAApB,oBAAoB;kBAJhC,SAAS;mBAAC;oBACT,QAAQ,EAAE,wBAAwB;oBAClC,QAAQ,EAAE,sBAAsB;iBACjC;;sBAuCE,WAAW;uBAAC,aAAa;;sBAMzB,WAAW;uBAAC,eAAe;;sBAM3B,WAAW;uBAAC,qBAAqB;;sBAMjC,WAAW;uBAAC,uBAAuB;;sBAMnC,WAAW;uBAAC,iBAAiB;;sBAM7B,WAAW;uBAAC,sBAAsB;;sBAMlC,WAAW;uBAAC,iBAAiB;;sBAM7B,WAAW;uBAAC,gBAAgB;;sBAM5B,WAAW;uBAAC,oBAAoB;;sBAMhC,WAAW;uBAAC,gBAAgB;;sBAM5B,WAAW;uBAAC,SAAS;;sBAMrB,WAAW;uBAAC,WAAW;;sBAMvB,YAAY;uBAAC,SAAS,EAAE,CAAC,QAAQ,CAAC","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 {\n TngDatepickerAttributeMap,\n} from './datepicker.types';\n\ntype TngDatepickerOverlayController = Readonly<{\n handleOverlayKeyDown: (event: KeyboardEvent) => void;\n getOutputs: () => Readonly<{\n getHostAttributes: () => TngDatepickerAttributeMap;\n getOverlayAttributes: () => TngDatepickerAttributeMap;\n open: boolean;\n }>;\n registerOverlay: (element: HTMLElement | null) => void;\n subscribe: (listener: (event: unknown) => void) => () => void;\n}>;\n\ntype OverlayAnchorInput =\n | ElementRef<HTMLElement>\n | HTMLElement\n | null\n | undefined;\ntype OverlayThemeSourceInput = OverlayAnchorInput;\n\nconst PORTALLED_DATEPICKER_THEME_VARS = [\n '--tng-datepicker-radius',\n '--tng-datepicker-field-height',\n '--tng-datepicker-overlay-gap',\n '--tng-datepicker-day-cell-size',\n '--tng-datepicker-picker-cell-size',\n '--tng-datepicker-grid-gap',\n '--tng-datepicker-inline-gap',\n '--tng-datepicker-overlay-padding',\n '--tng-datepicker-nav-size',\n '--tng-datepicker-border',\n '--tng-datepicker-border-strong',\n '--tng-datepicker-bg',\n '--tng-datepicker-surface',\n '--tng-datepicker-canvas',\n '--tng-datepicker-fg',\n '--tng-datepicker-muted',\n '--tng-datepicker-brand',\n '--tng-datepicker-danger',\n '--tng-datepicker-focus',\n '--tng-datepicker-shadow',\n '--tng-datepicker-focus-shadow',\n '--tng-datepicker-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-datepicker-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-datepicker-z-overlay, var(--tng-z-overlay, 1000))';\nconst createDatepickerOverlayLockId = createTngIdFactory('tng-datepicker-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('[data-slot=\"form-field-control-row\"]') 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: '[tngDatepickerOverlay]',\n exportAs: 'tngDatepickerOverlay',\n})\nexport class TngDatepickerOverlay {\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 = createDatepickerOverlayLockId();\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<TngDatepickerOverlayController>({\n alias: 'tngDatepickerOverlay',\n });\n public readonly anchor = input<OverlayAnchorInput>(undefined, {\n alias: 'tngDatepickerOverlayAnchor',\n });\n public readonly placement = input<TngOverlayPlacement | undefined>(undefined, {\n alias: 'tngDatepickerOverlayPlacement',\n });\n public readonly offset = input<TngOverlayOffset | undefined>(undefined, {\n alias: 'tngDatepickerOverlayOffset',\n });\n public readonly collision = input<TngOverlayCollisionOptions | undefined>(undefined, {\n alias: 'tngDatepickerOverlayCollision',\n });\n public readonly themeSource = input<OverlayThemeSourceInput>(undefined, {\n alias: 'tngDatepickerOverlayThemeSource',\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('tng-datepicker-overlay-anchor');\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/datepicker-owned anchor (input-shell or trigger).\n * This is the element used to read datepicker-scoped CSS custom properties\n * (e.g. `--tng-datepicker-overlay-gap`) and to align the overlay vertically.\n */\n private findDatepickerAnchorEl(): 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 (\n scope?.querySelector('[data-slot=\"datepicker-input-shell\"]') ??\n scope?.querySelector('[data-slot=\"datepicker-trigger\"]')\n ) 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 datepicker-owned anchor otherwise.\n */\n private findAnchorEl(): HTMLElement | null {\n const datepickerAnchor = this.findDatepickerAnchorEl();\n return findFormFieldAnchor(datepickerAnchor) ?? datepickerAnchor;\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 = resolveThemeSourceElement(this.themeSource()) ?? this.findDatepickerAnchorEl();\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.findDatepickerAnchorEl();\n return {\n side:\n themeSource === null\n ? OVERLAY_OFFSET\n : resolveCssCustomPropertyPx(\n themeSource,\n '--tng-datepicker-overlay-gap',\n OVERLAY_OFFSET,\n ),\n };\n }\n\n private resolveCollision(): TngOverlayCollisionOptions {\n return this.collision() ?? {\n flip: true,\n padding: OVERLAY_VIEWPORT_MARGIN,\n shift: false,\n };\n }\n\n private resolveDirection(): 'ltr' | 'rtl' {\n return this.controller().getOutputs().getHostAttributes()['dir'] === 'rtl' ? 'rtl' : 'ltr';\n }\n}\n"]}
|
package/src/lib/form/index.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export * from './listbox/listbox.directive';
|
|
2
2
|
export * from './listbox/option.directive';
|
|
3
3
|
export * from './listbox/tokens';
|
|
4
|
+
export * from './_shared/id';
|
|
4
5
|
export * from './autocomplete';
|
|
5
6
|
export * from './button-toggle/tng-button-toggle';
|
|
6
7
|
export * from './checkbox/tng-checkbox';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../libs/tailng-ui/primitives/src/lib/form/index.ts"],"names":[],"mappings":"AAKA,cAAc,6BAA6B,CAAC;AAC5C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mCAAmC,CAAC;AAClD,cAAc,yBAAyB,CAAC;AACxC,cAAc,mBAAmB,CAAC;AAClC,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AAErC,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,mCAAmC,CAAC;AAElD,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iCAAiC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../libs/tailng-ui/primitives/src/lib/form/index.ts"],"names":[],"mappings":"AAKA,cAAc,6BAA6B,CAAC;AAC5C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mCAAmC,CAAC;AAClD,cAAc,yBAAyB,CAAC;AACxC,cAAc,mBAAmB,CAAC;AAClC,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AAErC,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,mCAAmC,CAAC;AAElD,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iCAAiC,CAAC"}
|
package/src/lib/form/index.js
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
export * from './listbox/listbox.directive';
|
|
6
6
|
export * from './listbox/option.directive';
|
|
7
7
|
export * from './listbox/tokens';
|
|
8
|
+
export * from './_shared/id';
|
|
8
9
|
export * from './autocomplete';
|
|
9
10
|
export * from './button-toggle/tng-button-toggle';
|
|
10
11
|
export * from './checkbox/tng-checkbox';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../libs/tailng-ui/primitives/src/lib/form/index.ts"],"names":[],"mappings":"AAAA,kBAAkB;AAClB,EAAE;AACF,+FAA+F;AAC/F,4CAA4C;AAE5C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mCAAmC,CAAC;AAClD,cAAc,yBAAyB,CAAC;AACxC,cAAc,mBAAmB,CAAC;AAClC,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AAErC,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,mCAAmC,CAAC;AAElD,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iCAAiC,CAAC","sourcesContent":["// Form primitives\n//\n// Note: keep exports aligned with `src/index.ts` (root barrel) so the public API stays stable.\n// The root barrel will re-export this file.\n\nexport * from './listbox/listbox.directive';\nexport * from './listbox/option.directive';\nexport * from './listbox/tokens';\nexport * from './autocomplete';\nexport * from './button-toggle/tng-button-toggle';\nexport * from './checkbox/tng-checkbox';\nexport * from './chips/tng-chips';\nexport * from './datepicker';\nexport * from './input/tng-input';\nexport * from './input/tng-input-group';\nexport * from './input/tng-adornment';\nexport * from './input-otp/tng-input-otp';\nexport * from './label/tng-label';\nexport * from './multi-select';\nexport * from './radio/tng-radio';\nexport * from './multi-autocomplete';\n\nexport * from './select/tng-select';\nexport * from './select/tng-select.parts';\nexport * from './select/tng-select.overlay';\nexport * from './select/tng-select.listbox';\nexport * from './select/tng-select.listbox.types';\n\nexport * from './slider/tng-slider';\nexport * from './switch/tng-switch';\nexport * from './textarea/tng-textarea';\nexport * from './toggle/tng-toggle';\nexport * from './toggle-group/tng-toggle-group';\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../libs/tailng-ui/primitives/src/lib/form/index.ts"],"names":[],"mappings":"AAAA,kBAAkB;AAClB,EAAE;AACF,+FAA+F;AAC/F,4CAA4C;AAE5C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mCAAmC,CAAC;AAClD,cAAc,yBAAyB,CAAC;AACxC,cAAc,mBAAmB,CAAC;AAClC,cAAc,cAAc,CAAC;AAC7B,cAAc,mBAAmB,CAAC;AAClC,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC;AAErC,cAAc,qBAAqB,CAAC;AACpC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,mCAAmC,CAAC;AAElD,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iCAAiC,CAAC","sourcesContent":["// Form primitives\n//\n// Note: keep exports aligned with `src/index.ts` (root barrel) so the public API stays stable.\n// The root barrel will re-export this file.\n\nexport * from './listbox/listbox.directive';\nexport * from './listbox/option.directive';\nexport * from './listbox/tokens';\nexport * from './_shared/id';\nexport * from './autocomplete';\nexport * from './button-toggle/tng-button-toggle';\nexport * from './checkbox/tng-checkbox';\nexport * from './chips/tng-chips';\nexport * from './datepicker';\nexport * from './input/tng-input';\nexport * from './input/tng-input-group';\nexport * from './input/tng-adornment';\nexport * from './input-otp/tng-input-otp';\nexport * from './label/tng-label';\nexport * from './multi-select';\nexport * from './radio/tng-radio';\nexport * from './multi-autocomplete';\n\nexport * from './select/tng-select';\nexport * from './select/tng-select.parts';\nexport * from './select/tng-select.overlay';\nexport * from './select/tng-select.listbox';\nexport * from './select/tng-select.listbox.types';\n\nexport * from './slider/tng-slider';\nexport * from './switch/tng-switch';\nexport * from './textarea/tng-textarea';\nexport * from './toggle/tng-toggle';\nexport * from './toggle-group/tng-toggle-group';\n"]}
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import * as i0 from "@angular/core";
|
|
2
|
-
export declare class
|
|
2
|
+
export declare class TngInputFieldPrefix {
|
|
3
3
|
readonly hostElement: HTMLElement;
|
|
4
4
|
protected readonly dataSlot: "input-leading";
|
|
5
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<
|
|
6
|
-
static ɵdir: i0.ɵɵDirectiveDeclaration<
|
|
5
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<TngInputFieldPrefix, never>;
|
|
6
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<TngInputFieldPrefix, "[tngInputFieldPrefix], [tngInputLeading]", ["tngInputFieldPrefix"], {}, {}, never, never, true, never>;
|
|
7
7
|
}
|
|
8
|
-
export declare class
|
|
8
|
+
export declare class TngInputFieldSuffix {
|
|
9
9
|
readonly hostElement: HTMLElement;
|
|
10
10
|
protected readonly dataSlot: "input-trailing";
|
|
11
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<
|
|
12
|
-
static ɵdir: i0.ɵɵDirectiveDeclaration<
|
|
11
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<TngInputFieldSuffix, never>;
|
|
12
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<TngInputFieldSuffix, "[tngInputFieldSuffix], [tngInputTrailing]", ["tngInputFieldSuffix"], {}, {}, never, never, true, never>;
|
|
13
13
|
}
|
|
14
14
|
//# sourceMappingURL=tng-adornment.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tng-adornment.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/form/input/tng-adornment.ts"],"names":[],"mappings":";AAEA,qBAIa,
|
|
1
|
+
{"version":3,"file":"tng-adornment.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/form/input/tng-adornment.ts"],"names":[],"mappings":";AAEA,qBAIa,mBAAmB;IAC9B,SAAgB,WAAW,EAAE,WAAW,CAAgE;IAGxG,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAG,eAAe,CAAU;yCAJ5C,mBAAmB;2CAAnB,mBAAmB;CAK/B;AAED,qBAIa,mBAAmB;IAC9B,SAAgB,WAAW,EAAE,WAAW,CAAgE;IAGxG,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAG,gBAAgB,CAAU;yCAJ7C,mBAAmB;2CAAnB,mBAAmB;CAK/B"}
|
|
@@ -1,32 +1,32 @@
|
|
|
1
1
|
import { Directive, ElementRef, HostBinding, inject } from '@angular/core';
|
|
2
2
|
import * as i0 from "@angular/core";
|
|
3
|
-
export class
|
|
3
|
+
export class TngInputFieldPrefix {
|
|
4
4
|
hostElement = inject((ElementRef)).nativeElement;
|
|
5
5
|
dataSlot = 'input-leading';
|
|
6
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type:
|
|
7
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.1.1", type:
|
|
6
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: TngInputFieldPrefix, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
7
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.1.1", type: TngInputFieldPrefix, isStandalone: true, selector: "[tngInputFieldPrefix], [tngInputLeading]", host: { properties: { "attr.data-slot": "this.dataSlot" } }, exportAs: ["tngInputFieldPrefix"], ngImport: i0 });
|
|
8
8
|
}
|
|
9
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type:
|
|
9
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: TngInputFieldPrefix, decorators: [{
|
|
10
10
|
type: Directive,
|
|
11
11
|
args: [{
|
|
12
|
-
selector: '[
|
|
13
|
-
exportAs: '
|
|
12
|
+
selector: '[tngInputFieldPrefix], [tngInputLeading]',
|
|
13
|
+
exportAs: 'tngInputFieldPrefix',
|
|
14
14
|
}]
|
|
15
15
|
}], propDecorators: { dataSlot: [{
|
|
16
16
|
type: HostBinding,
|
|
17
17
|
args: ['attr.data-slot']
|
|
18
18
|
}] } });
|
|
19
|
-
export class
|
|
19
|
+
export class TngInputFieldSuffix {
|
|
20
20
|
hostElement = inject((ElementRef)).nativeElement;
|
|
21
21
|
dataSlot = 'input-trailing';
|
|
22
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type:
|
|
23
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.1.1", type:
|
|
22
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: TngInputFieldSuffix, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
23
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.1.1", type: TngInputFieldSuffix, isStandalone: true, selector: "[tngInputFieldSuffix], [tngInputTrailing]", host: { properties: { "attr.data-slot": "this.dataSlot" } }, exportAs: ["tngInputFieldSuffix"], ngImport: i0 });
|
|
24
24
|
}
|
|
25
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type:
|
|
25
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: TngInputFieldSuffix, decorators: [{
|
|
26
26
|
type: Directive,
|
|
27
27
|
args: [{
|
|
28
|
-
selector: '[
|
|
29
|
-
exportAs: '
|
|
28
|
+
selector: '[tngInputFieldSuffix], [tngInputTrailing]',
|
|
29
|
+
exportAs: 'tngInputFieldSuffix',
|
|
30
30
|
}]
|
|
31
31
|
}], propDecorators: { dataSlot: [{
|
|
32
32
|
type: HostBinding,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tng-adornment.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/form/input/tng-adornment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;;AAM3E,MAAM,OAAO,
|
|
1
|
+
{"version":3,"file":"tng-adornment.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/form/input/tng-adornment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;;AAM3E,MAAM,OAAO,mBAAmB;IACd,WAAW,GAAgB,MAAM,CAAC,CAAA,UAAuB,CAAA,CAAC,CAAC,aAA4B,CAAC;IAGrF,QAAQ,GAAG,eAAwB,CAAC;uGAJ5C,mBAAmB;2FAAnB,mBAAmB;;2FAAnB,mBAAmB;kBAJ/B,SAAS;mBAAC;oBACT,QAAQ,EAAE,0CAA0C;oBACpD,QAAQ,EAAE,qBAAqB;iBAChC;;sBAIE,WAAW;uBAAC,gBAAgB;;AAQ/B,MAAM,OAAO,mBAAmB;IACd,WAAW,GAAgB,MAAM,CAAC,CAAA,UAAuB,CAAA,CAAC,CAAC,aAA4B,CAAC;IAGrF,QAAQ,GAAG,gBAAyB,CAAC;uGAJ7C,mBAAmB;2FAAnB,mBAAmB;;2FAAnB,mBAAmB;kBAJ/B,SAAS;mBAAC;oBACT,QAAQ,EAAE,2CAA2C;oBACrD,QAAQ,EAAE,qBAAqB;iBAChC;;sBAIE,WAAW;uBAAC,gBAAgB","sourcesContent":["import { Directive, ElementRef, HostBinding, inject } from '@angular/core';\n\n@Directive({\n selector: '[tngInputFieldPrefix], [tngInputLeading]',\n exportAs: 'tngInputFieldPrefix',\n})\nexport class TngInputFieldPrefix {\n public readonly hostElement: HTMLElement = inject(ElementRef<HTMLElement>).nativeElement as HTMLElement;\n\n @HostBinding('attr.data-slot')\n protected readonly dataSlot = 'input-leading' as const;\n}\n\n@Directive({\n selector: '[tngInputFieldSuffix], [tngInputTrailing]',\n exportAs: 'tngInputFieldSuffix',\n})\nexport class TngInputFieldSuffix {\n public readonly hostElement: HTMLElement = inject(ElementRef<HTMLElement>).nativeElement as HTMLElement;\n\n @HostBinding('attr.data-slot')\n protected readonly dataSlot = 'input-trailing' as const;\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { AfterContentInit, OnDestroy, QueryList } from '@angular/core';
|
|
2
|
-
import {
|
|
2
|
+
import { TngInputFieldPrefix, TngInputFieldSuffix } from './tng-adornment';
|
|
3
3
|
import { TngInput } from './tng-input';
|
|
4
4
|
import * as i0 from "@angular/core";
|
|
5
5
|
export declare class TngInputGroup implements AfterContentInit, OnDestroy {
|
|
@@ -10,8 +10,8 @@ export declare class TngInputGroup implements AfterContentInit, OnDestroy {
|
|
|
10
10
|
readonly readonly: import("@angular/core").InputSignal<boolean | null>;
|
|
11
11
|
readonly controlCount: import("@angular/core").InputSignal<number | null>;
|
|
12
12
|
protected controls: QueryList<TngInput>;
|
|
13
|
-
protected prefixSlots: QueryList<
|
|
14
|
-
protected suffixSlots: QueryList<
|
|
13
|
+
protected prefixSlots: QueryList<TngInputFieldPrefix>;
|
|
14
|
+
protected suffixSlots: QueryList<TngInputFieldSuffix>;
|
|
15
15
|
private readonly hostElement;
|
|
16
16
|
private focused;
|
|
17
17
|
private readonly destroyed$;
|
|
@@ -34,6 +34,6 @@ export declare class TngInputGroup implements AfterContentInit, OnDestroy {
|
|
|
34
34
|
protected primaryControl(): TngInput | null;
|
|
35
35
|
protected primaryControlElement(): HTMLInputElement | HTMLTextAreaElement | null;
|
|
36
36
|
static ɵfac: i0.ɵɵFactoryDeclaration<TngInputGroup, never>;
|
|
37
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<TngInputGroup, "tng-input-group, [tngInputGroup]", ["tngInputGroup"], { "hasLeading": { "alias": "hasLeading"; "required": false; "isSignal": true; }; "hasTrailing": { "alias": "hasTrailing"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "controlCount": { "alias": "controlCount"; "required": false; "isSignal": true; }; }, {}, ["controls", "prefixSlots", "suffixSlots"], ["[
|
|
37
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<TngInputGroup, "tng-input-group, [tngInputGroup]", ["tngInputGroup"], { "hasLeading": { "alias": "hasLeading"; "required": false; "isSignal": true; }; "hasTrailing": { "alias": "hasTrailing"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "invalid": { "alias": "invalid"; "required": false; "isSignal": true; }; "readonly": { "alias": "readonly"; "required": false; "isSignal": true; }; "controlCount": { "alias": "controlCount"; "required": false; "isSignal": true; }; }, {}, ["controls", "prefixSlots", "suffixSlots"], ["[tngInputFieldPrefix], [tngInputLeading], [data-tng-input-prefix-proxy]", "input[tngInput], textarea[tngInput], textarea[tngTextarea], [data-tng-input-control-proxy]", "[tngInputFieldSuffix], [tngInputTrailing], [data-tng-input-suffix-proxy]"], true, never>;
|
|
38
38
|
}
|
|
39
39
|
//# sourceMappingURL=tng-input-group.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tng-input-group.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/form/input/tng-input-group.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAa5E,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"tng-input-group.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/form/input/tng-input-group.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAa5E,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAC3E,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;;AAMvC,qBA6Ca,aAAc,YAAW,gBAAgB,EAAE,SAAS;IAC/D,SAAgB,UAAU,sDAA+B;IACzD,SAAgB,WAAW,sDAA+B;IAC1D,SAAgB,QAAQ,sDAA+B;IACvD,SAAgB,OAAO,sDAA+B;IACtD,SAAgB,QAAQ,sDAA+B;IACvD,SAAgB,YAAY,qDAA8B;IAG1D,SAAS,CAAC,QAAQ,EAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;IAGzC,SAAS,CAAC,WAAW,EAAG,SAAS,CAAC,mBAAmB,CAAC,CAAC;IAGvD,SAAS,CAAC,WAAW,EAAG,SAAS,CAAC,mBAAmB,CAAC,CAAC;IAEvD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA6E;IACzG,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAuB;IAElD,OAAO,CAAC,qBAAqB;IAmBtB,kBAAkB,IAAI,IAAI;IAM1B,WAAW,IAAI,IAAI;IAM1B,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAG,aAAa,CAAU;IAGrD,SAAS,KAAK,cAAc,IAAI,EAAE,GAAG,IAAI,CAExC;IAGD,SAAS,KAAK,eAAe,IAAI,EAAE,GAAG,IAAI,CAEzC;IAGD,SAAS,KAAK,YAAY,IAAI,EAAE,GAAG,IAAI,CAUtC;IAGD,SAAS,KAAK,WAAW,IAAI,EAAE,GAAG,IAAI,CAWrC;IAGD,SAAS,KAAK,YAAY,IAAI,EAAE,GAAG,IAAI,CAUtC;IAGD,SAAS,KAAK,WAAW,IAAI,EAAE,GAAG,IAAI,CAErC;IAGD,SAAS,CAAC,SAAS,IAAI,IAAI;IAK3B,SAAS,CAAC,UAAU,CAAC,UAAU,EAAE,QAAQ,CAAC,WAAW,CAAC,GAAG,IAAI,GAAG,IAAI;IAMpE,SAAS,CAAC,cAAc,IAAI,OAAO;IAoBnC,SAAS,CAAC,eAAe,IAAI,OAAO;IAoBpC,SAAS,CAAC,mBAAmB,IAAI,OAAO;IAMxC,SAAS,CAAC,oBAAoB,IAAI,OAAO;IAMzC,SAAS,CAAC,cAAc,IAAI,QAAQ,GAAG,IAAI;IAK3C,SAAS,CAAC,qBAAqB,IAAI,gBAAgB,GAAG,mBAAmB,GAAG,IAAI;yCAlLrE,aAAa;2CAAb,aAAa;CA6LzB"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Component, ContentChildren, ElementRef, HostBinding, HostListener, inject, input, isDevMode, } from '@angular/core';
|
|
2
2
|
import { Subject, takeUntil } from 'rxjs';
|
|
3
|
-
import {
|
|
3
|
+
import { TngInputFieldPrefix, TngInputFieldSuffix } from './tng-adornment';
|
|
4
4
|
import { TngInput } from './tng-input';
|
|
5
5
|
import * as i0 from "@angular/core";
|
|
6
6
|
function containsProjectedContent(childElementCount, textContent) {
|
|
@@ -149,10 +149,10 @@ export class TngInputGroup {
|
|
|
149
149
|
return null;
|
|
150
150
|
}
|
|
151
151
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.1", ngImport: i0, type: TngInputGroup, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
152
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.1", type: TngInputGroup, isStandalone: true, selector: "tng-input-group, [tngInputGroup]", inputs: { hasLeading: { classPropertyName: "hasLeading", publicName: "hasLeading", isSignal: true, isRequired: false, transformFunction: null }, hasTrailing: { classPropertyName: "hasTrailing", publicName: "hasTrailing", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, invalid: { classPropertyName: "invalid", publicName: "invalid", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, controlCount: { classPropertyName: "controlCount", publicName: "controlCount", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "focusin": "onFocusIn()", "focusout": "onFocusOut($event.relatedTarget)" }, properties: { "attr.data-slot": "this.dataSlot", "attr.data-has-leading": "this.dataHasLeading", "attr.data-has-trailing": "this.dataHasTrailing", "attr.data-disabled": "this.dataDisabled", "attr.data-invalid": "this.dataInvalid", "attr.data-readonly": "this.dataReadonly", "attr.data-focused": "this.dataFocused" } }, queries: [{ propertyName: "controls", predicate: TngInput, descendants: true }, { propertyName: "prefixSlots", predicate:
|
|
152
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.1", type: TngInputGroup, isStandalone: true, selector: "tng-input-group, [tngInputGroup]", inputs: { hasLeading: { classPropertyName: "hasLeading", publicName: "hasLeading", isSignal: true, isRequired: false, transformFunction: null }, hasTrailing: { classPropertyName: "hasTrailing", publicName: "hasTrailing", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, invalid: { classPropertyName: "invalid", publicName: "invalid", isSignal: true, isRequired: false, transformFunction: null }, readonly: { classPropertyName: "readonly", publicName: "readonly", isSignal: true, isRequired: false, transformFunction: null }, controlCount: { classPropertyName: "controlCount", publicName: "controlCount", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "focusin": "onFocusIn()", "focusout": "onFocusOut($event.relatedTarget)" }, properties: { "attr.data-slot": "this.dataSlot", "attr.data-has-leading": "this.dataHasLeading", "attr.data-has-trailing": "this.dataHasTrailing", "attr.data-disabled": "this.dataDisabled", "attr.data-invalid": "this.dataInvalid", "attr.data-readonly": "this.dataReadonly", "attr.data-focused": "this.dataFocused" } }, queries: [{ propertyName: "controls", predicate: TngInput, descendants: true }, { propertyName: "prefixSlots", predicate: TngInputFieldPrefix, descendants: true }, { propertyName: "suffixSlots", predicate: TngInputFieldSuffix, descendants: true }], exportAs: ["tngInputGroup"], ngImport: i0, template: `
|
|
153
153
|
@if (hasLeadingSlot()) {
|
|
154
154
|
<span class="tng-input-group-leading" data-slot="input-group-leading">
|
|
155
|
-
<ng-content select="[
|
|
155
|
+
<ng-content select="[tngInputFieldPrefix], [tngInputLeading], [data-tng-input-prefix-proxy]"></ng-content>
|
|
156
156
|
</span>
|
|
157
157
|
}
|
|
158
158
|
|
|
@@ -162,7 +162,7 @@ export class TngInputGroup {
|
|
|
162
162
|
|
|
163
163
|
@if (hasTrailingSlot()) {
|
|
164
164
|
<span class="tng-input-group-trailing" data-slot="input-group-trailing">
|
|
165
|
-
<ng-content select="[
|
|
165
|
+
<ng-content select="[tngInputFieldSuffix], [tngInputTrailing], [data-tng-input-suffix-proxy]"></ng-content>
|
|
166
166
|
</span>
|
|
167
167
|
}
|
|
168
168
|
`, isInline: true, styles: ["\n :host {\n display: flex;\n align-items: center;\n min-width: 0;\n }\n\n .tng-input-group-leading,\n .tng-input-group-trailing {\n flex: 0 0 auto;\n display: inline-flex;\n align-items: center;\n min-width: 0;\n }\n\n .tng-input-group-control {\n flex: 1 1 auto;\n display: flex;\n align-items: center;\n min-width: 0;\n }\n "] });
|
|
@@ -172,7 +172,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.1", ngImpor
|
|
|
172
172
|
args: [{ selector: 'tng-input-group, [tngInputGroup]', exportAs: 'tngInputGroup', template: `
|
|
173
173
|
@if (hasLeadingSlot()) {
|
|
174
174
|
<span class="tng-input-group-leading" data-slot="input-group-leading">
|
|
175
|
-
<ng-content select="[
|
|
175
|
+
<ng-content select="[tngInputFieldPrefix], [tngInputLeading], [data-tng-input-prefix-proxy]"></ng-content>
|
|
176
176
|
</span>
|
|
177
177
|
}
|
|
178
178
|
|
|
@@ -182,7 +182,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.1", ngImpor
|
|
|
182
182
|
|
|
183
183
|
@if (hasTrailingSlot()) {
|
|
184
184
|
<span class="tng-input-group-trailing" data-slot="input-group-trailing">
|
|
185
|
-
<ng-content select="[
|
|
185
|
+
<ng-content select="[tngInputFieldSuffix], [tngInputTrailing], [data-tng-input-suffix-proxy]"></ng-content>
|
|
186
186
|
</span>
|
|
187
187
|
}
|
|
188
188
|
`, styles: ["\n :host {\n display: flex;\n align-items: center;\n min-width: 0;\n }\n\n .tng-input-group-leading,\n .tng-input-group-trailing {\n flex: 0 0 auto;\n display: inline-flex;\n align-items: center;\n min-width: 0;\n }\n\n .tng-input-group-control {\n flex: 1 1 auto;\n display: flex;\n align-items: center;\n min-width: 0;\n }\n "] }]
|
|
@@ -191,10 +191,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.1", ngImpor
|
|
|
191
191
|
args: [TngInput, { descendants: true }]
|
|
192
192
|
}], prefixSlots: [{
|
|
193
193
|
type: ContentChildren,
|
|
194
|
-
args: [
|
|
194
|
+
args: [TngInputFieldPrefix, { descendants: true }]
|
|
195
195
|
}], suffixSlots: [{
|
|
196
196
|
type: ContentChildren,
|
|
197
|
-
args: [
|
|
197
|
+
args: [TngInputFieldSuffix, { descendants: true }]
|
|
198
198
|
}], dataSlot: [{
|
|
199
199
|
type: HostBinding,
|
|
200
200
|
args: ['attr.data-slot']
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tng-input-group.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/form/input/tng-input-group.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AfterContentInit, OnDestroy, QueryList } from '@angular/core';\nimport {\n Component,\n ContentChildren,\n ElementRef,\n HostBinding,\n HostListener,\n inject,\n input,\n isDevMode,\n} from '@angular/core';\nimport { Subject, takeUntil } from 'rxjs';\n\nimport { TngPrefix, TngSuffix } from './tng-adornment';\nimport { TngInput } from './tng-input';\n\nfunction containsProjectedContent(childElementCount: number, textContent: string | null): boolean {\n return childElementCount > 0 || (textContent ?? '').trim().length > 0;\n}\n\n@Component({\n selector: 'tng-input-group, [tngInputGroup]',\n exportAs: 'tngInputGroup',\n template: `\n @if (hasLeadingSlot()) {\n <span class=\"tng-input-group-leading\" data-slot=\"input-group-leading\">\n <ng-content select=\"[tngPrefix], [tngInputLeading], [data-tng-input-prefix-proxy]\"></ng-content>\n </span>\n }\n\n <span class=\"tng-input-group-control\" data-slot=\"input-group-control\">\n <ng-content select=\"input[tngInput], textarea[tngInput], textarea[tngTextarea], [data-tng-input-control-proxy]\"></ng-content>\n </span>\n\n @if (hasTrailingSlot()) {\n <span class=\"tng-input-group-trailing\" data-slot=\"input-group-trailing\">\n <ng-content select=\"[tngSuffix], [tngInputTrailing], [data-tng-input-suffix-proxy]\"></ng-content>\n </span>\n }\n `,\n styles: [\n `\n :host {\n display: flex;\n align-items: center;\n min-width: 0;\n }\n\n .tng-input-group-leading,\n .tng-input-group-trailing {\n flex: 0 0 auto;\n display: inline-flex;\n align-items: center;\n min-width: 0;\n }\n\n .tng-input-group-control {\n flex: 1 1 auto;\n display: flex;\n align-items: center;\n min-width: 0;\n }\n `,\n ],\n})\nexport class TngInputGroup implements AfterContentInit, OnDestroy {\n public readonly hasLeading = input<boolean | null>(null);\n public readonly hasTrailing = input<boolean | null>(null);\n public readonly disabled = input<boolean | null>(null);\n public readonly invalid = input<boolean | null>(null);\n public readonly readonly = input<boolean | null>(null);\n public readonly controlCount = input<number | null>(null);\n\n @ContentChildren(TngInput, { descendants: true })\n protected controls!: QueryList<TngInput>;\n\n @ContentChildren(TngPrefix, { descendants: true })\n protected prefixSlots!: QueryList<TngPrefix>;\n\n @ContentChildren(TngSuffix, { descendants: true })\n protected suffixSlots!: QueryList<TngSuffix>;\n\n private readonly hostElement: HTMLElement = inject(ElementRef<HTMLElement>).nativeElement as HTMLElement;\n private focused = false;\n private readonly destroyed$ = new Subject<void>();\n\n private validateSingleControl(): void {\n if (!isDevMode()) return;\n if (!this.controls) return;\n\n const queriedCount = this.controls.length;\n const domCount = this.hostElement.querySelectorAll(\n '[data-tng-input-control-proxy] input, [data-tng-input-control-proxy] textarea, input[tngInput], textarea[tngInput], textarea[tngTextarea]',\n ).length;\n\n const count = this.controlCount() ?? (queriedCount > 0 ? queriedCount : domCount);\n\n if (count !== 1) {\n globalThis.console.warn(\n `[tngInputGroup] Expected exactly 1 control (input/textarea with tngInput or textarea with tngTextarea), but found ${count}.`,\n this.hostElement,\n );\n }\n }\n\n public ngAfterContentInit(): void {\n queueMicrotask(() => this.validateSingleControl());\n\n this.controls.changes.pipe(takeUntil(this.destroyed$)).subscribe(() => this.validateSingleControl());\n }\n\n public ngOnDestroy(): void {\n this.destroyed$.next();\n this.destroyed$.complete();\n }\n\n @HostBinding('attr.data-slot')\n protected readonly dataSlot = 'input-group' as const;\n\n @HostBinding('attr.data-has-leading')\n protected get dataHasLeading(): '' | null {\n return this.effectiveHasLeading() ? '' : null;\n }\n\n @HostBinding('attr.data-has-trailing')\n protected get dataHasTrailing(): '' | null {\n return this.effectiveHasTrailing() ? '' : null;\n }\n\n @HostBinding('attr.data-disabled')\n protected get dataDisabled(): '' | null {\n const override = this.disabled();\n if (override !== null) return override ? '' : null;\n\n const control = this.primaryControl();\n if (control !== null) return control.disabled() ? '' : null;\n\n const element = this.primaryControlElement();\n if (element === null) return null;\n return element.hasAttribute('disabled') ? '' : null;\n }\n\n @HostBinding('attr.data-invalid')\n protected get dataInvalid(): '' | null {\n const override = this.invalid();\n if (override !== null) return override ? '' : null;\n\n const control = this.primaryControl();\n if (control !== null) return control.isInvalid() ? '' : null;\n\n const element = this.primaryControlElement();\n if (element === null) return null;\n if (element.getAttribute('aria-invalid') === 'true') return '';\n return element.matches(':invalid') ? '' : null;\n }\n\n @HostBinding('attr.data-readonly')\n protected get dataReadonly(): '' | null {\n const override = this.readonly();\n if (override !== null) return override ? '' : null;\n\n const control = this.primaryControl();\n if (control !== null) return control.readonly() ? '' : null;\n\n const element = this.primaryControlElement();\n if (element === null) return null;\n return element.hasAttribute('readonly') ? '' : null;\n }\n\n @HostBinding('attr.data-focused')\n protected get dataFocused(): '' | null {\n return this.focused ? '' : null;\n }\n\n @HostListener('focusin')\n protected onFocusIn(): void {\n this.focused = true;\n }\n\n @HostListener('focusout', ['$event.relatedTarget'])\n protected onFocusOut(nextTarget: Readonly<EventTarget> | null): void {\n if (nextTarget instanceof Node && this.hostElement.contains(nextTarget)) return;\n\n this.focused = false;\n }\n\n protected hasLeadingSlot(): boolean {\n const proxy = this.hostElement.querySelector('[data-tng-input-prefix-proxy]');\n if (\n proxy instanceof HTMLElement &&\n containsProjectedContent(proxy.childElementCount, proxy.textContent)\n ) {\n return true;\n }\n\n const slots = this.prefixSlots?.toArray() ?? [];\n for (const slot of slots) {\n const hostElement = slot.hostElement;\n if (containsProjectedContent(hostElement.childElementCount, hostElement.textContent)) {\n return true;\n }\n }\n\n return false;\n }\n\n protected hasTrailingSlot(): boolean {\n const proxy = this.hostElement.querySelector('[data-tng-input-suffix-proxy]');\n if (\n proxy instanceof HTMLElement &&\n containsProjectedContent(proxy.childElementCount, proxy.textContent)\n ) {\n return true;\n }\n\n const slots = this.suffixSlots?.toArray() ?? [];\n for (const slot of slots) {\n const hostElement = slot.hostElement;\n if (containsProjectedContent(hostElement.childElementCount, hostElement.textContent)) {\n return true;\n }\n }\n\n return false;\n }\n\n protected effectiveHasLeading(): boolean {\n const override = this.hasLeading();\n if (override !== null) return override;\n return this.hasLeadingSlot();\n }\n\n protected effectiveHasTrailing(): boolean {\n const override = this.hasTrailing();\n if (override !== null) return override;\n return this.hasTrailingSlot();\n }\n\n protected primaryControl(): TngInput | null {\n const controls = this.controls?.toArray() ?? [];\n return controls[0] ?? null;\n }\n\n protected primaryControlElement(): HTMLInputElement | HTMLTextAreaElement | null {\n const element = this.hostElement.querySelector(\n '[data-tng-input-control-proxy] input, [data-tng-input-control-proxy] textarea, input[tngInput], textarea[tngInput], textarea[tngTextarea]',\n );\n\n if (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement) {\n return element;\n }\n\n return null;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"tng-input-group.js","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/form/input/tng-input-group.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AfterContentInit, OnDestroy, QueryList } from '@angular/core';\nimport {\n Component,\n ContentChildren,\n ElementRef,\n HostBinding,\n HostListener,\n inject,\n input,\n isDevMode,\n} from '@angular/core';\nimport { Subject, takeUntil } from 'rxjs';\n\nimport { TngInputFieldPrefix, TngInputFieldSuffix } from './tng-adornment';\nimport { TngInput } from './tng-input';\n\nfunction containsProjectedContent(childElementCount: number, textContent: string | null): boolean {\n return childElementCount > 0 || (textContent ?? '').trim().length > 0;\n}\n\n@Component({\n selector: 'tng-input-group, [tngInputGroup]',\n exportAs: 'tngInputGroup',\n template: `\n @if (hasLeadingSlot()) {\n <span class=\"tng-input-group-leading\" data-slot=\"input-group-leading\">\n <ng-content select=\"[tngInputFieldPrefix], [tngInputLeading], [data-tng-input-prefix-proxy]\"></ng-content>\n </span>\n }\n\n <span class=\"tng-input-group-control\" data-slot=\"input-group-control\">\n <ng-content select=\"input[tngInput], textarea[tngInput], textarea[tngTextarea], [data-tng-input-control-proxy]\"></ng-content>\n </span>\n\n @if (hasTrailingSlot()) {\n <span class=\"tng-input-group-trailing\" data-slot=\"input-group-trailing\">\n <ng-content select=\"[tngInputFieldSuffix], [tngInputTrailing], [data-tng-input-suffix-proxy]\"></ng-content>\n </span>\n }\n `,\n styles: [\n `\n :host {\n display: flex;\n align-items: center;\n min-width: 0;\n }\n\n .tng-input-group-leading,\n .tng-input-group-trailing {\n flex: 0 0 auto;\n display: inline-flex;\n align-items: center;\n min-width: 0;\n }\n\n .tng-input-group-control {\n flex: 1 1 auto;\n display: flex;\n align-items: center;\n min-width: 0;\n }\n `,\n ],\n})\nexport class TngInputGroup implements AfterContentInit, OnDestroy {\n public readonly hasLeading = input<boolean | null>(null);\n public readonly hasTrailing = input<boolean | null>(null);\n public readonly disabled = input<boolean | null>(null);\n public readonly invalid = input<boolean | null>(null);\n public readonly readonly = input<boolean | null>(null);\n public readonly controlCount = input<number | null>(null);\n\n @ContentChildren(TngInput, { descendants: true })\n protected controls!: QueryList<TngInput>;\n\n @ContentChildren(TngInputFieldPrefix, { descendants: true })\n protected prefixSlots!: QueryList<TngInputFieldPrefix>;\n\n @ContentChildren(TngInputFieldSuffix, { descendants: true })\n protected suffixSlots!: QueryList<TngInputFieldSuffix>;\n\n private readonly hostElement: HTMLElement = inject(ElementRef<HTMLElement>).nativeElement as HTMLElement;\n private focused = false;\n private readonly destroyed$ = new Subject<void>();\n\n private validateSingleControl(): void {\n if (!isDevMode()) return;\n if (!this.controls) return;\n\n const queriedCount = this.controls.length;\n const domCount = this.hostElement.querySelectorAll(\n '[data-tng-input-control-proxy] input, [data-tng-input-control-proxy] textarea, input[tngInput], textarea[tngInput], textarea[tngTextarea]',\n ).length;\n\n const count = this.controlCount() ?? (queriedCount > 0 ? queriedCount : domCount);\n\n if (count !== 1) {\n globalThis.console.warn(\n `[tngInputGroup] Expected exactly 1 control (input/textarea with tngInput or textarea with tngTextarea), but found ${count}.`,\n this.hostElement,\n );\n }\n }\n\n public ngAfterContentInit(): void {\n queueMicrotask(() => this.validateSingleControl());\n\n this.controls.changes.pipe(takeUntil(this.destroyed$)).subscribe(() => this.validateSingleControl());\n }\n\n public ngOnDestroy(): void {\n this.destroyed$.next();\n this.destroyed$.complete();\n }\n\n @HostBinding('attr.data-slot')\n protected readonly dataSlot = 'input-group' as const;\n\n @HostBinding('attr.data-has-leading')\n protected get dataHasLeading(): '' | null {\n return this.effectiveHasLeading() ? '' : null;\n }\n\n @HostBinding('attr.data-has-trailing')\n protected get dataHasTrailing(): '' | null {\n return this.effectiveHasTrailing() ? '' : null;\n }\n\n @HostBinding('attr.data-disabled')\n protected get dataDisabled(): '' | null {\n const override = this.disabled();\n if (override !== null) return override ? '' : null;\n\n const control = this.primaryControl();\n if (control !== null) return control.disabled() ? '' : null;\n\n const element = this.primaryControlElement();\n if (element === null) return null;\n return element.hasAttribute('disabled') ? '' : null;\n }\n\n @HostBinding('attr.data-invalid')\n protected get dataInvalid(): '' | null {\n const override = this.invalid();\n if (override !== null) return override ? '' : null;\n\n const control = this.primaryControl();\n if (control !== null) return control.isInvalid() ? '' : null;\n\n const element = this.primaryControlElement();\n if (element === null) return null;\n if (element.getAttribute('aria-invalid') === 'true') return '';\n return element.matches(':invalid') ? '' : null;\n }\n\n @HostBinding('attr.data-readonly')\n protected get dataReadonly(): '' | null {\n const override = this.readonly();\n if (override !== null) return override ? '' : null;\n\n const control = this.primaryControl();\n if (control !== null) return control.readonly() ? '' : null;\n\n const element = this.primaryControlElement();\n if (element === null) return null;\n return element.hasAttribute('readonly') ? '' : null;\n }\n\n @HostBinding('attr.data-focused')\n protected get dataFocused(): '' | null {\n return this.focused ? '' : null;\n }\n\n @HostListener('focusin')\n protected onFocusIn(): void {\n this.focused = true;\n }\n\n @HostListener('focusout', ['$event.relatedTarget'])\n protected onFocusOut(nextTarget: Readonly<EventTarget> | null): void {\n if (nextTarget instanceof Node && this.hostElement.contains(nextTarget)) return;\n\n this.focused = false;\n }\n\n protected hasLeadingSlot(): boolean {\n const proxy = this.hostElement.querySelector('[data-tng-input-prefix-proxy]');\n if (\n proxy instanceof HTMLElement &&\n containsProjectedContent(proxy.childElementCount, proxy.textContent)\n ) {\n return true;\n }\n\n const slots = this.prefixSlots?.toArray() ?? [];\n for (const slot of slots) {\n const hostElement = slot.hostElement;\n if (containsProjectedContent(hostElement.childElementCount, hostElement.textContent)) {\n return true;\n }\n }\n\n return false;\n }\n\n protected hasTrailingSlot(): boolean {\n const proxy = this.hostElement.querySelector('[data-tng-input-suffix-proxy]');\n if (\n proxy instanceof HTMLElement &&\n containsProjectedContent(proxy.childElementCount, proxy.textContent)\n ) {\n return true;\n }\n\n const slots = this.suffixSlots?.toArray() ?? [];\n for (const slot of slots) {\n const hostElement = slot.hostElement;\n if (containsProjectedContent(hostElement.childElementCount, hostElement.textContent)) {\n return true;\n }\n }\n\n return false;\n }\n\n protected effectiveHasLeading(): boolean {\n const override = this.hasLeading();\n if (override !== null) return override;\n return this.hasLeadingSlot();\n }\n\n protected effectiveHasTrailing(): boolean {\n const override = this.hasTrailing();\n if (override !== null) return override;\n return this.hasTrailingSlot();\n }\n\n protected primaryControl(): TngInput | null {\n const controls = this.controls?.toArray() ?? [];\n return controls[0] ?? null;\n }\n\n protected primaryControlElement(): HTMLInputElement | HTMLTextAreaElement | null {\n const element = this.hostElement.querySelector(\n '[data-tng-input-control-proxy] input, [data-tng-input-control-proxy] textarea, input[tngInput], textarea[tngInput], textarea[tngTextarea]',\n );\n\n if (element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement) {\n return element;\n }\n\n return null;\n }\n}\n"]}
|
|
@@ -12,6 +12,11 @@ export declare class TngMultiAutocompleteOverlay {
|
|
|
12
12
|
protected readonly dataSlot: "multi-autocomplete-overlay";
|
|
13
13
|
protected get hidden(): '' | null;
|
|
14
14
|
constructor();
|
|
15
|
+
/**
|
|
16
|
+
* Anchor for overlay positioning, width, and dismiss boundary.
|
|
17
|
+
* Prefer the enclosing form-field (so the overlay aligns with the visible
|
|
18
|
+
* field frame), else the multi-autocomplete host element itself.
|
|
19
|
+
*/
|
|
15
20
|
private findAnchorEl;
|
|
16
21
|
private reposition;
|
|
17
22
|
private setupRepositionListeners;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tng-multi-autocomplete.overlay.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/form/multi-autocomplete/tng-multi-autocomplete.overlay.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"tng-multi-autocomplete.overlay.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/tailng-ui/primitives/src/lib/form/multi-autocomplete/tng-multi-autocomplete.overlay.ts"],"names":[],"mappings":";AAmGA,qBAIa,2BAA2B;IACtC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAwD;IAC9E,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAmC;IACzD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAsB;IAEjD,OAAO,CAAC,oBAAoB,CAA6B;IACzD,OAAO,CAAC,oBAAoB,CAA6B;IACzD,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,wBAAwB,CAA6B;IAC7D,OAAO,CAAC,WAAW,CAAwB;IAC3C,OAAO,CAAC,cAAc,CAAqB;IAG3C,SAAS,CAAC,QAAQ,CAAC,QAAQ,EAAG,4BAA4B,CAAU;IAGpE,SAAS,KAAK,MAAM,IAAI,EAAE,GAAG,IAAI,CAEhC;;IA2BD;;;;OAIG;IACH,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,UAAU;IAkBlB,OAAO,CAAC,wBAAwB;IA2BhC,OAAO,CAAC,2BAA2B;IASnC,OAAO,CAAC,mBAAmB;IAqB3B,OAAO,CAAC,sBAAsB;IAK9B,OAAO,CAAC,sBAAsB;IAqB9B,OAAO,CAAC,sBAAsB;IAK9B,OAAO,CAAC,uBAAuB;IAU/B,OAAO,CAAC,sBAAsB;IA4B9B,OAAO,CAAC,oBAAoB;yCAtMjB,2BAA2B;2CAA3B,2BAA2B;CA6NvC"}
|