@shival99/z-ui 2.5.4 → 2.5.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.
@@ -23,16 +23,14 @@
23
23
  /*
24
24
  * Global panels own their scrolling; the overlay host must not create a second viewport.
25
25
  *
26
- * `contain: paint` biến host thành containing block cho con `position: fixed` (backdrop, modal,
27
- * drawer). Cần thiết vì lúc khoá scroll gutter của scrollbar được GIỮ NGUYÊN (xem
28
- * z-scroll-lock.service.ts) nên layout viewport hẹp hơn 100vw đúng bằng chiều rộng scrollbar —
29
- * nếu không có dòng này, `inset: 0` / `right-0` sẽ dừng ở mép layout viewport và hở một dải trống
30
- * ở mép phải. Host vốn đã `overflow: hidden` nên phần clip mà containment thêm vào là no-op.
26
+ * KHÔNG dùng `contain: paint` ở đây để ép panel `fixed` bám mép vật lý màn hình. Lúc khoá scroll,
27
+ * `scrollbar-gutter: stable` giữ lại dải gutter và scrollport của viewport hẹp đi đúng bằng đó —
28
+ * trình duyệt clip mọi thứ vẽ trong dải ấy. Panel tràn sang đó không được vẽ, mà thanh cuộn riêng
29
+ * của drawer nằm sát mép phải nên bị cắt gần hết. Panel phải ở trong layout viewport.
31
30
  */
32
31
  .z-overlay-host.z-overlay-global {
33
32
  overflow: hidden;
34
33
  overscroll-behavior: contain;
35
- contain: paint;
36
34
  }
37
35
 
38
36
  /* Free-form dynamic overlays opt into viewport scrolling explicitly. */
@@ -97,26 +95,22 @@
97
95
  /*
98
96
  * Khoá scroll trang. Phải nằm NGOÀI `@layer base` để thắng rule `html { ... }` mà app khai báo
99
97
  * không-layer (rule trong layer luôn thua rule không-layer, bất kể specificity).
98
+ *
99
+ * `scrollbar-gutter: auto` nhả dải gutter mà `base.css` giữ sẵn, để overlay `fixed` bám được mép vật
100
+ * lý màn hình — nếu còn giữ gutter thì scrollport hẹp lại, trình duyệt clip mọi thứ vẽ ngoài nó, và
101
+ * thanh cuộn riêng của drawer bị đẩy thụt vào đúng bằng dải đó.
102
+ *
103
+ * Đổi lại chiều rộng layout tăng lên: `ZScrollLockService` bù `padding-right` vào body nên nội dung
104
+ * trong luồng (và cả `position: sticky`) đứng yên, riêng element `position: fixed` của app sẽ nhảy —
105
+ * dùng `--z-scroll-lock-gutter` để tự bù. Đây là cùng đánh đổi mà Reka UI / Nuxt UI / Radix đang chịu.
100
106
  */
101
107
  html.z-scroll-locked {
102
108
  overflow: hidden;
109
+ scrollbar-gutter: auto;
103
110
  }
104
111
 
105
112
  /*
106
- * Trang vốn đang dành chỗ cho scrollbar (scrollbar cổ điển hoặc `scrollbar-gutter: stable`) → giữ
107
- * nguyên đúng chỗ đó trong lúc khoá. Chiều rộng layout không đổi một pixel nào: không layout shift,
108
- * không nháy scrollbar khi mở/đóng overlay, và không phải bù `padding-right` cho body.
109
- *
110
- * Class chỉ được gắn khi đo được gutter thật, nên trang không có scrollbar (overlay scrollbar của
111
- * macOS, trang ngắn hơn viewport) không bị ép sinh ra một dải trống mới.
112
- */
113
- html.z-scroll-locked.z-scroll-locked-gutter {
114
- scrollbar-gutter: stable;
115
- }
116
-
117
- /*
118
- * Fallback cho trình duyệt không giữ được gutter (Safari < 18.4 chưa có `scrollbar-gutter`):
119
- * ZScrollLockService đo lại chiều rộng sau khi khoá, phần bị nhả ra được bù thẳng vào
113
+ * ZScrollLockService đo lại chiều rộng sau khi khoá; phần thật sự bị nhả ra được bù vào
120
114
  * `body.style.paddingRight` và ghi ra `--z-scroll-lock-gutter` để app bù tiếp cho element
121
- * `position: fixed` của riêng mình. Ở nhánh giữ được gutter, biến này luôn là `0px`.
115
+ * `position: fixed` của riêng mình.
122
116
  */
