ngx-kit 5.0.0 → 6.0.1

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.
Files changed (68) hide show
  1. package/README.md +3 -2
  2. package/angle-selector/README.md +34 -0
  3. package/box-shadow/README.md +33 -0
  4. package/color-picker/README.md +52 -0
  5. package/data-table/README.md +120 -0
  6. package/date-picker/README.md +74 -0
  7. package/dialog/README.md +94 -169
  8. package/drawer-menu/README.md +76 -0
  9. package/dropzone/README.md +59 -0
  10. package/fesm2022/ngx-kit-angle-selector.mjs +2 -2
  11. package/fesm2022/ngx-kit-angle-selector.mjs.map +1 -1
  12. package/fesm2022/ngx-kit-box-shadow.mjs +28 -27
  13. package/fesm2022/ngx-kit-box-shadow.mjs.map +1 -1
  14. package/fesm2022/ngx-kit-color-picker.mjs +173 -43
  15. package/fesm2022/ngx-kit-color-picker.mjs.map +1 -1
  16. package/fesm2022/ngx-kit-data-table.mjs +9 -2
  17. package/fesm2022/ngx-kit-data-table.mjs.map +1 -1
  18. package/fesm2022/ngx-kit-date-picker.mjs +120 -86
  19. package/fesm2022/ngx-kit-date-picker.mjs.map +1 -1
  20. package/fesm2022/ngx-kit-dialog.mjs +38 -7
  21. package/fesm2022/ngx-kit-dialog.mjs.map +1 -1
  22. package/fesm2022/ngx-kit-drawer-menu.mjs +190 -0
  23. package/fesm2022/ngx-kit-drawer-menu.mjs.map +1 -0
  24. package/fesm2022/ngx-kit-dropzone.mjs +272 -0
  25. package/fesm2022/ngx-kit-dropzone.mjs.map +1 -0
  26. package/fesm2022/ngx-kit-form-field.mjs +87 -0
  27. package/fesm2022/ngx-kit-form-field.mjs.map +1 -0
  28. package/fesm2022/ngx-kit-gallery.mjs +419 -0
  29. package/fesm2022/ngx-kit-gallery.mjs.map +1 -0
  30. package/fesm2022/ngx-kit-gradient-picker.mjs +12 -4
  31. package/fesm2022/ngx-kit-gradient-picker.mjs.map +1 -1
  32. package/fesm2022/ngx-kit-image-editor.mjs +501 -0
  33. package/fesm2022/ngx-kit-image-editor.mjs.map +1 -0
  34. package/fesm2022/ngx-kit-menu.mjs +9 -4
  35. package/fesm2022/ngx-kit-menu.mjs.map +1 -1
  36. package/fesm2022/ngx-kit-message.mjs +50 -24
  37. package/fesm2022/ngx-kit-message.mjs.map +1 -1
  38. package/fesm2022/ngx-kit-notify.mjs +1 -4
  39. package/fesm2022/ngx-kit-notify.mjs.map +1 -1
  40. package/fesm2022/ngx-kit-shared.mjs +126 -83
  41. package/fesm2022/ngx-kit-shared.mjs.map +1 -1
  42. package/fesm2022/ngx-kit-time-picker.mjs +602 -0
  43. package/fesm2022/ngx-kit-time-picker.mjs.map +1 -0
  44. package/fesm2022/ngx-kit.mjs.map +1 -1
  45. package/gallery/README.md +71 -0
  46. package/gradient-picker/README.md +41 -0
  47. package/image-editor/README.md +44 -0
  48. package/menu/README.md +85 -0
  49. package/message/README.md +70 -0
  50. package/notify/README.md +56 -0
  51. package/package.json +25 -1
  52. package/shared/README.md +117 -0
  53. package/styles/all.css +27 -0
  54. package/styles/image-viewer.css +12 -0
  55. package/types/ngx-kit-box-shadow.d.ts +1 -2
  56. package/types/ngx-kit-data-table.d.ts +1 -0
  57. package/types/ngx-kit-date-picker.d.ts +1 -1
  58. package/types/ngx-kit-dialog.d.ts +1 -0
  59. package/types/ngx-kit-drawer-menu.d.ts +101 -0
  60. package/types/ngx-kit-dropzone.d.ts +84 -0
  61. package/types/ngx-kit-form-field.d.ts +31 -0
  62. package/types/ngx-kit-gallery.d.ts +168 -0
  63. package/types/ngx-kit-image-editor.d.ts +175 -0
  64. package/types/ngx-kit-menu.d.ts +1 -0
  65. package/types/ngx-kit-message.d.ts +13 -3
  66. package/types/ngx-kit-notify.d.ts +0 -1
  67. package/types/ngx-kit-shared.d.ts +44 -13
  68. package/types/ngx-kit-time-picker.d.ts +149 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ngx-kit-image-editor.mjs","sources":["../../../projects/libs/image-editor/directives/pointer-drag.directive.ts","../../../projects/libs/image-editor/utils/image-io.ts","../../../projects/libs/image-editor/utils/cartoonify.ts","../../../projects/libs/image-editor/utils/render-pipeline.ts","../../../projects/libs/image-editor/components/image-editor.component.ts","../../../projects/libs/image-editor/components/image-editor.component.html","../../../projects/libs/image-editor/ngx-kit-image-editor.ts"],"sourcesContent":["import { Directive, HostListener, output } from '@angular/core';\n\nexport interface NgxPointerDragDelta {\n dx: number;\n dy: number;\n}\n\n/**\n * درگ عمومی روی پایه‌ی Pointer Events + setPointerCapture (دقیقاً همون\n * تکنیکی که در ngx-kit/data-table برای ریسایز ستون استفاده شده) — نیازی به\n * listener سطح document نداره چون بعد از setPointerCapture، رویدادهای\n * pointermove/pointerup حتی بیرون از محدوده‌ی المنت هم به خودش می‌رسن.\n *\n * dx/dy تجمعی از لحظه‌ی pointerdown هستن (نه دلتای بین دو move متوالی)، چون\n * معمولاً مصرف‌کننده می‌خواد «موقعیت شروع + دلتای کل» رو حساب کنه، نه جمع\n * تدریجی گرد شونده‌ی دلتاهای ریز.\n */\n@Directive({\n selector: '[ngxPointerDrag]',\n standalone: true,\n})\nexport class NgxPointerDragDirective {\n dragStart = output<void>();\n dragMove = output<NgxPointerDragDelta>();\n dragEnd = output<void>();\n\n private dragging = false;\n private startX = 0;\n private startY = 0;\n\n @HostListener('pointerdown', ['$event'])\n onPointerDown(ev: PointerEvent): void {\n ev.preventDefault();\n ev.stopPropagation();\n this.dragging = true;\n this.startX = ev.clientX;\n this.startY = ev.clientY;\n (ev.target as HTMLElement).setPointerCapture(ev.pointerId);\n this.dragStart.emit();\n }\n\n @HostListener('pointermove', ['$event'])\n onPointerMove(ev: PointerEvent): void {\n if (!this.dragging) return;\n this.dragMove.emit({ dx: ev.clientX - this.startX, dy: ev.clientY - this.startY });\n }\n\n @HostListener('pointerup')\n @HostListener('pointercancel')\n onPointerUp(): void {\n if (!this.dragging) return;\n this.dragging = false;\n this.dragEnd.emit();\n }\n}\n","/** یه File/Blob/data-URL/URL رو به یک HTMLImageElement بارگذاری‌شده تبدیل می‌کنه */\nexport function loadImage(source: File | Blob | string): Promise<HTMLImageElement> {\n return new Promise((resolve, reject) => {\n const img = new Image();\n // برای URLهای cross-origin لازم می‌شه، وگرنه canvas بعداً «tainted» می‌شه\n // و toBlob/toDataURL با SecurityError شکست می‌خوره.\n img.crossOrigin = 'anonymous';\n\n const objectUrl = typeof source === 'string' ? null : URL.createObjectURL(source);\n const url = objectUrl ?? (source as string);\n\n img.onload = () => {\n if (objectUrl) URL.revokeObjectURL(objectUrl);\n resolve(img);\n };\n img.onerror = () => {\n if (objectUrl) URL.revokeObjectURL(objectUrl);\n reject(new Error('بارگذاری تصویر شکست خورد'));\n };\n img.src = url;\n });\n}\n\n/** canvas.toBlob به‌صورت Promise، به‌همراه fallback برای مرورگرهای قدیمی‌تر */\nexport function canvasToBlob(\n canvas: HTMLCanvasElement,\n type = 'image/jpeg',\n quality = 0.92,\n): Promise<Blob> {\n return new Promise((resolve, reject) => {\n canvas.toBlob(\n (blob) => {\n if (blob) resolve(blob);\n else reject(new Error('تبدیل canvas به blob شکست خورد'));\n },\n type,\n quality,\n );\n });\n}\n\n/**\n * یه کپیِ کوچیک‌شده از تصویر اصلی می‌سازه که کل UI ویرایشگر (چرخش، کراپ،\n * پیش‌نمایش فیلترها/کارتونی) روی همین کار می‌کنه، نه روی تصویر اصلی که\n * ممکنه چند مگاپیکسل باشه. این باعث می‌شه درگ‌کردنِ اسلایدرها یا لبه‌های\n * کراپ روون بمونه؛ خروجی نهایی (save) همیشه از روی تصویر اصلیِ کامل رندر\n * می‌شه، نه از روی این کپی.\n */\nexport function createWorkingCopy(img: HTMLImageElement, maxSize = 1200): HTMLCanvasElement {\n const { width, height } = fitWithin(img.naturalWidth, img.naturalHeight, maxSize, maxSize);\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext('2d')!;\n ctx.drawImage(img, 0, 0, width, height);\n return canvas;\n}\n\n/** ابعاد جدید رو طوری حساب می‌کنه که از maxWidth/maxHeight بیشتر نشه، با حفظ نسبت تصویر */\nexport function fitWithin(\n width: number,\n height: number,\n maxWidth?: number,\n maxHeight?: number,\n): { width: number; height: number } {\n if (!maxWidth && !maxHeight) return { width, height };\n let ratio = 1;\n if (maxWidth) ratio = Math.min(ratio, maxWidth / width);\n if (maxHeight) ratio = Math.min(ratio, maxHeight / height);\n if (ratio >= 1) return { width, height };\n return { width: Math.round(width * ratio), height: Math.round(height * ratio) };\n}\n","/**\n * افکت «کارتونی»: چون ctx.filter استاندارد چیزی شبیه cartoon نداره (فقط\n * brightness/contrast/saturate/grayscale/sepia/invert/blur/hue-rotate)، این\n * یکی رو واقعاً با پردازش پیکسلی پیاده کردیم؛ دو مرحله:\n *\n * ۱) Posterize: هر کانال رنگ به تعداد محدودی سطح گرد می‌شه (پهنه‌های رنگیِ\n * صاف و یکدست، حسِ کارتونی رنگ می‌ده).\n * ۲) لبه‌یابی Sobel روی نسخه‌ی خاکستریِ تصویر: هرجا شدت لبه از حد آستانه\n * بیشتر باشه، پیکسل تیره می‌شه (حسِ خط دور کارتونی).\n *\n * روی خودِ ImageData کار می‌کنه، پس هزینه‌ش با اندازه‌ی تصویر خطی‌ست؛ برای\n * تصاویر خیلی بزرگ (>~3000px) بهتره قبلش resize بشه (که در کامپوننت اصلی\n * با fitWithin قبل از اعمال فیلتر انجام می‌شه).\n */\nexport function applyCartoonEffect(\n ctx: CanvasRenderingContext2D,\n width: number,\n height: number,\n options: { levels?: number; edgeThreshold?: number } = {},\n): void {\n const levels = options.levels ?? 5;\n const edgeThreshold = options.edgeThreshold ?? 80;\n\n const imageData = ctx.getImageData(0, 0, width, height);\n const src = imageData.data;\n\n // ۱) خاکستری برای Sobel\n const gray = new Uint8ClampedArray(width * height);\n for (let i = 0, p = 0; i < src.length; i += 4, p++) {\n gray[p] = (src[i] * 0.299 + src[i + 1] * 0.587 + src[i + 2] * 0.114) | 0;\n }\n\n // ۲) Posterize رنگ‌ها\n const step = 255 / (levels - 1);\n for (let i = 0; i < src.length; i += 4) {\n src[i] = Math.round(Math.round(src[i] / step) * step);\n src[i + 1] = Math.round(Math.round(src[i + 1] / step) * step);\n src[i + 2] = Math.round(Math.round(src[i + 2] / step) * step);\n }\n\n // ۳) Sobel روی gray، خط دور تیره روی src\n const gxKernel = [-1, 0, 1, -2, 0, 2, -1, 0, 1];\n const gyKernel = [-1, -2, -1, 0, 0, 0, 1, 2, 1];\n\n for (let y = 1; y < height - 1; y++) {\n for (let x = 1; x < width - 1; x++) {\n let gx = 0;\n let gy = 0;\n let k = 0;\n for (let dy = -1; dy <= 1; dy++) {\n for (let dx = -1; dx <= 1; dx++) {\n const v = gray[(y + dy) * width + (x + dx)];\n gx += v * gxKernel[k];\n gy += v * gyKernel[k];\n k++;\n }\n }\n const magnitude = Math.sqrt(gx * gx + gy * gy);\n if (magnitude > edgeThreshold) {\n const idx = (y * width + x) * 4;\n src[idx] = 20;\n src[idx + 1] = 20;\n src[idx + 2] = 20;\n }\n }\n }\n\n ctx.putImageData(imageData, 0, 0);\n}\n","import { NgxCropRect, NgxImageEditorAdjustments } from '../contracts/image-editor-types';\nimport { applyCartoonEffect } from './cartoonify';\nimport { fitWithin } from './image-io';\n\n/** تصویر مبدأ رو با زاویه‌ی داده‌شده روی یه canvas جدید (به اندازه‌ی bounding-box نتیجه) می‌چرخونه */\nexport function renderRotated(\n source: CanvasImageSource,\n width: number,\n height: number,\n degrees: number,\n): HTMLCanvasElement {\n const rad = (degrees * Math.PI) / 180;\n const sin = Math.abs(Math.sin(rad));\n const cos = Math.abs(Math.cos(rad));\n const newW = Math.max(1, Math.round(width * cos + height * sin));\n const newH = Math.max(1, Math.round(width * sin + height * cos));\n\n const canvas = document.createElement('canvas');\n canvas.width = newW;\n canvas.height = newH;\n const ctx = canvas.getContext('2d')!;\n ctx.translate(newW / 2, newH / 2);\n ctx.rotate(rad);\n ctx.drawImage(source, -width / 2, -height / 2, width, height);\n return canvas;\n}\n\nfunction buildCssFilter(adjustments: NgxImageEditorAdjustments): string {\n const parts = [\n `brightness(${adjustments.brightness}%)`,\n `contrast(${adjustments.contrast}%)`,\n `saturate(${adjustments.saturation}%)`,\n ];\n if (adjustments.filter === 'grayscale') parts.push('grayscale(1)');\n if (adjustments.filter === 'sepia') parts.push('sepia(1)');\n if (adjustments.filter === 'invert') parts.push('invert(1)');\n return parts.join(' ');\n}\n\n/**\n * کراپ + فیلترها رو روی یه canvas خروجی می‌سازه. brightness/contrast/\n * saturation/grayscale/sepia/invert همه با ctx.filter بومیِ Canvas 2D انجام\n * می‌شن (شتاب‌دهی‌شده توسط مرورگر، بدون حلقه‌ی پیکسلی دستی)؛ فقط cartoon\n * (که معادل بومی نداره) با پردازش پیکسلی جدا انجام می‌شه.\n *\n * maxWidth/maxHeight برای دو حالت استفاده می‌شه: پیش‌نمایش زنده (عدد کوچیک،\n * برای واکنش‌گرا موندن حین کشیدن اسلایدرها) و خروجی نهایی (بدون محدودیت یا\n * محدودیت دلخواه کاربر).\n */\nexport function renderComposite(\n source: CanvasImageSource,\n sourceWidth: number,\n sourceHeight: number,\n crop: NgxCropRect,\n adjustments: NgxImageEditorAdjustments,\n maxWidth?: number,\n maxHeight?: number,\n): HTMLCanvasElement {\n const { width: outW, height: outH } = fitWithin(crop.width, crop.height, maxWidth, maxHeight);\n\n const canvas = document.createElement('canvas');\n canvas.width = Math.max(1, outW);\n canvas.height = Math.max(1, outH);\n const ctx = canvas.getContext('2d')!;\n\n ctx.filter = buildCssFilter(adjustments);\n ctx.drawImage(source, crop.x, crop.y, crop.width, crop.height, 0, 0, canvas.width, canvas.height);\n ctx.filter = 'none';\n\n if (adjustments.filter === 'cartoon') {\n applyCartoonEffect(ctx, canvas.width, canvas.height);\n }\n\n return canvas;\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { DecimalPipe } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { SliderComponent } from 'ngx-kit/shared';\nimport {\n NgxCropRect,\n NgxImageEditorAdjustments,\n NgxImageEditorResult,\n NgxImageFilterPreset,\n} from '../contracts/image-editor-types';\nimport { NgxPointerDragDelta, NgxPointerDragDirective } from '../directives/pointer-drag.directive';\nimport { canvasToBlob, createWorkingCopy, loadImage } from '../utils/image-io';\nimport { renderComposite, renderRotated } from '../utils/render-pipeline';\n\ntype Corner = 'nw' | 'ne' | 'sw' | 'se';\n\n/**\n * ویرایشگر تصویر: کراپ + چرخش + روشنایی/کنتراست/اشباع + فیلترهای آماده\n * (سیاه‌وسفید، سپیا، معکوس، کارتونی) + فشرده‌سازی خروجی. کاملاً روی Canvas\n * خام پیاده شده، بدون هیچ وابستگی خارجی‌ای.\n *\n * نکته‌ی مهمِ معماری: تمام تعامل زنده (چرخوندن، جابه‌جا/ریسایز کراپ‌باکس،\n * پیش‌نمایش فیلترها حتی کارتونی) روی یه کپیِ کوچیک‌شده از تصویر انجام می‌شه\n * (createWorkingCopy)، نه روی تصویر اصلی که ممکنه چند مگاپیکسل باشه — وگرنه\n * درگ‌کردن اسلایدرها/گوشه‌های کراپ رو کاربر حس تاخیر می‌کرد. فقط لحظه‌ی\n * save()، رندر نهایی از روی تصویر اصلیِ کامل انجام می‌شه.\n */\n@Component({\n selector: 'ngx-image-editor',\n standalone: true,\n imports: [FormsModule, DecimalPipe, SliderComponent, NgxPointerDragDirective],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './image-editor.component.html',\n styleUrl: './image-editor.component.scss',\n host: { class: 'ngx-image-editor-host' },\n})\nexport class NgxImageEditorComponent {\n source = input<File | Blob | string | null>(null);\n /** قفل نسبتِ کراپ (مثلاً ۱ برای آواتار مربعی)؛ undefined یعنی آزاد */\n aspectRatio = input<number | undefined>(undefined);\n outputMaxWidth = input<number | undefined>(undefined);\n outputMaxHeight = input<number | undefined>(undefined);\n outputType = input<'image/jpeg' | 'image/png' | 'image/webp'>('image/jpeg');\n /** حداکثر عرض نمایشِ ناحیه‌ی کراپ روی صفحه (پیکسل) */\n displayMaxWidth = input<number>(420);\n\n saved = output<NgxImageEditorResult>();\n cancelled = output<void>();\n\n protected readonly loading = signal(false);\n protected readonly saving = signal(false);\n protected readonly loadError = signal<string | null>(null);\n\n private readonly originalImage = signal<HTMLImageElement | null>(null);\n private readonly workingCanvas = signal<HTMLCanvasElement | null>(null);\n\n protected readonly rotation = signal(0);\n protected readonly brightness = signal(100);\n protected readonly contrast = signal(100);\n protected readonly saturation = signal(100);\n protected readonly filterPreset = signal<NgxImageFilterPreset>('none');\n protected readonly quality = signal(0.92);\n\n protected readonly crop = signal<NgxCropRect>({ x: 0, y: 0, width: 0, height: 0 });\n\n protected readonly adjustments = computed<NgxImageEditorAdjustments>(() => ({\n brightness: this.brightness(),\n contrast: this.contrast(),\n saturation: this.saturation(),\n rotation: this.rotation(),\n filter: this.filterPreset(),\n }));\n\n /** تصویرِ (کوچیک‌شده‌یِ) چرخیده — پایه‌ی نمایش صحنه‌ی کراپ */\n protected readonly rotatedWorkingCanvas = computed(() => {\n const wc = this.workingCanvas();\n if (!wc) return null;\n return renderRotated(wc, wc.width, wc.height, this.rotation());\n });\n\n protected readonly displayScale = computed(() => {\n const rc = this.rotatedWorkingCanvas();\n if (!rc) return 1;\n return Math.min(1, this.displayMaxWidth() / rc.width);\n });\n\n protected readonly stageImageUrl = computed(() => {\n const rc = this.rotatedWorkingCanvas();\n return rc ? rc.toDataURL('image/png') : null;\n });\n\n protected readonly stageSize = computed(() => {\n const rc = this.rotatedWorkingCanvas();\n const scale = this.displayScale();\n return rc ? { width: rc.width * scale, height: rc.height * scale } : { width: 0, height: 0 };\n });\n\n protected readonly cropOverlayStyle = computed(() => {\n const scale = this.displayScale();\n const c = this.crop();\n return {\n left: `${c.x * scale}px`,\n top: `${c.y * scale}px`,\n width: `${c.width * scale}px`,\n height: `${c.height * scale}px`,\n };\n });\n\n /** پیش‌نمایش نهایی (کوچیک، حداکثر ۴۸۰ پیکسل) — شامل همه‌چیز، حتی افکت کارتونی */\n protected readonly previewUrl = computed(() => {\n const rc = this.rotatedWorkingCanvas();\n const c = this.crop();\n if (!rc || c.width <= 0 || c.height <= 0) return null;\n const canvas = renderComposite(rc, rc.width, rc.height, c, this.adjustments(), 480, 480);\n return canvas.toDataURL('image/png');\n });\n\n private moveSnapshot: NgxCropRect | null = null;\n private resizeSnapshot: NgxCropRect | null = null;\n\n constructor() {\n // بارگذاری تصویر هروقت source عوض بشه\n effect(() => {\n const src = this.source();\n if (!src) {\n this.originalImage.set(null);\n this.workingCanvas.set(null);\n return;\n }\n this.loading.set(true);\n this.loadError.set(null);\n loadImage(src)\n .then((img) => {\n this.originalImage.set(img);\n this.workingCanvas.set(createWorkingCopy(img));\n this.resetAdjustments();\n })\n .catch((err) => this.loadError.set(err?.message ?? 'خطا در بارگذاری تصویر'))\n .finally(() => this.loading.set(false));\n });\n\n // هر وقت چرخیده‌شده عوض بشه (بارگذاریِ تصویر جدید یا چرخش)، کراپ روی کل قاب ریست بشه\n effect(() => {\n const rc = this.rotatedWorkingCanvas();\n if (rc) {\n this.crop.set({ x: 0, y: 0, width: rc.width, height: rc.height });\n }\n });\n }\n\n private resetAdjustments(): void {\n this.rotation.set(0);\n this.brightness.set(100);\n this.contrast.set(100);\n this.saturation.set(100);\n this.filterPreset.set('none');\n }\n\n protected rotateBy(delta: number): void {\n this.rotation.update((r) => {\n let next = r + delta;\n if (next > 180) next -= 360;\n if (next < -180) next += 360;\n return next;\n });\n }\n\n protected setFilter(preset: NgxImageFilterPreset): void {\n this.filterPreset.set(preset);\n }\n\n // ---------- درگ جابه‌جاییِ کل کراپ‌باکس ----------\n protected onMoveDragStart(): void {\n this.moveSnapshot = { ...this.crop() };\n }\n\n protected onMoveDragMove(delta: NgxPointerDragDelta): void {\n const rc = this.rotatedWorkingCanvas();\n const snap = this.moveSnapshot;\n if (!rc || !snap) return;\n const scale = this.displayScale();\n const dxSrc = delta.dx / scale;\n const dySrc = delta.dy / scale;\n const maxX = Math.max(0, rc.width - snap.width);\n const maxY = Math.max(0, rc.height - snap.height);\n const x = Math.min(Math.max(0, snap.x + dxSrc), maxX);\n const y = Math.min(Math.max(0, snap.y + dySrc), maxY);\n this.crop.set({ ...snap, x, y });\n }\n\n // ---------- درگ ریسایز از گوشه‌ها ----------\n protected onResizeDragStart(): void {\n this.resizeSnapshot = { ...this.crop() };\n }\n\n protected onResizeDragMove(corner: Corner, delta: NgxPointerDragDelta): void {\n const rc = this.rotatedWorkingCanvas();\n const snap = this.resizeSnapshot;\n if (!rc || !snap) return;\n\n const scale = this.displayScale();\n const dxSrc = delta.dx / scale;\n const dySrc = delta.dy / scale;\n const minSize = 24;\n\n let { x, y, width, height } = snap;\n\n if (corner === 'nw' || corner === 'sw') {\n const newX = Math.min(snap.x + dxSrc, snap.x + snap.width - minSize);\n x = Math.max(0, newX);\n width = snap.x + snap.width - x;\n }\n if (corner === 'ne' || corner === 'se') {\n width = Math.min(Math.max(minSize, snap.width + dxSrc), rc.width - snap.x);\n }\n if (corner === 'nw' || corner === 'ne') {\n const newY = Math.min(snap.y + dySrc, snap.y + snap.height - minSize);\n y = Math.max(0, newY);\n height = snap.y + snap.height - y;\n }\n if (corner === 'sw' || corner === 'se') {\n height = Math.min(Math.max(minSize, snap.height + dySrc), rc.height - snap.y);\n }\n\n const ratio = this.aspectRatio();\n if (ratio) {\n height = width / ratio;\n }\n\n this.crop.set({ x, y, width, height });\n }\n\n protected cancel(): void {\n this.cancelled.emit();\n }\n\n async save(): Promise<void> {\n const original = this.originalImage();\n const working = this.workingCanvas();\n if (!original || !working) return;\n\n this.saving.set(true);\n try {\n // نسبت مقیاس بین کپیِ کوچیک‌شده (که کراپ/چرخش روش تعریف شده) و تصویر\n // اصلیِ کامل. چون createWorkingCopy مقیاس یکنواخت (هم‌جهت) اعمال\n // می‌کنه، همین یه ضریب برای هر دو بعد و بعد از چرخش هم معتبر می‌مونه.\n const scaleToOriginal = original.naturalWidth / working.width;\n\n const rotatedFull = renderRotated(\n original,\n original.naturalWidth,\n original.naturalHeight,\n this.rotation(),\n );\n\n const c = this.crop();\n const cropInFullRes: NgxCropRect = {\n x: c.x * scaleToOriginal,\n y: c.y * scaleToOriginal,\n width: c.width * scaleToOriginal,\n height: c.height * scaleToOriginal,\n };\n\n const finalCanvas = renderComposite(\n rotatedFull,\n rotatedFull.width,\n rotatedFull.height,\n cropInFullRes,\n this.adjustments(),\n this.outputMaxWidth(),\n this.outputMaxHeight(),\n );\n\n const type = this.outputType();\n const blob = await canvasToBlob(finalCanvas, type, this.quality());\n const dataUrl = finalCanvas.toDataURL(type, this.quality());\n this.saved.emit({ blob, dataUrl, width: finalCanvas.width, height: finalCanvas.height });\n } finally {\n this.saving.set(false);\n }\n }\n}\n","@if (loading()) {\n <div class=\"ngx-ie-state\">در حال بارگذاری تصویر…</div>\n} @else if (loadError()) {\n <div class=\"ngx-ie-state ngx-ie-state--error\">{{ loadError() }}</div>\n} @else if (stageImageUrl()) {\n <div class=\"ngx-ie-layout\">\n <div class=\"ngx-ie-stage-wrap\">\n <div\n class=\"ngx-ie-stage\"\n [style.width.px]=\"stageSize().width\"\n [style.height.px]=\"stageSize().height\">\n <img class=\"ngx-ie-stage-img\" [src]=\"stageImageUrl()\" alt=\"\" draggable=\"false\" />\n\n <div\n class=\"ngx-ie-crop-box\"\n [style.left]=\"cropOverlayStyle().left\"\n [style.top]=\"cropOverlayStyle().top\"\n [style.width]=\"cropOverlayStyle().width\"\n [style.height]=\"cropOverlayStyle().height\"\n ngxPointerDrag\n (dragStart)=\"onMoveDragStart()\"\n (dragMove)=\"onMoveDragMove($event)\">\n <span\n class=\"ngx-ie-handle ngx-ie-handle--nw\"\n ngxPointerDrag\n (dragStart)=\"onResizeDragStart()\"\n (dragMove)=\"onResizeDragMove('nw', $event)\"></span>\n <span\n class=\"ngx-ie-handle ngx-ie-handle--ne\"\n ngxPointerDrag\n (dragStart)=\"onResizeDragStart()\"\n (dragMove)=\"onResizeDragMove('ne', $event)\"></span>\n <span\n class=\"ngx-ie-handle ngx-ie-handle--sw\"\n ngxPointerDrag\n (dragStart)=\"onResizeDragStart()\"\n (dragMove)=\"onResizeDragMove('sw', $event)\"></span>\n <span\n class=\"ngx-ie-handle ngx-ie-handle--se\"\n ngxPointerDrag\n (dragStart)=\"onResizeDragStart()\"\n (dragMove)=\"onResizeDragMove('se', $event)\"></span>\n </div>\n </div>\n </div>\n\n <div class=\"ngx-ie-panel\">\n <div class=\"ngx-ie-preview\">\n @if (previewUrl(); as url) {\n <img [src]=\"url\" alt=\"پیش‌نمایش\" />\n }\n </div>\n\n <div class=\"ngx-ie-row ngx-ie-rotate-row\">\n <button type=\"button\" (click)=\"rotateBy(-90)\" title=\"چرخش ۹۰ درجه به چپ\">⟲ 90</button>\n <button type=\"button\" (click)=\"rotateBy(90)\" title=\"چرخش ۹۰ درجه به راست\">⟳ 90</button>\n </div>\n\n <label class=\"ngx-ie-field\">\n <span>چرخش دقیق ({{ rotation() }}°)</span>\n <slider\n [ngModel]=\"rotation()\"\n (ngModelChange)=\"rotation.set($event)\"\n [min]=\"-180\"\n [max]=\"180\"></slider>\n </label>\n\n <label class=\"ngx-ie-field\">\n <span>روشنایی ({{ brightness() }}%)</span>\n <slider\n [ngModel]=\"brightness()\"\n (ngModelChange)=\"brightness.set($event)\"\n [min]=\"0\"\n [max]=\"200\"></slider>\n </label>\n\n <label class=\"ngx-ie-field\">\n <span>کنتراست ({{ contrast() }}%)</span>\n <slider\n [ngModel]=\"contrast()\"\n (ngModelChange)=\"contrast.set($event)\"\n [min]=\"0\"\n [max]=\"200\"></slider>\n </label>\n\n <label class=\"ngx-ie-field\">\n <span>اشباع رنگ ({{ saturation() }}%)</span>\n <slider\n [ngModel]=\"saturation()\"\n (ngModelChange)=\"saturation.set($event)\"\n [min]=\"0\"\n [max]=\"200\"></slider>\n </label>\n\n <div class=\"ngx-ie-field\">\n <span>افکت</span>\n <div class=\"ngx-ie-filter-row\">\n <button\n type=\"button\"\n [class.active]=\"filterPreset() === 'none'\"\n (click)=\"setFilter('none')\">\n هیچ‌کدام\n </button>\n <button\n type=\"button\"\n [class.active]=\"filterPreset() === 'grayscale'\"\n (click)=\"setFilter('grayscale')\">\n سیاه‌وسفید\n </button>\n <button\n type=\"button\"\n [class.active]=\"filterPreset() === 'sepia'\"\n (click)=\"setFilter('sepia')\">\n سپیا\n </button>\n <button\n type=\"button\"\n [class.active]=\"filterPreset() === 'invert'\"\n (click)=\"setFilter('invert')\">\n معکوس\n </button>\n <button\n type=\"button\"\n [class.active]=\"filterPreset() === 'cartoon'\"\n (click)=\"setFilter('cartoon')\">\n کارتونی\n </button>\n </div>\n </div>\n\n <label class=\"ngx-ie-field\">\n <span>کیفیت خروجی ({{ quality() * 100 | number: '1.0-0' }}٪)</span>\n <slider\n [ngModel]=\"quality() * 100\"\n (ngModelChange)=\"quality.set($event / 100)\"\n [min]=\"10\"\n [max]=\"100\"></slider>\n </label>\n\n <div class=\"ngx-ie-row ngx-ie-actions\">\n <button type=\"button\" class=\"ngx-ie-btn-secondary\" (click)=\"cancel()\">انصراف</button>\n <button type=\"button\" class=\"ngx-ie-btn-primary\" [disabled]=\"saving()\" (click)=\"save()\">\n {{ saving() ? 'در حال ذخیره…' : 'ذخیره' }}\n </button>\n </div>\n </div>\n </div>\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -75,15 +75,20 @@ class NgxContextMenu {
75
75
  ngxContextMenu = input.required(/* @ts-ignore */
76
76
  ...(ngDevMode ? [{ debugName: "ngxContextMenu" }] : /* istanbul ignore next */ []));
77
77
  containerRef;
78
+ // باید همون رفرنس تابعی که به addEventListener داده می‌شه رو نگه داریم و به
79
+ // removeEventListener هم بدیم؛ قبلاً هر بار یک آرو فانکشن جدید ساخته می‌شد
80
+ // که removeEventListener اصلاً نمی‌تونست تشخیص بده مال همون listener قبلیه،
81
+ // پس listener هیچ‌وقت واقعاً حذف نمی‌شد (نشتی حافظه‌ی کامل directive + المنت).
82
+ boundOnClick = (ev) => this.onClick(ev);
78
83
  constructor(el, appRef, overlayService) {
79
84
  this.el = el;
80
85
  this.appRef = appRef;
81
86
  this.overlayService = overlayService;
82
- el.nativeElement.addEventListener('contextmenu', (ev) => this.onClick(ev));
87
+ el.nativeElement.addEventListener('contextmenu', this.boundOnClick);
83
88
  }
84
89
  ngOnDestroy() {
85
90
  this.destroyContainer();
86
- this.el.nativeElement.removeEventListener('contextmenu', (ev) => this.onClick(ev));
91
+ this.el.nativeElement.removeEventListener('contextmenu', this.boundOnClick);
87
92
  }
88
93
  onClick(ev) {
89
94
  if (ev.currentTarget == this.el.nativeElement) {
@@ -179,7 +184,7 @@ class NgxMenuItem {
179
184
  <div class="ngx-menu-item">
180
185
  <ng-content></ng-content>
181
186
  </div>
182
- `, isInline: true, styles: [".ngx-menu-item{box-sizing:border-box;outline:0;padding:var(--ngx-menu-item-padding, 6px 12px);transition:all .3s}.ngx-menu-item:hover{cursor:pointer;background-color:var(--ngx-menu-item-padding, #9bc6ff68)}\n"] });
187
+ `, isInline: true, styles: [".ngx-menu-item{box-sizing:border-box;outline:0;padding:var(--ngx-menu-item-padding, 6px 12px);transition:all .3s}.ngx-menu-item:hover{cursor:pointer;background-color:var(--ngx-menu-item-hover-bg, #9bc6ff68)}\n"] });
183
188
  }
184
189
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NgxMenuItem, decorators: [{
185
190
  type: Component,
@@ -187,7 +192,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImpor
187
192
  <div class="ngx-menu-item">
188
193
  <ng-content></ng-content>
189
194
  </div>
190
- `, exportAs: 'NgxMenuItem', styles: [".ngx-menu-item{box-sizing:border-box;outline:0;padding:var(--ngx-menu-item-padding, 6px 12px);transition:all .3s}.ngx-menu-item:hover{cursor:pointer;background-color:var(--ngx-menu-item-padding, #9bc6ff68)}\n"] }]
195
+ `, exportAs: 'NgxMenuItem', styles: [".ngx-menu-item{box-sizing:border-box;outline:0;padding:var(--ngx-menu-item-padding, 6px 12px);transition:all .3s}.ngx-menu-item:hover{cursor:pointer;background-color:var(--ngx-menu-item-hover-bg, #9bc6ff68)}\n"] }]
191
196
  }], propDecorators: { onClick: [{
192
197
  type: HostListener,
193
198
  args: ['click']
@@ -1 +1 @@
1
- {"version":3,"file":"ngx-kit-menu.mjs","sources":["../../../projects/libs/menu/directives/ngx-menu.directive.ts","../../../projects/libs/menu/directives/ngx-context-menu.directive.ts","../../../projects/libs/menu/tokens/menu-context.token.ts","../../../projects/libs/menu/components/ngx-menu/menu.component.ts","../../../projects/libs/menu/components/ngx-menu-item/menu-item.component.ts","../../../projects/libs/menu/components/ngx-menu-divider/menu-divider.component.ts","../../../projects/libs/menu/ngx-menu.module.ts","../../../projects/libs/menu/ngx-kit-menu.ts"],"sourcesContent":["import {\r\n Directive,\r\n OnDestroy,\r\n ElementRef,\r\n HostListener,\r\n input,\r\n ApplicationRef,\r\n} from '@angular/core';\r\nimport { OverlayRef, OverlayService, OverlayInstance, Alignment, Placement } from 'ngx-kit/shared';\r\nimport { NgxMenuPanel } from '../components/ngx-menu/menu.component';\r\n\r\n@Directive({\r\n selector: '[ngxMenu]',\r\n exportAs: 'ngxMenu',\r\n})\r\nexport class NgxMenu implements OnDestroy {\r\n ngxMenu = input.required<NgxMenuPanel>();\r\n placement = input<Placement>();\r\n alignment = input<Alignment>();\r\n\r\n private containerRef?: OverlayRef<NgxMenuPanel>;\r\n\r\n constructor(\r\n private el: ElementRef,\r\n private appRef: ApplicationRef,\r\n private overlayService: OverlayService,\r\n ) {}\r\n\r\n ngOnDestroy(): void {\r\n this.destroyContainer();\r\n }\r\n\r\n @HostListener('click', ['$event'])\r\n onClick(ev: Event) {\r\n ev.stopPropagation();\r\n ev.preventDefault();\r\n this.toggleContainer();\r\n }\r\n\r\n private toggleContainer() {\r\n if (this.containerRef) {\r\n this.destroyContainer();\r\n return;\r\n }\r\n const t = this.ngxMenu().template();\r\n if (!t) return;\r\n this.containerRef = this.overlayService.openTemplate({\r\n anchor: this.el.nativeElement,\r\n template: t,\r\n appRef: this.appRef,\r\n alignment: this.alignment() ?? 'start',\r\n placement: this.placement() ?? 'auto',\r\n onClosed: () => {\r\n this.containerRef = undefined;\r\n this.overlayService.closeAll();\r\n },\r\n configure: (instance: OverlayInstance, ref: OverlayRef<NgxMenuPanel>) => {\r\n this.ngxMenu().containerRef = ref;\r\n },\r\n });\r\n }\r\n\r\n private destroyContainer() {\r\n this.containerRef?.close();\r\n this.containerRef = undefined;\r\n }\r\n}\r\n","import { Directive, OnDestroy, input, ApplicationRef, ElementRef } from '@angular/core';\r\nimport { OverlayRef, OverlayService, OverlayInstance } from 'ngx-kit/shared';\r\nimport { NgxMenuPanel } from '../components/ngx-menu/menu.component';\r\n\r\n@Directive({\r\n selector: '[ngxContextMenu]',\r\n exportAs: 'ngxContextMenu',\r\n})\r\nexport class NgxContextMenu implements OnDestroy {\r\n ngxContextMenu = input.required<NgxMenuPanel>();\r\n\r\n private containerRef?: OverlayRef<NgxMenuPanel>;\r\n\r\n constructor(\r\n private el: ElementRef<HTMLElement>,\r\n private appRef: ApplicationRef,\r\n private overlayService: OverlayService,\r\n ) {\r\n el.nativeElement.addEventListener('contextmenu', (ev) => this.onClick(ev));\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.destroyContainer();\r\n this.el.nativeElement.removeEventListener('contextmenu', (ev) => this.onClick(ev));\r\n }\r\n\r\n onClick(ev: PointerEvent) {\r\n if (ev.currentTarget == this.el.nativeElement) {\r\n ev.stopPropagation();\r\n ev.preventDefault();\r\n this.toggleContainer(ev.clientX, ev.clientY);\r\n }\r\n }\r\n\r\n private toggleContainer(x: number, y: number) {\r\n if (this.containerRef) {\r\n this.destroyContainer();\r\n return;\r\n }\r\n const t = this.ngxContextMenu().template();\r\n if (!t) return;\r\n this.containerRef = this.overlayService.openTemplate({\r\n anchor: this.el.nativeElement,\r\n point: { x, y },\r\n template: t,\r\n appRef: this.appRef,\r\n alignment: 'start',\r\n placement: 'auto',\r\n onClosed: () => {\r\n this.containerRef = undefined;\r\n this.overlayService.closeAll();\r\n },\r\n configure: (instance: OverlayInstance, ref: OverlayRef<NgxMenuPanel>) => {\r\n this.ngxContextMenu().containerRef = ref;\r\n },\r\n });\r\n }\r\n\r\n private destroyContainer() {\r\n this.containerRef?.close();\r\n this.containerRef = undefined;\r\n }\r\n}\r\n","import { InjectionToken } from '@angular/core';\r\n\r\nexport interface MenuContext {\r\n close(): void;\r\n}\r\n\r\nexport const NGX_MENU_CONTEXT = new InjectionToken<MenuContext>('ngx-menu-context');\r\n","import { CommonModule } from '@angular/common';\nimport { Component, input, TemplateRef, viewChild } from '@angular/core';\nimport { OverlayRef } from 'ngx-kit/shared';\nimport { MenuContext, NGX_MENU_CONTEXT } from '../../tokens/menu-context.token';\n\n@Component({\n selector: 'ngx-menu,[ngx-menu]',\n template: `\n <ng-template>\n <div class=\"ngx-menu-panel\" [class]=\"class()\">\n <ng-content></ng-content>\n </div>\n </ng-template>\n `,\n exportAs: 'NgxMenu',\n styles: `\n .ngx-menu-panel {\n --ngx-menu-bg: light-dark(#ffffff, #252425);\n --ngx-menu-fg: light-dark(#000000, #ffffff);\n }\n .ngx-menu-panel {\n overflow: auto;\n box-sizing: border-box;\n outline: 0;\n background-color: var(--ngx-menu-bg);\n color: var(--ngx-menu-fg);\n box-shadow: var(--ngx-menu-shadow, 0px 0px 4px rgb(0 0 0 / 30%));\n border-radius: var(--ngx-menu-radius, 10px);\n padding: var(--ngx-menu-padding, 5px);\n min-width: var(--ngx-menu-min-width, 20px);\n min-height: var(--ngx-menu-min-height, 40px);\n will-change: transform, opacity;\n }\n .ngx-menu-panel.ngx-menu-panel-exit {\n animation: menu-exit 100ms 25ms linear forwards;\n }\n `,\n imports: [CommonModule],\n providers: [{ provide: NGX_MENU_CONTEXT, useExisting: NgxMenuPanel }],\n})\nexport class NgxMenuPanel implements MenuContext {\n template = viewChild<TemplateRef<any>>(TemplateRef);\n class = input<string>();\n\n containerRef?: OverlayRef<NgxMenuPanel>;\n\n close(): void {\n this.containerRef?.close();\n }\n}\n","import { Component, HostListener, inject } from '@angular/core';\nimport { NGX_MENU_CONTEXT } from '../../tokens/menu-context.token';\nimport { NgxMenu } from '../../directives/ngx-menu.directive';\n\n@Component({\n selector: 'ngx-menu-item,[ngx-menu-item]',\n template: `\n <div class=\"ngx-menu-item\">\n <ng-content></ng-content>\n </div>\n `,\n exportAs: 'NgxMenuItem',\n styles: `\n .ngx-menu-item {\n box-sizing: border-box;\n outline: 0;\n padding: var(--ngx-menu-item-padding, 6px 12px);\n transition: all 300ms;\n &:hover {\n cursor: pointer;\n background-color: var(--ngx-menu-item-padding, #9bc6ff68);\n }\n }\n `,\n})\nexport class NgxMenuItem {\n menuContext = inject(NGX_MENU_CONTEXT);\n childMenu = inject(NgxMenu, {\n self: true,\n optional: true,\n });\n\n @HostListener('click')\n onClick() {\n if (this.childMenu?.ngxMenu) {\n return;\n }\n this.menuContext?.close();\n }\n}\n","import { Component } from '@angular/core';\n\n@Component({\n selector: 'ngx-menu-divider,[ngx-menu-divider]',\n template: ``,\n styles: `\n :host {\n display: block;\n border-bottom: var(--ngx-menu-item-border, 1px #43434d3d solid);\n border-bottom-color: var(--ngx-menu-divider-border-color, #43434d3d);\n margin: var(--ngx-menu-divider-margin, 10px calc(var(--ngx-menu-padding, 5px) * -1));\n }\n `,\n})\nexport class NgxMenuDivider {}\n","import { NgModule } from '@angular/core';\r\nimport { NgxMenuDivider } from './components/ngx-menu-divider/menu-divider.component';\r\nimport { NgxMenuItem } from './components/ngx-menu-item/menu-item.component';\r\nimport { NgxMenuPanel } from './components/ngx-menu/menu.component';\r\nimport { NgxMenu } from './directives/ngx-menu.directive';\r\nimport { NgxContextMenu } from './public-api';\r\n\r\nconst d = [NgxMenu, NgxContextMenu, NgxMenuPanel, NgxMenuItem, NgxMenuDivider];\r\n@NgModule({\r\n imports: d,\r\n exports: d,\r\n})\r\nexport class NgxMenuModule {}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ngx-kit-menu.mjs","sources":["../../../projects/libs/menu/directives/ngx-menu.directive.ts","../../../projects/libs/menu/directives/ngx-context-menu.directive.ts","../../../projects/libs/menu/tokens/menu-context.token.ts","../../../projects/libs/menu/components/ngx-menu/menu.component.ts","../../../projects/libs/menu/components/ngx-menu-item/menu-item.component.ts","../../../projects/libs/menu/components/ngx-menu-divider/menu-divider.component.ts","../../../projects/libs/menu/ngx-menu.module.ts","../../../projects/libs/menu/ngx-kit-menu.ts"],"sourcesContent":["import {\n Directive,\n OnDestroy,\n ElementRef,\n HostListener,\n input,\n ApplicationRef,\n} from '@angular/core';\nimport { OverlayRef, OverlayService, OverlayInstance, Alignment, Placement } from 'ngx-kit/shared';\nimport { NgxMenuPanel } from '../components/ngx-menu/menu.component';\n\n@Directive({\n selector: '[ngxMenu]',\n exportAs: 'ngxMenu',\n})\nexport class NgxMenu implements OnDestroy {\n ngxMenu = input.required<NgxMenuPanel>();\n placement = input<Placement>();\n alignment = input<Alignment>();\n\n private containerRef?: OverlayRef<NgxMenuPanel>;\n\n constructor(\n private el: ElementRef,\n private appRef: ApplicationRef,\n private overlayService: OverlayService,\n ) {}\n\n ngOnDestroy(): void {\n this.destroyContainer();\n }\n\n @HostListener('click', ['$event'])\n onClick(ev: Event) {\n ev.stopPropagation();\n ev.preventDefault();\n this.toggleContainer();\n }\n\n private toggleContainer() {\n if (this.containerRef) {\n this.destroyContainer();\n return;\n }\n const t = this.ngxMenu().template();\n if (!t) return;\n this.containerRef = this.overlayService.openTemplate({\n anchor: this.el.nativeElement,\n template: t,\n appRef: this.appRef,\n alignment: this.alignment() ?? 'start',\n placement: this.placement() ?? 'auto',\n onClosed: () => {\n this.containerRef = undefined;\n this.overlayService.closeAll();\n },\n configure: (instance: OverlayInstance, ref: OverlayRef<NgxMenuPanel>) => {\n this.ngxMenu().containerRef = ref;\n },\n });\n }\n\n private destroyContainer() {\n this.containerRef?.close();\n this.containerRef = undefined;\n }\n}\n","import { Directive, OnDestroy, input, ApplicationRef, ElementRef } from '@angular/core';\nimport { OverlayRef, OverlayService, OverlayInstance } from 'ngx-kit/shared';\nimport { NgxMenuPanel } from '../components/ngx-menu/menu.component';\n\n@Directive({\n selector: '[ngxContextMenu]',\n exportAs: 'ngxContextMenu',\n})\nexport class NgxContextMenu implements OnDestroy {\n ngxContextMenu = input.required<NgxMenuPanel>();\n\n private containerRef?: OverlayRef<NgxMenuPanel>;\n\n // باید همون رفرنس تابعی که به addEventListener داده می‌شه رو نگه داریم و به\n // removeEventListener هم بدیم؛ قبلاً هر بار یک آرو فانکشن جدید ساخته می‌شد\n // که removeEventListener اصلاً نمی‌تونست تشخیص بده مال همون listener قبلیه،\n // پس listener هیچ‌وقت واقعاً حذف نمی‌شد (نشتی حافظه‌ی کامل directive + المنت).\n private readonly boundOnClick = (ev: PointerEvent) => this.onClick(ev);\n\n constructor(\n private el: ElementRef<HTMLElement>,\n private appRef: ApplicationRef,\n private overlayService: OverlayService,\n ) {\n el.nativeElement.addEventListener('contextmenu', this.boundOnClick);\n }\n\n ngOnDestroy(): void {\n this.destroyContainer();\n this.el.nativeElement.removeEventListener('contextmenu', this.boundOnClick);\n }\n\n onClick(ev: PointerEvent) {\n if (ev.currentTarget == this.el.nativeElement) {\n ev.stopPropagation();\n ev.preventDefault();\n this.toggleContainer(ev.clientX, ev.clientY);\n }\n }\n\n private toggleContainer(x: number, y: number) {\n if (this.containerRef) {\n this.destroyContainer();\n return;\n }\n const t = this.ngxContextMenu().template();\n if (!t) return;\n this.containerRef = this.overlayService.openTemplate({\n anchor: this.el.nativeElement,\n point: { x, y },\n template: t,\n appRef: this.appRef,\n alignment: 'start',\n placement: 'auto',\n onClosed: () => {\n this.containerRef = undefined;\n this.overlayService.closeAll();\n },\n configure: (instance: OverlayInstance, ref: OverlayRef<NgxMenuPanel>) => {\n this.ngxContextMenu().containerRef = ref;\n },\n });\n }\n\n private destroyContainer() {\n this.containerRef?.close();\n this.containerRef = undefined;\n }\n}\n","import { InjectionToken } from '@angular/core';\n\nexport interface MenuContext {\n close(): void;\n}\n\nexport const NGX_MENU_CONTEXT = new InjectionToken<MenuContext>('ngx-menu-context');\n","import { CommonModule } from '@angular/common';\nimport { Component, input, TemplateRef, viewChild } from '@angular/core';\nimport { OverlayRef } from 'ngx-kit/shared';\nimport { MenuContext, NGX_MENU_CONTEXT } from '../../tokens/menu-context.token';\n\n@Component({\n selector: 'ngx-menu,[ngx-menu]',\n template: `\n <ng-template>\n <div class=\"ngx-menu-panel\" [class]=\"class()\">\n <ng-content></ng-content>\n </div>\n </ng-template>\n `,\n exportAs: 'NgxMenu',\n styles: `\n .ngx-menu-panel {\n --ngx-menu-bg: light-dark(#ffffff, #252425);\n --ngx-menu-fg: light-dark(#000000, #ffffff);\n }\n .ngx-menu-panel {\n overflow: auto;\n box-sizing: border-box;\n outline: 0;\n background-color: var(--ngx-menu-bg);\n color: var(--ngx-menu-fg);\n box-shadow: var(--ngx-menu-shadow, 0px 0px 4px rgb(0 0 0 / 30%));\n border-radius: var(--ngx-menu-radius, 10px);\n padding: var(--ngx-menu-padding, 5px);\n min-width: var(--ngx-menu-min-width, 20px);\n min-height: var(--ngx-menu-min-height, 40px);\n will-change: transform, opacity;\n }\n .ngx-menu-panel.ngx-menu-panel-exit {\n animation: menu-exit 100ms 25ms linear forwards;\n }\n `,\n imports: [CommonModule],\n providers: [{ provide: NGX_MENU_CONTEXT, useExisting: NgxMenuPanel }],\n})\nexport class NgxMenuPanel implements MenuContext {\n template = viewChild<TemplateRef<any>>(TemplateRef);\n class = input<string>();\n\n containerRef?: OverlayRef<NgxMenuPanel>;\n\n close(): void {\n this.containerRef?.close();\n }\n}\n","import { Component, HostListener, inject } from '@angular/core';\nimport { NGX_MENU_CONTEXT } from '../../tokens/menu-context.token';\nimport { NgxMenu } from '../../directives/ngx-menu.directive';\n\n@Component({\n selector: 'ngx-menu-item,[ngx-menu-item]',\n template: `\n <div class=\"ngx-menu-item\">\n <ng-content></ng-content>\n </div>\n `,\n exportAs: 'NgxMenuItem',\n styles: `\n .ngx-menu-item {\n box-sizing: border-box;\n outline: 0;\n padding: var(--ngx-menu-item-padding, 6px 12px);\n transition: all 300ms;\n &:hover {\n cursor: pointer;\n background-color: var(--ngx-menu-item-hover-bg, #9bc6ff68);\n }\n }\n `,\n})\nexport class NgxMenuItem {\n menuContext = inject(NGX_MENU_CONTEXT);\n childMenu = inject(NgxMenu, {\n self: true,\n optional: true,\n });\n\n @HostListener('click')\n onClick() {\n if (this.childMenu?.ngxMenu) {\n return;\n }\n this.menuContext?.close();\n }\n}\n","import { Component } from '@angular/core';\n\n@Component({\n selector: 'ngx-menu-divider,[ngx-menu-divider]',\n template: ``,\n styles: `\n :host {\n display: block;\n border-bottom: var(--ngx-menu-item-border, 1px #43434d3d solid);\n border-bottom-color: var(--ngx-menu-divider-border-color, #43434d3d);\n margin: var(--ngx-menu-divider-margin, 10px calc(var(--ngx-menu-padding, 5px) * -1));\n }\n `,\n})\nexport class NgxMenuDivider {}\n","import { NgModule } from '@angular/core';\nimport { NgxMenuDivider } from './components/ngx-menu-divider/menu-divider.component';\nimport { NgxMenuItem } from './components/ngx-menu-item/menu-item.component';\nimport { NgxMenuPanel } from './components/ngx-menu/menu.component';\nimport { NgxMenu } from './directives/ngx-menu.directive';\nimport { NgxContextMenu } from './public-api';\n\nconst d = [NgxMenu, NgxContextMenu, NgxMenuPanel, NgxMenuItem, NgxMenuDivider];\n@NgModule({\n imports: d,\n exports: d,\n})\nexport class NgxMenuModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -75,6 +75,7 @@ class NgxMessageComponent {
75
75
  index = 0;
76
76
  sanitizer = inject(DomSanitizer);
77
77
  doc = inject(DOCUMENT);
78
+ messageService = inject(NgxMessageService);
78
79
  _onClose = new Subject();
79
80
  onClose = this._onClose.asObservable();
80
81
  ngOnInit() {
@@ -87,12 +88,27 @@ class NgxMessageComponent {
87
88
  makeConfetti(this.doc, confetti);
88
89
  }
89
90
  }
91
+ /**
92
+ * وقتی چند تا پیام هم‌زمان باز باشن، هرکدوم listener خودشو روی document
93
+ * داشت — پس یه فشردن Escape/Enter، رویداد رو به *همه‌شون* هم‌زمان می‌فرستاد،
94
+ * نه فقط آخرین پیامی که باز شده (رفتار طبیعیِ یه استکِ مودال باید این باشه
95
+ * که فقط بالاترین لایه به کیبورد واکنش نشون بده). این چک همون چیزیه که
96
+ * OverlayService با getLastDialog() برای اورلی‌ها انجام می‌ده.
97
+ */
98
+ isTopmost() {
99
+ const ids = [...this.messageService.alerts.keys()];
100
+ if (!ids.length)
101
+ return true;
102
+ return this.index === Math.max(...ids);
103
+ }
90
104
  onScapeKey(event) {
91
- if (this.options.allowEscapeKey) {
105
+ if (this.options.allowEscapeKey && this.isTopmost()) {
92
106
  this.onCancel();
93
107
  }
94
108
  }
95
109
  onEnterKey(event) {
110
+ if (!this.isTopmost())
111
+ return;
96
112
  event.stopPropagation();
97
113
  event.preventDefault();
98
114
  if (this.options.allowEnterKey) {
@@ -158,7 +174,7 @@ class NgxMessageComponent {
158
174
  provide: NGX_MESSAGE_CONFIGS,
159
175
  useValue: NGX_MESSAGE_DEFAULT_OPTIONS,
160
176
  },
161
- ], viewQueries: [{ propertyName: "confetti", first: true, predicate: ["confetti"], descendants: true, isSignal: true }], ngImport: i0, template: "<div\r\n class=\"ngx-msg-overlay show\"\r\n (click)=\"onOutSideClick()\"\r\n [ngClass]=\"options.containerClass\"\r\n [class.has-backdrop]=\"options.backdrop\"\r\n [attr.data-type]=\"options.icon\">\r\n <div class=\"ngx-msg-modal\" (click)=\"innerOnClick($event)\">\r\n <div class=\"confetti\" #confetti></div>\r\n @if (options.showCloseButton) {\r\n <button class=\"close-x\" (click)=\"close()\" aria-label=\"Close\">\u2715</button>\r\n }\r\n @if (showIcon()) {\r\n <div class=\"icon-stage\">\r\n <div class=\"icon-ring\"></div>\r\n <div class=\"icon-disc\" [innerHTML]=\"icon\"></div>\r\n </div>\r\n }\r\n <h2>{{ options.title }}</h2>\r\n <p class=\"desc\">\r\n {{ options.text }}\r\n <span [innerHTML]=\"options.html\"></span>\r\n </p>\r\n\r\n <div class=\"ngx-msg-actions\">\r\n @if (options.showCancelButton) {\r\n <button\r\n class=\"btn btn-ghost\"\r\n (click)=\"onCancel()\"\r\n [attr.aria-label]=\"options.cancelButtonAriaLabel\">\r\n {{ options.cancelButtonText }}\r\n </button>\r\n }\r\n @if (options.showDenyButton) {\r\n <button\r\n class=\"btn btn-ghost\"\r\n (click)=\"onDeny()\"\r\n [attr.aria-label]=\"options.denyButtonAriaLabel\">\r\n {{ options.denyButtonText }}\r\n </button>\r\n }\r\n @if (options.showConfirmButton) {\r\n <button\r\n class=\"btn btn-primary\"\r\n (click)=\"onConfirm()\"\r\n [attr.aria-label]=\"options.confirmButtonAriaLabel\">\r\n {{ options.confirmButtonText }}\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [":root{--bg-0: #0a0c14;--bg-1: #0f1220;--ngx-msg-panel-bg: light-dark(#ffffffc4, #161928b8);--ngx-msg-panel-fg: light-dark(#000, #fff);--ngx-msg-panel-border: light-dark(#4545454a, #ffffff14);--ink-0: light-dark(#212121 #f3f4fb);--ink-1: light-dark(#2d2e32, #a8adc4);--ink-2: #6b7090;--violet: #8b7bff;--violet-2: #5b4fd1;--cyan: #43e0d8;--amber: #ffb454;--rose: #ff6b8b;--emerald: #3ee08f;--success-a: #3ee08f;--success-b: #1fb8b0;--error-a: #ff6b8b;--error-b: #c23f6b;--warning-a: #ffc45c;--warning-b: #ff8a4c;--info-a: #7cc1ff;--info-b: #5b6cff;--confirm-a: #c58bff;--confirm-b: #7b5cff}.ngx-msg-overlay{position:fixed;inset:0;z-index:50;display:flex;align-items:center;justify-content:center;padding:24px;background:#06070e8c;backdrop-filter:blur(6px) saturate(140%);-webkit-backdrop-filter:blur(6px) saturate(140%);opacity:0;visibility:hidden;transition:opacity .35s ease,visibility .35s ease}.ngx-msg-overlay.show{opacity:1;visibility:visible}.ngx-msg-modal{position:relative;width:100%;max-width:400px;background-color:var(--ngx-msg-panel-bg);color:var(--ngx-msg-panel-fg);border:1px solid var(--ngx-msg-panel-border);border-radius:26px;padding:38px 30px 28px;text-align:center;box-shadow:0 30px 80px -20px #0009,0 0 0 1px #ffffff05 inset;transform:translateY(28px) scale(.92);opacity:0;transition:transform .1s,opacity .1s;overflow:hidden}.ngx-msg-overlay.show .ngx-msg-modal{animation:modalIn .55s cubic-bezier(.2,1.1,.3,1) forwards}.ngx-msg-overlay.closing .ngx-msg-modal{animation:modalOut .28s cubic-bezier(.4,0,1,1) forwards}@keyframes modalIn{0%{transform:translateY(28px) scale(.9);opacity:0}60%{transform:translateY(-4px) scale(1.015);opacity:1}to{transform:translateY(0) scale(1);opacity:1}}@keyframes modalOut{to{transform:translateY(14px) scale(.94);opacity:0}}.ngx-msg-modal:before{content:\"\";position:absolute;top:-60px;left:50%;translate:-50% 0;width:260px;height:200px;border-radius:50%;background:var(--type-glow, radial-gradient(circle, rgba(139, 123, 255, .35), transparent 70%));filter:blur(20px);pointer-events:none}.ngx-msg-modal .close-x{position:absolute;top:16px;left:16px;width:30px;height:30px;border-radius:50%;border:1px solid var(--ngx-msg-panel-border);background:#ffffff08;color:var(--ink-2);display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:14px;line-height:1;transition:background .2s,color .2s,transform .2s;transform-origin:center;font-family:none}.ngx-msg-modal .close-x:hover{background:#ffffff14;color:var(--ink-0);transform:rotate(90deg)}.ngx-msg-overlay .icon-stage{position:relative;width:96px;height:96px;margin:4px auto 22px}.ngx-msg-overlay .icon-ring{position:absolute;inset:0;border-radius:50%;background:var(--type-ring, conic-gradient(from 0deg, var(--violet), var(--cyan), var(--violet)));-webkit-mask:radial-gradient(farthest-side,transparent calc(100% - 3px),#000 calc(100% - 2.5px));mask:radial-gradient(farthest-side,transparent calc(100% - 3px),#000 calc(100% - 2.5px));opacity:0}.ngx-msg-overlay.show .icon-ring{animation:ringIn .8s .05s cubic-bezier(.2,.8,.2,1) forwards,ringSpin 6s linear infinite}@keyframes ringIn{to{opacity:1}}@keyframes ringSpin{to{transform:rotate(360deg)}}.ngx-msg-overlay .icon-disc{position:absolute;inset:8px;border-radius:50%;background:var(--type-disc, linear-gradient(150deg, var(--violet), var(--violet-2)));display:flex;align-items:center;justify-content:center;box-shadow:0 10px 30px -6px var(--type-shadow, rgba(139, 123, 255, .55));transform:scale(0)}.ngx-msg-overlay .ngx-msg-overlay.show .icon-disc{animation:discPop .6s .12s cubic-bezier(.34,1.56,.64,1) forwards}@keyframes discPop{to{transform:scale(1)}}.ngx-msg-overlay .icon-disc svg{width:46px;height:46px;overflow:visible}.ngx-msg-overlay .icon-disc .draw{fill:none;stroke:#fff;stroke-width:5.5;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:80;stroke-dashoffset:80}.ngx-msg-overlay.show .icon-disc .draw{animation:draw .5s .42s cubic-bezier(.4,0,.2,1) forwards}@keyframes draw{to{stroke-dashoffset:0}}.ngx-msg-overlay .icon-disc .dot-mark{fill:#fff;opacity:0;transform:scale(0);transform-origin:center}.ngx-msg-overlay.show .icon-disc .dot-mark{animation:dotPop .3s .55s cubic-bezier(.34,1.56,.64,1) forwards}@keyframes dotPop{to{opacity:1;transform:scale(1)}}.ngx-msg-overlay .spinner-wrap{display:flex;align-items:center;justify-content:center;width:100%;height:100%}.ngx-msg-overlay .spinner{width:52px;height:52px;border-radius:50%;border:5px solid rgba(255,255,255,.18);border-top-color:#fff;animation:spin .8s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.ngx-msg-modal h2{font-size:22px;font-weight:700;margin:0 0 10px;opacity:0;transform:translateY(8px)}.ngx-msg-modal p.desc{font-size:14.5px;line-height:1.85;color:var(--ink-1);margin:0 0 26px;opacity:0;transform:translateY(8px)}.ngx-msg-overlay.show .ngx-msg-modal h2{animation:textIn .5s .3s ease forwards}.ngx-msg-overlay.show .ngx-msg-modal p.desc{animation:textIn .5s .38s ease forwards}@keyframes textIn{to{opacity:1;transform:translateY(0)}}.ngx-msg-modal .ngx-msg-actions{display:flex;gap:10px;justify-content:center;opacity:0;transform:translateY(8px)}.ngx-msg-overlay.show .ngx-msg-modal .ngx-msg-actions{animation:textIn .5s .46s ease forwards}.ngx-msg-overlay .btn{appearance:none;border:none;cursor:pointer;font-family:inherit;font-size:14.5px;font-weight:700;padding:12px 22px;border-radius:13px;transition:transform .18s cubic-bezier(.2,.8,.2,1),filter .2s,box-shadow .2s;flex:1;max-width:170px}.ngx-msg-overlay .btn:active{transform:scale(.95)}.ngx-msg-overlay .btn-primary{color:#0a0c14;background:var(--type-btn, linear-gradient(135deg, var(--violet), var(--cyan)));box-shadow:0 10px 24px -8px var(--type-shadow, rgba(139, 123, 255, .6))}.ngx-msg-overlay .btn-primary:hover{filter:brightness(1.08);transform:translateY(-2px)}.ngx-msg-overlay .btn-ghost{color:var(--ink-1);background:#ffffff0b;border:1px solid var(--ngx-msg-panel-border)}.ngx-msg-overlay .btn-ghost:hover{color:var(--ink-0);background:#ffffff14}.ngx-msg-overlay .progress{position:absolute;bottom:0;left:0;height:3px;background:var(--type-btn, linear-gradient(90deg, var(--violet), var(--cyan)));width:100%;transform-origin:right center}.ngx-msg-overlay [dir=rtl] .progress{transform-origin:left center}@media(prefers-reduced-motion:reduce){.ngx-msg-overlay *{animation-duration:.001ms!important;animation-iteration-count:1!important;transition-duration:.001ms!important}}.ngx-msg-overlay .btn:focus-visible,.ngx-msg-overlay .trigger:focus-visible,.ngx-msg-overlay .close-x:focus-visible{outline:2px solid var(--cyan);outline-offset:2px}.ngx-msg-overlay[data-type=success] .ngx-msg-modal{--type-ring: conic-gradient(from 0deg, var(--success-a), var(--success-b), var(--success-a));--type-disc: linear-gradient(150deg, var(--success-a), var(--success-b));--type-shadow: rgba(62, 224, 143, .5);--type-btn: linear-gradient(135deg, var(--success-a), var(--success-b));--type-glow: radial-gradient(circle, rgba(62, 224, 143, .35), transparent 70%)}.ngx-msg-overlay[data-type=error] .ngx-msg-modal{--type-ring: conic-gradient(from 0deg, var(--error-a), var(--error-b), var(--error-a));--type-disc: linear-gradient(150deg, var(--error-a), var(--error-b));--type-shadow: rgba(255, 107, 139, .5);--type-btn: linear-gradient(135deg, var(--error-a), var(--error-b));--type-glow: radial-gradient(circle, rgba(255, 107, 139, .35), transparent 70%)}.ngx-msg-overlay[data-type=warning] .ngx-msg-modal{--type-ring: conic-gradient(from 0deg, var(--warning-a), var(--warning-b), var(--warning-a));--type-disc: linear-gradient(150deg, var(--warning-a), var(--warning-b));--type-shadow: rgba(255, 140, 76, .5);--type-btn: linear-gradient(135deg, var(--warning-a), var(--warning-b));--type-glow: radial-gradient(circle, rgba(255, 140, 76, .35), transparent 70%)}.ngx-msg-overlay[data-type=info] .ngx-msg-modal{--type-ring: conic-gradient(from 0deg, var(--info-a), var(--info-b), var(--info-a));--type-disc: linear-gradient(150deg, var(--info-a), var(--info-b));--type-shadow: rgba(91, 108, 255, .5);--type-btn: linear-gradient(135deg, var(--info-a), var(--info-b));--type-glow: radial-gradient(circle, rgba(91, 108, 255, .35), transparent 70%)}.ngx-msg-overlay[data-type=confirm] .ngx-msg-modal{--type-ring: conic-gradient(from 0deg, var(--confirm-a), var(--confirm-b), var(--confirm-a));--type-disc: linear-gradient(150deg, var(--confirm-a), var(--confirm-b));--type-shadow: rgba(123, 92, 255, .5);--type-btn: linear-gradient(135deg, var(--confirm-a), var(--confirm-b));--type-glow: radial-gradient(circle, rgba(123, 92, 255, .35), transparent 70%)}.ngx-msg-overlay[data-type=loading] .ngx-msg-modal{--type-disc: linear-gradient(150deg, #9aa3c0, #565c78);--type-glow: radial-gradient(circle, rgba(154, 163, 192, .3), transparent 70%)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], encapsulation: i0.ViewEncapsulation.None });
177
+ ], viewQueries: [{ propertyName: "confetti", first: true, predicate: ["confetti"], descendants: true, isSignal: true }], ngImport: i0, template: "<div\n class=\"ngx-msg-overlay show\"\n (click)=\"onOutSideClick()\"\n [ngClass]=\"options.containerClass\"\n [class.has-backdrop]=\"options.backdrop\"\n [attr.data-type]=\"options.icon\">\n <div class=\"ngx-msg-modal\" (click)=\"innerOnClick($event)\">\n <div class=\"confetti\" #confetti></div>\n @if (options.showCloseButton) {\n <button class=\"close-x\" (click)=\"close()\" aria-label=\"Close\">\u2715</button>\n }\n @if (showIcon()) {\n <div class=\"icon-stage\">\n <div class=\"icon-ring\"></div>\n <div class=\"icon-disc\" [innerHTML]=\"icon\"></div>\n </div>\n }\n <h2>{{ options.title }}</h2>\n <p class=\"desc\">\n {{ options.text }}\n <span [innerHTML]=\"options.html\"></span>\n </p>\n\n <div class=\"ngx-msg-actions\">\n @if (options.showCancelButton) {\n <button\n class=\"btn btn-ghost\"\n (click)=\"onCancel()\"\n [attr.aria-label]=\"options.cancelButtonAriaLabel\">\n {{ options.cancelButtonText }}\n </button>\n }\n @if (options.showDenyButton) {\n <button\n class=\"btn btn-ghost\"\n (click)=\"onDeny()\"\n [attr.aria-label]=\"options.denyButtonAriaLabel\">\n {{ options.denyButtonText }}\n </button>\n }\n @if (options.showConfirmButton) {\n <button\n class=\"btn btn-primary\"\n (click)=\"onConfirm()\"\n [attr.aria-label]=\"options.confirmButtonAriaLabel\">\n {{ options.confirmButtonText }}\n </button>\n }\n </div>\n </div>\n</div>\n", styles: [":root{--bg-0: #0a0c14;--bg-1: #0f1220;--ngx-msg-panel-bg: light-dark(#ffffffc4, #161928b8);--ngx-msg-panel-fg: light-dark(#000, #fff);--ngx-msg-panel-border: light-dark(#4545454a, #ffffff14);--ink-0: light-dark(#212121, #f3f4fb);--ink-1: light-dark(#2d2e32, #a8adc4);--ink-2: #6b7090;--violet: #8b7bff;--violet-2: #5b4fd1;--cyan: #43e0d8;--amber: #ffb454;--rose: #ff6b8b;--emerald: #3ee08f;--success-a: #3ee08f;--success-b: #1fb8b0;--error-a: #ff6b8b;--error-b: #c23f6b;--warning-a: #ffc45c;--warning-b: #ff8a4c;--info-a: #7cc1ff;--info-b: #5b6cff;--confirm-a: #c58bff;--confirm-b: #7b5cff}.ngx-msg-overlay{position:fixed;inset:0;z-index:50;display:flex;align-items:center;justify-content:center;padding:24px;background:#06070e8c;backdrop-filter:blur(6px) saturate(140%);-webkit-backdrop-filter:blur(6px) saturate(140%);opacity:0;visibility:hidden;transition:opacity .35s ease,visibility .35s ease}.ngx-msg-overlay.show{opacity:1;visibility:visible}.ngx-msg-modal{position:relative;width:100%;max-width:400px;background-color:var(--ngx-msg-panel-bg);color:var(--ngx-msg-panel-fg);border:1px solid var(--ngx-msg-panel-border);border-radius:26px;padding:38px 30px 28px;text-align:center;box-shadow:0 30px 80px -20px #0009,0 0 0 1px #ffffff05 inset;transform:translateY(28px) scale(.92);opacity:0;transition:transform .1s,opacity .1s;overflow:hidden}.ngx-msg-overlay.show .ngx-msg-modal{animation:modalIn .55s cubic-bezier(.2,1.1,.3,1) forwards}.ngx-msg-overlay.closing .ngx-msg-modal{animation:modalOut .28s cubic-bezier(.4,0,1,1) forwards}@keyframes modalIn{0%{transform:translateY(28px) scale(.9);opacity:0}60%{transform:translateY(-4px) scale(1.015);opacity:1}to{transform:translateY(0) scale(1);opacity:1}}@keyframes modalOut{to{transform:translateY(14px) scale(.94);opacity:0}}.ngx-msg-modal:before{content:\"\";position:absolute;top:-60px;left:50%;translate:-50% 0;width:260px;height:200px;border-radius:50%;background:var(--type-glow, radial-gradient(circle, rgba(139, 123, 255, .35), transparent 70%));filter:blur(20px);pointer-events:none}.ngx-msg-modal .close-x{position:absolute;top:4px;left:4px;width:30px;height:30px;border-radius:50%;border:none;background:none;color:var(--ink-2);display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:14px;line-height:1;transition:background .2s,color .2s,transform .2s;transform-origin:center;font-family:none}.ngx-msg-modal .close-x:hover{background:#ffffff14;color:var(--ink-0);transform:rotate(90deg)}.ngx-msg-overlay .icon-stage{position:relative;width:96px;height:96px;margin:4px auto 22px}.ngx-msg-overlay .icon-ring{position:absolute;inset:0;border-radius:50%;background:var(--type-ring, conic-gradient(from 0deg, var(--violet), var(--cyan), var(--violet)));-webkit-mask:radial-gradient(farthest-side,transparent calc(100% - 3px),#000 calc(100% - 2.5px));mask:radial-gradient(farthest-side,transparent calc(100% - 3px),#000 calc(100% - 2.5px));opacity:0}.ngx-msg-overlay.show .icon-ring{animation:ringIn .8s .05s cubic-bezier(.2,.8,.2,1) forwards,ringSpin 6s linear infinite}@keyframes ringIn{to{opacity:1}}@keyframes ringSpin{to{transform:rotate(360deg)}}.ngx-msg-overlay .icon-disc{position:absolute;inset:8px;border-radius:50%;background:var(--type-disc, linear-gradient(150deg, var(--violet), var(--violet-2)));display:flex;align-items:center;justify-content:center;box-shadow:0 10px 30px -6px var(--type-shadow, rgba(139, 123, 255, .55));transform:scale(0)}.ngx-msg-overlay.show .icon-disc{animation:discPop .6s .12s cubic-bezier(.34,1.56,.64,1) forwards}@keyframes discPop{to{transform:scale(1)}}.ngx-msg-overlay .icon-disc svg{width:46px;height:46px;overflow:visible}.ngx-msg-overlay .icon-disc .draw{fill:none;stroke:#fff;stroke-width:5.5;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:80;stroke-dashoffset:80}.ngx-msg-overlay.show .icon-disc .draw{animation:draw .5s .42s cubic-bezier(.4,0,.2,1) forwards}@keyframes draw{to{stroke-dashoffset:0}}.ngx-msg-overlay .icon-disc .dot-mark{fill:#fff;opacity:0;transform:scale(0);transform-origin:center}.ngx-msg-overlay.show .icon-disc .dot-mark{animation:dotPop .3s .55s cubic-bezier(.34,1.56,.64,1) forwards}@keyframes dotPop{to{opacity:1;transform:scale(1)}}.ngx-msg-overlay .spinner-wrap{display:flex;align-items:center;justify-content:center;width:100%;height:100%}.ngx-msg-overlay .spinner{width:52px;height:52px;border-radius:50%;border:5px solid rgba(255,255,255,.18);border-top-color:#fff;animation:spin .8s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.ngx-msg-modal h2{font-size:22px;font-weight:700;margin:0 0 10px;opacity:0;transform:translateY(8px)}.ngx-msg-modal p.desc{font-size:14.5px;line-height:1.85;color:var(--ink-1);margin:0 0 26px;opacity:0;transform:translateY(8px)}.ngx-msg-overlay.show .ngx-msg-modal h2{animation:textIn .5s .3s ease forwards}.ngx-msg-overlay.show .ngx-msg-modal p.desc{animation:textIn .5s .38s ease forwards}@keyframes textIn{to{opacity:1;transform:translateY(0)}}.ngx-msg-modal .ngx-msg-actions{display:flex;gap:10px;justify-content:center;opacity:0;transform:translateY(8px)}.ngx-msg-overlay.show .ngx-msg-modal .ngx-msg-actions{animation:textIn .5s .46s ease forwards}.ngx-msg-overlay .btn{appearance:none;border:none;cursor:pointer;font-family:inherit;font-size:14.5px;font-weight:700;padding:12px 22px;border-radius:13px;transition:transform .18s cubic-bezier(.2,.8,.2,1),filter .2s,box-shadow .2s;flex:1;max-width:170px}.ngx-msg-overlay .btn:active{transform:scale(.95)}.ngx-msg-overlay .btn-primary{color:#0a0c14;background:var(--type-btn, linear-gradient(135deg, var(--violet), var(--cyan)));box-shadow:0 10px 24px -8px var(--type-shadow, rgba(139, 123, 255, .6))}.ngx-msg-overlay .btn-primary:hover{filter:brightness(1.08);transform:translateY(-2px)}.ngx-msg-overlay .btn-ghost{color:var(--ink-1);background:#ffffff0b;border:1px solid var(--ngx-msg-panel-border)}.ngx-msg-overlay .btn-ghost:hover{color:var(--ink-0);background:#ffffff14}.ngx-msg-overlay .progress{position:absolute;bottom:0;left:0;height:3px;background:var(--type-btn, linear-gradient(90deg, var(--violet), var(--cyan)));width:100%;transform-origin:right center}.ngx-msg-overlay [dir=rtl] .progress{transform-origin:left center}@media(prefers-reduced-motion:reduce){.ngx-msg-overlay *{animation-duration:.001ms!important;animation-iteration-count:1!important;transition-duration:.001ms!important}}.ngx-msg-overlay .btn:focus-visible,.ngx-msg-overlay .trigger:focus-visible,.ngx-msg-overlay .close-x:focus-visible{outline:2px solid var(--cyan);outline-offset:2px}.ngx-msg-overlay[data-type=success] .ngx-msg-modal{--type-ring: conic-gradient(from 0deg, var(--success-a), var(--success-b), var(--success-a));--type-disc: linear-gradient(150deg, var(--success-a), var(--success-b));--type-shadow: rgba(62, 224, 143, .5);--type-btn: linear-gradient(135deg, var(--success-a), var(--success-b));--type-glow: radial-gradient(circle, rgba(62, 224, 143, .35), transparent 70%)}.ngx-msg-overlay[data-type=error] .ngx-msg-modal{--type-ring: conic-gradient(from 0deg, var(--error-a), var(--error-b), var(--error-a));--type-disc: linear-gradient(150deg, var(--error-a), var(--error-b));--type-shadow: rgba(255, 107, 139, .5);--type-btn: linear-gradient(135deg, var(--error-a), var(--error-b));--type-glow: radial-gradient(circle, rgba(255, 107, 139, .35), transparent 70%)}.ngx-msg-overlay[data-type=warning] .ngx-msg-modal{--type-ring: conic-gradient(from 0deg, var(--warning-a), var(--warning-b), var(--warning-a));--type-disc: linear-gradient(150deg, var(--warning-a), var(--warning-b));--type-shadow: rgba(255, 140, 76, .5);--type-btn: linear-gradient(135deg, var(--warning-a), var(--warning-b));--type-glow: radial-gradient(circle, rgba(255, 140, 76, .35), transparent 70%)}.ngx-msg-overlay[data-type=info] .ngx-msg-modal{--type-ring: conic-gradient(from 0deg, var(--info-a), var(--info-b), var(--info-a));--type-disc: linear-gradient(150deg, var(--info-a), var(--info-b));--type-shadow: rgba(91, 108, 255, .5);--type-btn: linear-gradient(135deg, var(--info-a), var(--info-b));--type-glow: radial-gradient(circle, rgba(91, 108, 255, .35), transparent 70%)}.ngx-msg-overlay[data-type=confirm] .ngx-msg-modal{--type-ring: conic-gradient(from 0deg, var(--confirm-a), var(--confirm-b), var(--confirm-a));--type-disc: linear-gradient(150deg, var(--confirm-a), var(--confirm-b));--type-shadow: rgba(123, 92, 255, .5);--type-btn: linear-gradient(135deg, var(--confirm-a), var(--confirm-b));--type-glow: radial-gradient(circle, rgba(123, 92, 255, .35), transparent 70%)}.ngx-msg-overlay[data-type=loading] .ngx-msg-modal{--type-disc: linear-gradient(150deg, #9aa3c0, #565c78);--type-glow: radial-gradient(circle, rgba(154, 163, 192, .3), transparent 70%)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }], encapsulation: i0.ViewEncapsulation.None });
162
178
  }
163
179
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NgxMessageComponent, decorators: [{
164
180
  type: Component,
@@ -167,7 +183,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImpor
167
183
  provide: NGX_MESSAGE_CONFIGS,
168
184
  useValue: NGX_MESSAGE_DEFAULT_OPTIONS,
169
185
  },
170
- ], template: "<div\r\n class=\"ngx-msg-overlay show\"\r\n (click)=\"onOutSideClick()\"\r\n [ngClass]=\"options.containerClass\"\r\n [class.has-backdrop]=\"options.backdrop\"\r\n [attr.data-type]=\"options.icon\">\r\n <div class=\"ngx-msg-modal\" (click)=\"innerOnClick($event)\">\r\n <div class=\"confetti\" #confetti></div>\r\n @if (options.showCloseButton) {\r\n <button class=\"close-x\" (click)=\"close()\" aria-label=\"Close\">\u2715</button>\r\n }\r\n @if (showIcon()) {\r\n <div class=\"icon-stage\">\r\n <div class=\"icon-ring\"></div>\r\n <div class=\"icon-disc\" [innerHTML]=\"icon\"></div>\r\n </div>\r\n }\r\n <h2>{{ options.title }}</h2>\r\n <p class=\"desc\">\r\n {{ options.text }}\r\n <span [innerHTML]=\"options.html\"></span>\r\n </p>\r\n\r\n <div class=\"ngx-msg-actions\">\r\n @if (options.showCancelButton) {\r\n <button\r\n class=\"btn btn-ghost\"\r\n (click)=\"onCancel()\"\r\n [attr.aria-label]=\"options.cancelButtonAriaLabel\">\r\n {{ options.cancelButtonText }}\r\n </button>\r\n }\r\n @if (options.showDenyButton) {\r\n <button\r\n class=\"btn btn-ghost\"\r\n (click)=\"onDeny()\"\r\n [attr.aria-label]=\"options.denyButtonAriaLabel\">\r\n {{ options.denyButtonText }}\r\n </button>\r\n }\r\n @if (options.showConfirmButton) {\r\n <button\r\n class=\"btn btn-primary\"\r\n (click)=\"onConfirm()\"\r\n [attr.aria-label]=\"options.confirmButtonAriaLabel\">\r\n {{ options.confirmButtonText }}\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n</div>\r\n", styles: [":root{--bg-0: #0a0c14;--bg-1: #0f1220;--ngx-msg-panel-bg: light-dark(#ffffffc4, #161928b8);--ngx-msg-panel-fg: light-dark(#000, #fff);--ngx-msg-panel-border: light-dark(#4545454a, #ffffff14);--ink-0: light-dark(#212121 #f3f4fb);--ink-1: light-dark(#2d2e32, #a8adc4);--ink-2: #6b7090;--violet: #8b7bff;--violet-2: #5b4fd1;--cyan: #43e0d8;--amber: #ffb454;--rose: #ff6b8b;--emerald: #3ee08f;--success-a: #3ee08f;--success-b: #1fb8b0;--error-a: #ff6b8b;--error-b: #c23f6b;--warning-a: #ffc45c;--warning-b: #ff8a4c;--info-a: #7cc1ff;--info-b: #5b6cff;--confirm-a: #c58bff;--confirm-b: #7b5cff}.ngx-msg-overlay{position:fixed;inset:0;z-index:50;display:flex;align-items:center;justify-content:center;padding:24px;background:#06070e8c;backdrop-filter:blur(6px) saturate(140%);-webkit-backdrop-filter:blur(6px) saturate(140%);opacity:0;visibility:hidden;transition:opacity .35s ease,visibility .35s ease}.ngx-msg-overlay.show{opacity:1;visibility:visible}.ngx-msg-modal{position:relative;width:100%;max-width:400px;background-color:var(--ngx-msg-panel-bg);color:var(--ngx-msg-panel-fg);border:1px solid var(--ngx-msg-panel-border);border-radius:26px;padding:38px 30px 28px;text-align:center;box-shadow:0 30px 80px -20px #0009,0 0 0 1px #ffffff05 inset;transform:translateY(28px) scale(.92);opacity:0;transition:transform .1s,opacity .1s;overflow:hidden}.ngx-msg-overlay.show .ngx-msg-modal{animation:modalIn .55s cubic-bezier(.2,1.1,.3,1) forwards}.ngx-msg-overlay.closing .ngx-msg-modal{animation:modalOut .28s cubic-bezier(.4,0,1,1) forwards}@keyframes modalIn{0%{transform:translateY(28px) scale(.9);opacity:0}60%{transform:translateY(-4px) scale(1.015);opacity:1}to{transform:translateY(0) scale(1);opacity:1}}@keyframes modalOut{to{transform:translateY(14px) scale(.94);opacity:0}}.ngx-msg-modal:before{content:\"\";position:absolute;top:-60px;left:50%;translate:-50% 0;width:260px;height:200px;border-radius:50%;background:var(--type-glow, radial-gradient(circle, rgba(139, 123, 255, .35), transparent 70%));filter:blur(20px);pointer-events:none}.ngx-msg-modal .close-x{position:absolute;top:16px;left:16px;width:30px;height:30px;border-radius:50%;border:1px solid var(--ngx-msg-panel-border);background:#ffffff08;color:var(--ink-2);display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:14px;line-height:1;transition:background .2s,color .2s,transform .2s;transform-origin:center;font-family:none}.ngx-msg-modal .close-x:hover{background:#ffffff14;color:var(--ink-0);transform:rotate(90deg)}.ngx-msg-overlay .icon-stage{position:relative;width:96px;height:96px;margin:4px auto 22px}.ngx-msg-overlay .icon-ring{position:absolute;inset:0;border-radius:50%;background:var(--type-ring, conic-gradient(from 0deg, var(--violet), var(--cyan), var(--violet)));-webkit-mask:radial-gradient(farthest-side,transparent calc(100% - 3px),#000 calc(100% - 2.5px));mask:radial-gradient(farthest-side,transparent calc(100% - 3px),#000 calc(100% - 2.5px));opacity:0}.ngx-msg-overlay.show .icon-ring{animation:ringIn .8s .05s cubic-bezier(.2,.8,.2,1) forwards,ringSpin 6s linear infinite}@keyframes ringIn{to{opacity:1}}@keyframes ringSpin{to{transform:rotate(360deg)}}.ngx-msg-overlay .icon-disc{position:absolute;inset:8px;border-radius:50%;background:var(--type-disc, linear-gradient(150deg, var(--violet), var(--violet-2)));display:flex;align-items:center;justify-content:center;box-shadow:0 10px 30px -6px var(--type-shadow, rgba(139, 123, 255, .55));transform:scale(0)}.ngx-msg-overlay .ngx-msg-overlay.show .icon-disc{animation:discPop .6s .12s cubic-bezier(.34,1.56,.64,1) forwards}@keyframes discPop{to{transform:scale(1)}}.ngx-msg-overlay .icon-disc svg{width:46px;height:46px;overflow:visible}.ngx-msg-overlay .icon-disc .draw{fill:none;stroke:#fff;stroke-width:5.5;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:80;stroke-dashoffset:80}.ngx-msg-overlay.show .icon-disc .draw{animation:draw .5s .42s cubic-bezier(.4,0,.2,1) forwards}@keyframes draw{to{stroke-dashoffset:0}}.ngx-msg-overlay .icon-disc .dot-mark{fill:#fff;opacity:0;transform:scale(0);transform-origin:center}.ngx-msg-overlay.show .icon-disc .dot-mark{animation:dotPop .3s .55s cubic-bezier(.34,1.56,.64,1) forwards}@keyframes dotPop{to{opacity:1;transform:scale(1)}}.ngx-msg-overlay .spinner-wrap{display:flex;align-items:center;justify-content:center;width:100%;height:100%}.ngx-msg-overlay .spinner{width:52px;height:52px;border-radius:50%;border:5px solid rgba(255,255,255,.18);border-top-color:#fff;animation:spin .8s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.ngx-msg-modal h2{font-size:22px;font-weight:700;margin:0 0 10px;opacity:0;transform:translateY(8px)}.ngx-msg-modal p.desc{font-size:14.5px;line-height:1.85;color:var(--ink-1);margin:0 0 26px;opacity:0;transform:translateY(8px)}.ngx-msg-overlay.show .ngx-msg-modal h2{animation:textIn .5s .3s ease forwards}.ngx-msg-overlay.show .ngx-msg-modal p.desc{animation:textIn .5s .38s ease forwards}@keyframes textIn{to{opacity:1;transform:translateY(0)}}.ngx-msg-modal .ngx-msg-actions{display:flex;gap:10px;justify-content:center;opacity:0;transform:translateY(8px)}.ngx-msg-overlay.show .ngx-msg-modal .ngx-msg-actions{animation:textIn .5s .46s ease forwards}.ngx-msg-overlay .btn{appearance:none;border:none;cursor:pointer;font-family:inherit;font-size:14.5px;font-weight:700;padding:12px 22px;border-radius:13px;transition:transform .18s cubic-bezier(.2,.8,.2,1),filter .2s,box-shadow .2s;flex:1;max-width:170px}.ngx-msg-overlay .btn:active{transform:scale(.95)}.ngx-msg-overlay .btn-primary{color:#0a0c14;background:var(--type-btn, linear-gradient(135deg, var(--violet), var(--cyan)));box-shadow:0 10px 24px -8px var(--type-shadow, rgba(139, 123, 255, .6))}.ngx-msg-overlay .btn-primary:hover{filter:brightness(1.08);transform:translateY(-2px)}.ngx-msg-overlay .btn-ghost{color:var(--ink-1);background:#ffffff0b;border:1px solid var(--ngx-msg-panel-border)}.ngx-msg-overlay .btn-ghost:hover{color:var(--ink-0);background:#ffffff14}.ngx-msg-overlay .progress{position:absolute;bottom:0;left:0;height:3px;background:var(--type-btn, linear-gradient(90deg, var(--violet), var(--cyan)));width:100%;transform-origin:right center}.ngx-msg-overlay [dir=rtl] .progress{transform-origin:left center}@media(prefers-reduced-motion:reduce){.ngx-msg-overlay *{animation-duration:.001ms!important;animation-iteration-count:1!important;transition-duration:.001ms!important}}.ngx-msg-overlay .btn:focus-visible,.ngx-msg-overlay .trigger:focus-visible,.ngx-msg-overlay .close-x:focus-visible{outline:2px solid var(--cyan);outline-offset:2px}.ngx-msg-overlay[data-type=success] .ngx-msg-modal{--type-ring: conic-gradient(from 0deg, var(--success-a), var(--success-b), var(--success-a));--type-disc: linear-gradient(150deg, var(--success-a), var(--success-b));--type-shadow: rgba(62, 224, 143, .5);--type-btn: linear-gradient(135deg, var(--success-a), var(--success-b));--type-glow: radial-gradient(circle, rgba(62, 224, 143, .35), transparent 70%)}.ngx-msg-overlay[data-type=error] .ngx-msg-modal{--type-ring: conic-gradient(from 0deg, var(--error-a), var(--error-b), var(--error-a));--type-disc: linear-gradient(150deg, var(--error-a), var(--error-b));--type-shadow: rgba(255, 107, 139, .5);--type-btn: linear-gradient(135deg, var(--error-a), var(--error-b));--type-glow: radial-gradient(circle, rgba(255, 107, 139, .35), transparent 70%)}.ngx-msg-overlay[data-type=warning] .ngx-msg-modal{--type-ring: conic-gradient(from 0deg, var(--warning-a), var(--warning-b), var(--warning-a));--type-disc: linear-gradient(150deg, var(--warning-a), var(--warning-b));--type-shadow: rgba(255, 140, 76, .5);--type-btn: linear-gradient(135deg, var(--warning-a), var(--warning-b));--type-glow: radial-gradient(circle, rgba(255, 140, 76, .35), transparent 70%)}.ngx-msg-overlay[data-type=info] .ngx-msg-modal{--type-ring: conic-gradient(from 0deg, var(--info-a), var(--info-b), var(--info-a));--type-disc: linear-gradient(150deg, var(--info-a), var(--info-b));--type-shadow: rgba(91, 108, 255, .5);--type-btn: linear-gradient(135deg, var(--info-a), var(--info-b));--type-glow: radial-gradient(circle, rgba(91, 108, 255, .35), transparent 70%)}.ngx-msg-overlay[data-type=confirm] .ngx-msg-modal{--type-ring: conic-gradient(from 0deg, var(--confirm-a), var(--confirm-b), var(--confirm-a));--type-disc: linear-gradient(150deg, var(--confirm-a), var(--confirm-b));--type-shadow: rgba(123, 92, 255, .5);--type-btn: linear-gradient(135deg, var(--confirm-a), var(--confirm-b));--type-glow: radial-gradient(circle, rgba(123, 92, 255, .35), transparent 70%)}.ngx-msg-overlay[data-type=loading] .ngx-msg-modal{--type-disc: linear-gradient(150deg, #9aa3c0, #565c78);--type-glow: radial-gradient(circle, rgba(154, 163, 192, .3), transparent 70%)}\n"] }]
186
+ ], template: "<div\n class=\"ngx-msg-overlay show\"\n (click)=\"onOutSideClick()\"\n [ngClass]=\"options.containerClass\"\n [class.has-backdrop]=\"options.backdrop\"\n [attr.data-type]=\"options.icon\">\n <div class=\"ngx-msg-modal\" (click)=\"innerOnClick($event)\">\n <div class=\"confetti\" #confetti></div>\n @if (options.showCloseButton) {\n <button class=\"close-x\" (click)=\"close()\" aria-label=\"Close\">\u2715</button>\n }\n @if (showIcon()) {\n <div class=\"icon-stage\">\n <div class=\"icon-ring\"></div>\n <div class=\"icon-disc\" [innerHTML]=\"icon\"></div>\n </div>\n }\n <h2>{{ options.title }}</h2>\n <p class=\"desc\">\n {{ options.text }}\n <span [innerHTML]=\"options.html\"></span>\n </p>\n\n <div class=\"ngx-msg-actions\">\n @if (options.showCancelButton) {\n <button\n class=\"btn btn-ghost\"\n (click)=\"onCancel()\"\n [attr.aria-label]=\"options.cancelButtonAriaLabel\">\n {{ options.cancelButtonText }}\n </button>\n }\n @if (options.showDenyButton) {\n <button\n class=\"btn btn-ghost\"\n (click)=\"onDeny()\"\n [attr.aria-label]=\"options.denyButtonAriaLabel\">\n {{ options.denyButtonText }}\n </button>\n }\n @if (options.showConfirmButton) {\n <button\n class=\"btn btn-primary\"\n (click)=\"onConfirm()\"\n [attr.aria-label]=\"options.confirmButtonAriaLabel\">\n {{ options.confirmButtonText }}\n </button>\n }\n </div>\n </div>\n</div>\n", styles: [":root{--bg-0: #0a0c14;--bg-1: #0f1220;--ngx-msg-panel-bg: light-dark(#ffffffc4, #161928b8);--ngx-msg-panel-fg: light-dark(#000, #fff);--ngx-msg-panel-border: light-dark(#4545454a, #ffffff14);--ink-0: light-dark(#212121, #f3f4fb);--ink-1: light-dark(#2d2e32, #a8adc4);--ink-2: #6b7090;--violet: #8b7bff;--violet-2: #5b4fd1;--cyan: #43e0d8;--amber: #ffb454;--rose: #ff6b8b;--emerald: #3ee08f;--success-a: #3ee08f;--success-b: #1fb8b0;--error-a: #ff6b8b;--error-b: #c23f6b;--warning-a: #ffc45c;--warning-b: #ff8a4c;--info-a: #7cc1ff;--info-b: #5b6cff;--confirm-a: #c58bff;--confirm-b: #7b5cff}.ngx-msg-overlay{position:fixed;inset:0;z-index:50;display:flex;align-items:center;justify-content:center;padding:24px;background:#06070e8c;backdrop-filter:blur(6px) saturate(140%);-webkit-backdrop-filter:blur(6px) saturate(140%);opacity:0;visibility:hidden;transition:opacity .35s ease,visibility .35s ease}.ngx-msg-overlay.show{opacity:1;visibility:visible}.ngx-msg-modal{position:relative;width:100%;max-width:400px;background-color:var(--ngx-msg-panel-bg);color:var(--ngx-msg-panel-fg);border:1px solid var(--ngx-msg-panel-border);border-radius:26px;padding:38px 30px 28px;text-align:center;box-shadow:0 30px 80px -20px #0009,0 0 0 1px #ffffff05 inset;transform:translateY(28px) scale(.92);opacity:0;transition:transform .1s,opacity .1s;overflow:hidden}.ngx-msg-overlay.show .ngx-msg-modal{animation:modalIn .55s cubic-bezier(.2,1.1,.3,1) forwards}.ngx-msg-overlay.closing .ngx-msg-modal{animation:modalOut .28s cubic-bezier(.4,0,1,1) forwards}@keyframes modalIn{0%{transform:translateY(28px) scale(.9);opacity:0}60%{transform:translateY(-4px) scale(1.015);opacity:1}to{transform:translateY(0) scale(1);opacity:1}}@keyframes modalOut{to{transform:translateY(14px) scale(.94);opacity:0}}.ngx-msg-modal:before{content:\"\";position:absolute;top:-60px;left:50%;translate:-50% 0;width:260px;height:200px;border-radius:50%;background:var(--type-glow, radial-gradient(circle, rgba(139, 123, 255, .35), transparent 70%));filter:blur(20px);pointer-events:none}.ngx-msg-modal .close-x{position:absolute;top:4px;left:4px;width:30px;height:30px;border-radius:50%;border:none;background:none;color:var(--ink-2);display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:14px;line-height:1;transition:background .2s,color .2s,transform .2s;transform-origin:center;font-family:none}.ngx-msg-modal .close-x:hover{background:#ffffff14;color:var(--ink-0);transform:rotate(90deg)}.ngx-msg-overlay .icon-stage{position:relative;width:96px;height:96px;margin:4px auto 22px}.ngx-msg-overlay .icon-ring{position:absolute;inset:0;border-radius:50%;background:var(--type-ring, conic-gradient(from 0deg, var(--violet), var(--cyan), var(--violet)));-webkit-mask:radial-gradient(farthest-side,transparent calc(100% - 3px),#000 calc(100% - 2.5px));mask:radial-gradient(farthest-side,transparent calc(100% - 3px),#000 calc(100% - 2.5px));opacity:0}.ngx-msg-overlay.show .icon-ring{animation:ringIn .8s .05s cubic-bezier(.2,.8,.2,1) forwards,ringSpin 6s linear infinite}@keyframes ringIn{to{opacity:1}}@keyframes ringSpin{to{transform:rotate(360deg)}}.ngx-msg-overlay .icon-disc{position:absolute;inset:8px;border-radius:50%;background:var(--type-disc, linear-gradient(150deg, var(--violet), var(--violet-2)));display:flex;align-items:center;justify-content:center;box-shadow:0 10px 30px -6px var(--type-shadow, rgba(139, 123, 255, .55));transform:scale(0)}.ngx-msg-overlay.show .icon-disc{animation:discPop .6s .12s cubic-bezier(.34,1.56,.64,1) forwards}@keyframes discPop{to{transform:scale(1)}}.ngx-msg-overlay .icon-disc svg{width:46px;height:46px;overflow:visible}.ngx-msg-overlay .icon-disc .draw{fill:none;stroke:#fff;stroke-width:5.5;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:80;stroke-dashoffset:80}.ngx-msg-overlay.show .icon-disc .draw{animation:draw .5s .42s cubic-bezier(.4,0,.2,1) forwards}@keyframes draw{to{stroke-dashoffset:0}}.ngx-msg-overlay .icon-disc .dot-mark{fill:#fff;opacity:0;transform:scale(0);transform-origin:center}.ngx-msg-overlay.show .icon-disc .dot-mark{animation:dotPop .3s .55s cubic-bezier(.34,1.56,.64,1) forwards}@keyframes dotPop{to{opacity:1;transform:scale(1)}}.ngx-msg-overlay .spinner-wrap{display:flex;align-items:center;justify-content:center;width:100%;height:100%}.ngx-msg-overlay .spinner{width:52px;height:52px;border-radius:50%;border:5px solid rgba(255,255,255,.18);border-top-color:#fff;animation:spin .8s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.ngx-msg-modal h2{font-size:22px;font-weight:700;margin:0 0 10px;opacity:0;transform:translateY(8px)}.ngx-msg-modal p.desc{font-size:14.5px;line-height:1.85;color:var(--ink-1);margin:0 0 26px;opacity:0;transform:translateY(8px)}.ngx-msg-overlay.show .ngx-msg-modal h2{animation:textIn .5s .3s ease forwards}.ngx-msg-overlay.show .ngx-msg-modal p.desc{animation:textIn .5s .38s ease forwards}@keyframes textIn{to{opacity:1;transform:translateY(0)}}.ngx-msg-modal .ngx-msg-actions{display:flex;gap:10px;justify-content:center;opacity:0;transform:translateY(8px)}.ngx-msg-overlay.show .ngx-msg-modal .ngx-msg-actions{animation:textIn .5s .46s ease forwards}.ngx-msg-overlay .btn{appearance:none;border:none;cursor:pointer;font-family:inherit;font-size:14.5px;font-weight:700;padding:12px 22px;border-radius:13px;transition:transform .18s cubic-bezier(.2,.8,.2,1),filter .2s,box-shadow .2s;flex:1;max-width:170px}.ngx-msg-overlay .btn:active{transform:scale(.95)}.ngx-msg-overlay .btn-primary{color:#0a0c14;background:var(--type-btn, linear-gradient(135deg, var(--violet), var(--cyan)));box-shadow:0 10px 24px -8px var(--type-shadow, rgba(139, 123, 255, .6))}.ngx-msg-overlay .btn-primary:hover{filter:brightness(1.08);transform:translateY(-2px)}.ngx-msg-overlay .btn-ghost{color:var(--ink-1);background:#ffffff0b;border:1px solid var(--ngx-msg-panel-border)}.ngx-msg-overlay .btn-ghost:hover{color:var(--ink-0);background:#ffffff14}.ngx-msg-overlay .progress{position:absolute;bottom:0;left:0;height:3px;background:var(--type-btn, linear-gradient(90deg, var(--violet), var(--cyan)));width:100%;transform-origin:right center}.ngx-msg-overlay [dir=rtl] .progress{transform-origin:left center}@media(prefers-reduced-motion:reduce){.ngx-msg-overlay *{animation-duration:.001ms!important;animation-iteration-count:1!important;transition-duration:.001ms!important}}.ngx-msg-overlay .btn:focus-visible,.ngx-msg-overlay .trigger:focus-visible,.ngx-msg-overlay .close-x:focus-visible{outline:2px solid var(--cyan);outline-offset:2px}.ngx-msg-overlay[data-type=success] .ngx-msg-modal{--type-ring: conic-gradient(from 0deg, var(--success-a), var(--success-b), var(--success-a));--type-disc: linear-gradient(150deg, var(--success-a), var(--success-b));--type-shadow: rgba(62, 224, 143, .5);--type-btn: linear-gradient(135deg, var(--success-a), var(--success-b));--type-glow: radial-gradient(circle, rgba(62, 224, 143, .35), transparent 70%)}.ngx-msg-overlay[data-type=error] .ngx-msg-modal{--type-ring: conic-gradient(from 0deg, var(--error-a), var(--error-b), var(--error-a));--type-disc: linear-gradient(150deg, var(--error-a), var(--error-b));--type-shadow: rgba(255, 107, 139, .5);--type-btn: linear-gradient(135deg, var(--error-a), var(--error-b));--type-glow: radial-gradient(circle, rgba(255, 107, 139, .35), transparent 70%)}.ngx-msg-overlay[data-type=warning] .ngx-msg-modal{--type-ring: conic-gradient(from 0deg, var(--warning-a), var(--warning-b), var(--warning-a));--type-disc: linear-gradient(150deg, var(--warning-a), var(--warning-b));--type-shadow: rgba(255, 140, 76, .5);--type-btn: linear-gradient(135deg, var(--warning-a), var(--warning-b));--type-glow: radial-gradient(circle, rgba(255, 140, 76, .35), transparent 70%)}.ngx-msg-overlay[data-type=info] .ngx-msg-modal{--type-ring: conic-gradient(from 0deg, var(--info-a), var(--info-b), var(--info-a));--type-disc: linear-gradient(150deg, var(--info-a), var(--info-b));--type-shadow: rgba(91, 108, 255, .5);--type-btn: linear-gradient(135deg, var(--info-a), var(--info-b));--type-glow: radial-gradient(circle, rgba(91, 108, 255, .35), transparent 70%)}.ngx-msg-overlay[data-type=confirm] .ngx-msg-modal{--type-ring: conic-gradient(from 0deg, var(--confirm-a), var(--confirm-b), var(--confirm-a));--type-disc: linear-gradient(150deg, var(--confirm-a), var(--confirm-b));--type-shadow: rgba(123, 92, 255, .5);--type-btn: linear-gradient(135deg, var(--confirm-a), var(--confirm-b));--type-glow: radial-gradient(circle, rgba(123, 92, 255, .35), transparent 70%)}.ngx-msg-overlay[data-type=loading] .ngx-msg-modal{--type-disc: linear-gradient(150deg, #9aa3c0, #565c78);--type-glow: radial-gradient(circle, rgba(154, 163, 192, .3), transparent 70%)}\n"] }]
171
187
  }], propDecorators: { confetti: [{ type: i0.ViewChild, args: ['confetti', { isSignal: true }] }], onScapeKey: [{
172
188
  type: HostListener,
173
189
  args: ['document:keydown.escape', ['$event']]
@@ -194,8 +210,14 @@ class NgxMessageService {
194
210
  injector;
195
211
  envInjector;
196
212
  _doc;
197
- currentAdIndex = -1;
198
- alerts = [];
213
+ // قبلاً یه آرایه‌ی معمولی بود (`ComponentRef[]`) و removeDialogComponentFromBody
214
+ // فقط componentRef رو destroy می‌کرد ولی هیچ‌وقت از آرایه حذفش نمی‌کرد — یعنی
215
+ // این سرویس (که providedIn:'root' و singleton سراسریه) به ازای هر پیامی که
216
+ // تا حالا تو کل عمر اپ نشون داده شده، یک رفرنس destroy-شده رو برای همیشه نگه
217
+ // می‌داشت: یک نشتی حافظه‌ی پیوسته. با Map<id, ComponentRef> جایگزین شد که
218
+ // با delete واقعاً entry رو آزاد می‌کنه؛ کلید هم شناسه‌ی پایدارِ پیام (insertedId)
219
+ // هست، نه موقعیتِ آرایه (که با splice ممکن بود جابه‌جا و نامعتبر بشه).
220
+ alerts = new Map();
199
221
  insertedId = 0;
200
222
  constructor(appRef, injector, envInjector, _doc) {
201
223
  this.appRef = appRef;
@@ -210,36 +232,37 @@ class NgxMessageService {
210
232
  environmentInjector: this.envInjector,
211
233
  });
212
234
  this.appRef.attachView(componentRef.hostView);
235
+ const id = this.insertedId++;
213
236
  const payload = {
214
237
  close: () => componentRef.instance.close(),
215
- id: this.insertedId,
238
+ id,
216
239
  afterClose: new EventEmitter(),
217
240
  };
218
241
  this.appendDialogComponentToBody(componentRef, config);
219
242
  componentRef.instance.options = config;
220
- componentRef.instance.index = this.insertedId;
243
+ componentRef.instance.index = id;
221
244
  componentRef.instance.onClose.subscribe((result) => {
222
245
  this.removeDialogComponentFromBody(result.index);
223
246
  payload.afterClose.emit(result.result);
224
247
  });
225
- this.alerts.push(componentRef);
226
- this.insertedId++;
248
+ this.alerts.set(id, componentRef);
227
249
  return payload;
228
250
  }
229
- removeDialogComponentFromBody(index) {
230
- if (this.alerts[index]) {
231
- const domElem = this.alerts[index].hostView
232
- .rootNodes[0];
233
- // قبل از destroy باید hidePopover صدا بزنیم
234
- if (domElem.popover === 'manual') {
235
- try {
236
- domElem.hidePopover();
237
- }
238
- catch { }
251
+ removeDialogComponentFromBody(id) {
252
+ const ref = this.alerts.get(id);
253
+ if (!ref)
254
+ return;
255
+ const domElem = ref.hostView.rootNodes[0];
256
+ // قبل از destroy باید hidePopover صدا بزنیم
257
+ if (domElem.popover === 'manual') {
258
+ try {
259
+ domElem.hidePopover();
239
260
  }
240
- this.appRef.detachView(this.alerts[index].hostView);
241
- this.alerts[index].destroy();
261
+ catch { }
242
262
  }
263
+ this.appRef.detachView(ref.hostView);
264
+ ref.destroy();
265
+ this.alerts.delete(id);
243
266
  }
244
267
  appendDialogComponentToBody(componentRef, config) {
245
268
  const domElem = componentRef.hostView.rootNodes[0];
@@ -256,8 +279,8 @@ class NgxMessageService {
256
279
  }
257
280
  }
258
281
  closeAll() {
259
- for (let i = 0; i < this.alerts.length; i++) {
260
- this.removeDialogComponentFromBody(i);
282
+ for (const id of [...this.alerts.keys()]) {
283
+ this.removeDialogComponentFromBody(id);
261
284
  }
262
285
  }
263
286
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NgxMessageService, deps: [{ token: i0.ApplicationRef }, { token: i0.Injector }, { token: i0.EnvironmentInjector }, { token: DOCUMENT$1 }], target: i0.ɵɵFactoryTarget.Injectable });
@@ -337,6 +360,8 @@ class MSG {
337
360
  });
338
361
  }
339
362
  }
363
+ class Modal extends MSG {
364
+ }
340
365
 
341
366
  function provideMessage(options) {
342
367
  return makeEnvironmentProviders([
@@ -350,6 +375,7 @@ function provideMessage(options) {
350
375
  },
351
376
  provideEnvironmentInitializer(() => {
352
377
  MSG.injector = inject(Injector);
378
+ Modal.injector = inject(Injector);
353
379
  }),
354
380
  ]);
355
381
  }
@@ -396,5 +422,5 @@ class MessageOptions {
396
422
  * Generated bundle index. Do not edit.
397
423
  */
398
424
 
399
- export { DismissReason, MSG, MessageOptions, NGX_MESSAGE_API, NGX_MESSAGE_CONFIGS, NGX_MESSAGE_DEFAULT_OPTIONS, NgxMessageService, provideMessage };
425
+ export { DismissReason, MSG, MessageOptions, Modal, NGX_MESSAGE_API, NGX_MESSAGE_CONFIGS, NGX_MESSAGE_DEFAULT_OPTIONS, NgxMessageService, provideMessage };
400
426
  //# sourceMappingURL=ngx-kit-message.mjs.map