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
@@ -1,7 +1,7 @@
1
1
  import * as i1 from '@angular/common';
2
- import { DOCUMENT, CommonModule } from '@angular/common';
2
+ import { DOCUMENT, isPlatformServer, CommonModule } from '@angular/common';
3
3
  import * as i0 from '@angular/core';
4
- import { InjectionToken, inject, Directive, Input, Inject, ChangeDetectorRef, ViewChild, ChangeDetectionStrategy, Component, Injector, runInInjectionContext, createComponent, Injectable, Optional, SkipSelf, NgModule } from '@angular/core';
4
+ import { InjectionToken, inject, Directive, Input, Inject, ChangeDetectorRef, ViewChild, ChangeDetectionStrategy, Component, Injector, runInInjectionContext, createComponent, Injectable, PLATFORM_ID, Optional, SkipSelf, NgModule } from '@angular/core';
5
5
  import { Subject } from 'rxjs';
6
6
  import { randomStrnig } from 'ngx-kit/shared';
7
7
 
@@ -192,11 +192,11 @@ class NgxDialogComponent {
192
192
  }
193
193
  }
194
194
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NgxDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
195
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.4", type: NgxDialogComponent, isStandalone: false, selector: "ng-component", viewQueries: [{ propertyName: "ngxDialog", first: true, predicate: ["ngxDialog"], descendants: true }], ngImport: i0, template: "<div class=\"ngx-dialog-overlay\" (click)=\"onOverlayClicked($event)\">\r\n <div class=\"ngx-dialog\" (click)=\"onDialogClicked($event)\" #ngxDialog>\r\n <ng-container *ngComponentOutlet=\"component\"></ng-container>\r\n </div>\r\n</div>", styles: [".ngx-dialog-overlay{display:flex;flex-direction:column;position:fixed;inset:0;background:#0000004d;align-items:center;justify-content:center;transition:opacity .4s cubic-bezier(.25,.8,.25,1);z-index:999}::ng-deep .ngx-dialog{box-shadow:0 0 28px #3c3c3cd6;display:flex;flex-direction:column;border-radius:5px;overflow:hidden;background-color:var(--panel-bg, white);color:var(--side-config-fg, #000000);box-sizing:border-box;animation:ShowDialog .2s cubic-bezier(.25,.8,.25,1)}::ng-deep .ngx-dialog .dialog-header{display:block;background:#1180f3;display:flex;align-items:center;justify-content:space-between;padding:5px 15px;color:#fff;font-size:.8rem;box-sizing:border-box;height:35px}::ng-deep .ngx-dialog .dialog-header .close-btn{background:none;cursor:pointer;border:none;color:#fff}::ng-deep .ngx-dialog .dialog-body{display:block;overflow:auto;padding:20px;box-sizing:border-box}::ng-deep .ngx-dialog .dialog-footer{display:block;box-shadow:0 0 10px #72727252;padding:0 15px;display:flex;align-items:center;min-height:44px}::ng-deep .ngx-dialog .dialog-footer.align-start{justify-content:flex-start}::ng-deep .ngx-dialog .dialog-footer.align-end{justify-content:flex-end}::ng-deep .ngx-dialog .dialog-footer.align-space-between{justify-content:space-between}::ng-deep .ngx-dialog .dialog-footer.align-center{justify-content:center}::ng-deep .ngx-dialog .dialog-footer.align-space-around{justify-content:space-around}@keyframes ShowDialog{0%{transform:translate(0) scale(0)}to{transform:translate(0) scale(1)}}\n"], dependencies: [{ kind: "directive", type: i1.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule"], exportAs: ["ngComponentOutlet"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
195
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.0.4", type: NgxDialogComponent, isStandalone: false, selector: "ng-component", viewQueries: [{ propertyName: "ngxDialog", first: true, predicate: ["ngxDialog"], descendants: true }], ngImport: i0, template: "<div class=\"ngx-dialog-overlay\" (click)=\"onOverlayClicked($event)\">\n <div class=\"ngx-dialog\" (click)=\"onDialogClicked($event)\" #ngxDialog>\n <ng-container *ngComponentOutlet=\"component\"></ng-container>\n </div>\n</div>\n", styles: [".ngx-dialog-overlay{display:flex;flex-direction:column;position:fixed;inset:0;background:#0000004d;align-items:center;justify-content:center;transition:opacity .4s cubic-bezier(.25,.8,.25,1);z-index:999}::ng-deep .ngx-dialog{--ngx-dialog-bg: light-dark(#ffffff, #1c1c22);--ngx-dialog-fg: light-dark(#000000, #f0f0f5);--ngx-dialog-header-bg: light-dark(#1180f3, #2563eb);--ngx-dialog-header-fg: #ffffff;box-shadow:0 0 28px #3c3c3cd6;display:flex;flex-direction:column;border-radius:5px;overflow:hidden;background-color:var(--panel-bg, var(--ngx-dialog-bg));color:var(--side-config-fg, var(--ngx-dialog-fg));box-sizing:border-box;animation:ShowDialog .2s cubic-bezier(.25,.8,.25,1)}::ng-deep .ngx-dialog .dialog-header{display:block;background:var(--ngx-dialog-header-bg);display:flex;align-items:center;justify-content:space-between;padding:5px 15px;color:var(--ngx-dialog-header-fg);font-size:.8rem;box-sizing:border-box;height:35px}::ng-deep .ngx-dialog .dialog-header .close-btn{background:none;cursor:pointer;border:none;color:var(--ngx-dialog-header-fg)}::ng-deep .ngx-dialog .dialog-body{display:block;overflow:auto;padding:20px;box-sizing:border-box}::ng-deep .ngx-dialog .dialog-footer{display:block;box-shadow:0 0 10px #72727252;padding:0 15px;display:flex;align-items:center;min-height:44px}::ng-deep .ngx-dialog .dialog-footer.align-start{justify-content:flex-start}::ng-deep .ngx-dialog .dialog-footer.align-end{justify-content:flex-end}::ng-deep .ngx-dialog .dialog-footer.align-space-between{justify-content:space-between}::ng-deep .ngx-dialog .dialog-footer.align-center{justify-content:center}::ng-deep .ngx-dialog .dialog-footer.align-space-around{justify-content:space-around}@keyframes ShowDialog{0%{transform:translate(0) scale(0)}to{transform:translate(0) scale(1)}}\n"], dependencies: [{ kind: "directive", type: i1.NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule"], exportAs: ["ngComponentOutlet"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
196
196
  }
197
197
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NgxDialogComponent, decorators: [{
198
198
  type: Component,
199
- args: [{ standalone: false, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"ngx-dialog-overlay\" (click)=\"onOverlayClicked($event)\">\r\n <div class=\"ngx-dialog\" (click)=\"onDialogClicked($event)\" #ngxDialog>\r\n <ng-container *ngComponentOutlet=\"component\"></ng-container>\r\n </div>\r\n</div>", styles: [".ngx-dialog-overlay{display:flex;flex-direction:column;position:fixed;inset:0;background:#0000004d;align-items:center;justify-content:center;transition:opacity .4s cubic-bezier(.25,.8,.25,1);z-index:999}::ng-deep .ngx-dialog{box-shadow:0 0 28px #3c3c3cd6;display:flex;flex-direction:column;border-radius:5px;overflow:hidden;background-color:var(--panel-bg, white);color:var(--side-config-fg, #000000);box-sizing:border-box;animation:ShowDialog .2s cubic-bezier(.25,.8,.25,1)}::ng-deep .ngx-dialog .dialog-header{display:block;background:#1180f3;display:flex;align-items:center;justify-content:space-between;padding:5px 15px;color:#fff;font-size:.8rem;box-sizing:border-box;height:35px}::ng-deep .ngx-dialog .dialog-header .close-btn{background:none;cursor:pointer;border:none;color:#fff}::ng-deep .ngx-dialog .dialog-body{display:block;overflow:auto;padding:20px;box-sizing:border-box}::ng-deep .ngx-dialog .dialog-footer{display:block;box-shadow:0 0 10px #72727252;padding:0 15px;display:flex;align-items:center;min-height:44px}::ng-deep .ngx-dialog .dialog-footer.align-start{justify-content:flex-start}::ng-deep .ngx-dialog .dialog-footer.align-end{justify-content:flex-end}::ng-deep .ngx-dialog .dialog-footer.align-space-between{justify-content:space-between}::ng-deep .ngx-dialog .dialog-footer.align-center{justify-content:center}::ng-deep .ngx-dialog .dialog-footer.align-space-around{justify-content:space-around}@keyframes ShowDialog{0%{transform:translate(0) scale(0)}to{transform:translate(0) scale(1)}}\n"] }]
199
+ args: [{ standalone: false, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"ngx-dialog-overlay\" (click)=\"onOverlayClicked($event)\">\n <div class=\"ngx-dialog\" (click)=\"onDialogClicked($event)\" #ngxDialog>\n <ng-container *ngComponentOutlet=\"component\"></ng-container>\n </div>\n</div>\n", styles: [".ngx-dialog-overlay{display:flex;flex-direction:column;position:fixed;inset:0;background:#0000004d;align-items:center;justify-content:center;transition:opacity .4s cubic-bezier(.25,.8,.25,1);z-index:999}::ng-deep .ngx-dialog{--ngx-dialog-bg: light-dark(#ffffff, #1c1c22);--ngx-dialog-fg: light-dark(#000000, #f0f0f5);--ngx-dialog-header-bg: light-dark(#1180f3, #2563eb);--ngx-dialog-header-fg: #ffffff;box-shadow:0 0 28px #3c3c3cd6;display:flex;flex-direction:column;border-radius:5px;overflow:hidden;background-color:var(--panel-bg, var(--ngx-dialog-bg));color:var(--side-config-fg, var(--ngx-dialog-fg));box-sizing:border-box;animation:ShowDialog .2s cubic-bezier(.25,.8,.25,1)}::ng-deep .ngx-dialog .dialog-header{display:block;background:var(--ngx-dialog-header-bg);display:flex;align-items:center;justify-content:space-between;padding:5px 15px;color:var(--ngx-dialog-header-fg);font-size:.8rem;box-sizing:border-box;height:35px}::ng-deep .ngx-dialog .dialog-header .close-btn{background:none;cursor:pointer;border:none;color:var(--ngx-dialog-header-fg)}::ng-deep .ngx-dialog .dialog-body{display:block;overflow:auto;padding:20px;box-sizing:border-box}::ng-deep .ngx-dialog .dialog-footer{display:block;box-shadow:0 0 10px #72727252;padding:0 15px;display:flex;align-items:center;min-height:44px}::ng-deep .ngx-dialog .dialog-footer.align-start{justify-content:flex-start}::ng-deep .ngx-dialog .dialog-footer.align-end{justify-content:flex-end}::ng-deep .ngx-dialog .dialog-footer.align-space-between{justify-content:space-between}::ng-deep .ngx-dialog .dialog-footer.align-center{justify-content:center}::ng-deep .ngx-dialog .dialog-footer.align-space-around{justify-content:space-around}@keyframes ShowDialog{0%{transform:translate(0) scale(0)}to{transform:translate(0) scale(1)}}\n"] }]
200
200
  }], ctorParameters: () => [], propDecorators: { ngxDialog: [{
201
201
  type: ViewChild,
202
202
  args: ['ngxDialog']
@@ -346,22 +346,53 @@ class Dialog {
346
346
  }
347
347
 
348
348
  class NgxDialogModule {
349
+ platformId = inject(PLATFORM_ID);
349
350
  constructor(parentModule, service) {
350
351
  if (parentModule) {
351
352
  return;
352
353
  }
354
+ // API استاتیک Dialog.open(...) روی یک static field کلاسی پیاده شده تا
355
+ // بدون تزریق دستی سرویس هم قابل استفاده باشه. این static field برای کل
356
+ // پروسه‌ی Node.js مشترکه، نه به‌ازای هر درخواست — پس در Angular SSR،
357
+ // چند درخواست هم‌زمان می‌تونستن instance همدیگه رو overwrite کنن و
358
+ // دیالوگ یک کاربر با ApplicationRef اشتباه (کاربر دیگه) کار کنه.
359
+ // به‌جای این‌که این باگ به‌صورت خاموش رخ بده، روی سرور اصلاً static
360
+ // instance رو ست نمی‌کنیم؛ Dialog.open() روی سرور با همون خطای
361
+ // «service not initialized» که از قبل وجود داشت fail می‌کنه (fail-loud
362
+ // به‌جای corrupt خاموش). برای SSR باید NgxOverlayService رو مستقیم
363
+ // inject کرد (که per-request/per-injector امنه)، نه از API استاتیک
364
+ // استفاده کرد. رفتار کلاینت (که ۹۹٪ کاربردهاست) کاملاً بدون تغییره.
365
+ if (isPlatformServer(this.platformId)) {
366
+ return;
367
+ }
353
368
  Dialog._setService(service);
354
369
  }
355
370
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NgxDialogModule, deps: [{ token: NgxDialogModule, optional: true, skipSelf: true }, { token: NgxOverlayService }], target: i0.ɵɵFactoryTarget.NgModule });
356
- static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "22.0.4", ngImport: i0, type: NgxDialogModule, declarations: [NgxDialogComponent, NgxDialogHeaderDirective, NgxDialogFooterDirective, NgxDialogBodyDirective], imports: [CommonModule], exports: [NgxDialogComponent, NgxDialogHeaderDirective, NgxDialogFooterDirective, NgxDialogBodyDirective] });
371
+ static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "22.0.4", ngImport: i0, type: NgxDialogModule, declarations: [NgxDialogComponent,
372
+ NgxDialogHeaderDirective,
373
+ NgxDialogFooterDirective,
374
+ NgxDialogBodyDirective], imports: [CommonModule], exports: [NgxDialogComponent,
375
+ NgxDialogHeaderDirective,
376
+ NgxDialogFooterDirective,
377
+ NgxDialogBodyDirective] });
357
378
  static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NgxDialogModule, providers: [NgxOverlayService], imports: [CommonModule] });
