ngx-kit 6.1.0 → 6.3.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 (52) hide show
  1. package/README.md +3 -3
  2. package/angle-selector/README.md +34 -34
  3. package/box-shadow/README.md +33 -33
  4. package/color-picker/README.md +49 -49
  5. package/data-table/README.md +113 -113
  6. package/date-picker/README.md +69 -69
  7. package/dialog/README.md +92 -92
  8. package/drawer-menu/README.md +110 -62
  9. package/dropzone/README.md +422 -422
  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 +2 -2
  13. package/fesm2022/ngx-kit-box-shadow.mjs.map +1 -1
  14. package/fesm2022/ngx-kit-color-picker.mjs +4 -4
  15. package/fesm2022/ngx-kit-color-picker.mjs.map +1 -1
  16. package/fesm2022/ngx-kit-data-table.mjs +2 -2
  17. package/fesm2022/ngx-kit-data-table.mjs.map +1 -1
  18. package/fesm2022/ngx-kit-date-picker.mjs +1324 -200
  19. package/fesm2022/ngx-kit-date-picker.mjs.map +1 -1
  20. package/fesm2022/ngx-kit-dialog.mjs +2 -2
  21. package/fesm2022/ngx-kit-dialog.mjs.map +1 -1
  22. package/fesm2022/ngx-kit-drawer-menu.mjs +302 -140
  23. package/fesm2022/ngx-kit-drawer-menu.mjs.map +1 -1
  24. package/fesm2022/ngx-kit-dropzone.mjs +2 -2
  25. package/fesm2022/ngx-kit-dropzone.mjs.map +1 -1
  26. package/fesm2022/ngx-kit-form-field.mjs.map +1 -1
  27. package/fesm2022/ngx-kit-gallery.mjs +2 -2
  28. package/fesm2022/ngx-kit-gallery.mjs.map +1 -1
  29. package/fesm2022/ngx-kit-gradient-picker.mjs.map +1 -1
  30. package/fesm2022/ngx-kit-image-editor.mjs +75 -11
  31. package/fesm2022/ngx-kit-image-editor.mjs.map +1 -1
  32. package/fesm2022/ngx-kit-menu.mjs +8 -8
  33. package/fesm2022/ngx-kit-menu.mjs.map +1 -1
  34. package/fesm2022/ngx-kit-message.mjs +2 -2
  35. package/fesm2022/ngx-kit-message.mjs.map +1 -1
  36. package/fesm2022/ngx-kit-notify.mjs.map +1 -1
  37. package/fesm2022/ngx-kit-shared.mjs +2 -2
  38. package/fesm2022/ngx-kit-shared.mjs.map +1 -1
  39. package/fesm2022/ngx-kit-time-picker.mjs +2 -2
  40. package/fesm2022/ngx-kit-time-picker.mjs.map +1 -1
  41. package/gallery/README.md +71 -71
  42. package/gradient-picker/README.md +41 -41
  43. package/menu/README.md +85 -85
  44. package/message/README.md +70 -70
  45. package/notify/README.md +58 -58
  46. package/package.json +1 -1
  47. package/shared/README.md +117 -117
  48. package/time-picker/README.md +95 -95
  49. package/types/ngx-kit-date-picker.d.ts +303 -36
  50. package/types/ngx-kit-drawer-menu.d.ts +97 -86
  51. package/types/ngx-kit-dropzone.d.ts +5 -5
  52. package/types/ngx-kit-image-editor.d.ts +29 -4
@@ -1,101 +1,112 @@
1
1
  import * as _angular_core from '@angular/core';
2
2
 
3
- /**
4
- * از 'start'/'end' منطقی استفاده می‌کنیم نه 'left'/'right' — یعنی توی
5
- * RTL خودکار برعکس می‌شه (start یعنی راست در RTL، چپ در LTR)، دقیقاً هماهنگ
6
- * با بقیه‌ی کتابخونه که همه‌جا از پراپرتی‌های منطقیِ CSS استفاده می‌کنه.
7
- */
3
+ /** Logical drawer placement. `start` is right in RTL and left in LTR. */
8
4
  type NgxDrawerSide = 'start' | 'end';
