mn-angular-lib 1.0.76 → 1.0.77

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,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { InjectionToken, Provider, TemplateRef, OnInit, OnChanges, EventEmitter, ElementRef, OnDestroy, DoCheck, Type, ComponentRef, AfterViewInit, QueryList, ViewContainerRef, SimpleChanges, Signal, PipeTransform } from '@angular/core';
2
+ import { InjectionToken, Provider, TemplateRef, OnInit, OnChanges, EventEmitter, ElementRef, PipeTransform, OnDestroy, DoCheck, ChangeDetectorRef, Type, ComponentRef, AfterViewInit, QueryList, ViewContainerRef, SimpleChanges, Signal } from '@angular/core';
3
3
  export { TemplateRef, Type } from '@angular/core';
4
4
  import * as tailwind_variants from 'tailwind-variants';
5
5
  import { VariantProps } from 'tailwind-variants';
@@ -2123,6 +2123,46 @@ declare class MnSelect implements OnInit {
2123
2123
  static ɵcmp: i0.ɵɵComponentDeclaration<MnSelect, "mn-lib-select", never, { "props": { "alias": "props"; "required": true; }; }, {}, never, never, true, never>;
2124
2124
  }
2125
2125
 
2126
+ type MnSkeletonShape = 'rectangle' | 'circle' | 'text';
2127
+ type MnSkeletonProps = {
2128
+ shape?: MnSkeletonShape;
2129
+ animated?: boolean;
2130
+ width?: string;
2131
+ height?: string;
2132
+ };
2133
+
2134
+ declare class MnSkeleton {
2135
+ data: Partial<MnSkeletonProps>;
2136
+ readonly ariaHidden = "true";
2137
+ get hostClasses(): string;
2138
+ get width(): string | null;
2139
+ get height(): string | null;
2140
+ get isAnimated(): boolean;
2141
+ static ɵfac: i0.ɵɵFactoryDeclaration<MnSkeleton, never>;
2142
+ static ɵcmp: i0.ɵɵComponentDeclaration<MnSkeleton, "mn-skeleton", never, { "data": { "alias": "data"; "required": false; }; }, {}, never, never, true, never>;
2143
+ }
2144
+
2145
+ declare const mnSkeletonVariants: tailwind_variants.TVReturnType<{
2146
+ shape: {
2147
+ rectangle: string;
2148
+ circle: string;
2149
+ text: string;
2150
+ };
2151
+ }, undefined, "bg-base-300 relative overflow-hidden", {
2152
+ shape: {
2153
+ rectangle: string;
2154
+ circle: string;
2155
+ text: string;
2156
+ };
2157
+ }, undefined, tailwind_variants.TVReturnType<{
2158
+ shape: {
2159
+ rectangle: string;
2160
+ circle: string;
2161
+ text: string;
2162
+ };
2163
+ }, undefined, "bg-base-300 relative overflow-hidden", unknown, unknown, undefined>>;
2164
+ type MnSkeletonVariantProps = VariantProps<typeof mnSkeletonVariants>;
2165
+
2126
2166
  type PaginationStrategy = {
2127
2167
  hasMoreRows: boolean;
2128
2168
  loadMore: () => Promise<void>;
@@ -2136,6 +2176,339 @@ type OffsetPaginationStrategy = {
2136
2176
  pageSize: number;
2137
2177
  totalItems?: number;
2138
2178
  } & PaginationStrategy;
2179
+ type PaginationMode = 'none' | 'load-more' | 'paginated' | 'client-side-pagination' | 'infinite-scroll';
2180
+ type MnCollectionLabels = {
2181
+ loadMore?: string;
2182
+ /** Translation key for the "Load more" button label. */
2183
+ loadMoreKey?: string;
2184
+ rowsPerPage?: string;
2185
+ /** Translation key for the "Rows per page" label. */
2186
+ rowsPerPageKey?: string;
2187
+ };
2188
+ /**
2189
+ * Chrome shared by every MnLib collection component (table, list, grid):
2190
+ * data, search, pagination, loading/skeleton, empty state and i18n. Component
2191
+ * data sources ({@link import('../mn-table').TableDataSource},
2192
+ * {@link import('../mn-list').ListDataSource},
2193
+ * {@link import('../mn-grid').GridDataSource}) extend this with their own
2194
+ * rendering contract (columns / item template / card template).
2195
+ */
2196
+ type MnCollectionDataSource<T> = {
2197
+ dataRows: BehaviorSubject<T[]>;
2198
+ getID: (row: T) => string;
2199
+ emptyMessage: string;
2200
+ /** Translation key for the empty message. When set, the component resolves it via MnLanguageService. */
2201
+ emptyMessageKey?: string;
2202
+ emptyTemplate?: TemplateRef<unknown>;
2203
+ isDataLoading: boolean;
2204
+ /** Number of placeholder rows rendered while data is loading. Defaults to 5. */
2205
+ skeletonRowCount?: number;
2206
+ canSearch: boolean;
2207
+ searchPlaceholder?: string;
2208
+ /** Translation key for the search placeholder. When set, the component resolves it via MnLanguageService. */
2209
+ searchPlaceholderKey?: string;
2210
+ isInSearch?: (row: T, searchValue: string) => boolean;
2211
+ searchForAdditionalItems?: (searchValue: string) => Promise<T[]>;
2212
+ /**
2213
+ * Callback invoked when the user types in the search box (server-side search).
2214
+ * When provided, the component skips client-side filtering and delegates to the consumer.
2215
+ */
2216
+ onServerSearch?: (searchValue: string) => void;
2217
+ paginationMode?: PaginationMode;
2218
+ paginationStrategy?: PaginationStrategy;
2219
+ loadAdditionalRows?: () => Promise<T[]>;
2220
+ /** Number of items per page when paginationMode is 'paginated'. Defaults to 10. */
2221
+ pageSize?: number;
2222
+ /** Options for the page-size selector dropdown. Defaults to [5, 10, 25, 50]. */
2223
+ pageSizeOptions?: number[];
2224
+ /** Callback invoked when the user changes the page size via the dropdown. */
2225
+ onPageSizeChange?: (newSize: number) => void;
2226
+ /**
2227
+ * Total number of items on the server.
2228
+ * When set, pagination and infinite-scroll use this instead of filteredItems.length.
2229
+ */
2230
+ totalItems?: number;
2231
+ /**
2232
+ * Callback invoked when the user navigates to a different page.
2233
+ * When provided, the component delegates pagination to the consumer (server-side).
2234
+ */
2235
+ onPageChange?: (page: number) => void;
2236
+ /**
2237
+ * Callback invoked when the user scrolls to the bottom in infinite-scroll mode.
2238
+ * When provided, the component delegates loading more rows to the consumer (server-side).
2239
+ */
2240
+ onLoadMore?: () => void;
2241
+ labels?: MnCollectionLabels;
2242
+ };
2243
+ /**
2244
+ * Adds row/item selection to {@link MnCollectionDataSource}. Used by components
2245
+ * that support selection (table, list); grid intentionally omits it.
2246
+ */
2247
+ type MnSelectableCollectionDataSource<T> = MnCollectionDataSource<T> & {
2248
+ selectionMode?: 'none' | 'single' | 'multi';
2249
+ selectedRows?: BehaviorSubject<T[]>;
2250
+ /** IDs to pre-select when the component initializes. */
2251
+ initialSelectedIds?: string[];
2252
+ };
2253
+
2254
+ /**
2255
+ * A marker object used in config values to indicate that the value
2256
+ * should be resolved via the MnLanguageService.
2257
+ *
2258
+ * Example in mn-config.json5:
2259
+ * label: { $translate: "form.email.label" }
2260
+ */
2261
+ type MnTranslatable = {
2262
+ $translate: string;
2263
+ params?: Record<string, string | number>;
2264
+ };
2265
+ /**
2266
+ * A config value that is either a plain value or a translatable marker.
2267
+ */
2268
+ type MnConfigValue<T = string> = T | MnTranslatable;
2269
+ /**
2270
+ * A flat key-value map of translations for a single locale.
2271
+ * Supports nested keys via dot notation: "form.email.label"
2272
+ */
2273
+ type MnTranslationMap = Record<string, string>;
2274
+ /**
2275
+ * All loaded translations keyed by locale code (e.g. "en", "nl", "de").
2276
+ */
2277
+ type MnTranslations = Record<string, MnTranslationMap>;
2278
+ /**
2279
+ * Configuration for the language provider.
2280
+ */
2281
+ type MnLanguageConfig = {
2282
+ /** URL pattern for loading translation files. Use `{locale}` as placeholder. e.g. "assets/i18n/{locale}.json" */
2283
+ urlPattern: string;
2284
+ /** The default/fallback locale. */
2285
+ defaultLocale: string;
2286
+ /** Locales to preload at bootstrap. */
2287
+ preload?: string[];
2288
+ /**
2289
+ * Optional mapping of domain hostnames to locale codes.
2290
+ * When set, the service will use the current domain to determine the initial locale.
2291
+ * Example: { "example.nl": "nl", "example.de": "de", "example.com": "en" }
2292
+ */
2293
+ domainLocaleMap?: Record<string, string>;
2294
+ /** Whether to enable debug logging. */
2295
+ debug?: boolean;
2296
+ };
2297
+ /**
2298
+ * Type guard: checks whether a value is a translatable marker object.
2299
+ */
2300
+ declare function isTranslatable(value: unknown): value is MnTranslatable;
2301
+
2302
+ declare class MnLanguageService {
2303
+ private readonly http;
2304
+ private readonly appRef;
2305
+ private _translations;
2306
+ private _locale$;
2307
+ private _urlPattern;
2308
+ private _debug;
2309
+ /** Observable of the current active locale. */
2310
+ readonly locale$: Observable<string>;
2311
+ /** Current active locale. */
2312
+ get locale(): string;
2313
+ /**
2314
+ * Enable or disable debug logging.
2315
+ */
2316
+ setDebug(enabled: boolean): void;
2317
+ /**
2318
+ * Configure the URL pattern used to fetch translation files.
2319
+ * Use `{locale}` as placeholder, e.g. `"assets/i18n/{locale}.json"`.
2320
+ */
2321
+ configure(urlPattern: string): void;
2322
+ /**
2323
+ * Load translations for a locale from the configured URL pattern.
2324
+ * If translations are already loaded for this locale, this is a no-op.
2325
+ */
2326
+ loadLocale(locale: string): Promise<void>;
2327
+ /**
2328
+ * Switch the active locale. Loads translations if not yet loaded.
2329
+ */
2330
+ setLocale(locale: string): Promise<void>;
2331
+ /**
2332
+ * Register translations for a locale directly from code (no HTTP needed).
2333
+ */
2334
+ registerTranslations(locale: string, translations: MnTranslationMap): void;
2335
+ /**
2336
+ * Translate a key using the current locale, with optional parameter interpolation.
2337
+ * Falls back to the key itself if no translation is found.
2338
+ *
2339
+ * Interpolation replaces `{{paramName}}` with the provided value.
2340
+ */
2341
+ translate(key: string, params?: Record<string, string | number>): string;
2342
+ /**
2343
+ * Helper to retrieve a value from a potentially nested translation map using a dot-notated key.
2344
+ */
2345
+ private getValueFromMap;
2346
+ /**
2347
+ * Shorthand alias for `translate`.
2348
+ */
2349
+ t(key: string, params?: Record<string, string | number>): string;
2350
+ /**
2351
+ * Resolve the effective default locale from a domain-to-locale map.
2352
+ * Matches `window.location.hostname` against the map keys.
2353
+ * Returns the mapped locale, or the provided fallback if no match is found.
2354
+ */
2355
+ resolveLocaleForDomain(domainLocaleMap: Record<string, string> | undefined, fallback: string): string;
2356
+ static ɵfac: i0.ɵɵFactoryDeclaration<MnLanguageService, never>;
2357
+ static ɵprov: i0.ɵɵInjectableDeclaration<MnLanguageService>;
2358
+ }
2359
+
2360
+ /**
2361
+ * Provides an APP_INITIALIZER that configures the MnLanguageService and
2362
+ * preloads the requested locales during application bootstrap.
2363
+ *
2364
+ * Usage in app.config.ts:
2365
+ * ...provideMnLanguage({
2366
+ * urlPattern: 'assets/i18n/{locale}.json',
2367
+ * defaultLocale: 'en',
2368
+ * preload: ['en', 'nl'],
2369
+ * })
2370
+ */
2371
+ declare function provideMnLanguage(config: MnLanguageConfig): Provider[];
2372
+
2373
+ /**
2374
+ * Pipe that translates a key via MnLanguageService.
2375
+ *
2376
+ * Usage in templates:
2377
+ * {{ 'form.email.label' | mnTranslate }}
2378
+ * {{ 'greeting' | mnTranslate:{ name: 'World' } }}
2379
+ *
2380
+ * Note: This pipe is impure so it re-evaluates when the locale changes.
2381
+ */
2382
+ declare class MnTranslatePipe implements PipeTransform {
2383
+ private readonly lang;
2384
+ transform(key: string, params?: Record<string, string | number>): string;
2385
+ static ɵfac: i0.ɵɵFactoryDeclaration<MnTranslatePipe, never>;
2386
+ static ɵpipe: i0.ɵɵPipeDeclaration<MnTranslatePipe, "mnTranslate", true>;
2387
+ }
2388
+
2389
+ /**
2390
+ * Shared chrome for MnLib collection components (table, list, grid):
2391
+ * data subscription, client/server search, every pagination mode, load-more,
2392
+ * skeleton-row count, empty-state plumbing, common i18n key resolution and
2393
+ * toolbar change-detection.
2394
+ *
2395
+ * Concrete components extend this (or {@link MnSelectableCollectionBase}) and
2396
+ * implement only their rendering. The class is decorated `@Directive()` so it can
2397
+ * declare `@Input`s and use `inject()` while remaining abstract.
2398
+ *
2399
+ * Init runs in a fixed order (see {@link ngOnInit}); subclasses hook in via the
2400
+ * `protected` template methods rather than overriding `ngOnInit`.
2401
+ */
2402
+ declare abstract class MnCollectionBase<T, DS extends MnCollectionDataSource<T>> implements OnInit, OnDestroy, DoCheck {
2403
+ dataSource: DS;
2404
+ filteredItems: T[];
2405
+ paginatedItems: T[];
2406
+ searchValue: string;
2407
+ loadingMoreRows: boolean;
2408
+ currentPage: number;
2409
+ pageSize: number;
2410
+ protected readonly cdr: ChangeDetectorRef;
2411
+ protected readonly lang: MnLanguageService;
2412
+ /** Prefix used in validation error messages, e.g. `MnList`. Overridden by subclasses. */
2413
+ protected readonly componentName: string;
2414
+ private dataSubscription?;
2415
+ private searchSubject;
2416
+ private searchSubscription?;
2417
+ private langSubscription?;
2418
+ /** Tracks the previous toolbar template reference for change detection. */
2419
+ private previousToolbarTemplate?;
2420
+ /** Whether the component delegates search to the consumer (server-side). */
2421
+ get isServerSearched(): boolean;
2422
+ get isPaginated(): boolean;
2423
+ /** Whether the component delegates pagination to the consumer (server-side). */
2424
+ get isServerPaginated(): boolean;
2425
+ get showLoadMore(): boolean;
2426
+ /** Total number of items, accounting for server-side pagination. */
2427
+ get totalItemCount(): number;
2428
+ get totalPages(): number;
2429
+ get resolvedPageSizeOptions(): number[];
2430
+ /** Page-size options formatted for mn-select. */
2431
+ get pageSizeSelectOptions(): MnSelectOption<number>[];
2432
+ get visiblePages(): number[];
2433
+ get skeletonRows(): number[];
2434
+ /** The toolbar template whose identity is watched in change detection. */
2435
+ protected abstract get trackedToolbarTemplate(): TemplateRef<unknown> | undefined;
2436
+ ngOnInit(): void;
2437
+ ngDoCheck(): void;
2438
+ ngOnDestroy(): void;
2439
+ onSearch(searchString: string): void;
2440
+ goToPage(page: number): void;
2441
+ onPageSizeChange(newSize: number): void;
2442
+ loadMoreRows(): void;
2443
+ isTemplateRef(value: unknown): value is TemplateRef<unknown>;
2444
+ trackByID: (_index: number, item: T) => string;
2445
+ /** Applies search/sort/filtering and pagination to the current rows. */
2446
+ protected abstract applyFilter(searchForItems: boolean): void;
2447
+ /** Runs after pageSize is set but before the first {@link applyFilter}. */
2448
+ protected beforeInitialFilter(): void;
2449
+ /**
2450
+ * Resolves translation keys to display strings via {@link MnLanguageService}.
2451
+ * Subclasses override to resolve their own keys; call `super` to keep these.
2452
+ */
2453
+ protected resolveTranslationKeys(): void;
2454
+ protected applyPagination(): void;
2455
+ /** Client-side search filtering shared by list and grid. */
2456
+ protected applySearchFilter(items: T[]): T[];
2457
+ protected processLoadedRows(rows: T[]): void;
2458
+ protected validateDataSource(): void;
2459
+ static ɵfac: i0.ɵɵFactoryDeclaration<MnCollectionBase<any, any>, never>;
2460
+ static ɵdir: i0.ɵɵDirectiveDeclaration<MnCollectionBase<any, any>, never, never, { "dataSource": { "alias": "dataSource"; "required": false; }; }, {}, never, never, true, never>;
2461
+ }
2462
+
2463
+ /**
2464
+ * Extends {@link MnCollectionBase} with single/multi row selection, shared by
2465
+ * components that support it (table, list). Grid extends the plain base instead.
2466
+ */
2467
+ declare abstract class MnSelectableCollectionBase<T, DS extends MnSelectableCollectionDataSource<T>> extends MnCollectionBase<T, DS> {
2468
+ selectionChange: EventEmitter<T[]>;
2469
+ selectedIds: Set<string>;
2470
+ get allSelected(): boolean;
2471
+ get hasSelection(): boolean;
2472
+ get isMultiSelect(): boolean;
2473
+ isSelected(item: T): boolean;
2474
+ toggle(item: T): void;
2475
+ toggleAll(): void;
2476
+ /** Seeds selection from `initialSelectedIds` before the first filter pass. */
2477
+ protected beforeInitialFilter(): void;
2478
+ protected emitSelection(): void;
2479
+ static ɵfac: i0.ɵɵFactoryDeclaration<MnSelectableCollectionBase<any, any>, never>;
2480
+ static ɵdir: i0.ɵɵDirectiveDeclaration<MnSelectableCollectionBase<any, any>, never, never, {}, { "selectionChange": "selectionChange"; }, never, never, true, never>;
2481
+ }
2482
+
2483
+ /**
2484
+ * Presentational pagination footer shared by every MnLib collection component
2485
+ * (table, list, grid): the load-more button, the page-size selector and the
2486
+ * page navigator. It holds no state — the host component owns pagination state
2487
+ * (via {@link import('./mn-collection-base.directive').MnCollectionBase}) and
2488
+ * reacts to the outputs.
2489
+ */
2490
+ declare class MnCollectionPagination {
2491
+ /** Prefix for the page-size select's id, keeping it unique per host. */
2492
+ idPrefix: string;
2493
+ isPaginated: boolean;
2494
+ isServerPaginated: boolean;
2495
+ showLoadMore: boolean;
2496
+ loadingMoreRows: boolean;
2497
+ currentPage: number;
2498
+ pageSize: number;
2499
+ totalPages: number;
2500
+ totalItemCount: number;
2501
+ visiblePages: number[];
2502
+ pageSizeSelectOptions: MnSelectOption<number>[];
2503
+ labels?: MnCollectionLabels;
2504
+ loadMore: EventEmitter<void>;
2505
+ pageChange: EventEmitter<number>;
2506
+ pageSizeChange: EventEmitter<number>;
2507
+ get showPagination(): boolean;
2508
+ static ɵfac: i0.ɵɵFactoryDeclaration<MnCollectionPagination, never>;
2509
+ static ɵcmp: i0.ɵɵComponentDeclaration<MnCollectionPagination, "mn-collection-pagination", never, { "idPrefix": { "alias": "idPrefix"; "required": false; }; "isPaginated": { "alias": "isPaginated"; "required": false; }; "isServerPaginated": { "alias": "isServerPaginated"; "required": false; }; "showLoadMore": { "alias": "showLoadMore"; "required": false; }; "loadingMoreRows": { "alias": "loadingMoreRows"; "required": false; }; "currentPage": { "alias": "currentPage"; "required": false; }; "pageSize": { "alias": "pageSize"; "required": false; }; "totalPages": { "alias": "totalPages"; "required": false; }; "totalItemCount": { "alias": "totalItemCount"; "required": false; }; "visiblePages": { "alias": "visiblePages"; "required": false; }; "pageSizeSelectOptions": { "alias": "pageSizeSelectOptions"; "required": false; }; "labels": { "alias": "labels"; "required": false; }; }, { "loadMore": "loadMore"; "pageChange": "pageChange"; "pageSizeChange": "pageSizeChange"; }, never, never, true, never>;
2510
+ }
2511
+
2139
2512
  declare enum ColumnSortType {
2140
2513
  ALPHABETICAL = "ALPHABETICAL",
2141
2514
  NUMERICAL = "NUMERICAL",
@@ -2157,6 +2530,13 @@ type ColumnFilterOption = {
2157
2530
  label: string;
2158
2531
  value: string;
2159
2532
  };
2533
+ /**
2534
+ * Customizes the loading-skeleton placeholder rendered in a column's cells.
2535
+ * Either a partial {@link MnSkeletonProps} (shape/width/height/animated) or a
2536
+ * `TemplateRef` for a fully custom placeholder. When omitted, a text-shaped
2537
+ * skeleton at 75% width is used (matching the previous default).
2538
+ */
2539
+ type ColumnSkeleton = Partial<MnSkeletonProps> | TemplateRef<unknown>;
2160
2540
  type ColumnDefinition<T> = {
2161
2541
  key: string;
2162
2542
  header: string | TemplateRef<unknown>;
@@ -2191,162 +2571,65 @@ type ColumnDefinition<T> = {
2191
2571
  filterMaxLength?: number;
2192
2572
  /** Custom filter function. Receives the row and the current filter value. */
2193
2573
  filterFn?: (row: T, filterValue: string) => boolean;
2574
+ /** Customizes the loading-skeleton placeholder shown in this column's cells while data loads. */
2575
+ skeleton?: ColumnSkeleton;
2194
2576
  };
2195
- type TableDataSource<T> = {
2196
- dataRows: BehaviorSubject<T[]>;
2577
+ type TableDataSource<T> = MnSelectableCollectionDataSource<T> & {
2197
2578
  columns: ColumnDefinition<T>[];
2198
- getID: (row: T) => string;
2199
- emptyMessage: string;
2200
- /** Translation key for the empty message. When set, mn-table resolves it via MnLanguageService. */
2201
- emptyMessageKey?: string;
2202
- emptyTemplate?: TemplateRef<unknown>;
2203
- isDataLoading: boolean;
2204
- canSearch: boolean;
2205
- searchPlaceholder?: string;
2206
- /** Translation key for the search placeholder. When set, mn-table resolves it via MnLanguageService. */
2207
- searchPlaceholderKey?: string;
2208
- isInSearch?: (row: T, searchValue: string) => boolean;
2209
- searchForAdditionalItems?: (searchValue: string) => Promise<T[]>;
2210
- paginationMode?: 'none' | 'load-more' | 'paginated' | 'client-side-pagination' | 'infinite-scroll';
2211
- paginationStrategy?: PaginationStrategy;
2212
- loadAdditionalRows?: () => Promise<T[]>;
2213
- /** Number of rows per page when paginationMode is 'paginated'. Defaults to 10. */
2214
- pageSize?: number;
2215
- /** Options for the page-size selector dropdown. Defaults to [5, 10, 25, 50]. */
2216
- pageSizeOptions?: number[];
2217
- /** Callback invoked when the user changes the page size via the dropdown. */
2218
- onPageSizeChange?: (newSize: number) => void;
2219
- /**
2220
- * Total number of items on the server.
2221
- * When set, pagination and infinite-scroll use this instead of filteredItems.length.
2222
- */
2223
- totalItems?: number;
2224
- /**
2225
- * Callback invoked when the user navigates to a different page.
2226
- * When provided, the table delegates pagination to the consumer (server-side).
2227
- * The consumer is responsible for fetching the new page data and updating dataRows.
2228
- */
2229
- onPageChange?: (page: number) => void;
2230
- /**
2231
- * Callback invoked when the user types in the search box (server-side search).
2232
- * When provided, the table skips client-side filtering and delegates to the consumer.
2233
- */
2234
- onServerSearch?: (searchValue: string) => void;
2235
- /**
2236
- * Callback invoked when the user scrolls to the bottom in infinite-scroll mode.
2237
- * When provided, the table delegates loading more rows to the consumer (server-side).
2238
- * The consumer is responsible for appending new data to dataRows.
2239
- */
2240
- onLoadMore?: () => void;
2241
2579
  defaultSort?: SortState;
2242
- selectionMode?: 'none' | 'single' | 'multi';
2243
- selectedRows?: BehaviorSubject<T[]>;
2244
- /** IDs to pre-select when the table initializes. */
2245
- initialSelectedIds?: string[];
2246
2580
  onRowClick?: (row: T) => void;
2247
2581
  appearance?: TableAppearance;
2248
2582
  /** Template rendered on the left side of the toolbar (before the search field). */
2249
2583
  toolbarLeftTemplate?: TemplateRef<unknown>;
2250
2584
  /** Template rendered on the right side of the toolbar (after the search field). */
2251
2585
  toolbarRightTemplate?: TemplateRef<unknown>;
2252
- labels?: TableLabels;
2253
- };
2254
- type TableLabels = {
2255
- loadMore?: string;
2256
- /** Translation key for the "Load more" button label. */
2257
- loadMoreKey?: string;
2258
- rowsPerPage?: string;
2259
- /** Translation key for the "Rows per page" label. */
2260
- rowsPerPageKey?: string;
2261
2586
  };
2587
+ /** @deprecated Use {@link MnCollectionLabels}. */
2588
+ type TableLabels = MnCollectionLabels;
2262
2589
 
2263
2590
  /** Map of column key to its current filter value. */
2264
2591
  type ColumnFilterState = Record<string, string | undefined>;
2265
- declare class MnTable<T = object> implements OnInit, OnDestroy, DoCheck {
2266
- dataSource: TableDataSource<T>;
2592
+ declare class MnTable<T = object> extends MnSelectableCollectionBase<T, TableDataSource<T>> {
2267
2593
  sortChange: EventEmitter<SortState | null>;
2268
- selectionChange: EventEmitter<T[]>;
2269
2594
  rowClick: EventEmitter<T>;
2270
- filteredItems: T[];
2271
- paginatedItems: T[];
2272
- searchValue: string;
2273
- loadingMoreRows: boolean;
2274
2595
  currentSort: SortState | null;
2275
- selectedIds: Set<string>;
2276
- currentPage: number;
2277
- pageSize: number;
2278
2596
  /** Per-column filter values keyed by column key. */
2279
2597
  columnFilters: ColumnFilterState;
2280
- private cdr;
2281
- private lang;
2282
- private dataSubscription?;
2283
- private searchSubject;
2284
- private searchSubscription?;
2285
- private langSubscription?;
2286
- /** Tracks the previous toolbar left template reference for change detection. */
2287
- private previousToolbarLeftTemplate?;
2288
- /**
2289
- * Checks for changes to dataSource properties that are not covered
2290
- * by Angular's default change detection (e.g. toolbarLeftTemplate).
2291
- */
2292
- ngDoCheck(): void;
2293
- get showLoadMore(): boolean;
2294
- ngOnDestroy(): void;
2295
- get isPaginated(): boolean;
2296
- /** Whether any column has filtering enabled. */
2297
- get hasColumnFilters(): boolean;
2598
+ protected readonly componentName = "MnTable";
2599
+ protected get trackedToolbarTemplate(): TemplateRef<unknown> | undefined;
2298
2600
  /** Updates a column filter value and re-applies filtering. */
2299
2601
  onColumnFilter(columnKey: string, value: string): void;
2602
+ /** Filter options formatted for mn-select for a given column. */
2603
+ getFilterSelectOptions(column: ColumnDefinition<T>): MnSelectOption<string>[];
2604
+ /** Whether any column has filtering enabled. */
2605
+ get hasColumnFilters(): boolean;
2300
2606
  sort(column: ColumnDefinition<T>): void;
2301
- getSortIcon(column: ColumnDefinition<T>): string;
2302
- isSortable(column: ColumnDefinition<T>): boolean;
2303
- isSelected(row: T): boolean;
2304
- toggleRow(row: T): void;
2305
- toggleAll(): void;
2306
- get allSelected(): boolean;
2307
- get hasSelection(): boolean;
2308
- get isMultiSelect(): boolean;
2309
2607
  onRowClick(row: T): void;
2310
- /** Whether the table delegates pagination to the consumer (server-side). */
2311
- get isServerPaginated(): boolean;
2312
- /** Whether the table delegates search to the consumer (server-side). */
2313
- get isServerSearched(): boolean;
2314
- /** Total number of items, accounting for server-side pagination. */
2315
- get totalItemCount(): number;
2316
- get totalPages(): number;
2317
- ngOnInit(): void;
2318
2608
  /**
2319
- * Resolves all translation keys (headerKey, filterPlaceholderKey, emptyMessageKey, etc.)
2320
- * into their corresponding display strings using MnLanguageService.
2609
+ * Resolves the skeleton placeholder config for a column's cells.
2610
+ * Falls back to a text-shaped bar at 75% width (the previous default); any
2611
+ * fields the column provides override that default.
2321
2612
  */
2322
- private resolveTranslationKeys;
2323
- onSearch(searchString: string): void;
2324
- loadMoreRows(): void;
2325
- get resolvedPageSizeOptions(): number[];
2326
- /** Page-size options formatted for mn-select. */
2327
- get pageSizeSelectOptions(): MnSelectOption<number>[];
2328
- /** Filter options formatted for mn-select for a given column. */
2329
- getFilterSelectOptions(column: ColumnDefinition<T>): MnSelectOption<string>[];
2330
- goToPage(page: number): void;
2331
- onPageSizeChange(newSize: number): void;
2332
- get visiblePages(): number[];
2333
- private applyPagination;
2334
- isTemplateRef(value: unknown): value is TemplateRef<unknown>;
2613
+ getColumnSkeletonData(column: ColumnDefinition<T>): Partial<MnSkeletonProps>;
2614
+ getSortIcon(column: ColumnDefinition<T>): string;
2615
+ isSortable(column: ColumnDefinition<T>): boolean;
2616
+ /** Sets sort/filter state seeded from the data source before the first filter pass. */
2617
+ protected beforeInitialFilter(): void;
2335
2618
  getCellValue(column: ColumnDefinition<T>, row: T): string;
2336
2619
  /** Returns the small-screen cell value for a column with cellSm defined. */
2337
2620
  getCellSmValue(column: ColumnDefinition<T>, row: T): string;
2338
- trackByID: (_index: number, row: T) => string;
2339
2621
  trackByKey: (_index: number, column: ColumnDefinition<T>) => string;
2340
2622
  readonly tableClasses = "w-full border-collapse overflow-y-hidden";
2341
2623
  get totalColumnCount(): number;
2342
- get skeletonRows(): number[];
2343
- private applyFilterAndSort;
2624
+ /**
2625
+ * Resolves table-specific translation keys (column headers/filters) plus the
2626
+ * shared keys handled by the base.
2627
+ */
2628
+ protected resolveTranslationKeys(): void;
2629
+ protected applyFilter(searchForItems: boolean): void;
2344
2630
  private applySorting;
2345
- private processLoadedRows;
2346
- private validateDataSource;
2347
- private emitSelection;
2348
2631
  static ɵfac: i0.ɵɵFactoryDeclaration<MnTable<any>, never>;
2349
- static ɵcmp: i0.ɵɵComponentDeclaration<MnTable<any>, "mn-table", never, { "dataSource": { "alias": "dataSource"; "required": false; }; }, { "sortChange": "sortChange"; "selectionChange": "selectionChange"; "rowClick": "rowClick"; }, never, never, true, never>;
2632
+ static ɵcmp: i0.ɵɵComponentDeclaration<MnTable<any>, "mn-table", never, {}, { "sortChange": "sortChange"; "rowClick": "rowClick"; }, never, never, true, never>;
2350
2633
  }
2351
2634
 
2352
2635
  /**
@@ -3417,7 +3700,7 @@ declare class MnModalShellComponent<TResult = unknown> implements OnInit, AfterV
3417
3700
  asForm(config: ModalConfig<TResult>): FormModalConfig;
3418
3701
  asConfirmation(config: ModalConfig<TResult>): ConfirmationModalConfig;
3419
3702
  asCustom(config: ModalConfig<TResult>): CustomModalConfig;
3420
- get hostClasses(): string;
3703
+ private static readonly SWIPE_DISMISS_THRESHOLD;
3421
3704
  /** Whether this modal renders as a bottom sheet on small screens (default: true). */
3422
3705
  get isMobileSheet(): boolean;
3423
3706
  /** Triggers the closing animation. Deferred to avoid NG0100 when called during a CD cycle. */
@@ -3425,11 +3708,14 @@ declare class MnModalShellComponent<TResult = unknown> implements OnInit, AfterV
3425
3708
  onEscapeKey(event: Event): void;
3426
3709
  onBackdropClick(): void;
3427
3710
  onCloseButtonClick(): void;
3428
- private static readonly SWIPE_DISMISS_THRESHOLD;
3711
+ /** True once a swipe has crossed the dismiss threshold — slides the sheet off-screen
3712
+ * via the transform transition instead of replaying the slide-up keyframe. */
3713
+ swipeDismissing: boolean;
3429
3714
  /** Current downward drag offset (px) applied to the sheet while swiping. */
3430
3715
  sheetDragY: number;
3431
3716
  /** True while the user is actively dragging the grabber (disables snap transition). */
3432
3717
  isDraggingSheet: boolean;
3718
+ get hostClasses(): string;
3433
3719
  private dragStartY;
3434
3720
  /** Whether the sheet can be dismissed at all (drives whether the swipe is armed). */
3435
3721
  private get canClose();
@@ -3723,132 +4009,124 @@ declare class MnConfirmationBodyComponent<TResult = boolean> implements OnInit {
3723
4009
  declare class MnCustomBodyHostComponent implements OnInit {
3724
4010
  config: CustomModalConfig;
3725
4011
  modalRef: MnModalRef<unknown>;
3726
- container: ViewContainerRef;
3727
- private componentRef?;
3728
- ngOnInit(): void;
3729
- private loadContent;
3730
- attachComponent(component: Type<unknown>): void;
3731
- attachTemplate(template: TemplateRef<unknown>): void;
3732
- static ɵfac: i0.ɵɵFactoryDeclaration<MnCustomBodyHostComponent, never>;
3733
- static ɵcmp: i0.ɵɵComponentDeclaration<MnCustomBodyHostComponent, "mn-custom-body-host", never, { "config": { "alias": "config"; "required": false; }; "modalRef": { "alias": "modalRef"; "required": false; }; }, {}, never, never, true, never>;
3734
- }
3735
-
3736
- type ListAppearance = {
3737
- /** Show a divider between items. Defaults to true. */
3738
- dividers?: boolean;
3739
- /** Highlight item on hover. Defaults to true. */
3740
- hover?: boolean;
3741
- /** Use compact (smaller) padding. */
3742
- compact?: boolean;
3743
- /** Show a border around the list. */
3744
- bordered?: boolean;
3745
- };
3746
- type ListDataSource<T> = {
3747
- dataRows: BehaviorSubject<T[]>;
3748
- getID: (row: T) => string;
3749
- /** Template used to render each list item. Receives the item as `$implicit` and `data`. */
3750
- itemTemplate: TemplateRef<unknown>;
3751
- emptyMessage: string;
3752
- emptyTemplate?: TemplateRef<unknown>;
3753
- isDataLoading: boolean;
3754
- canSearch: boolean;
3755
- searchPlaceholder?: string;
3756
- isInSearch?: (row: T, searchValue: string) => boolean;
3757
- searchForAdditionalItems?: (searchValue: string) => Promise<T[]>;
3758
- paginationMode?: 'none' | 'load-more' | 'paginated' | 'client-side-pagination' | 'infinite-scroll';
3759
- paginationStrategy?: PaginationStrategy;
3760
- loadAdditionalRows?: () => Promise<T[]>;
3761
- /** Number of items per page when paginationMode is 'paginated'. Defaults to 10. */
3762
- pageSize?: number;
3763
- /** Options for the page-size selector dropdown. Defaults to [5, 10, 25, 50]. */
3764
- pageSizeOptions?: number[];
3765
- /** Callback invoked when the user changes the page size via the dropdown. */
3766
- onPageSizeChange?: (newSize: number) => void;
3767
- /**
3768
- * Total number of items on the server.
3769
- * When set, pagination and infinite-scroll use this instead of filteredItems.length.
3770
- */
3771
- totalItems?: number;
3772
- /**
3773
- * Callback invoked when the user navigates to a different page.
3774
- * When provided, the list delegates pagination to the consumer (server-side).
3775
- */
3776
- onPageChange?: (page: number) => void;
3777
- /**
3778
- * Callback invoked when the user types in the search box (server-side search).
3779
- * When provided, the list skips client-side filtering and delegates to the consumer.
3780
- */
3781
- onServerSearch?: (searchValue: string) => void;
3782
- /**
3783
- * Callback invoked when the user scrolls to the bottom in infinite-scroll mode.
3784
- * When provided, the list delegates loading more rows to the consumer (server-side).
3785
- */
3786
- onLoadMore?: () => void;
3787
- selectionMode?: 'none' | 'single' | 'multi';
3788
- selectedRows?: BehaviorSubject<T[]>;
3789
- /** IDs to pre-select when the list initializes. */
3790
- initialSelectedIds?: string[];
4012
+ container: ViewContainerRef;
4013
+ private componentRef?;
4014
+ ngOnInit(): void;
4015
+ private loadContent;
4016
+ attachComponent(component: Type<unknown>): void;
4017
+ attachTemplate(template: TemplateRef<unknown>): void;
4018
+ static ɵfac: i0.ɵɵFactoryDeclaration<MnCustomBodyHostComponent, never>;
4019
+ static ɵcmp: i0.ɵɵComponentDeclaration<MnCustomBodyHostComponent, "mn-custom-body-host", never, { "config": { "alias": "config"; "required": false; }; "modalRef": { "alias": "modalRef"; "required": false; }; }, {}, never, never, true, never>;
4020
+ }
4021
+
4022
+ /**
4023
+ * Customizes the loading-skeleton placeholder rendered for each list item.
4024
+ * Either a set of skeleton lines (each a partial {@link MnSkeletonProps}) stacked
4025
+ * vertically, or a `TemplateRef` for a fully custom placeholder. When omitted,
4026
+ * two text-shaped lines (75% and 50% width) are used, matching the previous default.
4027
+ */
4028
+ type ListSkeleton = {
4029
+ lines: Partial<MnSkeletonProps>[];
4030
+ } | TemplateRef<unknown>;
4031
+ type ListAppearance = {
4032
+ /** Show a divider between items. Defaults to true. */
4033
+ dividers?: boolean;
4034
+ /** Highlight item on hover. Defaults to true. */
4035
+ hover?: boolean;
4036
+ /** Use compact (smaller) padding. */
4037
+ compact?: boolean;
4038
+ /** Show a border around the list. */
4039
+ bordered?: boolean;
4040
+ };
4041
+ type ListDataSource<T> = MnSelectableCollectionDataSource<T> & {
4042
+ /** Template used to render each list item. Receives the item as `$implicit` and `data`. */
4043
+ itemTemplate: TemplateRef<unknown>;
4044
+ /** Customizes the loading-skeleton placeholder shown for each item while data loads. */
4045
+ skeleton?: ListSkeleton;
3791
4046
  onItemClick?: (item: T) => void;
3792
4047
  appearance?: ListAppearance;
3793
4048
  toolbarTemplate?: TemplateRef<unknown>;
3794
- labels?: ListLabels;
3795
- };
3796
- type ListLabels = {
3797
- loadMore?: string;
3798
- rowsPerPage?: string;
3799
4049
  };
4050
+ /** @deprecated Use {@link MnCollectionLabels}. */
4051
+ type ListLabels = MnCollectionLabels;
3800
4052
 
3801
- declare class MnList<T = unknown> implements OnInit, OnDestroy, DoCheck {
3802
- dataSource: ListDataSource<T>;
3803
- selectionChange: EventEmitter<T[]>;
4053
+ declare class MnList<T = unknown> extends MnSelectableCollectionBase<T, ListDataSource<T>> {
3804
4054
  itemClick: EventEmitter<T>;
3805
- filteredItems: T[];
3806
- paginatedItems: T[];
3807
- searchValue: string;
3808
- loadingMoreRows: boolean;
3809
- selectedIds: Set<string>;
3810
- currentPage: number;
3811
- pageSize: number;
3812
- private cdr;
3813
- private dataSubscription?;
3814
- private searchSubject;
3815
- private searchSubscription?;
3816
- /** Tracks the previous toolbar template reference for change detection. */
3817
- private previousToolbarTemplate?;
3818
- ngDoCheck(): void;
3819
- get showLoadMore(): boolean;
3820
- ngOnDestroy(): void;
3821
- get isPaginated(): boolean;
3822
- isSelected(item: T): boolean;
3823
- toggleItem(item: T): void;
3824
- toggleAll(): void;
3825
- get allSelected(): boolean;
3826
- get hasSelection(): boolean;
3827
- get isMultiSelect(): boolean;
4055
+ protected readonly componentName = "MnList";
4056
+ /** Skeleton lines rendered for each placeholder item, falling back to the default two-bar layout. */
4057
+ get skeletonLines(): Partial<MnSkeletonProps>[];
3828
4058
  onItemClick(item: T): void;
3829
- /** Whether the list is in server-side paginated mode (always true when paginated or load-more). */
3830
- get isServerPaginated(): boolean;
3831
- /** Total number of items, accounting for server-side pagination. */
3832
- get totalItemCount(): number;
3833
- get totalPages(): number;
3834
- ngOnInit(): void;
3835
- onSearch(searchString: string): void;
3836
- loadMoreRows(): void;
3837
- get resolvedPageSizeOptions(): number[];
3838
- /** Page-size options formatted for mn-select. */
3839
- get pageSizeSelectOptions(): MnSelectOption<number>[];
3840
- goToPage(page: number): void;
3841
- onPageSizeChange(newSize: number): void;
3842
- get visiblePages(): number[];
3843
- trackByID: (_index: number, item: T) => string;
3844
- get skeletonRows(): number[];
3845
- private applyPagination;
3846
- private applyFilter;
3847
- private processLoadedRows;
3848
- private validateDataSource;
3849
- private emitSelection;
4059
+ protected get trackedToolbarTemplate(): TemplateRef<unknown> | undefined;
4060
+ protected applyFilter(searchForItems: boolean): void;
3850
4061
  static ɵfac: i0.ɵɵFactoryDeclaration<MnList<any>, never>;
3851
- static ɵcmp: i0.ɵɵComponentDeclaration<MnList<any>, "mn-list", never, { "dataSource": { "alias": "dataSource"; "required": false; }; }, { "selectionChange": "selectionChange"; "itemClick": "itemClick"; }, never, never, true, never>;
4062
+ static ɵcmp: i0.ɵɵComponentDeclaration<MnList<any>, "mn-list", never, {}, { "itemClick": "itemClick"; }, never, never, true, never>;
4063
+ }
4064
+
4065
+ /**
4066
+ * Controls the responsive card layout. Provide **either** `cols` (explicit column
4067
+ * counts per breakpoint) **or** `minCardWidth` (CSS `auto-fit`/`minmax`); when
4068
+ * `minCardWidth` is set it takes precedence and `cols` is ignored.
4069
+ *
4070
+ * Breakpoints match Tailwind defaults: sm 640px, md 768px, lg 1024px, xl 1280px.
4071
+ */
4072
+ type GridLayout = {
4073
+ /** Explicit column count per breakpoint. Each falls back to the next-smaller one. */
4074
+ cols?: {
4075
+ base?: number;
4076
+ sm?: number;
4077
+ md?: number;
4078
+ lg?: number;
4079
+ xl?: number;
4080
+ };
4081
+ /** Minimum card width, e.g. '18rem'. Enables auto-fit layout; ignores `cols`. */
4082
+ minCardWidth?: string;
4083
+ /** Gap between cards. Defaults to '1rem'. */
4084
+ gap?: string;
4085
+ /**
4086
+ * Caps the number of cards shown (preview mode, e.g. "first 3"). Intended for
4087
+ * `paginationMode: 'none'`; it slices the visible set and the pager stays hidden.
4088
+ */
4089
+ maxItems?: number;
4090
+ };
4091
+ /**
4092
+ * Customizes the loading-skeleton placeholder rendered for each card while data
4093
+ * loads. Provide a `TemplateRef` to profile the card's shape (the primary, most
4094
+ * useful form), or a set of stacked skeleton lines. When omitted, a default card
4095
+ * placeholder (image block + two text bars) is rendered.
4096
+ */
4097
+ type GridSkeleton = TemplateRef<unknown> | {
4098
+ lines: Partial<MnSkeletonProps>[];
4099
+ };
4100
+ type GridDataSource<T> = MnCollectionDataSource<T> & {
4101
+ /** Template used to render each card. Receives the item as `$implicit` and `data`. */
4102
+ cardTemplate: TemplateRef<unknown>;
4103
+ /** Customizes the loading-skeleton card shown while data loads. */
4104
+ skeleton?: GridSkeleton;
4105
+ /** Responsive layout configuration. */
4106
+ layout?: GridLayout;
4107
+ onItemClick?: (item: T) => void;
4108
+ toolbarTemplate?: TemplateRef<unknown>;
4109
+ };
4110
+
4111
+ /**
4112
+ * Responsive card-grid component. Shares the collection chrome (search, every
4113
+ * pagination mode, loading skeleton, empty state, toolbar, i18n) with
4114
+ * {@link import('../mn-list').MnList} and {@link import('../mn-table').MnTable}
4115
+ * via {@link MnCollectionBase}, and lays items out as cards instead of rows.
4116
+ * Selection is intentionally not supported.
4117
+ */
4118
+ declare class MnGrid<T = unknown> extends MnCollectionBase<T, GridDataSource<T>> {
4119
+ itemClick: EventEmitter<T>;
4120
+ protected readonly componentName = "MnGrid";
4121
+ /** Whether the grid uses auto-fit (minCardWidth) instead of explicit columns. */
4122
+ get isAutoLayout(): boolean;
4123
+ /** Skeleton lines for the default/lines placeholder; null when a custom template is used. */
4124
+ get skeletonLines(): Partial<MnSkeletonProps>[];
4125
+ protected get trackedToolbarTemplate(): TemplateRef<unknown> | undefined;
4126
+ onItemClick(item: T): void;
4127
+ protected applyFilter(searchForItems: boolean): void;
4128
+ static ɵfac: i0.ɵɵFactoryDeclaration<MnGrid<any>, never>;
4129
+ static ɵcmp: i0.ɵɵComponentDeclaration<MnGrid<any>, "mn-grid", never, {}, { "itemClick": "itemClick"; }, never, never, true, never>;
3852
4130
  }
3853
4131
 
3854
4132
  /**
@@ -4688,45 +4966,6 @@ declare class MnIconAttributes {
4688
4966
  static ɵdir: i0.ɵɵDirectiveDeclaration<MnIconAttributes, "mn-icon[mnIconPistol], mn-icon[mnIconPending]", never, {}, {}, never, never, true, never>;
4689
4967
  }
4690
4968
 
4691
- type MnSkeletonShape = 'rectangle' | 'circle' | 'text';
4692
- type MnSkeletonProps = {
4693
- shape?: MnSkeletonShape;
4694
- animated?: boolean;
4695
- width?: string;
4696
- height?: string;
4697
- };
4698
-
4699
- declare class MnSkeleton {
4700
- data: Partial<MnSkeletonProps>;
4701
- get hostClasses(): string;
4702
- get width(): string | null;
4703
- get height(): string | null;
4704
- get isAnimated(): boolean;
4705
- static ɵfac: i0.ɵɵFactoryDeclaration<MnSkeleton, never>;
4706
- static ɵcmp: i0.ɵɵComponentDeclaration<MnSkeleton, "mn-skeleton", never, { "data": { "alias": "data"; "required": false; }; }, {}, never, never, true, never>;
4707
- }
4708
-
4709
- declare const mnSkeletonVariants: tailwind_variants.TVReturnType<{
4710
- shape: {
4711
- rectangle: string;
4712
- circle: string;
4713
- text: string;
4714
- };
4715
- }, undefined, "bg-base-300 relative overflow-hidden", {
4716
- shape: {
4717
- rectangle: string;
4718
- circle: string;
4719
- text: string;
4720
- };
4721
- }, undefined, tailwind_variants.TVReturnType<{
4722
- shape: {
4723
- rectangle: string;
4724
- circle: string;
4725
- text: string;
4726
- };
4727
- }, undefined, "bg-base-300 relative overflow-hidden", unknown, unknown, undefined>>;
4728
- type MnSkeletonVariantProps = VariantProps<typeof mnSkeletonVariants>;
4729
-
4730
4969
  /**
4731
4970
  * Types for mn-lib configuration.
4732
4971
  */
@@ -5203,141 +5442,6 @@ declare abstract class MnHttpService {
5203
5442
  protected toHttpParams(query?: MnQueryParams): HttpParams | undefined;
5204
5443
  }
5205
5444
 
5206
- /**
5207
- * A marker object used in config values to indicate that the value
5208
- * should be resolved via the MnLanguageService.
5209
- *
5210
- * Example in mn-config.json5:
5211
- * label: { $translate: "form.email.label" }
5212
- */
5213
- type MnTranslatable = {
5214
- $translate: string;
5215
- params?: Record<string, string | number>;
5216
- };
5217
- /**
5218
- * A config value that is either a plain value or a translatable marker.
5219
- */
5220
- type MnConfigValue<T = string> = T | MnTranslatable;
5221
- /**
5222
- * A flat key-value map of translations for a single locale.
5223
- * Supports nested keys via dot notation: "form.email.label"
5224
- */
5225
- type MnTranslationMap = Record<string, string>;
5226
- /**
5227
- * All loaded translations keyed by locale code (e.g. "en", "nl", "de").
5228
- */
5229
- type MnTranslations = Record<string, MnTranslationMap>;
5230
- /**
5231
- * Configuration for the language provider.
5232
- */
5233
- type MnLanguageConfig = {
5234
- /** URL pattern for loading translation files. Use `{locale}` as placeholder. e.g. "assets/i18n/{locale}.json" */
5235
- urlPattern: string;
5236
- /** The default/fallback locale. */
5237
- defaultLocale: string;
5238
- /** Locales to preload at bootstrap. */
5239
- preload?: string[];
5240
- /**
5241
- * Optional mapping of domain hostnames to locale codes.
5242
- * When set, the service will use the current domain to determine the initial locale.
5243
- * Example: { "example.nl": "nl", "example.de": "de", "example.com": "en" }
5244
- */
5245
- domainLocaleMap?: Record<string, string>;
5246
- /** Whether to enable debug logging. */
5247
- debug?: boolean;
5248
- };
5249
- /**
5250
- * Type guard: checks whether a value is a translatable marker object.
5251
- */
5252
- declare function isTranslatable(value: unknown): value is MnTranslatable;
5253
-
5254
- declare class MnLanguageService {
5255
- private readonly http;
5256
- private readonly appRef;
5257
- private _translations;
5258
- private _locale$;
5259
- private _urlPattern;
5260
- private _debug;
5261
- /** Observable of the current active locale. */
5262
- readonly locale$: Observable<string>;
5263
- /** Current active locale. */
5264
- get locale(): string;
5265
- /**
5266
- * Enable or disable debug logging.
5267
- */
5268
- setDebug(enabled: boolean): void;
5269
- /**
5270
- * Configure the URL pattern used to fetch translation files.
5271
- * Use `{locale}` as placeholder, e.g. `"assets/i18n/{locale}.json"`.
5272
- */
5273
- configure(urlPattern: string): void;
5274
- /**
5275
- * Load translations for a locale from the configured URL pattern.
5276
- * If translations are already loaded for this locale, this is a no-op.
5277
- */
5278
- loadLocale(locale: string): Promise<void>;
5279
- /**
5280
- * Switch the active locale. Loads translations if not yet loaded.
5281
- */
5282
- setLocale(locale: string): Promise<void>;
5283
- /**
5284
- * Register translations for a locale directly from code (no HTTP needed).
5285
- */
5286
- registerTranslations(locale: string, translations: MnTranslationMap): void;
5287
- /**
5288
- * Translate a key using the current locale, with optional parameter interpolation.
5289
- * Falls back to the key itself if no translation is found.
5290
- *
5291
- * Interpolation replaces `{{paramName}}` with the provided value.
5292
- */
5293
- translate(key: string, params?: Record<string, string | number>): string;
5294
- /**
5295
- * Helper to retrieve a value from a potentially nested translation map using a dot-notated key.
5296
- */
5297
- private getValueFromMap;
5298
- /**
5299
- * Shorthand alias for `translate`.
5300
- */
5301
- t(key: string, params?: Record<string, string | number>): string;
5302
- /**
5303
- * Resolve the effective default locale from a domain-to-locale map.
5304
- * Matches `window.location.hostname` against the map keys.
5305
- * Returns the mapped locale, or the provided fallback if no match is found.
5306
- */
5307
- resolveLocaleForDomain(domainLocaleMap: Record<string, string> | undefined, fallback: string): string;
5308
- static ɵfac: i0.ɵɵFactoryDeclaration<MnLanguageService, never>;
5309
- static ɵprov: i0.ɵɵInjectableDeclaration<MnLanguageService>;
5310
- }
5311
-
5312
- /**
5313
- * Provides an APP_INITIALIZER that configures the MnLanguageService and
5314
- * preloads the requested locales during application bootstrap.
5315
- *
5316
- * Usage in app.config.ts:
5317
- * ...provideMnLanguage({
5318
- * urlPattern: 'assets/i18n/{locale}.json',
5319
- * defaultLocale: 'en',
5320
- * preload: ['en', 'nl'],
5321
- * })
5322
- */
5323
- declare function provideMnLanguage(config: MnLanguageConfig): Provider[];
5324
-
5325
- /**
5326
- * Pipe that translates a key via MnLanguageService.
5327
- *
5328
- * Usage in templates:
5329
- * {{ 'form.email.label' | mnTranslate }}
5330
- * {{ 'greeting' | mnTranslate:{ name: 'World' } }}
5331
- *
5332
- * Note: This pipe is impure so it re-evaluates when the locale changes.
5333
- */
5334
- declare class MnTranslatePipe implements PipeTransform {
5335
- private readonly lang;
5336
- transform(key: string, params?: Record<string, string | number>): string;
5337
- static ɵfac: i0.ɵɵFactoryDeclaration<MnTranslatePipe, never>;
5338
- static ɵpipe: i0.ɵɵPipeDeclaration<MnTranslatePipe, "mnTranslate", true>;
5339
- }
5340
-
5341
5445
  type MnPreviewMessage = {
5342
5446
  type: 'mn-config-update' | 'mn-translations-update';
5343
5447
  config?: Record<string, unknown>;
@@ -5355,5 +5459,5 @@ type MnPreviewMessage = {
5355
5459
  */
5356
5460
  declare function enableMnPreviewMode(configService: MnConfigService, langService: MnLanguageService, allowedOrigins?: string[]): void;
5357
5461
 
5358
- export { API_BASE_URL, ActionStyle, BackdropMode, BaseModalBuilder, CALENDAR_CONFIG, CALENDAR_DATE_FORMATTER, CalendarDayComponent, CalendarEventComponent, CalendarEventDefaultComponent, CalendarEventLayoutService, CalendarMonthComponent, CalendarUtility, CalendarView, CalendarViewComponent, CalendarWeekComponent, CloseMode, ColumnSortType, ConfirmationModalBuilder, ConfirmationTone, CrudService, CustomModalBuilder, DEFAULT_CALENDAR_CONFIG, DEFAULT_MN_ALERT_CONFIG, DefaultCalendarDateFormatter, FieldAppearance, FieldKind, FormLayoutMode, FormModalBuilder, KeyboardMode, MN_ALERT_CONFIG, MN_CALENDAR_COMPONENT_NAME, MN_CALENDAR_CONFIG, MN_CHECKBOX_CONFIG, MN_DATETIME_CONFIG, MN_ICON_MAP, MN_INPUT_FIELD_CONFIG, MN_INSTANCE_ID, MN_LIB_DUAL_HORIZONTAL_IMAGE, MN_MULTI_SELECT_CONFIG, MN_SECTION_PATH, MN_SELECT_CONFIG, MN_TEXTAREA_CONFIG, MnAlertOutletComponent, MnAlertService, MnAlertStore, MnBadge, MnButton, MnCheckbox, MnConfigService, MnConfirmationBodyComponent, MnCustomBodyHostComponent, MnDatetime, MnDualHorizontalImage, MnFormBodyComponent, MnHiddenBelowDirective, MnHttpService, MnIcon, MnIconAttributes, MnInformationCard, MnInputField, MnInstanceDirective, MnLanguageService, MnList, MnModalRef, MnModalService, MnModalShellComponent, MnMultiSelect, MnSectionDirective, MnSelect, MnShowAboveDirective, MnShowBelowDirective, MnSkeleton, MnTabComponent, MnTable, MnTextarea, MnTranslatePipe, MnWizardBodyComponent, ModalBuilder, ModalCloseReason, ModalIntent, ModalKind, ModalSize, NavigationDirection, OptionState, SelectionMode, StepBuilder, StepState, SubmitMode, UpcomingEventRowComponent, UpcomingEventsComponent, ValidationCode, ValidationStatus, WizardFlowMode, WizardModalBuilder, dateTimeAdapter, defaultTextAdapter, enableMnPreviewMode, isTranslatable, mnAlertVariants, mnBadgeVariants, mnButtonVariants, mnCheckboxVariants, mnCheckboxWrapperVariants, mnDatetimeVariants, mnIconVariants, mnInformationCardVariants, mnInputFieldVariants, mnMultiSelectVariants, mnSelectVariants, mnSkeletonVariants, mnTextareaVariants, numberAdapter, pickAdapter, provideMnAlerts, provideMnCalendarConfig, provideMnComponentConfig, provideMnConfig, provideMnLanguage, resolveCalendarConfig };
5359
- export type { AnimationOptions, ApiError, BaseModalConfig, CalendarButton, CalendarConfig, CalendarDateFormatter, CalendarEvent, CalendarEventData, CancellationActionConfig, CheckboxFieldConfig, ColorFieldConfig, ColorPreset, ColumnDay, ColumnDefinition, ColumnFilterOption, ColumnFilterState, ColumnFilterType, ConfirmationActionConfig, ConfirmationModalConfig, CrudConfig, CurrentTimeCalendarEvent, CursorPaginationStrategy, CustomFieldConfig, CustomModalConfig, DateFieldConfig, DatetimeFieldConfig, FailureResult, FieldDataSource, FieldRequiredCondition, FieldValidator, FieldVisibilityCondition, FileFieldConfig, FormFieldConfig, FormFieldGroup, FormModalConfig, FormRow, FormRowField, FormValidator, HourRow, ListAppearance, ListDataSource, ListLabels, MnAlert, MnAlertConfig, MnAlertId, MnAlertKind, MnAlertTemplateContext, MnAlertVariants, MnBadgeTypes, MnBadgeVariants, MnButtonTypes, MnButtonVariants, MnCheckboxErrorMessageData, MnCheckboxErrorMessagesData, MnCheckboxProps, MnCheckboxUIConfig, MnCheckboxVariants, MnCheckboxWrapperVariants, MnConfigFile, MnConfigSettings, MnConfigValue, MnDatetimeErrorMessageData, MnDatetimeErrorMessagesData, MnDatetimeMode, MnDatetimeProps, MnDatetimeUIConfig, MnDatetimeVariants, MnDomAttrs, MnDualHorizontalImageConfig, MnDualHorizontalImageTypes, MnErrorMessageData, MnErrorMessageFn, MnErrorMessagesData, MnIconTypes, MnIconVariants, MnImageType, MnInformationCardBaseData, MnInformationCardData, MnInformationCardVariants, MnInputAdapter, MnInputBaseProps, MnInputDateTimeProps, MnInputFieldProps, MnInputFieldUIConfig, MnInputProps, MnInputType, MnInputVariants, MnLanguageConfig, MnMultiSelectErrorMessageData, MnMultiSelectErrorMessagesData, MnMultiSelectOption, MnMultiSelectProps, MnMultiSelectUIConfig, MnMultiSelectVariants, MnPreviewMessage, MnQueryParams, MnSelectErrorMessageData, MnSelectErrorMessagesData, MnSelectOption, MnSelectProps, MnSelectUIConfig, MnSelectVariants, MnShowInput, MnSkeletonProps, MnSkeletonShape, MnSkeletonVariantProps, MnTabDataSource, MnTabItem, MnTextareaErrorMessageData, MnTextareaErrorMessagesData, MnTextareaProps, MnTextareaUIConfig, MnTextareaVariants, MnTranslatable, MnTranslationMap, MnTranslations, MnValidationErrorArgs, ModalCancelHandler, ModalCloseEvent, ModalConfig, ModalFooterAction, ModalI18nLabels, ModalInputMap, ModalPollingConfig, ModalRef, ModalResultHandler, ModalStepId, MonthItem, MultiSelectFieldConfig, MultiSelectTableFieldConfig, NumberFieldConfig, OffsetPaginationStrategy, PaginationStrategy, PasswordFieldConfig, Primitive, QueryParams, QueryValue, RatingFieldConfig, Result, ResultMeta, SelectFieldConfig, SelectOption, SingleSelectTableFieldConfig, SliderFieldConfig, SortState, StepBodyConfig, StepGuard, StepValidator, SuccessResult, TableAppearance, TableDataSource, TableLabels, TextFieldConfig, TextareaFieldConfig, ValidationResult, WizardBeforeCompleteValidator, WizardModalConfig, WizardResult, WizardStepChangeEvent, WizardStepChangeHandler, WizardStepConfig };
5462
+ export { API_BASE_URL, ActionStyle, BackdropMode, BaseModalBuilder, CALENDAR_CONFIG, CALENDAR_DATE_FORMATTER, CalendarDayComponent, CalendarEventComponent, CalendarEventDefaultComponent, CalendarEventLayoutService, CalendarMonthComponent, CalendarUtility, CalendarView, CalendarViewComponent, CalendarWeekComponent, CloseMode, ColumnSortType, ConfirmationModalBuilder, ConfirmationTone, CrudService, CustomModalBuilder, DEFAULT_CALENDAR_CONFIG, DEFAULT_MN_ALERT_CONFIG, DefaultCalendarDateFormatter, FieldAppearance, FieldKind, FormLayoutMode, FormModalBuilder, KeyboardMode, MN_ALERT_CONFIG, MN_CALENDAR_COMPONENT_NAME, MN_CALENDAR_CONFIG, MN_CHECKBOX_CONFIG, MN_DATETIME_CONFIG, MN_ICON_MAP, MN_INPUT_FIELD_CONFIG, MN_INSTANCE_ID, MN_LIB_DUAL_HORIZONTAL_IMAGE, MN_MULTI_SELECT_CONFIG, MN_SECTION_PATH, MN_SELECT_CONFIG, MN_TEXTAREA_CONFIG, MnAlertOutletComponent, MnAlertService, MnAlertStore, MnBadge, MnButton, MnCheckbox, MnCollectionBase, MnCollectionPagination, MnConfigService, MnConfirmationBodyComponent, MnCustomBodyHostComponent, MnDatetime, MnDualHorizontalImage, MnFormBodyComponent, MnGrid, MnHiddenBelowDirective, MnHttpService, MnIcon, MnIconAttributes, MnInformationCard, MnInputField, MnInstanceDirective, MnLanguageService, MnList, MnModalRef, MnModalService, MnModalShellComponent, MnMultiSelect, MnSectionDirective, MnSelect, MnSelectableCollectionBase, MnShowAboveDirective, MnShowBelowDirective, MnSkeleton, MnTabComponent, MnTable, MnTextarea, MnTranslatePipe, MnWizardBodyComponent, ModalBuilder, ModalCloseReason, ModalIntent, ModalKind, ModalSize, NavigationDirection, OptionState, SelectionMode, StepBuilder, StepState, SubmitMode, UpcomingEventRowComponent, UpcomingEventsComponent, ValidationCode, ValidationStatus, WizardFlowMode, WizardModalBuilder, dateTimeAdapter, defaultTextAdapter, enableMnPreviewMode, isTranslatable, mnAlertVariants, mnBadgeVariants, mnButtonVariants, mnCheckboxVariants, mnCheckboxWrapperVariants, mnDatetimeVariants, mnIconVariants, mnInformationCardVariants, mnInputFieldVariants, mnMultiSelectVariants, mnSelectVariants, mnSkeletonVariants, mnTextareaVariants, numberAdapter, pickAdapter, provideMnAlerts, provideMnCalendarConfig, provideMnComponentConfig, provideMnConfig, provideMnLanguage, resolveCalendarConfig };
5463
+ export type { AnimationOptions, ApiError, BaseModalConfig, CalendarButton, CalendarConfig, CalendarDateFormatter, CalendarEvent, CalendarEventData, CancellationActionConfig, CheckboxFieldConfig, ColorFieldConfig, ColorPreset, ColumnDay, ColumnDefinition, ColumnFilterOption, ColumnFilterState, ColumnFilterType, ColumnSkeleton, ConfirmationActionConfig, ConfirmationModalConfig, CrudConfig, CurrentTimeCalendarEvent, CursorPaginationStrategy, CustomFieldConfig, CustomModalConfig, DateFieldConfig, DatetimeFieldConfig, FailureResult, FieldDataSource, FieldRequiredCondition, FieldValidator, FieldVisibilityCondition, FileFieldConfig, FormFieldConfig, FormFieldGroup, FormModalConfig, FormRow, FormRowField, FormValidator, GridDataSource, GridLayout, GridSkeleton, HourRow, ListAppearance, ListDataSource, ListLabels, ListSkeleton, MnAlert, MnAlertConfig, MnAlertId, MnAlertKind, MnAlertTemplateContext, MnAlertVariants, MnBadgeTypes, MnBadgeVariants, MnButtonTypes, MnButtonVariants, MnCheckboxErrorMessageData, MnCheckboxErrorMessagesData, MnCheckboxProps, MnCheckboxUIConfig, MnCheckboxVariants, MnCheckboxWrapperVariants, MnCollectionDataSource, MnCollectionLabels, MnConfigFile, MnConfigSettings, MnConfigValue, MnDatetimeErrorMessageData, MnDatetimeErrorMessagesData, MnDatetimeMode, MnDatetimeProps, MnDatetimeUIConfig, MnDatetimeVariants, MnDomAttrs, MnDualHorizontalImageConfig, MnDualHorizontalImageTypes, MnErrorMessageData, MnErrorMessageFn, MnErrorMessagesData, MnIconTypes, MnIconVariants, MnImageType, MnInformationCardBaseData, MnInformationCardData, MnInformationCardVariants, MnInputAdapter, MnInputBaseProps, MnInputDateTimeProps, MnInputFieldProps, MnInputFieldUIConfig, MnInputProps, MnInputType, MnInputVariants, MnLanguageConfig, MnMultiSelectErrorMessageData, MnMultiSelectErrorMessagesData, MnMultiSelectOption, MnMultiSelectProps, MnMultiSelectUIConfig, MnMultiSelectVariants, MnPreviewMessage, MnQueryParams, MnSelectErrorMessageData, MnSelectErrorMessagesData, MnSelectOption, MnSelectProps, MnSelectUIConfig, MnSelectVariants, MnSelectableCollectionDataSource, MnShowInput, MnSkeletonProps, MnSkeletonShape, MnSkeletonVariantProps, MnTabDataSource, MnTabItem, MnTextareaErrorMessageData, MnTextareaErrorMessagesData, MnTextareaProps, MnTextareaUIConfig, MnTextareaVariants, MnTranslatable, MnTranslationMap, MnTranslations, MnValidationErrorArgs, ModalCancelHandler, ModalCloseEvent, ModalConfig, ModalFooterAction, ModalI18nLabels, ModalInputMap, ModalPollingConfig, ModalRef, ModalResultHandler, ModalStepId, MonthItem, MultiSelectFieldConfig, MultiSelectTableFieldConfig, NumberFieldConfig, OffsetPaginationStrategy, PaginationMode, PaginationStrategy, PasswordFieldConfig, Primitive, QueryParams, QueryValue, RatingFieldConfig, Result, ResultMeta, SelectFieldConfig, SelectOption, SingleSelectTableFieldConfig, SliderFieldConfig, SortState, StepBodyConfig, StepGuard, StepValidator, SuccessResult, TableAppearance, TableDataSource, TableLabels, TextFieldConfig, TextareaFieldConfig, ValidationResult, WizardBeforeCompleteValidator, WizardModalConfig, WizardResult, WizardStepChangeEvent, WizardStepChangeHandler, WizardStepConfig };