@shival99/z-ui 2.4.5 → 2.4.6
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/README.md +47 -7
- package/fesm2022/shival99-z-ui-components-z-calendar.mjs +102 -22
- package/fesm2022/shival99-z-ui-components-z-calendar.mjs.map +1 -1
- package/fesm2022/shival99-z-ui-components-z-hover-glide.mjs +122 -29
- package/fesm2022/shival99-z-ui-components-z-hover-glide.mjs.map +1 -1
- package/fesm2022/shival99-z-ui-components-z-menu.mjs +7 -4
- package/fesm2022/shival99-z-ui-components-z-menu.mjs.map +1 -1
- package/fesm2022/shival99-z-ui-components-z-overlay.mjs +4 -1
- package/fesm2022/shival99-z-ui-components-z-overlay.mjs.map +1 -1
- package/fesm2022/shival99-z-ui-components-z-popover.mjs +37 -26
- package/fesm2022/shival99-z-ui-components-z-popover.mjs.map +1 -1
- package/fesm2022/shival99-z-ui-i18n.mjs +2 -0
- package/fesm2022/shival99-z-ui-i18n.mjs.map +1 -1
- package/package.json +2 -2
- package/types/shival99-z-ui-components-z-autocomplete.d.ts +1 -1
- package/types/shival99-z-ui-components-z-calendar.d.ts +8 -4
- package/types/shival99-z-ui-components-z-editor.d.ts +1 -1
- package/types/shival99-z-ui-components-z-hover-glide.d.ts +7 -0
- package/types/shival99-z-ui-components-z-popover.d.ts +2 -0
- package/types/shival99-z-ui-components-z-select.d.ts +2 -2
- package/types/shival99-z-ui-components-z-table.d.ts +1 -1
|
@@ -269,7 +269,10 @@ class ZOverlayRef {
|
|
|
269
269
|
return fromEvent(this.backdropElement, 'click');
|
|
270
270
|
}
|
|
271
271
|
outsidePointerEvents() {
|
|
272
|
-
return fromEvent(
|
|
272
|
+
return fromEvent(this.hostElement.ownerDocument, 'pointerdown', { capture: true }).pipe(filter(event => {
|
|
273
|
+
const target = event.target;
|
|
274
|
+
return !this.overlayElement.contains(target) && !event.composedPath().includes(this.overlayElement);
|
|
275
|
+
}));
|
|
273
276
|
}
|
|
274
277
|
dispose() {
|
|
275
278
|
this._componentRef?.destroy();
|
|
@@ -1 +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-stack.service.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_GLOBAL_CLASS = 'z-overlay-global';\nexport const Z_OVERLAY_SCROLLABLE_CLASS = 'z-overlay-scrollable';\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/** Giữ chỗ scrollbar khi khoá scroll — chỉ gắn khi trang vốn đã dành chỗ cho scrollbar/gutter. */\nexport const Z_OVERLAY_SCROLL_LOCK_GUTTER_CLASS = 'z-scroll-locked-gutter';\n/** Chiều rộng scrollbar vẫn bị nhả ra khi khoá scroll — app dùng để bù cho element `position: fixed`. */\nexport const Z_OVERLAY_SCROLL_LOCK_GUTTER_VAR = '--z-scroll-lock-gutter';\n/** Sai số cho phép khi so chiều rộng layout lúc khoá scroll (subpixel của getBoundingClientRect). */\nexport const Z_OVERLAY_SCROLL_LOCK_WIDTH_EPSILON = 0.5;\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 { Injectable } from '@angular/core';\nimport type { ZOverlayStackEntry } from './z-overlay.types';\n\n/**\n * Ngăn xếp các overlay toàn màn hình (modal/drawer/dynamic) đang mở, theo đúng thứ tự mở.\n *\n * Mỗi ref (ZModalRef/ZDrawerRef/ZDynamicRef) tự lắng nghe `keydown` ở tầng `document`, nên nếu\n * không hỏi ngăn xếp thì MỘT lần Escape sẽ đóng dồn cả stack — modal-trong-modal hay modal mở từ\n * trong drawer đều biến mất cùng lúc. Có ngăn xếp thì chỉ overlay trên cùng phản hồi Escape.\n *\n * Overlay neo theo trigger (tooltip/popover) không đăng ký ở đây — chúng có cơ chế đóng riêng.\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class ZOverlayStackService {\n private readonly _stack: ZOverlayStackEntry[] = [];\n\n public register(entry: ZOverlayStackEntry): void {\n this.unregister(entry);\n this._stack.push(entry);\n }\n\n public unregister(entry: ZOverlayStackEntry): void {\n const index = this._stack.indexOf(entry);\n if (index !== -1) {\n this._stack.splice(index, 1);\n }\n }\n\n /**\n * `true` khi không còn overlay nào mở phía trên `entry`.\n *\n * Ngăn xếp rỗng cũng trả `true`: overlay vừa rời ngăn xếp (đang chạy animation thoát) vẫn được\n * quyền tự xử lý, còn việc chặn đóng hai lần đã do `_isClosing` của từng ref đảm nhiệm.\n */\n public isTopmost(entry: ZOverlayStackEntry): boolean {\n return this._stack.length === 0 || this._stack[this._stack.length - 1] === entry;\n }\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 { ZOverlayStackService } from './z-overlay-stack.service';\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 private readonly _stack?: ZOverlayStackService\n ) {}\n\n /**\n * `true` khi đây là overlay toàn màn hình trên cùng — dùng để chỉ overlay trên cùng phản hồi\n * Escape. Overlay không tham gia ngăn xếp (tooltip/popover) luôn trả `true`, giữ nguyên hành vi cũ.\n */\n public isTopmost(): boolean {\n return this._stack?.isTopmost(this) ?? true;\n }\n\n /**\n * Rời ngăn xếp ngay khi bắt đầu đóng, trước cả animation thoát, để lần Escape tiếp theo nhắm\n * đúng overlay bên dưới thay vì overlay đang biến mất.\n */\n public markClosing(): void {\n this._stack?.unregister(this);\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._stack?.unregister(this);\n this.hostElement.remove();\n this._onDispose?.();\n }\n}\n","import { DOCUMENT } from '@angular/common';\nimport { inject, Injectable } from '@angular/core';\nimport {\n Z_OVERLAY_SCROLL_LOCK_GUTTER_VAR,\n Z_OVERLAY_SCROLL_LOCK_WIDTH_EPSILON,\n Z_OVERLAY_SCROLL_LOCKED_CLASS,\n} 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 *\n * Chống layout shift bằng cách đo gutter thật của `<html>` rồi bù vào body trước khi khoá overflow.\n * Không giữ `scrollbar-gutter: stable` trong lúc overlay mở: fixed backdrop/panel khi đó bị giới\n * hạn theo layout viewport và hở một dải scrollbar ở mép phải trên Windows.\n *\n * Lưu ý: phải đo bằng `getBoundingClientRect()` của `<html>`, không dùng `documentElement.clientWidth`\n * — với root element thuộc tính đó trả về kích thước viewport nên luôn cộng thêm chiều rộng scrollbar\n * khi `overflow: hidden`, dẫn tới bù thừa và làm UI co lại đúng bằng chiều rộng scrollbar.\n *\n * Hiệu số được ghi ra biến CSS `--z-scroll-lock-gutter` để app bù thêm cho element `position: fixed`\n * của riêng mình nếu cần.\n *\n * Vị trí scroll vẫn được lưu để khôi phục nếu ứng dụng thay đổi scroll programmatically trong lúc khoá.\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 private _bodyPaddingRight = '';\n\n public lock(): void {\n if (this._lockCount === 0) {\n const { documentElement, body } = this._document;\n this._scrollPosition = { top: window.scrollY, left: window.scrollX };\n this._bodyPaddingRight = body.style.paddingRight;\n\n const widthBeforeLock = documentElement.getBoundingClientRect().width;\n const scrollbarWidth = Math.max(0, window.innerWidth - widthBeforeLock);\n\n documentElement.classList.add(Z_OVERLAY_SCROLL_LOCKED_CLASS);\n if (scrollbarWidth > Z_OVERLAY_SCROLL_LOCK_WIDTH_EPSILON) {\n const currentPaddingRight = Number.parseFloat(getComputedStyle(body).paddingRight) || 0;\n body.style.paddingRight = `${currentPaddingRight + scrollbarWidth}px`;\n documentElement.style.setProperty(Z_OVERLAY_SCROLL_LOCK_GUTTER_VAR, `${scrollbarWidth}px`);\n } else {\n documentElement.style.setProperty(Z_OVERLAY_SCROLL_LOCK_GUTTER_VAR, '0px');\n }\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, body } = this._document;\n body.style.paddingRight = this._bodyPaddingRight;\n documentElement.style.removeProperty(Z_OVERLAY_SCROLL_LOCK_GUTTER_VAR);\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 { ZOverlayStackService } from './z-overlay-stack.service';\nimport {\n Z_OVERLAY_BACKDROP_CLASS,\n Z_OVERLAY_CONTAINER_CLASS,\n Z_OVERLAY_GLOBAL_CLASS,\n Z_OVERLAY_HOST_CLASS,\n Z_OVERLAY_PANE_CLASS,\n Z_OVERLAY_SCROLLABLE_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 readonly _stack = inject(ZOverlayStackService);\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, Z_OVERLAY_GLOBAL_CLASS);\n if (config.scrollable) {\n host.classList.add(Z_OVERLAY_SCROLLABLE_CLASS);\n }\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(\n host,\n host,\n backdrop,\n this._appRef,\n this._envInjector,\n () => {\n if (config.scrollLock) {\n this._scrollLock.unlock();\n }\n },\n this._stack\n );\n // Chỉ overlay toàn màn hình vào ngăn xếp — Escape phải nhắm đúng cái trên cùng.\n this._stack.register(overlayRef);\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, hostClass?: string): HTMLElement {\n const host = this._document.createElement('div');\n host.setAttribute('popover', 'manual');\n host.classList.add(Z_OVERLAY_HOST_CLASS);\n if (hostClass) {\n host.classList.add(hostClass);\n }\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":";;;;;;;AAGO,MAAM,kCAAkC,GAAG;AAC3C,MAAM,oCAAoC,GAAG;AAC7C,MAAM,yBAAyB,GAAG;AAClC,MAAM,oBAAoB,GAAG;AAC7B,MAAM,sBAAsB,GAAG,kBAAkB;AACjD,MAAM,0BAA0B,GAAG;AACnC,MAAM,oBAAoB,GAAG,gBAAgB;AAC7C,MAAM,wBAAwB,GAAG,oBAAoB;AACrD,MAAM,gCAAgC,GAAG,oBAAoB;AAC7D,MAAM,6BAA6B,GAAG,iBAAiB;AAC9D;AACO,MAAM,kCAAkC,GAAG,wBAAwB;AAC1E;AACO,MAAM,gCAAgC,GAAG,wBAAwB;AACxE;AACO,MAAM,mCAAmC,GAAG,GAAG;AAEtD;AACO,MAAM,uBAAuB,GAAyC;AAC3E,IAAA,GAAG,EAAE,KAAK;AACV,IAAA,UAAU,EAAE,WAAW;AACvB,IAAA,WAAW,EAAE,SAAS;AACtB,IAAA,MAAM,EAAE,QAAQ;AAChB,IAAA,aAAa,EAAE,cAAc;AAC7B,IAAA,cAAc,EAAE,YAAY;AAC5B,IAAA,IAAI,EAAE,MAAM;AACZ,IAAA,UAAU,EAAE,YAAY;AACxB,IAAA,aAAa,EAAE,UAAU;AACzB,IAAA,KAAK,EAAE,OAAO;AACd,IAAA,WAAW,EAAE,aAAa;AAC1B,IAAA,cAAc,EAAE,WAAW;;AAGtB,MAAM,+BAA+B,GAAyC,MAAM,CAAC,WAAW,CACrG,MAAM,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,SAAS,CAAC,KAAK,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;AAGnG;;;AAGG;AACI,MAAM,wBAAwB,GAAmD;IACtF,GAAG,EAAE,CAAC,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE,cAAc,CAAC;IACvE,UAAU,EAAE,CAAC,aAAa,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,cAAc,CAAC;IACzE,WAAW,EAAE,CAAC,cAAc,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,aAAa,CAAC;IACzE,MAAM,EAAE,CAAC,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,UAAU,EAAE,WAAW,CAAC;IACvE,aAAa,EAAE,CAAC,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,cAAc,EAAE,WAAW,CAAC;IACzE,cAAc,EAAE,CAAC,WAAW,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,EAAE,UAAU,CAAC;IACzE,IAAI,EAAE,CAAC,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,WAAW,EAAE,cAAc,CAAC;IACvE,UAAU,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,cAAc,CAAC;IACzE,aAAa,EAAE,CAAC,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,CAAC;IACzE,KAAK,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,UAAU,EAAE,aAAa,CAAC;IACvE,WAAW,EAAE,CAAC,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,aAAa,CAAC;IACzE,cAAc,EAAE,CAAC,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,CAAC;;AAG3E;AACO,MAAM,8BAA8B,GAAmD;AAC5F,IAAA,GAAG,EAAE,CAAC,UAAU,EAAE,WAAW,CAAC;AAC9B,IAAA,UAAU,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC;AAChC,IAAA,WAAW,EAAE,CAAC,KAAK,EAAE,UAAU,CAAC;AAChC,IAAA,MAAM,EAAE,CAAC,aAAa,EAAE,cAAc,CAAC;AACvC,IAAA,aAAa,EAAE,CAAC,QAAQ,EAAE,cAAc,CAAC;AACzC,IAAA,cAAc,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC;AACzC,IAAA,IAAI,EAAE,CAAC,UAAU,EAAE,aAAa,CAAC;AACjC,IAAA,UAAU,EAAE,CAAC,MAAM,EAAE,aAAa,CAAC;AACnC,IAAA,aAAa,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC;AACnC,IAAA,KAAK,EAAE,CAAC,WAAW,EAAE,cAAc,CAAC;AACpC,IAAA,WAAW,EAAE,CAAC,OAAO,EAAE,cAAc,CAAC;AACtC,IAAA,cAAc,EAAE,CAAC,OAAO,EAAE,WAAW,CAAC;;;ACrDjC,eAAe,wBAAwB,CAAC,MAAgC,EAAA;IAC7E,MAAM,EACJ,SAAS,EACT,QAAQ,EACR,SAAS,EACT,kBAAkB,UAClBA,QAAM,EACN,eAAe,GAAG,kCAAkC,EACpD,IAAI,GAAG,IAAI,EACX,kBAAkB,GAAG,KAAK,GAC3B,GAAG,MAAM;AAEV,IAAA,MAAM,UAAU,GAAiB;QAC/BC,MAAgB,CAACD,QAAM,CAAC;AACxB,QAAA,IAAI,CAAC;AACH,YAAA,kBAAkB,EAAE,kBAAkB,CAAC,GAAG,CAAC,GAAG,IAAI,uBAAuB,CAAC,GAAG,CAAC,CAAC;AAC/E,YAAA,OAAO,EAAE,eAAe;SACzB,CAAC;KACH;IAED,IAAI,IAAI,EAAE;AACR,QAAA,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC,CAAC;IAC7E;IAEA,IAAI,kBAAkB,EAAE;AACtB,QAAA,UAAU,CAAC,IAAI,CACb,IAAI,CAAC;AACH,YAAA,OAAO,EAAE,eAAe;AACxB,YAAA,KAAK,CAAC,EAAE,cAAc,EAAE,eAAe,EAAE,QAAQ,EAAE,EAAA;gBACjD,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE;oBACrC,QAAQ,EAAE,CAAA,EAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,cAAc,CAAC,CAAA,EAAA,CAAI;oBAC5C,SAAS,EAAE,CAAA,EAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,eAAe,CAAC,CAAA,EAAA,CAAI;AAC/C,iBAAA,CAAC;YACJ,CAAC;AACF,SAAA,CAAC,CACH;IACH;IAEA,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,SAAS,EAAE,QAAQ,EAAE;AACxD,QAAA,SAAS,EAAE,uBAAuB,CAAC,SAAS,CAAC;AAC7C,QAAA,QAAQ,EAAE,UAAU;QACpB,UAAU;AACX,KAAA,CAAC;IAEF,OAAO;QACL,CAAC,EAAE,MAAM,CAAC,CAAC;QACX,CAAC,EAAE,MAAM,CAAC,CAAC;AACX,QAAA,SAAS,EAAE,+BAA+B,CAAC,MAAM,CAAC,SAAS,CAAC;KAC7D;AACH;AAEA;AACM,SAAU,uBAAuB,CACrC,SAAkB,EAClB,QAAqB,EACrB,QAAoB,EACpB,OAAoC,EAAA;IAEpC,OAAO,UAAU,CAAC,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC;AAC3D;AAEA;;;AAGG;AACG,SAAU,0BAA0B,CAAC,MAAkC,EAAA;AAC3E,IAAA,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,GAAG,oCAAoC,EAAE,GAAG,MAAM;IAC1G,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAwC;IAE3E,IAAI,SAAS,GAAG,CAAC;IAEjB,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,QAAQ,EAAE;QACvC,MAAM,cAAc,GAAG,WAAW,CAAC,IAAI,GAAG,WAAW,CAAC,KAAK,GAAG,CAAC;QAC/D,MAAM,cAAc,GAAG,WAAW,CAAC,IAAI,GAAG,WAAW,CAAC,KAAK,GAAG,CAAC;AAC/D,QAAA,SAAS,GAAG,cAAc,GAAG,cAAc;IAC7C;IAEA,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,OAAO,EAAE;QACvC,MAAM,cAAc,GAAG,WAAW,CAAC,GAAG,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC;QAC/D,MAAM,cAAc,GAAG,WAAW,CAAC,GAAG,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC;AAC/D,QAAA,SAAS,GAAG,cAAc,GAAG,cAAc;IAC7C;AAEA,IAAA,MAAM,SAAS,GACb,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,QAAQ,GAAG,WAAW,CAAC,KAAK,GAAG,CAAC,GAAG,WAAW,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,GAAG,WAAW;AAClH,IAAA,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;AAE1E,IAAA,OAAO,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,aAAa,GAAG,CAAC;AACxD;;ACxGA;;;;;;;;AAQG;MAIU,oBAAoB,CAAA;IACd,MAAM,GAAyB,EAAE;AAE3C,IAAA,QAAQ,CAAC,KAAyB,EAAA;AACvC,QAAA,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;AACtB,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;IACzB;AAEO,IAAA,UAAU,CAAC,KAAyB,EAAA;QACzC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;AACxC,QAAA,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE;YAChB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QAC9B;IACF;AAEA;;;;;AAKG;AACI,IAAA,SAAS,CAAC,KAAyB,EAAA;QACxC,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,KAAK;IAClF;uGAvBW,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAApB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,oBAAoB,cAFnB,MAAM,EAAA,CAAA;;2FAEP,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAHhC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;ACED,SAAS,SAAS,CAAC,KAAkC,EAAA;AACnD,IAAA,IAAI,KAAK,KAAK,SAAS,EAAE;AACvB,QAAA,OAAO,EAAE;IACX;AACA,IAAA,OAAO,OAAO,KAAK,KAAK,QAAQ,GAAG,CAAA,EAAG,KAAK,CAAA,EAAA,CAAI,GAAG,KAAK;AACzD;AAEA;;;AAGG;MACU,WAAW,CAAA;AAKJ,IAAA,WAAA;AACA,IAAA,cAAA;AACA,IAAA,eAAA;AACC,IAAA,OAAA;AACA,IAAA,YAAA;AACA,IAAA,UAAA;AACA,IAAA,MAAA;IAVX,aAAa,GAAiC,IAAI;IAClD,gBAAgB,GAAoC,IAAI;AAEhE,IAAA,WAAA,CACkB,WAAwB,EACxB,cAA2B,EAC3B,eAAmC,EAClC,OAAuB,EACvB,YAAiC,EACjC,UAAuB,EACvB,MAA6B,EAAA;QAN9B,IAAA,CAAA,WAAW,GAAX,WAAW;QACX,IAAA,CAAA,cAAc,GAAd,cAAc;QACd,IAAA,CAAA,eAAe,GAAf,eAAe;QACd,IAAA,CAAA,OAAO,GAAP,OAAO;QACP,IAAA,CAAA,YAAY,GAAZ,YAAY;QACZ,IAAA,CAAA,UAAU,GAAV,UAAU;QACV,IAAA,CAAA,MAAM,GAAN,MAAM;IACtB;AAEH;;;AAGG;IACI,SAAS,GAAA;QACd,OAAO,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI;IAC7C;AAEA;;;AAGG;IACI,WAAW,GAAA;AAChB,QAAA,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,IAAI,CAAC;IAC/B;IAEO,WAAW,GAAA;QAChB,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,CAAC,IAAI,CAAC,gBAAgB;IACxD;AAEA;;;;AAIG;IACI,MAAM,CACX,SAAkB,EAClB,OAAsE,EAAA;QAEtE,MAAM,EAAE,QAAQ,EAAE,gBAAgB,EAAE,GAAG,OAAO,IAAI,EAAE;AACpD,QAAA,IAAI,GAAoB;QAExB,IAAI,gBAAgB,EAAE;AACpB,YAAA,GAAG,GAAG,gBAAgB,CAAC,eAAe,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,gBAAgB,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC;QACjG;aAAO;AACL,YAAA,GAAG,GAAG,eAAe,CAAC,SAAS,EAAE;gBAC/B,mBAAmB,EAAE,IAAI,CAAC,YAAY;AACtC,gBAAA,eAAe,EAAE,QAAQ;AAC1B,aAAA,CAAC;YACF,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC;QACvC;QAEC,GAAG,CAAC,QAAQ,CAAC,aAA6B,CAAC,KAAK,CAAC,aAAa,GAAG,MAAM;QACxE,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,aAA4B,CAAC;AAC1E,QAAA,IAAI,CAAC,aAAa,GAAG,GAA4B;AAEjD,QAAA,OAAO,GAAG;IACZ;;AAGO,IAAA,cAAc,CACnB,WAA2B,EAC3B,gBAAkC,EAClC,OAAU,EAAA;QAEV,MAAM,OAAO,GAAG,gBAAgB,CAAC,kBAAkB,CAAC,WAAW,EAAE,OAAO,CAAC;QACzE,OAAO,CAAC,aAAa,EAAE;AAEvB,QAAA,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,SAAmB,EAAE;AAC9C,YAAA,IAAI,IAAI,YAAY,WAAW,EAAE;AAC/B,gBAAA,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,MAAM;YACnC;AACA,YAAA,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,IAAI,CAAC;QACvC;AAEA,QAAA,IAAI,CAAC,gBAAgB,GAAG,OAAmC;AAE3D,QAAA,OAAO,OAAO;IAChB;AAEO,IAAA,UAAU,CAAC,IAAwB,EAAA;AACxC,QAAA,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC;AACvD,QAAA,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC;AAC7D,QAAA,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC;AAC7D,QAAA,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC;AACzD,QAAA,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC;AAC/D,QAAA,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC;IACjE;IAEO,aAAa,GAAA;AAClB,QAAA,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE;YACzB,OAAO,IAAI,UAAU,EAAc;QACrC;QACA,OAAO,SAAS,CAAa,IAAI,CAAC,eAAe,EAAE,OAAO,CAAC;IAC7D;IAEO,oBAAoB,GAAA;AACzB,QAAA,OAAO,SAAS,CAAe,QAAQ,EAAE,aAAa,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAC7E,MAAM,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAc,CAAC,CAAC,CACrE;IACH;IAEO,OAAO,GAAA;AACZ,QAAA,IAAI,CAAC,aAAa,EAAE,OAAO,EAAE;AAC7B,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI;QAEzB,IAAI,IAAI,CAAC,gBAAgB,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE;AAC7D,YAAA,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE;QACjC;AACA,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;AAE5B,QAAA,IAAI;AACD,YAAA,IAAI,CAAC,WAA0D,CAAC,WAAW,IAAI;QAClF;AAAE,QAAA,MAAM;;QAER;AAEA,QAAA,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,IAAI,CAAC;AAC7B,QAAA,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE;AACzB,QAAA,IAAI,CAAC,UAAU,IAAI;IACrB;AACD;;AChJD;;;;;;;;;;;;;;;;AAgBG;MAIU,kBAAkB,CAAA;AACZ,IAAA,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC;IACrC,UAAU,GAAG,CAAC;IACd,eAAe,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE;IACrC,iBAAiB,GAAG,EAAE;IAEvB,IAAI,GAAA;AACT,QAAA,IAAI,IAAI,CAAC,UAAU,KAAK,CAAC,EAAE;YACzB,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS;AAChD,YAAA,IAAI,CAAC,eAAe,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,OAAO,EAAE;YACpE,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY;YAEhD,MAAM,eAAe,GAAG,eAAe,CAAC,qBAAqB,EAAE,CAAC,KAAK;AACrE,YAAA,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,UAAU,GAAG,eAAe,CAAC;AAEvE,YAAA,eAAe,CAAC,SAAS,CAAC,GAAG,CAAC,6BAA6B,CAAC;AAC5D,YAAA,IAAI,cAAc,GAAG,mCAAmC,EAAE;AACxD,gBAAA,MAAM,mBAAmB,GAAG,MAAM,CAAC,UAAU,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC;gBACvF,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,GAAG,mBAAmB,GAAG,cAAc,CAAA,EAAA,CAAI;gBACrE,eAAe,CAAC,KAAK,CAAC,WAAW,CAAC,gCAAgC,EAAE,CAAA,EAAG,cAAc,CAAA,EAAA,CAAI,CAAC;YAC5F;iBAAO;gBACL,eAAe,CAAC,KAAK,CAAC,WAAW,CAAC,gCAAgC,EAAE,KAAK,CAAC;YAC5E;QACF;QAEA,IAAI,CAAC,UAAU,EAAE;IACnB;IAEO,MAAM,GAAA;AACX,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;AAClD,QAAA,IAAI,IAAI,CAAC,UAAU,GAAG,CAAC,EAAE;YACvB;QACF;QAEA,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS;QAChD,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC,iBAAiB;AAChD,QAAA,eAAe,CAAC,KAAK,CAAC,cAAc,CAAC,gCAAgC,CAAC;AACtE,QAAA,eAAe,CAAC,SAAS,CAAC,MAAM,CAAC,6BAA6B,CAAC;AAC/D,QAAA,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC;IACtE;uGAvCW,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAlB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,kBAAkB,cAFjB,MAAM,EAAA,CAAA;;2FAEP,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAH9B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;ACZD;;;;;;;;AAQG;MAIU,eAAe,CAAA;AACT,IAAA,OAAO,GAAG,MAAM,CAAC,cAAc,CAAC;AAChC,IAAA,YAAY,GAAG,MAAM,CAAC,mBAAmB,CAAC;AAC1C,IAAA,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC;AAC5B,IAAA,WAAW,GAAG,MAAM,CAAC,kBAAkB,CAAC;AACxC,IAAA,MAAM,GAAG,MAAM,CAAC,oBAAoB,CAAC;IAC9C,UAAU,GAAuB,IAAI;IAEtC,cAAc,CAAC,SAAiC,EAAE,EAAA;AACvD,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE;QAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,KAAK,CAAC;AAChD,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,oBAAoB,CAAC;AACxC,QAAA,IAAI,MAAM,CAAC,UAAU,EAAE;YACrB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACrE;AACA,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;AAEtB,QAAA,MAAM,UAAU,GAAG,IAAI,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC;AACrF,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;AAEpB,QAAA,OAAO,UAAU;IACnB;AAEO,IAAA,YAAY,CAAC,MAA4B,EAAA;AAC9C,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,UAAU,EAAE,sBAAsB,CAAC;AACxE,QAAA,IAAI,MAAM,CAAC,UAAU,EAAE;AACrB,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,0BAA0B,CAAC;QAChD;QACA,IAAI,QAAQ,GAAuB,IAAI;AAEvC,QAAA,IAAI,MAAM,CAAC,WAAW,EAAE;YACtB,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,KAAK,CAAC;AAC9C,YAAA,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,wBAAwB,CAAC;AAChD,YAAA,IAAI,MAAM,CAAC,aAAa,EAAE;gBACxB,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC5E;AACA,YAAA,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC;QAC5B;AAEA,QAAA,IAAI,MAAM,CAAC,UAAU,EAAE;AACrB,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE;QACzB;QAEA,MAAM,UAAU,GAAG,IAAI,WAAW,CAChC,IAAI,EACJ,IAAI,EACJ,QAAQ,EACR,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,YAAY,EACjB,MAAK;AACH,YAAA,IAAI,MAAM,CAAC,UAAU,EAAE;AACrB,gBAAA,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE;YAC3B;AACF,QAAA,CAAC,EACD,IAAI,CAAC,MAAM,CACZ;;AAED,QAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC;AAEhC,QAAA,IAAI,MAAM,CAAC,IAAI,EAAE;AACf,YAAA,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC;QACpC;AAEA,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;AAEpB,QAAA,OAAO,UAAU;IACnB;IAEQ,WAAW,CAAC,UAAmB,EAAE,SAAkB,EAAA;QACzD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,KAAK,CAAC;AAChD,QAAA,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,QAAQ,CAAC;AACtC,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,oBAAoB,CAAC;QACxC,IAAI,SAAS,EAAE;AACb,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC;QAC/B;QACA,IAAI,UAAU,EAAE;AACd,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC9D;QACA,IAAI,CAAC,aAAa,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC;AAEtC,QAAA,OAAO,IAAI;IACb;AAEQ,IAAA,SAAS,CAAC,IAAiB,EAAA;AACjC,QAAA,IAAI;AACD,YAAA,IAAmD,CAAC,WAAW,IAAI;QACtE;AAAE,QAAA,MAAM;;QAER;IACF;IAEQ,aAAa,GAAA;AACnB,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;YACpB,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,KAAK,CAAC;AACrD,YAAA,SAAS,CAAC,SAAS,GAAG,yBAAyB;YAC/C,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC;AAC1C,YAAA,IAAI,CAAC,UAAU,GAAG,SAAS;QAC7B;QAEA,OAAO,IAAI,CAAC,UAAU;IACxB;uGApGW,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAf,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,eAAe,cAFd,MAAM,EAAA,CAAA;;2FAEP,eAAe,EAAA,UAAA,EAAA,CAAA;kBAH3B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;AC1BD;;AAEG;;"}
|
|
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-stack.service.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_GLOBAL_CLASS = 'z-overlay-global';\nexport const Z_OVERLAY_SCROLLABLE_CLASS = 'z-overlay-scrollable';\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/** Giữ chỗ scrollbar khi khoá scroll — chỉ gắn khi trang vốn đã dành chỗ cho scrollbar/gutter. */\nexport const Z_OVERLAY_SCROLL_LOCK_GUTTER_CLASS = 'z-scroll-locked-gutter';\n/** Chiều rộng scrollbar vẫn bị nhả ra khi khoá scroll — app dùng để bù cho element `position: fixed`. */\nexport const Z_OVERLAY_SCROLL_LOCK_GUTTER_VAR = '--z-scroll-lock-gutter';\n/** Sai số cho phép khi so chiều rộng layout lúc khoá scroll (subpixel của getBoundingClientRect). */\nexport const Z_OVERLAY_SCROLL_LOCK_WIDTH_EPSILON = 0.5;\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 { Injectable } from '@angular/core';\nimport type { ZOverlayStackEntry } from './z-overlay.types';\n\n/**\n * Ngăn xếp các overlay toàn màn hình (modal/drawer/dynamic) đang mở, theo đúng thứ tự mở.\n *\n * Mỗi ref (ZModalRef/ZDrawerRef/ZDynamicRef) tự lắng nghe `keydown` ở tầng `document`, nên nếu\n * không hỏi ngăn xếp thì MỘT lần Escape sẽ đóng dồn cả stack — modal-trong-modal hay modal mở từ\n * trong drawer đều biến mất cùng lúc. Có ngăn xếp thì chỉ overlay trên cùng phản hồi Escape.\n *\n * Overlay neo theo trigger (tooltip/popover) không đăng ký ở đây — chúng có cơ chế đóng riêng.\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class ZOverlayStackService {\n private readonly _stack: ZOverlayStackEntry[] = [];\n\n public register(entry: ZOverlayStackEntry): void {\n this.unregister(entry);\n this._stack.push(entry);\n }\n\n public unregister(entry: ZOverlayStackEntry): void {\n const index = this._stack.indexOf(entry);\n if (index !== -1) {\n this._stack.splice(index, 1);\n }\n }\n\n /**\n * `true` khi không còn overlay nào mở phía trên `entry`.\n *\n * Ngăn xếp rỗng cũng trả `true`: overlay vừa rời ngăn xếp (đang chạy animation thoát) vẫn được\n * quyền tự xử lý, còn việc chặn đóng hai lần đã do `_isClosing` của từng ref đảm nhiệm.\n */\n public isTopmost(entry: ZOverlayStackEntry): boolean {\n return this._stack.length === 0 || this._stack[this._stack.length - 1] === entry;\n }\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 { ZOverlayStackService } from './z-overlay-stack.service';\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 private readonly _stack?: ZOverlayStackService\n ) {}\n\n /**\n * `true` khi đây là overlay toàn màn hình trên cùng — dùng để chỉ overlay trên cùng phản hồi\n * Escape. Overlay không tham gia ngăn xếp (tooltip/popover) luôn trả `true`, giữ nguyên hành vi cũ.\n */\n public isTopmost(): boolean {\n return this._stack?.isTopmost(this) ?? true;\n }\n\n /**\n * Rời ngăn xếp ngay khi bắt đầu đóng, trước cả animation thoát, để lần Escape tiếp theo nhắm\n * đúng overlay bên dưới thay vì overlay đang biến mất.\n */\n public markClosing(): void {\n this._stack?.unregister(this);\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>(this.hostElement.ownerDocument, 'pointerdown', { capture: true }).pipe(\n filter(event => {\n const target = event.target as Node;\n return !this.overlayElement.contains(target) && !event.composedPath().includes(this.overlayElement);\n })\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._stack?.unregister(this);\n this.hostElement.remove();\n this._onDispose?.();\n }\n}\n","import { DOCUMENT } from '@angular/common';\nimport { inject, Injectable } from '@angular/core';\nimport {\n Z_OVERLAY_SCROLL_LOCK_GUTTER_VAR,\n Z_OVERLAY_SCROLL_LOCK_WIDTH_EPSILON,\n Z_OVERLAY_SCROLL_LOCKED_CLASS,\n} 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 *\n * Chống layout shift bằng cách đo gutter thật của `<html>` rồi bù vào body trước khi khoá overflow.\n * Không giữ `scrollbar-gutter: stable` trong lúc overlay mở: fixed backdrop/panel khi đó bị giới\n * hạn theo layout viewport và hở một dải scrollbar ở mép phải trên Windows.\n *\n * Lưu ý: phải đo bằng `getBoundingClientRect()` của `<html>`, không dùng `documentElement.clientWidth`\n * — với root element thuộc tính đó trả về kích thước viewport nên luôn cộng thêm chiều rộng scrollbar\n * khi `overflow: hidden`, dẫn tới bù thừa và làm UI co lại đúng bằng chiều rộng scrollbar.\n *\n * Hiệu số được ghi ra biến CSS `--z-scroll-lock-gutter` để app bù thêm cho element `position: fixed`\n * của riêng mình nếu cần.\n *\n * Vị trí scroll vẫn được lưu để khôi phục nếu ứng dụng thay đổi scroll programmatically trong lúc khoá.\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 private _bodyPaddingRight = '';\n\n public lock(): void {\n if (this._lockCount === 0) {\n const { documentElement, body } = this._document;\n this._scrollPosition = { top: window.scrollY, left: window.scrollX };\n this._bodyPaddingRight = body.style.paddingRight;\n\n const widthBeforeLock = documentElement.getBoundingClientRect().width;\n const scrollbarWidth = Math.max(0, window.innerWidth - widthBeforeLock);\n\n documentElement.classList.add(Z_OVERLAY_SCROLL_LOCKED_CLASS);\n if (scrollbarWidth > Z_OVERLAY_SCROLL_LOCK_WIDTH_EPSILON) {\n const currentPaddingRight = Number.parseFloat(getComputedStyle(body).paddingRight) || 0;\n body.style.paddingRight = `${currentPaddingRight + scrollbarWidth}px`;\n documentElement.style.setProperty(Z_OVERLAY_SCROLL_LOCK_GUTTER_VAR, `${scrollbarWidth}px`);\n } else {\n documentElement.style.setProperty(Z_OVERLAY_SCROLL_LOCK_GUTTER_VAR, '0px');\n }\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, body } = this._document;\n body.style.paddingRight = this._bodyPaddingRight;\n documentElement.style.removeProperty(Z_OVERLAY_SCROLL_LOCK_GUTTER_VAR);\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 { ZOverlayStackService } from './z-overlay-stack.service';\nimport {\n Z_OVERLAY_BACKDROP_CLASS,\n Z_OVERLAY_CONTAINER_CLASS,\n Z_OVERLAY_GLOBAL_CLASS,\n Z_OVERLAY_HOST_CLASS,\n Z_OVERLAY_PANE_CLASS,\n Z_OVERLAY_SCROLLABLE_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 readonly _stack = inject(ZOverlayStackService);\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, Z_OVERLAY_GLOBAL_CLASS);\n if (config.scrollable) {\n host.classList.add(Z_OVERLAY_SCROLLABLE_CLASS);\n }\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(\n host,\n host,\n backdrop,\n this._appRef,\n this._envInjector,\n () => {\n if (config.scrollLock) {\n this._scrollLock.unlock();\n }\n },\n this._stack\n );\n // Chỉ overlay toàn màn hình vào ngăn xếp — Escape phải nhắm đúng cái trên cùng.\n this._stack.register(overlayRef);\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, hostClass?: string): HTMLElement {\n const host = this._document.createElement('div');\n host.setAttribute('popover', 'manual');\n host.classList.add(Z_OVERLAY_HOST_CLASS);\n if (hostClass) {\n host.classList.add(hostClass);\n }\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":";;;;;;;AAGO,MAAM,kCAAkC,GAAG;AAC3C,MAAM,oCAAoC,GAAG;AAC7C,MAAM,yBAAyB,GAAG;AAClC,MAAM,oBAAoB,GAAG;AAC7B,MAAM,sBAAsB,GAAG,kBAAkB;AACjD,MAAM,0BAA0B,GAAG;AACnC,MAAM,oBAAoB,GAAG,gBAAgB;AAC7C,MAAM,wBAAwB,GAAG,oBAAoB;AACrD,MAAM,gCAAgC,GAAG,oBAAoB;AAC7D,MAAM,6BAA6B,GAAG,iBAAiB;AAC9D;AACO,MAAM,kCAAkC,GAAG,wBAAwB;AAC1E;AACO,MAAM,gCAAgC,GAAG,wBAAwB;AACxE;AACO,MAAM,mCAAmC,GAAG,GAAG;AAEtD;AACO,MAAM,uBAAuB,GAAyC;AAC3E,IAAA,GAAG,EAAE,KAAK;AACV,IAAA,UAAU,EAAE,WAAW;AACvB,IAAA,WAAW,EAAE,SAAS;AACtB,IAAA,MAAM,EAAE,QAAQ;AAChB,IAAA,aAAa,EAAE,cAAc;AAC7B,IAAA,cAAc,EAAE,YAAY;AAC5B,IAAA,IAAI,EAAE,MAAM;AACZ,IAAA,UAAU,EAAE,YAAY;AACxB,IAAA,aAAa,EAAE,UAAU;AACzB,IAAA,KAAK,EAAE,OAAO;AACd,IAAA,WAAW,EAAE,aAAa;AAC1B,IAAA,cAAc,EAAE,WAAW;;AAGtB,MAAM,+BAA+B,GAAyC,MAAM,CAAC,WAAW,CACrG,MAAM,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,UAAU,EAAE,SAAS,CAAC,KAAK,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;AAGnG;;;AAGG;AACI,MAAM,wBAAwB,GAAmD;IACtF,GAAG,EAAE,CAAC,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE,cAAc,CAAC;IACvE,UAAU,EAAE,CAAC,aAAa,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,cAAc,CAAC;IACzE,WAAW,EAAE,CAAC,cAAc,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,aAAa,CAAC;IACzE,MAAM,EAAE,CAAC,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,UAAU,EAAE,WAAW,CAAC;IACvE,aAAa,EAAE,CAAC,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,cAAc,EAAE,WAAW,CAAC;IACzE,cAAc,EAAE,CAAC,WAAW,EAAE,QAAQ,EAAE,KAAK,EAAE,aAAa,EAAE,UAAU,CAAC;IACzE,IAAI,EAAE,CAAC,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,WAAW,EAAE,cAAc,CAAC;IACvE,UAAU,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,cAAc,CAAC;IACzE,aAAa,EAAE,CAAC,cAAc,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,CAAC;IACzE,KAAK,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,UAAU,EAAE,aAAa,CAAC;IACvE,WAAW,EAAE,CAAC,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,aAAa,CAAC;IACzE,cAAc,EAAE,CAAC,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,CAAC;;AAG3E;AACO,MAAM,8BAA8B,GAAmD;AAC5F,IAAA,GAAG,EAAE,CAAC,UAAU,EAAE,WAAW,CAAC;AAC9B,IAAA,UAAU,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC;AAChC,IAAA,WAAW,EAAE,CAAC,KAAK,EAAE,UAAU,CAAC;AAChC,IAAA,MAAM,EAAE,CAAC,aAAa,EAAE,cAAc,CAAC;AACvC,IAAA,aAAa,EAAE,CAAC,QAAQ,EAAE,cAAc,CAAC;AACzC,IAAA,cAAc,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC;AACzC,IAAA,IAAI,EAAE,CAAC,UAAU,EAAE,aAAa,CAAC;AACjC,IAAA,UAAU,EAAE,CAAC,MAAM,EAAE,aAAa,CAAC;AACnC,IAAA,aAAa,EAAE,CAAC,MAAM,EAAE,UAAU,CAAC;AACnC,IAAA,KAAK,EAAE,CAAC,WAAW,EAAE,cAAc,CAAC;AACpC,IAAA,WAAW,EAAE,CAAC,OAAO,EAAE,cAAc,CAAC;AACtC,IAAA,cAAc,EAAE,CAAC,OAAO,EAAE,WAAW,CAAC;;;ACrDjC,eAAe,wBAAwB,CAAC,MAAgC,EAAA;IAC7E,MAAM,EACJ,SAAS,EACT,QAAQ,EACR,SAAS,EACT,kBAAkB,UAClBA,QAAM,EACN,eAAe,GAAG,kCAAkC,EACpD,IAAI,GAAG,IAAI,EACX,kBAAkB,GAAG,KAAK,GAC3B,GAAG,MAAM;AAEV,IAAA,MAAM,UAAU,GAAiB;QAC/BC,MAAgB,CAACD,QAAM,CAAC;AACxB,QAAA,IAAI,CAAC;AACH,YAAA,kBAAkB,EAAE,kBAAkB,CAAC,GAAG,CAAC,GAAG,IAAI,uBAAuB,CAAC,GAAG,CAAC,CAAC;AAC/E,YAAA,OAAO,EAAE,eAAe;SACzB,CAAC;KACH;IAED,IAAI,IAAI,EAAE;AACR,QAAA,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,OAAO,EAAE,eAAe,EAAE,CAAC,CAAC;IAC7E;IAEA,IAAI,kBAAkB,EAAE;AACtB,QAAA,UAAU,CAAC,IAAI,CACb,IAAI,CAAC;AACH,YAAA,OAAO,EAAE,eAAe;AACxB,YAAA,KAAK,CAAC,EAAE,cAAc,EAAE,eAAe,EAAE,QAAQ,EAAE,EAAA;gBACjD,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,EAAE;oBACrC,QAAQ,EAAE,CAAA,EAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,cAAc,CAAC,CAAA,EAAA,CAAI;oBAC5C,SAAS,EAAE,CAAA,EAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,eAAe,CAAC,CAAA,EAAA,CAAI;AAC/C,iBAAA,CAAC;YACJ,CAAC;AACF,SAAA,CAAC,CACH;IACH;IAEA,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,SAAS,EAAE,QAAQ,EAAE;AACxD,QAAA,SAAS,EAAE,uBAAuB,CAAC,SAAS,CAAC;AAC7C,QAAA,QAAQ,EAAE,UAAU;QACpB,UAAU;AACX,KAAA,CAAC;IAEF,OAAO;QACL,CAAC,EAAE,MAAM,CAAC,CAAC;QACX,CAAC,EAAE,MAAM,CAAC,CAAC;AACX,QAAA,SAAS,EAAE,+BAA+B,CAAC,MAAM,CAAC,SAAS,CAAC;KAC7D;AACH;AAEA;AACM,SAAU,uBAAuB,CACrC,SAAkB,EAClB,QAAqB,EACrB,QAAoB,EACpB,OAAoC,EAAA;IAEpC,OAAO,UAAU,CAAC,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC;AAC3D;AAEA;;;AAGG;AACG,SAAU,0BAA0B,CAAC,MAAkC,EAAA;AAC3E,IAAA,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,GAAG,oCAAoC,EAAE,GAAG,MAAM;IAC1G,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAwC;IAE3E,IAAI,SAAS,GAAG,CAAC;IAEjB,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,QAAQ,EAAE;QACvC,MAAM,cAAc,GAAG,WAAW,CAAC,IAAI,GAAG,WAAW,CAAC,KAAK,GAAG,CAAC;QAC/D,MAAM,cAAc,GAAG,WAAW,CAAC,IAAI,GAAG,WAAW,CAAC,KAAK,GAAG,CAAC;AAC/D,QAAA,SAAS,GAAG,cAAc,GAAG,cAAc;IAC7C;IAEA,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,OAAO,EAAE;QACvC,MAAM,cAAc,GAAG,WAAW,CAAC,GAAG,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC;QAC/D,MAAM,cAAc,GAAG,WAAW,CAAC,GAAG,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC;AAC/D,QAAA,SAAS,GAAG,cAAc,GAAG,cAAc;IAC7C;AAEA,IAAA,MAAM,SAAS,GACb,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,QAAQ,GAAG,WAAW,CAAC,KAAK,GAAG,CAAC,GAAG,WAAW,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,GAAG,WAAW;AAClH,IAAA,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;AAE1E,IAAA,OAAO,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,aAAa,GAAG,CAAC;AACxD;;ACxGA;;;;;;;;AAQG;MAIU,oBAAoB,CAAA;IACd,MAAM,GAAyB,EAAE;AAE3C,IAAA,QAAQ,CAAC,KAAyB,EAAA;AACvC,QAAA,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;AACtB,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;IACzB;AAEO,IAAA,UAAU,CAAC,KAAyB,EAAA;QACzC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;AACxC,QAAA,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE;YAChB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QAC9B;IACF;AAEA;;;;;AAKG;AACI,IAAA,SAAS,CAAC,KAAyB,EAAA;QACxC,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,KAAK;IAClF;uGAvBW,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAApB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,oBAAoB,cAFnB,MAAM,EAAA,CAAA;;2FAEP,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAHhC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;ACED,SAAS,SAAS,CAAC,KAAkC,EAAA;AACnD,IAAA,IAAI,KAAK,KAAK,SAAS,EAAE;AACvB,QAAA,OAAO,EAAE;IACX;AACA,IAAA,OAAO,OAAO,KAAK,KAAK,QAAQ,GAAG,CAAA,EAAG,KAAK,CAAA,EAAA,CAAI,GAAG,KAAK;AACzD;AAEA;;;AAGG;MACU,WAAW,CAAA;AAKJ,IAAA,WAAA;AACA,IAAA,cAAA;AACA,IAAA,eAAA;AACC,IAAA,OAAA;AACA,IAAA,YAAA;AACA,IAAA,UAAA;AACA,IAAA,MAAA;IAVX,aAAa,GAAiC,IAAI;IAClD,gBAAgB,GAAoC,IAAI;AAEhE,IAAA,WAAA,CACkB,WAAwB,EACxB,cAA2B,EAC3B,eAAmC,EAClC,OAAuB,EACvB,YAAiC,EACjC,UAAuB,EACvB,MAA6B,EAAA;QAN9B,IAAA,CAAA,WAAW,GAAX,WAAW;QACX,IAAA,CAAA,cAAc,GAAd,cAAc;QACd,IAAA,CAAA,eAAe,GAAf,eAAe;QACd,IAAA,CAAA,OAAO,GAAP,OAAO;QACP,IAAA,CAAA,YAAY,GAAZ,YAAY;QACZ,IAAA,CAAA,UAAU,GAAV,UAAU;QACV,IAAA,CAAA,MAAM,GAAN,MAAM;IACtB;AAEH;;;AAGG;IACI,SAAS,GAAA;QACd,OAAO,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI;IAC7C;AAEA;;;AAGG;IACI,WAAW,GAAA;AAChB,QAAA,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,IAAI,CAAC;IAC/B;IAEO,WAAW,GAAA;QAChB,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,CAAC,IAAI,CAAC,gBAAgB;IACxD;AAEA;;;;AAIG;IACI,MAAM,CACX,SAAkB,EAClB,OAAsE,EAAA;QAEtE,MAAM,EAAE,QAAQ,EAAE,gBAAgB,EAAE,GAAG,OAAO,IAAI,EAAE;AACpD,QAAA,IAAI,GAAoB;QAExB,IAAI,gBAAgB,EAAE;AACpB,YAAA,GAAG,GAAG,gBAAgB,CAAC,eAAe,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,gBAAgB,CAAC,MAAM,EAAE,QAAQ,EAAE,CAAC;QACjG;aAAO;AACL,YAAA,GAAG,GAAG,eAAe,CAAC,SAAS,EAAE;gBAC/B,mBAAmB,EAAE,IAAI,CAAC,YAAY;AACtC,gBAAA,eAAe,EAAE,QAAQ;AAC1B,aAAA,CAAC;YACF,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC;QACvC;QAEC,GAAG,CAAC,QAAQ,CAAC,aAA6B,CAAC,KAAK,CAAC,aAAa,GAAG,MAAM;QACxE,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,aAA4B,CAAC;AAC1E,QAAA,IAAI,CAAC,aAAa,GAAG,GAA4B;AAEjD,QAAA,OAAO,GAAG;IACZ;;AAGO,IAAA,cAAc,CACnB,WAA2B,EAC3B,gBAAkC,EAClC,OAAU,EAAA;QAEV,MAAM,OAAO,GAAG,gBAAgB,CAAC,kBAAkB,CAAC,WAAW,EAAE,OAAO,CAAC;QACzE,OAAO,CAAC,aAAa,EAAE;AAEvB,QAAA,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,SAAmB,EAAE;AAC9C,YAAA,IAAI,IAAI,YAAY,WAAW,EAAE;AAC/B,gBAAA,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,MAAM;YACnC;AACA,YAAA,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,IAAI,CAAC;QACvC;AAEA,QAAA,IAAI,CAAC,gBAAgB,GAAG,OAAmC;AAE3D,QAAA,OAAO,OAAO;IAChB;AAEO,IAAA,UAAU,CAAC,IAAwB,EAAA;AACxC,QAAA,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC;AACvD,QAAA,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC;AAC7D,QAAA,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC;AAC7D,QAAA,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC;AACzD,QAAA,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC;AAC/D,QAAA,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC;IACjE;IAEO,aAAa,GAAA;AAClB,QAAA,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE;YACzB,OAAO,IAAI,UAAU,EAAc;QACrC;QACA,OAAO,SAAS,CAAa,IAAI,CAAC,eAAe,EAAE,OAAO,CAAC;IAC7D;IAEO,oBAAoB,GAAA;QACzB,OAAO,SAAS,CAAe,IAAI,CAAC,WAAW,CAAC,aAAa,EAAE,aAAa,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CACnG,MAAM,CAAC,KAAK,IAAG;AACb,YAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAc;YACnC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC;QACrG,CAAC,CAAC,CACH;IACH;IAEO,OAAO,GAAA;AACZ,QAAA,IAAI,CAAC,aAAa,EAAE,OAAO,EAAE;AAC7B,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI;QAEzB,IAAI,IAAI,CAAC,gBAAgB,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE;AAC7D,YAAA,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE;QACjC;AACA,QAAA,IAAI,CAAC,gBAAgB,GAAG,IAAI;AAE5B,QAAA,IAAI;AACD,YAAA,IAAI,CAAC,WAA0D,CAAC,WAAW,IAAI;QAClF;AAAE,QAAA,MAAM;;QAER;AAEA,QAAA,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,IAAI,CAAC;AAC7B,QAAA,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE;AACzB,QAAA,IAAI,CAAC,UAAU,IAAI;IACrB;AACD;;ACnJD;;;;;;;;;;;;;;;;AAgBG;MAIU,kBAAkB,CAAA;AACZ,IAAA,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC;IACrC,UAAU,GAAG,CAAC;IACd,eAAe,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE;IACrC,iBAAiB,GAAG,EAAE;IAEvB,IAAI,GAAA;AACT,QAAA,IAAI,IAAI,CAAC,UAAU,KAAK,CAAC,EAAE;YACzB,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS;AAChD,YAAA,IAAI,CAAC,eAAe,GAAG,EAAE,GAAG,EAAE,MAAM,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,OAAO,EAAE;YACpE,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY;YAEhD,MAAM,eAAe,GAAG,eAAe,CAAC,qBAAqB,EAAE,CAAC,KAAK;AACrE,YAAA,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,UAAU,GAAG,eAAe,CAAC;AAEvE,YAAA,eAAe,CAAC,SAAS,CAAC,GAAG,CAAC,6BAA6B,CAAC;AAC5D,YAAA,IAAI,cAAc,GAAG,mCAAmC,EAAE;AACxD,gBAAA,MAAM,mBAAmB,GAAG,MAAM,CAAC,UAAU,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC;gBACvF,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,GAAG,mBAAmB,GAAG,cAAc,CAAA,EAAA,CAAI;gBACrE,eAAe,CAAC,KAAK,CAAC,WAAW,CAAC,gCAAgC,EAAE,CAAA,EAAG,cAAc,CAAA,EAAA,CAAI,CAAC;YAC5F;iBAAO;gBACL,eAAe,CAAC,KAAK,CAAC,WAAW,CAAC,gCAAgC,EAAE,KAAK,CAAC;YAC5E;QACF;QAEA,IAAI,CAAC,UAAU,EAAE;IACnB;IAEO,MAAM,GAAA;AACX,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;AAClD,QAAA,IAAI,IAAI,CAAC,UAAU,GAAG,CAAC,EAAE;YACvB;QACF;QAEA,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS;QAChD,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC,iBAAiB;AAChD,QAAA,eAAe,CAAC,KAAK,CAAC,cAAc,CAAC,gCAAgC,CAAC;AACtE,QAAA,eAAe,CAAC,SAAS,CAAC,MAAM,CAAC,6BAA6B,CAAC;AAC/D,QAAA,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC;IACtE;uGAvCW,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAlB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,kBAAkB,cAFjB,MAAM,EAAA,CAAA;;2FAEP,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAH9B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;ACZD;;;;;;;;AAQG;MAIU,eAAe,CAAA;AACT,IAAA,OAAO,GAAG,MAAM,CAAC,cAAc,CAAC;AAChC,IAAA,YAAY,GAAG,MAAM,CAAC,mBAAmB,CAAC;AAC1C,IAAA,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC;AAC5B,IAAA,WAAW,GAAG,MAAM,CAAC,kBAAkB,CAAC;AACxC,IAAA,MAAM,GAAG,MAAM,CAAC,oBAAoB,CAAC;IAC9C,UAAU,GAAuB,IAAI;IAEtC,cAAc,CAAC,SAAiC,EAAE,EAAA;AACvD,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE;QAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,KAAK,CAAC;AAChD,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,oBAAoB,CAAC;AACxC,QAAA,IAAI,MAAM,CAAC,UAAU,EAAE;YACrB,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACrE;AACA,QAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;AAEtB,QAAA,MAAM,UAAU,GAAG,IAAI,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC;AACrF,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;AAEpB,QAAA,OAAO,UAAU;IACnB;AAEO,IAAA,YAAY,CAAC,MAA4B,EAAA;AAC9C,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,UAAU,EAAE,sBAAsB,CAAC;AACxE,QAAA,IAAI,MAAM,CAAC,UAAU,EAAE;AACrB,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,0BAA0B,CAAC;QAChD;QACA,IAAI,QAAQ,GAAuB,IAAI;AAEvC,QAAA,IAAI,MAAM,CAAC,WAAW,EAAE;YACtB,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,KAAK,CAAC;AAC9C,YAAA,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,wBAAwB,CAAC;AAChD,YAAA,IAAI,MAAM,CAAC,aAAa,EAAE;gBACxB,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC5E;AACA,YAAA,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC;QAC5B;AAEA,QAAA,IAAI,MAAM,CAAC,UAAU,EAAE;AACrB,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE;QACzB;QAEA,MAAM,UAAU,GAAG,IAAI,WAAW,CAChC,IAAI,EACJ,IAAI,EACJ,QAAQ,EACR,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,YAAY,EACjB,MAAK;AACH,YAAA,IAAI,MAAM,CAAC,UAAU,EAAE;AACrB,gBAAA,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE;YAC3B;AACF,QAAA,CAAC,EACD,IAAI,CAAC,MAAM,CACZ;;AAED,QAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC;AAEhC,QAAA,IAAI,MAAM,CAAC,IAAI,EAAE;AACf,YAAA,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC;QACpC;AAEA,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;AAEpB,QAAA,OAAO,UAAU;IACnB;IAEQ,WAAW,CAAC,UAAmB,EAAE,SAAkB,EAAA;QACzD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,KAAK,CAAC;AAChD,QAAA,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,QAAQ,CAAC;AACtC,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,oBAAoB,CAAC;QACxC,IAAI,SAAS,EAAE;AACb,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC;QAC/B;QACA,IAAI,UAAU,EAAE;AACd,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC9D;QACA,IAAI,CAAC,aAAa,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC;AAEtC,QAAA,OAAO,IAAI;IACb;AAEQ,IAAA,SAAS,CAAC,IAAiB,EAAA;AACjC,QAAA,IAAI;AACD,YAAA,IAAmD,CAAC,WAAW,IAAI;QACtE;AAAE,QAAA,MAAM;;QAER;IACF;IAEQ,aAAa,GAAA;AACnB,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;YACpB,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,KAAK,CAAC;AACrD,YAAA,SAAS,CAAC,SAAS,GAAG,yBAAyB;YAC/C,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC;AAC1C,YAAA,IAAI,CAAC,UAAU,GAAG,SAAS;QAC7B;QAEA,OAAO,IAAI,CAAC,UAAU;IACxB;uGApGW,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAf,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,eAAe,cAFd,MAAM,EAAA,CAAA;;2FAEP,eAAe,EAAA,UAAA,EAAA,CAAA;kBAH3B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;AC1BD;;AAEG;;"}
|
|
@@ -256,6 +256,7 @@ class ZPopoverComponent {
|
|
|
256
256
|
_delaySubject = new Subject();
|
|
257
257
|
_listenerCleanups = [];
|
|
258
258
|
_autoUpdateCleanup = null;
|
|
259
|
+
_outsideClickSubscription = null;
|
|
259
260
|
_scrollSubscription = null;
|
|
260
261
|
_viewportResizeSubscription = null;
|
|
261
262
|
_resizeObserver = null;
|
|
@@ -341,6 +342,8 @@ class ZPopoverComponent {
|
|
|
341
342
|
return overlayRef;
|
|
342
343
|
}
|
|
343
344
|
_disposeOverlay() {
|
|
345
|
+
this._outsideClickSubscription?.unsubscribe();
|
|
346
|
+
this._outsideClickSubscription = null;
|
|
344
347
|
this._autoUpdateCleanup?.();
|
|
345
348
|
this._autoUpdateCleanup = null;
|
|
346
349
|
this._scrollSubscription?.unsubscribe();
|
|
@@ -387,16 +390,20 @@ class ZPopoverComponent {
|
|
|
387
390
|
}
|
|
388
391
|
}
|
|
389
392
|
_setupOutsideClick() {
|
|
390
|
-
|
|
393
|
+
const overlayRef = this._overlayRef;
|
|
394
|
+
if (!overlayRef) {
|
|
391
395
|
return;
|
|
392
396
|
}
|
|
393
|
-
this.
|
|
397
|
+
this._outsideClickSubscription?.unsubscribe();
|
|
398
|
+
this._outsideClickSubscription = overlayRef
|
|
394
399
|
.outsidePointerEvents()
|
|
395
400
|
.pipe(filter(() => !this.zManualClose() || this.zOutsideClickClose()), takeUntilDestroyed(this._destroyRef))
|
|
396
401
|
.subscribe(event => {
|
|
397
402
|
const triggerEl = this._trigger().nativeElement;
|
|
398
403
|
const target = event.target;
|
|
399
|
-
if (!triggerEl.contains(target) &&
|
|
404
|
+
if (!triggerEl.contains(target) &&
|
|
405
|
+
!overlayRef.overlayElement.contains(target) &&
|
|
406
|
+
!this._isNestedPopoverTarget(target, overlayRef)) {
|
|
400
407
|
this.zOutsideClick.emit(event);
|
|
401
408
|
this.hide();
|
|
402
409
|
}
|
|
@@ -509,7 +516,10 @@ class ZPopoverComponent {
|
|
|
509
516
|
showArrow: this.zShowArrow(),
|
|
510
517
|
});
|
|
511
518
|
await this._zone.runOutsideAngular(() => this._applyPosition(overlayRef, componentRef));
|
|
512
|
-
if (this._overlayRef !== overlayRef ||
|
|
519
|
+
if (this._overlayRef !== overlayRef ||
|
|
520
|
+
this._componentRef !== componentRef ||
|
|
521
|
+
this._hideTimeout ||
|
|
522
|
+
this._destroyRef.destroyed) {
|
|
513
523
|
return; // đã bị dispose (hide/destroy) trong lúc chờ computePosition
|
|
514
524
|
}
|
|
515
525
|
this._autoUpdateCleanup = this._zone.runOutsideAngular(() => startZOverlayAutoUpdate(this._trigger().nativeElement, overlayRef.overlayElement, () => void this._applyPosition(overlayRef, componentRef), { ancestorScroll: false }));
|
|
@@ -522,11 +532,7 @@ class ZPopoverComponent {
|
|
|
522
532
|
ZPopoverComponent._openPopovers.add(this);
|
|
523
533
|
this.zShow.emit();
|
|
524
534
|
}
|
|
525
|
-
_isNestedPopoverTarget(target) {
|
|
526
|
-
const overlayElement = this._overlayRef?.overlayElement;
|
|
527
|
-
if (!overlayElement) {
|
|
528
|
-
return false;
|
|
529
|
-
}
|
|
535
|
+
_isNestedPopoverTarget(target, overlayRef) {
|
|
530
536
|
for (const popover of ZPopoverComponent._openPopovers) {
|
|
531
537
|
if (popover === this) {
|
|
532
538
|
continue;
|
|
@@ -535,7 +541,7 @@ class ZPopoverComponent {
|
|
|
535
541
|
if (!nestedOverlayElement?.contains(target)) {
|
|
536
542
|
continue;
|
|
537
543
|
}
|
|
538
|
-
if (overlayElement.contains(popover._trigger().nativeElement)) {
|
|
544
|
+
if (overlayRef.overlayElement.contains(popover._trigger().nativeElement)) {
|
|
539
545
|
return true;
|
|
540
546
|
}
|
|
541
547
|
}
|
|
@@ -786,6 +792,7 @@ class ZPopoverDirective {
|
|
|
786
792
|
_delaySubject = new Subject();
|
|
787
793
|
_listenerCleanups = [];
|
|
788
794
|
_autoUpdateCleanup = null;
|
|
795
|
+
_outsideClickSubscription = null;
|
|
789
796
|
_scrollSubscription = null;
|
|
790
797
|
_viewportResizeSubscription = null;
|
|
791
798
|
_resizeObserver = null;
|
|
@@ -903,6 +910,8 @@ class ZPopoverDirective {
|
|
|
903
910
|
return triggerRef ?? this._elementRef.nativeElement;
|
|
904
911
|
}
|
|
905
912
|
_disposeOverlay() {
|
|
913
|
+
this._outsideClickSubscription?.unsubscribe();
|
|
914
|
+
this._outsideClickSubscription = null;
|
|
906
915
|
this._autoUpdateCleanup?.();
|
|
907
916
|
this._autoUpdateCleanup = null;
|
|
908
917
|
this._scrollSubscription?.unsubscribe();
|
|
@@ -959,10 +968,12 @@ class ZPopoverDirective {
|
|
|
959
968
|
}
|
|
960
969
|
}
|
|
961
970
|
_setupOutsideClick() {
|
|
962
|
-
|
|
971
|
+
const overlayRef = this._overlayRef;
|
|
972
|
+
if (!overlayRef) {
|
|
963
973
|
return;
|
|
964
974
|
}
|
|
965
|
-
this.
|
|
975
|
+
this._outsideClickSubscription?.unsubscribe();
|
|
976
|
+
this._outsideClickSubscription = overlayRef
|
|
966
977
|
.outsidePointerEvents()
|
|
967
978
|
.pipe(filter(() => !this.zManualClose() || this.zOutsideClickClose()), filter(() => this._trigger() === 'click' || this._trigger() === 'manual'), filter(event => {
|
|
968
979
|
const target = event.target;
|
|
@@ -971,11 +982,10 @@ class ZPopoverDirective {
|
|
|
971
982
|
return false;
|
|
972
983
|
}
|
|
973
984
|
// Check if click is inside overlay element (dropdown content)
|
|
974
|
-
|
|
975
|
-
if (overlayElement?.contains(target)) {
|
|
985
|
+
if (overlayRef.overlayElement.contains(target)) {
|
|
976
986
|
return false;
|
|
977
987
|
}
|
|
978
|
-
if (this._isNestedPopoverTarget(target)) {
|
|
988
|
+
if (this._isNestedPopoverTarget(target, overlayRef)) {
|
|
979
989
|
return false;
|
|
980
990
|
}
|
|
981
991
|
return true;
|
|
@@ -1070,13 +1080,15 @@ class ZPopoverDirective {
|
|
|
1070
1080
|
}
|
|
1071
1081
|
return;
|
|
1072
1082
|
}
|
|
1073
|
-
|
|
1074
|
-
|
|
1083
|
+
let overlayRef = this._overlayRef;
|
|
1084
|
+
if (!overlayRef) {
|
|
1085
|
+
overlayRef = this._createOverlay();
|
|
1086
|
+
this._overlayRef = overlayRef;
|
|
1075
1087
|
this._setupOutsideClick();
|
|
1076
1088
|
}
|
|
1077
1089
|
this._setupScrollClose();
|
|
1078
|
-
this._componentRef =
|
|
1079
|
-
|
|
1090
|
+
const componentRef = (this._componentRef = overlayRef.attach(ZPopoverContentComponent));
|
|
1091
|
+
componentRef.instance.setProps({
|
|
1080
1092
|
content,
|
|
1081
1093
|
position: this.zPosition(),
|
|
1082
1094
|
customClass: this.zClass(),
|
|
@@ -1084,7 +1096,10 @@ class ZPopoverDirective {
|
|
|
1084
1096
|
showArrow: this.zShowArrow(),
|
|
1085
1097
|
});
|
|
1086
1098
|
await this._applyPosition();
|
|
1087
|
-
if (
|
|
1099
|
+
if (this._overlayRef !== overlayRef ||
|
|
1100
|
+
this._componentRef !== componentRef ||
|
|
1101
|
+
this._hideTimeout ||
|
|
1102
|
+
this._isDestroyed()) {
|
|
1088
1103
|
return; // đã bị dispose (hide/destroy) trong lúc chờ computePosition
|
|
1089
1104
|
}
|
|
1090
1105
|
this._autoUpdateCleanup = startZOverlayAutoUpdate(this._getTriggerElement(), this._overlayRef.overlayElement, () => void this._applyPosition(), { ancestorScroll: false });
|
|
@@ -1099,11 +1114,7 @@ class ZPopoverDirective {
|
|
|
1099
1114
|
this._renderer.setAttribute(this._elementRef.nativeElement, 'aria-expanded', 'true');
|
|
1100
1115
|
this.zShow.emit();
|
|
1101
1116
|
}
|
|
1102
|
-
_isNestedPopoverTarget(target) {
|
|
1103
|
-
const overlayElement = this._overlayRef?.overlayElement;
|
|
1104
|
-
if (!overlayElement) {
|
|
1105
|
-
return false;
|
|
1106
|
-
}
|
|
1117
|
+
_isNestedPopoverTarget(target, overlayRef) {
|
|
1107
1118
|
for (const popover of ZPopoverDirective._openPopovers) {
|
|
1108
1119
|
if (popover === this) {
|
|
1109
1120
|
continue;
|
|
@@ -1112,7 +1123,7 @@ class ZPopoverDirective {
|
|
|
1112
1123
|
if (!nestedOverlayElement?.contains(target)) {
|
|
1113
1124
|
continue;
|
|
1114
1125
|
}
|
|
1115
|
-
if (overlayElement.contains(popover._getTriggerElement())) {
|
|
1126
|
+
if (overlayRef.overlayElement.contains(popover._getTriggerElement())) {
|
|
1116
1127
|
return true;
|
|
1117
1128
|
}
|
|
1118
1129
|
}
|