9
- /**
10
- * جلوه‌ی بازوبسته‌شدنِ خودِ پنل:
11
- * - slide: اسلاید ساده‌ی کلاسیک
12
- * - curtain: چند نوار عمودیِ هم‌رنگِ پنل که با تأخیرِ پلکانی جمع می‌شن و
13
- * محتوا رو نمایان می‌کنن — حسِ باز شدنِ یه پرده‌ی چندلَته
14
- * - jelly: بازشدن با افکتِ ژله‌ای/کشسان — چند نوسانِ فنری که رفته‌رفته
15
- * فروکش می‌کنه (الهام از https://dribbble.com/shots/2307371)
16
- * - pull: یه کشیدگیِ لاستیکیِ تک‌ضربه‌ای — لبه‌ی پنل از اندازه‌ی نهایی رد
17
- * می‌شه و برمی‌گرده سرجاش (rubber-band)
18
- * - rotate3d: چرخشِ سه‌بعدیِ دور لولا (مثل باز شدنِ یه در)، با perspective
19
- * - flip3d: پنل و محتوای صفحه با هم مثل ورق‌زدنِ یه کتاب می‌چرخن
20
- * - scale: بزرگ‌شدن از مرکز همراه با fade
21
- */
22
- type NgxDrawerEffect = 'slide' | 'curtain' | 'jelly' | 'pull' | 'rotate3d' | 'flip3d' | 'scale';
23
- /**
24
- * رفتار محتوای اصلیِ صفحه وقتی درور باز می‌شه:
25
- * - overlay: محتوا سرجاش می‌مونه، درور روش شناور می‌شه (با بک‌دراپ)
26
- * - push: محتوا به‌اندازه‌ی عرضِ درور هل داده می‌شه (کنار می‌ره)
27
- * - reveal: محتوا کمی کوچیک/عقب می‌ره، انگار درور از زیرش نمایان می‌شه
28
- * (همون افکت معروف iOS)
29
- */
30
- type NgxDrawerContentBehavior = 'overlay' | 'push' | 'reveal';
5
+ /** How the drawer interacts with the application content. */
6
+ type NgxDrawerMode = 'overlay' | 'push' | 'reveal';
7
+ /** Desktop/mobile layout behavior when responsive mode is enabled. */
8
+ type NgxDrawerResponsiveBehavior = 'overlay' | 'dock';
9
+ /** Visual physics used by the drawer while opening/closing. */
10
+ type NgxDrawerEffect = 'slide' | 'spring' | 'fabric' | 'curtain' | 'elastic' | 'reveal';
11
+ type NgxDrawerResponsiveMode = 'off' | 'auto';
12
+ interface NgxDrawerResponsiveConfig {
13
+ mode?: NgxDrawerResponsiveMode;
14
+ breakpoint?: number;
15
+ desktopOpen?: boolean;
16
+ mobileOpen?: boolean;
17
+ /** Desktop layout: dock means a real sidebar; overlay means floating drawer. */
18
+ desktopBehavior?: NgxDrawerResponsiveBehavior;
19
+ /** Mobile layout is normally overlay. */
20
+ mobileBehavior?: NgxDrawerResponsiveBehavior;
21
+ respectPinned?: boolean;
22
+ }
31
23
 
