@shival99/z-ui 2.3.9 → 2.3.10

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.
@@ -91,17 +91,7 @@
91
91
  */
92
92
  html.z-scroll-locked {
93
93
  overflow: hidden;
94
+ scrollbar-gutter: auto;
94
95
  }
95
96
 
96
- /*
97
- * `overflow: hidden` làm scrollbar biến mất và nhả lại đúng chiều rộng của nó -> toàn bộ UI (kể cả
98
- * element `position: fixed`) nở ra rồi co lại khi đóng overlay. `scrollbar-gutter: stable` giữ nguyên
99
- * chỗ đó nên không có gì dịch chuyển. ZScrollLockService chỉ gắn class này khi trang vốn đã dành chỗ
100
- * cho scrollbar — trang không có scrollbar (hoặc scrollbar dạng overlay) mà giữ gutter thì lại co vào.
101
- * Trình duyệt không hỗ trợ `scrollbar-gutter`: service đo hiệu số thật rồi bù `padding-right` vào body
102
- * và ghi ra `--z-scroll-lock-gutter` (0px khi không nhả) để app tự bù cho element fixed của mình:
103
- * `.my-fixed-bar { padding-right: var(--z-scroll-lock-gutter, 0px); }`
104
- */
105
- html.z-scroll-locked.z-scroll-locked-gutter {
106
- scrollbar-gutter: stable;
107
- }
97
+ /* Body padding keeps document-flow content stable while fixed overlays use the full viewport. */
@@ -294,21 +294,16 @@ class ZOverlayRef {
294
294
  * Khoá scroll trang khi overlay toàn màn hình (modal/drawer) mở — thay cho
295
295
  * `scrollStrategies.block()` của CDK. Đếm tham chiếu để modal-trong-modal không mở khoá sớm.
296
296
  *
297
- * Chống layout shift theo hai bước:
298
- *
299
- * 1. Nếu trang vốn đã dành chỗ cho scrollbar (`html` hẹp hơn `window.innerWidth`), khoá kèm
300
- * `scrollbar-gutter: stable` để chỗ đó KHÔNG bị nhả ra. Cách này giữ đúng chiều rộng layout
301
- * cho cả nội dung trong flow lẫn element `position: fixed` (backdrop, drawer, toast...),
302
- * nên không cần bù padding và không có gì dịch chuyển.
303
- * 2. Nếu trình duyệt vẫn nhả chỗ đó (không hỗ trợ `scrollbar-gutter`), ĐO đúng hiệu số chiều
304
- * rộng của `<html>` trước/sau khi khoá rồi bù vào `padding-right` của body.
297
+ * 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.
298
+ * Không giữ `scrollbar-gutter: stable` trong lúc overlay mở: fixed backdrop/panel khi đó bị giới
299
+ * hạn theo layout viewport và hở một dải scrollbar ở mép phải trên Windows.
305
300
  *
306
301
  * Lưu ý: phải đo bằng `getBoundingClientRect()` của `<html>`, không dùng `documentElement.clientWidth`
307
302
  * — 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
308
303
  * 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.
309
304
  *
310
- * Hiệu số còn được ghi ra biến CSS `--z-scroll-lock-gutter` (0px khi không nhả) để app bù thêm cho
311
- * element `position: fixed` của riêng mình trong trường hợp 2.
305
+ * Hiệu số được ghi ra biến CSS `--z-scroll-lock-gutter` để app bù thêm cho element `position: fixed`
306
+ * của riêng mình nếu cần.
312
307
  *
313
308
  * 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á.
314
309
  */
@@ -323,16 +318,12 @@ class ZScrollLockService {
323
318
  this._scrollPosition = { top: window.scrollY, left: window.scrollX };
324
319
  this._bodyPaddingRight = body.style.paddingRight;
325
320
  const widthBeforeLock = documentElement.getBoundingClientRect().width;
326
- const hasReservedGutter = window.innerWidth - widthBeforeLock > Z_OVERLAY_SCROLL_LOCK_WIDTH_EPSILON;
321
+ const scrollbarWidth = Math.max(0, window.innerWidth - widthBeforeLock);
327
322
  documentElement.classList.add(Z_OVERLAY_SCROLL_LOCKED_CLASS);
328
- if (hasReservedGutter) {
329
- documentElement.classList.add(Z_OVERLAY_SCROLL_LOCK_GUTTER_CLASS);
330
- }
331
- const releasedWidth = Math.max(0, documentElement.getBoundingClientRect().width - widthBeforeLock);
332
- if (releasedWidth > Z_OVERLAY_SCROLL_LOCK_WIDTH_EPSILON) {
323
+ if (scrollbarWidth > Z_OVERLAY_SCROLL_LOCK_WIDTH_EPSILON) {
333
324
  const currentPaddingRight = Number.parseFloat(getComputedStyle(body).paddingRight) || 0;
334
- body.style.paddingRight = `${currentPaddingRight + releasedWidth}px`;
335
- documentElement.style.setProperty(Z_OVERLAY_SCROLL_LOCK_GUTTER_VAR, `${releasedWidth}px`);
325
+ body.style.paddingRight = `${currentPaddingRight + scrollbarWidth}px`;
326
+ documentElement.style.setProperty(Z_OVERLAY_SCROLL_LOCK_GUTTER_VAR, `${scrollbarWidth}px`);
336
327
  }
337
328
  else {
338
329
  documentElement.style.setProperty(Z_OVERLAY_SCROLL_LOCK_GUTTER_VAR, '0px');
@@ -348,7 +339,7 @@ class ZScrollLockService {
348
339
  const { documentElement, body } = this._document;
349
340
  body.style.paddingRight = this._bodyPaddingRight;
350
341
  documentElement.style.removeProperty(Z_OVERLAY_SCROLL_LOCK_GUTTER_VAR);
351
- documentElement.classList.remove(Z_OVERLAY_SCROLL_LOCKED_CLASS, Z_OVERLAY_SCROLL_LOCK_GUTTER_CLASS);
342
+ documentElement.classList.remove(Z_OVERLAY_SCROLL_LOCKED_CLASS);
352
343
  window.scrollTo(this._scrollPosition.left, this._scrollPosition.top);
353
344
  }
354
345
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.2", ngImport: i0, type: ZScrollLockService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
@@ -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_CLASS,\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 theo hai bước:\n *\n * 1. Nếu trang vốn đã dành chỗ cho scrollbar (`html` hẹp hơn `window.innerWidth`), khoá kèm\n * `scrollbar-gutter: stable` để chỗ đó KHÔNG bị nhả ra. Cách này giữ đúng chiều rộng layout\n * cho cả nội dung trong flow lẫn element `position: fixed` (backdrop, drawer, toast...),\n * nên không cần bù padding và không có gì dịch chuyển.\n * 2. Nếu trình duyệt vẫn nhả chỗ đó (không hỗ trợ `scrollbar-gutter`), ĐO đúng hiệu số chiều\n * rộng của `<html>` trước/sau khi khoá rồi bù vào `padding-right` của body.\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òn được ghi ra biến CSS `--z-scroll-lock-gutter` (0px khi không nhả) để app bù thêm cho\n * element `position: fixed` của riêng mình trong trường hợp 2.\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 hasReservedGutter = window.innerWidth - widthBeforeLock > Z_OVERLAY_SCROLL_LOCK_WIDTH_EPSILON;\n\n documentElement.classList.add(Z_OVERLAY_SCROLL_LOCKED_CLASS);\n if (hasReservedGutter) {\n documentElement.classList.add(Z_OVERLAY_SCROLL_LOCK_GUTTER_CLASS);\n }\n\n const releasedWidth = Math.max(0, documentElement.getBoundingClientRect().width - widthBeforeLock);\n if (releasedWidth > Z_OVERLAY_SCROLL_LOCK_WIDTH_EPSILON) {\n const currentPaddingRight = Number.parseFloat(getComputedStyle(body).paddingRight) || 0;\n body.style.paddingRight = `${currentPaddingRight + releasedWidth}px`;\n documentElement.style.setProperty(Z_OVERLAY_SCROLL_LOCK_GUTTER_VAR, `${releasedWidth}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, Z_OVERLAY_SCROLL_LOCK_GUTTER_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":"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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';\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":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shival99/z-ui",
3
- "version": "2.3.9",
3
+ "version": "2.3.10",
4
4
  "description": "Z-UI: Modern Angular UI Component Library - A comprehensive, high-performance design system built with Angular 22, featuring 40+ customizable components with dark mode, accessibility, and enterprise-ready features.",
5
5
  "keywords": [
6
6
  "angular",
@@ -278,7 +278,7 @@ declare class ZAutocompleteComponent<T = unknown> implements OnInit, ControlValu
278
278
 
279
279
  declare const zAutocompleteInputVariants: (props?: ({
280
280
  zSize?: "sm" | "default" | "lg" | null | undefined;
281
- zStatus?: "default" | "open" | "error" | "disabled" | "readonly" | null | undefined;
281
+ zStatus?: "default" | "error" | "disabled" | "readonly" | "open" | null | undefined;
282
282
  } & class_variance_authority_types.ClassProp) | undefined) => string;
283
283
  type ZAutocompleteInputVariants = VariantProps<typeof zAutocompleteInputVariants>;
284
284
  declare const zAutocompleteOptionVariants: (props?: ({
@@ -431,16 +431,16 @@ declare class ZCalendarComponent implements OnInit, ControlValueAccessor {
431
431
 
432
432
  declare const zCalendarVariants: (props?: ({
433
433
  zSize?: "sm" | "default" | "lg" | null | undefined;
434
- zStatus?: "default" | "disabled" | "open" | "error" | "readonly" | null | undefined;
434
+ zStatus?: "default" | "disabled" | "readonly" | "open" | "error" | null | undefined;
435
435
  } & class_variance_authority_types.ClassProp) | undefined) => string;
436
436
  declare const zCalendarDayVariants: (props?: ({
437
- state?: "default" | "today" | "selected" | "inRange" | "rangeStart" | "rangeEnd" | "rangeSingle" | "disabled" | "otherMonth" | "hovered" | null | undefined;
437
+ state?: "default" | "disabled" | "today" | "selected" | "inRange" | "rangeStart" | "rangeEnd" | "rangeSingle" | "otherMonth" | "hovered" | null | undefined;
438
438
  } & class_variance_authority_types.ClassProp) | undefined) => string;
439
439
  declare const zCalendarMonthVariants: (props?: ({
440
- state?: "default" | "selected" | "disabled" | "current" | null | undefined;
440
+ state?: "default" | "current" | "disabled" | "selected" | null | undefined;
441
441
  } & class_variance_authority_types.ClassProp) | undefined) => string;
442
442
  declare const zCalendarYearVariants: (props?: ({
443
- state?: "default" | "selected" | "disabled" | "current" | null | undefined;
443
+ state?: "default" | "current" | "disabled" | "selected" | null | undefined;
444
444
  } & class_variance_authority_types.ClassProp) | undefined) => string;
445
445
 
446
446
  export { ZCalendarComponent, zCalendarDayVariants, zCalendarMonthVariants, zCalendarVariants, zCalendarYearVariants };
@@ -328,7 +328,7 @@ declare const Z_EDITOR_DEFAULT_TOOLBAR: readonly ZEditorToolbarItem[];
328
328
 
329
329
  declare const zEditorVariants: (props?: ({
330
330
  zSize?: "sm" | "default" | "lg" | null | undefined;
331
- zStatus?: "default" | "error" | "disabled" | "readonly" | null | undefined;
331
+ zStatus?: "default" | "disabled" | "readonly" | "error" | null | undefined;
332
332
  zPlaceholderMode?: "firstLine" | "everyLine" | null | undefined;
333
333
  } & class_variance_authority_types.ClassProp) | undefined) => string;
334
334
  type ZEditorVariants = VariantProps<typeof zEditorVariants>;
@@ -187,7 +187,7 @@ declare class ZGalleryComponent implements AfterViewInit {
187
187
  protected readonly headerControlHeight: _angular_core.Signal<"1.75rem" | "2rem" | "2.5rem" | "2.25rem">;
188
188
  protected readonly skeletonMediaHeight: _angular_core.Signal<"9rem" | "14rem" | "11rem">;
189
189
  protected readonly toggleIconSize: _angular_core.Signal<"14" | "16" | "20" | "18">;
190
- protected readonly searchInputSize: _angular_core.Signal<"sm" | "default" | "lg">;
190
+ protected readonly searchInputSize: _angular_core.Signal<"default" | "sm" | "lg">;
191
191
  protected readonly filteredFiles: _angular_core.Signal<ZGalleryFile[]>;
192
192
  protected readonly selectedIds: _angular_core.Signal<Set<string>>;
193
193
  protected readonly isAllSelected: _angular_core.Signal<boolean>;
@@ -383,16 +383,16 @@ declare const isPreviewable: (file: ZGalleryFile) => boolean;
383
383
  declare const isImage: (file: ZGalleryFile) => boolean;
384
384
 
385
385
  declare const zGalleryVariants: (props?: ({
386
- zSize?: "sm" | "default" | "lg" | null | undefined;
386
+ zSize?: "default" | "sm" | "lg" | null | undefined;
387
387
  } & class_variance_authority_types.ClassProp) | undefined) => string;
388
388
  type ZGalleryVariants = VariantProps<typeof zGalleryVariants>;
389
389
  declare const zGalleryItemVariants: (props?: ({
390
390
  zMode?: "grid" | "list" | null | undefined;
391
- zSize?: "sm" | "default" | "lg" | null | undefined;
391
+ zSize?: "default" | "sm" | "lg" | null | undefined;
392
392
  } & class_variance_authority_types.ClassProp) | undefined) => string;
393
393
  type ZGalleryItemVariants = VariantProps<typeof zGalleryItemVariants>;
394
394
  declare const zGalleryFileIconVariants: (props?: ({
395
- zSize?: "sm" | "default" | "lg" | null | undefined;
395
+ zSize?: "default" | "sm" | "lg" | null | undefined;
396
396
  zMode?: "grid" | "list" | null | undefined;
397
397
  } & class_variance_authority_types.ClassProp) | undefined) => string;
398
398
  type ZGalleryFileIconVariants = VariantProps<typeof zGalleryFileIconVariants>;
@@ -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,21 +172,16 @@ declare class ZOverlayService {
172
172
  * Khoá scroll trang khi overlay toàn màn hình (modal/drawer) mở — thay cho
173
173
  * `scrollStrategies.block()` của CDK. Đếm tham chiếu để modal-trong-modal không mở khoá sớm.
174
174
  *
175
- * Chống layout shift theo hai bước:
176
- *
177
- * 1. Nếu trang vốn đã dành chỗ cho scrollbar (`html` hẹp hơn `window.innerWidth`), khoá kèm
178
- * `scrollbar-gutter: stable` để chỗ đó KHÔNG bị nhả ra. Cách này giữ đúng chiều rộng layout
179
- * cho cả nội dung trong flow lẫn element `position: fixed` (backdrop, drawer, toast...),
180
- * nên không cần bù padding và không có gì dịch chuyển.
181
- * 2. Nếu trình duyệt vẫn nhả chỗ đó (không hỗ trợ `scrollbar-gutter`), ĐO đúng hiệu số chiều
182
- * rộng của `<html>` trước/sau khi khoá rồi bù vào `padding-right` của body.
175
+ * 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.
176
+ * Không giữ `scrollbar-gutter: stable` trong lúc overlay mở: fixed backdrop/panel khi đó bị giới
177
+ * hạn theo layout viewport và hở một dải scrollbar ở mép phải trên Windows.
183
178
  *
184
179
  * Lưu ý: phải đo bằng `getBoundingClientRect()` của `<html>`, không dùng `documentElement.clientWidth`
185
180
  * — 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
186
181
  * 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.
187
182
  *
188
- * Hiệu số còn được ghi ra biến CSS `--z-scroll-lock-gutter` (0px khi không nhả) để app bù thêm cho
189
- * element `position: fixed` của riêng mình trong trường hợp 2.
183
+ * Hiệu số được ghi ra biến CSS `--z-scroll-lock-gutter` để app bù thêm cho element `position: fixed`
184
+ * của riêng mình nếu cần.
190
185
  *
191
186
  * 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á.
192
187
  */
@@ -113,7 +113,7 @@ declare class ZPopoverDirective implements OnInit, OnDestroy {
113
113
  readonly zHideDelay: _angular_core.InputSignal<number>;
114
114
  readonly zDisabled: _angular_core.InputSignalWithTransform<boolean, string | boolean>;
115
115
  readonly zOffset: _angular_core.InputSignal<number>;
116
- readonly zPopoverWidth: _angular_core.InputSignal<number | "trigger" | "auto">;
116
+ readonly zPopoverWidth: _angular_core.InputSignal<number | "auto" | "trigger">;
117
117
  readonly zTriggerRef: _angular_core.InputSignal<HTMLElement | ElementRef<HTMLElement> | null>;
118
118
  readonly zManualClose: _angular_core.InputSignalWithTransform<boolean, string | boolean>;
119
119
  readonly zOutsideClickClose: _angular_core.InputSignalWithTransform<boolean, string | boolean>;
@@ -331,7 +331,7 @@ declare class ZTagClassesPipe implements PipeTransform {
331
331
 
332
332
  declare const zSelectVariants: (props?: ({
333
333
  zSize?: "sm" | "default" | "lg" | null | undefined;
334
- zStatus?: "default" | "open" | "error" | "disabled" | "readonly" | null | undefined;
334
+ zStatus?: "default" | "error" | "disabled" | "readonly" | "open" | null | undefined;
335
335
  } & class_variance_authority_types.ClassProp) | undefined) => string;
336
336
  declare const zSelectTagVariants: (props?: ({
337
337
  zSize?: "sm" | "default" | "lg" | null | undefined;
@@ -2167,7 +2167,7 @@ declare class ZTableFilterComponent<T> {
2167
2167
  protected readonly filterBadgeCount: _angular_core.Signal<number>;
2168
2168
  protected readonly hasFilterValue: _angular_core.Signal<boolean>;
2169
2169
  protected readonly isActive: _angular_core.Signal<boolean>;
2170
- protected readonly draftSortValue: _angular_core.Signal<"none" | "asc" | "desc">;
2170
+ protected readonly draftSortValue: _angular_core.Signal<"asc" | "desc" | "none">;
2171
2171
  protected readonly rangeMinValue: _angular_core.Signal<any>;
2172
2172
  protected readonly rangeMaxValue: _angular_core.Signal<any>;
2173
2173
  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