ngx-kit 7.3.1 → 7.3.3

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.
@@ -1 +1 @@
1
- {"version":3,"file":"ngx-kit-data-table.mjs","sources":["../../../projects/libs/data-table/types/table-field.types.ts","../../../projects/libs/data-table/tokens/table-config.token.ts","../../../projects/libs/data-table/tokens/pagination-config.token.ts","../../../projects/libs/data-table/providers/provide-table.ts","../../../projects/libs/data-table/providers/provide-pagination.ts","../../../projects/libs/data-table/directives/table-cell.directive.ts","../../../projects/libs/data-table/directives/column-resize.directive.ts","../../../projects/libs/data-table/components/pagination/pagination.ts","../../../projects/libs/data-table/components/pagination/pagination.html","../../../projects/libs/data-table/components/table/table.ts","../../../projects/libs/data-table/components/table/table.html","../../../projects/libs/data-table/public-api.ts","../../../projects/libs/data-table/ngx-kit-data-table.ts"],"sourcesContent":["import { InputSignal, TemplateRef, Type } from '@angular/core';\n\n// ----------------------------------------------------------------------------\n// قرارداد پایه‌ای که هر کامپوننت رندرر باید پیاده‌سازی کند.\n// value/row/field همیشه توسط جدول پر می‌شوند؛ هر ورودی دیگری که renderer\n// اضافه کند (مثل nameField در AvatarCellRenderer) به‌صورت خودکار استخراج و\n// در rendererInputs همان ستون در دسترس/چک می‌شود.\n// ----------------------------------------------------------------------------\nexport interface CellRendererComponent<TValue = unknown, TRow extends object = object> {\n value: InputSignal<TValue>;\n row: InputSignal<TRow>;\n field: InputSignal<TableFieldBase<TRow>>;\n}\n\nexport type RendererRegistry = Readonly<Record<string, Type<CellRendererComponent<any, any>>>>;\n\n/**\n * Identity helper: یک رجیستری رندرر را با inference کامل تعریف می‌کند.\n * همین آبجکت باید هم در provideTable({ renderers }) و هم در defineFields(renderers, ...)\n * استفاده شود تا کلیدها (و ورودی‌های اضافه‌ی هر رندرر) در کل پروژه type-check شوند.\n */\nexport function defineRenderers<R extends RendererRegistry>(registry: R): R {\n return registry;\n}\n\n// ----------------------------------------------------------------------------\n// استخراج ورودی‌های اضافه‌ی هر رندرر مستقیماً از روی خودِ کلاس کامپوننت، بدون\n// این‌که کاربر مجبور باشد آن‌ها را جای دیگری دوباره تایپ کند.\n// نکته: فقط اعضای «public» و «قابل فراخوانی بدون آرگومان» (شکل InputSignal/Signal)\n// در نظر گرفته می‌شوند؛ اعضای protected/private به‌طور خودکار (توسط خودِ\n// TypeScript) از keyof حذف می‌شوند. توصیه: هر computed/derived داخلی در\n// کامپوننت‌های رندرر را protected تعریف کنید تا اشتباهاً به‌عنوان ورودی قابل\n// تنظیم دیده نشود. متدهای عمومی بدون آرگومان (نادر) هم می‌توانند اشتباهاً در\n// این استخراج ظاهر شوند؛ چنین متدهایی را protected/private کنید.\n// ----------------------------------------------------------------------------\ntype InstanceOf<C> = C extends Type<infer I> ? I : never;\ntype UnwrapSignal<S> = S extends () => infer V ? V : never;\n\nexport type RendererExtraInputs<C extends Type<any>> = {\n [\n K in keyof InstanceOf<C> as K extends 'value' | 'row' | 'field'\n ? never\n : InstanceOf<C>[K] extends () => any\n ? K\n : never\n ]?: UnwrapSignal<InstanceOf<C>[K]>;\n};\n\n// ----------------------------------------------------------------------------\n// تعریف ستون‌ها\n// ----------------------------------------------------------------------------\nexport type ColumnAlign = 'start' | 'center' | 'end';\n\nexport type TableCellFormatter<T extends object = object> = (\n value: any,\n row: T,\n field: TableFieldBase<T>,\n) => any;\n\nexport interface CellTemplateContext<T extends object> {\n $implicit: T;\n row: T;\n value: unknown;\n rowIndex: number;\n field: TableFieldBase<T>;\n}\n\n/** شکل پایه‌ای مشترک بین همه‌ی ستون‌ها، صرف‌نظر از این‌که renderer دارند یا نه. */\nexport interface TableFieldBase<T extends object> {\n column: Extract<keyof T, string>;\n title: string;\n /**\n * عرضِ این ستون. عدد یعنی پیکسل (`160` = `160px`)؛ رشته یعنی هر مقدار\n * معتبرِ CSS length برای flex-basis (`'20%'`, `'12rem'`, ...). اگه اصلاً\n * ندید، این ستون flex می‌شه (`flex: 1 1 0`) و فضای باقی‌مونده‌ی جدول رو پر\n * می‌کنه — دقیقاً برخلافِ ستون‌هایی که width دارن (که `flex: 0 0 <width>`\n * می‌گیرن و ثابت می‌مونن).\n */\n width?: number | string;\n minWidth?: number;\n maxWidth?: number;\n resizable?: boolean;\n sortable?: boolean;\n wrap?: boolean;\n align?: ColumnAlign;\n prefix?: string;\n formatter?: string | TableCellFormatter<T>;\n}\n\n/** ستون بدون renderer (متن ساده / formatter / cellTemplate دستی). */\nexport interface PlainTableField<T extends object> extends TableFieldBase<T> {\n renderer?: undefined;\n rendererInputs?: undefined;\n cellTemplate?: TemplateRef<CellTemplateContext<T>>;\n}\n\n/** ستونی که یک renderer از رجیستری R انتخاب کرده؛ rendererInputs دقیقاً همان\n * ورودی‌های اضافه‌ی همان renderer است — نه یک Record<string, unknown> آزاد. */\nexport type RenderedTableField<T extends object, R extends RendererRegistry> = {\n [K in keyof R]: TableFieldBase<T> & {\n renderer: K;\n rendererInputs?: RendererExtraInputs<R[K]>;\n cellTemplate?: undefined;\n };\n}[keyof R];\n\nexport type TableField<T extends object, R extends RendererRegistry = {}> =\n PlainTableField<T> | RenderedTableField<T, R>;\n\n/**\n * Identity helper برای تعریف ستون‌های یک جدول با inference و type-check کامل\n * نسبت به هم مدل داده (T) و هم رجیستری رندررها (R).\n *\n * @example\n * const renderers = defineRenderers({ avatar: AvatarCellRenderer, boolean: BooleanCellRenderer });\n *\n * const fields = defineFields<Tenant, typeof renderers>(renderers, [\n * { column: 'avatarUrl', title: 'کاربر', renderer: 'avatar', rendererInputs: { showName: true } }, // ✅\n * { column: 'avatarUrl', title: 'کاربر', renderer: 'avatar', rendererInputs: { showName: 'x' } }, // ❌ باید boolean باشد\n * { column: 'isActive', title: 'فعال', renderer: 'bool' }, // ❌ کلید رجیستری نیست\n * { column: 'ageXYZ', title: '...' }, // ❌ فیلد Tenant نیست\n * ]);\n */\nexport function defineFields<T extends object, R extends RendererRegistry = {}>(\n _renderers: R,\n fields: TableField<T, R>[],\n): TableField<T, R>[] {\n return fields;\n}\n","import { InjectionToken } from '@angular/core';\nimport { ResolvedTableOptions } from '../types/table-options.types';\n\nexport const NGX_TABLE_CONFIG_DEFAULT: ResolvedTableOptions = {\n showRecordNumber: false,\n hoverable: true,\n multiSort: true,\n resizable: true,\n stickyHeader: true,\n stripedRows: true,\n column: { minWidth: 60, maxWidth: 600, defaultWidth: 150 },\n labels: {\n noData: 'There is no data to display!',\n loading: 'Loading...',\n operation: 'Operation',\n },\n renderers: {},\n formatters: {},\n lazy: false,\n};\n\n/** به هر نمونه‌ی ngx-table تزریق می‌شود. با provideTable() مقداردهی کنید. */\nexport const NGX_TABLE_CONFIG = new InjectionToken<ResolvedTableOptions>('ngx-table-config', {\n factory: () => NGX_TABLE_CONFIG_DEFAULT,\n});\n","import { InjectionToken } from '@angular/core';\nimport { NgxPaginationOptions } from '../types/pagination.types';\n\nexport const NGX_PAGINATION_CONFIG_DEFAULT: NgxPaginationOptions = {\n defaultPageSize: 10,\n pageSizeOptions: [5, 10, 20, 30, 50, 100],\n labels: {\n first: 'First',\n last: 'Last',\n next: 'Next',\n previous: 'Previous',\n showing: 'Showing',\n to: 'to',\n of: 'of',\n results: 'results',\n pageSize: 'Page Size',\n },\n};\n\nexport const NGX_PAGINATION_CONFIG = new InjectionToken<NgxPaginationOptions>(\n 'ngx-pagination-config',\n {\n factory: () => NGX_PAGINATION_CONFIG_DEFAULT,\n },\n);\n","import { EnvironmentProviders, makeEnvironmentProviders } from '@angular/core';\nimport { NGX_TABLE_CONFIG, NGX_TABLE_CONFIG_DEFAULT } from '../tokens/table-config.token';\nimport { NgxTableOptions, ResolvedTableOptions } from '../types/table-options.types';\n\nfunction mergeTableConfig(\n base: ResolvedTableOptions,\n override?: NgxTableOptions,\n): ResolvedTableOptions {\n if (!override) return base;\n return {\n ...base,\n ...override,\n column: { ...base.column, ...override.column },\n labels: { ...base.labels, ...override.labels },\n renderers: { ...base.renderers, ...override.renderers },\n formatters: { ...base.formatters, ...override.formatters },\n };\n}\n\n/**\n * کانفیگ سراسری <ngx-table>: جهت پیش‌فرض، حداقل/حداکثر عرض ستون، فعال بودن\n * پیش‌فرض سورت چندستونه، و از همه مهم‌تر رجیستری رندررها.\n *\n * @example\n * provideTable({\n * renderers: defineRenderers({ avatar: AvatarCellRenderer, boolean: BooleanCellRenderer }),\n * column: { minWidth: 80, maxWidth: 480, defaultWidth: 160 },\n * })\n */\nexport function provideTable(options?: NgxTableOptions): EnvironmentProviders {\n return makeEnvironmentProviders([\n { provide: NGX_TABLE_CONFIG, useValue: mergeTableConfig(NGX_TABLE_CONFIG_DEFAULT, options) },\n ]);\n}\n","import { EnvironmentProviders, makeEnvironmentProviders } from '@angular/core';\nimport {\n NGX_PAGINATION_CONFIG,\n NGX_PAGINATION_CONFIG_DEFAULT,\n} from '../tokens/pagination-config.token';\nimport { NgxPaginationOptions } from '../types/pagination.types';\n\nfunction mergePaginationConfig(\n base: NgxPaginationOptions,\n override?: Partial<NgxPaginationOptions>,\n): NgxPaginationOptions {\n if (!override) return base;\n return {\n ...base,\n ...override,\n labels: { ...base.labels, ...override.labels },\n };\n}\n\nexport function providePagination(options?: Partial<NgxPaginationOptions>): EnvironmentProviders {\n return makeEnvironmentProviders([\n {\n provide: NGX_PAGINATION_CONFIG,\n useValue: mergePaginationConfig(NGX_PAGINATION_CONFIG_DEFAULT, options),\n },\n ]);\n}\n","import { Directive, inject, input, TemplateRef } from '@angular/core';\nimport { CellTemplateContext } from '../types/table-field.types';\n\n/**\n * برای projection قالب سفارشی یک ستون بدون این‌که مجبور باشید cellTemplate را\n * از طریق ViewChild به آبجکت ستون وصل کنید:\n *\n * <ngx-table [fields]=\"fields\" [data]=\"rows()\">\n * <ng-template ngxTableCell=\"userName\" let-row let-value=\"value\">\n * <strong>{{ value }}</strong>\n * </ng-template>\n * </ngx-table>\n *\n * مهم: چون این دایرکتیو در تمپلیت *کامپوننت مصرف‌کننده* (نه ngx-table) استفاده\n * می‌شود، باید آن را در آرایه‌ی imports همان کامپوننت (standalone) وارد کنید:\n * imports: [NgxTable, TableCell]\n *\n * محدودیت شناخته‌شده: context این تمپلیت (row/value) از نوع T دقیق نیست\n * (چون TemplateRef اینجا به‌صورت پویا از ContentChildren جمع‌آوری می‌شود و\n * اطلاعات جنریک T در آن نقطه از بین می‌رود). برای type-safety کامل روی\n * row/value، از field.cellTemplate به همراه @ViewChild استفاده کنید (به README\n * بخش «Cell Template کاملاً Type-Safe» مراجعه کنید).\n */\n@Directive({\n selector: 'ng-template[ngxTableCell]',\n standalone: true,\n})\nexport class TableCell<T extends object = object> {\n readonly column = input.required<string>({ alias: 'ngxTableCell' });\n readonly templateRef = inject(TemplateRef<CellTemplateContext<T>>);\n}\n","import { Directive, ElementRef, HostListener, inject, input, output } from '@angular/core';\n\n/**\n * دستگیره‌ی درگ برای ریسایز ستون. روی لبه‌ی «انتهای منطقی» (inline-end) قرار\n * می‌گیرد، یعنی خودش زیر [dir=\"rtl\"] جابه‌جا می‌شود؛ فقط جهت محاسبه‌ی دلتا هم\n * برعکس می‌شود تا حس درگ همیشه طبیعی باشد.\n *\n * مقدار نهایی توسط جدول در یک Map از عرض‌ها ذخیره می‌شود (نه در استایل مستقیم\n * ستون)، به همراه علامت‌گذاری «دستی ریسایز شده» — یعنی بعد از این، هیچ\n * re-render یا تغییر داده‌ای این عرض را از بین نمی‌برد.\n */\n@Directive({\n selector: '[ngxColumnResize]',\n standalone: true,\n host: {\n class: 'ngx-table__resize-handle',\n role: 'separator',\n 'aria-orientation': 'vertical',\n },\n})\nexport class ColumnResize {\n readonly startWidth = input.required<number>({ alias: 'ngxColumnResizeWidth' });\n readonly minWidth = input<number>(40, { alias: 'ngxColumnResizeMin' });\n readonly maxWidth = input<number>(1000, { alias: 'ngxColumnResizeMax' });\n readonly direction = input<'ltr' | 'rtl'>('ltr', { alias: 'ngxColumnResizeDir' });\n\n readonly resizing = output<number>();\n readonly resizeEnd = output<number>();\n\n private readonly elementRef = inject(ElementRef<HTMLElement>);\n\n private dragging = false;\n private startX = 0;\n private baseWidth = 0;\n\n @HostListener('pointerdown', ['$event'])\n onPointerDown(event: PointerEvent): void {\n event.preventDefault();\n event.stopPropagation();\n this.dragging = true;\n this.startX = event.clientX;\n // اندازه‌ی واقعیِ رندرشده‌ی ستون رو می‌گیریم، نه فقط input ورودی — چون\n // ستون‌هایی که width صریح ندارن (flex:1 1 0، فضای باقی‌مونده رو پر\n // می‌کنن) هیچ عرض عددیِ از‌پیش‌شناخته‌شده‌ای ندارن؛ تنها منبع درستِ\n // «عرض فعلی» برای شروع محاسبه‌ی درگ، خودِ DOM هست.\n const measured = this.elementRef.nativeElement.parentElement?.getBoundingClientRect().width;\n this.baseWidth = measured && measured > 0 ? measured : this.startWidth();\n (event.target as HTMLElement).setPointerCapture(event.pointerId);\n }\n\n @HostListener('pointermove', ['$event'])\n onPointerMove(event: PointerEvent): void {\n if (!this.dragging) return;\n this.resizing.emit(this.computeWidth(event.clientX));\n }\n\n @HostListener('pointerup', ['$event'])\n @HostListener('pointercancel', ['$event'])\n onPointerUp(event: PointerEvent): void {\n if (!this.dragging) return;\n this.dragging = false;\n this.resizeEnd.emit(this.computeWidth(event.clientX));\n }\n\n private computeWidth(clientX: number): number {\n const delta = clientX - this.startX;\n const signedDelta = this.direction() === 'rtl' ? -delta : delta;\n const raw = this.baseWidth + signedDelta;\n return Math.min(this.maxWidth(), Math.max(this.minWidth(), raw));\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n inject,\n input,\n model,\n output,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { NGX_PAGINATION_CONFIG } from '../../tokens/pagination-config.token';\nimport { PageEvent } from '../../types/page.types';\n\n@Component({\n selector: 'ngx-pagination',\n standalone: true,\n templateUrl: './pagination.html',\n styleUrl: './pagination.scss',\n imports: [FormsModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class NgxPagination {\n protected readonly config = inject(NGX_PAGINATION_CONFIG);\n\n readonly total = input.required<number>();\n\n readonly page = model(1);\n readonly pageSize = model(this.config.defaultPageSize);\n\n readonly pageSizeOptions = input(this.config.pageSizeOptions);\n readonly labels = input(this.config.labels);\n readonly siblingCount = input(1);\n readonly boundaryCount = input(1);\n\n readonly paginate = output<PageEvent>();\n\n protected readonly totalPages = computed(() =>\n Math.max(1, Math.ceil(this.total() / this.pageSize())),\n );\n\n protected readonly firstItem = computed(() =>\n this.total() === 0 ? 0 : (this.page() - 1) * this.pageSize() + 1,\n );\n\n protected readonly lastItem = computed(() =>\n Math.min(this.firstItem() + this.pageSize() - 1, this.total()),\n );\n\n protected readonly pages = computed(() =>\n this.buildPages(this.page(), this.totalPages(), this.siblingCount(), this.boundaryCount()),\n );\n\n constructor() {\n // هر تغییری در page/pageSize را برای مصرف‌کننده امیت کن.\n effect(() => {\n this.paginate.emit({ page: this.page(), pageSize: this.pageSize() });\n });\n\n // اگر بعد از کوچک‌شدن total، صفحه‌ی جاری خارج از بازه افتاد، اصلاحش کن.\n effect(() => {\n const max = this.totalPages();\n if (this.page() > max) this.page.set(max);\n });\n }\n\n private buildPages(\n current: number,\n total: number,\n sibling = 1,\n boundary = 1,\n ): (number | string)[] {\n const range = (start: number, end: number) =>\n Array.from({ length: end - start + 1 }, (_, i) => start + i);\n\n const totalNumbers = sibling * 2 + boundary * 2 + 3;\n if (total <= totalNumbers) return range(1, total);\n\n const leftSibling = Math.max(current - sibling, boundary + 2);\n const rightSibling = Math.min(current + sibling, total - boundary - 1);\n const showLeftDots = leftSibling > boundary + 2;\n const showRightDots = rightSibling < total - boundary - 1;\n\n const pages: (number | string)[] = [];\n pages.push(...range(1, boundary));\n if (showLeftDots) pages.push('...');\n else pages.push(...range(boundary + 1, leftSibling - 1));\n pages.push(...range(leftSibling, rightSibling));\n if (showRightDots) pages.push('...');\n else pages.push(...range(rightSibling + 1, total - boundary));\n pages.push(...range(total - boundary + 1, total));\n return pages;\n }\n\n protected next(): void {\n this.page.update((p) => Math.min(p + 1, this.totalPages()));\n }\n protected previous(): void {\n this.page.update((p) => Math.max(1, p - 1));\n }\n protected first(): void {\n this.page.set(1);\n }\n protected last(): void {\n this.page.set(this.totalPages());\n }\n protected goto(page: number): void {\n if (typeof page !== 'number' || Number.isNaN(page)) return;\n this.page.set(page);\n }\n protected onPageSizeChange(value: number): void {\n this.pageSize.set(Number(value));\n this.page.set(1);\n }\n}\n","<nav class=\"ngx-pagination\">\n <div class=\"ngx-pagination__summary\">\n {{ labels().showing }}\n <span class=\"fw-semibold\">{{ firstItem() }}</span>\n {{ labels().to }}\n <span class=\"fw-semibold\">{{ lastItem() }}</span>\n {{ labels().of }}\n <span class=\"fw-semibold\">{{ total() }}</span>\n {{ labels().results }}\n </div>\n\n <div class=\"ngx-pagination__controls\">\n <ul class=\"ngx-pagination__list\">\n <li [class.disabled]=\"page() === 1\" [title]=\"labels().first\">\n <a (click)=\"first()\" class=\"icon\">«</a>\n </li>\n <li [class.disabled]=\"page() === 1\" [title]=\"labels().previous\">\n <a (click)=\"previous()\" class=\"icon\">‹</a>\n </li>\n\n @for (item of pages(); track $index) {\n <li class=\"ngx-pagination__page-num\" [class.active]=\"item === page()\">\n @if (item !== page() && item !== '...') {\n <a (click)=\"goto(+item)\">{{ item }}</a>\n }\n @if (item === page() || item === '...') {\n <span>{{ item }}</span>\n }\n </li>\n }\n\n <li [class.disabled]=\"page() === totalPages()\" [title]=\"labels().next\">\n <a (click)=\"next()\" class=\"icon\">›</a>\n </li>\n <li [class.disabled]=\"page() === totalPages()\" [title]=\"labels().last\">\n <a (click)=\"last()\" class=\"icon\">»</a>\n </li>\n </ul>\n\n <div class=\"ngx-pagination__page-size\">\n <span>{{ labels().pageSize }}:</span>\n <select [ngModel]=\"pageSize()\" (ngModelChange)=\"onPageSizeChange($event)\">\n @for (opt of pageSizeOptions(); track opt) {\n <option [value]=\"opt\" [selected]=\"opt === pageSize()\">{{ opt }}</option>\n }\n </select>\n </div>\n </div>\n</nav>\n","import { CommonModule } from '@angular/common';\nimport {\n AfterContentInit,\n ChangeDetectionStrategy,\n Component,\n computed,\n ContentChildren,\n DestroyRef,\n DOCUMENT,\n effect,\n inject,\n input,\n OnInit,\n output,\n QueryList,\n signal,\n TemplateRef,\n Type,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { TableCell } from '../../directives/table-cell.directive';\nimport { ColumnResize } from '../../directives/column-resize.directive';\nimport { NGX_TABLE_CONFIG } from '../../tokens/table-config.token';\nimport { NGX_PAGINATION_CONFIG } from '../../tokens/pagination-config.token';\nimport { PageEvent, LazyLoadEvent } from '../../types/page.types';\nimport { SortDirection, SortMeta } from '../../types/sort.types';\nimport {\n CellRendererComponent,\n CellTemplateContext,\n TableField,\n} from '../../types/table-field.types';\nimport { NgxPagination } from '../pagination/pagination';\nimport { DirectionService } from 'ngx-kit/core';\n\n/**\n * جدول داده‌ی جنریک و Type-Safe.\n *\n * `T` از روی چیزی که به [data] بایند می‌کنید استنتاج می‌شود؛ `field.column` در\n * `TableField<T, R>` محدود به `keyof T` است، و اگر از defineFields(renderers, ...)\n * استفاده کنید، `field.renderer` محدود به کلیدهای رجیستری و `rendererInputs`\n * دقیقاً همان ورودی‌های اضافه‌ی همان renderer است.\n *\n * دو حالت:\n * - کلاینت‌ساید (پیش‌فرض): [data] کل آرایه است؛ سورت/صفحه‌بندی داخلی و روی\n * یک computed خالص انجام می‌شود (بدون mutation روی آبجکت‌های شما).\n * - lazy: [lazy]=\"true\" + [totalRecords]؛ [data] فقط صفحه‌ی جاری است؛ به\n * (lazyLoad) گوش بدهید.\n */\n@Component({\n selector: 'ngx-table',\n standalone: true,\n templateUrl: './table.html',\n styleUrl: './table.scss',\n imports: [CommonModule, NgxPagination, ColumnResize],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'ngx-table-host',\n },\n})\nexport class NgxTable<T extends object> implements OnInit, AfterContentInit {\n protected readonly config = inject(NGX_TABLE_CONFIG);\n protected readonly paginationConfig = inject(NGX_PAGINATION_CONFIG);\n\n // ---------------------------------------------------------------- inputs\n readonly fields = input.required<TableField<T, any>[]>();\n readonly data = input.required<readonly T[]>();\n readonly totalRecords = input.required<number>();\n readonly showRecordNumber = input(this.config.showRecordNumber);\n readonly operations = input<TemplateRef<{ $implicit: T }>>();\n readonly operationWidth = input(80);\n readonly numWidth = input(80);\n readonly pageSize = input(this.paginationConfig.defaultPageSize);\n readonly page = input(1);\n readonly pageChange = output<number>();\n readonly loading = input(false);\n readonly multiSort = input<boolean | undefined>(undefined);\n readonly lazy = input(this.config.lazy);\n readonly resizable = input(this.config.resizable);\n /** پیش‌فرض بر اساس ایندکس؛ برای جلوگیری از گم‌شدن state سطرها هنگام سورت،\n * یک شناسه‌ی یکتا بدهید: [trackBy]=\"(i, row) => row.id\" */\n readonly trackBy = input<(index: number, row: T) => unknown>((index) => index);\n\n // --------------------------------------------------------------- outputs\n readonly lazyLoad = output<LazyLoadEvent<T>>();\n readonly sortChange = output<SortMeta<T>[]>();\n readonly columnResize = output<{ field: string; width: number }>();\n\n // ------------------------------------------------------------ int. state\n protected readonly pageIndex = signal(1);\n protected readonly pageSizeS = signal(this.paginationConfig.defaultPageSize);\n protected readonly sorts = signal<SortMeta<T>[]>([]);\n protected readonly widths = signal<Record<string, number>>({});\n private readonly manuallyResized = new Set<string>();\n private readonly rendererInputsCache = new Map<\n TableField<T, any>,\n WeakMap<T, Record<string, unknown>>\n >();\n\n @ContentChildren(TableCell) private cellTemplates!: QueryList<TableCell<T>>;\n private templateMap = new Map<string, TemplateRef<CellTemplateContext<T>>>();\n\n protected readonly resolvedMultiSort = computed(() => this.multiSort() ?? this.config.multiSort);\n private readonly directionService = inject(DirectionService);\n private readonly destroyRef = inject(DestroyRef);\n protected readonly resolvedDirection = computed(() => this.directionService.direction());\n constructor() {\n effect(() => {\n const ps = this.pageSize();\n this.pageSizeS.set(ps);\n const pi = this.page();\n this.pageIndex.set(pi);\n });\n\n // برای هر ستونِ تازه‌دیده‌شده که width عددیِ صریح دارد، یک عرض seed کن؛\n // ستون‌هایی که کاربر دستی ریسایز کرده دیگر هیچ‌وقت دوباره نوشته نمی‌شوند.\n // مهم: ستون‌هایی که اصلاً width ندارند (یا width رشته‌ای مثل '20%' دارند)\n // عمداً اینجا seed نمی‌شوند — قبلاً همه‌ی ستون‌ها با یک defaultWidth ثابت\n // seed می‌شدند که باعث می‌شد جدول با flex:0 0 روی هر ستون هیچ‌وقت واقعاً\n // 100% عرض رو پر نکنه، حتی وقتی کاربر عمداً یک ستون رو بدون width گذاشته\n // بود تا فضای باقی‌مونده رو خودش پر کنه.\n effect(() => {\n const cols = this.fields();\n const current = this.widths();\n let changed = false;\n const next = { ...current };\n for (const f of cols) {\n if (this.manuallyResized.has(f.column)) continue;\n if (f.column in next) continue;\n if (typeof f.width === 'number') {\n next[f.column] = f.width;\n changed = true;\n }\n }\n if (changed) this.widths.set(next);\n });\n }\n\n ngOnInit(): void {\n // نیاز به این نیست در لود خود صفحه بندی paginate را صدا میزند\n // if (this.lazy()) {\n // this.lazyLoad.emit({ first: 0, pageIndex: 1, pageSize: this.pageSizeS(), sorts: [] });\n // }\n }\n\n ngAfterContentInit(): void {\n this.syncTemplateMap();\n // این Observable خودش کامل نمی‌شه (EventEmitter ساده‌ست، نه یه stream که\n // روی destroy کامپوننت تموم بشه)؛ بدون takeUntilDestroyed، این subscribe\n // برای همیشه فعال می‌موند و رفرنس کامپوننت رو زنده نگه می‌داشت.\n this.cellTemplates.changes\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => this.syncTemplateMap());\n }\n\n private syncTemplateMap(): void {\n this.templateMap.clear();\n this.cellTemplates.forEach((cell) => {\n // نکته‌ی مهم: cell.column() باید فراخوانی شود (سیگنال است)، نه cell.column.name.\n this.templateMap.set(cell.column(), cell.templateRef);\n });\n }\n\n // ------------------------------------------------------------- داده‌ها\n protected readonly sortedData = computed<readonly T[]>(() => {\n if (this.lazy()) return this.data();\n const sorts = this.sorts();\n if (sorts.length === 0) return this.data();\n const copy = [...this.data()];\n copy.sort((a, b) => {\n for (const s of sorts) {\n const cmp = this.compare(a[s.field], b[s.field]);\n if (cmp !== 0) return s.direction === 'asc' ? cmp : -cmp;\n }\n return 0;\n });\n return copy;\n });\n\n protected readonly totalCount = computed(() =>\n this.lazy() ? this.totalRecords() : this.data().length,\n );\n\n protected readonly pagedData = computed<readonly T[]>(() => {\n if (this.lazy()) return this.sortedData();\n const start = (this.pageIndex() - 1) * this.pageSizeS();\n return this.sortedData().slice(start, start + this.pageSizeS());\n });\n\n private compare(a: unknown, b: unknown): number {\n if (a == null && b == null) return 0;\n if (a == null) return -1;\n if (b == null) return 1;\n if (typeof a === 'number' && typeof b === 'number') return a - b;\n if (typeof a === 'boolean' && typeof b === 'boolean') return a === b ? 0 : a ? 1 : -1;\n if (a instanceof Date && b instanceof Date) return a.getTime() - b.getTime();\n return String(a).localeCompare(String(b));\n }\n\n /** بدون mutation روی داده‌ی ورودی: شماره‌ی ردیف صرفاً از روی page/pageSize/rowIndex محاسبه می‌شود. */\n protected recordNumber(rowIndex: number): number {\n return (this.pageIndex() - 1) * this.pageSizeS() + rowIndex + 1;\n }\n\n // -------------------------------------------------------------- سورت\n protected sortDirectionFor(column: string): SortDirection | null {\n return this.sorts().find((s) => s.field === column)?.direction ?? null;\n }\n\n protected onHeaderClick(field: TableField<T, any>, event: MouseEvent): void {\n if (!field.sortable) return;\n const column = field.column;\n const current = this.sorts();\n const existingIndex = current.findIndex((s) => s.field === column);\n const isMultiGesture =\n this.resolvedMultiSort() && (event.shiftKey || event.ctrlKey || event.metaKey);\n\n let next: SortMeta<T>[];\n if (isMultiGesture) {\n next = [...current];\n if (existingIndex === -1) {\n next.push({ field: column, direction: 'asc' });\n } else if (next[existingIndex].direction === 'asc') {\n next[existingIndex] = { field: column, direction: 'desc' };\n } else {\n next.splice(existingIndex, 1);\n }\n } else if (existingIndex === -1 || current.length > 1) {\n next = [{ field: column, direction: 'asc' }];\n } else if (current[0].direction === 'asc') {\n next = [{ field: column, direction: 'desc' }];\n } else {\n next = [];\n }\n\n this.sorts.set(next);\n this.pageIndex.set(1);\n this.pageChange.emit(this.pageIndex());\n this.sortChange.emit(next);\n this.emitLazyIfNeeded();\n }\n\n // ------------------------------------------------------------ صفحه‌بندی\n protected onPaginate(event: PageEvent): void {\n this.pageIndex.set(event.page);\n this.pageSizeS.set(event.pageSize);\n this.pageChange.emit(this.pageIndex());\n this.emitLazyIfNeeded();\n }\n\n private emitLazyIfNeeded(): void {\n if (!this.lazy()) return;\n const pageIndex = this.pageIndex();\n const pageSize = this.pageSizeS();\n this.lazyLoad.emit({\n pageIndex,\n pageSize,\n first: (pageIndex - 1) * pageSize,\n sorts: this.sorts(),\n sorting: this.sorts()\n ?.map((s) => `${s.field} ${s.direction}`)\n .join(','),\n });\n }\n\n // -------------------------------------------------------------- ریسایز\n protected columnWidth(column: string): number {\n return this.widths()[column] ?? this.config.column.defaultWidth;\n }\n /**\n * مقدار CSS `flex` واقعیِ این ستون:\n * - اگه دستی ریسایز شده یا width عددی داره → `0 0 <px>` (ثابت، بدون رشد/کوچک‌شدن)\n * - اگه width رشته‌ای داره (مثلاً '20%') → `0 0 <رشته>` (ثابت، هر واحد CSS معتبری)\n * - اگه اصلاً width نداره → `1 1 0` (رشد می‌کنه تا فضای باقی‌مونده‌ی جدول رو پر کنه)\n */\n protected columnFlex(field: TableField<T, any>): string {\n const resized = this.widths()[field.column];\n if (resized != null) return `0 0 ${resized}px`;\n if (typeof field.width === 'string') return `0 0 ${field.width}`;\n return '1 1 0';\n }\n protected columnMin(field: TableField<T, any>): number {\n return field.minWidth ?? this.config.column.minWidth;\n }\n protected columnMax(field: TableField<T, any>): number {\n return field.maxWidth ?? this.config.column.maxWidth;\n }\n protected isResizable(field: TableField<T, any>): boolean {\n return (field.resizable ?? this.resizable()) !== false;\n }\n protected onColumnResizing(column: string, width: number): void {\n this.widths.update((w) => ({ ...w, [column]: width }));\n }\n protected onColumnResizeEnd(column: string, width: number): void {\n this.manuallyResized.add(column);\n this.widths.update((w) => ({ ...w, [column]: width }));\n this.columnResize.emit({ field: column, width });\n }\n\n // --------------------------------------------------------------- سلول‌ها\n protected getTemplate(column: string): TemplateRef<CellTemplateContext<T>> | null {\n const fromDirective = this.templateMap.get(column);\n if (fromDirective) return fromDirective;\n\n const fromFieldConfig = this.fields().find((f) => f.column === column)?.cellTemplate;\n return fromFieldConfig ?? null;\n }\n\n protected getRenderer(field: TableField<T, any>): Type<CellRendererComponent> | null {\n if (!field.renderer) return null;\n // نکته: نوع دقیق field.renderer (که به کلیدهای رجیستری محدود است) در\n // defineFields() چک می‌شود؛ اینجا فقط یک lookup رانتایم ساده لازم است.\n return this.config.renderers[field.renderer as string] ?? null;\n }\n\n protected getCellValue(row: T, field: TableField<T, any>): unknown {\n return row[field.column];\n }\n\n protected formatCellValue(row: T, field: TableField<T, any>): string {\n const value = this.getCellValue(row, field);\n\n if (typeof field.formatter === 'function') {\n return this.stringify(field.formatter(value, row, field));\n }\n if (typeof field.formatter === 'string') {\n const formatter = this.config.formatters[field.formatter];\n if (formatter) return this.stringify(formatter(value, row, field));\n }\n return this.stringify(value);\n }\n\n private stringify(value: unknown): string {\n return value == null ? '' : String(value);\n }\n\n /** ورودی‌های renderer را به‌ازای هر (field, row) کش می‌کند تا هر Change\n * Detection یک آبجکت جدید ساخته نشود؛ با WeakMap، وقتی row از حافظه خارج\n * شود (مثلاً بعد از عوض‌شدن صفحه)، entry آن هم خودکار پاک می‌شود. */\n protected getRendererInputs(row: T, field: TableField<T, any>): Record<string, unknown> {\n let fieldCache = this.rendererInputsCache.get(field);\n if (!fieldCache) {\n fieldCache = new WeakMap();\n this.rendererInputsCache.set(field, fieldCache);\n }\n let inputs = fieldCache.get(row);\n if (!inputs) {\n inputs = {\n value: this.getCellValue(row, field),\n row,\n field,\n ...(field.renderer ? field.rendererInputs : undefined),\n };\n fieldCache.set(row, inputs);\n }\n return inputs;\n }\n}\n","<div class=\"ngx-table-wrapper\" [class.ngx-table--loading]=\"loading()\">\n <div class=\"ngx-table-scroll\">\n <div\n class=\"ngx-table\"\n [class.ngx-table--striped]=\"config.stripedRows\"\n [class.ngx-table--hover]=\"config.hoverable\"\n role=\"table\">\n <div class=\"thead-mrs\" [class.thead-mrs--sticky]=\"config.stickyHeader\" role=\"rowgroup\">\n <div class=\"tr-mrs\" role=\"row\">\n @if (operations()) {\n <div\n class=\"th-mrs operations\"\n role=\"columnheader\"\n [style.flex]=\"'0 0 ' + operationWidth() + 'px'\">\n {{ config.labels.operation }}\n </div>\n }\n @if (showRecordNumber()) {\n <div\n class=\"th-mrs operations\"\n role=\"columnheader\"\n [style.flex]=\"'0 0 ' + numWidth() + 'px'\">\n #\n </div>\n }\n\n @for (f of fields(); track f.column) {\n <div\n class=\"th-mrs\"\n role=\"columnheader\"\n [class.th-mrs--sortable]=\"f.sortable\"\n [style.flex]=\"columnFlex(f)\"\n [attr.aria-sort]=\"\n sortDirectionFor(f.column) === 'asc'\n ? 'ascending'\n : sortDirectionFor(f.column) === 'desc'\n ? 'descending'\n : null\n \"\n (click)=\"onHeaderClick(f, $event)\">\n <span class=\"th-mrs__title\">{{ f.title }}</span>\n\n @if (f.sortable) {\n <span class=\"sort-icon\" [class.active]=\"sortDirectionFor(f.column) !== null\">\n @if (sortDirectionFor(f.column) === 'asc') {\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 320 512\">\n <path\n fill=\"currentColor\"\n d=\"M182.6 41.4c-12.5-12.5-32.8-12.5-45.3 0l-128 128c-9.2 9.2-11.9 22.9-6.9 34.9s16.6 19.8 29.6 19.8H96V448c0 17.7 14.3 32 32 32s32-14.3 32-32V224h64c12.9 0 24.6-7.8 29.6-19.8s2.2-25.7-6.9-34.9l-128-128z\" />\n </svg>\n } @else if (sortDirectionFor(f.column) === 'desc') {\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 320 512\">\n <path\n fill=\"currentColor\"\n d=\"M137.4 470.6c12.5 12.5 32.8 12.5 45.3 0l128-128c9.2-9.2 11.9-22.9 6.9-34.9s-16.6-19.8-29.6-19.8H224V64c0-17.7-14.3-32-32-32s-32 14.3-32 32V288H96c-12.9 0-24.6 7.8-29.6 19.8s-2.2 25.7 6.9 34.9l128 128z\" />\n </svg>\n } @else {\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 320 512\">\n <path\n fill=\"currentColor\"\n d=\"M137.4 41.4c12.5-12.5 32.8-12.5 45.3 0l96 96c9.2 9.2 11.9 22.9 6.9 34.9s-16.6 19.8-29.6 19.8H224v96c0 17.7-14.3 32-32 32s-32-14.3-32-32V192H96c-12.9 0-24.6-7.8-29.6-19.8s-2.3-25.7 6.9-34.9l96-96zM32 400c0-17.7 14.3-32 32-32H256c17.7 0 32 14.3 32 32s-14.3 32-32 32H64c-17.7 0-32-14.3-32-32z\"\n opacity=\".35\" />\n </svg>\n }\n </span>\n }\n\n @if (isResizable(f)) {\n <span\n ngxColumnResize\n [ngxColumnResizeWidth]=\"columnWidth(f.column)\"\n [ngxColumnResizeMin]=\"columnMin(f)\"\n [ngxColumnResizeMax]=\"columnMax(f)\"\n [ngxColumnResizeDir]=\"resolvedDirection()\"\n (resizing)=\"onColumnResizing(f.column, $event)\"\n (resizeEnd)=\"onColumnResizeEnd(f.column, $event)\"\n (click)=\"$event.stopPropagation()\"></span>\n }\n </div>\n }\n </div>\n </div>\n\n <div class=\"tbody-mrs\" role=\"rowgroup\">\n @if (!loading() && pagedData().length === 0) {\n <div class=\"no-data\">{{ config.labels.noData }}</div>\n }\n\n @for (row of pagedData(); track trackBy()($index, row); let rowIndex = $index) {\n <div class=\"tr-mrs\" role=\"row\">\n @if (operations()) {\n <div\n class=\"td-mrs operations\"\n role=\"cell\"\n [style.flex]=\"'0 0 ' + operationWidth() + 'px'\">\n <div class=\"cel\">\n <span class=\"cell-title\">{{ config.labels.operation }}:</span>\n <ng-container\n [ngTemplateOutlet]=\"operations()!\"\n [ngTemplateOutletContext]=\"{ $implicit: row }\"></ng-container>\n </div>\n </div>\n }\n\n @if (showRecordNumber()) {\n <div class=\"td-mrs operations\" role=\"cell\" [style.flex]=\"'0 0 ' + numWidth() + 'px'\">\n <div class=\"cel\">{{ recordNumber(rowIndex) }}</div>\n </div>\n }\n\n @for (f of fields(); track f.column) {\n @let template = getTemplate(f.column);\n @let renderer = getRenderer(f);\n\n <div class=\"td-mrs\" role=\"cell\" [style.flex]=\"columnFlex(f)\">\n <div class=\"cel\" [class.wrap]=\"f.wrap\">\n <span class=\"cell-title\">{{ f.title }}</span>\n\n @if (template) {\n <ng-container\n [ngTemplateOutlet]=\"template\"\n [ngTemplateOutletContext]=\"{\n $implicit: row,\n row: row,\n value: getCellValue(row, f),\n rowIndex: rowIndex,\n field: f,\n }\"></ng-container>\n } @else if (renderer) {\n <ng-container\n *ngComponentOutlet=\"\n renderer;\n inputs: getRendererInputs(row, f)\n \"></ng-container>\n } @else {\n {{ formatCellValue(row, f) }}\n }\n\n @if (f.prefix) {\n <span>{{ f.prefix }}</span>\n }\n </div>\n </div>\n }\n </div>\n }\n </div>\n </div>\n\n @if (loading()) {\n <div class=\"loading-container\">\n <div class=\"loading\">{{ config.labels.loading }}</div>\n </div>\n }\n </div>\n</div>\n\n<ngx-pagination\n [page]=\"page()\"\n [pageSize]=\"pageSizeS()\"\n [total]=\"totalCount()\"\n (paginate)=\"onPaginate($event)\"></ngx-pagination>\n","// types\nexport * from './types/sort.types';\nexport * from './types/page.types';\nexport * from './types/pagination.types';\nexport * from './types/table-field.types';\nexport * from './types/table-options.types';\n\n// tokens\nexport * from './tokens/table-config.token';\nexport * from './tokens/pagination-config.token';\n\n// providers\nexport * from './providers/provide-table';\nexport * from './providers/provide-pagination';\n\n// directives\nexport * from './directives/table-cell.directive';\nexport * from './directives/column-resize.directive';\n\n// components\nexport * from './components/table/table';\nexport * from './components/pagination/pagination';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1"],"mappings":"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"}
1
+ {"version":3,"file":"ngx-kit-data-table.mjs","sources":["../../../projects/libs/data-table/types/table-field.types.ts","../../../projects/libs/data-table/tokens/defaults.ts","../../../projects/libs/data-table/localization/table.localization.ts","../../../projects/libs/data-table/tokens/table-config.token.ts","../../../projects/libs/data-table/localization/pagination.localization.ts","../../../projects/libs/data-table/tokens/pagination-config.token.ts","../../../projects/libs/data-table/providers/provide-table.ts","../../../projects/libs/data-table/providers/provide-pagination.ts","../../../projects/libs/data-table/directives/table-cell.directive.ts","../../../projects/libs/data-table/directives/column-resize.directive.ts","../../../projects/libs/data-table/components/pagination/pagination.ts","../../../projects/libs/data-table/components/pagination/pagination.html","../../../projects/libs/data-table/components/table/table.ts","../../../projects/libs/data-table/components/table/table.html","../../../projects/libs/data-table/public-api.ts","../../../projects/libs/data-table/ngx-kit-data-table.ts"],"sourcesContent":["import { InputSignal, TemplateRef, Type } from '@angular/core';\n\n// ----------------------------------------------------------------------------\n// قرارداد پایه‌ای که هر کامپوننت رندرر باید پیاده‌سازی کند.\n// value/row/field همیشه توسط جدول پر می‌شوند؛ هر ورودی دیگری که renderer\n// اضافه کند (مثل nameField در AvatarCellRenderer) به‌صورت خودکار استخراج و\n// در rendererInputs همان ستون در دسترس/چک می‌شود.\n// ----------------------------------------------------------------------------\nexport interface CellRendererComponent<TValue = unknown, TRow extends object = object> {\n value: InputSignal<TValue>;\n row: InputSignal<TRow>;\n field: InputSignal<TableFieldBase<TRow>>;\n}\n\nexport type RendererRegistry = Readonly<Record<string, Type<CellRendererComponent<any, any>>>>;\n\n/**\n * Identity helper: یک رجیستری رندرر را با inference کامل تعریف می‌کند.\n * همین آبجکت باید هم در provideTable({ renderers }) و هم در defineFields(renderers, ...)\n * استفاده شود تا کلیدها (و ورودی‌های اضافه‌ی هر رندرر) در کل پروژه type-check شوند.\n */\nexport function defineRenderers<R extends RendererRegistry>(registry: R): R {\n return registry;\n}\n\n// ----------------------------------------------------------------------------\n// استخراج ورودی‌های اضافه‌ی هر رندرر مستقیماً از روی خودِ کلاس کامپوننت، بدون\n// این‌که کاربر مجبور باشد آن‌ها را جای دیگری دوباره تایپ کند.\n// نکته: فقط اعضای «public» و «قابل فراخوانی بدون آرگومان» (شکل InputSignal/Signal)\n// در نظر گرفته می‌شوند؛ اعضای protected/private به‌طور خودکار (توسط خودِ\n// TypeScript) از keyof حذف می‌شوند. توصیه: هر computed/derived داخلی در\n// کامپوننت‌های رندرر را protected تعریف کنید تا اشتباهاً به‌عنوان ورودی قابل\n// تنظیم دیده نشود. متدهای عمومی بدون آرگومان (نادر) هم می‌توانند اشتباهاً در\n// این استخراج ظاهر شوند؛ چنین متدهایی را protected/private کنید.\n// ----------------------------------------------------------------------------\ntype InstanceOf<C> = C extends Type<infer I> ? I : never;\ntype UnwrapSignal<S> = S extends () => infer V ? V : never;\n\nexport type RendererExtraInputs<C extends Type<any>> = {\n [\n K in keyof InstanceOf<C> as K extends 'value' | 'row' | 'field'\n ? never\n : InstanceOf<C>[K] extends () => any\n ? K\n : never\n ]?: UnwrapSignal<InstanceOf<C>[K]>;\n};\n\n// ----------------------------------------------------------------------------\n// تعریف ستون‌ها\n// ----------------------------------------------------------------------------\nexport type ColumnAlign = 'start' | 'center' | 'end';\n\nexport type TableCellFormatter<T extends object = object> = (\n value: any,\n row: T,\n field: TableFieldBase<T>,\n) => any;\n\nexport interface CellTemplateContext<T extends object> {\n $implicit: T;\n row: T;\n value: unknown;\n rowIndex: number;\n field: TableFieldBase<T>;\n}\n\n/** شکل پایه‌ای مشترک بین همه‌ی ستون‌ها، صرف‌نظر از این‌که renderer دارند یا نه. */\nexport interface TableFieldBase<T extends object> {\n column: Extract<keyof T, string>;\n title: string;\n /**\n * عرضِ این ستون. عدد یعنی پیکسل (`160` = `160px`)؛ رشته یعنی هر مقدار\n * معتبرِ CSS length برای flex-basis (`'20%'`, `'12rem'`, ...). اگه اصلاً\n * ندید، این ستون flex می‌شه (`flex: 1 1 0`) و فضای باقی‌مونده‌ی جدول رو پر\n * می‌کنه — دقیقاً برخلافِ ستون‌هایی که width دارن (که `flex: 0 0 <width>`\n * می‌گیرن و ثابت می‌مونن).\n */\n width?: number | string;\n minWidth?: number;\n maxWidth?: number;\n resizable?: boolean;\n sortable?: boolean;\n wrap?: boolean;\n align?: ColumnAlign;\n prefix?: string;\n formatter?: string | TableCellFormatter<T>;\n}\n\n/** ستون بدون renderer (متن ساده / formatter / cellTemplate دستی). */\nexport interface PlainTableField<T extends object> extends TableFieldBase<T> {\n renderer?: undefined;\n rendererInputs?: undefined;\n cellTemplate?: TemplateRef<CellTemplateContext<T>>;\n}\n\n/** ستونی که یک renderer از رجیستری R انتخاب کرده؛ rendererInputs دقیقاً همان\n * ورودی‌های اضافه‌ی همان renderer است — نه یک Record<string, unknown> آزاد. */\nexport type RenderedTableField<T extends object, R extends RendererRegistry> = {\n [K in keyof R]: TableFieldBase<T> & {\n renderer: K;\n rendererInputs?: RendererExtraInputs<R[K]>;\n cellTemplate?: undefined;\n };\n}[keyof R];\n\nexport type TableField<T extends object, R extends RendererRegistry = {}> =\n PlainTableField<T> | RenderedTableField<T, R>;\n\n/**\n * Identity helper برای تعریف ستون‌های یک جدول با inference و type-check کامل\n * نسبت به هم مدل داده (T) و هم رجیستری رندررها (R).\n *\n * @example\n * const renderers = defineRenderers({ avatar: AvatarCellRenderer, boolean: BooleanCellRenderer });\n *\n * const fields = defineFields<Tenant, typeof renderers>(renderers, [\n * { column: 'avatarUrl', title: 'کاربر', renderer: 'avatar', rendererInputs: { showName: true } }, // ✅\n * { column: 'avatarUrl', title: 'کاربر', renderer: 'avatar', rendererInputs: { showName: 'x' } }, // ❌ باید boolean باشد\n * { column: 'isActive', title: 'فعال', renderer: 'bool' }, // ❌ کلید رجیستری نیست\n * { column: 'ageXYZ', title: '...' }, // ❌ فیلد Tenant نیست\n * ]);\n */\nexport function defineFields<T extends object, R extends RendererRegistry = {}>(\n _renderers: R,\n fields: TableField<T, R>[],\n): TableField<T, R>[] {\n return fields;\n}\n","import type { NgxPaginationOptions } from '../types/pagination.types';\nimport type { ResolvedTableOptions } from '../types/table-options.types';\n\nexport const NGX_PAGINATION_CONFIG_DEFAULT: NgxPaginationOptions = {\n defaultPageSize: 10,\n pageSizeOptions: [5, 10, 20, 30, 50, 100],\n};\nexport const NGX_TABLE_CONFIG_DEFAULT: ResolvedTableOptions = {\n showRecordNumber: false,\n hoverable: true,\n multiSort: true,\n resizable: true,\n stickyHeader: true,\n stripedRows: true,\n column: { minWidth: 60, maxWidth: 600, defaultWidth: 150 },\n\n renderers: {},\n formatters: {},\n lazy: false,\n};\n","export class TableLocalization {\n noData = 'There is no data to display!';\n loading = 'Loading...';\n operation = 'Operation';\n}\n","import { InjectionToken } from '@angular/core';\nimport { ResolvedTableOptions } from '../types/table-options.types';\nimport { NGX_TABLE_CONFIG_DEFAULT } from './defaults';\nimport { TableLocalization } from '../localization/table.localization';\n\nexport const NGX_TABLE_CONFIG = new InjectionToken<ResolvedTableOptions>('NGX_TABLE_CONFIG', {\n factory: () => NGX_TABLE_CONFIG_DEFAULT,\n});\n\nexport const NGX_TABLE_I18N = new InjectionToken<TableLocalization>('NGX_TABLE_I18N', {\n factory: () => new TableLocalization(),\n});\n","export class PaginationLocalization {\n first = 'First';\n last = 'Last';\n next = 'Next';\n previous = 'Previous';\n showing = 'Showing';\n to = 'to';\n of = 'of';\n results = 'results';\n pageSize = 'Page Size';\n}\n","import { InjectionToken } from '@angular/core';\nimport { NgxPaginationOptions } from '../types/pagination.types';\nimport { NGX_PAGINATION_CONFIG_DEFAULT } from './defaults';\nimport { PaginationLocalization } from '../localization/pagination.localization';\n\nexport const NGX_PAGINATION_CONFIG = new InjectionToken<NgxPaginationOptions>(\n 'NGX_PAGINATION_CONFIG',\n {\n factory: () => NGX_PAGINATION_CONFIG_DEFAULT,\n },\n);\n\nexport const NGX_PAGINATION_I18N = new InjectionToken<PaginationLocalization>(\n 'NGX_PAGINATION_I18N',\n {\n factory: () => new PaginationLocalization(),\n },\n);\n","import { EnvironmentProviders, makeEnvironmentProviders } from '@angular/core';\nimport { NGX_TABLE_CONFIG } from '../tokens/table-config.token';\nimport { NgxTableOptions, ResolvedTableOptions } from '../types/table-options.types';\nimport { NGX_TABLE_CONFIG_DEFAULT } from '../tokens/defaults';\n\nfunction mergeTableConfig(\n base: ResolvedTableOptions,\n override?: NgxTableOptions,\n): ResolvedTableOptions {\n if (!override) return base;\n return {\n ...base,\n ...override,\n column: { ...base.column, ...override.column },\n renderers: { ...base.renderers, ...override.renderers },\n formatters: { ...base.formatters, ...override.formatters },\n };\n}\n\n/**\n * کانفیگ سراسری <ngx-table>: جهت پیش‌فرض، حداقل/حداکثر عرض ستون، فعال بودن\n * پیش‌فرض سورت چندستونه، و از همه مهم‌تر رجیستری رندررها.\n *\n * @example\n * provideTable({\n * renderers: defineRenderers({ avatar: AvatarCellRenderer, boolean: BooleanCellRenderer }),\n * column: { minWidth: 80, maxWidth: 480, defaultWidth: 160 },\n * })\n */\nexport function provideTable(options?: NgxTableOptions): EnvironmentProviders {\n return makeEnvironmentProviders([\n { provide: NGX_TABLE_CONFIG, useValue: mergeTableConfig(NGX_TABLE_CONFIG_DEFAULT, options) },\n ]);\n}\n","import { EnvironmentProviders, makeEnvironmentProviders } from '@angular/core';\nimport { NGX_PAGINATION_CONFIG } from '../tokens/pagination-config.token';\nimport { NgxPaginationOptions } from '../types/pagination.types';\nimport { NGX_PAGINATION_CONFIG_DEFAULT } from '../tokens/defaults';\n\nfunction mergePaginationConfig(\n base: NgxPaginationOptions,\n override?: Partial<NgxPaginationOptions>,\n): NgxPaginationOptions {\n if (!override) return base;\n return {\n ...base,\n ...override,\n };\n}\n\nexport function providePagination(options?: Partial<NgxPaginationOptions>): EnvironmentProviders {\n return makeEnvironmentProviders([\n {\n provide: NGX_PAGINATION_CONFIG,\n useValue: mergePaginationConfig(NGX_PAGINATION_CONFIG_DEFAULT, options),\n },\n ]);\n}\n","import { Directive, inject, input, TemplateRef } from '@angular/core';\nimport { CellTemplateContext } from '../types/table-field.types';\n\n/**\n * برای projection قالب سفارشی یک ستون بدون این‌که مجبور باشید cellTemplate را\n * از طریق ViewChild به آبجکت ستون وصل کنید:\n *\n * <ngx-table [fields]=\"fields\" [data]=\"rows()\">\n * <ng-template ngxTableCell=\"userName\" let-row let-value=\"value\">\n * <strong>{{ value }}</strong>\n * </ng-template>\n * </ngx-table>\n *\n * مهم: چون این دایرکتیو در تمپلیت *کامپوننت مصرف‌کننده* (نه ngx-table) استفاده\n * می‌شود، باید آن را در آرایه‌ی imports همان کامپوننت (standalone) وارد کنید:\n * imports: [NgxTable, TableCell]\n *\n * محدودیت شناخته‌شده: context این تمپلیت (row/value) از نوع T دقیق نیست\n * (چون TemplateRef اینجا به‌صورت پویا از ContentChildren جمع‌آوری می‌شود و\n * اطلاعات جنریک T در آن نقطه از بین می‌رود). برای type-safety کامل روی\n * row/value، از field.cellTemplate به همراه @ViewChild استفاده کنید (به README\n * بخش «Cell Template کاملاً Type-Safe» مراجعه کنید).\n */\n@Directive({\n selector: 'ng-template[ngxTableCell]',\n standalone: true,\n})\nexport class TableCell<T extends object = object> {\n readonly column = input.required<string>({ alias: 'ngxTableCell' });\n readonly templateRef = inject(TemplateRef<CellTemplateContext<T>>);\n}\n","import { Directive, ElementRef, HostListener, inject, input, output } from '@angular/core';\n\n/**\n * دستگیره‌ی درگ برای ریسایز ستون. روی لبه‌ی «انتهای منطقی» (inline-end) قرار\n * می‌گیرد، یعنی خودش زیر [dir=\"rtl\"] جابه‌جا می‌شود؛ فقط جهت محاسبه‌ی دلتا هم\n * برعکس می‌شود تا حس درگ همیشه طبیعی باشد.\n *\n * مقدار نهایی توسط جدول در یک Map از عرض‌ها ذخیره می‌شود (نه در استایل مستقیم\n * ستون)، به همراه علامت‌گذاری «دستی ریسایز شده» — یعنی بعد از این، هیچ\n * re-render یا تغییر داده‌ای این عرض را از بین نمی‌برد.\n */\n@Directive({\n selector: '[ngxColumnResize]',\n standalone: true,\n host: {\n class: 'ngx-table__resize-handle',\n role: 'separator',\n 'aria-orientation': 'vertical',\n },\n})\nexport class ColumnResize {\n readonly startWidth = input.required<number>({ alias: 'ngxColumnResizeWidth' });\n readonly minWidth = input<number>(40, { alias: 'ngxColumnResizeMin' });\n readonly maxWidth = input<number>(1000, { alias: 'ngxColumnResizeMax' });\n readonly direction = input<'ltr' | 'rtl'>('ltr', { alias: 'ngxColumnResizeDir' });\n\n readonly resizing = output<number>();\n readonly resizeEnd = output<number>();\n\n private readonly elementRef = inject(ElementRef<HTMLElement>);\n\n private dragging = false;\n private startX = 0;\n private baseWidth = 0;\n\n @HostListener('pointerdown', ['$event'])\n onPointerDown(event: PointerEvent): void {\n event.preventDefault();\n event.stopPropagation();\n this.dragging = true;\n this.startX = event.clientX;\n // اندازه‌ی واقعیِ رندرشده‌ی ستون رو می‌گیریم، نه فقط input ورودی — چون\n // ستون‌هایی که width صریح ندارن (flex:1 1 0، فضای باقی‌مونده رو پر\n // می‌کنن) هیچ عرض عددیِ از‌پیش‌شناخته‌شده‌ای ندارن؛ تنها منبع درستِ\n // «عرض فعلی» برای شروع محاسبه‌ی درگ، خودِ DOM هست.\n const measured = this.elementRef.nativeElement.parentElement?.getBoundingClientRect().width;\n this.baseWidth = measured && measured > 0 ? measured : this.startWidth();\n (event.target as HTMLElement).setPointerCapture(event.pointerId);\n }\n\n @HostListener('pointermove', ['$event'])\n onPointerMove(event: PointerEvent): void {\n if (!this.dragging) return;\n this.resizing.emit(this.computeWidth(event.clientX));\n }\n\n @HostListener('pointerup', ['$event'])\n @HostListener('pointercancel', ['$event'])\n onPointerUp(event: PointerEvent): void {\n if (!this.dragging) return;\n this.dragging = false;\n this.resizeEnd.emit(this.computeWidth(event.clientX));\n }\n\n private computeWidth(clientX: number): number {\n const delta = clientX - this.startX;\n const signedDelta = this.direction() === 'rtl' ? -delta : delta;\n const raw = this.baseWidth + signedDelta;\n return Math.min(this.maxWidth(), Math.max(this.minWidth(), raw));\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n inject,\n input,\n model,\n output,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { NGX_PAGINATION_CONFIG, NGX_PAGINATION_I18N } from '../../tokens/pagination-config.token';\nimport { PageEvent } from '../../types/page.types';\n\n@Component({\n selector: 'ngx-pagination',\n standalone: true,\n templateUrl: './pagination.html',\n styleUrl: './pagination.scss',\n imports: [FormsModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class NgxPagination {\n protected readonly config = inject(NGX_PAGINATION_CONFIG);\n protected readonly lables = inject(NGX_PAGINATION_I18N);\n\n readonly total = input.required<number>();\n\n readonly page = model(1);\n readonly pageSize = model(this.config.defaultPageSize);\n\n readonly pageSizeOptions = input(this.config.pageSizeOptions);\n readonly siblingCount = input(1);\n readonly boundaryCount = input(1);\n\n readonly paginate = output<PageEvent>();\n\n protected readonly totalPages = computed(() =>\n Math.max(1, Math.ceil(this.total() / this.pageSize())),\n );\n\n protected readonly firstItem = computed(() =>\n this.total() === 0 ? 0 : (this.page() - 1) * this.pageSize() + 1,\n );\n\n protected readonly lastItem = computed(() =>\n Math.min(this.firstItem() + this.pageSize() - 1, this.total()),\n );\n\n protected readonly pages = computed(() =>\n this.buildPages(this.page(), this.totalPages(), this.siblingCount(), this.boundaryCount()),\n );\n\n constructor() {\n // هر تغییری در page/pageSize را برای مصرف‌کننده امیت کن.\n effect(() => {\n this.paginate.emit({ page: this.page(), pageSize: this.pageSize() });\n });\n\n // اگر بعد از کوچک‌شدن total، صفحه‌ی جاری خارج از بازه افتاد، اصلاحش کن.\n effect(() => {\n const max = this.totalPages();\n if (this.page() > max) this.page.set(max);\n });\n }\n\n private buildPages(\n current: number,\n total: number,\n sibling = 1,\n boundary = 1,\n ): (number | string)[] {\n const range = (start: number, end: number) =>\n Array.from({ length: end - start + 1 }, (_, i) => start + i);\n\n const totalNumbers = sibling * 2 + boundary * 2 + 3;\n if (total <= totalNumbers) return range(1, total);\n\n const leftSibling = Math.max(current - sibling, boundary + 2);\n const rightSibling = Math.min(current + sibling, total - boundary - 1);\n const showLeftDots = leftSibling > boundary + 2;\n const showRightDots = rightSibling < total - boundary - 1;\n\n const pages: (number | string)[] = [];\n pages.push(...range(1, boundary));\n if (showLeftDots) pages.push('...');\n else pages.push(...range(boundary + 1, leftSibling - 1));\n pages.push(...range(leftSibling, rightSibling));\n if (showRightDots) pages.push('...');\n else pages.push(...range(rightSibling + 1, total - boundary));\n pages.push(...range(total - boundary + 1, total));\n return pages;\n }\n\n protected next(): void {\n this.page.update((p) => Math.min(p + 1, this.totalPages()));\n }\n protected previous(): void {\n this.page.update((p) => Math.max(1, p - 1));\n }\n protected first(): void {\n this.page.set(1);\n }\n protected last(): void {\n this.page.set(this.totalPages());\n }\n protected goto(page: number): void {\n if (typeof page !== 'number' || Number.isNaN(page)) return;\n this.page.set(page);\n }\n protected onPageSizeChange(value: number): void {\n this.pageSize.set(Number(value));\n this.page.set(1);\n }\n}\n","<nav class=\"ngx-pagination\">\n <div class=\"ngx-pagination__summary\">\n {{ lables.showing }}\n <span class=\"fw-semibold\">{{ firstItem() }}</span>\n {{ lables.to }}\n <span class=\"fw-semibold\">{{ lastItem() }}</span>\n {{ lables.of }}\n <span class=\"fw-semibold\">{{ total() }}</span>\n {{ lables.results }}\n </div>\n\n <div class=\"ngx-pagination__controls\">\n <ul class=\"ngx-pagination__list\">\n <li [class.disabled]=\"page() === 1\" [title]=\"lables.first\">\n <a (click)=\"first()\" class=\"icon\">«</a>\n </li>\n <li [class.disabled]=\"page() === 1\" [title]=\"lables.previous\">\n <a (click)=\"previous()\" class=\"icon\">‹</a>\n </li>\n\n @for (item of pages(); track $index) {\n <li class=\"ngx-pagination__page-num\" [class.active]=\"item === page()\">\n @if (item !== page() && item !== '...') {\n <a (click)=\"goto(+item)\">{{ item }}</a>\n }\n @if (item === page() || item === '...') {\n <span>{{ item }}</span>\n }\n </li>\n }\n\n <li [class.disabled]=\"page() === totalPages()\" [title]=\"lables.next\">\n <a (click)=\"next()\" class=\"icon\">›</a>\n </li>\n <li [class.disabled]=\"page() === totalPages()\" [title]=\"lables.last\">\n <a (click)=\"last()\" class=\"icon\">»</a>\n </li>\n </ul>\n\n <div class=\"ngx-pagination__page-size\">\n <span>{{ lables.pageSize }}:</span>\n <select [ngModel]=\"pageSize()\" (ngModelChange)=\"onPageSizeChange($event)\">\n @for (opt of pageSizeOptions(); track opt) {\n <option [value]=\"opt\" [selected]=\"opt === pageSize()\">{{ opt }}</option>\n }\n </select>\n </div>\n </div>\n</nav>\n","import { CommonModule } from '@angular/common';\nimport {\n AfterContentInit,\n ChangeDetectionStrategy,\n Component,\n computed,\n ContentChildren,\n DestroyRef,\n DOCUMENT,\n effect,\n inject,\n input,\n OnInit,\n output,\n QueryList,\n signal,\n TemplateRef,\n Type,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { TableCell } from '../../directives/table-cell.directive';\nimport { ColumnResize } from '../../directives/column-resize.directive';\nimport { NGX_TABLE_CONFIG, NGX_TABLE_I18N } from '../../tokens/table-config.token';\nimport { NGX_PAGINATION_CONFIG } from '../../tokens/pagination-config.token';\nimport { PageEvent, LazyLoadEvent } from '../../types/page.types';\nimport { SortDirection, SortMeta } from '../../types/sort.types';\nimport {\n CellRendererComponent,\n CellTemplateContext,\n TableField,\n} from '../../types/table-field.types';\nimport { NgxPagination } from '../pagination/pagination';\nimport { DirectionService } from 'ngx-kit/core';\n\n/**\n * جدول داده‌ی جنریک و Type-Safe.\n *\n * `T` از روی چیزی که به [data] بایند می‌کنید استنتاج می‌شود؛ `field.column` در\n * `TableField<T, R>` محدود به `keyof T` است، و اگر از defineFields(renderers, ...)\n * استفاده کنید، `field.renderer` محدود به کلیدهای رجیستری و `rendererInputs`\n * دقیقاً همان ورودی‌های اضافه‌ی همان renderer است.\n *\n * دو حالت:\n * - کلاینت‌ساید (پیش‌فرض): [data] کل آرایه است؛ سورت/صفحه‌بندی داخلی و روی\n * یک computed خالص انجام می‌شود (بدون mutation روی آبجکت‌های شما).\n * - lazy: [lazy]=\"true\" + [totalRecords]؛ [data] فقط صفحه‌ی جاری است؛ به\n * (lazyLoad) گوش بدهید.\n */\n@Component({\n selector: 'ngx-table',\n standalone: true,\n templateUrl: './table.html',\n styleUrl: './table.scss',\n imports: [CommonModule, NgxPagination, ColumnResize],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'ngx-table-host',\n },\n})\nexport class NgxTable<T extends object> implements OnInit, AfterContentInit {\n protected readonly config = inject(NGX_TABLE_CONFIG);\n protected readonly labels = inject(NGX_TABLE_I18N);\n protected readonly paginationConfig = inject(NGX_PAGINATION_CONFIG);\n\n // ---------------------------------------------------------------- inputs\n readonly fields = input.required<TableField<T, any>[]>();\n readonly data = input.required<readonly T[]>();\n readonly totalRecords = input.required<number>();\n readonly showRecordNumber = input(this.config.showRecordNumber);\n readonly operations = input<TemplateRef<{ $implicit: T }>>();\n readonly operationWidth = input(80);\n readonly numWidth = input(80);\n readonly pageSize = input(this.paginationConfig.defaultPageSize);\n readonly page = input(1);\n readonly pageChange = output<number>();\n readonly loading = input(false);\n readonly multiSort = input<boolean | undefined>(undefined);\n readonly lazy = input(this.config.lazy);\n readonly resizable = input(this.config.resizable);\n /** پیش‌فرض بر اساس ایندکس؛ برای جلوگیری از گم‌شدن state سطرها هنگام سورت،\n * یک شناسه‌ی یکتا بدهید: [trackBy]=\"(i, row) => row.id\" */\n readonly trackBy = input<(index: number, row: T) => unknown>((index) => index);\n\n // --------------------------------------------------------------- outputs\n readonly lazyLoad = output<LazyLoadEvent<T>>();\n readonly sortChange = output<SortMeta<T>[]>();\n readonly columnResize = output<{ field: string; width: number }>();\n\n // ------------------------------------------------------------ int. state\n protected readonly pageIndex = signal(1);\n protected readonly pageSizeS = signal(this.paginationConfig.defaultPageSize);\n protected readonly sorts = signal<SortMeta<T>[]>([]);\n protected readonly widths = signal<Record<string, number>>({});\n private readonly manuallyResized = new Set<string>();\n private readonly rendererInputsCache = new Map<\n TableField<T, any>,\n WeakMap<T, Record<string, unknown>>\n >();\n\n @ContentChildren(TableCell) private cellTemplates!: QueryList<TableCell<T>>;\n private templateMap = new Map<string, TemplateRef<CellTemplateContext<T>>>();\n\n protected readonly resolvedMultiSort = computed(() => this.multiSort() ?? this.config.multiSort);\n private readonly directionService = inject(DirectionService);\n private readonly destroyRef = inject(DestroyRef);\n protected readonly resolvedDirection = computed(() => this.directionService.direction());\n constructor() {\n effect(() => {\n const ps = this.pageSize();\n this.pageSizeS.set(ps);\n const pi = this.page();\n this.pageIndex.set(pi);\n });\n\n // برای هر ستونِ تازه‌دیده‌شده که width عددیِ صریح دارد، یک عرض seed کن؛\n // ستون‌هایی که کاربر دستی ریسایز کرده دیگر هیچ‌وقت دوباره نوشته نمی‌شوند.\n // مهم: ستون‌هایی که اصلاً width ندارند (یا width رشته‌ای مثل '20%' دارند)\n // عمداً اینجا seed نمی‌شوند — قبلاً همه‌ی ستون‌ها با یک defaultWidth ثابت\n // seed می‌شدند که باعث می‌شد جدول با flex:0 0 روی هر ستون هیچ‌وقت واقعاً\n // 100% عرض رو پر نکنه، حتی وقتی کاربر عمداً یک ستون رو بدون width گذاشته\n // بود تا فضای باقی‌مونده رو خودش پر کنه.\n effect(() => {\n const cols = this.fields();\n const current = this.widths();\n let changed = false;\n const next = { ...current };\n for (const f of cols) {\n if (this.manuallyResized.has(f.column)) continue;\n if (f.column in next) continue;\n if (typeof f.width === 'number') {\n next[f.column] = f.width;\n changed = true;\n }\n }\n if (changed) this.widths.set(next);\n });\n }\n\n ngOnInit(): void {\n // نیاز به این نیست در لود خود صفحه بندی paginate را صدا میزند\n // if (this.lazy()) {\n // this.lazyLoad.emit({ first: 0, pageIndex: 1, pageSize: this.pageSizeS(), sorts: [] });\n // }\n }\n\n ngAfterContentInit(): void {\n this.syncTemplateMap();\n // این Observable خودش کامل نمی‌شه (EventEmitter ساده‌ست، نه یه stream که\n // روی destroy کامپوننت تموم بشه)؛ بدون takeUntilDestroyed، این subscribe\n // برای همیشه فعال می‌موند و رفرنس کامپوننت رو زنده نگه می‌داشت.\n this.cellTemplates.changes\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => this.syncTemplateMap());\n }\n\n private syncTemplateMap(): void {\n this.templateMap.clear();\n this.cellTemplates.forEach((cell) => {\n // نکته‌ی مهم: cell.column() باید فراخوانی شود (سیگنال است)، نه cell.column.name.\n this.templateMap.set(cell.column(), cell.templateRef);\n });\n }\n\n // ------------------------------------------------------------- داده‌ها\n protected readonly sortedData = computed<readonly T[]>(() => {\n if (this.lazy()) return this.data();\n const sorts = this.sorts();\n if (sorts.length === 0) return this.data();\n const copy = [...this.data()];\n copy.sort((a, b) => {\n for (const s of sorts) {\n const cmp = this.compare(a[s.field], b[s.field]);\n if (cmp !== 0) return s.direction === 'asc' ? cmp : -cmp;\n }\n return 0;\n });\n return copy;\n });\n\n protected readonly totalCount = computed(() =>\n this.lazy() ? this.totalRecords() : this.data().length,\n );\n\n protected readonly pagedData = computed<readonly T[]>(() => {\n if (this.lazy()) return this.sortedData();\n const start = (this.pageIndex() - 1) * this.pageSizeS();\n return this.sortedData().slice(start, start + this.pageSizeS());\n });\n\n private compare(a: unknown, b: unknown): number {\n if (a == null && b == null) return 0;\n if (a == null) return -1;\n if (b == null) return 1;\n if (typeof a === 'number' && typeof b === 'number') return a - b;\n if (typeof a === 'boolean' && typeof b === 'boolean') return a === b ? 0 : a ? 1 : -1;\n if (a instanceof Date && b instanceof Date) return a.getTime() - b.getTime();\n return String(a).localeCompare(String(b));\n }\n\n /** بدون mutation روی داده‌ی ورودی: شماره‌ی ردیف صرفاً از روی page/pageSize/rowIndex محاسبه می‌شود. */\n protected recordNumber(rowIndex: number): number {\n return (this.pageIndex() - 1) * this.pageSizeS() + rowIndex + 1;\n }\n\n // -------------------------------------------------------------- سورت\n protected sortDirectionFor(column: string): SortDirection | null {\n return this.sorts().find((s) => s.field === column)?.direction ?? null;\n }\n\n protected onHeaderClick(field: TableField<T, any>, event: MouseEvent): void {\n if (!field.sortable) return;\n const column = field.column;\n const current = this.sorts();\n const existingIndex = current.findIndex((s) => s.field === column);\n const isMultiGesture =\n this.resolvedMultiSort() && (event.shiftKey || event.ctrlKey || event.metaKey);\n\n let next: SortMeta<T>[];\n if (isMultiGesture) {\n next = [...current];\n if (existingIndex === -1) {\n next.push({ field: column, direction: 'asc' });\n } else if (next[existingIndex].direction === 'asc') {\n next[existingIndex] = { field: column, direction: 'desc' };\n } else {\n next.splice(existingIndex, 1);\n }\n } else if (existingIndex === -1 || current.length > 1) {\n next = [{ field: column, direction: 'asc' }];\n } else if (current[0].direction === 'asc') {\n next = [{ field: column, direction: 'desc' }];\n } else {\n next = [];\n }\n\n this.sorts.set(next);\n this.pageIndex.set(1);\n this.pageChange.emit(this.pageIndex());\n this.sortChange.emit(next);\n this.emitLazyIfNeeded();\n }\n\n // ------------------------------------------------------------ صفحه‌بندی\n protected onPaginate(event: PageEvent): void {\n this.pageIndex.set(event.page);\n this.pageSizeS.set(event.pageSize);\n this.pageChange.emit(this.pageIndex());\n this.emitLazyIfNeeded();\n }\n\n private emitLazyIfNeeded(): void {\n if (!this.lazy()) return;\n const pageIndex = this.pageIndex();\n const pageSize = this.pageSizeS();\n this.lazyLoad.emit({\n pageIndex,\n pageSize,\n first: (pageIndex - 1) * pageSize,\n sorts: this.sorts(),\n sorting: this.sorts()\n ?.map((s) => `${s.field} ${s.direction}`)\n .join(','),\n });\n }\n\n // -------------------------------------------------------------- ریسایز\n protected columnWidth(column: string): number {\n return this.widths()[column] ?? this.config.column.defaultWidth;\n }\n /**\n * مقدار CSS `flex` واقعیِ این ستون:\n * - اگه دستی ریسایز شده یا width عددی داره → `0 0 <px>` (ثابت، بدون رشد/کوچک‌شدن)\n * - اگه width رشته‌ای داره (مثلاً '20%') → `0 0 <رشته>` (ثابت، هر واحد CSS معتبری)\n * - اگه اصلاً width نداره → `1 1 0` (رشد می‌کنه تا فضای باقی‌مونده‌ی جدول رو پر کنه)\n */\n protected columnFlex(field: TableField<T, any>): string {\n const resized = this.widths()[field.column];\n if (resized != null) return `0 0 ${resized}px`;\n if (typeof field.width === 'string') return `0 0 ${field.width}`;\n return '1 1 0';\n }\n protected columnMin(field: TableField<T, any>): number {\n return field.minWidth ?? this.config.column.minWidth;\n }\n protected columnMax(field: TableField<T, any>): number {\n return field.maxWidth ?? this.config.column.maxWidth;\n }\n protected isResizable(field: TableField<T, any>): boolean {\n return (field.resizable ?? this.resizable()) !== false;\n }\n protected onColumnResizing(column: string, width: number): void {\n this.widths.update((w) => ({ ...w, [column]: width }));\n }\n protected onColumnResizeEnd(column: string, width: number): void {\n this.manuallyResized.add(column);\n this.widths.update((w) => ({ ...w, [column]: width }));\n this.columnResize.emit({ field: column, width });\n }\n\n // --------------------------------------------------------------- سلول‌ها\n protected getTemplate(column: string): TemplateRef<CellTemplateContext<T>> | null {\n const fromDirective = this.templateMap.get(column);\n if (fromDirective) return fromDirective;\n\n const fromFieldConfig = this.fields().find((f) => f.column === column)?.cellTemplate;\n return fromFieldConfig ?? null;\n }\n\n protected getRenderer(field: TableField<T, any>): Type<CellRendererComponent> | null {\n if (!field.renderer) return null;\n // نکته: نوع دقیق field.renderer (که به کلیدهای رجیستری محدود است) در\n // defineFields() چک می‌شود؛ اینجا فقط یک lookup رانتایم ساده لازم است.\n return this.config.renderers[field.renderer as string] ?? null;\n }\n\n protected getCellValue(row: T, field: TableField<T, any>): unknown {\n return row[field.column];\n }\n\n protected formatCellValue(row: T, field: TableField<T, any>): string {\n const value = this.getCellValue(row, field);\n\n if (typeof field.formatter === 'function') {\n return this.stringify(field.formatter(value, row, field));\n }\n if (typeof field.formatter === 'string') {\n const formatter = this.config.formatters[field.formatter];\n if (formatter) return this.stringify(formatter(value, row, field));\n }\n return this.stringify(value);\n }\n\n private stringify(value: unknown): string {\n return value == null ? '' : String(value);\n }\n\n /** ورودی‌های renderer را به‌ازای هر (field, row) کش می‌کند تا هر Change\n * Detection یک آبجکت جدید ساخته نشود؛ با WeakMap، وقتی row از حافظه خارج\n * شود (مثلاً بعد از عوض‌شدن صفحه)، entry آن هم خودکار پاک می‌شود. */\n protected getRendererInputs(row: T, field: TableField<T, any>): Record<string, unknown> {\n let fieldCache = this.rendererInputsCache.get(field);\n if (!fieldCache) {\n fieldCache = new WeakMap();\n this.rendererInputsCache.set(field, fieldCache);\n }\n let inputs = fieldCache.get(row);\n if (!inputs) {\n inputs = {\n value: this.getCellValue(row, field),\n row,\n field,\n ...(field.renderer ? field.rendererInputs : undefined),\n };\n fieldCache.set(row, inputs);\n }\n return inputs;\n }\n}\n","<div class=\"ngx-table-wrapper\" [class.ngx-table--loading]=\"loading()\">\n <div class=\"ngx-table-scroll\">\n <div\n class=\"ngx-table\"\n [class.ngx-table--striped]=\"config.stripedRows\"\n [class.ngx-table--hover]=\"config.hoverable\"\n role=\"table\">\n <div class=\"thead-mrs\" [class.thead-mrs--sticky]=\"config.stickyHeader\" role=\"rowgroup\">\n <div class=\"tr-mrs\" role=\"row\">\n @if (operations()) {\n <div\n class=\"th-mrs operations\"\n role=\"columnheader\"\n [style.flex]=\"'0 0 ' + operationWidth() + 'px'\">\n {{ labels.operation }}\n </div>\n }\n @if (showRecordNumber()) {\n <div\n class=\"th-mrs operations\"\n role=\"columnheader\"\n [style.flex]=\"'0 0 ' + numWidth() + 'px'\">\n #\n </div>\n }\n\n @for (f of fields(); track f.column) {\n <div\n class=\"th-mrs\"\n role=\"columnheader\"\n [class.th-mrs--sortable]=\"f.sortable\"\n [style.flex]=\"columnFlex(f)\"\n [attr.aria-sort]=\"\n sortDirectionFor(f.column) === 'asc'\n ? 'ascending'\n : sortDirectionFor(f.column) === 'desc'\n ? 'descending'\n : null\n \"\n (click)=\"onHeaderClick(f, $event)\">\n <span class=\"th-mrs__title\">{{ f.title }}</span>\n\n @if (f.sortable) {\n <span class=\"sort-icon\" [class.active]=\"sortDirectionFor(f.column) !== null\">\n @if (sortDirectionFor(f.column) === 'asc') {\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 320 512\">\n <path\n fill=\"currentColor\"\n d=\"M182.6 41.4c-12.5-12.5-32.8-12.5-45.3 0l-128 128c-9.2 9.2-11.9 22.9-6.9 34.9s16.6 19.8 29.6 19.8H96V448c0 17.7 14.3 32 32 32s32-14.3 32-32V224h64c12.9 0 24.6-7.8 29.6-19.8s2.2-25.7-6.9-34.9l-128-128z\" />\n </svg>\n } @else if (sortDirectionFor(f.column) === 'desc') {\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 320 512\">\n <path\n fill=\"currentColor\"\n d=\"M137.4 470.6c12.5 12.5 32.8 12.5 45.3 0l128-128c9.2-9.2 11.9-22.9 6.9-34.9s-16.6-19.8-29.6-19.8H224V64c0-17.7-14.3-32-32-32s-32 14.3-32 32V288H96c-12.9 0-24.6 7.8-29.6 19.8s-2.2 25.7 6.9 34.9l128 128z\" />\n </svg>\n } @else {\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 320 512\">\n <path\n fill=\"currentColor\"\n d=\"M137.4 41.4c12.5-12.5 32.8-12.5 45.3 0l96 96c9.2 9.2 11.9 22.9 6.9 34.9s-16.6 19.8-29.6 19.8H224v96c0 17.7-14.3 32-32 32s-32-14.3-32-32V192H96c-12.9 0-24.6-7.8-29.6-19.8s-2.3-25.7 6.9-34.9l96-96zM32 400c0-17.7 14.3-32 32-32H256c17.7 0 32 14.3 32 32s-14.3 32-32 32H64c-17.7 0-32-14.3-32-32z\"\n opacity=\".35\" />\n </svg>\n }\n </span>\n }\n\n @if (isResizable(f)) {\n <span\n ngxColumnResize\n [ngxColumnResizeWidth]=\"columnWidth(f.column)\"\n [ngxColumnResizeMin]=\"columnMin(f)\"\n [ngxColumnResizeMax]=\"columnMax(f)\"\n [ngxColumnResizeDir]=\"resolvedDirection()\"\n (resizing)=\"onColumnResizing(f.column, $event)\"\n (resizeEnd)=\"onColumnResizeEnd(f.column, $event)\"\n (click)=\"$event.stopPropagation()\"></span>\n }\n </div>\n }\n </div>\n </div>\n\n <div class=\"tbody-mrs\" role=\"rowgroup\">\n @if (!loading() && pagedData().length === 0) {\n <div class=\"no-data\">{{ labels.noData }}</div>\n }\n\n @for (row of pagedData(); track trackBy()($index, row); let rowIndex = $index) {\n <div class=\"tr-mrs\" role=\"row\">\n @if (operations()) {\n <div\n class=\"td-mrs operations\"\n role=\"cell\"\n [style.flex]=\"'0 0 ' + operationWidth() + 'px'\">\n <div class=\"cel\">\n <span class=\"cell-title\">{{ labels.operation }}:</span>\n <ng-container\n [ngTemplateOutlet]=\"operations()!\"\n [ngTemplateOutletContext]=\"{ $implicit: row }\"></ng-container>\n </div>\n </div>\n }\n\n @if (showRecordNumber()) {\n <div class=\"td-mrs operations\" role=\"cell\" [style.flex]=\"'0 0 ' + numWidth() + 'px'\">\n <div class=\"cel\">{{ recordNumber(rowIndex) }}</div>\n </div>\n }\n\n @for (f of fields(); track f.column) {\n @let template = getTemplate(f.column);\n @let renderer = getRenderer(f);\n\n <div class=\"td-mrs\" role=\"cell\" [style.flex]=\"columnFlex(f)\">\n <div class=\"cel\" [class.wrap]=\"f.wrap\">\n <span class=\"cell-title\">{{ f.title }}</span>\n\n @if (template) {\n <ng-container\n [ngTemplateOutlet]=\"template\"\n [ngTemplateOutletContext]=\"{\n $implicit: row,\n row: row,\n value: getCellValue(row, f),\n rowIndex: rowIndex,\n field: f,\n }\"></ng-container>\n } @else if (renderer) {\n <ng-container\n *ngComponentOutlet=\"\n renderer;\n inputs: getRendererInputs(row, f)\n \"></ng-container>\n } @else {\n {{ formatCellValue(row, f) }}\n }\n\n @if (f.prefix) {\n <span>{{ f.prefix }}</span>\n }\n </div>\n </div>\n }\n </div>\n }\n </div>\n </div>\n\n @if (loading()) {\n <div class=\"loading-container\">\n <div class=\"loading\">{{ labels.loading }}</div>\n </div>\n }\n </div>\n</div>\n\n<ngx-pagination\n [page]=\"page()\"\n [pageSize]=\"pageSizeS()\"\n [total]=\"totalCount()\"\n (paginate)=\"onPaginate($event)\"></ngx-pagination>\n","// types\nexport * from './types/sort.types';\nexport * from './types/page.types';\nexport * from './types/pagination.types';\nexport * from './types/table-field.types';\nexport * from './types/table-options.types';\n\n// tokens\nexport * from './tokens/table-config.token';\nexport * from './tokens/pagination-config.token';\n\n// providers\nexport * from './providers/provide-table';\nexport * from './providers/provide-pagination';\n\n// directives\nexport * from './directives/table-cell.directive';\nexport * from './directives/column-resize.directive';\n\n// components\nexport * from './components/table/table';\nexport * from './components/pagination/pagination';\n\n// localizations\nexport * from './localization/pagination.localization';\nexport * from './localization/table.localization';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1"],"mappings":";;;;;;;;;AAgBA;;;;AAIG;AACG,SAAU,eAAe,CAA6B,QAAW,EAAA;AACrE,IAAA,OAAO,QAAQ;AACjB;AAsFA;;;;;;;;;;;;;AAaG;AACG,SAAU,YAAY,CAC1B,UAAa,EACb,MAA0B,EAAA;AAE1B,IAAA,OAAO,MAAM;AACf;;AC7HO,MAAM,6BAA6B,GAAyB;AACjE,IAAA,eAAe,EAAE,EAAE;AACnB,IAAA,eAAe,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC;CAC1C;AACM,MAAM,wBAAwB,GAAyB;AAC5D,IAAA,gBAAgB,EAAE,KAAK;AACvB,IAAA,SAAS,EAAE,IAAI;AACf,IAAA,SAAS,EAAE,IAAI;AACf,IAAA,SAAS,EAAE,IAAI;AACf,IAAA,YAAY,EAAE,IAAI;AAClB,IAAA,WAAW,EAAE,IAAI;AACjB,IAAA,MAAM,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,GAAG,EAAE,YAAY,EAAE,GAAG,EAAE;AAE1D,IAAA,SAAS,EAAE,EAAE;AACb,IAAA,UAAU,EAAE,EAAE;AACd,IAAA,IAAI,EAAE,KAAK;CACZ;;MCnBY,iBAAiB,CAAA;IAC5B,MAAM,GAAG,8BAA8B;IACvC,OAAO,GAAG,YAAY;IACtB,SAAS,GAAG,WAAW;AACxB;;MCCY,gBAAgB,GAAG,IAAI,cAAc,CAAuB,kBAAkB,EAAE;AAC3F,IAAA,OAAO,EAAE,MAAM,wBAAwB;AACxC,CAAA;MAEY,cAAc,GAAG,IAAI,cAAc,CAAoB,gBAAgB,EAAE;AACpF,IAAA,OAAO,EAAE,MAAM,IAAI,iBAAiB,EAAE;AACvC,CAAA;;MCXY,sBAAsB,CAAA;IACjC,KAAK,GAAG,OAAO;IACf,IAAI,GAAG,MAAM;IACb,IAAI,GAAG,MAAM;IACb,QAAQ,GAAG,UAAU;IACrB,OAAO,GAAG,SAAS;IACnB,EAAE,GAAG,IAAI;IACT,EAAE,GAAG,IAAI;IACT,OAAO,GAAG,SAAS;IACnB,QAAQ,GAAG,WAAW;AACvB;;MCLY,qBAAqB,GAAG,IAAI,cAAc,CACrD,uBAAuB,EACvB;AACE,IAAA,OAAO,EAAE,MAAM,6BAA6B;AAC7C,CAAA;MAGU,mBAAmB,GAAG,IAAI,cAAc,CACnD,qBAAqB,EACrB;AACE,IAAA,OAAO,EAAE,MAAM,IAAI,sBAAsB,EAAE;AAC5C,CAAA;;ACXH,SAAS,gBAAgB,CACvB,IAA0B,EAC1B,QAA0B,EAAA;AAE1B,IAAA,IAAI,CAAC,QAAQ;AAAE,QAAA,OAAO,IAAI;IAC1B,OAAO;AACL,QAAA,GAAG,IAAI;AACP,QAAA,GAAG,QAAQ;QACX,MAAM,EAAE,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,QAAQ,CAAC,MAAM,EAAE;QAC9C,SAAS,EAAE,EAAE,GAAG,IAAI,CAAC,SAAS,EAAE,GAAG,QAAQ,CAAC,SAAS,EAAE;QACvD,UAAU,EAAE,EAAE,GAAG,IAAI,CAAC,UAAU,EAAE,GAAG,QAAQ,CAAC,UAAU,EAAE;KAC3D;AACH;AAEA;;;;;;;;;AASG;AACG,SAAU,YAAY,CAAC,OAAyB,EAAA;AACpD,IAAA,OAAO,wBAAwB,CAAC;AAC9B,QAAA,EAAE,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,gBAAgB,CAAC,wBAAwB,EAAE,OAAO,CAAC,EAAE;AAC7F,KAAA,CAAC;AACJ;;AC5BA,SAAS,qBAAqB,CAC5B,IAA0B,EAC1B,QAAwC,EAAA;AAExC,IAAA,IAAI,CAAC,QAAQ;AAAE,QAAA,OAAO,IAAI;IAC1B,OAAO;AACL,QAAA,GAAG,IAAI;AACP,QAAA,GAAG,QAAQ;KACZ;AACH;AAEM,SAAU,iBAAiB,CAAC,OAAuC,EAAA;AACvE,IAAA,OAAO,wBAAwB,CAAC;AAC9B,QAAA;AACE,YAAA,OAAO,EAAE,qBAAqB;AAC9B,YAAA,QAAQ,EAAE,qBAAqB,CAAC,6BAA6B,EAAE,OAAO,CAAC;AACxE,SAAA;AACF,KAAA,CAAC;AACJ;;ACpBA;;;;;;;;;;;;;;;;;;;AAmBG;MAKU,SAAS,CAAA;IACX,MAAM,GAAG,KAAK,CAAC,QAAQ,6EAAW,KAAK,EAAE,cAAc,EAAA,CAAG;AAC1D,IAAA,WAAW,GAAG,MAAM,EAAC,WAAmC,EAAC;uGAFvD,SAAS,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAT,SAAS,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,2BAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAAT,SAAS,EAAA,UAAA,EAAA,CAAA;kBAJrB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,2BAA2B;AACrC,oBAAA,UAAU,EAAE,IAAI;AACjB,iBAAA;;;ACxBD;;;;;;;;AAQG;MAUU,YAAY,CAAA;IACd,UAAU,GAAG,KAAK,CAAC,QAAQ,iFAAW,KAAK,EAAE,sBAAsB,EAAA,CAAG;IACtE,QAAQ,GAAG,KAAK,CAAS,EAAE,gFAAI,KAAK,EAAE,oBAAoB,EAAA,CAAG;IAC7D,QAAQ,GAAG,KAAK,CAAS,IAAI,gFAAI,KAAK,EAAE,oBAAoB,EAAA,CAAG;IAC/D,SAAS,GAAG,KAAK,CAAgB,KAAK,iFAAI,KAAK,EAAE,oBAAoB,EAAA,CAAG;IAExE,QAAQ,GAAG,MAAM,EAAU;IAC3B,SAAS,GAAG,MAAM,EAAU;AAEpB,IAAA,UAAU,GAAG,MAAM,EAAC,UAAuB,EAAC;IAErD,QAAQ,GAAG,KAAK;IAChB,MAAM,GAAG,CAAC;IACV,SAAS,GAAG,CAAC;AAGrB,IAAA,aAAa,CAAC,KAAmB,EAAA;QAC/B,KAAK,CAAC,cAAc,EAAE;QACtB,KAAK,CAAC,eAAe,EAAE;AACvB,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;AACpB,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC,OAAO;;;;;AAK3B,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,aAAa,EAAE,qBAAqB,EAAE,CAAC,KAAK;AAC3F,QAAA,IAAI,CAAC,SAAS,GAAG,QAAQ,IAAI,QAAQ,GAAG,CAAC,GAAG,QAAQ,GAAG,IAAI,CAAC,UAAU,EAAE;QACvE,KAAK,CAAC,MAAsB,CAAC,iBAAiB,CAAC,KAAK,CAAC,SAAS,CAAC;IAClE;AAGA,IAAA,aAAa,CAAC,KAAmB,EAAA;QAC/B,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE;AACpB,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACtD;AAIA,IAAA,WAAW,CAAC,KAAmB,EAAA;QAC7B,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE;AACpB,QAAA,IAAI,CAAC,QAAQ,GAAG,KAAK;AACrB,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACvD;AAEQ,IAAA,YAAY,CAAC,OAAe,EAAA;AAClC,QAAA,MAAM,KAAK,GAAG,OAAO,GAAG,IAAI,CAAC,MAAM;AACnC,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,EAAE,KAAK,KAAK,GAAG,CAAC,KAAK,GAAG,KAAK;AAC/D,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,GAAG,WAAW;QACxC,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,GAAG,CAAC,CAAC;IAClE;uGAjDW,YAAY,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAZ,YAAY,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,sBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,QAAA,EAAA,UAAA,EAAA,SAAA,EAAA,WAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,MAAA,EAAA,WAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,EAAA,SAAA,EAAA,EAAA,aAAA,EAAA,uBAAA,EAAA,aAAA,EAAA,uBAAA,EAAA,WAAA,EAAA,qBAAA,EAAA,eAAA,EAAA,qBAAA,EAAA,EAAA,cAAA,EAAA,0BAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAAZ,YAAY,EAAA,UAAA,EAAA,CAAA;kBATxB,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,mBAAmB;AAC7B,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,IAAI,EAAE;AACJ,wBAAA,KAAK,EAAE,0BAA0B;AACjC,wBAAA,IAAI,EAAE,WAAW;AACjB,wBAAA,kBAAkB,EAAE,UAAU;AAC/B,qBAAA;AACF,iBAAA;;sBAgBE,YAAY;uBAAC,aAAa,EAAE,CAAC,QAAQ,CAAC;;sBAetC,YAAY;uBAAC,aAAa,EAAE,CAAC,QAAQ,CAAC;;sBAMtC,YAAY;uBAAC,WAAW,EAAE,CAAC,QAAQ,CAAC;;sBACpC,YAAY;uBAAC,eAAe,EAAE,CAAC,QAAQ,CAAC;;;MCnC9B,aAAa,CAAA;AACL,IAAA,MAAM,GAAG,MAAM,CAAC,qBAAqB,CAAC;AACtC,IAAA,MAAM,GAAG,MAAM,CAAC,mBAAmB,CAAC;IAE9C,KAAK,GAAG,KAAK,CAAC,QAAQ;8EAAU;IAEhC,IAAI,GAAG,KAAK,CAAC,CAAC;6EAAC;AACf,IAAA,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe;iFAAC;AAE7C,IAAA,eAAe,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe;wFAAC;IACpD,YAAY,GAAG,KAAK,CAAC,CAAC;qFAAC;IACvB,aAAa,GAAG,KAAK,CAAC,CAAC;sFAAC;IAExB,QAAQ,GAAG,MAAM,EAAa;IAEpB,UAAU,GAAG,QAAQ,CAAC,MACvC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;mFACvD;AAEkB,IAAA,SAAS,GAAG,QAAQ,CAAC,MACtC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC;kFACjE;IAEkB,QAAQ,GAAG,QAAQ,CAAC,MACrC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;iFAC/D;AAEkB,IAAA,KAAK,GAAG,QAAQ,CAAC,MAClC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,IAAI,CAAC,YAAY,EAAE,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;8EAC3F;AAED,IAAA,WAAA,GAAA;;QAEE,MAAM,CAAC,MAAK;YACV,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;AACtE,QAAA,CAAC,CAAC;;QAGF,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,EAAE;AAC7B,YAAA,IAAI,IAAI,CAAC,IAAI,EAAE,GAAG,GAAG;AAAE,gBAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AAC3C,QAAA,CAAC,CAAC;IACJ;IAEQ,UAAU,CAChB,OAAe,EACf,KAAa,EACb,OAAO,GAAG,CAAC,EACX,QAAQ,GAAG,CAAC,EAAA;AAEZ,QAAA,MAAM,KAAK,GAAG,CAAC,KAAa,EAAE,GAAW,KACvC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,GAAG,KAAK,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,KAAK,GAAG,CAAC,CAAC;QAE9D,MAAM,YAAY,GAAG,OAAO,GAAG,CAAC,GAAG,QAAQ,GAAG,CAAC,GAAG,CAAC;QACnD,IAAI,KAAK,IAAI,YAAY;AAAE,YAAA,OAAO,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC;AAEjD,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,OAAO,EAAE,QAAQ,GAAG,CAAC,CAAC;AAC7D,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,OAAO,EAAE,KAAK,GAAG,QAAQ,GAAG,CAAC,CAAC;AACtE,QAAA,MAAM,YAAY,GAAG,WAAW,GAAG,QAAQ,GAAG,CAAC;QAC/C,MAAM,aAAa,GAAG,YAAY,GAAG,KAAK,GAAG,QAAQ,GAAG,CAAC;QAEzD,MAAM,KAAK,GAAwB,EAAE;QACrC,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;AACjC,QAAA,IAAI,YAAY;AAAE,YAAA,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;;AAC9B,YAAA,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,QAAQ,GAAG,CAAC,EAAE,WAAW,GAAG,CAAC,CAAC,CAAC;QACxD,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;AAC/C,QAAA,IAAI,aAAa;AAAE,YAAA,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;;AAC/B,YAAA,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,YAAY,GAAG,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAC,CAAC;AAC7D,QAAA,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,GAAG,QAAQ,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;AACjD,QAAA,OAAO,KAAK;IACd;IAEU,IAAI,GAAA;QACZ,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;IAC7D;IACU,QAAQ,GAAA;QAChB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7C;IACU,KAAK,GAAA;AACb,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAClB;IACU,IAAI,GAAA;QACZ,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;IAClC;AACU,IAAA,IAAI,CAAC,IAAY,EAAA;QACzB,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;YAAE;AACpD,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;IACrB;AACU,IAAA,gBAAgB,CAAC,KAAa,EAAA;QACtC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAChC,QAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAClB;uGA3FW,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAb,aAAa,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,eAAA,EAAA,EAAA,iBAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,aAAA,EAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,IAAA,EAAA,YAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECtB1B,wwDAiDA,EAAA,MAAA,EAAA,CAAA,oyCAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,ED9BY,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,0BAAA,EAAA,QAAA,EAAA,0JAAA,EAAA,MAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAGV,aAAa,EAAA,UAAA,EAAA,CAAA;kBARzB,SAAS;+BACE,gBAAgB,EAAA,UAAA,EACd,IAAI,EAAA,OAAA,EAGP,CAAC,WAAW,CAAC,EAAA,eAAA,EACL,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,wwDAAA,EAAA,MAAA,EAAA,CAAA,oyCAAA,CAAA,EAAA;;;AEcjD;;;;;;;;;;;;;AAaG;MAYU,QAAQ,CAAA;AACA,IAAA,MAAM,GAAG,MAAM,CAAC,gBAAgB,CAAC;AACjC,IAAA,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC;AAC/B,IAAA,gBAAgB,GAAG,MAAM,CAAC,qBAAqB,CAAC;;IAG1D,MAAM,GAAG,KAAK,CAAC,QAAQ;+EAAwB;IAC/C,IAAI,GAAG,KAAK,CAAC,QAAQ;6EAAgB;IACrC,YAAY,GAAG,KAAK,CAAC,QAAQ;qFAAU;AACvC,IAAA,gBAAgB,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB;yFAAC;AACtD,IAAA,UAAU,GAAG,KAAK;8FAAiC;IACnD,cAAc,GAAG,KAAK,CAAC,EAAE;uFAAC;IAC1B,QAAQ,GAAG,KAAK,CAAC,EAAE;iFAAC;AACpB,IAAA,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,eAAe;iFAAC;IACvD,IAAI,GAAG,KAAK,CAAC,CAAC;6EAAC;IACf,UAAU,GAAG,MAAM,EAAU;IAC7B,OAAO,GAAG,KAAK,CAAC,KAAK;gFAAC;IACtB,SAAS,GAAG,KAAK,CAAsB,SAAS;kFAAC;AACjD,IAAA,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI;6EAAC;AAC9B,IAAA,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS;kFAAC;AACjD;AAC4D;IACnD,OAAO,GAAG,KAAK,CAAqC,CAAC,KAAK,KAAK,KAAK;gFAAC;;IAGrE,QAAQ,GAAG,MAAM,EAAoB;IACrC,UAAU,GAAG,MAAM,EAAiB;IACpC,YAAY,GAAG,MAAM,EAAoC;;IAG/C,SAAS,GAAG,MAAM,CAAC,CAAC;kFAAC;AACrB,IAAA,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,eAAe;kFAAC;IACzD,KAAK,GAAG,MAAM,CAAgB,EAAE;8EAAC;IACjC,MAAM,GAAG,MAAM,CAAyB,EAAE;+EAAC;AAC7C,IAAA,eAAe,GAAG,IAAI,GAAG,EAAU;AACnC,IAAA,mBAAmB,GAAG,IAAI,GAAG,EAG3C;AAEiC,IAAA,aAAa;AACzC,IAAA,WAAW,GAAG,IAAI,GAAG,EAA+C;AAEzD,IAAA,iBAAiB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS;0FAAC;AAC/E,IAAA,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAC3C,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IAC7B,iBAAiB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE;0FAAC;AACxF,IAAA,WAAA,GAAA;QACE,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE;AAC1B,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;AACtB,YAAA,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE;AACtB,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;AACxB,QAAA,CAAC,CAAC;;;;;;;;QASF,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE;AAC1B,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE;YAC7B,IAAI,OAAO,GAAG,KAAK;AACnB,YAAA,MAAM,IAAI,GAAG,EAAE,GAAG,OAAO,EAAE;AAC3B,YAAA,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE;gBACpB,IAAI,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;oBAAE;AACxC,gBAAA,IAAI,CAAC,CAAC,MAAM,IAAI,IAAI;oBAAE;AACtB,gBAAA,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,EAAE;oBAC/B,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK;oBACxB,OAAO,GAAG,IAAI;gBAChB;YACF;AACA,YAAA,IAAI,OAAO;AAAE,gBAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;AACpC,QAAA,CAAC,CAAC;IACJ;IAEA,QAAQ,GAAA;;;;;IAKR;IAEA,kBAAkB,GAAA;QAChB,IAAI,CAAC,eAAe,EAAE;;;;QAItB,IAAI,CAAC,aAAa,CAAC;AAChB,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;aACxC,SAAS,CAAC,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;IAC5C;IAEQ,eAAe,GAAA;AACrB,QAAA,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE;QACxB,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,IAAI,KAAI;;AAElC,YAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,WAAW,CAAC;AACvD,QAAA,CAAC,CAAC;IACJ;;AAGmB,IAAA,UAAU,GAAG,QAAQ,CAAe,MAAK;QAC1D,IAAI,IAAI,CAAC,IAAI,EAAE;AAAE,YAAA,OAAO,IAAI,CAAC,IAAI,EAAE;AACnC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE;AAC1B,QAAA,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,IAAI,CAAC,IAAI,EAAE;QAC1C,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC7B,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAI;AACjB,YAAA,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE;gBACrB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;gBAChD,IAAI,GAAG,KAAK,CAAC;AAAE,oBAAA,OAAO,CAAC,CAAC,SAAS,KAAK,KAAK,GAAG,GAAG,GAAG,CAAC,GAAG;YAC1D;AACA,YAAA,OAAO,CAAC;AACV,QAAA,CAAC,CAAC;AACF,QAAA,OAAO,IAAI;IACb,CAAC;mFAAC;IAEiB,UAAU,GAAG,QAAQ,CAAC,MACvC,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,YAAY,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM;mFACvD;AAEkB,IAAA,SAAS,GAAG,QAAQ,CAAe,MAAK;QACzD,IAAI,IAAI,CAAC,IAAI,EAAE;AAAE,YAAA,OAAO,IAAI,CAAC,UAAU,EAAE;AACzC,QAAA,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE;AACvD,QAAA,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;IACjE,CAAC;kFAAC;IAEM,OAAO,CAAC,CAAU,EAAE,CAAU,EAAA;AACpC,QAAA,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI;AAAE,YAAA,OAAO,CAAC;QACpC,IAAI,CAAC,IAAI,IAAI;YAAE,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,IAAI;AAAE,YAAA,OAAO,CAAC;QACvB,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,KAAK,QAAQ;YAAE,OAAO,CAAC,GAAG,CAAC;QAChE,IAAI,OAAO,CAAC,KAAK,SAAS,IAAI,OAAO,CAAC,KAAK,SAAS;YAAE,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AACrF,QAAA,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY,IAAI;YAAE,OAAO,CAAC,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,OAAO,EAAE;AAC5E,QAAA,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC3C;;AAGU,IAAA,YAAY,CAAC,QAAgB,EAAA;AACrC,QAAA,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,GAAG,QAAQ,GAAG,CAAC;IACjE;;AAGU,IAAA,gBAAgB,CAAC,MAAc,EAAA;QACvC,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,EAAE,SAAS,IAAI,IAAI;IACxE;IAEU,aAAa,CAAC,KAAyB,EAAE,KAAiB,EAAA;QAClE,IAAI,CAAC,KAAK,CAAC,QAAQ;YAAE;AACrB,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM;AAC3B,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,EAAE;AAC5B,QAAA,MAAM,aAAa,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC;QAClE,MAAM,cAAc,GAClB,IAAI,CAAC,iBAAiB,EAAE,KAAK,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC;AAEhF,QAAA,IAAI,IAAmB;QACvB,IAAI,cAAc,EAAE;AAClB,YAAA,IAAI,GAAG,CAAC,GAAG,OAAO,CAAC;AACnB,YAAA,IAAI,aAAa,KAAK,CAAC,CAAC,EAAE;AACxB,gBAAA,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;YAChD;iBAAO,IAAI,IAAI,CAAC,aAAa,CAAC,CAAC,SAAS,KAAK,KAAK,EAAE;AAClD,gBAAA,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE;YAC5D;iBAAO;AACL,gBAAA,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC;YAC/B;QACF;aAAO,IAAI,aAAa,KAAK,CAAC,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;AACrD,YAAA,IAAI,GAAG,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;QAC9C;aAAO,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,KAAK,KAAK,EAAE;AACzC,YAAA,IAAI,GAAG,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;QAC/C;aAAO;YACL,IAAI,GAAG,EAAE;QACX;AAEA,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;AACpB,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;QACrB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;AACtC,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;QAC1B,IAAI,CAAC,gBAAgB,EAAE;IACzB;;AAGU,IAAA,UAAU,CAAC,KAAgB,EAAA;QACnC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;QAC9B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC;QAClC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;QACtC,IAAI,CAAC,gBAAgB,EAAE;IACzB;IAEQ,gBAAgB,GAAA;AACtB,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YAAE;AAClB,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE;AAClC,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE;AACjC,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YACjB,SAAS;YACT,QAAQ;AACR,YAAA,KAAK,EAAE,CAAC,SAAS,GAAG,CAAC,IAAI,QAAQ;AACjC,YAAA,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE;AACnB,YAAA,OAAO,EAAE,IAAI,CAAC,KAAK;AACjB,kBAAE,GAAG,CAAC,CAAC,CAAC,KAAK,CAAA,EAAG,CAAC,CAAC,KAAK,CAAA,CAAA,EAAI,CAAC,CAAC,SAAS,EAAE;iBACvC,IAAI,CAAC,GAAG,CAAC;AACb,SAAA,CAAC;IACJ;;AAGU,IAAA,WAAW,CAAC,MAAc,EAAA;AAClC,QAAA,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,YAAY;IACjE;AACA;;;;;AAKG;AACO,IAAA,UAAU,CAAC,KAAyB,EAAA;QAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC;QAC3C,IAAI,OAAO,IAAI,IAAI;YAAE,OAAO,CAAA,IAAA,EAAO,OAAO,CAAA,EAAA,CAAI;AAC9C,QAAA,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ;AAAE,YAAA,OAAO,CAAA,IAAA,EAAO,KAAK,CAAC,KAAK,EAAE;AAChE,QAAA,OAAO,OAAO;IAChB;AACU,IAAA,SAAS,CAAC,KAAyB,EAAA;QAC3C,OAAO,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ;IACtD;AACU,IAAA,SAAS,CAAC,KAAyB,EAAA;QAC3C,OAAO,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ;IACtD;AACU,IAAA,WAAW,CAAC,KAAyB,EAAA;AAC7C,QAAA,OAAO,CAAC,KAAK,CAAC,SAAS,IAAI,IAAI,CAAC,SAAS,EAAE,MAAM,KAAK;IACxD;IACU,gBAAgB,CAAC,MAAc,EAAE,KAAa,EAAA;QACtD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,MAAM,GAAG,KAAK,EAAE,CAAC,CAAC;IACxD;IACU,iBAAiB,CAAC,MAAc,EAAE,KAAa,EAAA;AACvD,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC;QAChC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,MAAM,GAAG,KAAK,EAAE,CAAC,CAAC;AACtD,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAClD;;AAGU,IAAA,WAAW,CAAC,MAAc,EAAA;QAClC,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC;AAClD,QAAA,IAAI,aAAa;AAAE,YAAA,OAAO,aAAa;QAEvC,MAAM,eAAe,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,EAAE,YAAY;QACpF,OAAO,eAAe,IAAI,IAAI;IAChC;AAEU,IAAA,WAAW,CAAC,KAAyB,EAAA;QAC7C,IAAI,CAAC,KAAK,CAAC,QAAQ;AAAE,YAAA,OAAO,IAAI;;;AAGhC,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,QAAkB,CAAC,IAAI,IAAI;IAChE;IAEU,YAAY,CAAC,GAAM,EAAE,KAAyB,EAAA;AACtD,QAAA,OAAO,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC;IAC1B;IAEU,eAAe,CAAC,GAAM,EAAE,KAAyB,EAAA;QACzD,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC;AAE3C,QAAA,IAAI,OAAO,KAAK,CAAC,SAAS,KAAK,UAAU,EAAE;AACzC,YAAA,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QAC3D;AACA,QAAA,IAAI,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ,EAAE;AACvC,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC;AACzD,YAAA,IAAI,SAAS;AAAE,gBAAA,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QACpE;AACA,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;IAC9B;AAEQ,IAAA,SAAS,CAAC,KAAc,EAAA;AAC9B,QAAA,OAAO,KAAK,IAAI,IAAI,GAAG,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC;IAC3C;AAEA;;AAEsE;IAC5D,iBAAiB,CAAC,GAAM,EAAE,KAAyB,EAAA;QAC3D,IAAI,UAAU,GAAG,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC;QACpD,IAAI,CAAC,UAAU,EAAE;AACf,YAAA,UAAU,GAAG,IAAI,OAAO,EAAE;YAC1B,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,KAAK,EAAE,UAAU,CAAC;QACjD;QACA,IAAI,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC;QAChC,IAAI,CAAC,MAAM,EAAE;AACX,YAAA,MAAM,GAAG;gBACP,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC;gBACpC,GAAG;gBACH,KAAK;AACL,gBAAA,IAAI,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC,cAAc,GAAG,SAAS,CAAC;aACvD;AACD,YAAA,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC;QAC7B;AACA,QAAA,OAAO,MAAM;IACf;uGAzSW,QAAQ,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAR,QAAQ,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,YAAA,EAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,gBAAA,EAAA,EAAA,iBAAA,EAAA,kBAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,EAAA,iBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,gBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,QAAA,EAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,UAAA,EAAA,UAAA,EAAA,YAAA,EAAA,YAAA,EAAA,cAAA,EAAA,EAAA,IAAA,EAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,EAAA,OAAA,EAAA,CAAA,EAAA,YAAA,EAAA,eAAA,EAAA,SAAA,EAwCF,SAAS,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,ECnG5B,2oNAkKA,2uHD7GY,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,mBAAA,EAAA,yBAAA,EAAA,2BAAA,EAAA,sCAAA,EAAA,0BAAA,EAAA,2BAAA,CAAA,EAAA,QAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,aAAa,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,EAAA,gBAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,YAAY,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,sBAAA,EAAA,oBAAA,EAAA,oBAAA,EAAA,oBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,WAAA,CAAA,EAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;2FAMxC,QAAQ,EAAA,UAAA,EAAA,CAAA;kBAXpB,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,WAAW,EAAA,UAAA,EACT,IAAI,EAAA,OAAA,EAGP,CAAC,YAAY,EAAE,aAAa,EAAE,YAAY,CAAC,EAAA,eAAA,EACnC,uBAAuB,CAAC,MAAM,EAAA,IAAA,EACzC;AACJ,wBAAA,KAAK,EAAE,gBAAgB;AACxB,qBAAA,EAAA,QAAA,EAAA,2oNAAA,EAAA,MAAA,EAAA,CAAA,orHAAA,CAAA,EAAA;;sBA0CA,eAAe;uBAAC,SAAS;;;AEnG5B;;ACAA;;AAEG;;;;"}
@@ -147,7 +147,7 @@ let uidCounter = 0;
147
147
  function nextId() {
148
148
  return `ngx-dz-${Date.now().toString(36)}-${uidCounter++}`;
149
149
  }
