ngx-kit 5.0.0 → 6.0.0

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 +562 -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 +150 -0
@@ -0,0 +1,175 @@
1
+ import * as _angular_core from '@angular/core';
2
+
3
+ interface NgxCropRect {
4
+ /** همه به پیکسل‌های واقعیِ تصویر مبدأ (نه پیکسل صفحه) */
5
+ x: number;
6
+ y: number;
7
+ width: number;
8
+ height: number;
9
+ }
10
+ type NgxImageFilterPreset = 'none' | 'grayscale' | 'sepia' | 'invert' | 'cartoon';
11
+ interface NgxImageEditorAdjustments {
12
+ /** همه ۱۰۰ یعنی بدون تغییر؛ بازه‌ی معقول ۰ تا ۲۰۰ */
13
+ brightness: number;
14
+ contrast: number;
15
+ saturation: number;
16
+ /** درجه، ۹۰-درجه‌ای یا آزاد */
17
+ rotation: number;
18
+ filter: NgxImageFilterPreset;
19
+ }
20
+ interface NgxImageEditorResult {
21
+ blob: Blob;
22
+ dataUrl: string;
23
+ width: number;
24
+ height: number;
25
+ }
26
+
27
+ interface NgxPointerDragDelta {
28
+ dx: number;
29
+ dy: number;
30
+ }
31
+ /**
32
+ * درگ عمومی روی پایه‌ی Pointer Events + setPointerCapture (دقیقاً همون
33
+ * تکنیکی که در ngx-kit/data-table برای ریسایز ستون استفاده شده) — نیازی به
34
+ * listener سطح document نداره چون بعد از setPointerCapture، رویدادهای
35
+ * pointermove/pointerup حتی بیرون از محدوده‌ی المنت هم به خودش می‌رسن.
36
+ *
37
+ * dx/dy تجمعی از لحظه‌ی pointerdown هستن (نه دلتای بین دو move متوالی)، چون
38
+ * معمولاً مصرف‌کننده می‌خواد «موقعیت شروع + دلتای کل» رو حساب کنه، نه جمع
39
+ * تدریجی گرد شونده‌ی دلتاهای ریز.
40
+ */
41
+ declare class NgxPointerDragDirective {
42
+ dragStart: _angular_core.OutputEmitterRef<void>;
43
+ dragMove: _angular_core.OutputEmitterRef<NgxPointerDragDelta>;
44
+ dragEnd: _angular_core.OutputEmitterRef<void>;
45
+ private dragging;
46
+ private startX;
47
+ private startY;
48
+ onPointerDown(ev: PointerEvent): void;
49
+ onPointerMove(ev: PointerEvent): void;
50
+ onPointerUp(): void;
51
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgxPointerDragDirective, never>;
52
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<NgxPointerDragDirective, "[ngxPointerDrag]", never, {}, { "dragStart": "dragStart"; "dragMove": "dragMove"; "dragEnd": "dragEnd"; }, never, never, true, never>;
53
+ }
54
+
55
+ type Corner = 'nw' | 'ne' | 'sw' | 'se';
56
+ /**
57
+ * ویرایشگر تصویر: کراپ + چرخش + روشنایی/کنتراست/اشباع + فیلترهای آماده
58
+ * (سیاه‌وسفید، سپیا، معکوس، کارتونی) + فشرده‌سازی خروجی. کاملاً روی Canvas
59
+ * خام پیاده شده، بدون هیچ وابستگی خارجی‌ای.
60
+ *
61
+ * نکته‌ی مهمِ معماری: تمام تعامل زنده (چرخوندن، جابه‌جا/ریسایز کراپ‌باکس،
62
+ * پیش‌نمایش فیلترها حتی کارتونی) روی یه کپیِ کوچیک‌شده از تصویر انجام می‌شه
63
+ * (createWorkingCopy)، نه روی تصویر اصلی که ممکنه چند مگاپیکسل باشه — وگرنه
64
+ * درگ‌کردن اسلایدرها/گوشه‌های کراپ رو کاربر حس تاخیر می‌کرد. فقط لحظه‌ی
65
+ * save()، رندر نهایی از روی تصویر اصلیِ کامل انجام می‌شه.
66
+ */
67
+ declare class NgxImageEditorComponent {
68
+ source: _angular_core.InputSignal<string | Blob | File | null>;
69
+ /** قفل نسبتِ کراپ (مثلاً ۱ برای آواتار مربعی)؛ undefined یعنی آزاد */
70
+ aspectRatio: _angular_core.InputSignal<number | undefined>;
71
+ outputMaxWidth: _angular_core.InputSignal<number | undefined>;
72
+ outputMaxHeight: _angular_core.InputSignal<number | undefined>;
73
+ outputType: _angular_core.InputSignal<"image/jpeg" | "image/png" | "image/webp">;
74
+ /** حداکثر عرض نمایشِ ناحیه‌ی کراپ روی صفحه (پیکسل) */
75
+ displayMaxWidth: _angular_core.InputSignal<number>;
76
+ saved: _angular_core.OutputEmitterRef<NgxImageEditorResult>;
77
+ cancelled: _angular_core.OutputEmitterRef<void>;
78
+ protected readonly loading: _angular_core.WritableSignal<boolean>;
79
+ protected readonly saving: _angular_core.WritableSignal<boolean>;
80
+ protected readonly loadError: _angular_core.WritableSignal<string | null>;
81
+ private readonly originalImage;
82
+ private readonly workingCanvas;
83
+ protected readonly rotation: _angular_core.WritableSignal<number>;
84
+ protected readonly brightness: _angular_core.WritableSignal<number>;
85
+ protected readonly contrast: _angular_core.WritableSignal<number>;
86
+ protected readonly saturation: _angular_core.WritableSignal<number>;
87
+ protected readonly filterPreset: _angular_core.WritableSignal<NgxImageFilterPreset>;
88
+ protected readonly quality: _angular_core.WritableSignal<number>;
89
+ protected readonly crop: _angular_core.WritableSignal<NgxCropRect>;
90
+ protected readonly adjustments: _angular_core.Signal<NgxImageEditorAdjustments>;
91
+ /** تصویرِ (کوچیک‌شده‌یِ) چرخیده — پایه‌ی نمایش صحنه‌ی کراپ */
92
+ protected readonly rotatedWorkingCanvas: _angular_core.Signal<HTMLCanvasElement | null>;
93
+ protected readonly displayScale: _angular_core.Signal<number>;
94
+ protected readonly stageImageUrl: _angular_core.Signal<string | null>;
95
+ protected readonly stageSize: _angular_core.Signal<{
96
+ width: number;
97
+ height: number;
98
+ }>;
99
+ protected readonly cropOverlayStyle: _angular_core.Signal<{
100
+ left: string;
101
+ top: string;
102
+ width: string;
103
+ height: string;
104
+ }>;
105
+ /** پیش‌نمایش نهایی (کوچیک، حداکثر ۴۸۰ پیکسل) — شامل همه‌چیز، حتی افکت کارتونی */
106
+ protected readonly previewUrl: _angular_core.Signal<string | null>;
107
+ private moveSnapshot;
108
+ private resizeSnapshot;
109
+ constructor();
110
+ private resetAdjustments;
111
+ protected rotateBy(delta: number): void;
112
+ protected setFilter(preset: NgxImageFilterPreset): void;
113
+ protected onMoveDragStart(): void;
114
+ protected onMoveDragMove(delta: NgxPointerDragDelta): void;
115
+ protected onResizeDragStart(): void;
116
+ protected onResizeDragMove(corner: Corner, delta: NgxPointerDragDelta): void;
117
+ protected cancel(): void;
118
+ save(): Promise<void>;
119
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgxImageEditorComponent, never>;
120
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgxImageEditorComponent, "ngx-image-editor", never, { "source": { "alias": "source"; "required": false; "isSignal": true; }; "aspectRatio": { "alias": "aspectRatio"; "required": false; "isSignal": true; }; "outputMaxWidth": { "alias": "outputMaxWidth"; "required": false; "isSignal": true; }; "outputMaxHeight": { "alias": "outputMaxHeight"; "required": false; "isSignal": true; }; "outputType": { "alias": "outputType"; "required": false; "isSignal": true; }; "displayMaxWidth": { "alias": "displayMaxWidth"; "required": false; "isSignal": true; }; }, { "saved": "saved"; "cancelled": "cancelled"; }, never, never, true, never>;
121
+ }
122
+
123
+ /** یه File/Blob/data-URL/URL رو به یک HTMLImageElement بارگذاری‌شده تبدیل می‌کنه */
124
+ declare function loadImage(source: File | Blob | string): Promise<HTMLImageElement>;
125
+ /** canvas.toBlob به‌صورت Promise، به‌همراه fallback برای مرورگرهای قدیمی‌تر */
126
+ declare function canvasToBlob(canvas: HTMLCanvasElement, type?: string, quality?: number): Promise<Blob>;
127
+ /**
128
+ * یه کپیِ کوچیک‌شده از تصویر اصلی می‌سازه که کل UI ویرایشگر (چرخش، کراپ،
129
+ * پیش‌نمایش فیلترها/کارتونی) روی همین کار می‌کنه، نه روی تصویر اصلی که
130
+ * ممکنه چند مگاپیکسل باشه. این باعث می‌شه درگ‌کردنِ اسلایدرها یا لبه‌های
131
+ * کراپ روون بمونه؛ خروجی نهایی (save) همیشه از روی تصویر اصلیِ کامل رندر
132
+ * می‌شه، نه از روی این کپی.
133
+ */
134
+ declare function createWorkingCopy(img: HTMLImageElement, maxSize?: number): HTMLCanvasElement;
135
+ /** ابعاد جدید رو طوری حساب می‌کنه که از maxWidth/maxHeight بیشتر نشه، با حفظ نسبت تصویر */
136
+ declare function fitWithin(width: number, height: number, maxWidth?: number, maxHeight?: number): {
137
+ width: number;
138
+ height: number;
139
+ };
140
+
141
+ /** تصویر مبدأ رو با زاویه‌ی داده‌شده روی یه canvas جدید (به اندازه‌ی bounding-box نتیجه) می‌چرخونه */
142
+ declare function renderRotated(source: CanvasImageSource, width: number, height: number, degrees: number): HTMLCanvasElement;
143
+ /**
144
+ * کراپ + فیلترها رو روی یه canvas خروجی می‌سازه. brightness/contrast/
145
+ * saturation/grayscale/sepia/invert همه با ctx.filter بومیِ Canvas 2D انجام
146
+ * می‌شن (شتاب‌دهی‌شده توسط مرورگر، بدون حلقه‌ی پیکسلی دستی)؛ فقط cartoon
147
+ * (که معادل بومی نداره) با پردازش پیکسلی جدا انجام می‌شه.
148
+ *
149
+ * maxWidth/maxHeight برای دو حالت استفاده می‌شه: پیش‌نمایش زنده (عدد کوچیک،
150
+ * برای واکنش‌گرا موندن حین کشیدن اسلایدرها) و خروجی نهایی (بدون محدودیت یا
151
+ * محدودیت دلخواه کاربر).
152
+ */
153
+ declare function renderComposite(source: CanvasImageSource, sourceWidth: number, sourceHeight: number, crop: NgxCropRect, adjustments: NgxImageEditorAdjustments, maxWidth?: number, maxHeight?: number): HTMLCanvasElement;
154
+
155
+ /**
156
+ * افکت «کارتونی»: چون ctx.filter استاندارد چیزی شبیه cartoon نداره (فقط
157
+ * brightness/contrast/saturate/grayscale/sepia/invert/blur/hue-rotate)، این
158
+ * یکی رو واقعاً با پردازش پیکسلی پیاده کردیم؛ دو مرحله:
159
+ *
160
+ * ۱) Posterize: هر کانال رنگ به تعداد محدودی سطح گرد می‌شه (پهنه‌های رنگیِ
161
+ * صاف و یکدست، حسِ کارتونی رنگ می‌ده).
162
+ * ۲) لبه‌یابی Sobel روی نسخه‌ی خاکستریِ تصویر: هرجا شدت لبه از حد آستانه
163
+ * بیشتر باشه، پیکسل تیره می‌شه (حسِ خط دور کارتونی).
164
+ *
165
+ * روی خودِ ImageData کار می‌کنه، پس هزینه‌ش با اندازه‌ی تصویر خطی‌ست؛ برای
166
+ * تصاویر خیلی بزرگ (>~3000px) بهتره قبلش resize بشه (که در کامپوننت اصلی
167
+ * با fitWithin قبل از اعمال فیلتر انجام می‌شه).
168
+ */
169
+ declare function applyCartoonEffect(ctx: CanvasRenderingContext2D, width: number, height: number, options?: {
170
+ levels?: number;
171
+ edgeThreshold?: number;
172
+ }): void;
173
+
174
+ export { NgxImageEditorComponent, NgxPointerDragDirective, applyCartoonEffect, canvasToBlob, createWorkingCopy, fitWithin, loadImage, renderComposite, renderRotated };
175
+ export type { NgxCropRect, NgxImageEditorAdjustments, NgxImageEditorResult, NgxImageFilterPreset, NgxPointerDragDelta };
@@ -38,6 +38,7 @@ declare class NgxContextMenu implements OnDestroy {
38
38
  private overlayService;
39
39
  ngxContextMenu: i0.InputSignal<NgxMenuPanel>;
40
40
  private containerRef?;
41
+ private readonly boundOnClick;
41
42
  constructor(el: ElementRef<HTMLElement>, appRef: ApplicationRef, overlayService: OverlayService);
42
43
  ngOnDestroy(): void;
43
44
  onClick(ev: PointerEvent): void;
@@ -176,6 +176,8 @@ declare class MSG {
176
176
  static question(title: string, text?: string, options?: IMessageOptions): ngx_kit_message.MessageOutput<any>;
177
177
  static loading(title: string, text?: string, options?: IMessageOptions): ngx_kit_message.MessageOutput<any>;
178
178
  }
179
+ declare class Modal extends MSG {
180
+ }
179
181
 
180
182
  type MessageOutput<T = any> = {
181
183
  id: number;
@@ -217,6 +219,7 @@ declare class NgxMessageComponent implements OnInit, AfterViewInit {
217
219
  index: number;
218
220
  protected sanitizer: DomSanitizer;
219
221
  protected doc: Document;
222
+ private readonly messageService;
220
223
  private readonly _onClose;
221
224
  onClose: rxjs.Observable<{
222
225
  index: number;
@@ -224,6 +227,14 @@ declare class NgxMessageComponent implements OnInit, AfterViewInit {
224
227
  }>;
225
228
  ngOnInit(): void;
226
229
  ngAfterViewInit(): void;
230
+ /**
231
+ * وقتی چند تا پیام هم‌زمان باز باشن، هرکدوم listener خودشو روی document
232
+ * داشت — پس یه فشردن Escape/Enter، رویداد رو به *همه‌شون* هم‌زمان می‌فرستاد،
233
+ * نه فقط آخرین پیامی که باز شده (رفتار طبیعیِ یه استکِ مودال باید این باشه
234
+ * که فقط بالاترین لایه به کیبورد واکنش نشون بده). این چک همون چیزیه که
235
+ * OverlayService با getLastDialog() برای اورلی‌ها انجام می‌ده.
236
+ */
237
+ private isTopmost;
227
238
  onScapeKey(event: Event): void;
228
239
  onEnterKey(event: Event): void;
229
240
  onConfirm(): void;
@@ -241,8 +252,7 @@ declare class NgxMessageService {
241
252
  private injector;
242
253
  private envInjector;
243
254
  private _doc;
244
- currentAdIndex: number;
245
- alerts: ComponentRef<NgxMessageComponent>[];
255
+ alerts: Map<number, ComponentRef<NgxMessageComponent>>;
246
256
  insertedId: number;
247
257
  constructor(appRef: ApplicationRef, injector: Injector, envInjector: EnvironmentInjector, _doc: Document);
248
258
  show<T = any>(c?: IMessageOptions): MessageOutput<T>;
@@ -292,5 +302,5 @@ declare const NGX_MESSAGE_CONFIGS: InjectionToken<IMessageOptions>;
292
302
  declare const NGX_MESSAGE_API: InjectionToken<NgxMessageService>;
293
303
  declare const NGX_MESSAGE_DEFAULT_OPTIONS: MessageOptions;
294
304
 
295
- export { DismissReason, MSG, MessageOptions, NGX_MESSAGE_API, NGX_MESSAGE_CONFIGS, NGX_MESSAGE_DEFAULT_OPTIONS, NgxMessageService, provideMessage };
305
+ export { DismissReason, MSG, MessageOptions, Modal, NGX_MESSAGE_API, NGX_MESSAGE_CONFIGS, NGX_MESSAGE_DEFAULT_OPTIONS, NgxMessageService, provideMessage };
296
306
  export type { IMessageOptions, MessageOutput, MessageResult };
@@ -112,7 +112,6 @@ declare class NgxNotificationComponent implements OnInit, OnDestroy {
112
112
  onMouseLeave(): void;
113
113
  onTap(): void;
114
114
  escapeHtml(input?: string): string;
115
- ngOnDestroyCleanup(): void;
116
115
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgxNotificationComponent, never>;
117
116
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgxNotificationComponent, "ngx-notification", never, { "payload": { "alias": "payload"; "required": true; "isSignal": true; }; "containerClass": { "alias": "containerClass"; "required": false; }; }, { "onClose": "onClose"; "onFinish": "onFinish"; }, never, never, true, never>;
118
117
  }
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { OnInit, EventEmitter, ElementRef, ChangeDetectorRef, InjectionToken, ComponentRef, TemplateRef, Type, ViewContainerRef, ApplicationRef, OnDestroy, EmbeddedViewRef } from '@angular/core';
2
+ import { OnInit, OnDestroy, EventEmitter, ElementRef, ChangeDetectorRef, InjectionToken, ComponentRef, TemplateRef, Type, ViewContainerRef, ApplicationRef, EmbeddedViewRef } from '@angular/core';
3
3
  import { ControlValueAccessor, Validator, AbstractControl, ValidationErrors, FormControl } from '@angular/forms';
4
4
 
5
5
  interface IValue {
@@ -13,7 +13,7 @@ declare class ValueModel {
13
13
  thumb?: HTMLElement;
14
14
  color?: string;
15
15
  }
16
- declare class RangeSliderComponent implements OnInit, ControlValueAccessor, Validator {
16
+ declare class RangeSliderComponent implements OnInit, OnDestroy, ControlValueAccessor, Validator {
17
17
  private changeDetectorRef;
18
18
  /**
19
19
  * The step value for the slider
@@ -57,8 +57,10 @@ declare class RangeSliderComponent implements OnInit, ControlValueAccessor, Vali
57
57
  protected _validatorOnChange: () => void;
58
58
  private sliderRect?;
59
59
  private thumbRect?;
60
+ private stopDrag?;
60
61
  constructor(changeDetectorRef: ChangeDetectorRef);
61
62
  ngOnInit(): void;
63
+ ngOnDestroy(): void;
62
64
  private generateId;
63
65
  writeValue(items?: IValue[]): void;
64
66
  validate(control: AbstractControl): ValidationErrors | null;
@@ -67,14 +69,12 @@ declare class RangeSliderComponent implements OnInit, ControlValueAccessor, Vali
67
69
  registerOnTouched(fn: any): void;
68
70
  setDisabledState?(disabled: boolean): void;
69
71
  private updateRects;
70
- onDrag(ev: MouseEvent | TouchEvent): void;
71
72
  onResize(): void;
72
73
  dragStart(ev: MouseEvent | TouchEvent, index: number): void;
73
74
  addnewRangeOnSliderClick(event: MouseEvent | TouchEvent): void;
74
75
  private updateThumbPosition;
75
76
  updateAllThumbPositions(): void;
76
77
  setValueByPosition(thumb: ValueModel, thumbRec: DOMRect, sliderRec: DOMRect): void;
77
- onDragEnd(ev: MouseEvent | TouchEvent): void;
78
78
  valueChanged(): void;
79
79
  static ɵfac: i0.ɵɵFactoryDeclaration<RangeSliderComponent, never>;
80
80
  static ɵcmp: i0.ɵɵComponentDeclaration<RangeSliderComponent, "range-slider", never, { "step": { "alias": "step"; "required": false; }; "min": { "alias": "min"; "required": false; }; "max": { "alias": "max"; "required": false; }; "background": { "alias": "background"; "required": false; }; "isBgTransparent": { "alias": "isBgTransparent"; "required": false; }; "addNewRangeOnClick": { "alias": "addNewRangeOnClick"; "required": false; }; "selectedIndex": { "alias": "selectedIndex"; "required": false; }; }, { "change": "change"; "selectedIndexChange": "selectedIndexChange"; }, never, ["*"], true, never>;
@@ -85,7 +85,7 @@ interface IPosition {
85
85
  y: number;
86
86
  }
87
87
 
88
- declare class SaturationComponent implements ControlValueAccessor {
88
+ declare class SaturationComponent implements ControlValueAccessor, OnDestroy {
89
89
  width?: number;
90
90
  height?: number;
91
91
  color: string;
@@ -108,7 +108,9 @@ declare class SaturationComponent implements ControlValueAccessor {
108
108
  protected _validatorOnChange: () => void;
109
109
  private saturationRect?;
110
110
  private thumbRect?;
111
+ private stopDrag?;
111
112
  constructor();
113
+ ngOnDestroy(): void;
112
114
  private updateRects;
113
115
  writeValue(val?: IPosition | null): void;
114
116
  validate(control: AbstractControl): ValidationErrors | null;
@@ -118,16 +120,14 @@ declare class SaturationComponent implements ControlValueAccessor {
118
120
  setDisabledState?(disabled: boolean): void;
119
121
  dragStart(ev: MouseEvent | TouchEvent): void;
120
122
  onResize(): void;
121
- onDrag(ev: MouseEvent | TouchEvent): void;
122
123
  private updatePosition;
123
- onDragEnd(ev: MouseEvent | TouchEvent): void;
124
124
  setValueByPosition(thumbRec: DOMRect, saturationRec: DOMRect): void;
125
125
  valueChanged(value: IPosition): void;
126
126
  static ɵfac: i0.ɵɵFactoryDeclaration<SaturationComponent, never>;
127
127
  static ɵcmp: i0.ɵɵComponentDeclaration<SaturationComponent, "saturation", never, { "width": { "alias": "width"; "required": false; }; "height": { "alias": "height"; "required": false; }; "color": { "alias": "color"; "required": false; }; "step": { "alias": "step"; "required": false; }; "min": { "alias": "min"; "required": false; }; "max": { "alias": "max"; "required": false; }; }, { "change": "change"; }, never, never, true, never>;
128
128
  }
129
129
 
130
- declare class SliderComponent implements OnInit, ControlValueAccessor, Validator {
130
+ declare class SliderComponent implements OnInit, OnDestroy, ControlValueAccessor, Validator {
131
131
  step: number;
132
132
  min: number;
133
133
  max: number;
@@ -145,8 +145,11 @@ declare class SliderComponent implements OnInit, ControlValueAccessor, Validator
145
145
  protected _validatorOnChange: () => void;
146
146
  private sliderRect?;
147
147
  private thumbRect?;
148
+ private stopDrag?;
149
+ private readonly cd;
148
150
  constructor();
149
151
  ngOnInit(): void;
152
+ ngOnDestroy(): void;
150
153
  private updateRects;
151
154
  writeValue(val?: number | string | null): void;
152
155
  validate(control: AbstractControl): ValidationErrors | null;
@@ -155,11 +158,9 @@ declare class SliderComponent implements OnInit, ControlValueAccessor, Validator
155
158
  registerOnTouched(fn: any): void;
156
159
  setDisabledState?(disabled: boolean): void;
157
160
  dragStart(ev: MouseEvent | TouchEvent): void;
158
- onDrag(ev: MouseEvent | TouchEvent): void;
159
161
  onResize(): void;
160
162
  private updatePosition;
161
163
  setValueByPosition(thumbRec: DOMRect, sliderRec: DOMRect): void;
162
- onDragEnd(ev: MouseEvent | TouchEvent): void;
163
164
  valueChanged(value: number): void;
164
165
  static ɵfac: i0.ɵɵFactoryDeclaration<SliderComponent, never>;
165
166
  static ɵcmp: i0.ɵɵComponentDeclaration<SliderComponent, "slider", never, { "step": { "alias": "step"; "required": false; }; "min": { "alias": "min"; "required": false; }; "max": { "alias": "max"; "required": false; }; "background": { "alias": "background"; "required": false; }; "isBgTransparent": { "alias": "isBgTransparent"; "required": false; }; }, { "change": "change"; }, never, ["*"], true, never>;
@@ -172,6 +173,37 @@ declare function getOffsetPosition(evt: MouseEvent | TouchEvent, parent: HTMLEle
172
173
  y: number;
173
174
  };
174
175
 
176
+ /**
177
+ * تمام کامپوننت‌های قابل‌درگ کتابخانه (saturation، slider، range-slider،
178
+ * box-shadow) قبلاً یک الگوی تکراری داشتن:
179
+ *
180
+ * @HostListener('document:mousemove', ['$event'])
181
+ * @HostListener('document:touchmove', ['$event'])
182
+ * onDrag(ev) { if (!this.isDragging) return; ... }
183
+ *
184
+ * مشکل: این listenerها برای کل عمر کامپوننت روی `document` باقی می‌مونن —
185
+ * حتی وقتی اصلاً دراگی در حال انجام نیست. یعنی روی صفحه‌ای با چند تا
186
+ * color-picker/slider، هر حرکت موس/انگشت روی کل صفحه (نه فقط روی خودِ
187
+ * اسلایدر) باعث اجرای N تابع (به تعداد اینستنس‌ها) می‌شه که هرکدوم هم چرخه‌ی
188
+ * زون انگیولار رو تریگر می‌کنن — یک مشکل واقعی پرفورمنس، مخصوصاً در صفحاتی
189
+ * با چند نمونه هم‌زمان یا حرکت زیاد موس.
190
+ *
191
+ * این تابع جایگزین اون الگو می‌شه: listenerها فقط در طول یک دراگِ واقعی
192
+ * (بین mousedown/touchstart تا mouseup/touchend) روی document اضافه می‌شن و
193
+ * بلافاصله بعدش پاک می‌شن.
194
+ *
195
+ * یه فایده‌ی جانبیِ مهم دیگه هم داره: روی touchmove مقدار `{ passive: false }`
196
+ * ست می‌شه و preventDefault صدا زده می‌شه، پس در حین درگ کردنِ thumb روی
197
+ * موبایل، صفحه اسکرول نمی‌خوره (باگی که با @HostListener قبلی وجود داشت،
198
+ * چون هیچ‌جا preventDefault روی touchmove صدا زده نمی‌شد).
199
+ */
200
+ interface DragSessionCallbacks {
201
+ onMove: (ev: MouseEvent | TouchEvent) => void;
202
+ onEnd?: (ev: MouseEvent | TouchEvent) => void;
203
+ }
204
+ /** با فراخوانی این تابع (مثلاً داخل dragStart) یک نشست‌ درگ شروع می‌شه. */
205
+ declare function startDragSession({ onMove, onEnd }: DragSessionCallbacks): () => void;
206
+
175
207
  declare const WINDOW: InjectionToken<Window | null>;
176
208
 
177
209
  declare function randomStrnig(extraLength?: number, useNumeric?: boolean): string;
@@ -254,7 +286,6 @@ declare const FOCUSABLE_SELECTOR = "button, [href], input, select, textarea, [ta
254
286
  declare const DIALOG_OVERLAY_CLASSNAME = "ngx-ui-overlay";
255
287
  declare class OverlayService implements OnDestroy {
256
288
  private readonly overlayStacks;
257
- private zIndexCounter;
258
289
  private listenersAttached;
259
290
  private resizeRafPending;
260
291
  private readonly doc;
@@ -300,5 +331,5 @@ interface OverlayInstance {
300
331
  cleanup: () => void;
301
332
  }
302
333
 
303
- export { BrowserService, DIALOG_OVERLAY_CLASSNAME, DirectionService, FOCUSABLE_SELECTOR, OverlayRef, OverlayService, RangeSliderComponent, SaturationComponent, SliderComponent, ValueModel, WINDOW, getOffsetPosition, makeConfetti, mergeConfig, randomStrnig };
304
- export type { Alignment, BaseOverlayOptions, Direction, IPosition, IValue, OverlayInstance, OverlayOptions, Placement, Point, TemplateOptions };
334
+ export { BrowserService, DIALOG_OVERLAY_CLASSNAME, DirectionService, FOCUSABLE_SELECTOR, OverlayRef, OverlayService, RangeSliderComponent, SaturationComponent, SliderComponent, ValueModel, WINDOW, getOffsetPosition, makeConfetti, mergeConfig, randomStrnig, startDragSession };
335
+ export type { Alignment, BaseOverlayOptions, Direction, DragSessionCallbacks, IPosition, IValue, OverlayInstance, OverlayOptions, Placement, Point, TemplateOptions };
@@ -0,0 +1,150 @@
1
+ import * as _angular_core from '@angular/core';
2
+ import { OnInit, ElementRef } from '@angular/core';
3
+ import { BrowserService } from 'ngx-kit/shared';
4
+ import { ControlValueAccessor, Validator, AbstractControl, ValidationErrors } from '@angular/forms';
5
+
6
+ declare class NgxTimePickerConfig {
7
+ cancelButtonText: string;
8
+ confirmButtonText: string;
9
+ amText: string;
10
+ pmText: string;
11
+ format: '12' | '24';
12
+ minuteStep: number;
13
+ autoSwitchToMinute: boolean;
14
+ }
15
+
16
+ declare type NgxTimePickerMode = 'hour' | 'minute';
17
+
18
+ declare class NgxInputTimePickerComponent implements ControlValueAccessor, Validator, OnInit {
19
+ protected readonly browserService: BrowserService;
20
+ readonly change: _angular_core.OutputEmitterRef<string | null>;
21
+ readonly cancel: _angular_core.OutputEmitterRef<void>;
22
+ protected readonly config: NgxTimePickerConfig;
23
+ isDisabled: boolean;
24
+ /**
25
+ * Time value.
26
+ *
27
+ * Example:
28
+ * 14:35
29
+ */
30
+ readonly value: _angular_core.ModelSignal<string>;
31
+ /**
32
+ * 12h or 24h.
33
+ */
34
+ readonly format: _angular_core.InputSignal<"12" | "24">;
35
+ readonly amOrPm: _angular_core.ModelSignal<"AM" | "PM" | undefined>;
36
+ /**
37
+ * Minute step.
38
+ */
39
+ readonly minuteStep: _angular_core.InputSignal<number>;
40
+ /**
41
+ * Whether the clock is disabled.
42
+ */
43
+ readonly disabled: _angular_core.InputSignal<boolean>;
44
+ /**
45
+ * Whether to automatically switch from hour to minute.
46
+ */
47
+ readonly autoSwitchToMinute: _angular_core.InputSignal<boolean>;
48
+ readonly clock: _angular_core.Signal<ElementRef<SVGSVGElement> | undefined>;
49
+ readonly mode: _angular_core.WritableSignal<NgxTimePickerMode>;
50
+ private dragging;
51
+ readonly parsedTime: _angular_core.Signal<{
52
+ hour: number;
53
+ minute: number;
54
+ }>;
55
+ readonly displayHour: _angular_core.Signal<number>;
56
+ readonly displayMinute: _angular_core.Signal<number>;
57
+ readonly hourNumbers: _angular_core.Signal<number[]>;
58
+ readonly minuteNumbers: _angular_core.Signal<number[]>;
59
+ readonly hourAngle: _angular_core.Signal<number>;
60
+ readonly minuteAngle: _angular_core.Signal<number>;
61
+ readonly currentAngle: _angular_core.Signal<number>;
62
+ readonly handLength: _angular_core.Signal<58 | 86>;
63
+ readonly handEnd: _angular_core.Signal<{
64
+ x: number;
65
+ y: number;
66
+ }>;
67
+ readonly selectedPosition: _angular_core.Signal<{
68
+ x: number;
69
+ y: number;
70
+ }>;
71
+ protected _onChange: (value: string) => void;
72
+ protected _onTouched: () => void;
73
+ protected _validatorOnChange: () => void;
74
+ constructor();
75
+ ngOnInit(): void;
76
+ writeValue(value: string): void;
77
+ validate(control: AbstractControl): ValidationErrors | null;
78
+ registerOnChange(fn: any): void;
79
+ registerOnTouched(fn: any): void;
80
+ registerOnValidatorChange?(fn: () => void): void;
81
+ setDisabledState(disabled: boolean): void;
82
+ startPointer(event: PointerEvent): void;
83
+ movePointer(event: PointerEvent): void;
84
+ endPointer(event: PointerEvent): void;
85
+ selectHour(hour: number): void;
86
+ selectMinute(minute: number): void;
87
+ setMode(mode: NgxTimePickerMode): void;
88
+ private updateFromPointer;
89
+ private updateHourFromAngle;
90
+ private updateMinuteFromAngle;
91
+ private setTime;
92
+ isSelectedHour(hour: number): boolean;
93
+ isSelectedMinute(minute: number): boolean;
94
+ formatHour(hour: number): string;
95
+ formatMinute(minute: number): string;
96
+ numberPosition(index: number, total: number, radius?: number): {
97
+ x: number;
98
+ y: number;
99
+ };
100
+ hourPosition(hour: number, inner?: boolean): {
101
+ x: number;
102
+ y: number;
103
+ };
104
+ minutePosition(minute: number): {
105
+ x: number;
106
+ y: number;
107
+ };
108
+ ok(): void;
109
+ close(): void;
110
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgxInputTimePickerComponent, never>;
111
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgxInputTimePickerComponent, "ngx-time-picker", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "format": { "alias": "format"; "required": false; "isSignal": true; }; "amOrPm": { "alias": "amOrPm"; "required": false; "isSignal": true; }; "minuteStep": { "alias": "minuteStep"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "autoSwitchToMinute": { "alias": "autoSwitchToMinute"; "required": false; "isSignal": true; }; }, { "change": "change"; "cancel": "cancel"; "value": "valueChange"; "amOrPm": "amOrPmChange"; }, never, never, true, never>;
112
+ }
113
+
114
+ declare class NgxInputTimePicker implements ControlValueAccessor, Validator {
115
+ private el;
116
+ protected readonly config: NgxTimePickerConfig;
117
+ openOnCLick: _angular_core.InputSignal<boolean>;
118
+ readonly change: _angular_core.OutputEmitterRef<string | null>;
119
+ protected readonly value: _angular_core.WritableSignal<string>;
120
+ readonly format: _angular_core.InputSignal<"12" | "24">;
121
+ readonly amOrPm: _angular_core.ModelSignal<"AM" | "PM" | undefined>;
122
+ private pickerRef?;
123
+ protected _onChange: (value: string | null | undefined) => void;
124
+ protected _onTouched: () => void;
125
+ protected _validatorOnChange: () => void;
126
+ private isDisabled;
127
+ private readonly overlayService;
128
+ private readonly viewContainerRef;
129
+ private readonly renderer;
130
+ constructor(el: ElementRef<HTMLInputElement>);
131
+ ngOnDestroy(): void;
132
+ onClick(ev: Event): void;
133
+ onInput(event: Event): void;
134
+ onBlur(): void;
135
+ writeValue(value: string): void;
136
+ registerOnChange(fn: any): void;
137
+ registerOnTouched(fn: any): void;
138
+ registerOnValidatorChange?(fn: () => void): void;
139
+ setDisabledState(disabled: boolean): void;
140
+ toggle(): void;
141
+ private destroy;
142
+ private emitChange;
143
+ validate(control: AbstractControl): ValidationErrors | null;
144
+ protected _formatValue(): void;
145
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgxInputTimePicker, never>;
146
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<NgxInputTimePicker, "[ngxInputTimePicker]", ["ngxInputTimePicker"], { "openOnCLick": { "alias": "openOnCLick"; "required": false; "isSignal": true; }; "format": { "alias": "format"; "required": false; "isSignal": true; }; "amOrPm": { "alias": "amOrPm"; "required": false; "isSignal": true; }; }, { "change": "change"; "amOrPm": "amOrPmChange"; }, never, never, true, never>;
147
+ }
148
+
149
+ export { NgxInputTimePicker, NgxInputTimePickerComponent };
150
+ export type { NgxTimePickerMode };