@@ -290,14 +290,14 @@ class ZOverlayRef {
290
290
  * Khoá scroll trang khi modal/drawer mở — thay `scrollStrategies.block()` của CDK, đếm tham chiếu
291
291
  * để modal-trong-modal không mở khoá sớm.
292
292
  *
293
- * Chống layout shift bằng cách GIỮ NGUYÊN gutter của scrollbar thay vì bù trừ sau khi mất nó:
294
- * đo gutter thật của `<html>`, nếu trang đang dành chỗ cho scrollbar thì gắn `.z-scroll-locked-gutter`
295
- * để CSS ép `scrollbar-gutter: stable`. Chiều rộng layout không đổi nên không có gì nhảy và scrollbar
296
- * không bị nhả ra rồi trả lại. Đổi lại layout viewport hẹp hơn 100vw, overlay `fixed` vẫn phủ kín nhờ
297
- * `.z-overlay-global { contain: paint }` trong `overlay.css`.
293
+ * Khoá bằng `overflow: hidden` + nhả dải gutter (`scrollbar-gutter: auto` trong `overlay.css`), để
294
+ * overlay `fixed` bám được mép vật lý màn hình. Giữ gutter thì scrollport hẹp lại và thanh cuộn riêng
295
+ * của drawer bị thụt vào đúng bằng dải đó — đổi lại chiều rộng layout không đổi. Đã cân nhắc và chọn
296
+ * mép thật; Reka UI / Nuxt UI / Radix cũng chọn như vậy.
298
297
  *
299
- * Safari < 18.4 chưa có `scrollbar-gutter` nên vẫn nhả gutter — phải đo lại sau khi khoá, phần thật sự
300
- * mất mới bù vào `body.paddingRight` và ghi ra `--z-scroll-lock-gutter` cho app bù tiếp element `fixed`.
298
+ * Chiều rộng nhả ra được ĐO LẠI sau khi khoá (không đoán trước), rồi bù vào `body.paddingRight` nên
299
+ * nội dung trong luồng và `position: sticky` đứng yên. Element `position: fixed` của app thì vẫn nhảy
300
+ * — đọc `--z-scroll-lock-gutter` để tự bù.
301
301
  *
302
302
  * Phải đo bằng `getBoundingClientRect()`, không dùng `documentElement.clientWidth`: với root element
303
303
  * thuộc tính đó trả về kích thước viewport nên luôn cộng thêm chiều rộng scrollbar khi `overflow: hidden`.
@@ -313,12 +313,8 @@ class ZScrollLockService {
313
313
  this._scrollPosition = { top: window.scrollY, left: window.scrollX };
314
314
  this._bodyPaddingRight = body.style.paddingRight;
315
315
  const widthBeforeLock = documentElement.getBoundingClientRect().width;
316
- const reservedWidth = Math.max(0, window.innerWidth - widthBeforeLock);
317
- // 0.5 là sai số subpixel cho phép của getBoundingClientRect().
318
- if (reservedWidth > 0.5) {
319
- documentElement.classList.add('z-scroll-locked-gutter');
320
- }
321
316
  documentElement.classList.add('z-scroll-locked');
317
+ // 0.5 là sai số subpixel cho phép của getBoundingClientRect().
322
318
  const releasedWidth = Math.max(0, documentElement.getBoundingClientRect().width - widthBeforeLock);
323
319
  if (releasedWidth > 0.5) {
324
320
  const currentPaddingRight = Number.parseFloat(getComputedStyle(body).paddingRight) || 0;
@@ -341,7 +337,7 @@ class ZScrollLockService {
341
337
  body.style.paddingRight = this._bodyPaddingRight;
342
338
  }
343
339
  documentElement.style.removeProperty('--z-scroll-lock-gutter');
344
- documentElement.classList.remove('z-scroll-locked', 'z-scroll-locked-gutter');
340
+ documentElement.classList.remove('z-scroll-locked');
345
341
  // Chỉ khôi phục khi vị trí thật sự lệch, tránh ép scroll vô cớ mỗi lần đóng overlay.
346
342
  const { top, left } = this._scrollPosition;
347
343
  if (window.scrollY !== top || window.scrollX !== left) {
@@ -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';\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';\n\n/**\n * Khoá scroll trang khi modal/drawer mở — thay `scrollStrategies.block()` của CDK, đếm tham chiếu\n * để modal-trong-modal không mở khoá sớm.\n *\n * Chống layout shift bằng cách GIỮ NGUYÊN gutter của scrollbar thay vì bù trừ sau khi mất nó:\n * đo gutter thật của `<html>`, nếu trang đang dành chỗ cho scrollbar thì gắn `.z-scroll-locked-gutter`\n * để CSS ép `scrollbar-gutter: stable`. Chiều rộng layout không đổi nên không có gì nhảy và scrollbar\n * không bị nhả ra rồi trả lại. Đổi lại layout viewport hẹp hơn 100vw, overlay `fixed` vẫn phủ kín nhờ\n * `.z-overlay-global { contain: paint }` trong `overlay.css`.\n *\n * Safari < 18.4 chưa có `scrollbar-gutter` nên vẫn nhả gutter — phải đo lại sau khi khoá, phần thật sự\n * mất mới bù vào `body.paddingRight` và ghi ra `--z-scroll-lock-gutter` cho app bù tiếp element `fixed`.\n *\n * Phải đo bằng `getBoundingClientRect()`, không dùng `documentElement.clientWidth`: với root element\n * thuộc tính đó trả về kích thước viewport nên luôn cộng thêm chiều rộng scrollbar khi `overflow: hidden`.\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 reservedWidth = Math.max(0, window.innerWidth - widthBeforeLock);\n\n // 0.5 là sai số subpixel cho phép của getBoundingClientRect().\n if (reservedWidth > 0.5) {\n documentElement.classList.add('z-scroll-locked-gutter');\n }\n documentElement.classList.add('z-scroll-locked');\n\n const releasedWidth = Math.max(0, documentElement.getBoundingClientRect().width - widthBeforeLock);\n if (releasedWidth > 0.5) {\n const currentPaddingRight = Number.parseFloat(getComputedStyle(body).paddingRight) || 0;\n body.style.paddingRight = `${currentPaddingRight + releasedWidth}px`;\n documentElement.style.setProperty('--z-scroll-lock-gutter', `${releasedWidth}px`);\n } else {\n documentElement.style.setProperty('--z-scroll-lock-gutter', '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 if (body.style.paddingRight !== this._bodyPaddingRight) {\n body.style.paddingRight = this._bodyPaddingRight;\n }\n documentElement.style.removeProperty('--z-scroll-lock-gutter');\n documentElement.classList.remove('z-scroll-locked', 'z-scroll-locked-gutter');\n\n // Chỉ khôi phục khi vị trí thật sự lệch, tránh ép scroll vô cớ mỗi lần đóng overlay.\n const { top, left } = this._scrollPosition;\n if (window.scrollY !== top || window.scrollX !== left) {\n window.scrollTo(left, top);\n }\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":"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"}
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';\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';\n\n/**\n * Khoá scroll trang khi modal/drawer mở — thay `scrollStrategies.block()` của CDK, đếm tham chiếu\n * để modal-trong-modal không mở khoá sớm.\n *\n * Khoá bằng `overflow: hidden` + nhả dải gutter (`scrollbar-gutter: auto` trong `overlay.css`), để\n * overlay `fixed` bám được mép vật lý màn hình. Giữ gutter thì scrollport hẹp lại và thanh cuộn riêng\n * của drawer bị thụt vào đúng bằng dải đó — đổi lại chiều rộng layout không đổi. Đã cân nhắc và chọn\n * mép thật; Reka UI / Nuxt UI / Radix cũng chọn như vậy.\n *\n * Chiều rộng nhả ra được ĐO LẠI sau khi khoá (không đoán trước), rồi bù vào `body.paddingRight` nên\n * nội dung trong luồng và `position: sticky` đứng yên. Element `position: fixed` của app thì vẫn nhảy\n * — đọc `--z-scroll-lock-gutter` để tự bù.\n *\n * Phải đo bằng `getBoundingClientRect()`, không dùng `documentElement.clientWidth`: với root element\n * thuộc tính đó trả về kích thước viewport nên luôn cộng thêm chiều rộng scrollbar khi `overflow: hidden`.\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 documentElement.classList.add('z-scroll-locked');\n\n // 0.5 là sai số subpixel cho phép của getBoundingClientRect().\n const releasedWidth = Math.max(0, documentElement.getBoundingClientRect().width - widthBeforeLock);\n if (releasedWidth > 0.5) {\n const currentPaddingRight = Number.parseFloat(getComputedStyle(body).paddingRight) || 0;\n body.style.paddingRight = `${currentPaddingRight + releasedWidth}px`;\n documentElement.style.setProperty('--z-scroll-lock-gutter', `${releasedWidth}px`);\n } else {\n documentElement.style.setProperty('--z-scroll-lock-gutter', '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 if (body.style.paddingRight !== this._bodyPaddingRight) {\n body.style.paddingRight = this._bodyPaddingRight;\n }\n documentElement.style.removeProperty('--z-scroll-lock-gutter');\n documentElement.classList.remove('z-scroll-locked');\n\n // Chỉ khôi phục khi vị trí thật sự lệch, tránh ép scroll vô cớ mỗi lần đóng overlay.\n const { top, left } = this._scrollPosition;\n if (window.scrollY !== top || window.scrollX !== left) {\n window.scrollTo(left, top);\n }\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;AAEpE;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;;;AC9CjC,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;;ACxJD;;;;;;;;;;;;;;;AAeG;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,eAAe,CAAC,SAAS,CAAC,GAAG,CAAC,iBAAiB,CAAC;;AAGhD,YAAA,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,eAAe,CAAC,qBAAqB,EAAE,CAAC,KAAK,GAAG,eAAe,CAAC;AAClG,YAAA,IAAI,aAAa,GAAG,GAAG,EAAE;AACvB,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,aAAa,CAAA,EAAA,CAAI;gBACpE,eAAe,CAAC,KAAK,CAAC,WAAW,CAAC,wBAAwB,EAAE,CAAA,EAAG,aAAa,CAAA,EAAA,CAAI,CAAC;YACnF;iBAAO;gBACL,eAAe,CAAC,KAAK,CAAC,WAAW,CAAC,wBAAwB,EAAE,KAAK,CAAC;YACpE;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,IAAI,CAAC,KAAK,CAAC,YAAY,KAAK,IAAI,CAAC,iBAAiB,EAAE;YACtD,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC,iBAAiB;QAClD;AACA,QAAA,eAAe,CAAC,KAAK,CAAC,cAAc,CAAC,wBAAwB,CAAC;AAC9D,QAAA,eAAe,CAAC,SAAS,CAAC,MAAM,CAAC,iBAAiB,CAAC;;QAGnD,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,eAAe;AAC1C,QAAA,IAAI,MAAM,CAAC,OAAO,KAAK,GAAG,IAAI,MAAM,CAAC,OAAO,KAAK,IAAI,EAAE;AACrD,YAAA,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC;QAC5B;IACF;uGA/CW,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;;;ACND;;;;;;;;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;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shival99/z-ui",
3
- "version": "2.5.4",
3
+ "version": "2.5.6",
4
4
  "description": "Z-UI: Modern Angular UI Component Library - A comprehensive, high-performance design system built with Angular 22, featuring 45+ customizable components with dark mode, accessibility, and enterprise-ready features.",
5
5
  "keywords": [
6
6
  "angular",
@@ -252,7 +252,7 @@ declare class ZModalComponent<T, U> implements OnDestroy, AfterViewChecked {
252
252
  protected readonly effectiveOkText: _angular_core.Signal<string | null | undefined>;
253
253
  protected readonly effectiveCancelText: _angular_core.Signal<string | null | undefined>;
254
254
  protected readonly effectiveOkDestructive: _angular_core.Signal<boolean | undefined>;
255
- protected readonly effectiveTypeOk: _angular_core.Signal<"info" | "warning" | "error" | "link" | "default" | "primary" | "secondary" | "destructive" | "destructive-heartbeat" | "success" | "outline" | "outline-primary" | "outline-secondary" | "outline-success" | "outline-info" | "outline-warning" | "outline-error" | "outline-destructive" | "outline-shimmer" | "outline-success-secondary" | "outline-info-secondary" | "outline-warning-secondary" | "outline-error-secondary" | "outline-destructive-secondary" | "outline-primary-secondary" | "outline-primary-soft" | "outline-success-soft" | "outline-info-soft" | "outline-warning-soft" | "outline-error-soft" | "outline-destructive-soft" | "outline-primary-soft-border" | "outline-success-soft-border" | "outline-info-soft-border" | "outline-warning-soft-border" | "outline-error-soft-border" | "outline-destructive-soft-border" | "ghost" | "ghost-primary" | "ghost-success" | "ghost-info" | "ghost-warning" | "ghost-error" | "ghost-destructive" | "subtle" | "subtle-primary" | "subtle-success" | "subtle-info" | "subtle-warning" | "subtle-destructive" | "subtle-outline" | "subtle-primary-outline" | "subtle-success-outline" | "subtle-info-outline" | "subtle-warning-outline" | "subtle-destructive-outline" | null | undefined>;
255
+ protected readonly effectiveTypeOk: _angular_core.Signal<"info" | "warning" | "error" | "default" | "primary" | "secondary" | "destructive" | "destructive-heartbeat" | "success" | "outline" | "outline-primary" | "outline-secondary" | "outline-success" | "outline-info" | "outline-warning" | "outline-error" | "outline-destructive" | "outline-shimmer" | "outline-success-secondary" | "outline-info-secondary" | "outline-warning-secondary" | "outline-error-secondary" | "outline-destructive-secondary" | "outline-primary-secondary" | "outline-primary-soft" | "outline-success-soft" | "outline-info-soft" | "outline-warning-soft" | "outline-error-soft" | "outline-destructive-soft" | "outline-primary-soft-border" | "outline-success-soft-border" | "outline-info-soft-border" | "outline-warning-soft-border" | "outline-error-soft-border" | "outline-destructive-soft-border" | "ghost" | "ghost-primary" | "ghost-success" | "ghost-info" | "ghost-warning" | "ghost-error" | "ghost-destructive" | "subtle" | "subtle-primary" | "subtle-success" | "subtle-info" | "subtle-warning" | "subtle-destructive" | "subtle-outline" | "subtle-primary-outline" | "subtle-success-outline" | "subtle-info-outline" | "subtle-warning-outline" | "subtle-destructive-outline" | "link" | null | undefined>;
256
256
  protected readonly effectiveOkDisabled: _angular_core.Signal<boolean | undefined>;
257
257
  protected readonly effectiveLoading: _angular_core.Signal<boolean>;
258
258
  protected readonly effectiveContentLoading: _angular_core.Signal<boolean>;
@@ -172,14 +172,14 @@ declare class ZOverlayService {
172
172
  * Khoá scroll trang khi modal/drawer mở — thay `scrollStrategies.block()` của CDK, đếm tham chiếu
173
173
  * để modal-trong-modal không mở khoá sớm.
174
174
  *
175
- * Chống layout shift bằng cách GIỮ NGUYÊN gutter của scrollbar thay vì bù trừ sau khi mất nó:
176
- * đo gutter thật của `<html>`, nếu trang đang dành chỗ cho scrollbar thì gắn `.z-scroll-locked-gutter`
177
- * để CSS ép `scrollbar-gutter: stable`. Chiều rộng layout không đổi nên không có gì nhảy và scrollbar
178
- * không bị nhả ra rồi trả lại. Đổi lại layout viewport hẹp hơn 100vw, overlay `fixed` vẫn phủ kín nhờ
179
- * `.z-overlay-global { contain: paint }` trong `overlay.css`.
175
+ * Khoá bằng `overflow: hidden` + nhả dải gutter (`scrollbar-gutter: auto` trong `overlay.css`), để
176
+ * overlay `fixed` bám được mép vật lý màn hình. Giữ gutter thì scrollport hẹp lại và thanh cuộn riêng
177
+ * của drawer bị thụt vào đúng bằng dải đó — đổi lại chiều rộng layout không đổi. Đã cân nhắc và chọn
178
+ * mép thật; Reka UI / Nuxt UI / Radix cũng chọn như vậy.
180
179
  *
181
- * Safari < 18.4 chưa có `scrollbar-gutter` nên vẫn nhả gutter — phải đo lại sau khi khoá, phần thật sự
182
- * mất mới bù vào `body.paddingRight` và ghi ra `--z-scroll-lock-gutter` cho app bù tiếp element `fixed`.
180
+ * Chiều rộng nhả ra được ĐO LẠI sau khi khoá (không đoán trước), rồi bù vào `body.paddingRight` nên
181
+ * nội dung trong luồng và `position: sticky` đứng yên. Element `position: fixed` của app thì vẫn nhảy
182
+ * — đọc `--z-scroll-lock-gutter` để tự bù.
183
183
  *
184
184
  * Phải đo bằng `getBoundingClientRect()`, không dùng `documentElement.clientWidth`: với root element
185
185
  * thuộc tính đó trả về kích thước viewport nên luôn cộng thêm chiều rộng scrollbar khi `overflow: hidden`.
@@ -2168,7 +2168,7 @@ declare class ZTableFilterComponent<T> {
2168
2168
  protected readonly filterBadgeCount: _angular_core.Signal<number>;
2169
2169
  protected readonly hasFilterValue: _angular_core.Signal<boolean>;
2170
2170
  protected readonly isActive: _angular_core.Signal<boolean>;
2171
- protected readonly draftSortValue: _angular_core.Signal<"none" | "asc" | "desc">;
2171
+ protected readonly draftSortValue: _angular_core.Signal<"asc" | "desc" | "none">;
2172
2172
  protected readonly rangeMinValue: _angular_core.Signal<any>;
2173
2173
  protected readonly rangeMaxValue: _angular_core.Signal<any>;
2174
2174
  protected readonly dateValue: _angular_core.Signal<Date | null>;
@@ -57,7 +57,7 @@ declare class ZToastComponent {
57
57
  private readonly _themeService;
58
58
  private readonly _config;
59
59
  readonly class: _angular_core.InputSignal<ClassValue>;
60
- readonly zVariant: _angular_core.InputSignal<"default" | "success" | "error" | "warning" | "info" | null | undefined>;
60
+ readonly zVariant: _angular_core.InputSignal<"success" | "info" | "warning" | "error" | "default" | null | undefined>;
61
61
  readonly zTheme: _angular_core.InputSignal<ZToastTheme | undefined>;
62
62
  readonly zPosition: _angular_core.InputSignal<ZToastPosition | undefined>;
63
63
  readonly zRichColors: _angular_core.InputSignal<boolean | undefined>;
@@ -159,7 +159,7 @@ declare class ZToastService implements OnDestroy {
159
159
  }
160
160
 
161
161
  declare const zToastVariants: (props?: ({
162
- zVariant?: "default" | "success" | "error" | "warning" | "info" | null | undefined;
162
+ zVariant?: "success" | "info" | "warning" | "error" | "default" | null | undefined;
163
163
  } & class_variance_authority_types.ClassProp) | undefined) => string;
164
164
  type ZToastVariants = VariantProps<typeof zToastVariants>;
165
165