@shival99/z-ui 2.2.5 → 2.3.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/assets/css/base.css +4 -0
- package/assets/css/overlay.css +82 -0
- package/assets/css/tailwind.css +1 -0
- package/assets/css/themes/hospital.css +28 -2
- package/fesm2022/shival99-z-ui-components-z-button-group.mjs +15 -13
- package/fesm2022/shival99-z-ui-components-z-button-group.mjs.map +1 -1
- package/fesm2022/shival99-z-ui-components-z-button.mjs +2 -2
- package/fesm2022/shival99-z-ui-components-z-button.mjs.map +1 -1
- package/fesm2022/shival99-z-ui-components-z-calendar.mjs +23 -17
- package/fesm2022/shival99-z-ui-components-z-calendar.mjs.map +1 -1
- package/fesm2022/shival99-z-ui-components-z-command.mjs +10 -24
- package/fesm2022/shival99-z-ui-components-z-command.mjs.map +1 -1
- package/fesm2022/shival99-z-ui-components-z-drawer.mjs +61 -70
- package/fesm2022/shival99-z-ui-components-z-drawer.mjs.map +1 -1
- package/fesm2022/shival99-z-ui-components-z-gallery.mjs +6 -8
- package/fesm2022/shival99-z-ui-components-z-gallery.mjs.map +1 -1
- package/fesm2022/shival99-z-ui-components-z-icon.mjs +227 -11
- package/fesm2022/shival99-z-ui-components-z-icon.mjs.map +1 -1
- package/fesm2022/shival99-z-ui-components-z-marquee.mjs +19 -4
- package/fesm2022/shival99-z-ui-components-z-marquee.mjs.map +1 -1
- package/fesm2022/shival99-z-ui-components-z-menu.mjs +7 -7
- package/fesm2022/shival99-z-ui-components-z-menu.mjs.map +1 -1
- package/fesm2022/shival99-z-ui-components-z-modal.mjs +45 -62
- package/fesm2022/shival99-z-ui-components-z-modal.mjs.map +1 -1
- package/fesm2022/shival99-z-ui-components-z-overlay.mjs +363 -0
- package/fesm2022/shival99-z-ui-components-z-overlay.mjs.map +1 -0
- package/fesm2022/shival99-z-ui-components-z-popover.mjs +94 -378
- package/fesm2022/shival99-z-ui-components-z-popover.mjs.map +1 -1
- package/fesm2022/shival99-z-ui-components-z-skeleton.mjs +14 -3
- package/fesm2022/shival99-z-ui-components-z-skeleton.mjs.map +1 -1
- package/fesm2022/shival99-z-ui-components-z-table.mjs +42 -16
- package/fesm2022/shival99-z-ui-components-z-table.mjs.map +1 -1
- package/fesm2022/shival99-z-ui-components-z-tabs.mjs +85 -7
- package/fesm2022/shival99-z-ui-components-z-tabs.mjs.map +1 -1
- package/fesm2022/shival99-z-ui-components-z-toast.mjs +32 -25
- package/fesm2022/shival99-z-ui-components-z-toast.mjs.map +1 -1
- package/fesm2022/shival99-z-ui-components-z-tooltip.mjs +52 -222
- package/fesm2022/shival99-z-ui-components-z-tooltip.mjs.map +1 -1
- package/fesm2022/shival99-z-ui-providers.mjs +9 -2
- package/fesm2022/shival99-z-ui-providers.mjs.map +1 -1
- package/fesm2022/shival99-z-ui-services.mjs +203 -98
- package/fesm2022/shival99-z-ui-services.mjs.map +1 -1
- package/package.json +9 -1
- package/types/shival99-z-ui-components-z-autocomplete.d.ts +1 -1
- package/types/shival99-z-ui-components-z-button-group.d.ts +12 -11
- package/types/shival99-z-ui-components-z-button.d.ts +2 -1
- package/types/shival99-z-ui-components-z-calendar.d.ts +4 -4
- package/types/shival99-z-ui-components-z-command.d.ts +2 -4
- package/types/shival99-z-ui-components-z-drawer.d.ts +22 -16
- package/types/shival99-z-ui-components-z-editor.d.ts +1 -1
- package/types/shival99-z-ui-components-z-gallery.d.ts +3 -3
- package/types/shival99-z-ui-components-z-icon.d.ts +38 -6
- package/types/shival99-z-ui-components-z-marquee.d.ts +7 -1
- package/types/shival99-z-ui-components-z-modal.d.ts +53 -53
- package/types/shival99-z-ui-components-z-overlay.d.ts +145 -0
- package/types/shival99-z-ui-components-z-popover.d.ts +7 -15
- package/types/shival99-z-ui-components-z-qrcode.d.ts +1 -1
- package/types/shival99-z-ui-components-z-select.d.ts +1 -1
- package/types/shival99-z-ui-components-z-skeleton.d.ts +2 -0
- package/types/shival99-z-ui-components-z-table.d.ts +7 -3
- package/types/shival99-z-ui-components-z-tabs.d.ts +13 -3
- package/types/shival99-z-ui-components-z-toast.d.ts +7 -1
- package/types/shival99-z-ui-components-z-tooltip.d.ts +9 -7
- package/types/shival99-z-ui-components-z-upload.d.ts +3 -3
- package/types/shival99-z-ui-providers.d.ts +3 -1
- package/types/shival99-z-ui-services.d.ts +73 -37
|
@@ -0,0 +1,363 @@
|
|
|
1
|
+
import { offset, flip, shift, limitShift, size, computePosition, autoUpdate } from '@floating-ui/dom';
|
|
2
|
+
import * as i0 from '@angular/core';
|
|
3
|
+
import { createComponent, inject, Injectable, ApplicationRef, EnvironmentInjector } from '@angular/core';
|
|
4
|
+
import { Observable, fromEvent } from 'rxjs';
|
|
5
|
+
import { filter } from 'rxjs/operators';
|
|
6
|
+
import { DOCUMENT } from '@angular/common';
|
|
7
|
+
|
|
8
|
+
const Z_OVERLAY_DEFAULT_VIEWPORT_PADDING = 8;
|
|
9
|
+
const Z_OVERLAY_DEFAULT_ARROW_EDGE_PADDING = 12;
|
|
10
|
+
const Z_OVERLAY_CONTAINER_CLASS = 'z-overlay-container';
|
|
11
|
+
const Z_OVERLAY_HOST_CLASS = 'z-overlay-host';
|
|
12
|
+
const Z_OVERLAY_PANE_CLASS = 'z-overlay-pane';
|
|
13
|
+
const Z_OVERLAY_BACKDROP_CLASS = 'z-overlay-backdrop';
|
|
14
|
+
const Z_OVERLAY_BACKDROP_LEAVING_CLASS = 'z-backdrop-leaving';
|
|
15
|
+
const Z_OVERLAY_SCROLL_LOCKED_CLASS = 'z-scroll-locked';
|
|
16
|
+
/** Z-UI position name -> Floating UI placement (12 vị trí khớp 1:1). */
|
|
17
|
+
const Z_OVERLAY_PLACEMENT_MAP = {
|
|
18
|
+
top: 'top',
|
|
19
|
+
'top-left': 'top-start',
|
|
20
|
+
'top-right': 'top-end',
|
|
21
|
+
bottom: 'bottom',
|
|
22
|
+
'bottom-left': 'bottom-start',
|
|
23
|
+
'bottom-right': 'bottom-end',
|
|
24
|
+
left: 'left',
|
|
25
|
+
'left-top': 'left-start',
|
|
26
|
+
'left-bottom': 'left-end',
|
|
27
|
+
right: 'right',
|
|
28
|
+
'right-top': 'right-start',
|
|
29
|
+
'right-bottom': 'right-end',
|
|
30
|
+
};
|
|
31
|
+
const Z_OVERLAY_PLACEMENT_REVERSE_MAP = Object.fromEntries(Object.entries(Z_OVERLAY_PLACEMENT_MAP).map(([zPlacement, placement]) => [placement, zPlacement]));
|
|
32
|
+
/**
|
|
33
|
+
* Thứ tự fallback khi vị trí chính không đủ chỗ (không gồm vị trí chính — flip() tự thử trước).
|
|
34
|
+
* Dùng chung cho tooltip lẫn popover, hai nơi này vốn có bảng y hệt nhau.
|
|
35
|
+
*/
|
|
36
|
+
const Z_OVERLAY_FALLBACK_ORDER = {
|
|
37
|
+
top: ['bottom', 'top-left', 'top-right', 'bottom-left', 'bottom-right'],
|
|
38
|
+
'top-left': ['bottom-left', 'top', 'bottom', 'top-right', 'bottom-right'],
|
|
39
|
+
'top-right': ['bottom-right', 'top', 'bottom', 'top-left', 'bottom-left'],
|
|
40
|
+
bottom: ['top', 'bottom-left', 'bottom-right', 'top-left', 'top-right'],
|
|
41
|
+
'bottom-left': ['top-left', 'bottom', 'top', 'bottom-right', 'top-right'],
|
|
42
|
+
'bottom-right': ['top-right', 'bottom', 'top', 'bottom-left', 'top-left'],
|
|
43
|
+
left: ['right', 'left-top', 'left-bottom', 'right-top', 'right-bottom'],
|
|
44
|
+
'left-top': ['right-top', 'left', 'right', 'left-bottom', 'right-bottom'],
|
|
45
|
+
'left-bottom': ['right-bottom', 'left', 'right', 'left-top', 'right-top'],
|
|
46
|
+
right: ['left', 'right-top', 'right-bottom', 'left-top', 'left-bottom'],
|
|
47
|
+
'right-top': ['left-top', 'right', 'left', 'right-bottom', 'left-bottom'],
|
|
48
|
+
'right-bottom': ['left-bottom', 'right', 'left', 'right-top', 'left-top'],
|
|
49
|
+
};
|
|
50
|
+
/** Thứ tự ưu tiên khi vị trí chính còn đủ chỗ (tooltip dùng để giữ đúng cạnh, không nhảy sang cạnh đối diện). */
|
|
51
|
+
const Z_OVERLAY_PREFERRED_SIDE_ORDER = {
|
|
52
|
+
top: ['top-left', 'top-right'],
|
|
53
|
+
'top-left': ['top', 'top-right'],
|
|
54
|
+
'top-right': ['top', 'top-left'],
|
|
55
|
+
bottom: ['bottom-left', 'bottom-right'],
|
|
56
|
+
'bottom-left': ['bottom', 'bottom-right'],
|
|
57
|
+
'bottom-right': ['bottom', 'bottom-left'],
|
|
58
|
+
left: ['left-top', 'left-bottom'],
|
|
59
|
+
'left-top': ['left', 'left-bottom'],
|
|
60
|
+
'left-bottom': ['left', 'left-top'],
|
|
61
|
+
right: ['right-top', 'right-bottom'],
|
|
62
|
+
'right-top': ['right', 'right-bottom'],
|
|
63
|
+
'right-bottom': ['right', 'right-top'],
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
async function computeZOverlayPlacement(config) {
|
|
67
|
+
const { reference, floating, placement, fallbackPlacements, offset: offset$1, viewportPadding = Z_OVERLAY_DEFAULT_VIEWPORT_PADDING, push = true, flexibleDimensions = false, } = config;
|
|
68
|
+
const middleware = [
|
|
69
|
+
offset(offset$1),
|
|
70
|
+
flip({
|
|
71
|
+
fallbackPlacements: fallbackPlacements.map(pos => Z_OVERLAY_PLACEMENT_MAP[pos]),
|
|
72
|
+
padding: viewportPadding,
|
|
73
|
+
}),
|
|
74
|
+
];
|
|
75
|
+
if (push) {
|
|
76
|
+
middleware.push(shift({ limiter: limitShift(), padding: viewportPadding }));
|
|
77
|
+
}
|
|
78
|
+
if (flexibleDimensions) {
|
|
79
|
+
middleware.push(size({
|
|
80
|
+
padding: viewportPadding,
|
|
81
|
+
apply({ availableWidth, availableHeight, elements }) {
|
|
82
|
+
Object.assign(elements.floating.style, {
|
|
83
|
+
maxWidth: `${Math.max(0, availableWidth)}px`,
|
|
84
|
+
maxHeight: `${Math.max(0, availableHeight)}px`,
|
|
85
|
+
});
|
|
86
|
+
},
|
|
87
|
+
}));
|
|
88
|
+
}
|
|
89
|
+
const result = await computePosition(reference, floating, {
|
|
90
|
+
placement: Z_OVERLAY_PLACEMENT_MAP[placement],
|
|
91
|
+
strategy: 'absolute',
|
|
92
|
+
middleware,
|
|
93
|
+
});
|
|
94
|
+
return {
|
|
95
|
+
x: result.x,
|
|
96
|
+
y: result.y,
|
|
97
|
+
placement: Z_OVERLAY_PLACEMENT_REVERSE_MAP[result.placement],
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
/** Bọc lại `autoUpdate` của Floating UI — thay cho `scrollStrategies.reposition()` của CDK. */
|
|
101
|
+
function startZOverlayAutoUpdate(reference, floating, onUpdate, options) {
|
|
102
|
+
return autoUpdate(reference, floating, onUpdate, options);
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Tính độ lệch mũi tên so với tâm overlay, kẹp trong biên overlay.
|
|
106
|
+
* Y hệt logic `_calculateArrowOffset` cũ của tooltip/popover — chỉ tách ra dùng chung.
|
|
107
|
+
*/
|
|
108
|
+
function computeZOverlayArrowOffset(config) {
|
|
109
|
+
const { triggerRect, overlayRect, placement, edgePadding = Z_OVERLAY_DEFAULT_ARROW_EDGE_PADDING } = config;
|
|
110
|
+
const side = placement.split('-')[0];
|
|
111
|
+
let rawOffset = 0;
|
|
112
|
+
if (side === 'top' || side === 'bottom') {
|
|
113
|
+
const triggerCenterX = triggerRect.left + triggerRect.width / 2;
|
|
114
|
+
const overlayCenterX = overlayRect.left + overlayRect.width / 2;
|
|
115
|
+
rawOffset = triggerCenterX - overlayCenterX;
|
|
116
|
+
}
|
|
117
|
+
if (side === 'left' || side === 'right') {
|
|
118
|
+
const triggerCenterY = triggerRect.top + triggerRect.height / 2;
|
|
119
|
+
const overlayCenterY = overlayRect.top + overlayRect.height / 2;
|
|
120
|
+
rawOffset = triggerCenterY - overlayCenterY;
|
|
121
|
+
}
|
|
122
|
+
const maxOffset = side === 'top' || side === 'bottom' ? overlayRect.width / 2 - edgePadding : overlayRect.height / 2 - edgePadding;
|
|
123
|
+
const clampedOffset = Math.max(-maxOffset, Math.min(maxOffset, rawOffset));
|
|
124
|
+
return Math.abs(clampedOffset) > 1 ? clampedOffset : 0;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
function toCssSize(value) {
|
|
128
|
+
if (value === undefined) {
|
|
129
|
+
return '';
|
|
130
|
+
}
|
|
131
|
+
return typeof value === 'number' ? `${value}px` : value;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Thay cho `OverlayRef` của CDK. `overlayElement` là pane được Floating UI định vị
|
|
135
|
+
* (overlay neo theo trigger) hoặc chính `hostElement` (overlay toàn màn hình — modal/drawer).
|
|
136
|
+
*/
|
|
137
|
+
class ZOverlayRef {
|
|
138
|
+
hostElement;
|
|
139
|
+
overlayElement;
|
|
140
|
+
backdropElement;
|
|
141
|
+
_appRef;
|
|
142
|
+
_envInjector;
|
|
143
|
+
_onDispose;
|
|
144
|
+
_componentRef = null;
|
|
145
|
+
_embeddedViewRef = null;
|
|
146
|
+
constructor(hostElement, overlayElement, backdropElement, _appRef, _envInjector, _onDispose) {
|
|
147
|
+
this.hostElement = hostElement;
|
|
148
|
+
this.overlayElement = overlayElement;
|
|
149
|
+
this.backdropElement = backdropElement;
|
|
150
|
+
this._appRef = _appRef;
|
|
151
|
+
this._envInjector = _envInjector;
|
|
152
|
+
this._onDispose = _onDispose;
|
|
153
|
+
}
|
|
154
|
+
hasAttached() {
|
|
155
|
+
return !!this._componentRef || !!this._embeddedViewRef;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* `viewContainerRef`, khi được truyền, cho component tạo ra thừa hưởng injector/vị trí trong
|
|
159
|
+
* cây view của chính VCR đó (giữ đúng ngữ nghĩa `ZModalOptions.zViewContainerRef` công khai) —
|
|
160
|
+
* dù vậy DOM node vẫn luôn được chuyển vào `overlayElement`, y hệt `DomPortalOutlet` của CDK cũ.
|
|
161
|
+
*/
|
|
162
|
+
attach(component, options) {
|
|
163
|
+
const { injector, viewContainerRef } = options ?? {};
|
|
164
|
+
let ref;
|
|
165
|
+
if (viewContainerRef) {
|
|
166
|
+
ref = viewContainerRef.createComponent(component, { index: viewContainerRef.length, injector });
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
ref = createComponent(component, {
|
|
170
|
+
environmentInjector: this._envInjector,
|
|
171
|
+
elementInjector: injector,
|
|
172
|
+
});
|
|
173
|
+
this._appRef.attachView(ref.hostView);
|
|
174
|
+
}
|
|
175
|
+
ref.location.nativeElement.style.pointerEvents = 'auto';
|
|
176
|
+
this.overlayElement.appendChild(ref.location.nativeElement);
|
|
177
|
+
this._componentRef = ref;
|
|
178
|
+
return ref;
|
|
179
|
+
}
|
|
180
|
+
/** Gắn một `TemplateRef` (thay `TemplatePortal`) — chỉ dùng cho overlay tự do (z-dynamic.service). */
|
|
181
|
+
attachTemplate(templateRef, viewContainerRef, context) {
|
|
182
|
+
const viewRef = viewContainerRef.createEmbeddedView(templateRef, context);
|
|
183
|
+
viewRef.detectChanges();
|
|
184
|
+
for (const node of viewRef.rootNodes) {
|
|
185
|
+
if (node instanceof HTMLElement) {
|
|
186
|
+
node.style.pointerEvents = 'auto';
|
|
187
|
+
}
|
|
188
|
+
this.overlayElement.appendChild(node);
|
|
189
|
+
}
|
|
190
|
+
this._embeddedViewRef = viewRef;
|
|
191
|
+
return viewRef;
|
|
192
|
+
}
|
|
193
|
+
updateSize(size) {
|
|
194
|
+
this.overlayElement.style.width = toCssSize(size.width);
|
|
195
|
+
this.overlayElement.style.minWidth = toCssSize(size.minWidth);
|
|
196
|
+
this.overlayElement.style.maxWidth = toCssSize(size.maxWidth);
|
|
197
|
+
this.overlayElement.style.height = toCssSize(size.height);
|
|
198
|
+
this.overlayElement.style.minHeight = toCssSize(size.minHeight);
|
|
199
|
+
this.overlayElement.style.maxHeight = toCssSize(size.maxHeight);
|
|
200
|
+
}
|
|
201
|
+
backdropClick() {
|
|
202
|
+
if (!this.backdropElement) {
|
|
203
|
+
return new Observable();
|
|
204
|
+
}
|
|
205
|
+
return fromEvent(this.backdropElement, 'click');
|
|
206
|
+
}
|
|
207
|
+
outsidePointerEvents() {
|
|
208
|
+
return fromEvent(document, 'pointerdown', { capture: true }).pipe(filter(event => !this.overlayElement.contains(event.target)));
|
|
209
|
+
}
|
|
210
|
+
dispose() {
|
|
211
|
+
this._componentRef?.destroy();
|
|
212
|
+
this._componentRef = null;
|
|
213
|
+
if (this._embeddedViewRef && !this._embeddedViewRef.destroyed) {
|
|
214
|
+
this._embeddedViewRef.destroy();
|
|
215
|
+
}
|
|
216
|
+
this._embeddedViewRef = null;
|
|
217
|
+
try {
|
|
218
|
+
this.hostElement.hidePopover?.();
|
|
219
|
+
}
|
|
220
|
+
catch {
|
|
221
|
+
// trình duyệt không hỗ trợ Popover API — bỏ qua, remove() bên dưới vẫn dọn DOM
|
|
222
|
+
}
|
|
223
|
+
this.hostElement.remove();
|
|
224
|
+
this._onDispose?.();
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* Khoá scroll trang khi overlay toàn màn hình (modal/drawer) mở — thay cho
|
|
230
|
+
* `scrollStrategies.block()` của CDK. Đếm tham chiếu để modal-trong-modal không mở khoá sớm.
|
|
231
|
+
* Dùng `top`/`left` âm theo vị trí scroll hiện tại (giống thuật toán `BlockScrollStrategy` của CDK)
|
|
232
|
+
* để không giật layout và giữ nguyên vị trí scroll khi mở khoá lại.
|
|
233
|
+
*/
|
|
234
|
+
class ZScrollLockService {
|
|
235
|
+
_document = inject(DOCUMENT);
|
|
236
|
+
_lockCount = 0;
|
|
237
|
+
_scrollPosition = { top: 0, left: 0 };
|
|
238
|
+
lock() {
|
|
239
|
+
if (this._lockCount === 0) {
|
|
240
|
+
const { documentElement } = this._document;
|
|
241
|
+
this._scrollPosition = { top: window.scrollY, left: window.scrollX };
|
|
242
|
+
documentElement.style.top = `${-this._scrollPosition.top}px`;
|
|
243
|
+
documentElement.style.left = `${-this._scrollPosition.left}px`;
|
|
244
|
+
documentElement.classList.add(Z_OVERLAY_SCROLL_LOCKED_CLASS);
|
|
245
|
+
}
|
|
246
|
+
this._lockCount++;
|
|
247
|
+
}
|
|
248
|
+
unlock() {
|
|
249
|
+
this._lockCount = Math.max(0, this._lockCount - 1);
|
|
250
|
+
if (this._lockCount > 0) {
|
|
251
|
+
return;
|
|
252
|
+
}
|
|
253
|
+
const { documentElement } = this._document;
|
|
254
|
+
documentElement.style.top = '';
|
|
255
|
+
documentElement.style.left = '';
|
|
256
|
+
documentElement.classList.remove(Z_OVERLAY_SCROLL_LOCKED_CLASS);
|
|
257
|
+
window.scrollTo(this._scrollPosition.left, this._scrollPosition.top);
|
|
258
|
+
}
|
|
259
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.2", ngImport: i0, type: ZScrollLockService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
260
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.1.2", ngImport: i0, type: ZScrollLockService, providedIn: 'root' });
|
|
261
|
+
}
|
|
262
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.2", ngImport: i0, type: ZScrollLockService, decorators: [{
|
|
263
|
+
type: Injectable,
|
|
264
|
+
args: [{
|
|
265
|
+
providedIn: 'root',
|
|
266
|
+
}]
|
|
267
|
+
}] });
|
|
268
|
+
|
|
269
|
+
/**
|
|
270
|
+
* Tạo overlay host `[popover=manual]` (top layer, thay cho `.cdk-overlay-pane`) và trả về `ZOverlayRef`.
|
|
271
|
+
*
|
|
272
|
+
* - `createAnchored`: overlay neo theo trigger (tooltip/popover) — có thêm `.z-overlay-pane` để
|
|
273
|
+
* Floating UI định vị bằng `left`/`top` (không dùng `transform`, vì các class `z-animate-*`
|
|
274
|
+
* trong `animations.css` đã chiếm `transform` cho hiệu ứng enter/exit).
|
|
275
|
+
* - `createGlobal`: overlay toàn màn hình (modal/drawer) — component gắn vào tự định vị bằng
|
|
276
|
+
* `zModalVariants`/`zDrawerVariants` (đã là `fixed` + toạ độ cố định), nên không cần pane riêng.
|
|
277
|
+
*/
|
|
278
|
+
class ZOverlayService {
|
|
279
|
+
_appRef = inject(ApplicationRef);
|
|
280
|
+
_envInjector = inject(EnvironmentInjector);
|
|
281
|
+
_document = inject(DOCUMENT);
|
|
282
|
+
_scrollLock = inject(ZScrollLockService);
|
|
283
|
+
_container = null;
|
|
284
|
+
createAnchored(config = {}) {
|
|
285
|
+
const host = this._createHost();
|
|
286
|
+
const pane = this._document.createElement('div');
|
|
287
|
+
pane.classList.add(Z_OVERLAY_PANE_CLASS);
|
|
288
|
+
if (config.panelClass) {
|
|
289
|
+
pane.classList.add(...config.panelClass.split(' ').filter(Boolean));
|
|
290
|
+
}
|
|
291
|
+
host.appendChild(pane);
|
|
292
|
+
const overlayRef = new ZOverlayRef(host, pane, null, this._appRef, this._envInjector);
|
|
293
|
+
this._showHost(host);
|
|
294
|
+
return overlayRef;
|
|
295
|
+
}
|
|
296
|
+
createGlobal(config) {
|
|
297
|
+
const host = this._createHost(config.panelClass);
|
|
298
|
+
let backdrop = null;
|
|
299
|
+
if (config.hasBackdrop) {
|
|
300
|
+
backdrop = this._document.createElement('div');
|
|
301
|
+
backdrop.classList.add(Z_OVERLAY_BACKDROP_CLASS);
|
|
302
|
+
if (config.backdropClass) {
|
|
303
|
+
backdrop.classList.add(...config.backdropClass.split(' ').filter(Boolean));
|
|
304
|
+
}
|
|
305
|
+
host.appendChild(backdrop);
|
|
306
|
+
}
|
|
307
|
+
if (config.scrollLock) {
|
|
308
|
+
this._scrollLock.lock();
|
|
309
|
+
}
|
|
310
|
+
const overlayRef = new ZOverlayRef(host, host, backdrop, this._appRef, this._envInjector, () => {
|
|
311
|
+
if (config.scrollLock) {
|
|
312
|
+
this._scrollLock.unlock();
|
|
313
|
+
}
|
|
314
|
+
});
|
|
315
|
+
if (config.size) {
|
|
316
|
+
overlayRef.updateSize(config.size);
|
|
317
|
+
}
|
|
318
|
+
this._showHost(host);
|
|
319
|
+
return overlayRef;
|
|
320
|
+
}
|
|
321
|
+
_createHost(panelClass) {
|
|
322
|
+
const host = this._document.createElement('div');
|
|
323
|
+
host.setAttribute('popover', 'manual');
|
|
324
|
+
host.classList.add(Z_OVERLAY_HOST_CLASS);
|
|
325
|
+
if (panelClass) {
|
|
326
|
+
host.classList.add(...panelClass.split(' ').filter(Boolean));
|
|
327
|
+
}
|
|
328
|
+
this._getContainer().appendChild(host);
|
|
329
|
+
return host;
|
|
330
|
+
}
|
|
331
|
+
_showHost(host) {
|
|
332
|
+
try {
|
|
333
|
+
host.showPopover?.();
|
|
334
|
+
}
|
|
335
|
+
catch {
|
|
336
|
+
// trình duyệt không hỗ trợ Popover API — host vẫn hiện bình thường qua position:fixed
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
_getContainer() {
|
|
340
|
+
if (!this._container) {
|
|
341
|
+
const container = this._document.createElement('div');
|
|
342
|
+
container.className = Z_OVERLAY_CONTAINER_CLASS;
|
|
343
|
+
this._document.body.appendChild(container);
|
|
344
|
+
this._container = container;
|
|
345
|
+
}
|
|
346
|
+
return this._container;
|
|
347
|
+
}
|
|
348
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.2", ngImport: i0, type: ZOverlayService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
349
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.1.2", ngImport: i0, type: ZOverlayService, providedIn: 'root' });
|
|
350
|
+
}
|
|
351
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.2", ngImport: i0, type: ZOverlayService, decorators: [{
|
|
352
|
+
type: Injectable,
|
|
353
|
+
args: [{
|
|
354
|
+
providedIn: 'root',
|
|
355
|
+
}]
|
|
356
|
+
}] });
|
|
357
|
+
|
|
358
|
+
/**
|
|
359
|
+
* Generated bundle index. Do not edit.
|
|
360
|
+
*/
|
|
361
|
+
|
|
362
|
+
export { ZOverlayRef, ZOverlayService, ZScrollLockService, Z_OVERLAY_CONTAINER_CLASS, Z_OVERLAY_DEFAULT_ARROW_EDGE_PADDING, Z_OVERLAY_DEFAULT_VIEWPORT_PADDING, Z_OVERLAY_FALLBACK_ORDER, Z_OVERLAY_HOST_CLASS, Z_OVERLAY_PLACEMENT_MAP, Z_OVERLAY_PLACEMENT_REVERSE_MAP, Z_OVERLAY_PREFERRED_SIDE_ORDER, computeZOverlayArrowOffset, computeZOverlayPlacement, startZOverlayAutoUpdate };
|
|
363
|
+
//# sourceMappingURL=shival99-z-ui-components-z-overlay.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shival99-z-ui-components-z-overlay.mjs","sources":["../../../../libs/core-ui/components/z-overlay/z-overlay.define.ts","../../../../libs/core-ui/components/z-overlay/z-overlay-floating.utils.ts","../../../../libs/core-ui/components/z-overlay/z-overlay.ref.ts","../../../../libs/core-ui/components/z-overlay/z-scroll-lock.service.ts","../../../../libs/core-ui/components/z-overlay/z-overlay.service.ts","../../../../libs/core-ui/components/z-overlay/shival99-z-ui-components-z-overlay.ts"],"sourcesContent":["import type { Placement } from '@floating-ui/dom';\nimport type { ZOverlayPlacement } from './z-overlay.types';\n\nexport const Z_OVERLAY_DEFAULT_VIEWPORT_PADDING = 8;\nexport const Z_OVERLAY_DEFAULT_ARROW_EDGE_PADDING = 12;\nexport const Z_OVERLAY_CONTAINER_CLASS = 'z-overlay-container';\nexport const Z_OVERLAY_HOST_CLASS = 'z-overlay-host';\nexport const Z_OVERLAY_PANE_CLASS = 'z-overlay-pane';\nexport const Z_OVERLAY_BACKDROP_CLASS = 'z-overlay-backdrop';\nexport const Z_OVERLAY_BACKDROP_LEAVING_CLASS = 'z-backdrop-leaving';\nexport const Z_OVERLAY_SCROLL_LOCKED_CLASS = 'z-scroll-locked';\n\n/** Z-UI position name -> Floating UI placement (12 vị trí khớp 1:1). */\nexport const Z_OVERLAY_PLACEMENT_MAP: Record<ZOverlayPlacement, Placement> = {\n top: 'top',\n 'top-left': 'top-start',\n 'top-right': 'top-end',\n bottom: 'bottom',\n 'bottom-left': 'bottom-start',\n 'bottom-right': 'bottom-end',\n left: 'left',\n 'left-top': 'left-start',\n 'left-bottom': 'left-end',\n right: 'right',\n 'right-top': 'right-start',\n 'right-bottom': 'right-end',\n};\n\nexport const Z_OVERLAY_PLACEMENT_REVERSE_MAP: Record<Placement, ZOverlayPlacement> = Object.fromEntries(\n Object.entries(Z_OVERLAY_PLACEMENT_MAP).map(([zPlacement, placement]) => [placement, zPlacement])\n) as Record<Placement, ZOverlayPlacement>;\n\n/**\n * Thứ tự fallback khi vị trí chính không đủ chỗ (không gồm vị trí chính — flip() tự thử trước).\n * Dùng chung cho tooltip lẫn popover, hai nơi này vốn có bảng y hệt nhau.\n */\nexport const Z_OVERLAY_FALLBACK_ORDER: Record<ZOverlayPlacement, ZOverlayPlacement[]> = {\n top: ['bottom', 'top-left', 'top-right', 'bottom-left', 'bottom-right'],\n 'top-left': ['bottom-left', 'top', 'bottom', 'top-right', 'bottom-right'],\n 'top-right': ['bottom-right', 'top', 'bottom', 'top-left', 'bottom-left'],\n bottom: ['top', 'bottom-left', 'bottom-right', 'top-left', 'top-right'],\n 'bottom-left': ['top-left', 'bottom', 'top', 'bottom-right', 'top-right'],\n 'bottom-right': ['top-right', 'bottom', 'top', 'bottom-left', 'top-left'],\n left: ['right', 'left-top', 'left-bottom', 'right-top', 'right-bottom'],\n 'left-top': ['right-top', 'left', 'right', 'left-bottom', 'right-bottom'],\n 'left-bottom': ['right-bottom', 'left', 'right', 'left-top', 'right-top'],\n right: ['left', 'right-top', 'right-bottom', 'left-top', 'left-bottom'],\n 'right-top': ['left-top', 'right', 'left', 'right-bottom', 'left-bottom'],\n 'right-bottom': ['left-bottom', 'right', 'left', 'right-top', 'left-top'],\n};\n\n/** Thứ tự ưu tiên khi vị trí chính còn đủ chỗ (tooltip dùng để giữ đúng cạnh, không nhảy sang cạnh đối diện). */\nexport const Z_OVERLAY_PREFERRED_SIDE_ORDER: Record<ZOverlayPlacement, ZOverlayPlacement[]> = {\n top: ['top-left', 'top-right'],\n 'top-left': ['top', 'top-right'],\n 'top-right': ['top', 'top-left'],\n bottom: ['bottom-left', 'bottom-right'],\n 'bottom-left': ['bottom', 'bottom-right'],\n 'bottom-right': ['bottom', 'bottom-left'],\n left: ['left-top', 'left-bottom'],\n 'left-top': ['left', 'left-bottom'],\n 'left-bottom': ['left', 'left-top'],\n right: ['right-top', 'right-bottom'],\n 'right-top': ['right', 'right-bottom'],\n 'right-bottom': ['right', 'right-top'],\n};\n","import {\n autoUpdate,\n type AutoUpdateOptions,\n computePosition,\n flip,\n limitShift,\n type Middleware,\n offset as offsetMiddleware,\n shift,\n size,\n} from '@floating-ui/dom';\nimport {\n Z_OVERLAY_DEFAULT_ARROW_EDGE_PADDING,\n Z_OVERLAY_DEFAULT_VIEWPORT_PADDING,\n Z_OVERLAY_PLACEMENT_MAP,\n Z_OVERLAY_PLACEMENT_REVERSE_MAP,\n} from './z-overlay.define';\nimport type { ZFloatingArrowOffsetConfig, ZFloatingPlacementConfig, ZFloatingPlacementResult } from './z-overlay.types';\n\nexport async function computeZOverlayPlacement(config: ZFloatingPlacementConfig): Promise<ZFloatingPlacementResult> {\n const {\n reference,\n floating,\n placement,\n fallbackPlacements,\n offset,\n viewportPadding = Z_OVERLAY_DEFAULT_VIEWPORT_PADDING,\n push = true,\n flexibleDimensions = false,\n } = config;\n\n const middleware: Middleware[] = [\n offsetMiddleware(offset),\n flip({\n fallbackPlacements: fallbackPlacements.map(pos => Z_OVERLAY_PLACEMENT_MAP[pos]),\n padding: viewportPadding,\n }),\n ];\n\n if (push) {\n middleware.push(shift({ limiter: limitShift(), padding: viewportPadding }));\n }\n\n if (flexibleDimensions) {\n middleware.push(\n size({\n padding: viewportPadding,\n apply({ availableWidth, availableHeight, elements }) {\n Object.assign(elements.floating.style, {\n maxWidth: `${Math.max(0, availableWidth)}px`,\n maxHeight: `${Math.max(0, availableHeight)}px`,\n });\n },\n })\n );\n }\n\n const result = await computePosition(reference, floating, {\n placement: Z_OVERLAY_PLACEMENT_MAP[placement],\n strategy: 'absolute',\n middleware,\n });\n\n return {\n x: result.x,\n y: result.y,\n placement: Z_OVERLAY_PLACEMENT_REVERSE_MAP[result.placement],\n };\n}\n\n/** Bọc lại `autoUpdate` của Floating UI — thay cho `scrollStrategies.reposition()` của CDK. */\nexport function startZOverlayAutoUpdate(\n reference: Element,\n floating: HTMLElement,\n onUpdate: () => void,\n options?: Partial<AutoUpdateOptions>\n): () => void {\n return autoUpdate(reference, floating, onUpdate, options);\n}\n\n/**\n * Tính độ lệch mũi tên so với tâm overlay, kẹp trong biên overlay.\n * Y hệt logic `_calculateArrowOffset` cũ của tooltip/popover — chỉ tách ra dùng chung.\n */\nexport function computeZOverlayArrowOffset(config: ZFloatingArrowOffsetConfig): number {\n const { triggerRect, overlayRect, placement, edgePadding = Z_OVERLAY_DEFAULT_ARROW_EDGE_PADDING } = config;\n const side = placement.split('-')[0] as 'top' | 'bottom' | 'left' | 'right';\n\n let rawOffset = 0;\n\n if (side === 'top' || side === 'bottom') {\n const triggerCenterX = triggerRect.left + triggerRect.width / 2;\n const overlayCenterX = overlayRect.left + overlayRect.width / 2;\n rawOffset = triggerCenterX - overlayCenterX;\n }\n\n if (side === 'left' || side === 'right') {\n const triggerCenterY = triggerRect.top + triggerRect.height / 2;\n const overlayCenterY = overlayRect.top + overlayRect.height / 2;\n rawOffset = triggerCenterY - overlayCenterY;\n }\n\n const maxOffset =\n side === 'top' || side === 'bottom' ? overlayRect.width / 2 - edgePadding : overlayRect.height / 2 - edgePadding;\n const clampedOffset = Math.max(-maxOffset, Math.min(maxOffset, rawOffset));\n\n return Math.abs(clampedOffset) > 1 ? clampedOffset : 0;\n}\n","import {\n type ApplicationRef,\n type ComponentRef,\n type EmbeddedViewRef,\n type EnvironmentInjector,\n type Injector,\n type TemplateRef,\n type Type,\n type ViewContainerRef,\n createComponent,\n} from '@angular/core';\nimport { fromEvent, Observable } from 'rxjs';\nimport { filter } from 'rxjs/operators';\nimport type { ZOverlaySizeConfig } from './z-overlay.types';\n\nfunction toCssSize(value: string | number | undefined): string {\n if (value === undefined) {\n return '';\n }\n return typeof value === 'number' ? `${value}px` : value;\n}\n\n/**\n * Thay cho `OverlayRef` của CDK. `overlayElement` là pane được Floating UI định vị\n * (overlay neo theo trigger) hoặc chính `hostElement` (overlay toàn màn hình — modal/drawer).\n */\nexport class ZOverlayRef {\n private _componentRef: ComponentRef<unknown> | null = null;\n private _embeddedViewRef: EmbeddedViewRef<unknown> | null = null;\n\n public constructor(\n public readonly hostElement: HTMLElement,\n public readonly overlayElement: HTMLElement,\n public readonly backdropElement: HTMLElement | null,\n private readonly _appRef: ApplicationRef,\n private readonly _envInjector: EnvironmentInjector,\n private readonly _onDispose?: () => void\n ) {}\n\n public hasAttached(): boolean {\n return !!this._componentRef || !!this._embeddedViewRef;\n }\n\n /**\n * `viewContainerRef`, khi được truyền, cho component tạo ra thừa hưởng injector/vị trí trong\n * cây view của chính VCR đó (giữ đúng ngữ nghĩa `ZModalOptions.zViewContainerRef` công khai) —\n * dù vậy DOM node vẫn luôn được chuyển vào `overlayElement`, y hệt `DomPortalOutlet` của CDK cũ.\n */\n public attach<T>(\n component: Type<T>,\n options?: { injector?: Injector; viewContainerRef?: ViewContainerRef }\n ): ComponentRef<T> {\n const { injector, viewContainerRef } = options ?? {};\n let ref: ComponentRef<T>;\n\n if (viewContainerRef) {\n ref = viewContainerRef.createComponent(component, { index: viewContainerRef.length, injector });\n } else {\n ref = createComponent(component, {\n environmentInjector: this._envInjector,\n elementInjector: injector,\n });\n this._appRef.attachView(ref.hostView);\n }\n\n (ref.location.nativeElement as HTMLElement).style.pointerEvents = 'auto';\n this.overlayElement.appendChild(ref.location.nativeElement as HTMLElement);\n this._componentRef = ref as ComponentRef<unknown>;\n\n return ref;\n }\n\n /** Gắn một `TemplateRef` (thay `TemplatePortal`) — chỉ dùng cho overlay tự do (z-dynamic.service). */\n public attachTemplate<C>(\n templateRef: TemplateRef<C>,\n viewContainerRef: ViewContainerRef,\n context: C\n ): EmbeddedViewRef<C> {\n const viewRef = viewContainerRef.createEmbeddedView(templateRef, context);\n viewRef.detectChanges();\n\n for (const node of viewRef.rootNodes as Node[]) {\n if (node instanceof HTMLElement) {\n node.style.pointerEvents = 'auto';\n }\n this.overlayElement.appendChild(node);\n }\n\n this._embeddedViewRef = viewRef as EmbeddedViewRef<unknown>;\n\n return viewRef;\n }\n\n public updateSize(size: ZOverlaySizeConfig): void {\n this.overlayElement.style.width = toCssSize(size.width);\n this.overlayElement.style.minWidth = toCssSize(size.minWidth);\n this.overlayElement.style.maxWidth = toCssSize(size.maxWidth);\n this.overlayElement.style.height = toCssSize(size.height);\n this.overlayElement.style.minHeight = toCssSize(size.minHeight);\n this.overlayElement.style.maxHeight = toCssSize(size.maxHeight);\n }\n\n public backdropClick(): Observable<MouseEvent> {\n if (!this.backdropElement) {\n return new Observable<MouseEvent>();\n }\n return fromEvent<MouseEvent>(this.backdropElement, 'click');\n }\n\n public outsidePointerEvents(): Observable<PointerEvent> {\n return fromEvent<PointerEvent>(document, 'pointerdown', { capture: true }).pipe(\n filter(event => !this.overlayElement.contains(event.target as Node))\n );\n }\n\n public dispose(): void {\n this._componentRef?.destroy();\n this._componentRef = null;\n\n if (this._embeddedViewRef && !this._embeddedViewRef.destroyed) {\n this._embeddedViewRef.destroy();\n }\n this._embeddedViewRef = null;\n\n try {\n (this.hostElement as HTMLElement & { hidePopover?: () => void }).hidePopover?.();\n } catch {\n // trình duyệt không hỗ trợ Popover API — bỏ qua, remove() bên dưới vẫn dọn DOM\n }\n\n this.hostElement.remove();\n this._onDispose?.();\n }\n}\n","import { DOCUMENT } from '@angular/common';\nimport { inject, Injectable } from '@angular/core';\nimport { Z_OVERLAY_SCROLL_LOCKED_CLASS } from './z-overlay.define';\n\n/**\n * Khoá scroll trang khi overlay toàn màn hình (modal/drawer) mở — thay cho\n * `scrollStrategies.block()` của CDK. Đếm tham chiếu để modal-trong-modal không mở khoá sớm.\n * Dùng `top`/`left` âm theo vị trí scroll hiện tại (giống thuật toán `BlockScrollStrategy` của CDK)\n * để không giật layout và giữ nguyên vị trí scroll khi mở khoá lại.\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class ZScrollLockService {\n private readonly _document = inject(DOCUMENT);\n private _lockCount = 0;\n private _scrollPosition = { top: 0, left: 0 };\n\n public lock(): void {\n if (this._lockCount === 0) {\n const { documentElement } = this._document;\n this._scrollPosition = { top: window.scrollY, left: window.scrollX };\n documentElement.style.top = `${-this._scrollPosition.top}px`;\n documentElement.style.left = `${-this._scrollPosition.left}px`;\n documentElement.classList.add(Z_OVERLAY_SCROLL_LOCKED_CLASS);\n }\n\n this._lockCount++;\n }\n\n public unlock(): void {\n this._lockCount = Math.max(0, this._lockCount - 1);\n if (this._lockCount > 0) {\n return;\n }\n\n const { documentElement } = this._document;\n documentElement.style.top = '';\n documentElement.style.left = '';\n documentElement.classList.remove(Z_OVERLAY_SCROLL_LOCKED_CLASS);\n window.scrollTo(this._scrollPosition.left, this._scrollPosition.top);\n }\n}\n","import { DOCUMENT } from '@angular/common';\nimport { ApplicationRef, EnvironmentInjector, inject, Injectable } from '@angular/core';\nimport {\n Z_OVERLAY_BACKDROP_CLASS,\n Z_OVERLAY_CONTAINER_CLASS,\n Z_OVERLAY_HOST_CLASS,\n Z_OVERLAY_PANE_CLASS,\n} from './z-overlay.define';\nimport { ZOverlayRef } from './z-overlay.ref';\nimport type { ZOverlayAnchoredConfig, ZOverlayGlobalConfig } from './z-overlay.types';\nimport { ZScrollLockService } from './z-scroll-lock.service';\n\n/**\n * Tạo overlay host `[popover=manual]` (top layer, thay cho `.cdk-overlay-pane`) và trả về `ZOverlayRef`.\n *\n * - `createAnchored`: overlay neo theo trigger (tooltip/popover) — có thêm `.z-overlay-pane` để\n * Floating UI định vị bằng `left`/`top` (không dùng `transform`, vì các class `z-animate-*`\n * trong `animations.css` đã chiếm `transform` cho hiệu ứng enter/exit).\n * - `createGlobal`: overlay toàn màn hình (modal/drawer) — component gắn vào tự định vị bằng\n * `zModalVariants`/`zDrawerVariants` (đã là `fixed` + toạ độ cố định), nên không cần pane riêng.\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class ZOverlayService {\n private readonly _appRef = inject(ApplicationRef);\n private readonly _envInjector = inject(EnvironmentInjector);\n private readonly _document = inject(DOCUMENT);\n private readonly _scrollLock = inject(ZScrollLockService);\n private _container: HTMLElement | null = null;\n\n public createAnchored(config: ZOverlayAnchoredConfig = {}): ZOverlayRef {\n const host = this._createHost();\n const pane = this._document.createElement('div');\n pane.classList.add(Z_OVERLAY_PANE_CLASS);\n if (config.panelClass) {\n pane.classList.add(...config.panelClass.split(' ').filter(Boolean));\n }\n host.appendChild(pane);\n\n const overlayRef = new ZOverlayRef(host, pane, null, this._appRef, this._envInjector);\n this._showHost(host);\n\n return overlayRef;\n }\n\n public createGlobal(config: ZOverlayGlobalConfig): ZOverlayRef {\n const host = this._createHost(config.panelClass);\n let backdrop: HTMLElement | null = null;\n\n if (config.hasBackdrop) {\n backdrop = this._document.createElement('div');\n backdrop.classList.add(Z_OVERLAY_BACKDROP_CLASS);\n if (config.backdropClass) {\n backdrop.classList.add(...config.backdropClass.split(' ').filter(Boolean));\n }\n host.appendChild(backdrop);\n }\n\n if (config.scrollLock) {\n this._scrollLock.lock();\n }\n\n const overlayRef = new ZOverlayRef(host, host, backdrop, this._appRef, this._envInjector, () => {\n if (config.scrollLock) {\n this._scrollLock.unlock();\n }\n });\n\n if (config.size) {\n overlayRef.updateSize(config.size);\n }\n\n this._showHost(host);\n\n return overlayRef;\n }\n\n private _createHost(panelClass?: string): HTMLElement {\n const host = this._document.createElement('div');\n host.setAttribute('popover', 'manual');\n host.classList.add(Z_OVERLAY_HOST_CLASS);\n if (panelClass) {\n host.classList.add(...panelClass.split(' ').filter(Boolean));\n }\n this._getContainer().appendChild(host);\n\n return host;\n }\n\n private _showHost(host: HTMLElement): void {\n try {\n (host as HTMLElement & { showPopover?: () => void }).showPopover?.();\n } catch {\n // trình duyệt không hỗ trợ Popover API — host vẫn hiện bình thường qua position:fixed\n }\n }\n\n private _getContainer(): HTMLElement {\n if (!this._container) {\n const container = this._document.createElement('div');\n container.className = Z_OVERLAY_CONTAINER_CLASS;\n this._document.body.appendChild(container);\n this._container = container;\n }\n\n return this._container;\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["offset","offsetMiddleware"],"mappings":"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"}
|