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.
- package/README.md +3 -2
- package/angle-selector/README.md +34 -0
- package/box-shadow/README.md +33 -0
- package/color-picker/README.md +52 -0
- package/data-table/README.md +120 -0
- package/date-picker/README.md +74 -0
- package/dialog/README.md +94 -169
- package/drawer-menu/README.md +76 -0
- package/dropzone/README.md +59 -0
- package/fesm2022/ngx-kit-angle-selector.mjs +2 -2
- package/fesm2022/ngx-kit-angle-selector.mjs.map +1 -1
- package/fesm2022/ngx-kit-box-shadow.mjs +28 -27
- package/fesm2022/ngx-kit-box-shadow.mjs.map +1 -1
- package/fesm2022/ngx-kit-color-picker.mjs +173 -43
- package/fesm2022/ngx-kit-color-picker.mjs.map +1 -1
- package/fesm2022/ngx-kit-data-table.mjs +9 -2
- package/fesm2022/ngx-kit-data-table.mjs.map +1 -1
- package/fesm2022/ngx-kit-date-picker.mjs +120 -86
- package/fesm2022/ngx-kit-date-picker.mjs.map +1 -1
- package/fesm2022/ngx-kit-dialog.mjs +38 -7
- package/fesm2022/ngx-kit-dialog.mjs.map +1 -1
- package/fesm2022/ngx-kit-drawer-menu.mjs +190 -0
- package/fesm2022/ngx-kit-drawer-menu.mjs.map +1 -0
- package/fesm2022/ngx-kit-dropzone.mjs +272 -0
- package/fesm2022/ngx-kit-dropzone.mjs.map +1 -0
- package/fesm2022/ngx-kit-form-field.mjs +87 -0
- package/fesm2022/ngx-kit-form-field.mjs.map +1 -0
- package/fesm2022/ngx-kit-gallery.mjs +419 -0
- package/fesm2022/ngx-kit-gallery.mjs.map +1 -0
- package/fesm2022/ngx-kit-gradient-picker.mjs +12 -4
- package/fesm2022/ngx-kit-gradient-picker.mjs.map +1 -1
- package/fesm2022/ngx-kit-image-editor.mjs +501 -0
- package/fesm2022/ngx-kit-image-editor.mjs.map +1 -0
- package/fesm2022/ngx-kit-menu.mjs +9 -4
- package/fesm2022/ngx-kit-menu.mjs.map +1 -1
- package/fesm2022/ngx-kit-message.mjs +50 -24
- package/fesm2022/ngx-kit-message.mjs.map +1 -1
- package/fesm2022/ngx-kit-notify.mjs +1 -4
- package/fesm2022/ngx-kit-notify.mjs.map +1 -1
- package/fesm2022/ngx-kit-shared.mjs +126 -83
- package/fesm2022/ngx-kit-shared.mjs.map +1 -1
- package/fesm2022/ngx-kit-time-picker.mjs +562 -0
- package/fesm2022/ngx-kit-time-picker.mjs.map +1 -0
- package/fesm2022/ngx-kit.mjs.map +1 -1
- package/gallery/README.md +71 -0
- package/gradient-picker/README.md +41 -0
- package/image-editor/README.md +44 -0
- package/menu/README.md +85 -0
- package/message/README.md +70 -0
- package/notify/README.md +56 -0
- package/package.json +25 -1
- package/shared/README.md +117 -0
- package/styles/all.css +27 -0
- package/styles/image-viewer.css +12 -0
- package/types/ngx-kit-box-shadow.d.ts +1 -2
- package/types/ngx-kit-data-table.d.ts +1 -0
- package/types/ngx-kit-date-picker.d.ts +1 -1
- package/types/ngx-kit-dialog.d.ts +1 -0
- package/types/ngx-kit-drawer-menu.d.ts +101 -0
- package/types/ngx-kit-dropzone.d.ts +84 -0
- package/types/ngx-kit-form-field.d.ts +31 -0
- package/types/ngx-kit-gallery.d.ts +168 -0
- package/types/ngx-kit-image-editor.d.ts +175 -0
- package/types/ngx-kit-menu.d.ts +1 -0
- package/types/ngx-kit-message.d.ts +13 -3
- package/types/ngx-kit-notify.d.ts +0 -1
- package/types/ngx-kit-shared.d.ts +44 -13
- 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 };
|
package/types/ngx-kit-menu.d.ts
CHANGED
|
@@ -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
|
-
|
|
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,
|
|
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 };
|