ngx-kit 3.2.0 → 5.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.
@@ -0,0 +1,334 @@
1
+ import * as _angular_core from '@angular/core';
2
+ import { InputSignal, Type, TemplateRef, InjectionToken, EnvironmentProviders, OnInit, AfterContentInit } from '@angular/core';
3
+ import * as ngx_kit_shared from 'ngx-kit/shared';
4
+ import * as ngx_kit_data_table from 'ngx-kit/data-table';
5
+
6
+ type SortDirection = 'asc' | 'desc';
7
+ interface SortMeta<T> {
8
+ field: Extract<keyof T, string>;
9
+ direction: SortDirection;
10
+ }
11
+
12
+ interface PageEvent {
13
+ page: number;
14
+ pageSize: number;
15
+ }
16
+ interface PageState {
17
+ pageIndex: number;
18
+ pageSize: number;
19
+ /** آفست صفر-پایه‌ی اولین ردیف صفحه‌ی جاری. */
20
+ first: number;
21
+ }
22
+ /** هر بار سرور باید صفحه‌ی جدید را (در حالت lazy) واکشی کند، امیت می‌شود. */
23
+ interface LazyLoadEvent<T> extends PageState {
24
+ sorts: SortMeta<T>[];
25
+ }
26
+
27
+ interface PaginationLabel {
28
+ first: string;
29
+ last: string;
30
+ next: string;
31
+ previous: string;
32
+ showing: string;
33
+ to: string;
34
+ of: string;
35
+ results: string;
36
+ pageSize: string;
37
+ }
38
+ interface NgxPaginationOptions {
39
+ labels: PaginationLabel;
40
+ pageSizeOptions: number[];
41
+ defaultPageSize: number;
42
+ }
43
+
44
+ interface CellRendererComponent<TValue = unknown, TRow extends object = object> {
45
+ value: InputSignal<TValue>;
46
+ row: InputSignal<TRow>;
47
+ field: InputSignal<TableFieldBase<TRow>>;
48
+ }
49
+ type RendererRegistry = Readonly<Record<string, Type<CellRendererComponent<any, any>>>>;
50
+ /**
51
+ * Identity helper: یک رجیستری رندرر را با inference کامل تعریف می‌کند.
52
+ * همین آبجکت باید هم در provideTable({ renderers }) و هم در defineFields(renderers, ...)
53
+ * استفاده شود تا کلیدها (و ورودی‌های اضافه‌ی هر رندرر) در کل پروژه type-check شوند.
54
+ */
55
+ declare function defineRenderers<R extends RendererRegistry>(registry: R): R;
56
+ type InstanceOf<C> = C extends Type<infer I> ? I : never;
57
+ type UnwrapSignal<S> = S extends () => infer V ? V : never;
58
+ type RendererExtraInputs<C extends Type<any>> = {
59
+ [K in keyof InstanceOf<C> as K extends 'value' | 'row' | 'field' ? never : InstanceOf<C>[K] extends () => any ? K : never]?: UnwrapSignal<InstanceOf<C>[K]>;
60
+ };
61
+ type ColumnAlign = 'start' | 'center' | 'end';
62
+ type TableCellFormatter<T extends object = object> = (value: unknown, row: T, field: TableFieldBase<T>) => unknown;
63
+ interface CellTemplateContext<T extends object> {
64
+ $implicit: T;
65
+ row: T;
66
+ value: unknown;
67
+ rowIndex: number;
68
+ field: TableFieldBase<T>;
69
+ }
70
+ /** شکل پایه‌ای مشترک بین همه‌ی ستون‌ها، صرف‌نظر از این‌که renderer دارند یا نه. */
71
+ interface TableFieldBase<T extends object> {
72
+ column: Extract<keyof T, string>;
73
+ title: string;
74
+ width?: number;
75
+ minWidth?: number;
76
+ maxWidth?: number;
77
+ resizable?: boolean;
78
+ sortable?: boolean;
79
+ wrap?: boolean;
80
+ align?: ColumnAlign;
81
+ prefix?: string;
82
+ formatter?: string | TableCellFormatter<T>;
83
+ }
84
+ /** ستون بدون renderer (متن ساده / formatter / cellTemplate دستی). */
85
+ interface PlainTableField<T extends object> extends TableFieldBase<T> {
86
+ renderer?: undefined;
87
+ rendererInputs?: undefined;
88
+ cellTemplate?: TemplateRef<CellTemplateContext<T>>;
89
+ }
90
+ /** ستونی که یک renderer از رجیستری R انتخاب کرده؛ rendererInputs دقیقاً همان
91
+ * ورودی‌های اضافه‌ی همان renderer است — نه یک Record<string, unknown> آزاد. */
92
+ type RenderedTableField<T extends object, R extends RendererRegistry> = {
93
+ [K in keyof R]: TableFieldBase<T> & {
94
+ renderer: K;
95
+ rendererInputs?: RendererExtraInputs<R[K]>;
96
+ cellTemplate?: undefined;
97
+ };
98
+ }[keyof R];
99
+ type TableField<T extends object, R extends RendererRegistry = {}> = PlainTableField<T> | RenderedTableField<T, R>;
100
+ /**
101
+ * Identity helper برای تعریف ستون‌های یک جدول با inference و type-check کامل
102
+ * نسبت به هم مدل داده (T) و هم رجیستری رندررها (R).
103
+ *
104
+ * @example
105
+ * const renderers = defineRenderers({ avatar: AvatarCellRenderer, boolean: BooleanCellRenderer });
106
+ *
107
+ * const fields = defineFields<Tenant, typeof renderers>(renderers, [
108
+ * { column: 'avatarUrl', title: 'کاربر', renderer: 'avatar', rendererInputs: { showName: true } }, // ✅
109
+ * { column: 'avatarUrl', title: 'کاربر', renderer: 'avatar', rendererInputs: { showName: 'x' } }, // ❌ باید boolean باشد
110
+ * { column: 'isActive', title: 'فعال', renderer: 'bool' }, // ❌ کلید رجیستری نیست
111
+ * { column: 'ageXYZ', title: '...' }, // ❌ فیلد Tenant نیست
112
+ * ]);
113
+ */
114
+ declare function defineFields<T extends object, R extends RendererRegistry = {}>(_renderers: R, fields: TableField<T, R>[]): TableField<T, R>[];
115
+
116
+ interface TableLabels {
117
+ operation?: string;
118
+ noData?: string;
119
+ loading?: string;
120
+ }
121
+ interface ColumnSizingConfig {
122
+ /** حداقل عرض (px) که برای همه‌ی ستون‌های resizable اعمال می‌شود مگر این‌که ستون خودش override کند. */
123
+ minWidth: number;
124
+ /** حداکثر عرض (px). */
125
+ maxWidth: number;
126
+ /** عرض پیش‌فرض وقتی ستون width مشخص نکرده و کاربر هم دستی ریسایز نکرده. */
127
+ defaultWidth: number;
128
+ }
129
+ interface NgxTableOptions {
130
+ showRecordNumber?: boolean;
131
+ labels?: TableLabels;
132
+ /** فعال‌سازی سورت چندستونه با Ctrl/Shift+Click. */
133
+ multiSort?: boolean;
134
+ resizable?: boolean;
135
+ stripedRows?: boolean;
136
+ hoverable?: boolean;
137
+ stickyHeader?: boolean;
138
+ column?: ColumnSizingConfig;
139
+ /** رجیستری رندررهای سراسری. با defineRenderers({...}) بسازید. */
140
+ renderers?: RendererRegistry;
141
+ formatters?: Readonly<Record<string, TableCellFormatter<any>>>;
142
+ }
143
+ type ResolvedTableOptions = Required<Omit<NgxTableOptions, 'labels' | 'renderers' | 'formatters'>> & {
144
+ labels: Required<TableLabels>;
145
+ renderers: RendererRegistry;
146
+ formatters: Readonly<Record<string, TableCellFormatter<any>>>;
147
+ };
148
+
149
+ declare const NGX_TABLE_CONFIG_DEFAULT: ResolvedTableOptions;
150
+ /** به هر نمونه‌ی ngx-table تزریق می‌شود. با provideTable() مقداردهی کنید. */
151
+ declare const NGX_TABLE_CONFIG: InjectionToken<ResolvedTableOptions>;
152
+
153
+ declare const NGX_PAGINATION_CONFIG_DEFAULT: NgxPaginationOptions;
154
+ declare const NGX_PAGINATION_CONFIG: InjectionToken<NgxPaginationOptions>;
155
+
156
+ /**
157
+ * کانفیگ سراسری <ngx-table>: جهت پیش‌فرض، حداقل/حداکثر عرض ستون، فعال بودن
158
+ * پیش‌فرض سورت چندستونه، و از همه مهم‌تر رجیستری رندررها.
159
+ *
160
+ * @example
161
+ * provideTable({
162
+ * renderers: defineRenderers({ avatar: AvatarCellRenderer, boolean: BooleanCellRenderer }),
163
+ * column: { minWidth: 80, maxWidth: 480, defaultWidth: 160 },
164
+ * })
165
+ */
166
+ declare function provideTable(options?: NgxTableOptions): EnvironmentProviders;
167
+
168
+ declare function providePagination(options?: Partial<NgxPaginationOptions>): EnvironmentProviders;
169
+
170
+ /**
171
+ * برای projection قالب سفارشی یک ستون بدون این‌که مجبور باشید cellTemplate را
172
+ * از طریق ViewChild به آبجکت ستون وصل کنید:
173
+ *
174
+ * <ngx-table [fields]="fields" [data]="rows()">
175
+ * <ng-template ngxTableCell="userName" let-row let-value="value">
176
+ * <strong>{{ value }}</strong>
177
+ * </ng-template>
178
+ * </ngx-table>
179
+ *
180
+ * مهم: چون این دایرکتیو در تمپلیت *کامپوننت مصرف‌کننده* (نه ngx-table) استفاده
181
+ * می‌شود، باید آن را در آرایه‌ی imports همان کامپوننت (standalone) وارد کنید:
182
+ * imports: [NgxTable, TableCell]
183
+ *
184
+ * محدودیت شناخته‌شده: context این تمپلیت (row/value) از نوع T دقیق نیست
185
+ * (چون TemplateRef اینجا به‌صورت پویا از ContentChildren جمع‌آوری می‌شود و
186
+ * اطلاعات جنریک T در آن نقطه از بین می‌رود). برای type-safety کامل روی
187
+ * row/value، از field.cellTemplate به همراه @ViewChild استفاده کنید (به README
188
+ * بخش «Cell Template کاملاً Type-Safe» مراجعه کنید).
189
+ */
190
+ declare class TableCell<T extends object = object> {
191
+ readonly column: _angular_core.InputSignal<string>;
192
+ readonly templateRef: TemplateRef<any>;
193
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TableCell<any>, never>;
194
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<TableCell<any>, "ng-template[ngxTableCell]", never, { "column": { "alias": "ngxTableCell"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
195
+ }
196
+
197
+ /**
198
+ * دستگیره‌ی درگ برای ریسایز ستون. روی لبه‌ی «انتهای منطقی» (inline-end) قرار
199
+ * می‌گیرد، یعنی خودش زیر [dir="rtl"] جابه‌جا می‌شود؛ فقط جهت محاسبه‌ی دلتا هم
200
+ * برعکس می‌شود تا حس درگ همیشه طبیعی باشد.
201
+ *
202
+ * مقدار نهایی توسط جدول در یک Map از عرض‌ها ذخیره می‌شود (نه در استایل مستقیم
203
+ * ستون)، به همراه علامت‌گذاری «دستی ریسایز شده» — یعنی بعد از این، هیچ
204
+ * re-render یا تغییر داده‌ای این عرض را از بین نمی‌برد.
205
+ */
206
+ declare class ColumnResize {
207
+ readonly startWidth: _angular_core.InputSignal<number>;
208
+ readonly minWidth: _angular_core.InputSignal<number>;
209
+ readonly maxWidth: _angular_core.InputSignal<number>;
210
+ readonly direction: _angular_core.InputSignal<"ltr" | "rtl">;
211
+ readonly resizing: _angular_core.OutputEmitterRef<number>;
212
+ readonly resizeEnd: _angular_core.OutputEmitterRef<number>;
213
+ private dragging;
214
+ private startX;
215
+ private baseWidth;
216
+ onPointerDown(event: PointerEvent): void;
217
+ onPointerMove(event: PointerEvent): void;
218
+ onPointerUp(event: PointerEvent): void;
219
+ private computeWidth;
220
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ColumnResize, never>;
221
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ColumnResize, "[ngxColumnResize]", never, { "startWidth": { "alias": "ngxColumnResizeWidth"; "required": true; "isSignal": true; }; "minWidth": { "alias": "ngxColumnResizeMin"; "required": false; "isSignal": true; }; "maxWidth": { "alias": "ngxColumnResizeMax"; "required": false; "isSignal": true; }; "direction": { "alias": "ngxColumnResizeDir"; "required": false; "isSignal": true; }; }, { "resizing": "resizing"; "resizeEnd": "resizeEnd"; }, never, never, true, never>;
222
+ }
223
+
224
+ /**
225
+ * جدول داده‌ی جنریک و Type-Safe.
226
+ *
227
+ * `T` از روی چیزی که به [data] بایند می‌کنید استنتاج می‌شود؛ `field.column` در
228
+ * `TableField<T, R>` محدود به `keyof T` است، و اگر از defineFields(renderers, ...)
229
+ * استفاده کنید، `field.renderer` محدود به کلیدهای رجیستری و `rendererInputs`
230
+ * دقیقاً همان ورودی‌های اضافه‌ی همان renderer است.
231
+ *
232
+ * دو حالت:
233
+ * - کلاینت‌ساید (پیش‌فرض): [data] کل آرایه است؛ سورت/صفحه‌بندی داخلی و روی
234
+ * یک computed خالص انجام می‌شود (بدون mutation روی آبجکت‌های شما).
235
+ * - lazy: [lazy]="true" + [totalRecords]؛ [data] فقط صفحه‌ی جاری است؛ به
236
+ * (lazyLoad) گوش بدهید.
237
+ */
238
+ declare class NgxTable<T extends object> implements OnInit, AfterContentInit {
239
+ protected readonly config: ngx_kit_data_table.ResolvedTableOptions;
240
+ protected readonly paginationConfig: ngx_kit_data_table.NgxPaginationOptions;
241
+ readonly fields: _angular_core.InputSignal<TableField<T, any>[]>;
242
+ readonly data: _angular_core.InputSignal<readonly T[]>;
243
+ readonly totalRecords: _angular_core.InputSignal<number>;
244
+ readonly showRecordNumber: _angular_core.InputSignal<boolean>;
245
+ readonly operations: _angular_core.InputSignal<TemplateRef<{
246
+ $implicit: T;
247
+ }> | undefined>;
248
+ readonly operationWidth: _angular_core.InputSignal<number>;
249
+ readonly numWidth: _angular_core.InputSignal<number>;
250
+ readonly pageSize: _angular_core.InputSignal<number>;
251
+ readonly loading: _angular_core.InputSignal<boolean>;
252
+ readonly multiSort: _angular_core.InputSignal<boolean | undefined>;
253
+ readonly lazy: _angular_core.InputSignal<boolean>;
254
+ /** پیش‌فرض بر اساس ایندکس؛ برای جلوگیری از گم‌شدن state سطرها هنگام سورت،
255
+ * یک شناسه‌ی یکتا بدهید: [trackBy]="(i, row) => row.id" */
256
+ readonly trackBy: _angular_core.InputSignal<(index: number, row: T) => unknown>;
257
+ readonly lazyLoad: _angular_core.OutputEmitterRef<LazyLoadEvent<T>>;
258
+ readonly sortChange: _angular_core.OutputEmitterRef<SortMeta<T>[]>;
259
+ readonly columnResize: _angular_core.OutputEmitterRef<{
260
+ field: string;
261
+ width: number;
262
+ }>;
263
+ protected readonly page: _angular_core.WritableSignal<number>;
264
+ protected readonly pageSizeS: _angular_core.WritableSignal<number>;
265
+ protected readonly sorts: _angular_core.WritableSignal<SortMeta<T>[]>;
266
+ protected readonly widths: _angular_core.WritableSignal<Record<string, number>>;
267
+ private readonly manuallyResized;
268
+ private readonly rendererInputsCache;
269
+ private cellTemplates;
270
+ private templateMap;
271
+ protected readonly resolvedMultiSort: _angular_core.Signal<boolean>;
272
+ private readonly directionService;
273
+ protected readonly resolvedDirection: _angular_core.Signal<ngx_kit_shared.Direction>;
274
+ constructor();
275
+ ngOnInit(): void;
276
+ ngAfterContentInit(): void;
277
+ private syncTemplateMap;
278
+ protected readonly sortedData: _angular_core.Signal<readonly T[]>;
279
+ protected readonly totalCount: _angular_core.Signal<number>;
280
+ protected readonly pagedData: _angular_core.Signal<readonly T[]>;
281
+ private compare;
282
+ /** بدون mutation روی داده‌ی ورودی: شماره‌ی ردیف صرفاً از روی page/pageSize/rowIndex محاسبه می‌شود. */
283
+ protected recordNumber(rowIndex: number): number;
284
+ protected sortDirectionFor(column: string): SortDirection | null;
285
+ protected onHeaderClick(field: TableField<T, any>, event: MouseEvent): void;
286
+ protected onPaginate(event: PageEvent): void;
287
+ private emitLazyIfNeeded;
288
+ protected columnWidth(column: string): number;
289
+ protected columnMin(field: TableField<T, any>): number;
290
+ protected columnMax(field: TableField<T, any>): number;
291
+ protected isResizable(field: TableField<T, any>): boolean;
292
+ protected onColumnResizing(column: string, width: number): void;
293
+ protected onColumnResizeEnd(column: string, width: number): void;
294
+ protected getTemplate(column: string): TemplateRef<CellTemplateContext<T>> | null;
295
+ protected getRenderer(field: TableField<T, any>): Type<CellRendererComponent> | null;
296
+ protected getCellValue(row: T, field: TableField<T, any>): unknown;
297
+ protected formatCellValue(row: T, field: TableField<T, any>): string;
298
+ private stringify;
299
+ /** ورودی‌های renderer را به‌ازای هر (field, row) کش می‌کند تا هر Change
300
+ * Detection یک آبجکت جدید ساخته نشود؛ با WeakMap، وقتی row از حافظه خارج
301
+ * شود (مثلاً بعد از عوض‌شدن صفحه)، entry آن هم خودکار پاک می‌شود. */
302
+ protected getRendererInputs(row: T, field: TableField<T, any>): Record<string, unknown>;
303
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgxTable<any>, never>;
304
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgxTable<any>, "ngx-table", never, { "fields": { "alias": "fields"; "required": true; "isSignal": true; }; "data": { "alias": "data"; "required": true; "isSignal": true; }; "totalRecords": { "alias": "totalRecords"; "required": true; "isSignal": true; }; "showRecordNumber": { "alias": "showRecordNumber"; "required": false; "isSignal": true; }; "operations": { "alias": "operations"; "required": false; "isSignal": true; }; "operationWidth": { "alias": "operationWidth"; "required": false; "isSignal": true; }; "numWidth": { "alias": "numWidth"; "required": false; "isSignal": true; }; "pageSize": { "alias": "pageSize"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "multiSort": { "alias": "multiSort"; "required": false; "isSignal": true; }; "lazy": { "alias": "lazy"; "required": false; "isSignal": true; }; "trackBy": { "alias": "trackBy"; "required": false; "isSignal": true; }; }, { "lazyLoad": "lazyLoad"; "sortChange": "sortChange"; "columnResize": "columnResize"; }, ["cellTemplates"], never, true, never>;
305
+ }
306
+
307
+ declare class NgxPagination {
308
+ protected readonly config: ngx_kit_data_table.NgxPaginationOptions;
309
+ readonly total: _angular_core.InputSignal<number>;
310
+ readonly page: _angular_core.ModelSignal<number>;
311
+ readonly pageSize: _angular_core.ModelSignal<number>;
312
+ readonly pageSizeOptions: _angular_core.InputSignal<number[]>;
313
+ readonly labels: _angular_core.InputSignal<ngx_kit_data_table.PaginationLabel>;
314
+ readonly siblingCount: _angular_core.InputSignal<number>;
315
+ readonly boundaryCount: _angular_core.InputSignal<number>;
316
+ readonly paginate: _angular_core.OutputEmitterRef<PageEvent>;
317
+ protected readonly totalPages: _angular_core.Signal<number>;
318
+ protected readonly firstItem: _angular_core.Signal<number>;
319
+ protected readonly lastItem: _angular_core.Signal<number>;
320
+ protected readonly pages: _angular_core.Signal<(string | number)[]>;
321
+ constructor();
322
+ private buildPages;
323
+ protected next(): void;
324
+ protected previous(): void;
325
+ protected first(): void;
326
+ protected last(): void;
327
+ protected goto(page: number): void;
328
+ protected onPageSizeChange(value: number): void;
329
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NgxPagination, never>;
330
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NgxPagination, "ngx-pagination", never, { "total": { "alias": "total"; "required": true; "isSignal": true; }; "page": { "alias": "page"; "required": false; "isSignal": true; }; "pageSize": { "alias": "pageSize"; "required": false; "isSignal": true; }; "pageSizeOptions": { "alias": "pageSizeOptions"; "required": false; "isSignal": true; }; "labels": { "alias": "labels"; "required": false; "isSignal": true; }; "siblingCount": { "alias": "siblingCount"; "required": false; "isSignal": true; }; "boundaryCount": { "alias": "boundaryCount"; "required": false; "isSignal": true; }; }, { "page": "pageChange"; "pageSize": "pageSizeChange"; "paginate": "paginate"; }, never, never, true, never>;
331
+ }
332
+
333
+ export { ColumnResize, NGX_PAGINATION_CONFIG, NGX_PAGINATION_CONFIG_DEFAULT, NGX_TABLE_CONFIG, NGX_TABLE_CONFIG_DEFAULT, NgxPagination, NgxTable, TableCell, defineFields, defineRenderers, providePagination, provideTable };
334
+ export type { CellRendererComponent, CellTemplateContext, ColumnAlign, ColumnSizingConfig, LazyLoadEvent, NgxPaginationOptions, NgxTableOptions, PageEvent, PageState, PaginationLabel, PlainTableField, RenderedTableField, RendererExtraInputs, RendererRegistry, ResolvedTableOptions, SortDirection, SortMeta, TableCellFormatter, TableField, TableFieldBase, TableLabels };
@@ -173,6 +173,7 @@ declare class MSG {
173
173
  static success(title: string, text?: string, options?: IMessageOptions): ngx_kit_message.MessageOutput<any>;
174
174
  static warning(title: string, text?: string, options?: IMessageOptions): ngx_kit_message.MessageOutput<any>;
175
175
  static error(title: string, text?: string, options?: IMessageOptions): ngx_kit_message.MessageOutput<any>;
176
+ static question(title: string, text?: string, options?: IMessageOptions): ngx_kit_message.MessageOutput<any>;
176
177
  static loading(title: string, text?: string, options?: IMessageOptions): ngx_kit_message.MessageOutput<any>;
177
178
  }
178
179
 
@@ -12,6 +12,7 @@ interface NgxNotifyPayload {
12
12
  options: NgxNotifyOptions;
13
13
  onClose: EventEmitter<INotifyEnd>;
14
14
  onFinish: EventEmitter<INotifyEnd>;
15
+ close: () => void;
15
16
  }
16
17
  interface INotifyEnd {
17
18
  id: string;
@@ -129,6 +130,7 @@ declare class NgxNotifyService {
129
130
  configureContainer(position: NgxNotifyOptions['position'], containerClass: string): void;
130
131
  show(message: string, description?: string, type?: NgxNotifyType, options?: NgxNotifyOptions): NgxNotifyPayload;
131
132
  private _createAndShow;
133
+ private close;
132
134
  private removeNode;
133
135
  private removeEl;
134
136
  private _showNextIfPossible;
@@ -165,6 +165,8 @@ declare class SliderComponent implements OnInit, ControlValueAccessor, Validator
165
165
  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>;
166
166
  }
167
167
 
168
+ declare function mergeConfig<T>(base: T, override?: Partial<T>): T;
169
+
168
170
  declare function getOffsetPosition(evt: MouseEvent | TouchEvent, parent: HTMLElement): {
169
171
  x: number;
170
172
  y: number;
@@ -174,8 +176,6 @@ declare const WINDOW: InjectionToken<Window | null>;
174
176
 
175
177
  declare function randomStrnig(extraLength?: number, useNumeric?: boolean): string;
176
178
 
177
- declare function IsRtl(doc: Document): boolean;
178
-
179
179
  declare function makeConfetti(doc: Document, wrap: HTMLElement): void;
180
180
 
181
181
  declare class BrowserService {
@@ -187,6 +187,31 @@ declare class BrowserService {
187
187
  static ɵprov: i0.ɵɵInjectableDeclaration<BrowserService>;
188
188
  }
189
189
 
190
+ type Direction = 'ltr' | 'rtl';
191
+ /**
192
+ * جهت صفحه را به‌صورت خودکار و زنده تشخیص می‌دهد — بدون این‌که کاربرِ این
193
+ * سرویس مجبور باشد چیزی به آن بدهد. هر تغییری در attribute های dir/class
194
+ * روی <html> یا <body> (چه از طریق Angular، چه با یک تم‌سوییچر خارج از
195
+ * Angular) بلافاصله signal را آپدیت می‌کند.
196
+ *
197
+ * نکته: effect() اینجا جواب نمی‌دهد چون هیچ‌کدام از این مقادیر (attribute
198
+ * روی DOM) یک Signal نیستند؛ effect فقط به تغییر Signalها reactive است، نه
199
+ * به تغییرات دلخواه DOM. برای گوش‌دادن به تغییرات DOM باید از MutationObserver
200
+ * استفاده کرد و مقدار را دستی داخل یک Signal نوشت (که دقیقاً کاری است که
201
+ * این سرویس انجام می‌دهد).
202
+ */
203
+ declare class DirectionService {
204
+ private readonly doc;
205
+ private readonly destroyRef;
206
+ private readonly _direction;
207
+ /** جهت جاری، به‌صورت Signal فقط-خواندنی. */
208
+ readonly direction: i0.Signal<Direction>;
209
+ readonly isRtl: i0.Signal<boolean>;
210
+ constructor();
211
+ static ɵfac: i0.ɵɵFactoryDeclaration<DirectionService, never>;
212
+ static ɵprov: i0.ɵɵInjectableDeclaration<DirectionService>;
213
+ }
214
+
190
215
  declare class OverlayRef<T> {
191
216
  private readonly dialogEl;
192
217
  private readonly teardownFn;
@@ -234,6 +259,7 @@ declare class OverlayService implements OnDestroy {
234
259
  private resizeRafPending;
235
260
  private readonly doc;
236
261
  private readonly abortController;
262
+ private readonly directionService;
237
263
  ngOnDestroy(): void;
238
264
  open<T>(options: OverlayOptions<T>): OverlayRef<T>;
239
265
  openTemplate(options: TemplateOptions): OverlayRef<any>;
@@ -274,5 +300,5 @@ interface OverlayInstance {
274
300
  cleanup: () => void;
275
301
  }
276
302
 
277
- export { BrowserService, DIALOG_OVERLAY_CLASSNAME, FOCUSABLE_SELECTOR, IsRtl, OverlayRef, OverlayService, RangeSliderComponent, SaturationComponent, SliderComponent, ValueModel, WINDOW, getOffsetPosition, makeConfetti, randomStrnig };
278
- export type { Alignment, BaseOverlayOptions, IPosition, IValue, OverlayInstance, OverlayOptions, Placement, Point, TemplateOptions };
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 };