358
379
  }
359
380
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NgxDialogModule, decorators: [{
360
381
  type: NgModule,
361
382
  args: [{
362
- declarations: [NgxDialogComponent, NgxDialogHeaderDirective, NgxDialogFooterDirective, NgxDialogBodyDirective],
383
+ declarations: [
384
+ NgxDialogComponent,
385
+ NgxDialogHeaderDirective,
386
+ NgxDialogFooterDirective,
387
+ NgxDialogBodyDirective,
388
+ ],
363
389
  imports: [CommonModule],
364
- exports: [NgxDialogComponent, NgxDialogHeaderDirective, NgxDialogFooterDirective, NgxDialogBodyDirective],
390
+ exports: [
391
+ NgxDialogComponent,
392
+ NgxDialogHeaderDirective,
393
+ NgxDialogFooterDirective,
394
+ NgxDialogBodyDirective,
395
+ ],
365
396
  providers: [NgxOverlayService],
366
397
  }]
367
398
  }], ctorParameters: () => [{ type: NgxDialogModule, decorators: [{
@@ -1 +1 @@
1
- {"version":3,"file":"ngx-kit-dialog.mjs","sources":["../../../projects/libs/dialog/dialog.tokens.ts","../../../projects/libs/dialog/directives/body.directive.ts","../../../projects/libs/dialog/directives/footer.directive.ts","../../../projects/libs/dialog/directives/header.directive.ts","../../../projects/libs/dialog/ngx-dialog.component.ts","../../../projects/libs/dialog/ngx-dialog.component.html","../../../projects/libs/dialog/ngx-dialog-config.ts","../../../projects/libs/dialog/ngx-dialog-ref.ts","../../../projects/libs/dialog/ngx-dialog.service.ts","../../../projects/libs/dialog/dialog.facade.ts","../../../projects/libs/dialog/ngx-dialog.module.ts","../../../projects/libs/dialog/ngx-kit-dialog.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\r\nimport { NgxDialogRef } from './ngx-dialog-ref';\r\n\r\nexport const DIALOG_DATA = new InjectionToken<any>('DIALOG_DATA');\r\nexport const DIALOG_REF = new InjectionToken<NgxDialogRef>('DIALOG_REF');\r\n","import { AfterViewInit, Directive, ElementRef, inject, Renderer2 } from '@angular/core';\r\nimport { DIALOG_REF } from '../dialog.tokens';\r\n\r\n@Directive({\r\n standalone: false,\r\n selector: 'ngx-dialog-body,[ngxDialogBody]',\r\n host: {\r\n class: 'dialog-body',\r\n },\r\n exportAs: 'ngxDialogBody',\r\n})\r\nexport class NgxDialogBodyDirective implements AfterViewInit {\r\n height?: number;\r\n\r\n private _dialogRef = inject(DIALOG_REF);\r\n constructor(\r\n public _el: ElementRef<HTMLElement>,\r\n private _renderer: Renderer2,\r\n ) {\r\n this._dialogRef.body = this._el;\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n this.onWindowResize();\r\n if (this._dialogRef.dialog && this._dialogRef.dialog.nativeElement) {\r\n new ResizeObserver(() => {\r\n this.onWindowResize();\r\n }).observe(this._dialogRef.dialog.nativeElement);\r\n }\r\n }\r\n\r\n // @HostListener('window:resize', ['$event'])\r\n onWindowResize(ev?: Event) {\r\n if (!window) return;\r\n let headerH = 0;\r\n let footerH = 0;\r\n let dialogH = window.innerHeight;\r\n if (this._dialogRef.header) {\r\n headerH = this._dialogRef.header.nativeElement.offsetHeight;\r\n }\r\n if (this._dialogRef.footer) {\r\n footerH = this._dialogRef.footer.nativeElement.offsetHeight;\r\n }\r\n if (this._dialogRef.dialog && this._dialogRef.dialog.nativeElement.offsetHeight < dialogH) {\r\n dialogH = this._dialogRef.dialog.nativeElement.offsetHeight;\r\n }\r\n this.height = dialogH - headerH - footerH;\r\n this._renderer.setStyle(this._el.nativeElement, 'max-height', this.height + 'px');\r\n // console.log(this.height, ':', 'windowHeight', dialogH, 'h', headerH, 'f', footerH);\r\n }\r\n}\r\n","import { Directive, ElementRef, inject, Input, OnInit } from '@angular/core';\r\nimport { DIALOG_REF } from '../dialog.tokens';\r\n\r\n@Directive({\r\n standalone: false,\r\n selector: 'ngx-dialog-footer,[ngxDialogFooter]',\r\n host: {\r\n class: 'dialog-footer',\r\n '[class.align-start]': 'align===\"start\"',\r\n '[class.align-end]': 'align===\"end\"',\r\n '[class.align-space-between]': 'align===\"space-between\"',\r\n '[class.align-center]': 'align===\"center\"',\r\n '[class.align-space-around]': 'align===\"space-around\"',\r\n },\r\n exportAs: 'ngxDialogFooter',\r\n})\r\nexport class NgxDialogFooterDirective implements OnInit {\r\n @Input() align: 'start' | 'end' | 'space-between' | 'center' | 'space-around' = 'end';\r\n\r\n private _dialogRef = inject(DIALOG_REF);\r\n constructor(public _el: ElementRef<HTMLElement>) {}\r\n\r\n ngOnInit(): void {\r\n this._dialogRef.footer = this._el;\r\n }\r\n}\r\n","import { DOCUMENT } from '@angular/common';\r\nimport { Directive, ElementRef, inject, Inject, Input, OnInit } from '@angular/core';\r\nimport { DIALOG_REF } from '../dialog.tokens';\r\n\r\n@Directive({\r\n standalone: false,\r\n selector: 'ngx-dialog-header,[ngxDialogHeader]',\r\n host: {\r\n class: 'dialog-header',\r\n },\r\n exportAs: 'ngxDialogHeader',\r\n})\r\nexport class NgxDialogHeaderDirective implements OnInit {\r\n @Input() showCloseButton = true;\r\n\r\n private _dialogRef = inject(DIALOG_REF);\r\n constructor(\r\n public _el: ElementRef<HTMLElement>,\r\n @Inject(DOCUMENT) private _document: Document,\r\n ) {}\r\n\r\n ngOnInit(): void {\r\n this._el.nativeElement.innerHTML = '<span>' + this._el.nativeElement.innerHTML + '</span>';\r\n if (this.showCloseButton) {\r\n let closeBtn = this._document.createElement('button');\r\n closeBtn.className = 'close-btn';\r\n closeBtn.innerHTML =\r\n '<svg width=\"20\" height=\"20\" fill=\"#fff\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 320 512\"><path d=\"M312.1 375c9.369 9.369 9.369 24.57 0 33.94s-24.57 9.369-33.94 0L160 289.9l-119 119c-9.369 9.369-24.57 9.369-33.94 0s-9.369-24.57 0-33.94L126.1 256L7.027 136.1c-9.369-9.369-9.369-24.57 0-33.94s24.57-9.369 33.94 0L160 222.1l119-119c9.369-9.369 24.57-9.369 33.94 0s9.369 24.57 0 33.94L193.9 256L312.1 375z\"/></svg>';\r\n\r\n closeBtn.onclick = closeBtn.ontouchend = () => {\r\n this._dialogRef.close();\r\n };\r\n this._el.nativeElement.appendChild(closeBtn);\r\n }\r\n this._dialogRef.header = this._el;\r\n }\r\n}\r\n","import {\r\n AfterViewInit,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n ElementRef,\r\n inject,\r\n OnDestroy,\r\n OnInit,\r\n Type,\r\n ViewChild,\r\n} from '@angular/core';\r\nimport { Subject } from 'rxjs';\r\nimport { NgxDialogConfig } from './ngx-dialog-config';\r\nimport { DIALOG_REF } from './dialog.tokens';\r\n\r\n@Component({\r\n standalone: false,\r\n templateUrl: './ngx-dialog.component.html',\r\n styleUrls: ['./ngx-dialog.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class NgxDialogComponent implements OnInit, AfterViewInit, OnDestroy {\r\n config?: NgxDialogConfig;\r\n component!: Type<any>;\r\n private readonly _onClose = new Subject<void>();\r\n public onClose = this._onClose.asObservable();\r\n @ViewChild('ngxDialog') ngxDialog?: ElementRef<HTMLElement>;\r\n\r\n _dialogRef = inject(DIALOG_REF);\r\n private cd = inject(ChangeDetectorRef);\r\n constructor() {}\r\n\r\n ngOnInit(): void {}\r\n\r\n ngAfterViewInit(): void {\r\n this._dialogRef.dialog = this.ngxDialog;\r\n this.setStyle();\r\n this.cd.detectChanges();\r\n }\r\n\r\n ngOnDestroy(): void {}\r\n\r\n onOverlayClicked(evt: MouseEvent): void {\r\n if (this.config?.allowCloseOnOutsideClick) {\r\n this._dialogRef.close();\r\n }\r\n }\r\n\r\n onDialogClicked(evt: MouseEvent): void {\r\n evt.stopPropagation();\r\n }\r\n\r\n close(): void {\r\n this._onClose.next();\r\n }\r\n\r\n setStyle() {\r\n if (this.ngxDialog) {\r\n if (this.config?.width) {\r\n this.ngxDialog.nativeElement.style.width = this.config.width;\r\n }\r\n if (this.config?.maxWidth) {\r\n this.ngxDialog.nativeElement.style.maxWidth = this.config.maxWidth;\r\n } else {\r\n this.ngxDialog.nativeElement.style.maxWidth = '100%';\r\n }\r\n if (this.config?.minWidth) {\r\n this.ngxDialog.nativeElement.style.minWidth = this.config.minWidth;\r\n }\r\n if (this.config?.height) {\r\n this.ngxDialog.nativeElement.style.height = this.config.height;\r\n }\r\n if (this.config?.maxHeight) {\r\n this.ngxDialog.nativeElement.style.maxHeight = this.config.maxHeight;\r\n } else {\r\n this.ngxDialog.nativeElement.style.maxHeight = '100%';\r\n }\r\n if (this.config?.minHeight) {\r\n this.ngxDialog.nativeElement.style.minHeight = this.config.minHeight;\r\n }\r\n }\r\n }\r\n}\r\n","<div class=\"ngx-dialog-overlay\" (click)=\"onOverlayClicked($event)\">\r\n <div class=\"ngx-dialog\" (click)=\"onDialogClicked($event)\" #ngxDialog>\r\n <ng-container *ngComponentOutlet=\"component\"></ng-container>\r\n </div>\r\n</div>","import { Injector } from '@angular/core';\r\n\r\nexport class NgxDialogConfig<DataType = any> {\r\n /**\r\n * pass data to dialog\r\n */\r\n data?: DataType | any = {};\r\n /** close dialog on outside click\r\n * - default false */\r\n allowCloseOnOutsideClick?: boolean = false;\r\n /**\r\n * container class\r\n * - You can separate the list of classes with a space\r\n * - for example:\"`my class one two three ...`\"\r\n *\r\n * TODO: must set with public config setter\r\n */\r\n containerClass? = 'ngx-kit';\r\n header?: {\r\n enable?: true;\r\n title?: '';\r\n showCloseButton?: true;\r\n };\r\n footer?: {\r\n enable?: true;\r\n };\r\n width?: string = '';\r\n minWidth?: string = '';\r\n maxWidth?: string = '';\r\n height?: string = '';\r\n minHeight?: string = '';\r\n maxHeight?: string = '';\r\n\r\n /** parent injector */\r\n injector?: Injector;\r\n\r\n constructor() {}\r\n}\r\n","import { ElementRef } from '@angular/core';\r\nimport { Observable, Subject } from 'rxjs';\r\n\r\nexport class NgxDialogRef {\r\n dialog?: ElementRef<HTMLElement>;\r\n header?: ElementRef<HTMLElement>;\r\n footer?: ElementRef<HTMLElement>;\r\n body?: ElementRef<HTMLElement>;\r\n private readonly _afterClosed = new Subject<any>();\r\n\r\n afterClosed: Observable<any> = this._afterClosed.asObservable();\r\n\r\n id?: string;\r\n close(result?: any): void {\r\n this._afterClosed.next(result);\r\n }\r\n}\r\n","import {\r\n ApplicationRef,\r\n ComponentRef,\r\n createComponent,\r\n EmbeddedViewRef,\r\n EnvironmentInjector,\r\n Injectable,\r\n Injector,\r\n Provider,\r\n runInInjectionContext,\r\n Type,\r\n} from '@angular/core';\r\nimport { NgxDialogConfig } from './ngx-dialog-config';\r\nimport { NgxDialogRef } from './ngx-dialog-ref';\r\nimport { NgxDialogComponent } from './ngx-dialog.component';\r\nimport { DIALOG_DATA, DIALOG_REF } from './dialog.tokens';\r\nimport { randomStrnig } from 'ngx-kit/shared';\r\n\r\n@Injectable()\r\nexport class NgxOverlayService {\r\n dialogComponentRefs: ComponentRef<NgxDialogComponent>[] = [];\r\n _defaultOptions: NgxDialogConfig | undefined;\r\n constructor(\r\n private appRef: ApplicationRef,\r\n private injector: Injector,\r\n private envInjector: EnvironmentInjector,\r\n ) {}\r\n\r\n public open(component: Type<any>, config?: NgxDialogConfig): NgxDialogRef {\r\n const dialogRef = this._open(component, config);\r\n return dialogRef;\r\n }\r\n\r\n private _open(component: Type<any>, config?: NgxDialogConfig): NgxDialogRef {\r\n config = { ...(this._defaultOptions || new NgxDialogConfig()), ...config };\r\n const map = new WeakMap();\r\n map.set(NgxDialogConfig, config);\r\n\r\n const dialogRef = new NgxDialogRef();\r\n dialogRef.id = this.getDialogId;\r\n map.set(NgxDialogRef, dialogRef);\r\n\r\n const sub = dialogRef.afterClosed.subscribe(() => {\r\n // close the dialog\r\n this.removeDialogComponentFromBody(dialogRef.id);\r\n sub.unsubscribe();\r\n });\r\n\r\n // ✅ ساخت Injector اختصاصی با DestroyRef\r\n const componentInjector = Injector.create({\r\n providers: [\r\n NgxDialogRef,\r\n { provide: DIALOG_DATA, useValue: config.data },\r\n { provide: DIALOG_REF, useValue: dialogRef, multi: false },\r\n ],\r\n parent: config?.injector ? config.injector : this.envInjector,\r\n });\r\n\r\n const componentRef: ComponentRef<NgxDialogComponent> = runInInjectionContext(\r\n componentInjector,\r\n () =>\r\n createComponent(NgxDialogComponent, {\r\n elementInjector: componentInjector,\r\n environmentInjector: this.envInjector,\r\n }),\r\n );\r\n\r\n this.appRef.attachView(componentRef.hostView);\r\n this.appendDialogComponentToBody(componentRef, config);\r\n componentRef.instance.config = config;\r\n componentRef.instance.component = component;\r\n //componentRef.instance._dialogRef = dialogRef;\r\n this.dialogComponentRefs.push(componentRef);\r\n return dialogRef;\r\n }\r\n\r\n private removeDialogComponentFromBody(id?: string): void {\r\n if (!id) {\r\n return;\r\n }\r\n const index = this.dialogComponentRefs.findIndex((x) => x.instance._dialogRef.id == id);\r\n if (index > -1 && this.dialogComponentRefs[index]) {\r\n this.appRef.detachView(this.dialogComponentRefs[index].hostView);\r\n this.dialogComponentRefs[index].destroy();\r\n this.dialogComponentRefs.splice(index, 1);\r\n }\r\n }\r\n\r\n private appendDialogComponentToBody(\r\n componentRef: ComponentRef<NgxDialogComponent>,\r\n config: NgxDialogConfig,\r\n ) {\r\n const domElem = (componentRef.hostView as EmbeddedViewRef<any>).rootNodes[0] as HTMLElement;\r\n if (config.containerClass) {\r\n for (let c of config.containerClass.split(' ')) {\r\n if (c.trim()) domElem.classList.add(c);\r\n }\r\n }\r\n document.body.appendChild(domElem);\r\n }\r\n\r\n closeAll() {\r\n for (let index = 0; index < this.dialogComponentRefs.length; index++) {\r\n if (this.dialogComponentRefs[index]) {\r\n this.appRef.detachView(this.dialogComponentRefs[index].hostView);\r\n this.dialogComponentRefs[index].destroy();\r\n }\r\n }\r\n this.dialogComponentRefs = [];\r\n }\r\n\r\n private get getDialogId() {\r\n return randomStrnig(10, true);\r\n }\r\n}\r\n","import { Type } from '@angular/core';\r\nimport { NgxDialogConfig } from './ngx-dialog-config';\r\nimport { NgxOverlayService } from './ngx-dialog.service';\r\nimport { NgxDialogRef } from './ngx-dialog-ref';\r\n\r\nexport class Dialog {\r\n private static serviceInstance: NgxOverlayService | null = null;\r\n static _setService(svc: NgxOverlayService) {\r\n this.serviceInstance = svc;\r\n }\r\n\r\n static open<DataType>(component: Type<any>, config?: NgxDialogConfig<DataType>): NgxDialogRef {\r\n if (!this.serviceInstance) {\r\n throw Error('ngx-dialog: service not initialized. Ensure NgxDialogModule is imported.');\r\n }\r\n return this.serviceInstance.open(component, config);\r\n }\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport { NgModule, Optional, SkipSelf } from '@angular/core';\r\nimport { NgxDialogBodyDirective } from './directives/body.directive';\r\nimport { NgxDialogFooterDirective } from './directives/footer.directive';\r\nimport { NgxDialogHeaderDirective } from './directives/header.directive';\r\nimport { NgxDialogComponent } from './ngx-dialog.component';\r\nimport { NgxOverlayService } from './ngx-dialog.service';\r\nimport { Dialog as DialogFacade } from './dialog.facade';\r\n\r\n@NgModule({\r\n declarations: [NgxDialogComponent, NgxDialogHeaderDirective, NgxDialogFooterDirective, NgxDialogBodyDirective],\r\n imports: [CommonModule],\r\n exports: [NgxDialogComponent, NgxDialogHeaderDirective, NgxDialogFooterDirective, NgxDialogBodyDirective],\r\n providers: [NgxOverlayService],\r\n})\r\nexport class NgxDialogModule {\r\n constructor(@Optional() @SkipSelf() parentModule: NgxDialogModule | null, service: NgxOverlayService) {\r\n if (parentModule) {\r\n return;\r\n }\r\n DialogFacade._setService(service);\r\n }\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["DialogFacade","i1.NgxOverlayService"],"mappings":"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"}
1
+ {"version":3,"file":"ngx-kit-dialog.mjs","sources":["../../../projects/libs/dialog/dialog.tokens.ts","../../../projects/libs/dialog/directives/body.directive.ts","../../../projects/libs/dialog/directives/footer.directive.ts","../../../projects/libs/dialog/directives/header.directive.ts","../../../projects/libs/dialog/ngx-dialog.component.ts","../../../projects/libs/dialog/ngx-dialog.component.html","../../../projects/libs/dialog/ngx-dialog-config.ts","../../../projects/libs/dialog/ngx-dialog-ref.ts","../../../projects/libs/dialog/ngx-dialog.service.ts","../../../projects/libs/dialog/dialog.facade.ts","../../../projects/libs/dialog/ngx-dialog.module.ts","../../../projects/libs/dialog/ngx-kit-dialog.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\nimport { NgxDialogRef } from './ngx-dialog-ref';\n\nexport const DIALOG_DATA = new InjectionToken<any>('DIALOG_DATA');\nexport const DIALOG_REF = new InjectionToken<NgxDialogRef>('DIALOG_REF');\n","import { AfterViewInit, Directive, ElementRef, inject, Renderer2 } from '@angular/core';\nimport { DIALOG_REF } from '../dialog.tokens';\n\n@Directive({\n standalone: false,\n selector: 'ngx-dialog-body,[ngxDialogBody]',\n host: {\n class: 'dialog-body',\n },\n exportAs: 'ngxDialogBody',\n})\nexport class NgxDialogBodyDirective implements AfterViewInit {\n height?: number;\n\n private _dialogRef = inject(DIALOG_REF);\n constructor(\n public _el: ElementRef<HTMLElement>,\n private _renderer: Renderer2,\n ) {\n this._dialogRef.body = this._el;\n }\n\n ngAfterViewInit(): void {\n this.onWindowResize();\n if (this._dialogRef.dialog && this._dialogRef.dialog.nativeElement) {\n new ResizeObserver(() => {\n this.onWindowResize();\n }).observe(this._dialogRef.dialog.nativeElement);\n }\n }\n\n // @HostListener('window:resize', ['$event'])\n onWindowResize(ev?: Event) {\n if (!window) return;\n let headerH = 0;\n let footerH = 0;\n let dialogH = window.innerHeight;\n if (this._dialogRef.header) {\n headerH = this._dialogRef.header.nativeElement.offsetHeight;\n }\n if (this._dialogRef.footer) {\n footerH = this._dialogRef.footer.nativeElement.offsetHeight;\n }\n if (this._dialogRef.dialog && this._dialogRef.dialog.nativeElement.offsetHeight < dialogH) {\n dialogH = this._dialogRef.dialog.nativeElement.offsetHeight;\n }\n this.height = dialogH - headerH - footerH;\n this._renderer.setStyle(this._el.nativeElement, 'max-height', this.height + 'px');\n // console.log(this.height, ':', 'windowHeight', dialogH, 'h', headerH, 'f', footerH);\n }\n}\n","import { Directive, ElementRef, inject, Input, OnInit } from '@angular/core';\nimport { DIALOG_REF } from '../dialog.tokens';\n\n@Directive({\n standalone: false,\n selector: 'ngx-dialog-footer,[ngxDialogFooter]',\n host: {\n class: 'dialog-footer',\n '[class.align-start]': 'align===\"start\"',\n '[class.align-end]': 'align===\"end\"',\n '[class.align-space-between]': 'align===\"space-between\"',\n '[class.align-center]': 'align===\"center\"',\n '[class.align-space-around]': 'align===\"space-around\"',\n },\n exportAs: 'ngxDialogFooter',\n})\nexport class NgxDialogFooterDirective implements OnInit {\n @Input() align: 'start' | 'end' | 'space-between' | 'center' | 'space-around' = 'end';\n\n private _dialogRef = inject(DIALOG_REF);\n constructor(public _el: ElementRef<HTMLElement>) {}\n\n ngOnInit(): void {\n this._dialogRef.footer = this._el;\n }\n}\n","import { DOCUMENT } from '@angular/common';\nimport { Directive, ElementRef, inject, Inject, Input, OnInit } from '@angular/core';\nimport { DIALOG_REF } from '../dialog.tokens';\n\n@Directive({\n standalone: false,\n selector: 'ngx-dialog-header,[ngxDialogHeader]',\n host: {\n class: 'dialog-header',\n },\n exportAs: 'ngxDialogHeader',\n})\nexport class NgxDialogHeaderDirective implements OnInit {\n @Input() showCloseButton = true;\n\n private _dialogRef = inject(DIALOG_REF);\n constructor(\n public _el: ElementRef<HTMLElement>,\n @Inject(DOCUMENT) private _document: Document,\n ) {}\n\n ngOnInit(): void {\n this._el.nativeElement.innerHTML = '<span>' + this._el.nativeElement.innerHTML + '</span>';\n if (this.showCloseButton) {\n let closeBtn = this._document.createElement('button');\n closeBtn.className = 'close-btn';\n closeBtn.innerHTML =\n '<svg width=\"20\" height=\"20\" fill=\"#fff\" xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 320 512\"><path d=\"M312.1 375c9.369 9.369 9.369 24.57 0 33.94s-24.57 9.369-33.94 0L160 289.9l-119 119c-9.369 9.369-24.57 9.369-33.94 0s-9.369-24.57 0-33.94L126.1 256L7.027 136.1c-9.369-9.369-9.369-24.57 0-33.94s24.57-9.369 33.94 0L160 222.1l119-119c9.369-9.369 24.57-9.369 33.94 0s9.369 24.57 0 33.94L193.9 256L312.1 375z\"/></svg>';\n\n closeBtn.onclick = closeBtn.ontouchend = () => {\n this._dialogRef.close();\n };\n this._el.nativeElement.appendChild(closeBtn);\n }\n this._dialogRef.header = this._el;\n }\n}\n","import {\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n inject,\n OnDestroy,\n OnInit,\n Type,\n ViewChild,\n} from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { NgxDialogConfig } from './ngx-dialog-config';\nimport { DIALOG_REF } from './dialog.tokens';\n\n@Component({\n standalone: false,\n templateUrl: './ngx-dialog.component.html',\n styleUrls: ['./ngx-dialog.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class NgxDialogComponent implements OnInit, AfterViewInit, OnDestroy {\n config?: NgxDialogConfig;\n component!: Type<any>;\n private readonly _onClose = new Subject<void>();\n public onClose = this._onClose.asObservable();\n @ViewChild('ngxDialog') ngxDialog?: ElementRef<HTMLElement>;\n\n _dialogRef = inject(DIALOG_REF);\n private cd = inject(ChangeDetectorRef);\n constructor() {}\n\n ngOnInit(): void {}\n\n ngAfterViewInit(): void {\n this._dialogRef.dialog = this.ngxDialog;\n this.setStyle();\n this.cd.detectChanges();\n }\n\n ngOnDestroy(): void {}\n\n onOverlayClicked(evt: MouseEvent): void {\n if (this.config?.allowCloseOnOutsideClick) {\n this._dialogRef.close();\n }\n }\n\n onDialogClicked(evt: MouseEvent): void {\n evt.stopPropagation();\n }\n\n close(): void {\n this._onClose.next();\n }\n\n setStyle() {\n if (this.ngxDialog) {\n if (this.config?.width) {\n this.ngxDialog.nativeElement.style.width = this.config.width;\n }\n if (this.config?.maxWidth) {\n this.ngxDialog.nativeElement.style.maxWidth = this.config.maxWidth;\n } else {\n this.ngxDialog.nativeElement.style.maxWidth = '100%';\n }\n if (this.config?.minWidth) {\n this.ngxDialog.nativeElement.style.minWidth = this.config.minWidth;\n }\n if (this.config?.height) {\n this.ngxDialog.nativeElement.style.height = this.config.height;\n }\n if (this.config?.maxHeight) {\n this.ngxDialog.nativeElement.style.maxHeight = this.config.maxHeight;\n } else {\n this.ngxDialog.nativeElement.style.maxHeight = '100%';\n }\n if (this.config?.minHeight) {\n this.ngxDialog.nativeElement.style.minHeight = this.config.minHeight;\n }\n }\n }\n}\n","<div class=\"ngx-dialog-overlay\" (click)=\"onOverlayClicked($event)\">\n <div class=\"ngx-dialog\" (click)=\"onDialogClicked($event)\" #ngxDialog>\n <ng-container *ngComponentOutlet=\"component\"></ng-container>\n </div>\n</div>\n","import { Injector } from '@angular/core';\n\nexport class NgxDialogConfig<DataType = any> {\n /**\n * pass data to dialog\n */\n data?: DataType | any = {};\n /** close dialog on outside click\n * - default false */\n allowCloseOnOutsideClick?: boolean = false;\n /**\n * container class\n * - You can separate the list of classes with a space\n * - for example:\"`my class one two three ...`\"\n *\n * TODO: must set with public config setter\n */\n containerClass? = 'ngx-kit';\n header?: {\n enable?: true;\n title?: '';\n showCloseButton?: true;\n };\n footer?: {\n enable?: true;\n };\n width?: string = '';\n minWidth?: string = '';\n maxWidth?: string = '';\n height?: string = '';\n minHeight?: string = '';\n maxHeight?: string = '';\n\n /** parent injector */\n injector?: Injector;\n\n constructor() {}\n}\n","import { ElementRef } from '@angular/core';\nimport { Observable, Subject } from 'rxjs';\n\nexport class NgxDialogRef {\n dialog?: ElementRef<HTMLElement>;\n header?: ElementRef<HTMLElement>;\n footer?: ElementRef<HTMLElement>;\n body?: ElementRef<HTMLElement>;\n private readonly _afterClosed = new Subject<any>();\n\n afterClosed: Observable<any> = this._afterClosed.asObservable();\n\n id?: string;\n close(result?: any): void {\n this._afterClosed.next(result);\n }\n}\n","import {\n ApplicationRef,\n ComponentRef,\n createComponent,\n EmbeddedViewRef,\n EnvironmentInjector,\n Injectable,\n Injector,\n Provider,\n runInInjectionContext,\n Type,\n} from '@angular/core';\nimport { NgxDialogConfig } from './ngx-dialog-config';\nimport { NgxDialogRef } from './ngx-dialog-ref';\nimport { NgxDialogComponent } from './ngx-dialog.component';\nimport { DIALOG_DATA, DIALOG_REF } from './dialog.tokens';\nimport { randomStrnig } from 'ngx-kit/shared';\n\n@Injectable()\nexport class NgxOverlayService {\n dialogComponentRefs: ComponentRef<NgxDialogComponent>[] = [];\n _defaultOptions: NgxDialogConfig | undefined;\n constructor(\n private appRef: ApplicationRef,\n private injector: Injector,\n private envInjector: EnvironmentInjector,\n ) {}\n\n public open(component: Type<any>, config?: NgxDialogConfig): NgxDialogRef {\n const dialogRef = this._open(component, config);\n return dialogRef;\n }\n\n private _open(component: Type<any>, config?: NgxDialogConfig): NgxDialogRef {\n config = { ...(this._defaultOptions || new NgxDialogConfig()), ...config };\n const map = new WeakMap();\n map.set(NgxDialogConfig, config);\n\n const dialogRef = new NgxDialogRef();\n dialogRef.id = this.getDialogId;\n map.set(NgxDialogRef, dialogRef);\n\n const sub = dialogRef.afterClosed.subscribe(() => {\n // close the dialog\n this.removeDialogComponentFromBody(dialogRef.id);\n sub.unsubscribe();\n });\n\n // ✅ ساخت Injector اختصاصی با DestroyRef\n const componentInjector = Injector.create({\n providers: [\n NgxDialogRef,\n { provide: DIALOG_DATA, useValue: config.data },\n { provide: DIALOG_REF, useValue: dialogRef, multi: false },\n ],\n parent: config?.injector ? config.injector : this.envInjector,\n });\n\n const componentRef: ComponentRef<NgxDialogComponent> = runInInjectionContext(\n componentInjector,\n () =>\n createComponent(NgxDialogComponent, {\n elementInjector: componentInjector,\n environmentInjector: this.envInjector,\n }),\n );\n\n this.appRef.attachView(componentRef.hostView);\n this.appendDialogComponentToBody(componentRef, config);\n componentRef.instance.config = config;\n componentRef.instance.component = component;\n //componentRef.instance._dialogRef = dialogRef;\n this.dialogComponentRefs.push(componentRef);\n return dialogRef;\n }\n\n private removeDialogComponentFromBody(id?: string): void {\n if (!id) {\n return;\n }\n const index = this.dialogComponentRefs.findIndex((x) => x.instance._dialogRef.id == id);\n if (index > -1 && this.dialogComponentRefs[index]) {\n this.appRef.detachView(this.dialogComponentRefs[index].hostView);\n this.dialogComponentRefs[index].destroy();\n this.dialogComponentRefs.splice(index, 1);\n }\n }\n\n private appendDialogComponentToBody(\n componentRef: ComponentRef<NgxDialogComponent>,\n config: NgxDialogConfig,\n ) {\n const domElem = (componentRef.hostView as EmbeddedViewRef<any>).rootNodes[0] as HTMLElement;\n if (config.containerClass) {\n for (let c of config.containerClass.split(' ')) {\n if (c.trim()) domElem.classList.add(c);\n }\n }\n document.body.appendChild(domElem);\n }\n\n closeAll() {\n for (let index = 0; index < this.dialogComponentRefs.length; index++) {\n if (this.dialogComponentRefs[index]) {\n this.appRef.detachView(this.dialogComponentRefs[index].hostView);\n this.dialogComponentRefs[index].destroy();\n }\n }\n this.dialogComponentRefs = [];\n }\n\n private get getDialogId() {\n return randomStrnig(10, true);\n }\n}\n","import { Type } from '@angular/core';\nimport { NgxDialogConfig } from './ngx-dialog-config';\nimport { NgxOverlayService } from './ngx-dialog.service';\nimport { NgxDialogRef } from './ngx-dialog-ref';\n\nexport class Dialog {\n private static serviceInstance: NgxOverlayService | null = null;\n static _setService(svc: NgxOverlayService) {\n this.serviceInstance = svc;\n }\n\n static open<DataType>(component: Type<any>, config?: NgxDialogConfig<DataType>): NgxDialogRef {\n if (!this.serviceInstance) {\n throw Error('ngx-dialog: service not initialized. Ensure NgxDialogModule is imported.');\n }\n return this.serviceInstance.open(component, config);\n }\n}\n","import { CommonModule, isPlatformServer } from '@angular/common';\nimport { NgModule, Optional, PLATFORM_ID, SkipSelf, inject } from '@angular/core';\nimport { NgxDialogBodyDirective } from './directives/body.directive';\nimport { NgxDialogFooterDirective } from './directives/footer.directive';\nimport { NgxDialogHeaderDirective } from './directives/header.directive';\nimport { NgxDialogComponent } from './ngx-dialog.component';\nimport { NgxOverlayService } from './ngx-dialog.service';\nimport { Dialog as DialogFacade } from './dialog.facade';\n\n@NgModule({\n declarations: [\n NgxDialogComponent,\n NgxDialogHeaderDirective,\n NgxDialogFooterDirective,\n NgxDialogBodyDirective,\n ],\n imports: [CommonModule],\n exports: [\n NgxDialogComponent,\n NgxDialogHeaderDirective,\n NgxDialogFooterDirective,\n NgxDialogBodyDirective,\n ],\n providers: [NgxOverlayService],\n})\nexport class NgxDialogModule {\n private readonly platformId = inject(PLATFORM_ID);\n\n constructor(\n @Optional() @SkipSelf() parentModule: NgxDialogModule | null,\n service: NgxOverlayService,\n ) {\n if (parentModule) {\n return;\n }\n\n // API استاتیک Dialog.open(...) روی یک static field کلاسی پیاده شده تا\n // بدون تزریق دستی سرویس هم قابل استفاده باشه. این static field برای کل\n // پروسه‌ی Node.js مشترکه، نه به‌ازای هر درخواست — پس در Angular SSR،\n // چند درخواست هم‌زمان می‌تونستن instance همدیگه رو overwrite کنن و\n // دیالوگ یک کاربر با ApplicationRef اشتباه (کاربر دیگه) کار کنه.\n // به‌جای این‌که این باگ به‌صورت خاموش رخ بده، روی سرور اصلاً static\n // instance رو ست نمی‌کنیم؛ Dialog.open() روی سرور با همون خطای\n // «service not initialized» که از قبل وجود داشت fail می‌کنه (fail-loud\n // به‌جای corrupt خاموش). برای SSR باید NgxOverlayService رو مستقیم\n // inject کرد (که per-request/per-injector امنه)، نه از API استاتیک\n // استفاده کرد. رفتار کلاینت (که ۹۹٪ کاربردهاست) کاملاً بدون تغییره.\n if (isPlatformServer(this.platformId)) {\n return;\n }\n\n DialogFacade._setService(service);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["DialogFacade","i1.NgxOverlayService"],"mappings":"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"}
@@ -0,0 +1,190 @@
1
+ import * as i0 from '@angular/core';
2
+ import { input, model, inject, DOCUMENT, DestroyRef, signal, computed, effect, HostListener, ChangeDetectionStrategy, Component } from '@angular/core';
3
+ import { DirectionService, startDragSession } from 'ngx-kit/shared';
4
+
5
+ /**
6
+ * درور منو (side drawer) با ۶ جلوه‌ی بازوبسته‌شدنِ متفاوت (از ساده تا
7
+ * سه‌بعدی/ژله‌ای) و ۳ رفتار برای محتوای صفحه (overlay/push/reveal) —
8
+ * دقیقاً مدل کتابخونه‌های حرفه‌ای مثل react-burger-menu یا Ionic Menu، ولی
9
+ * signal-based و بدون هیچ وابستگی خارجی.
10
+ *
11
+ * نکات معماری:
12
+ * - از 'start'/'end' منطقی استفاده می‌کنه، پس با CSS logical properties
13
+ * زیر RTL خودکار برعکس می‌شه؛ فقط ریاضیِ درگ (که برخلاف CSS جهت فیزیکیِ
14
+ * واقعی لازم داره) از DirectionService مشترک استفاده می‌کنه.
15
+ * - وضعیت باز/بسته با model() دوطرفه‌ست، پس هم با [(open)] قابل کنترله و
16
+ * هم می‌تونه به‌صورت خودکار و زنده با عرض صفحه هماهنگ بشه (respondToViewport)
17
+ * — یعنی رد شدن از breakpoint (نه فقط بار اول لود) می‌تونه خودکار باز/بسته‌ش کنه.
18
+ * - افکت‌های jelly/pull با keyframe سه‌مرحله‌ای (overshoot → نوسان → استقرار)
19
+ * پیاده شدن، نه فقط یه transition ساده.
20
+ */
21
+ class NgxDrawerMenuComponent {
22
+ side = input('start', /* @ts-ignore */
23
+ ...(ngDevMode ? [{ debugName: "side" }] : /* istanbul ignore next */ []));
24
+ effect = input('slide', /* @ts-ignore */
25
+ ...(ngDevMode ? [{ debugName: "effect" }] : /* istanbul ignore next */ []));
26
+ contentBehavior = input('overlay', /* @ts-ignore */
27
+ ...(ngDevMode ? [{ debugName: "contentBehavior" }] : /* istanbul ignore next */ []));
28
+ width = input(280, /* @ts-ignore */
29
+ ...(ngDevMode ? [{ debugName: "width" }] : /* istanbul ignore next */ []));
30
+ swipeEdgeSize = input(24, /* @ts-ignore */
31
+ ...(ngDevMode ? [{ debugName: "swipeEdgeSize" }] : /* istanbul ignore next */ []));
32
+ curtainStrips = input(7, /* @ts-ignore */
33
+ ...(ngDevMode ? [{ debugName: "curtainStrips" }] : /* istanbul ignore next */ []));
34
+ backdropClose = input(true, /* @ts-ignore */
35
+ ...(ngDevMode ? [{ debugName: "backdropClose" }] : /* istanbul ignore next */ []));
36
+ swipeEnabled = input(true, /* @ts-ignore */
37
+ ...(ngDevMode ? [{ debugName: "swipeEnabled" }] : /* istanbul ignore next */ []));
38
+ /** اگه true باشه، رد شدن از mobileBreakpoint به‌صورت زنده open رو با openOnDesktop/openOnMobile هماهنگ می‌کنه */
39
+ respondToViewport = input(true, /* @ts-ignore */
40
+ ...(ngDevMode ? [{ debugName: "respondToViewport" }] : /* istanbul ignore next */ []));
41
+ openOnDesktop = input(true, /* @ts-ignore */
42
+ ...(ngDevMode ? [{ debugName: "openOnDesktop" }] : /* istanbul ignore next */ []));
43
+ openOnMobile = input(false, /* @ts-ignore */
44
+ ...(ngDevMode ? [{ debugName: "openOnMobile" }] : /* istanbul ignore next */ []));
45
+ mobileBreakpoint = input(768, /* @ts-ignore */
46
+ ...(ngDevMode ? [{ debugName: "mobileBreakpoint" }] : /* istanbul ignore next */ []));
47
+ /** state دوطرفه‌ی باز/بسته؛ با [(open)] قابل bind هست */
48
+ open = model(false, /* @ts-ignore */
49
+ ...(ngDevMode ? [{ debugName: "open" }] : /* istanbul ignore next */ []));
50
+ directionService = inject(DirectionService);
51
+ doc = inject(DOCUMENT);
52
+ destroyRef = inject(DestroyRef);
53
+ /** فقط حین یه درگِ واقعی مقدار داره؛ null یعنی از روی open() تصمیم بگیر */
54
+ dragRatio = signal(null, /* @ts-ignore */
55
+ ...(ngDevMode ? [{ debugName: "dragRatio" }] : /* istanbul ignore next */ []));
56
+ isDragging = computed(() => this.dragRatio() !== null, /* @ts-ignore */
57
+ ...(ngDevMode ? [{ debugName: "isDragging" }] : /* istanbul ignore next */ []));
58
+ visualOpen = computed(() => this.dragRatio() ?? (this.open() ? 1 : 0), /* @ts-ignore */
59
+ ...(ngDevMode ? [{ debugName: "visualOpen" }] : /* istanbul ignore next */ []));
60
+ strips = computed(() => Array.from({ length: this.curtainStrips() }, (_, i) => i), /* @ts-ignore */
61
+ ...(ngDevMode ? [{ debugName: "strips" }] : /* istanbul ignore next */ []));
62
+ /**
63
+ * +۱ یعنی این پنل فیزیکاً روی لبه‌ی چپِ صفحه‌ست، -۱ یعنی لبه‌ی راست —
64
+ * برای transform:translateX() محتوای اصلی (که برخلاف inset-inline، به
65
+ * dir=rtl خودکار واکنش نشون نمی‌ده) لازمه. reactive هست چون هم به side()
66
+ * و هم به جهتِ زنده‌ی صفحه (directionService.isRtl()) وابسته‌ست.
67
+ */
68
+ pushDirSign = computed(() => (this.isPhysicalLeftEdge() ? 1 : -1), /* @ts-ignore */
69
+ ...(ngDevMode ? [{ debugName: "pushDirSign" }] : /* istanbul ignore next */ []));
70
+ /** برای افکت‌های keyframe‌محور (jelly/pull) — فقط لحظه‌ی رهاشدن (نه حین درگ زنده) پخش می‌شه */
71
+ playEffectClass = signal(false, /* @ts-ignore */
72
+ ...(ngDevMode ? [{ debugName: "playEffectClass" }] : /* istanbul ignore next */ []));
73
+ stopDrag;
74
+ dragStartX = 0;
75
+ dragStartRatio = 0;
76
+ prevOpen = false;
77
+ constructor() {
78
+ // قفل اسکرول پس‌زمینه حین باز بودن پنل (فقط در حالت overlay واقعاً لازمه،
79
+ // ولی در push/reveal هم بی‌ضرره و تجربه‌ی بهتری می‌ده)
80
+ effect((onCleanup) => {
81
+ if (this.open() && this.contentBehavior() === 'overlay') {
82
+ const prevOverflow = this.doc.body.style.overflow;
83
+ this.doc.body.style.overflow = 'hidden';
84
+ onCleanup(() => {
85
+ this.doc.body.style.overflow = prevOverflow;
86
+ });
87
+ }
88
+ });
89
+ // پخش انیمیشن keyframe‌محور فقط لحظه‌ای که open() واقعاً عوض می‌شه (نه هر CD)
90
+ effect(() => {
91
+ const isOpen = this.open();
92
+ if (isOpen !== this.prevOpen) {
93
+ this.prevOpen = isOpen;
94
+ this.playEffectClass.set(true);
95
+ const id = setTimeout(() => this.playEffectClass.set(false), 700);
96
+ // پاک‌سازی در صورتی که کامپوننت زودتر destroy بشه
97
+ this.destroyRef.onDestroy(() => clearTimeout(id));
98
+ }
99
+ });
100
+ this.destroyRef.onDestroy(() => this.stopDrag?.());
101
+ // هماهنگیِ زنده با breakpoint
102
+ if (typeof window !== 'undefined') {
103
+ const mql = window.matchMedia(`(min-width: ${this.mobileBreakpoint()}px)`);
104
+ const applyForCurrentViewport = (isDesktop) => {
105
+ if (this.respondToViewport()) {
106
+ this.open.set(isDesktop ? this.openOnDesktop() : this.openOnMobile());
107
+ }
108
+ };
109
+ applyForCurrentViewport(mql.matches);
110
+ const handler = (e) => applyForCurrentViewport(e.matches);
111
+ mql.addEventListener('change', handler);
112
+ this.destroyRef.onDestroy(() => mql.removeEventListener('change', handler));
113
+ }
114
+ }
115
+ onEscape() {
116
+ if (this.open())
117
+ this.open.set(false);
118
+ }
119
+ closeFromBackdrop() {
120
+ if (this.backdropClose())
121
+ this.open.set(false);
122
+ }
123
+ toggle() {
124
+ this.open.update((o) => !o);
125
+ }
126
+ /** true یعنی این پنل فیزیکاً روی لبه‌ی چپِ صفحه‌ست (صرف‌نظر از start/end منطقی) */
127
+ isPhysicalLeftEdge() {
128
+ const isRtl = this.directionService.isRtl();
129
+ return this.side() === 'start' ? !isRtl : isRtl;
130
+ }
131
+ stripDelay(index) {
132
+ const count = this.curtainStrips();
133
+ const order = this.open() ? index : count - 1 - index;
134
+ return `${order * 28}ms`;
135
+ }
136
+ // ---------- درگ (هم برای باز کردن از لبه، هم بستن با کشیدنِ پنل) ----------
137
+ onEdgeDragStart(ev) {
138
+ if (!this.swipeEnabled() || this.open())
139
+ return;
140
+ this.beginDrag(ev, 0);
141
+ }
142
+ onPanelDragStart(ev) {
143
+ if (!this.open())
144
+ return;
145
+ this.beginDrag(ev, 1);
146
+ }
147
+ beginDrag(ev, startRatio) {
148
+ ev.preventDefault();
149
+ this.dragStartX = this.clientXOf(ev);
150
+ this.dragStartRatio = startRatio;
151
+ this.dragRatio.set(startRatio);
152
+ this.stopDrag?.();
153
+ this.stopDrag = startDragSession({
154
+ onMove: (moveEv) => {
155
+ const dx = this.clientXOf(moveEv) - this.dragStartX;
156
+ const opensToward = this.isPhysicalLeftEdge() ? 1 : -1;
157
+ const signedRatio = (dx * opensToward) / this.width();
158
+ const ratio = Math.min(1, Math.max(0, this.dragStartRatio + signedRatio));
159
+ this.dragRatio.set(ratio);
160
+ },
161
+ onEnd: () => {
162
+ const ratio = this.dragRatio() ?? this.dragStartRatio;
163
+ this.open.set(ratio > 0.4);
164
+ this.dragRatio.set(null);
165
+ this.stopDrag = undefined;
166
+ },
167
+ });
168
+ }
169
+ clientXOf(ev) {
170
+ return 'touches' in ev
171
+ ? (ev.touches[0]?.clientX ?? ev.changedTouches[0]?.clientX ?? 0)
172
+ : ev.clientX;
173
+ }
174
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NgxDrawerMenuComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
175
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.4", type: NgxDrawerMenuComponent, isStandalone: true, selector: "ngx-drawer-menu", inputs: { side: { classPropertyName: "side", publicName: "side", isSignal: true, isRequired: false, transformFunction: null }, effect: { classPropertyName: "effect", publicName: "effect", isSignal: true, isRequired: false, transformFunction: null }, contentBehavior: { classPropertyName: "contentBehavior", publicName: "contentBehavior", isSignal: true, isRequired: false, transformFunction: null }, width: { classPropertyName: "width", publicName: "width", isSignal: true, isRequired: false, transformFunction: null }, swipeEdgeSize: { classPropertyName: "swipeEdgeSize", publicName: "swipeEdgeSize", isSignal: true, isRequired: false, transformFunction: null }, curtainStrips: { classPropertyName: "curtainStrips", publicName: "curtainStrips", isSignal: true, isRequired: false, transformFunction: null }, backdropClose: { classPropertyName: "backdropClose", publicName: "backdropClose", isSignal: true, isRequired: false, transformFunction: null }, swipeEnabled: { classPropertyName: "swipeEnabled", publicName: "swipeEnabled", isSignal: true, isRequired: false, transformFunction: null }, respondToViewport: { classPropertyName: "respondToViewport", publicName: "respondToViewport", isSignal: true, isRequired: false, transformFunction: null }, openOnDesktop: { classPropertyName: "openOnDesktop", publicName: "openOnDesktop", isSignal: true, isRequired: false, transformFunction: null }, openOnMobile: { classPropertyName: "openOnMobile", publicName: "openOnMobile", isSignal: true, isRequired: false, transformFunction: null }, mobileBreakpoint: { classPropertyName: "mobileBreakpoint", publicName: "mobileBreakpoint", isSignal: true, isRequired: false, transformFunction: null }, open: { classPropertyName: "open", publicName: "open", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { open: "openChange" }, host: { listeners: { "document:keydown.escape": "onEscape()" }, classAttribute: "ngx-drawer-menu-host" }, ngImport: i0, template: "<div\n class=\"ngx-drawer-root\"\n [class]=\"'behavior-' + contentBehavior()\"\n [style.perspective.px]=\"1200\">\n @if (swipeEnabled() && !open()) {\n <div\n class=\"ngx-drawer-edge-zone\"\n [class.edge-start]=\"side() === 'start'\"\n [class.edge-end]=\"side() === 'end'\"\n [style.--ngx-drawer-edge-size]=\"swipeEdgeSize() + 'px'\"\n (mousedown)=\"onEdgeDragStart($event)\"\n (touchstart)=\"onEdgeDragStart($event)\"></div>\n }\n\n @if (visualOpen() > 0 && contentBehavior() === 'overlay') {\n <div\n class=\"ngx-drawer-backdrop\"\n [style.opacity]=\"visualOpen()\"\n [class.no-transition]=\"isDragging()\"\n (click)=\"closeFromBackdrop()\"></div>\n }\n\n <div\n class=\"ngx-drawer-main\"\n [class.no-transition]=\"isDragging()\"\n [style.--ngx-drawer-width]=\"width() + 'px'\"\n [style.--ngx-drawer-open]=\"visualOpen()\"\n [style.--ngx-drawer-dir]=\"pushDirSign()\">\n <ng-content></ng-content>\n\n @if (visualOpen() > 0 && contentBehavior() !== 'overlay') {\n <div\n class=\"ngx-drawer-main-dim\"\n [style.opacity]=\"visualOpen() * 0.35\"\n (click)=\"closeFromBackdrop()\"></div>\n }\n </div>\n\n <aside\n class=\"ngx-drawer-panel\"\n [class]=\"'effect-' + effect()\"\n [class.side-start]=\"side() === 'start'\"\n [class.side-end]=\"side() === 'end'\"\n [class.no-transition]=\"isDragging()\"\n [class.is-open]=\"open()\"\n [class.playing]=\"playEffectClass()\"\n [style.--ngx-drawer-width]=\"width() + 'px'\"\n [style.--ngx-drawer-open]=\"visualOpen()\"\n role=\"dialog\"\n aria-modal=\"true\">\n <div\n class=\"ngx-drawer-drag-handle\"\n [class.edge-start]=\"side() === 'start'\"\n [class.edge-end]=\"side() === 'end'\"\n (mousedown)=\"onPanelDragStart($event)\"\n (touchstart)=\"onPanelDragStart($event)\"></div>\n\n <div class=\"ngx-drawer-content\">\n <ng-content select=\"[drawerContent]\"></ng-content>\n </div>\n\n @if (effect() === 'curtain') {\n <div\n class=\"ngx-drawer-curtain\"\n [class.open]=\"open()\"\n [class.revealed]=\"visualOpen() >= 1 && !isDragging()\">\n @for (i of strips(); track i) {\n <div\n class=\"ngx-drawer-strip\"\n [class.side-start]=\"side() === 'start'\"\n [class.side-end]=\"side() === 'end'\"\n [style.transition-delay]=\"stripDelay(i)\"></div>\n }\n </div>\n }\n </aside>\n</div>\n", styles: ["@charset \"UTF-8\";:host{display:contents}:host{display:block;position:relative}.ngx-drawer-root{display:block;position:relative;min-block-size:100%}.ngx-drawer-edge-zone{position:fixed;inset-block:0;inline-size:var(--ngx-drawer-edge-size, 24px);z-index:1400;touch-action:pan-y}.ngx-drawer-edge-zone.edge-start{inset-inline-start:0}.ngx-drawer-edge-zone.edge-end{inset-inline-end:0}.ngx-drawer-backdrop{position:fixed;inset:0;background:#00000080;z-index:1450;transition:opacity .22s ease}.ngx-drawer-backdrop.no-transition{transition:none}.ngx-drawer-main{position:relative;min-block-size:100%;transition:transform .32s cubic-bezier(.22,.9,.32,1)}.ngx-drawer-main.no-transition{transition:none}.ngx-drawer-main-dim{position:absolute;inset:0;background:#000;pointer-events:auto;transition:opacity .22s ease}.behavior-push .ngx-drawer-main{transform:translate(calc(var(--ngx-drawer-open, 0) * var(--ngx-drawer-width, 280px) * var(--ngx-drawer-dir, 1)))}.behavior-reveal .ngx-drawer-main{transform-origin:center;border-radius:calc(var(--ngx-drawer-open, 0) * 16px);overflow:hidden;transform:scale(calc(1 - .08 * var(--ngx-drawer-open, 0))) translate(calc(var(--ngx-drawer-open, 0) * var(--ngx-drawer-width, 280px) * .28 * var(--ngx-drawer-dir, 1)))}.ngx-drawer-panel{position:fixed;inset-block:0;inline-size:var(--ngx-drawer-width, 280px);background:light-dark(#ffffff,#1c1c20);color:light-dark(#111827,#f4f4f5);z-index:1500;box-shadow:0 0 24px #00000040;overflow:hidden;transition:inset-inline-start .32s cubic-bezier(.22,.9,.32,1),inset-inline-end .32s cubic-bezier(.22,.9,.32,1),transform .32s cubic-bezier(.22,.9,.32,1),opacity .32s ease}.ngx-drawer-panel.side-start{inset-inline-start:calc((var(--ngx-drawer-open, 0) - 1) * var(--ngx-drawer-width, 280px))}.ngx-drawer-panel.side-end{inset-inline-end:calc((var(--ngx-drawer-open, 0) - 1) * var(--ngx-drawer-width, 280px))}.ngx-drawer-panel.no-transition{transition:none}.ngx-drawer-drag-handle{position:absolute;inset-block:0;inline-size:20px;z-index:2;touch-action:pan-y}.ngx-drawer-drag-handle.edge-start{inset-inline-end:-10px}.ngx-drawer-drag-handle.edge-end{inset-inline-start:-10px}.ngx-drawer-content{position:relative;block-size:100%;overflow-y:auto}.effect-scale.side-start{inset-inline-start:0;inset-inline-end:auto}.effect-scale.side-end{inset-inline-start:auto;inset-inline-end:0}.effect-scale{transform-origin:center;transform:scale(calc(.72 + .28 * var(--ngx-drawer-open, 0)));opacity:var(--ngx-drawer-open, 0);pointer-events:none}.effect-scale.is-open{pointer-events:auto}.effect-rotate3d{transform-style:preserve-3d;opacity:calc(.35 + .65 * var(--ngx-drawer-open, 0))}.effect-rotate3d.side-start{inset-inline-start:0;inset-inline-end:auto;transform-origin:left center;transform:rotateY(calc((1 - var(--ngx-drawer-open, 0)) * -100deg))}.effect-rotate3d.side-end{inset-inline-start:auto;inset-inline-end:0;transform-origin:right center;transform:rotateY(calc((1 - var(--ngx-drawer-open, 0)) * 100deg))}.effect-flip3d{transform-style:preserve-3d;box-shadow:0 0 30px #00000059}.effect-flip3d.side-start{inset-inline-start:0;inset-inline-end:auto;transform-origin:left center;transform:rotateY(calc((1 - var(--ngx-drawer-open, 0)) * -115deg)) translateZ(calc((1 - var(--ngx-drawer-open, 0)) * -50px))}.effect-flip3d.side-end{inset-inline-start:auto;inset-inline-end:0;transform-origin:right center;transform:rotateY(calc((1 - var(--ngx-drawer-open, 0)) * 115deg)) translateZ(calc((1 - var(--ngx-drawer-open, 0)) * -50px))}@keyframes ngx-drawer-jelly-open{0%{transform:scaleX(.55) skewY(4deg)}35%{transform:scaleX(1.09) skewY(-2.5deg)}55%{transform:scaleX(.96) skewY(1.5deg)}75%{transform:scaleX(1.03) skewY(-.6deg)}to{transform:scaleX(1) skewY(0)}}@keyframes ngx-drawer-jelly-close{0%{transform:scaleX(1) skewY(0)}30%{transform:scaleX(1.07) skewY(2deg)}to{transform:scaleX(.4) skewY(-5deg)}}.effect-jelly.side-start{transform-origin:left center}.effect-jelly.side-end{transform-origin:right center}.effect-jelly.playing.is-open{animation:ngx-drawer-jelly-open .62s cubic-bezier(.34,1.56,.64,1) both}.effect-jelly.playing:not(.is-open){animation:ngx-drawer-jelly-close .48s ease-in both}@keyframes ngx-drawer-pull-open{0%{transform:scaleX(.5)}60%{transform:scaleX(1.14)}to{transform:scaleX(1)}}@keyframes ngx-drawer-pull-close{0%{transform:scaleX(1)}40%{transform:scaleX(1.12)}to{transform:scaleX(.5)}}.effect-pull.side-start{transform-origin:left center}.effect-pull.side-end{transform-origin:right center}.effect-pull.playing.is-open{animation:ngx-drawer-pull-open .42s cubic-bezier(.16,1,.3,1) both}.effect-pull.playing:not(.is-open){animation:ngx-drawer-pull-close .38s ease-in both}.ngx-drawer-curtain{position:absolute;inset:0;display:flex;z-index:1;pointer-events:none}.ngx-drawer-curtain.revealed{display:none}.ngx-drawer-strip{flex:1 1 0;background:light-dark(#ffffff,#1c1c20);transform:scaleX(1);transition:transform .32s cubic-bezier(.65,0,.35,1)}.ngx-drawer-strip.side-start{transform-origin:left center}.ngx-drawer-strip.side-end{transform-origin:right center}.ngx-drawer-curtain.open .ngx-drawer-strip{transform:scaleX(0)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
176
+ }
177
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NgxDrawerMenuComponent, decorators: [{
178
+ type: Component,
179
+ args: [{ selector: 'ngx-drawer-menu', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, host: { class: 'ngx-drawer-menu-host' }, template: "<div\n class=\"ngx-drawer-root\"\n [class]=\"'behavior-' + contentBehavior()\"\n [style.perspective.px]=\"1200\">\n @if (swipeEnabled() && !open()) {\n <div\n class=\"ngx-drawer-edge-zone\"\n [class.edge-start]=\"side() === 'start'\"\n [class.edge-end]=\"side() === 'end'\"\n [style.--ngx-drawer-edge-size]=\"swipeEdgeSize() + 'px'\"\n (mousedown)=\"onEdgeDragStart($event)\"\n (touchstart)=\"onEdgeDragStart($event)\"></div>\n }\n\n @if (visualOpen() > 0 && contentBehavior() === 'overlay') {\n <div\n class=\"ngx-drawer-backdrop\"\n [style.opacity]=\"visualOpen()\"\n [class.no-transition]=\"isDragging()\"\n (click)=\"closeFromBackdrop()\"></div>\n }\n\n <div\n class=\"ngx-drawer-main\"\n [class.no-transition]=\"isDragging()\"\n [style.--ngx-drawer-width]=\"width() + 'px'\"\n [style.--ngx-drawer-open]=\"visualOpen()\"\n [style.--ngx-drawer-dir]=\"pushDirSign()\">\n <ng-content></ng-content>\n\n @if (visualOpen() > 0 && contentBehavior() !== 'overlay') {\n <div\n class=\"ngx-drawer-main-dim\"\n [style.opacity]=\"visualOpen() * 0.35\"\n (click)=\"closeFromBackdrop()\"></div>\n }\n </div>\n\n <aside\n class=\"ngx-drawer-panel\"\n [class]=\"'effect-' + effect()\"\n [class.side-start]=\"side() === 'start'\"\n [class.side-end]=\"side() === 'end'\"\n [class.no-transition]=\"isDragging()\"\n [class.is-open]=\"open()\"\n [class.playing]=\"playEffectClass()\"\n [style.--ngx-drawer-width]=\"width() + 'px'\"\n [style.--ngx-drawer-open]=\"visualOpen()\"\n role=\"dialog\"\n aria-modal=\"true\">\n <div\n class=\"ngx-drawer-drag-handle\"\n [class.edge-start]=\"side() === 'start'\"\n [class.edge-end]=\"side() === 'end'\"\n (mousedown)=\"onPanelDragStart($event)\"\n (touchstart)=\"onPanelDragStart($event)\"></div>\n\n <div class=\"ngx-drawer-content\">\n <ng-content select=\"[drawerContent]\"></ng-content>\n </div>\n\n @if (effect() === 'curtain') {\n <div\n class=\"ngx-drawer-curtain\"\n [class.open]=\"open()\"\n [class.revealed]=\"visualOpen() >= 1 && !isDragging()\">\n @for (i of strips(); track i) {\n <div\n class=\"ngx-drawer-strip\"\n [class.side-start]=\"side() === 'start'\"\n [class.side-end]=\"side() === 'end'\"\n [style.transition-delay]=\"stripDelay(i)\"></div>\n }\n </div>\n }\n </aside>\n</div>\n", styles: ["@charset \"UTF-8\";:host{display:contents}:host{display:block;position:relative}.ngx-drawer-root{display:block;position:relative;min-block-size:100%}.ngx-drawer-edge-zone{position:fixed;inset-block:0;inline-size:var(--ngx-drawer-edge-size, 24px);z-index:1400;touch-action:pan-y}.ngx-drawer-edge-zone.edge-start{inset-inline-start:0}.ngx-drawer-edge-zone.edge-end{inset-inline-end:0}.ngx-drawer-backdrop{position:fixed;inset:0;background:#00000080;z-index:1450;transition:opacity .22s ease}.ngx-drawer-backdrop.no-transition{transition:none}.ngx-drawer-main{position:relative;min-block-size:100%;transition:transform .32s cubic-bezier(.22,.9,.32,1)}.ngx-drawer-main.no-transition{transition:none}.ngx-drawer-main-dim{position:absolute;inset:0;background:#000;pointer-events:auto;transition:opacity .22s ease}.behavior-push .ngx-drawer-main{transform:translate(calc(var(--ngx-drawer-open, 0) * var(--ngx-drawer-width, 280px) * var(--ngx-drawer-dir, 1)))}.behavior-reveal .ngx-drawer-main{transform-origin:center;border-radius:calc(var(--ngx-drawer-open, 0) * 16px);overflow:hidden;transform:scale(calc(1 - .08 * var(--ngx-drawer-open, 0))) translate(calc(var(--ngx-drawer-open, 0) * var(--ngx-drawer-width, 280px) * .28 * var(--ngx-drawer-dir, 1)))}.ngx-drawer-panel{position:fixed;inset-block:0;inline-size:var(--ngx-drawer-width, 280px);background:light-dark(#ffffff,#1c1c20);color:light-dark(#111827,#f4f4f5);z-index:1500;box-shadow:0 0 24px #00000040;overflow:hidden;transition:inset-inline-start .32s cubic-bezier(.22,.9,.32,1),inset-inline-end .32s cubic-bezier(.22,.9,.32,1),transform .32s cubic-bezier(.22,.9,.32,1),opacity .32s ease}.ngx-drawer-panel.side-start{inset-inline-start:calc((var(--ngx-drawer-open, 0) - 1) * var(--ngx-drawer-width, 280px))}.ngx-drawer-panel.side-end{inset-inline-end:calc((var(--ngx-drawer-open, 0) - 1) * var(--ngx-drawer-width, 280px))}.ngx-drawer-panel.no-transition{transition:none}.ngx-drawer-drag-handle{position:absolute;inset-block:0;inline-size:20px;z-index:2;touch-action:pan-y}.ngx-drawer-drag-handle.edge-start{inset-inline-end:-10px}.ngx-drawer-drag-handle.edge-end{inset-inline-start:-10px}.ngx-drawer-content{position:relative;block-size:100%;overflow-y:auto}.effect-scale.side-start{inset-inline-start:0;inset-inline-end:auto}.effect-scale.side-end{inset-inline-start:auto;inset-inline-end:0}.effect-scale{transform-origin:center;transform:scale(calc(.72 + .28 * var(--ngx-drawer-open, 0)));opacity:var(--ngx-drawer-open, 0);pointer-events:none}.effect-scale.is-open{pointer-events:auto}.effect-rotate3d{transform-style:preserve-3d;opacity:calc(.35 + .65 * var(--ngx-drawer-open, 0))}.effect-rotate3d.side-start{inset-inline-start:0;inset-inline-end:auto;transform-origin:left center;transform:rotateY(calc((1 - var(--ngx-drawer-open, 0)) * -100deg))}.effect-rotate3d.side-end{inset-inline-start:auto;inset-inline-end:0;transform-origin:right center;transform:rotateY(calc((1 - var(--ngx-drawer-open, 0)) * 100deg))}.effect-flip3d{transform-style:preserve-3d;box-shadow:0 0 30px #00000059}.effect-flip3d.side-start{inset-inline-start:0;inset-inline-end:auto;transform-origin:left center;transform:rotateY(calc((1 - var(--ngx-drawer-open, 0)) * -115deg)) translateZ(calc((1 - var(--ngx-drawer-open, 0)) * -50px))}.effect-flip3d.side-end{inset-inline-start:auto;inset-inline-end:0;transform-origin:right center;transform:rotateY(calc((1 - var(--ngx-drawer-open, 0)) * 115deg)) translateZ(calc((1 - var(--ngx-drawer-open, 0)) * -50px))}@keyframes ngx-drawer-jelly-open{0%{transform:scaleX(.55) skewY(4deg)}35%{transform:scaleX(1.09) skewY(-2.5deg)}55%{transform:scaleX(.96) skewY(1.5deg)}75%{transform:scaleX(1.03) skewY(-.6deg)}to{transform:scaleX(1) skewY(0)}}@keyframes ngx-drawer-jelly-close{0%{transform:scaleX(1) skewY(0)}30%{transform:scaleX(1.07) skewY(2deg)}to{transform:scaleX(.4) skewY(-5deg)}}.effect-jelly.side-start{transform-origin:left center}.effect-jelly.side-end{transform-origin:right center}.effect-jelly.playing.is-open{animation:ngx-drawer-jelly-open .62s cubic-bezier(.34,1.56,.64,1) both}.effect-jelly.playing:not(.is-open){animation:ngx-drawer-jelly-close .48s ease-in both}@keyframes ngx-drawer-pull-open{0%{transform:scaleX(.5)}60%{transform:scaleX(1.14)}to{transform:scaleX(1)}}@keyframes ngx-drawer-pull-close{0%{transform:scaleX(1)}40%{transform:scaleX(1.12)}to{transform:scaleX(.5)}}.effect-pull.side-start{transform-origin:left center}.effect-pull.side-end{transform-origin:right center}.effect-pull.playing.is-open{animation:ngx-drawer-pull-open .42s cubic-bezier(.16,1,.3,1) both}.effect-pull.playing:not(.is-open){animation:ngx-drawer-pull-close .38s ease-in both}.ngx-drawer-curtain{position:absolute;inset:0;display:flex;z-index:1;pointer-events:none}.ngx-drawer-curtain.revealed{display:none}.ngx-drawer-strip{flex:1 1 0;background:light-dark(#ffffff,#1c1c20);transform:scaleX(1);transition:transform .32s cubic-bezier(.65,0,.35,1)}.ngx-drawer-strip.side-start{transform-origin:left center}.ngx-drawer-strip.side-end{transform-origin:right center}.ngx-drawer-curtain.open .ngx-drawer-strip{transform:scaleX(0)}\n"] }]
180
+ }], ctorParameters: () => [], propDecorators: { side: [{ type: i0.Input, args: [{ isSignal: true, alias: "side", required: false }] }], effect: [{ type: i0.Input, args: [{ isSignal: true, alias: "effect", required: false }] }], contentBehavior: [{ type: i0.Input, args: [{ isSignal: true, alias: "contentBehavior", required: false }] }], width: [{ type: i0.Input, args: [{ isSignal: true, alias: "width", required: false }] }], swipeEdgeSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "swipeEdgeSize", required: false }] }], curtainStrips: [{ type: i0.Input, args: [{ isSignal: true, alias: "curtainStrips", required: false }] }], backdropClose: [{ type: i0.Input, args: [{ isSignal: true, alias: "backdropClose", required: false }] }], swipeEnabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "swipeEnabled", required: false }] }], respondToViewport: [{ type: i0.Input, args: [{ isSignal: true, alias: "respondToViewport", required: false }] }], openOnDesktop: [{ type: i0.Input, args: [{ isSignal: true, alias: "openOnDesktop", required: false }] }], openOnMobile: [{ type: i0.Input, args: [{ isSignal: true, alias: "openOnMobile", required: false }] }], mobileBreakpoint: [{ type: i0.Input, args: [{ isSignal: true, alias: "mobileBreakpoint", required: false }] }], open: [{ type: i0.Input, args: [{ isSignal: true, alias: "open", required: false }] }, { type: i0.Output, args: ["openChange"] }], onEscape: [{
181
+ type: HostListener,
182
+ args: ['document:keydown.escape']
183
+ }] } });
184
+
185
+ /**
186
+ * Generated bundle index. Do not edit.
187
+ */
188
+
189
+ export { NgxDrawerMenuComponent };
190
+ //# sourceMappingURL=ngx-kit-drawer-menu.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ngx-kit-drawer-menu.mjs","sources":["../../../projects/libs/drawer-menu/components/drawer-menu.component.ts","../../../projects/libs/drawer-menu/components/drawer-menu.component.html","../../../projects/libs/drawer-menu/ngx-kit-drawer-menu.ts"],"sourcesContent":["import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n DOCUMENT,\n HostListener,\n computed,\n effect,\n inject,\n input,\n model,\n signal,\n} from '@angular/core';\nimport { DirectionService, startDragSession } from 'ngx-kit/shared';\nimport {\n NgxDrawerContentBehavior,\n NgxDrawerEffect,\n NgxDrawerSide,\n} from '../contracts/drawer-menu-types';\n\n/**\n * درور منو (side drawer) با ۶ جلوه‌ی بازوبسته‌شدنِ متفاوت (از ساده تا\n * سه‌بعدی/ژله‌ای) و ۳ رفتار برای محتوای صفحه (overlay/push/reveal) —\n * دقیقاً مدل کتابخونه‌های حرفه‌ای مثل react-burger-menu یا Ionic Menu، ولی\n * signal-based و بدون هیچ وابستگی خارجی.\n *\n * نکات معماری:\n * - از 'start'/'end' منطقی استفاده می‌کنه، پس با CSS logical properties\n * زیر RTL خودکار برعکس می‌شه؛ فقط ریاضیِ درگ (که برخلاف CSS جهت فیزیکیِ\n * واقعی لازم داره) از DirectionService مشترک استفاده می‌کنه.\n * - وضعیت باز/بسته با model() دوطرفه‌ست، پس هم با [(open)] قابل کنترله و\n * هم می‌تونه به‌صورت خودکار و زنده با عرض صفحه هماهنگ بشه (respondToViewport)\n * — یعنی رد شدن از breakpoint (نه فقط بار اول لود) می‌تونه خودکار باز/بسته‌ش کنه.\n * - افکت‌های jelly/pull با keyframe سه‌مرحله‌ای (overshoot → نوسان → استقرار)\n * پیاده شدن، نه فقط یه transition ساده.\n */\n@Component({\n selector: 'ngx-drawer-menu',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './drawer-menu.component.html',\n styleUrl: './drawer-menu.component.scss',\n host: { class: 'ngx-drawer-menu-host' },\n})\nexport class NgxDrawerMenuComponent {\n side = input<NgxDrawerSide>('start');\n effect = input<NgxDrawerEffect>('slide');\n contentBehavior = input<NgxDrawerContentBehavior>('overlay');\n width = input<number>(280);\n swipeEdgeSize = input<number>(24);\n curtainStrips = input<number>(7);\n backdropClose = input<boolean>(true);\n swipeEnabled = input<boolean>(true);\n\n /** اگه true باشه، رد شدن از mobileBreakpoint به‌صورت زنده open رو با openOnDesktop/openOnMobile هماهنگ می‌کنه */\n respondToViewport = input<boolean>(true);\n openOnDesktop = input<boolean>(true);\n openOnMobile = input<boolean>(false);\n mobileBreakpoint = input<number>(768);\n\n /** state دوطرفه‌ی باز/بسته؛ با [(open)] قابل bind هست */\n open = model<boolean>(false);\n\n private readonly directionService = inject(DirectionService);\n private readonly doc = inject(DOCUMENT);\n private readonly destroyRef = inject(DestroyRef);\n\n /** فقط حین یه درگِ واقعی مقدار داره؛ null یعنی از روی open() تصمیم بگیر */\n protected readonly dragRatio = signal<number | null>(null);\n protected readonly isDragging = computed(() => this.dragRatio() !== null);\n protected readonly visualOpen = computed(() => this.dragRatio() ?? (this.open() ? 1 : 0));\n protected readonly strips = computed(() =>\n Array.from({ length: this.curtainStrips() }, (_, i) => i),\n );\n\n /**\n * +۱ یعنی این پنل فیزیکاً روی لبه‌ی چپِ صفحه‌ست، -۱ یعنی لبه‌ی راست —\n * برای transform:translateX() محتوای اصلی (که برخلاف inset-inline، به\n * dir=rtl خودکار واکنش نشون نمی‌ده) لازمه. reactive هست چون هم به side()\n * و هم به جهتِ زنده‌ی صفحه (directionService.isRtl()) وابسته‌ست.\n */\n protected readonly pushDirSign = computed(() => (this.isPhysicalLeftEdge() ? 1 : -1));\n\n /** برای افکت‌های keyframe‌محور (jelly/pull) — فقط لحظه‌ی رهاشدن (نه حین درگ زنده) پخش می‌شه */\n protected readonly playEffectClass = signal(false);\n\n private stopDrag?: () => void;\n private dragStartX = 0;\n private dragStartRatio = 0;\n private prevOpen = false;\n\n constructor() {\n // قفل اسکرول پس‌زمینه حین باز بودن پنل (فقط در حالت overlay واقعاً لازمه،\n // ولی در push/reveal هم بی‌ضرره و تجربه‌ی بهتری می‌ده)\n effect((onCleanup) => {\n if (this.open() && this.contentBehavior() === 'overlay') {\n const prevOverflow = this.doc.body.style.overflow;\n this.doc.body.style.overflow = 'hidden';\n onCleanup(() => {\n this.doc.body.style.overflow = prevOverflow;\n });\n }\n });\n\n // پخش انیمیشن keyframe‌محور فقط لحظه‌ای که open() واقعاً عوض می‌شه (نه هر CD)\n effect(() => {\n const isOpen = this.open();\n if (isOpen !== this.prevOpen) {\n this.prevOpen = isOpen;\n this.playEffectClass.set(true);\n const id = setTimeout(() => this.playEffectClass.set(false), 700);\n // پاک‌سازی در صورتی که کامپوننت زودتر destroy بشه\n this.destroyRef.onDestroy(() => clearTimeout(id));\n }\n });\n\n this.destroyRef.onDestroy(() => this.stopDrag?.());\n\n // هماهنگیِ زنده با breakpoint\n if (typeof window !== 'undefined') {\n const mql = window.matchMedia(`(min-width: ${this.mobileBreakpoint()}px)`);\n const applyForCurrentViewport = (isDesktop: boolean) => {\n if (this.respondToViewport()) {\n this.open.set(isDesktop ? this.openOnDesktop() : this.openOnMobile());\n }\n };\n applyForCurrentViewport(mql.matches);\n const handler = (e: MediaQueryListEvent) => applyForCurrentViewport(e.matches);\n mql.addEventListener('change', handler);\n this.destroyRef.onDestroy(() => mql.removeEventListener('change', handler));\n }\n }\n\n @HostListener('document:keydown.escape')\n protected onEscape(): void {\n if (this.open()) this.open.set(false);\n }\n\n protected closeFromBackdrop(): void {\n if (this.backdropClose()) this.open.set(false);\n }\n\n toggle(): void {\n this.open.update((o) => !o);\n }\n\n /** true یعنی این پنل فیزیکاً روی لبه‌ی چپِ صفحه‌ست (صرف‌نظر از start/end منطقی) */\n private isPhysicalLeftEdge(): boolean {\n const isRtl = this.directionService.isRtl();\n return this.side() === 'start' ? !isRtl : isRtl;\n }\n\n protected stripDelay(index: number): string {\n const count = this.curtainStrips();\n const order = this.open() ? index : count - 1 - index;\n return `${order * 28}ms`;\n }\n\n // ---------- درگ (هم برای باز کردن از لبه، هم بستن با کشیدنِ پنل) ----------\n protected onEdgeDragStart(ev: MouseEvent | TouchEvent): void {\n if (!this.swipeEnabled() || this.open()) return;\n this.beginDrag(ev, 0);\n }\n\n protected onPanelDragStart(ev: MouseEvent | TouchEvent): void {\n if (!this.open()) return;\n this.beginDrag(ev, 1);\n }\n\n private beginDrag(ev: MouseEvent | TouchEvent, startRatio: number): void {\n ev.preventDefault();\n this.dragStartX = this.clientXOf(ev);\n this.dragStartRatio = startRatio;\n this.dragRatio.set(startRatio);\n this.stopDrag?.();\n this.stopDrag = startDragSession({\n onMove: (moveEv) => {\n const dx = this.clientXOf(moveEv) - this.dragStartX;\n const opensToward = this.isPhysicalLeftEdge() ? 1 : -1;\n const signedRatio = (dx * opensToward) / this.width();\n const ratio = Math.min(1, Math.max(0, this.dragStartRatio + signedRatio));\n this.dragRatio.set(ratio);\n },\n onEnd: () => {\n const ratio = this.dragRatio() ?? this.dragStartRatio;\n this.open.set(ratio > 0.4);\n this.dragRatio.set(null);\n this.stopDrag = undefined;\n },\n });\n }\n\n private clientXOf(ev: MouseEvent | TouchEvent): number {\n return 'touches' in ev\n ? (ev.touches[0]?.clientX ?? ev.changedTouches[0]?.clientX ?? 0)\n : ev.clientX;\n }\n}\n","<div\n class=\"ngx-drawer-root\"\n [class]=\"'behavior-' + contentBehavior()\"\n [style.perspective.px]=\"1200\">\n @if (swipeEnabled() && !open()) {\n <div\n class=\"ngx-drawer-edge-zone\"\n [class.edge-start]=\"side() === 'start'\"\n [class.edge-end]=\"side() === 'end'\"\n [style.--ngx-drawer-edge-size]=\"swipeEdgeSize() + 'px'\"\n (mousedown)=\"onEdgeDragStart($event)\"\n (touchstart)=\"onEdgeDragStart($event)\"></div>\n }\n\n @if (visualOpen() > 0 && contentBehavior() === 'overlay') {\n <div\n class=\"ngx-drawer-backdrop\"\n [style.opacity]=\"visualOpen()\"\n [class.no-transition]=\"isDragging()\"\n (click)=\"closeFromBackdrop()\"></div>\n }\n\n <div\n class=\"ngx-drawer-main\"\n [class.no-transition]=\"isDragging()\"\n [style.--ngx-drawer-width]=\"width() + 'px'\"\n [style.--ngx-drawer-open]=\"visualOpen()\"\n [style.--ngx-drawer-dir]=\"pushDirSign()\">\n <ng-content></ng-content>\n\n @if (visualOpen() > 0 && contentBehavior() !== 'overlay') {\n <div\n class=\"ngx-drawer-main-dim\"\n [style.opacity]=\"visualOpen() * 0.35\"\n (click)=\"closeFromBackdrop()\"></div>\n }\n </div>\n\n <aside\n class=\"ngx-drawer-panel\"\n [class]=\"'effect-' + effect()\"\n [class.side-start]=\"side() === 'start'\"\n [class.side-end]=\"side() === 'end'\"\n [class.no-transition]=\"isDragging()\"\n [class.is-open]=\"open()\"\n [class.playing]=\"playEffectClass()\"\n [style.--ngx-drawer-width]=\"width() + 'px'\"\n [style.--ngx-drawer-open]=\"visualOpen()\"\n role=\"dialog\"\n aria-modal=\"true\">\n <div\n class=\"ngx-drawer-drag-handle\"\n [class.edge-start]=\"side() === 'start'\"\n [class.edge-end]=\"side() === 'end'\"\n (mousedown)=\"onPanelDragStart($event)\"\n (touchstart)=\"onPanelDragStart($event)\"></div>\n\n <div class=\"ngx-drawer-content\">\n <ng-content select=\"[drawerContent]\"></ng-content>\n </div>\n\n @if (effect() === 'curtain') {\n <div\n class=\"ngx-drawer-curtain\"\n [class.open]=\"open()\"\n [class.revealed]=\"visualOpen() >= 1 && !isDragging()\">\n @for (i of strips(); track i) {\n <div\n class=\"ngx-drawer-strip\"\n [class.side-start]=\"side() === 'start'\"\n [class.side-end]=\"side() === 'end'\"\n [style.transition-delay]=\"stripDelay(i)\"></div>\n }\n </div>\n }\n </aside>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}