ngx-kit 5.0.0 → 6.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/README.md +3 -2
  2. package/angle-selector/README.md +34 -0
  3. package/box-shadow/README.md +33 -0
  4. package/color-picker/README.md +52 -0
  5. package/data-table/README.md +120 -0
  6. package/date-picker/README.md +74 -0
  7. package/dialog/README.md +94 -169
  8. package/drawer-menu/README.md +76 -0
  9. package/dropzone/README.md +59 -0
  10. package/fesm2022/ngx-kit-angle-selector.mjs +2 -2
  11. package/fesm2022/ngx-kit-angle-selector.mjs.map +1 -1
  12. package/fesm2022/ngx-kit-box-shadow.mjs +28 -27
  13. package/fesm2022/ngx-kit-box-shadow.mjs.map +1 -1
  14. package/fesm2022/ngx-kit-color-picker.mjs +173 -43
  15. package/fesm2022/ngx-kit-color-picker.mjs.map +1 -1
  16. package/fesm2022/ngx-kit-data-table.mjs +9 -2
  17. package/fesm2022/ngx-kit-data-table.mjs.map +1 -1
  18. package/fesm2022/ngx-kit-date-picker.mjs +120 -86
  19. package/fesm2022/ngx-kit-date-picker.mjs.map +1 -1
  20. package/fesm2022/ngx-kit-dialog.mjs +38 -7
  21. package/fesm2022/ngx-kit-dialog.mjs.map +1 -1
  22. package/fesm2022/ngx-kit-drawer-menu.mjs +190 -0
  23. package/fesm2022/ngx-kit-drawer-menu.mjs.map +1 -0
  24. package/fesm2022/ngx-kit-dropzone.mjs +272 -0
  25. package/fesm2022/ngx-kit-dropzone.mjs.map +1 -0
  26. package/fesm2022/ngx-kit-form-field.mjs +87 -0
  27. package/fesm2022/ngx-kit-form-field.mjs.map +1 -0
  28. package/fesm2022/ngx-kit-gallery.mjs +419 -0
  29. package/fesm2022/ngx-kit-gallery.mjs.map +1 -0
  30. package/fesm2022/ngx-kit-gradient-picker.mjs +12 -4
  31. package/fesm2022/ngx-kit-gradient-picker.mjs.map +1 -1
  32. package/fesm2022/ngx-kit-image-editor.mjs +501 -0
  33. package/fesm2022/ngx-kit-image-editor.mjs.map +1 -0
  34. package/fesm2022/ngx-kit-menu.mjs +9 -4
  35. package/fesm2022/ngx-kit-menu.mjs.map +1 -1
  36. package/fesm2022/ngx-kit-message.mjs +50 -24
  37. package/fesm2022/ngx-kit-message.mjs.map +1 -1
  38. package/fesm2022/ngx-kit-notify.mjs +1 -4
  39. package/fesm2022/ngx-kit-notify.mjs.map +1 -1
  40. package/fesm2022/ngx-kit-shared.mjs +126 -83
  41. package/fesm2022/ngx-kit-shared.mjs.map +1 -1
  42. package/fesm2022/ngx-kit-time-picker.mjs +602 -0
  43. package/fesm2022/ngx-kit-time-picker.mjs.map +1 -0
  44. package/fesm2022/ngx-kit.mjs.map +1 -1
  45. package/gallery/README.md +71 -0
  46. package/gradient-picker/README.md +41 -0
  47. package/image-editor/README.md +44 -0
  48. package/menu/README.md +85 -0
  49. package/message/README.md +70 -0
  50. package/notify/README.md +56 -0
  51. package/package.json +25 -1
  52. package/shared/README.md +117 -0
  53. package/styles/all.css +27 -0
  54. package/styles/image-viewer.css +12 -0
  55. package/types/ngx-kit-box-shadow.d.ts +1 -2
  56. package/types/ngx-kit-data-table.d.ts +1 -0
  57. package/types/ngx-kit-date-picker.d.ts +1 -1
  58. package/types/ngx-kit-dialog.d.ts +1 -0
  59. package/types/ngx-kit-drawer-menu.d.ts +101 -0
  60. package/types/ngx-kit-dropzone.d.ts +84 -0
  61. package/types/ngx-kit-form-field.d.ts +31 -0
  62. package/types/ngx-kit-gallery.d.ts +168 -0
  63. package/types/ngx-kit-image-editor.d.ts +175 -0
  64. package/types/ngx-kit-menu.d.ts +1 -0
  65. package/types/ngx-kit-message.d.ts +13 -3
  66. package/types/ngx-kit-notify.d.ts +0 -1
  67. package/types/ngx-kit-shared.d.ts +44 -13
  68. package/types/ngx-kit-time-picker.d.ts +149 -0