150
- class NgxDropzoneComponent {
150
+ class NgxDropzone {
151
151
  /** الگوی accept مثل input[type=file]: "image/*", ".pdf,.docx" و ... */
152
152
  accept = input('', /* @ts-ignore */
153
153
  ...(ngDevMode ? [{ debugName: "accept" }] : /* istanbul ignore next */ []));
@@ -499,10 +499,10 @@ class NgxDropzoneComponent {
499
499
  emitCurrentFiles() {
500
500
  this.filesChange.emit(this.files().map((f) => f.file));
501
501
  }
502
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NgxDropzoneComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
503
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.4", type: NgxDropzoneComponent, isStandalone: true, selector: "ngx-dropzone", inputs: { accept: { classPropertyName: "accept", publicName: "accept", isSignal: true, isRequired: false, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, maxFileSize: { classPropertyName: "maxFileSize", publicName: "maxFileSize", isSignal: true, isRequired: false, transformFunction: null }, maxFiles: { classPropertyName: "maxFiles", publicName: "maxFiles", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, showFileList: { classPropertyName: "showFileList", publicName: "showFileList", isSignal: true, isRequired: false, transformFunction: null }, uploadUrl: { classPropertyName: "uploadUrl", publicName: "uploadUrl", isSignal: true, isRequired: false, transformFunction: null }, uploadAlias: { classPropertyName: "uploadAlias", publicName: "uploadAlias", isSignal: true, isRequired: false, transformFunction: null }, autoUpload: { classPropertyName: "autoUpload", publicName: "autoUpload", isSignal: true, isRequired: false, transformFunction: null }, maxParallel: { classPropertyName: "maxParallel", publicName: "maxParallel", isSignal: true, isRequired: false, transformFunction: null }, uploadMode: { classPropertyName: "uploadMode", publicName: "uploadMode", isSignal: true, isRequired: false, transformFunction: null }, uploadData: { classPropertyName: "uploadData", publicName: "uploadData", isSignal: true, isRequired: false, transformFunction: null }, uploadHeaders: { classPropertyName: "uploadHeaders", publicName: "uploadHeaders", isSignal: true, isRequired: false, transformFunction: null }, uploadWithCredentials: { classPropertyName: "uploadWithCredentials", publicName: "uploadWithCredentials", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { filesAdded: "filesAdded", filesRejected: "filesRejected", filesChange: "filesChange", uploadStarted: "uploadStarted", uploadProgress: "uploadProgress", uploadSuccess: "uploadSuccess", uploadError: "uploadError" }, host: { classAttribute: "ngx-dropzone-host" }, viewQueries: [{ propertyName: "fileInput", first: true, predicate: ["fileInput"], descendants: true, isSignal: true }], ngImport: i0, template: "<div\n class=\"ngx-dropzone\"\n [class.dragging]=\"isDragging()\"\n [class.disabled]=\"disabled()\"\n [class.has-files]=\"files().length > 0\"\n tabindex=\"0\"\n role=\"button\"\n [attr.aria-disabled]=\"disabled()\"\n (click)=\"onBrowseClick()\"\n (keydown)=\"onKeydown($event)\"\n (dragenter)=\"onDragEnter($event)\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\">\n <input\n #fileInput\n type=\"file\"\n class=\"ngx-dropzone-input\"\n [accept]=\"accept()\"\n [multiple]=\"multiple()\"\n [disabled]=\"disabled()\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"onFileInputChange($event)\" />\n\n <div class=\"ngx-dropzone-icon-wrap\">\n <ng-content select=\"[dropzone-icon]\">\n <svg class=\"ngx-dropzone-icon\" viewBox=\"0 0 24 24\" fill=\"none\" width=\"30\" height=\"30\">\n <path\n d=\"M12 16V4M12 4l-4 4M12 4l4 4M4 16v2a2 2 0 002 2h12a2 2 0 002-2v-2\"\n stroke=\"currentColor\"\n stroke-width=\"1.8\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </ng-content>\n </div>\n\n <div class=\"ngx-dropzone-text\">\n <ng-content>\n <strong>Drop files here</strong>\n <span>or click to browse</span>\n </ng-content>\n </div>\n\n @if (hint()) {\n <div class=\"ngx-dropzone-hint\">{{ hint() }}</div>\n }\n</div>\n\n@if (!autoUpload() && uploadMode() === 'all' && pendingCount() > 0) {\n <div class=\"ngx-dropzone-actions\">\n <button\n type=\"button\"\n class=\"ngx-dropzone-upload-all\"\n [disabled]=\"disabled() || !hasUploadConfiguration()\"\n (click)=\"uploadAll(); $event.stopPropagation()\">\n Upload all\n <span>{{ pendingCount() }}</span>\n </button>\n </div>\n}\n\n@if (showFileList() && files().length) {\n <ul class=\"ngx-dropzone-list\">\n @for (item of files(); track item.id) {\n <li class=\"ngx-dropzone-item\" [class.is-uploading]=\"item.status === 'uploading'\">\n <div class=\"ngx-dropzone-thumb-wrap\">\n @if (item.previewUrl) {\n <img class=\"ngx-dropzone-thumb\" [src]=\"item.previewUrl\" [alt]=\"item.file.name\" />\n } @else {\n <span class=\"ngx-dropzone-file-icon\">\uD83D\uDCC4</span>\n }\n </div>\n\n <div class=\"ngx-dropzone-meta\">\n <span class=\"ngx-dropzone-name\" [title]=\"item.file.name\">{{ item.file.name }}</span>\n <span class=\"ngx-dropzone-size\">{{ formatSize(item.file.size) }}</span>\n\n @if (item.status === 'uploading' || item.status === 'uploaded') {\n <div\n class=\"ngx-dropzone-progress\"\n role=\"progressbar\"\n [attr.aria-valuenow]=\"item.progress\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n [attr.aria-label]=\"'Upload progress for ' + item.file.name\">\n <span class=\"ngx-dropzone-progress-bar\" [style.width.%]=\"item.progress\"></span>\n </div>\n <span class=\"ngx-dropzone-progress-text\">{{ item.progress }}%</span>\n }\n\n @if (item.status === 'error') {\n <span class=\"ngx-dropzone-error\">Upload failed</span>\n }\n </div>\n\n <div class=\"ngx-dropzone-row-actions\">\n @if (!autoUpload() && uploadMode() === 'single' && isPending(item)) {\n <button\n type=\"button\"\n class=\"ngx-dropzone-upload\"\n [disabled]=\"disabled() || !hasUploadConfiguration()\"\n [attr.aria-label]=\"'Upload ' + item.file.name\"\n (click)=\"uploadSingle(item.id); $event.stopPropagation()\">\n Upload\n </button>\n }\n\n @if (item.status === 'error') {\n <button\n type=\"button\"\n class=\"ngx-dropzone-retry\"\n [disabled]=\"disabled() || !hasUploadConfiguration()\"\n [attr.aria-label]=\"'Retry upload for ' + item.file.name\"\n (click)=\"retryUpload(item.id); $event.stopPropagation()\">\n Retry\n </button>\n }\n\n @if (item.status === 'uploaded') {\n <span class=\"ngx-dropzone-status success\" aria-label=\"Uploaded\">\u2713</span>\n } @else if (item.status === 'uploading') {\n <span class=\"ngx-dropzone-status uploading\" aria-label=\"Uploading\"></span>\n } @else if (item.status === 'error') {\n <span class=\"ngx-dropzone-status error\" aria-label=\"Upload failed\">!</span>\n } @else {\n <span class=\"ngx-dropzone-status pending\" aria-label=\"Pending\">\u2022</span>\n }\n\n <button\n type=\"button\"\n class=\"ngx-dropzone-remove\"\n [attr.aria-label]=\"'Remove ' + item.file.name\"\n (click)=\"removeFile(item.id); $event.stopPropagation()\">\n \u2715\n </button>\n </div>\n </li>\n }\n </ul>\n}\n", styles: ["@charset \"UTF-8\";:host{display:block}.ngx-dropzone{position:relative;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.65rem;padding:2.25rem 1.5rem;border-radius:16px;cursor:pointer;text-align:center;overflow:hidden;background:light-dark(#fafbfc,#1a1a1e);border:2px dashed light-dark(#d6dae1,#35353c);transition:border-color .2s ease,background-color .2s ease,transform .2s cubic-bezier(.34,1.56,.64,1),box-shadow .2s ease}.ngx-dropzone:before{content:\"\";position:absolute;inset:0;background:radial-gradient(circle at 50% 0%,light-dark(rgba(37,99,235,.06),rgba(59,130,246,.1)),transparent 65%);opacity:0;transition:opacity .2s ease;pointer-events:none}.ngx-dropzone:hover:not(.disabled){border-color:light-dark(#93c5fd,#3b82f6);box-shadow:0 4px 18px light-dark(rgba(37,99,235,.08),rgba(0,0,0,.35))}.ngx-dropzone:hover:not(.disabled):before{opacity:1}.ngx-dropzone:focus-visible{outline:2px solid light-dark(#2563eb,#60a5fa);outline-offset:3px}.ngx-dropzone.dragging{border-color:light-dark(#2563eb,#60a5fa);border-style:solid;background:light-dark(#eff6ff,#16213a);transform:scale(1.015);box-shadow:0 8px 28px light-dark(rgba(37,99,235,.18),rgba(59,130,246,.25))}.ngx-dropzone.dragging:before{opacity:1}.ngx-dropzone.dragging .ngx-dropzone-icon-wrap{transform:translateY(-4px) scale(1.08)}.ngx-dropzone.disabled{cursor:not-allowed;opacity:.55}.ngx-dropzone.has-files{padding-block:1.5rem}.ngx-dropzone-input{position:absolute;inset-inline-start:-9999px;width:1px;height:1px;opacity:0}.ngx-dropzone-icon-wrap{display:flex;align-items:center;justify-content:center;inline-size:56px;block-size:56px;border-radius:50%;background:light-dark(#eef2ff,#232433);color:light-dark(#4f46e5,#818cf8);transition:transform .22s cubic-bezier(.34,1.56,.64,1);z-index:1}.ngx-dropzone-text{z-index:1;display:flex;flex-direction:column;gap:.15rem}.ngx-dropzone-text strong{font-size:.92rem;font-weight:600;color:light-dark(#1f2937,#e4e4e7)}.ngx-dropzone-text span{font-size:.8rem;color:light-dark(#9ca3af,#71717a)}.ngx-dropzone-hint{z-index:1;font-size:.72rem;color:light-dark(#9ca3af,#6b7280);background:light-dark(#f3f4f6,#232327);padding:.15rem .6rem;border-radius:999px}.ngx-dropzone-list{list-style:none;margin:.85rem 0 0;padding:0;display:flex;flex-direction:column;gap:.45rem}.ngx-dropzone-item{display:flex;align-items:center;gap:.7rem;padding:.5rem .6rem;border-radius:10px;background:light-dark(#ffffff,#1f1f24);border:1px solid light-dark(#eef0f3,#2d2d33);transition:transform .16s ease,box-shadow .16s ease;animation:ngx-dropzone-item-in .22s cubic-bezier(.22,.9,.32,1) both}.ngx-dropzone-item:hover{box-shadow:0 2px 10px light-dark(rgba(0,0,0,.06),rgba(0,0,0,.4))}@keyframes ngx-dropzone-item-in{0%{opacity:0;transform:translateY(-6px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}.ngx-dropzone-thumb-wrap{flex-shrink:0;inline-size:38px;block-size:38px;border-radius:8px;overflow:hidden;background:light-dark(#f4f4f5,#29292f);display:flex;align-items:center;justify-content:center}.ngx-dropzone-thumb{inline-size:100%;block-size:100%;object-fit:cover}.ngx-dropzone-file-icon{font-size:1.1rem}.ngx-dropzone-meta{flex:1;min-inline-size:0;display:flex;flex-direction:column;gap:.1rem}.ngx-dropzone-name{font-size:.8rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:light-dark(#1f2937,#e4e4e7)}.ngx-dropzone-size{font-size:.7rem;color:light-dark(#9ca3af,#71717a)}.ngx-dropzone-status{flex-shrink:0;inline-size:20px;block-size:20px;border-radius:50%;background:light-dark(#dcfce7,#14532d);color:light-dark(#16a34a,#4ade80);font-size:.7rem;display:flex;align-items:center;justify-content:center}.ngx-dropzone-remove{flex-shrink:0;appearance:none;border:none;background:transparent;cursor:pointer;color:light-dark(#9ca3af,#71717a);font-size:.8rem;line-height:1;padding:.3rem;border-radius:6px;transition:background-color .14s ease,color .14s ease}.ngx-dropzone-remove:hover{color:light-dark(#dc2626,#f87171);background:light-dark(#fee2e2,#3f1d1d)}.ngx-dropzone-actions{display:flex;justify-content:flex-end;margin-top:.7rem}.ngx-dropzone-upload-all,.ngx-dropzone-upload,.ngx-dropzone-retry{appearance:none;border:1px solid light-dark(#dbe3f0,#3b3b45);border-radius:7px;background:light-dark(#2563eb,#3b82f6);color:#fff;cursor:pointer;font:inherit;font-size:.75rem;font-weight:600;padding:.35rem .65rem;transition:opacity .14s ease,transform .14s ease}.ngx-dropzone-upload:hover:not(:disabled),.ngx-dropzone-upload-all:hover:not(:disabled),.ngx-dropzone-retry:hover:not(:disabled){transform:translateY(-1px)}.ngx-dropzone-upload-all:disabled,.ngx-dropzone-upload:disabled,.ngx-dropzone-retry:disabled{cursor:not-allowed;opacity:.5}.ngx-dropzone-upload-all{display:inline-flex;align-items:center;gap:.45rem}.ngx-dropzone-upload-all span{min-inline-size:1.15rem;block-size:1.15rem;display:inline-flex;align-items:center;justify-content:center;border-radius:999px;background:#ffffff2e}.ngx-dropzone-retry{background:transparent;color:light-dark(#dc2626,#f87171)}.ngx-dropzone-row-actions{flex-shrink:0;display:flex;align-items:center;gap:.35rem}.ngx-dropzone-item.is-uploading .ngx-dropzone-status.uploading{animation:ngx-dropzone-upload-pulse 1.1s ease-in-out infinite}.ngx-dropzone-status.pending{background:light-dark(#f4f4f5,#29292f);color:light-dark(#a1a1aa,#71717a)}.ngx-dropzone-status.uploading{background:light-dark(#dbeafe,#172554);border:3px solid light-dark(#93c5fd,#3b82f6)}.ngx-dropzone-status.error{background:light-dark(#fee2e2,#450a0a);color:light-dark(#dc2626,#f87171);font-weight:700}.ngx-dropzone-status.success{background:light-dark(#dcfce7,#14532d);color:light-dark(#16a34a,#4ade80)}.ngx-dropzone-progress{position:relative;inline-size:100%;block-size:4px;margin-top:.35rem;overflow:hidden;border-radius:999px;background:light-dark(#e5e7eb,#303038)}.ngx-dropzone-progress-bar{display:block;block-size:100%;border-radius:inherit;background:light-dark(#2563eb,#60a5fa);transition:width .12s linear}.ngx-dropzone-progress-text{font-size:.65rem;color:light-dark(#6b7280,#a1a1aa)}.ngx-dropzone-error{font-size:.65rem;color:light-dark(#dc2626,#f87171)}@keyframes ngx-dropzone-upload-pulse{50%{opacity:.45}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
502
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NgxDropzone, deps: [], target: i0.ɵɵFactoryTarget.Component });
503
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.4", type: NgxDropzone, isStandalone: true, selector: "ngx-dropzone", inputs: { accept: { classPropertyName: "accept", publicName: "accept", isSignal: true, isRequired: false, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, maxFileSize: { classPropertyName: "maxFileSize", publicName: "maxFileSize", isSignal: true, isRequired: false, transformFunction: null }, maxFiles: { classPropertyName: "maxFiles", publicName: "maxFiles", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, showFileList: { classPropertyName: "showFileList", publicName: "showFileList", isSignal: true, isRequired: false, transformFunction: null }, uploadUrl: { classPropertyName: "uploadUrl", publicName: "uploadUrl", isSignal: true, isRequired: false, transformFunction: null }, uploadAlias: { classPropertyName: "uploadAlias", publicName: "uploadAlias", isSignal: true, isRequired: false, transformFunction: null }, autoUpload: { classPropertyName: "autoUpload", publicName: "autoUpload", isSignal: true, isRequired: false, transformFunction: null }, maxParallel: { classPropertyName: "maxParallel", publicName: "maxParallel", isSignal: true, isRequired: false, transformFunction: null }, uploadMode: { classPropertyName: "uploadMode", publicName: "uploadMode", isSignal: true, isRequired: false, transformFunction: null }, uploadData: { classPropertyName: "uploadData", publicName: "uploadData", isSignal: true, isRequired: false, transformFunction: null }, uploadHeaders: { classPropertyName: "uploadHeaders", publicName: "uploadHeaders", isSignal: true, isRequired: false, transformFunction: null }, uploadWithCredentials: { classPropertyName: "uploadWithCredentials", publicName: "uploadWithCredentials", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { filesAdded: "filesAdded", filesRejected: "filesRejected", filesChange: "filesChange", uploadStarted: "uploadStarted", uploadProgress: "uploadProgress", uploadSuccess: "uploadSuccess", uploadError: "uploadError" }, host: { classAttribute: "ngx-dropzone-host" }, viewQueries: [{ propertyName: "fileInput", first: true, predicate: ["fileInput"], descendants: true, isSignal: true }], ngImport: i0, template: "<div\n class=\"ngx-dropzone\"\n [class.dragging]=\"isDragging()\"\n [class.disabled]=\"disabled()\"\n [class.has-files]=\"files().length > 0\"\n tabindex=\"0\"\n role=\"button\"\n [attr.aria-disabled]=\"disabled()\"\n (click)=\"onBrowseClick()\"\n (keydown)=\"onKeydown($event)\"\n (dragenter)=\"onDragEnter($event)\"\n (dragover)=\"onDragOver($event)\"\n (dragleave)=\"onDragLeave($event)\"\n (drop)=\"onDrop($event)\">\n <input\n #fileInput\n type=\"file\"\n class=\"ngx-dropzone-input\"\n [accept]=\"accept()\"\n [multiple]=\"multiple()\"\n [disabled]=\"disabled()\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"onFileInputChange($event)\" />\n\n <div class=\"ngx-dropzone-icon-wrap\">\n <ng-content select=\"[dropzone-icon]\">\n <svg class=\"ngx-dropzone-icon\" viewBox=\"0 0 24 24\" fill=\"none\" width=\"30\" height=\"30\">\n <path\n d=\"M12 16V4M12 4l-4 4M12 4l4 4M4 16v2a2 2 0 002 2h12a2 2 0 002-2v-2\"\n stroke=\"currentColor\"\n stroke-width=\"1.8\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\" />\n </svg>\n </ng-content>\n </div>\n\n <div class=\"ngx-dropzone-text\">\n <ng-content>\n <strong>Drop files here</strong>\n <span>or click to browse</span>\n </ng-content>\n </div>\n\n @if (hint()) {\n <div class=\"ngx-dropzone-hint\">{{ hint() }}</div>\n }\n</div>\n\n@if (!autoUpload() && uploadMode() === 'all' && pendingCount() > 0) {\n <div class=\"ngx-dropzone-actions\">\n <button\n type=\"button\"\n class=\"ngx-dropzone-upload-all\"\n [disabled]=\"disabled() || !hasUploadConfiguration()\"\n (click)=\"uploadAll(); $event.stopPropagation()\">\n Upload all\n <span>{{ pendingCount() }}</span>\n </button>\n </div>\n}\n\n@if (showFileList() && files().length) {\n <ul class=\"ngx-dropzone-list\">\n @for (item of files(); track item.id) {\n <li class=\"ngx-dropzone-item\" [class.is-uploading]=\"item.status === 'uploading'\">\n <div class=\"ngx-dropzone-thumb-wrap\">\n @if (item.previewUrl) {\n <img class=\"ngx-dropzone-thumb\" [src]=\"item.previewUrl\" [alt]=\"item.file.name\" />\n } @else {\n <span class=\"ngx-dropzone-file-icon\">\uD83D\uDCC4</span>\n }\n </div>\n\n <div class=\"ngx-dropzone-meta\">\n <span class=\"ngx-dropzone-name\" [title]=\"item.file.name\">{{ item.file.name }}</span>\n <span class=\"ngx-dropzone-size\">{{ formatSize(item.file.size) }}</span>\n\n @if (item.status === 'uploading' || item.status === 'uploaded') {\n <div\n class=\"ngx-dropzone-progress\"\n role=\"progressbar\"\n [attr.aria-valuenow]=\"item.progress\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n [attr.aria-label]=\"'Upload progress for ' + item.file.name\">\n <span class=\"ngx-dropzone-progress-bar\" [style.width.%]=\"item.progress\"></span>\n </div>\n <span class=\"ngx-dropzone-progress-text\">{{ item.progress }}%</span>\n }\n\n @if (item.status === 'error') {\n <span class=\"ngx-dropzone-error\">Upload failed</span>\n }\n </div>\n\n <div class=\"ngx-dropzone-row-actions\">\n @if (!autoUpload() && uploadMode() === 'single' && isPending(item)) {\n <button\n type=\"button\"\n class=\"ngx-dropzone-upload\"\n [disabled]=\"disabled() || !hasUploadConfiguration()\"\n [attr.aria-label]=\"'Upload ' + item.file.name\"\n (click)=\"uploadSingle(item.id); $event.stopPropagation()\">\n Upload\n </button>\n }\n\n @if (item.status === 'error') {\n <button\n type=\"button\"\n class=\"ngx-dropzone-retry\"\n [disabled]=\"disabled() || !hasUploadConfiguration()\"\n [attr.aria-label]=\"'Retry upload for ' + item.file.name\"\n (click)=\"retryUpload(item.id); $event.stopPropagation()\">\n Retry\n </button>\n }\n\n @if (item.status === 'uploaded') {\n <span class=\"ngx-dropzone-status success\" aria-label=\"Uploaded\">\u2713</span>\n } @else if (item.status === 'uploading') {\n <span class=\"ngx-dropzone-status uploading\" aria-label=\"Uploading\"></span>\n } @else if (item.status === 'error') {\n <span class=\"ngx-dropzone-status error\" aria-label=\"Upload failed\">!</span>\n } @else {\n <span class=\"ngx-dropzone-status pending\" aria-label=\"Pending\">\u2022</span>\n }\n\n <button\n type=\"button\"\n class=\"ngx-dropzone-remove\"\n [attr.aria-label]=\"'Remove ' + item.file.name\"\n (click)=\"removeFile(item.id); $event.stopPropagation()\">\n \u2715\n </button>\n </div>\n </li>\n }\n </ul>\n}\n", styles: ["@charset \"UTF-8\";:host{display:block}.ngx-dropzone{position:relative;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.65rem;padding:2.25rem 1.5rem;border-radius:16px;cursor:pointer;text-align:center;overflow:hidden;background:light-dark(#fafbfc,#1a1a1e);border:2px dashed light-dark(#d6dae1,#35353c);transition:border-color .2s ease,background-color .2s ease,transform .2s cubic-bezier(.34,1.56,.64,1),box-shadow .2s ease}.ngx-dropzone:before{content:\"\";position:absolute;inset:0;background:radial-gradient(circle at 50% 0%,light-dark(rgba(37,99,235,.06),rgba(59,130,246,.1)),transparent 65%);opacity:0;transition:opacity .2s ease;pointer-events:none}.ngx-dropzone:hover:not(.disabled){border-color:light-dark(#93c5fd,#3b82f6);box-shadow:0 4px 18px light-dark(rgba(37,99,235,.08),rgba(0,0,0,.35))}.ngx-dropzone:hover:not(.disabled):before{opacity:1}.ngx-dropzone:focus-visible{outline:2px solid light-dark(#2563eb,#60a5fa);outline-offset:3px}.ngx-dropzone.dragging{border-color:light-dark(#2563eb,#60a5fa);border-style:solid;background:light-dark(#eff6ff,#16213a);transform:scale(1.015);box-shadow:0 8px 28px light-dark(rgba(37,99,235,.18),rgba(59,130,246,.25))}.ngx-dropzone.dragging:before{opacity:1}.ngx-dropzone.dragging .ngx-dropzone-icon-wrap{transform:translateY(-4px) scale(1.08)}.ngx-dropzone.disabled{cursor:not-allowed;opacity:.55}.ngx-dropzone.has-files{padding-block:1.5rem}.ngx-dropzone-input{position:absolute;inset-inline-start:-9999px;width:1px;height:1px;opacity:0}.ngx-dropzone-icon-wrap{display:flex;align-items:center;justify-content:center;inline-size:56px;block-size:56px;border-radius:50%;background:light-dark(#eef2ff,#232433);color:light-dark(#4f46e5,#818cf8);transition:transform .22s cubic-bezier(.34,1.56,.64,1);z-index:1}.ngx-dropzone-text{z-index:1;display:flex;flex-direction:column;gap:.15rem}.ngx-dropzone-text strong{font-size:.92rem;font-weight:600;color:light-dark(#1f2937,#e4e4e7)}.ngx-dropzone-text span{font-size:.8rem;color:light-dark(#9ca3af,#71717a)}.ngx-dropzone-hint{z-index:1;font-size:.72rem;color:light-dark(#9ca3af,#6b7280);background:light-dark(#f3f4f6,#232327);padding:.15rem .6rem;border-radius:999px}.ngx-dropzone-list{list-style:none;margin:.85rem 0 0;padding:0;display:flex;flex-direction:column;gap:.45rem}.ngx-dropzone-item{display:flex;align-items:center;gap:.7rem;padding:.5rem .6rem;border-radius:10px;background:light-dark(#ffffff,#1f1f24);border:1px solid light-dark(#eef0f3,#2d2d33);transition:transform .16s ease,box-shadow .16s ease;animation:ngx-dropzone-item-in .22s cubic-bezier(.22,.9,.32,1) both}.ngx-dropzone-item:hover{box-shadow:0 2px 10px light-dark(rgba(0,0,0,.06),rgba(0,0,0,.4))}@keyframes ngx-dropzone-item-in{0%{opacity:0;transform:translateY(-6px) scale(.98)}to{opacity:1;transform:translateY(0) scale(1)}}.ngx-dropzone-thumb-wrap{flex-shrink:0;inline-size:38px;block-size:38px;border-radius:8px;overflow:hidden;background:light-dark(#f4f4f5,#29292f);display:flex;align-items:center;justify-content:center}.ngx-dropzone-thumb{inline-size:100%;block-size:100%;object-fit:cover}.ngx-dropzone-file-icon{font-size:1.1rem}.ngx-dropzone-meta{flex:1;min-inline-size:0;display:flex;flex-direction:column;gap:.1rem}.ngx-dropzone-name{font-size:.8rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:light-dark(#1f2937,#e4e4e7)}.ngx-dropzone-size{font-size:.7rem;color:light-dark(#9ca3af,#71717a)}.ngx-dropzone-status{flex-shrink:0;inline-size:20px;block-size:20px;border-radius:50%;background:light-dark(#dcfce7,#14532d);color:light-dark(#16a34a,#4ade80);font-size:.7rem;display:flex;align-items:center;justify-content:center}.ngx-dropzone-remove{flex-shrink:0;appearance:none;border:none;background:transparent;cursor:pointer;color:light-dark(#9ca3af,#71717a);font-size:.8rem;line-height:1;padding:.3rem;border-radius:6px;transition:background-color .14s ease,color .14s ease}.ngx-dropzone-remove:hover{color:light-dark(#dc2626,#f87171);background:light-dark(#fee2e2,#3f1d1d)}.ngx-dropzone-actions{display:flex;justify-content:flex-end;margin-top:.7rem}.ngx-dropzone-upload-all,.ngx-dropzone-upload,.ngx-dropzone-retry{appearance:none;border:1px solid light-dark(#dbe3f0,#3b3b45);border-radius:7px;background:light-dark(#2563eb,#3b82f6);color:#fff;cursor:pointer;font:inherit;font-size:.75rem;font-weight:600;padding:.35rem .65rem;transition:opacity .14s ease,transform .14s ease}.ngx-dropzone-upload:hover:not(:disabled),.ngx-dropzone-upload-all:hover:not(:disabled),.ngx-dropzone-retry:hover:not(:disabled){transform:translateY(-1px)}.ngx-dropzone-upload-all:disabled,.ngx-dropzone-upload:disabled,.ngx-dropzone-retry:disabled{cursor:not-allowed;opacity:.5}.ngx-dropzone-upload-all{display:inline-flex;align-items:center;gap:.45rem}.ngx-dropzone-upload-all span{min-inline-size:1.15rem;block-size:1.15rem;display:inline-flex;align-items:center;justify-content:center;border-radius:999px;background:#ffffff2e}.ngx-dropzone-retry{background:transparent;color:light-dark(#dc2626,#f87171)}.ngx-dropzone-row-actions{flex-shrink:0;display:flex;align-items:center;gap:.35rem}.ngx-dropzone-item.is-uploading .ngx-dropzone-status.uploading{animation:ngx-dropzone-upload-pulse 1.1s ease-in-out infinite}.ngx-dropzone-status.pending{background:light-dark(#f4f4f5,#29292f);color:light-dark(#a1a1aa,#71717a)}.ngx-dropzone-status.uploading{background:light-dark(#dbeafe,#172554);border:3px solid light-dark(#93c5fd,#3b82f6)}.ngx-dropzone-status.error{background:light-dark(#fee2e2,#450a0a);color:light-dark(#dc2626,#f87171);font-weight:700}.ngx-dropzone-status.success{background:light-dark(#dcfce7,#14532d);color:light-dark(#16a34a,#4ade80)}.ngx-dropzone-progress{position:relative;inline-size:100%;block-size:4px;margin-top:.35rem;overflow:hidden;border-radius:999px;background:light-dark(#e5e7eb,#303038)}.ngx-dropzone-progress-bar{display:block;block-size:100%;border-radius:inherit;background:light-dark(#2563eb,#60a5fa);transition:width .12s linear}.ngx-dropzone-progress-text{font-size:.65rem;color:light-dark(#6b7280,#a1a1aa)}.ngx-dropzone-error{font-size:.65rem;color:light-dark(#dc2626,#f87171)}@keyframes ngx-dropzone-upload-pulse{50%{opacity:.45}}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
504
504
  }
505
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NgxDropzoneComponent, decorators: [{
505
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NgxDropzone, decorators: [{
506
506
  type: Component,
507
507
  args: [{ selector: 'ngx-dropzone', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, host: {
508
508
  class: 'ngx-dropzone-host',
@@ -513,5 +513,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImpor
513
513
  * Generated bundle index. Do not edit.
514
514
  */
515
515
 
516
- export { NGX_DROPZONE_UPLOAD_SERVICE, NgxDropzoneComponent, NgxDropzoneHttpUploadService, extractFilesFromDataTransfer, formatBytes, matchesAccept };
516
+ export { NGX_DROPZONE_UPLOAD_SERVICE, NgxDropzone, NgxDropzoneHttpUploadService, extractFilesFromDataTransfer, formatBytes, matchesAccept };
517
517
  //# sourceMappingURL=ngx-kit-dropzone.mjs.map