32
- /**
33
- * درور منو (side drawer) با ۶ جلوه‌ی بازوبسته‌شدنِ متفاوت (از ساده تا
34
- * سه‌بعدی/ژله‌ای) و ۳ رفتار برای محتوای صفحه (overlay/push/reveal) —
35
- * دقیقاً مدل کتابخونه‌های حرفه‌ای مثل react-burger-menu یا Ionic Menu، ولی
36
- * signal-based و بدون هیچ وابستگی خارجی.
37
- *
38
- * نکات معماری:
39
- * - از 'start'/'end' منطقی استفاده می‌کنه، پس با CSS logical properties
40
- * زیر RTL خودکار برعکس می‌شه؛ فقط ریاضیِ درگ (که برخلاف CSS جهت فیزیکیِ
41
- * واقعی لازم داره) از DirectionService مشترک استفاده می‌کنه.
42
- * - وضعیت باز/بسته با model() دوطرفه‌ست، پس هم با [(open)] قابل کنترله و
43
- * هم می‌تونه به‌صورت خودکار و زنده با عرض صفحه هماهنگ بشه (respondToViewport)
44
- * — یعنی رد شدن از breakpoint (نه فقط بار اول لود) می‌تونه خودکار باز/بسته‌ش کنه.
45
- * - افکت‌های jelly/pull با keyframe سه‌مرحله‌ای (overshoot → نوسان → استقرار)
46
- * پیاده شدن، نه فقط یه transition ساده.
47
- */
48
24
  declare class NgxDrawerMenuComponent {
49
- side: _angular_core.InputSignal<NgxDrawerSide>;
50
- effect: _angular_core.InputSignal<NgxDrawerEffect>;
51
- contentBehavior: _angular_core.InputSignal<NgxDrawerContentBehavior>;
52
- width: _angular_core.InputSignal<number>;
53
- swipeEdgeSize: _angular_core.InputSignal<number>;
54
- curtainStrips: _angular_core.InputSignal<number>;
55
- backdropClose: _angular_core.InputSignal<boolean>;
56
- swipeEnabled: _angular_core.InputSignal<boolean>;
57
- /** اگه true باشه، رد شدن از mobileBreakpoint به‌صورت زنده open رو با openOnDesktop/openOnMobile هماهنگ می‌کنه */
58
- respondToViewport: _angular_core.InputSignal<boolean>;
59
- openOnDesktop: _angular_core.InputSignal<boolean>;
60
- openOnMobile: _angular_core.InputSignal<boolean>;
61
- mobileBreakpoint: _angular_core.InputSignal<number>;
62
- /** state دوطرفه‌ی باز/بسته؛ با [(open)] قابل bind هست */
63
- open: _angular_core.ModelSignal<boolean>;
64
- private readonly directionService;
65
- private readonly doc;
66
- private readonly destroyRef;
67
- /** فقط حین یه درگِ واقعی مقدار داره؛ null یعنی از روی open() تصمیم بگیر */
68
- protected readonly dragRatio: _angular_core.WritableSignal<number | null>;
25
+ readonly side: _angular_core.InputSignal<NgxDrawerSide>;
26
+ readonly mode: _angular_core.InputSignal<NgxDrawerMode>;
27
+ /** When responsive mode is active, desktop/mobile can use different layout behavior. */
28
+ readonly desktopBehavior: _angular_core.InputSignal<NgxDrawerResponsiveBehavior>;
29
+ readonly mobileBehavior: _angular_core.InputSignal<NgxDrawerResponsiveBehavior>;
30
+ private readonly responsiveDesktopBehavior;
31
+ private readonly responsiveMobileBehavior;
32
+ readonly effect: _angular_core.InputSignal<NgxDrawerEffect>;
33
+ readonly width: _angular_core.InputSignal<number>;
34
+ readonly maxWidth: _angular_core.InputSignal<number>;
35
+ readonly edgeSize: _angular_core.InputSignal<number>;
36
+ readonly dragThreshold: _angular_core.InputSignal<number>;
37
+ readonly velocityThreshold: _angular_core.InputSignal<number>;
38
+ /** Opens/closes the panel from the edge and while the panel itself is dragged. */
39
+ readonly swipeEnabled: _angular_core.InputSignal<boolean>;
40
+ /** Allows closing by clicking the backdrop. */
41
+ readonly backdropClose: _angular_core.InputSignal<boolean>;
42
+ /** Allows Escape to close the drawer. */
43
+ readonly escapeClose: _angular_core.InputSignal<boolean>;
44
+ /** The drawer starts open unless explicitly configured otherwise. */
45
+ readonly open: _angular_core.ModelSignal<boolean>;
46
+ /** Pinned drawers are intended for persistent desktop navigation. */
47
+ readonly pinned: _angular_core.ModelSignal<boolean>;
48
+ /** Responsive behavior. Can be overridden with individual inputs below. */
49
+ readonly responsive: _angular_core.InputSignal<NgxDrawerResponsiveConfig>;
50
+ /** Convenience aliases for the common responsive configuration. */
51
+ readonly respondToViewport: _angular_core.InputSignal<boolean>;
52
+ readonly mobileBreakpoint: _angular_core.InputSignal<number>;
53
+ readonly openOnDesktop: _angular_core.InputSignal<boolean>;
54
+ readonly openOnMobile: _angular_core.InputSignal<boolean>;
55
+ /** Visual tuning. */
56
+ readonly curtainStrips: _angular_core.InputSignal<number>;
57
+ readonly backdropOpacity: _angular_core.InputSignal<number>;
58
+ readonly transitionMs: _angular_core.InputSignal<number>;
59
+ readonly focusOnOpen: _angular_core.InputSignal<boolean>;
60
+ protected readonly dragProgress: _angular_core.WritableSignal<number | null>;
61
+ protected readonly dragVelocity: _angular_core.WritableSignal<number>;
62
+ protected readonly isMobile: _angular_core.WritableSignal<boolean>;
63
+ protected readonly effectiveBehavior: _angular_core.Signal<NgxDrawerResponsiveBehavior>;
64
+ protected readonly isDocked: _angular_core.Signal<boolean>;
65
+ protected readonly usesOverlay: _angular_core.Signal<boolean>;
69
66
  protected readonly isDragging: _angular_core.Signal<boolean>;
70
- protected readonly visualOpen: _angular_core.Signal<number>;
67
+ protected readonly progress: _angular_core.Signal<number>;
68
+ protected readonly isActuallyOpen: _angular_core.Signal<boolean>;
71
69
  protected readonly strips: _angular_core.Signal<number[]>;
72
- /**
73
- * +۱ یعنی این پنل فیزیکاً روی لبه‌ی چپِ صفحه‌ست، -۱ یعنی لبه‌ی راست —
74
- * برای transform:translateX() محتوای اصلی (که برخلاف inset-inline، به
75
- * dir=rtl خودکار واکنش نشون نمی‌ده) لازمه. reactive هست چون هم به side()
76
- * و هم به جهتِ زنده‌ی صفحه (directionService.isRtl()) وابسته‌ست.
77
- */
78
- protected readonly pushDirSign: _angular_core.Signal<1 | -1>;
79
- /** برای افکت‌های keyframe‌محور (jelly/pull) — فقط لحظه‌ی رهاشدن (نه حین درگ زنده) پخش می‌شه */
80
- protected readonly playEffectClass: _angular_core.WritableSignal<boolean>;
81
- private stopDrag?;
70
+ /** Physical side: true means the drawer is attached to the physical left edge. */
71
+ protected readonly isPhysicalLeft: _angular_core.Signal<boolean>;
72
+ protected readonly physicalSign: _angular_core.Signal<1 | -1>;
73
+ protected readonly effectiveMode: _angular_core.Signal<NgxDrawerMode>;
74
+ protected readonly duration: _angular_core.Signal<string>;
75
+ private readonly directionService;
76
+ private readonly document;
77
+ private readonly destroyRef;
78
+ private pointerId;
82
79
  private dragStartX;
83
- private dragStartRatio;
84
- private prevOpen;
80
+ private dragStartProgress;
81
+ private dragLastX;
82
+ private dragLastTime;
83
+ private lastVelocity;
84
+ private activePointerTarget;
85
+ private resizeObserver?;
86
+ private mediaQuery?;
87
+ private mediaQueryListener?;
88
+ private lastManagedViewportState;
85
89
  constructor();
86
- protected onEscape(): void;
87
- protected closeFromBackdrop(): void;
88
90
  toggle(): void;
89
- /** true یعنی این پنل فیزیکاً روی لبه‌ی چپِ صفحه‌ست (صرف‌نظر از start/end منطقی) */
90
- private isPhysicalLeftEdge;
91
- protected stripDelay(index: number): string;
92
- protected onEdgeDragStart(ev: MouseEvent | TouchEvent): void;
93
- protected onPanelDragStart(ev: MouseEvent | TouchEvent): void;
91
+ openDrawer(): void;
92
+ closeDrawer(): void;
93
+ pin(): void;
94
+ unpin(): void;
95
+ protected onEscape(): void;
96
+ protected onBackdropPointerDown(event: PointerEvent): void;
97
+ protected onEdgePointerDown(event: PointerEvent): void;
98
+ protected onPanelPointerDown(event: PointerEvent): void;
94
99
  private beginDrag;
95
- private clientXOf;
100
+ private readonly onPointerMove;
101
+ private readonly onPointerUp;
102
+ private readonly onPointerCancel;
103
+ private disposePointer;
104
+ private setupViewportSync;
105
+ private disposeViewportSync;
106
+ private clamp01;
96
107
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgxDrawerMenuComponent, never>;
97
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgxDrawerMenuComponent, "ngx-drawer-menu", never, { "side": { "alias": "side"; "required": false; "isSignal": true; }; "effect": { "alias": "effect"; "required": false; "isSignal": true; }; "contentBehavior": { "alias": "contentBehavior"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; "swipeEdgeSize": { "alias": "swipeEdgeSize"; "required": false; "isSignal": true; }; "curtainStrips": { "alias": "curtainStrips"; "required": false; "isSignal": true; }; "backdropClose": { "alias": "backdropClose"; "required": false; "isSignal": true; }; "swipeEnabled": { "alias": "swipeEnabled"; "required": false; "isSignal": true; }; "respondToViewport": { "alias": "respondToViewport"; "required": false; "isSignal": true; }; "openOnDesktop": { "alias": "openOnDesktop"; "required": false; "isSignal": true; }; "openOnMobile": { "alias": "openOnMobile"; "required": false; "isSignal": true; }; "mobileBreakpoint": { "alias": "mobileBreakpoint"; "required": false; "isSignal": true; }; "open": { "alias": "open"; "required": false; "isSignal": true; }; }, { "open": "openChange"; }, never, ["*", "[drawerContent]"], true, never>;
108
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgxDrawerMenuComponent, "ngx-drawer-menu", never, { "side": { "alias": "side"; "required": false; "isSignal": true; }; "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "desktopBehavior": { "alias": "desktopBehavior"; "required": false; "isSignal": true; }; "mobileBehavior": { "alias": "mobileBehavior"; "required": false; "isSignal": true; }; "effect": { "alias": "effect"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; "maxWidth": { "alias": "maxWidth"; "required": false; "isSignal": true; }; "edgeSize": { "alias": "edgeSize"; "required": false; "isSignal": true; }; "dragThreshold": { "alias": "dragThreshold"; "required": false; "isSignal": true; }; "velocityThreshold": { "alias": "velocityThreshold"; "required": false; "isSignal": true; }; "swipeEnabled": { "alias": "swipeEnabled"; "required": false; "isSignal": true; }; "backdropClose": { "alias": "backdropClose"; "required": false; "isSignal": true; }; "escapeClose": { "alias": "escapeClose"; "required": false; "isSignal": true; }; "open": { "alias": "open"; "required": false; "isSignal": true; }; "pinned": { "alias": "pinned"; "required": false; "isSignal": true; }; "responsive": { "alias": "responsive"; "required": false; "isSignal": true; }; "respondToViewport": { "alias": "respondToViewport"; "required": false; "isSignal": true; }; "mobileBreakpoint": { "alias": "mobileBreakpoint"; "required": false; "isSignal": true; }; "openOnDesktop": { "alias": "openOnDesktop"; "required": false; "isSignal": true; }; "openOnMobile": { "alias": "openOnMobile"; "required": false; "isSignal": true; }; "curtainStrips": { "alias": "curtainStrips"; "required": false; "isSignal": true; }; "backdropOpacity": { "alias": "backdropOpacity"; "required": false; "isSignal": true; }; "transitionMs": { "alias": "transitionMs"; "required": false; "isSignal": true; }; "focusOnOpen": { "alias": "focusOnOpen"; "required": false; "isSignal": true; }; }, { "open": "openChange"; "pinned": "pinnedChange"; }, never, ["*", "[drawerContent]"], true, never>;
98
109
  }
99
110
 
100
111
  export { NgxDrawerMenuComponent };
101
- export type { NgxDrawerContentBehavior, NgxDrawerEffect, NgxDrawerSide };
112
+ export type { NgxDrawerEffect, NgxDrawerMode, NgxDrawerResponsiveBehavior, NgxDrawerResponsiveConfig, NgxDrawerResponsiveMode, NgxDrawerSide };
@@ -4,7 +4,7 @@ import { HttpHeaders } from '@angular/common/http';
4
4
  import { Observable } from 'rxjs';
5
5
 
6
6
  type NgxDropzoneFileStatus = 'pending' | 'accepted' | 'uploading' | 'uploaded' | 'error' | 'canceled';
7
- interface NgxDropzoneFile<TResponse = unknown> {
7
+ interface NgxDropzoneFile<TResponse = any> {
8
8
  /** شناسه‌ی یکتا برای track کردن توی @for و امکان حذف تکی */
9
9
  id: string;
10
10
  file: File;
@@ -16,7 +16,7 @@ interface NgxDropzoneFile<TResponse = unknown> {
16
16
  /** Response returned by the upload adapter. */
17
17
  response?: TResponse;
18
18
  /** Upload error, if the request failed. */
19
- error?: unknown;
19
+ error?: any;
20
20
  /** در صورت رد شدن، دلیلش */
21
21
  rejectionReason?: NgxDropzoneRejectionReason;
22
22
  }
@@ -112,17 +112,17 @@ declare class NgxDropzoneComponent implements OnDestroy {
112
112
  filesRejected: _angular_core.OutputEmitterRef<NgxDropzoneRejectedFile[]>;
113
113
  filesChange: _angular_core.OutputEmitterRef<File[]>;
114
114
  /** Emitted when an individual upload starts. */
115
- uploadStarted: _angular_core.OutputEmitterRef<NgxDropzoneFile<unknown>>;
115
+ uploadStarted: _angular_core.OutputEmitterRef<NgxDropzoneFile<any>>;
116
116
  /** Emitted for every upload progress update. */
117
117
  uploadProgress: _angular_core.OutputEmitterRef<NgxDropzoneUploadProgressEvent>;
118
118
  /** Emitted after a file is successfully uploaded. */
119
- uploadSuccess: _angular_core.OutputEmitterRef<NgxDropzoneFile<unknown>>;
119
+ uploadSuccess: _angular_core.OutputEmitterRef<NgxDropzoneFile<any>>;
120
120
  /** Emitted when an upload fails. */
121
121
  uploadError: _angular_core.OutputEmitterRef<{
122
122
  item: NgxDropzoneFile;
123
123
  error: unknown;
124
124
  }>;
125
- protected readonly files: _angular_core.WritableSignal<NgxDropzoneFile<unknown>[]>;
125
+ protected readonly files: _angular_core.WritableSignal<NgxDropzoneFile<any>[]>;
126
126
  protected readonly isDragging: _angular_core.WritableSignal<boolean>;
127
127
  private dragCounter;
128
128
  private readonly uploadService;
@@ -1,4 +1,5 @@
1
1
  import * as _angular_core from '@angular/core';
2
+ import { InjectionToken } from '@angular/core';
2
3
 
3
4
  interface NgxCropRect {
4
5
  /** همه به پیکسل‌های واقعیِ تصویر مبدأ (نه پیکسل صفحه) */
@@ -54,6 +55,7 @@ declare class NgxPointerDragDirective {
54
55
 
55
56
  type Corner = 'nw' | 'ne' | 'sw' | 'se';
56
57
 
58
+ declare const NGX_IMAGE_EDITOR_LOCALIZATION: InjectionToken<NgxImageEditorLocalization>;
57
59
  declare class NgxImageEditorLocalization {
58
60
  LoadingImage: string;
59
61
  Rotation: string;
@@ -69,7 +71,9 @@ declare class NgxImageEditorLocalization {
69
71
  Cancel: string;
70
72
  Save: string;
71
73
  Saving: string;
74
+ Reset: string;
72
75
  }
76
+ declare const DEFAULT_NGX_IMAGE_EDITOR_LOCALIZATION: NgxImageEditorLocalization;
73
77
 
74
78
  /**
75
79
  * ویرایشگر تصویر: کراپ + چرخش + روشنایی/کنتراست/اشباع + فیلترهای آماده
@@ -81,6 +85,15 @@ declare class NgxImageEditorLocalization {
81
85
  * (createWorkingCopy)، نه روی تصویر اصلی که ممکنه چند مگاپیکسل باشه — وگرنه
82
86
  * درگ‌کردن اسلایدرها/گوشه‌های کراپ رو کاربر حس تاخیر می‌کرد. فقط لحظه‌ی
83
87
  * save()، رندر نهایی از روی تصویر اصلیِ کامل انجام می‌شه.
88
+ *
89
+ * اندازه‌ی صحنه (stage) با panelSize کنترل می‌شه: عرض همیشه ۱۰۰٪ عرضِ
90
+ * والدِ کامپوننته (با ResizeObserver اندازه‌گیری می‌شه، پس با تغییر سایز
91
+ * صفحه/layout هم زنده هماهنگ می‌مونه)، ارتفاع دقیقاً همون چیزیه که کاربر با
92
+ * panelSize می‌ده. تصویر همیشه با یک مقیاسِ «contain» واقعی (هم بر اساس
93
+ * عرض، هم بر اساس ارتفاع — هرکدوم تنگ‌تره) جا داده می‌شه، پس کلِ تصویر
94
+ * همیشه در محدوده‌ی همین باکس دیده می‌شه، صرف‌نظر از اندازه‌ی واقعیِ فایل.
95
+ * سقفِ مقیاس هم ۱ هست، یعنی تصاویر کوچیک بزرگ‌نمایی نمی‌شن (که باعثِ محو
96
+ * شدن‌شون می‌شد).
84
97
  */
85
98
  declare class NgxImageEditorComponent {
86
99
  source: _angular_core.InputSignal<string | File | Blob | null>;
@@ -89,8 +102,11 @@ declare class NgxImageEditorComponent {
89
102
  outputMaxWidth: _angular_core.InputSignal<number | undefined>;
90
103
  outputMaxHeight: _angular_core.InputSignal<number | undefined>;
91
104
  outputType: _angular_core.InputSignal<"image/jpeg" | "image/png" | "image/webp">;
92
- /** حداکثر عرض نمایشِ ناحیه‌ی کراپ روی صفحه (پیکسل) */
93
- displayMaxWidth: _angular_core.InputSignal<number>;
105
+ /**
106
+ * کدوم فیلترها نشون داده بشن (و به چه ترتیبی). اگه ندید، هر ۵ تا نشون داده
107
+ * می‌شن. آرایه‌ی خالی یعنی کلِ بخشِ فیلتر مخفی بشه.
108
+ */
109
+ filters: _angular_core.InputSignal<NgxImageFilterPreset[]>;
94
110
  quality: _angular_core.InputSignal<number>;
95
111
  defaultLocalization: NgxImageEditorLocalization;
96
112
  localize: _angular_core.InputSignal<NgxImageEditorLocalization>;
@@ -101,6 +117,9 @@ declare class NgxImageEditorComponent {
101
117
  protected readonly loadError: _angular_core.WritableSignal<string | null>;
102
118
  private readonly originalImage;
103
119
  private readonly workingCanvas;
120
+ private readonly stageWrapEl;
121
+ /** عرضِ واقعیِ رندرشده‌ی کانتینر؛ چون عرض همیشه ۱۰۰٪ (fluid) هست، باید زنده اندازه‌گیری بشه */
122
+ private readonly containerWidth;
104
123
  protected readonly rotation: _angular_core.WritableSignal<number>;
105
124
  protected readonly brightness: _angular_core.WritableSignal<number>;
106
125
  protected readonly contrast: _angular_core.WritableSignal<number>;
@@ -108,8 +127,14 @@ declare class NgxImageEditorComponent {
108
127
  protected readonly filterPreset: _angular_core.WritableSignal<NgxImageFilterPreset>;
109
128
  protected readonly crop: _angular_core.WritableSignal<NgxCropRect>;
110
129
  protected readonly adjustments: _angular_core.Signal<NgxImageEditorAdjustments>;
130
+ protected readonly filterLabels: _angular_core.Signal<Record<NgxImageFilterPreset, string>>;
111
131
  /** تصویرِ (کوچیک‌شده‌یِ) چرخیده — پایه‌ی نمایش صحنه‌ی کراپ */
112
132
  protected readonly rotatedWorkingCanvas: _angular_core.Signal<HTMLCanvasElement | null>;
133
+ protected readonly panelSize: _angular_core.Signal<number>;
134
+ /**
135
+ * مقیاسِ «contain» واقعی: کوچیک‌ترینِ نسبتِ عرض و ارتفاع (هرکدوم تنگ‌تره)
136
+ * تعیین‌کننده‌ست، و سقفش هم ۱ هست تا تصاویر کوچیک بزرگ‌نمایی نشن.
137
+ */
113
138
  protected readonly displayScale: _angular_core.Signal<number>;
114
139
  protected readonly stageImageUrl: _angular_core.Signal<string | null>;
115
140
  protected readonly stageSize: _angular_core.Signal<{
@@ -137,7 +162,7 @@ declare class NgxImageEditorComponent {
137
162
  protected cancel(): void;
138
163
  save(): Promise<void>;
139
164
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgxImageEditorComponent, never>;
140
- 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; }; "quality": { "alias": "quality"; "required": false; "isSignal": true; }; "localize": { "alias": "localize"; "required": false; "isSignal": true; }; }, { "saved": "saved"; "cancelled": "cancelled"; }, never, never, true, never>;
165
+ 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; }; "filters": { "alias": "filters"; "required": false; "isSignal": true; }; "quality": { "alias": "quality"; "required": false; "isSignal": true; }; "localize": { "alias": "localize"; "required": false; "isSignal": true; }; }, { "saved": "saved"; "cancelled": "cancelled"; }, never, never, true, never>;
141
166
  }
142
167
 
143
168
  /** یه File/Blob/data-URL/URL رو به یک HTMLImageElement بارگذاری‌شده تبدیل می‌کنه */
@@ -191,5 +216,5 @@ declare function applyCartoonEffect(ctx: CanvasRenderingContext2D, width: number
191
216
  edgeThreshold?: number;
192
217
  }): void;
193
218
 
194
- export { NgxImageEditorComponent, NgxPointerDragDirective, applyCartoonEffect, canvasToBlob, createWorkingCopy, fitWithin, loadImage, renderComposite, renderRotated };
219
+ export { DEFAULT_NGX_IMAGE_EDITOR_LOCALIZATION, NGX_IMAGE_EDITOR_LOCALIZATION, NgxImageEditorComponent, NgxImageEditorLocalization, NgxPointerDragDirective, applyCartoonEffect, canvasToBlob, createWorkingCopy, fitWithin, loadImage, renderComposite, renderRotated };
195
220
  export type { NgxCropRect, NgxImageEditorAdjustments, NgxImageEditorResult, NgxImageFilterPreset, NgxPointerDragDelta };