package/README.md CHANGED
@@ -1,2 +1,3 @@
1
- # NgxInput
2
- ## Comming Soon...
1
+ # NgxInput
2
+
3
+ ## Comming Soon...
@@ -0,0 +1,34 @@
1
+ # ngx-kit/angle-selector
2
+
3
+ انتخاب‌گر زاویه (۰ تا ۳۶۰ درجه) با یه دستگیره‌ی قابل‌درگِ دایره‌ای — برای تنظیمِ جهتِ گرادیان، چرخشِ سایه، یا هر مقدارِ زاویه‌ای دیگه.
4
+
5
+ ## نصب
6
+
7
+ ```bash
8
+ npm install ngx-kit
9
+ ```
10
+
11
+ ## استفاده
12
+
13
+ ```html
14
+ <ngx-input-angle [(ngModel)]="angle"></ngx-input-angle>
15
+ ```
16
+
17
+ یا روی یه input معمولی:
18
+
19
+ ```html
20
+ <input type="number" [ngxInputAngle]="angle" (change)="angle = $event" />
21
+ ```
22
+
23
+ ## API
24
+
25
+ | ورودی | نوع | پیش‌فرض | توضیح |
26
+ | --------------------- | ----------------------------- | -------- | -------------------------- |
27
+ | `theme` | `'light' \| 'dark' \| 'auto'` | `'auto'` | تمِ کامپوننت |
28
+ | `change` _(دایرکتیو)_ | `EventEmitter<number>` | | زاویه‌ی جدید (بر حسب درجه) |
29
+
30
+ مقدار همیشه یه عددِ بین `0` تا `360` هست.
31
+
32
+ ## دارک‌مود و RTL
33
+
34
+ خودکار پشتیبانی می‌شه. دستگیره با RxJS (`switchMap` + `takeUntil` + `takeUntilDestroyed`) پیاده شده، پس listenerهای درگ فقط دقیقاً حین یه درگِ واقعی فعالن.
@@ -0,0 +1,33 @@
1
+ # ngx-kit/box-shadow
2
+
3
+ ابزار بصریِ ساختِ `box-shadow`: جابه‌جاییِ سایه با درگِ ماوس/تاچ روی یه صفحه‌ی دوبعدی، به‌همراه کنترلِ بلور، پخش (spread)، و رنگ.
4
+
5
+ ## نصب
6
+
7
+ ```bash
8
+ npm install ngx-kit
9
+ ```
10
+
11
+ ## استفاده
12
+
13
+ ```html
14
+ <ngx-box-shadow [(ngModel)]="shadowCss"></ngx-box-shadow>
15
+ ```
16
+
17
+ یا روی یه input معمولی:
18
+
19
+ ```html
20
+ <input type="text" [ngxInputBoxShadow]="shadowCss" (change)="shadowCss = $event" />
21
+ ```
22
+
23
+ خروجی یه رشته‌ی معتبرِ CSS مثل `0px 4px 12px 0px rgba(0,0,0,0.25)` هست.
24
+
25
+ ## API
26
+
27
+ | ورودی | نوع | پیش‌فرض | توضیح |
28
+ | --------------------------------- | --------- | ------- | ----------------------------------------- |
29
+ | `setInputBackground` _(دایرکتیو)_ | `boolean` | `true` | نمایش رنگِ سایه به‌عنوان پس‌زمینه‌ی input |
30
+
31
+ ## دارک‌مود و RTL
32
+
33
+ خودکار پشتیبانی می‌شه. صفحه‌ی درگِ سایه با Pointer Capture پیاده شده (بدون نیاز به listener سراسری روی document)، پس روی موبایل هم روون کار می‌کنه.
@@ -0,0 +1,52 @@
1
+ # ngx-kit/color-picker
2
+
3
+ انتخاب‌گر رنگ کامل: پیکر بصری (اشباع/فام)، ورودی RGB/HSL/CMYK/HEX، کانال آلفا، و پشتیبانی از EyeDropper API مرورگر برای برداشتن رنگ از هرجای صفحه.
4
+
5
+ ## نصب
6
+
7
+ ```bash
8
+ npm install ngx-kit
9
+ ```
10
+
11
+ ## استفاده به‌عنوان کامپوننت
12
+
13
+ ```html
14
+ <ngx-input-color
15
+ [(ngModel)]="color"
16
+ [outputType]="'HEX'"
17
+ [defaultInspector]="ColorInspector.Picker"></ngx-input-color>
18
+ ```
19
+
20
+ `NgxInputColorComponent` یه `ControlValueAccessor` کامله، پس با `ngModel`، `formControl`، `formControlName` همه کار می‌کنه.
21
+
22
+ ## استفاده به‌عنوان دایرکتیو (روی یه input معمولی)
23
+
24
+ ```html
25
+ <input type="text" [ngxInputColor]="color" (change)="color = $event" [outputType]="'RGB'" />
26
+ ```
27
+
28
+ ## API
29
+
30
+ ### `<ngx-input-color>` / `[ngxInputColor]`
31
+
32
+ | ورودی | نوع | پیش‌فرض | توضیح |
33
+ | ------------------------------------------ | ------------------------------------------------- | -------- | ----------------------------------------------------------- |
34
+ | `theme` | `'light' \| 'dark' \| 'auto'` | `'auto'` | `'auto'` یعنی از `prefers-color-scheme` مرورگر پیروی می‌کنه |
35
+ | `simpleMode` | `boolean` | `false` | حالت جمع‌وجورتر UI |
36
+ | `outputType` | `'HEX' \| 'RGB' \| 'HSL' \| 'HSV' \| 'CMYK'` | `'HEX'` | فرمتِ رشته‌ی خروجی |
37
+ | `defaultInspector` | `ColorInspector` (`Picker \| RGB \| HSL \| CMYK`) | `Picker` | تبِ پیش‌فرضِ باز |
38
+ | `useAlphaChannel` | `boolean` | `true` | نمایش/عدم‌نمایش کانال شفافیت |
39
+ | `setInputBackgroundColor` _(فقط دایرکتیو)_ | `boolean` | `true` | پس‌زمینه‌ی خودِ input رو به رنگ انتخاب‌شده تنظیم می‌کنه |
40
+ | `change` _(خروجی، فقط دایرکتیو)_ | `EventEmitter<string>` | | مقدار جدید هر بار که رنگ عوض بشه |
41
+
42
+ ### فرمت‌های ورودی/خروجی
43
+
44
+ مقدار می‌تونه هر کدوم از این‌ها باشه: `#rrggbb`, `#rrggbbaa` (شامل مخفف ۳ و ۴ کاراکتری با آلفا)، `rgb()`/`rgba()`، `hsl()`/`hsla()`.
45
+
46
+ ## EyeDropper
47
+
48
+ اگه مرورگر کاربر از [EyeDropper API](https://developer.mozilla.org/en-US/docs/Web/API/EyeDropper) پشتیبانی کنه (کروم/اج جدید)، دکمه‌ی قطره‌چکان خودکار فعال می‌شه و کاربر می‌تونه رنگ رو از هرجای صفحه (حتی بیرون از مرورگر) بردارد. در مرورگرهایی که پشتیبانی نمی‌کنن، این دکمه مخفی می‌مونه.
49
+
50
+ ## دارک‌مود و RTL
51
+
52
+ خودکار پشتیبانی می‌شه.
@@ -0,0 +1,120 @@
1
+ # ngx-kit/data-table
2
+
3
+ جدول داده‌ی سیگنال‌محور با تایپ‌سیفتیِ کامل: تعریف ستون‌ها و رندررهای سفارشی طوری تایپ شدن که TypeScript خودش جلوی ستون‌های نامعتبر یا `rendererInputs` غلط رو می‌گیره. سورت (تک/چندستونه)، صفحه‌بندی، حالت lazy (سمت سرور)، و ریسایز ستون با Pointer Capture.
4
+
5
+ ## نصب
6
+
7
+ ```bash
8
+ npm install ngx-kit
9
+ ```
10
+
11
+ ## راه‌اندازی رندررها (اختیاری، ولی توصیه‌شده)
12
+
13
+ ```ts
14
+ // app.config.ts
15
+ import { provideTable, defineRenderers } from 'ngx-kit/data-table';
16
+ import { AvatarCellRenderer, BooleanCellRenderer } from './cell-renderers';
17
+
18
+ export const appConfig: ApplicationConfig = {
19
+ providers: [
20
+ provideTable({
21
+ renderers: defineRenderers({ avatar: AvatarCellRenderer, boolean: BooleanCellRenderer }),
22
+ column: { minWidth: 80, maxWidth: 480, defaultWidth: 160 },
23
+ }),
24
+ ],
25
+ };
26
+ ```
27
+
28
+ ## تعریفِ type-safe ستون‌ها
29
+
30
+ ```ts
31
+ interface Tenant {
32
+ avatarUrl: string;
33
+ name: string;
34
+ isActive: boolean;
35
+ }
36
+
37
+ const renderers = defineRenderers({ avatar: AvatarCellRenderer, boolean: BooleanCellRenderer });
38
+
39
+ const fields = defineFields<Tenant, typeof renderers>(renderers, [
40
+ { column: 'avatarUrl', title: 'کاربر', renderer: 'avatar', rendererInputs: { showName: true } }, // ✅ تایپ‌چک می‌شه
41
+ { column: 'name', title: 'نام', sortable: true },
42
+ { column: 'isActive', title: 'فعال', renderer: 'boolean', align: 'center' },
43
+ ]);
44
+ ```
45
+
46
+ اگه `column` یه فیلدِ واقعیِ `Tenant` نباشه، یا `renderer` یه کلیدِ واقعیِ رجیستری نباشه، یا `rendererInputs` با ورودی‌های واقعیِ اون رندرر هم‌خونی نداشته باشه — کامپایل خطا می‌ده، نه فقط runtime.
47
+
48
+ ## استفاده در تمپلیت
49
+
50
+ ```html
51
+ <ngx-table
52
+ [fields]="fields"
53
+ [data]="tenants"
54
+ [totalRecords]="tenants.length"
55
+ [pageSize]="20"
56
+ (sortChange)="onSortChange($event)"></ngx-table>
57
+ ```
58
+
59
+ ### حالت lazy (صفحه‌بندی/سورت سمت سرور)
60
+
61
+ ```html
62
+ <ngx-table
63
+ [fields]="fields"
64
+ [data]="page"
65
+ [totalRecords]="total"
66
+ [lazy]="true"
67
+ (lazyLoad)="fetchPage($event)"></ngx-table>
68
+ ```
69
+
70
+ ```ts
71
+ fetchPage(ev: LazyLoadEvent<Tenant>) {
72
+ // ev.pageIndex, ev.pageSize, ev.first, ev.sorts
73
+ this.api.getTenants(ev).subscribe((res) => { this.page = res.data; this.total = res.total; });
74
+ }
75
+ ```
76
+
77
+ ## API
78
+
79
+ ### ورودی‌های `<ngx-table>`
80
+
81
+ | ورودی | نوع | توضیح |
82
+ | ------------------ | --------------------------------- | ------------------------------------------------------------- |
83
+ | `fields` | `TableField<T, R>[]` **(اجباری)** | تعریفِ ستون‌ها (از `defineFields`) |
84
+ | `data` | `readonly T[]` **(اجباری)** | دیتای صفحه‌ی جاری |
85
+ | `totalRecords` | `number` **(اجباری)** | تعداد کل ردیف‌ها (برای صفحه‌بندی) |
86
+ | `pageSize` | `number` | پیش‌فرض از `provideTable` |
87
+ | `lazy` | `boolean` | اگه `true`، سورت/صفحه‌بندی رو خودِ اپ مدیریت می‌کنه (نه جدول) |
88
+ | `loading` | `boolean` | نمایش وضعیتِ بارگذاری |
89
+ | `showRecordNumber` | `boolean` | نمایش ستونِ شماره‌ی ردیف |
90
+
91
+ ### خروجی‌ها
92
+
93
+ | خروجی | نوع | توضیح |
94
+ | -------------- | ---------------------------------- | ----------------------------------------------------------------------------- |
95
+ | `sortChange` | `SortMeta<T>[]` | تغییرِ سورت (حالت غیر-lazy) |
96
+ | `lazyLoad` | `LazyLoadEvent<T>` | صفحه/سورتِ جدید (حالت lazy) — شاملِ `pageIndex`, `pageSize`, `first`, `sorts` |
97
+ | `columnResize` | `{ field: string; width: number }` | تغییرِ عرضِ ستون |
98
+
99
+ ### تعریفِ یه رندررِ سفارشی
100
+
101
+ ```ts
102
+ @Component({
103
+ standalone: true,
104
+ selector: 'app-avatar-cell',
105
+ template: `
106
+ <img [src]="value()" />
107
+ <span *ngIf="showName()">{{ row().name }}</span>
108
+ `,
109
+ })
110
+ export class AvatarCellRenderer implements CellRendererComponent<string, Tenant> {
111
+ value = input.required<string>();
112
+ row = input.required<Tenant>();
113
+ field = input.required<TableFieldBase<Tenant>>();
114
+ showName = input(false); // این خودکار به rendererInputs اضافه می‌شه
115
+ }
116
+ ```
117
+
118
+ ## دارک‌مود و RTL
119
+
120
+ خودکار پشتیبانی می‌شه.
@@ -0,0 +1,74 @@
1
+ # ngx-kit/date-picker
2
+
3
+ انتخاب‌گر تاریخ با پشتیبانی از چهار تقویم: میلادی، جلالی (شمسی)، هجری قمری، و چینی — با یه معماریِ آداپترمحور که اضافه‌کردنِ تقویم‌های دیگه رو هم ممکن می‌کنه. یه کامپوننتِ تقویمِ مستقل (`ngx-calendar`) هم داره که بدون input قابل‌استفاده‌ست.
4
+
5
+ ## نصب
6
+
7
+ ```bash
8
+ npm install ngx-kit
9
+ ```
10
+
11
+ ## راه‌اندازی
12
+
13
+ آداپترهای تقویم باید provide بشن (پیش‌فرض هر چهارتاش رو با هم می‌ده؛ اگه فقط بعضی‌هاشون رو لازم دارید، bundle سبک‌تر می‌مونه چون هرکدوم لازی import می‌شن):
14
+
15
+ ```ts
16
+ // app.config.ts
17
+ import { provideDateAdapters } from 'ngx-kit/date-picker';
18
+
19
+ export const appConfig: ApplicationConfig = {
20
+ providers: [provideDateAdapters()],
21
+ };
22
+ ```
23
+
24
+ ## استفاده
25
+
26
+ ```html
27
+ <input
28
+ type="text"
29
+ [ngxInputDatePicker]="date"
30
+ (change)="date = $event"
31
+ [locale]="'fa'"
32
+ [displayFormat]="'yyyy/MM/dd'" />
33
+ ```
34
+
35
+ ```html
36
+ <ngx-calendar [locale]="'fa'" [theme]="'auto'"></ngx-calendar>
37
+ ```
38
+
39
+ ## API
40
+
41
+ ### `[ngxInputDatePicker]`
42
+
43
+ | ورودی | نوع | پیش‌فرض | توضیح |
44
+ | ------------------ | ----------------------------------------------------------------------- | -------------- | -------------------------------------------------------------------------------------- |
45
+ | `locale` | `string` (`'en'`, `'fa'`, `'hi'`, `'zh'`, یا هر لوکیلِ سفارشیِ ثبت‌شده) | `'en'` | تقویمی که استفاده می‌شه |
46
+ | `theme` | `'light' \| 'dark' \| 'auto'` | `'auto'` | |
47
+ | `displayFormat` | `string` | `'yyyy/MM/dd'` | فرمتِ نمایشِ متنیِ تاریخ |
48
+ | `min` / `max` | `Date` | | محدوده‌ی مجاز |
49
+ | `config` | `NgxDatePickerConfig` | | نمایش/متنِ دکمه‌های «امروز»/«پاک کردن»، تمپلیت‌های سفارشیِ آیکون‌ها |
50
+ | `change` _(خروجی)_ | `EventEmitter<Date>` | | تاریخِ انتخاب‌شده (همیشه یه شیءِ `Date` استاندارد جاوااسکریپت، مستقل از تقویمِ نمایشی) |
51
+
52
+ ### `getLocals()`
53
+
54
+ لیستِ لوکیل‌های فعلاً ثبت‌شده رو برمی‌گردونه (برای مثال برای پرکردنِ یه `<select>` انتخابِ زبان):
55
+
56
+ ```ts
57
+ availableLocals = getLocals(); // ['en', 'fa', 'hi', 'zh']
58
+ ```
59
+
60
+ ### افزودن یه تقویمِ سفارشی
61
+
62
+ ```ts
63
+ provideDateAdapters({ locale: 'ja', useClass: MyJapaneseAdapter });
64
+ ```
65
+
66
+ `MyJapaneseAdapter` باید اینترفیس `IDateAdapter` رو پیاده کنه.
67
+
68
+ ## نکته‌ی پرفورمنس
69
+
70
+ تقویم‌های هجری و چینی (که جدولی/نجومی‌ان، نه فرمولی مثلِ میلادی/جلالی) نتایجِ محاسبات‌شون رو داخلی cache می‌کنن — چون رندر یه ماهِ تقویم، برای هر خانه‌ی روز جدا محاسبه‌ی تاریخ رو صدا می‌زنه؛ بدون کش، این می‌تونست برای سال‌های دور از امروز چند صد میلی‌ثانیه طول بکشه.
71
+
72
+ ## دارک‌مود و RTL
73
+
74
+ خودکار پشتیبانی می‌شه (تقویمِ جلالی/هجری به‌طور طبیعی هم RTL هستن).
package/dialog/README.md CHANGED
@@ -1,169 +1,94 @@
1
- # NgxDialog
2
-
3
- 🎉 Open angular component as a dialog(popup) in Angular Framework without Cdk Material
4
-
5
- ## 📦Demo
6
-
7
- [🚀demo](https://mr-samani.web.app/demo/dialog)
8
-
9
- ## Install
10
-
11
- - NPM: npm i @mr-samani/ngx-dialog
12
- - YARN: yarn add @mr-samani/ngx-dialog
13
-
14
- ## Usage
15
-
16
- Import `NgxDialogModule` to your working module
17
-
18
- ```
19
- import { NgxDialogModule } from 'ngx-dialog';
20
-
21
- @NgModule({
22
- imports: [
23
- NgxDialogModule
24
- ]
25
- })
26
- export class AppModule { }
27
-
28
- ```
29
-
30
- ## For open dialog
31
-
32
- ```
33
- import { Component, OnInit } from '@angular/core';
34
- import { NgxOverlayService } from 'ngx-dialog';
35
- import { ModalComponent } from './modal/modal.component';
36
-
37
- @Component({
38
- selector: 'app-demo',
39
- templateUrl: './demo.component.html',
40
- styleUrls: ['./demo.component.scss']
41
- })
42
- export class DemoComponent implements OnInit {
43
-
44
- constructor(
45
- private ngxDialog: NgxOverlayService
46
- ) { }
47
-
48
- ngOnInit(): void {
49
- }
50
-
51
-
52
- openDialog() {
53
- this.ngxDialog.open(ModalComponent, {
54
- data: {
55
- a: 123
56
- },
57
- containerClass: 'my dialog ',
58
- allowCloseOnOutsideClick: true,
59
- maxWidth: '80%',
60
- maxHeight: '80%'
61
- }).afterClosed.subscribe((r: any) => {
62
- console.log('closed result=', r);
63
- });
64
- }
65
-
66
- }
67
- ```
68
-
69
- ## Modal component
70
-
71
- ```
72
- import { JsonPipe } from '@angular/common';
73
- import { Component, OnInit } from '@angular/core';
74
- import { NgxDialogConfig, DIALOG_REF, NgxOverlayService } from 'ngx-dialog';
75
-
76
- @Component({
77
- selector: 'app-modal',
78
- templateUrl: './modal.component.html',
79
- styleUrls: ['./modal.component.scss']
80
- })
81
- export class ModalComponent implements OnInit {
82
- data: any;
83
- private dialogRef = inject(DIALOG_REF);
84
-
85
- constructor(
86
- public config: NgxDialogConfig,
87
- private ngxDialog: NgxOverlayService
88
- ) {
89
- this.data = config.data;
90
- }
91
-
92
- ngOnInit(): void {
93
- }
94
-
95
- ok() {
96
- alert('param=' + new JsonPipe().transform(this.data));
97
- }
98
-
99
- cancel() {
100
- this.dialogRef.close(this.data);
101
- }
102
-
103
-
104
- openNewDialog() {
105
- this.ngxDialog.open(ModalComponent, {
106
- data: {
107
- a: this.data.a + 1
108
- }
109
- }).afterClosed.subscribe((r: any) => {
110
- console.log('child closed result=', r);
111
- });
112
- }
113
-
114
- }
115
- ```
116
-
117
- ## Modal html
118
-
119
- ```
120
- <div ngx-dialog-header [showCloseButton]="true">
121
- header
122
- </div>
123
- <div ngx-dialog-body>
124
- <p>modal works!</p>
125
- {{data|json}}
126
- </div>
127
- <div ngx-dialog-footer [align]="'space-between'">
128
- <div>
129
- <button (click)="ok()" type="button" class="btn btn-primary mx-1">ok</button>
130
- <button (click)="cancel()" type="button" class="btn btn-warning mx-1">cancel</button>
131
- </div>
132
-
133
- <button (click)="openNewDialog()" type="button" class="btn btn-info mx-1">open New Dialog</button>
134
- </div>
135
- ```
136
-
137
- ## For create draggable dialog:
138
-
139
- you can use NgxDragableResizable library
140
- [🚀npm](https://www.npmjs.com/package/ngx-dragable-resizable)
141
- and change dialog header to:
142
-
143
- ```
144
- <div ngx-dialog-header [showCloseButton]="true" NgxDragableResizable [dragRootElement]="'.ngx-dialog'">
145
- header
146
- </div>
147
- ```
148
-
149
- ## Dialog config
150
-
151
- | Name | Type | Default | Description |
152
- | -------------------------- | ------- | ------- | ---------------------------------------------------------- |
153
- | [data] | any | {} | Pass data to modal component |
154
- | [allowCloseOnOutsideClick] | boolean | false | The user can close the modal by clicking outside the modal |
155
- | [containerClass] | string | null | Css class name |
156
- | [header] | string | null | Header config |
157
- | [footer] | string | null | Footer config |
158
- | [width] | string | "" | Width of dialog |
159
- | [minWidth] | string | "" | Minimum width of dialog |
160
- | [maxWidth] | string | "" | Maximum width of dialog |
161
- | [height] | string | "" | Height of dialog |
162
- | [minHeight] | string | "" | Minimum height of dialog |
163
- | [maxHeight] | string | "" | Maximum height of dialog |
164
-
165
- ## Author
166
-
167
- 💻Mohammadreza samani | FrontEnd Developer
168
-
169
- [❤️Buy me a coffee 😉](https://www.buymeacoffee.com/mrsamani/ngxdragableresizable)
1
+ # ngx-kit/dialog
2
+
3
+ مودال/دیالوگ روی پایه‌ی `<dialog>` بومیِ مرورگر — بدون overlay دستی، بدون کتابخونه‌ی جانبی.
4
+
5
+ > ⚠️ اگه نسخه‌ی قبلیِ این README رو دیدید که از `DIALOG_REF` یا `ngx-dialog-header` یا پکیج جدای `ngx-dialog` حرف می‌زد — اون مال یه نسخه‌ی خیلی قدیمی‌تر بوده و با API فعلی هم‌خونی نداره. این نسخه به‌روزه.
6
+
7
+ ## نصب
8
+
9
+ ```bash
10
+ npm install ngx-kit
11
+ ```
12
+
13
+ ## راه‌اندازی
14
+
15
+ ```ts
16
+ // app.config.ts
17
+ import { ApplicationConfig, importProvidersFrom } from '@angular/core';
18
+ import { NgxDialogModule } from 'ngx-kit/dialog';
19
+
20
+ export const appConfig: ApplicationConfig = {
21
+ providers: [importProvidersFrom(NgxDialogModule)],
22
+ };
23
+ ```
24
+
25
+ ## باز کردن یه دیالوگ
26
+
27
+ با API استاتیک (بدون تزریق دستیِ سرویس):
28
+
29
+ ```ts
30
+ import { Dialog } from 'ngx-kit/dialog';
31
+
32
+ const ref = Dialog.open(MyDialogComponent, {
33
+ data: { userId: 42 },
34
+ width: '480px',
35
+ allowCloseOnOutsideClick: true,
36
+ header: { enable: true, title: 'ویرایش کاربر', showCloseButton: true },
37
+ });
38
+
39
+ ref.afterClosed.subscribe((result) => console.log('نتیجه:', result));
40
+ ```
41
+
42
+ داخل کامپوننتِ دیالوگ:
43
+
44
+ ```ts
45
+ @Component({ ... })
46
+ export class MyDialogComponent {
47
+ private ref = inject(NgxDialogRef);
48
+ data = inject(NGX_DIALOG_DATA); // دیتایی که با config.data پاس داده شده
49
+
50
+ save() {
51
+ this.ref.close({ saved: true });
52
+ }
53
+ }
54
+ ```
55
+
56
+ ### دایرکتیوهای layout داخل دیالوگ
57
+
58
+ ```html
59
+ <div *ngxDialogHeader>عنوانِ سفارشی</div>
60
+ <div *ngxDialogBody>محتوای اصلی</div>
61
+ <div *ngxDialogFooter>
62
+ <button (click)="save()">ذخیره</button>
63
+ </div>
64
+ ```
65
+
66
+ ## API
67
+
68
+ ### `Dialog.open<T>(component, config?)`
69
+
70
+ | فیلدِ `config` | نوع | پیش‌فرض | توضیح |
71
+ | ----------------------------------------------------------- | ---------- | ----------- | -------------------------------------------------- |
72
+ | `data` | `T` | `{}` | دیتایی که به کامپوننتِ داخلِ دیالوگ پاس داده می‌شه |
73
+ | `allowCloseOnOutsideClick` | `boolean` | `false` | بستن با کلیک روی backdrop |
74
+ | `containerClass` | `string` | `'ngx-kit'` | کلاسِ اضافی روی container |
75
+ | `header.enable` / `header.title` / `header.showCloseButton` | | | تنظیمات هدرِ پیش‌فرض |
76
+ | `footer.enable` | `boolean` | | نمایش فوتر پیش‌فرض |
77
+ | `width` / `minWidth` / `maxWidth` | `string` | | ابعاد افقی |
78
+ | `height` / `minHeight` / `maxHeight` | `string` | | ابعاد عمودی |
79
+ | `injector` | `Injector` | | تزریق‌کننده‌ی سفارشی برای کامپوننتِ داخلی |
80
+
81
+ ### `NgxDialogRef`
82
+
83
+ | عضو | توضیح |
84
+ | ------------------------------ | ----------------------------------------- |
85
+ | `close(result?)` | بستن دیالوگ، با ارسال یه نتیجه‌ی اختیاری |
86
+ | `afterClosed: Observable<any>` | با `result` صدا زده می‌شه بعد از بسته‌شدن |
87
+
88
+ ## نکته‌ی SSR
89
+
90
+ `Dialog.open(...)` یه API استاتیک/سراسریه که برای اپ‌های معمولیِ مرورگری کاملاً امنه. اگه از Angular SSR استفاده می‌کنید، این static instance بینِ درخواست‌های هم‌زمانِ سرور مشترکه — به‌جای API استاتیک، مستقیماً `NgxOverlayService` رو تزریق و ازش استفاده کنید (که per-injector/per-request امنه).
91
+
92
+ ## دارک‌مود و RTL
93
+
94
+ خودکار پشتیبانی می‌شه (`light-dark()` + CSS logical properties).