@meshmakers/shared-ui 3.4.1480 → 3.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/README.md +48 -0
  2. package/assets/octobot/lg/octo_blink.webp +0 -0
  3. package/assets/octobot/lg/octo_blink_still.png +0 -0
  4. package/assets/octobot/lg/octo_idle.webp +0 -0
  5. package/assets/octobot/lg/octo_idle_still.png +0 -0
  6. package/assets/octobot/lg/octo_look.webp +0 -0
  7. package/assets/octobot/lg/octo_look_still.png +0 -0
  8. package/assets/octobot/lg/octo_swim.webp +0 -0
  9. package/assets/octobot/lg/octo_swim_still.png +0 -0
  10. package/assets/octobot/lg/octo_thinking.webp +0 -0
  11. package/assets/octobot/lg/octo_thinking_still.png +0 -0
  12. package/assets/octobot/lg/octo_wave.webp +0 -0
  13. package/assets/octobot/lg/octo_wave_still.png +0 -0
  14. package/assets/octobot/md/octo_blink.webp +0 -0
  15. package/assets/octobot/md/octo_blink_still.png +0 -0
  16. package/assets/octobot/md/octo_idle.webp +0 -0
  17. package/assets/octobot/md/octo_idle_still.png +0 -0
  18. package/assets/octobot/md/octo_look.webp +0 -0
  19. package/assets/octobot/md/octo_look_still.png +0 -0
  20. package/assets/octobot/md/octo_swim.webp +0 -0
  21. package/assets/octobot/md/octo_swim_still.png +0 -0
  22. package/assets/octobot/md/octo_thinking.webp +0 -0
  23. package/assets/octobot/md/octo_thinking_still.png +0 -0
  24. package/assets/octobot/md/octo_wave.webp +0 -0
  25. package/assets/octobot/md/octo_wave_still.png +0 -0
  26. package/assets/octobot/sm/octo_blink.webp +0 -0
  27. package/assets/octobot/sm/octo_blink_still.png +0 -0
  28. package/assets/octobot/sm/octo_idle.webp +0 -0
  29. package/assets/octobot/sm/octo_idle_still.png +0 -0
  30. package/assets/octobot/sm/octo_look.webp +0 -0
  31. package/assets/octobot/sm/octo_look_still.png +0 -0
  32. package/assets/octobot/sm/octo_swim.webp +0 -0
  33. package/assets/octobot/sm/octo_swim_still.png +0 -0
  34. package/assets/octobot/sm/octo_thinking.webp +0 -0
  35. package/assets/octobot/sm/octo_thinking_still.png +0 -0
  36. package/assets/octobot/sm/octo_wave.webp +0 -0
  37. package/assets/octobot/sm/octo_wave_still.png +0 -0
  38. package/fesm2022/meshmakers-shared-ui-assistant-core.mjs +940 -0
  39. package/fesm2022/meshmakers-shared-ui-assistant-core.mjs.map +1 -0
  40. package/fesm2022/meshmakers-shared-ui-assistant.mjs +819 -0
  41. package/fesm2022/meshmakers-shared-ui-assistant.mjs.map +1 -0
  42. package/fesm2022/meshmakers-shared-ui-command-palette.mjs +817 -0
  43. package/fesm2022/meshmakers-shared-ui-command-palette.mjs.map +1 -0
  44. package/fesm2022/meshmakers-shared-ui-shell.mjs +1738 -0
  45. package/fesm2022/meshmakers-shared-ui-shell.mjs.map +1 -0
  46. package/fesm2022/meshmakers-shared-ui-testing.mjs +92 -0
  47. package/fesm2022/meshmakers-shared-ui-testing.mjs.map +1 -0
  48. package/fesm2022/meshmakers-shared-ui.mjs +1550 -203
  49. package/fesm2022/meshmakers-shared-ui.mjs.map +1 -1
  50. package/package.json +28 -2
  51. package/types/meshmakers-shared-ui-assistant-core.d.ts +732 -0
  52. package/types/meshmakers-shared-ui-assistant.d.ts +258 -0
  53. package/types/meshmakers-shared-ui-command-palette.d.ts +398 -0
  54. package/types/meshmakers-shared-ui-shell.d.ts +939 -0
  55. package/types/meshmakers-shared-ui-testing.d.ts +41 -0
  56. package/types/meshmakers-shared-ui.d.ts +1004 -154
@@ -1,9 +1,9 @@
1
- import * as i0 from '@angular/core';
1
+ import * as _angular_core from '@angular/core';
2
2
  import { TemplateRef, Type, OnDestroy, AfterViewInit, EventEmitter, ElementRef, OnInit, InjectionToken, PipeTransform, OnChanges, SimpleChanges, EnvironmentProviders } from '@angular/core';
3
3
  import * as _progress_kendo_svg_icons from '@progress/kendo-svg-icons';
4
4
  import { SVGIcon } from '@progress/kendo-svg-icons';
5
5
  import { FormGroup, ControlValueAccessor, Validator, FormControl, AbstractControl, ValidationErrors } from '@angular/forms';
6
- import { CommandBaseService, CommandItem, TreeItemData, TreeItemDataTyped, EntitySelectDataSource } from '@meshmakers/shared-services';
6
+ import { CommandItem, CommandBaseService, TreeItemData, TreeItemDataTyped, EntitySelectDataSource } from '@meshmakers/shared-services';
7
7
  import { TreeViewComponent, TreeItem, NodeClickEvent, TreeItemDropEvent } from '@progress/kendo-angular-treeview';
8
8
  import { Observable } from 'rxjs';
9
9
  import { DialogContentBase, DialogRef, WindowRef } from '@progress/kendo-angular-dialog';
@@ -13,7 +13,7 @@ import { PagerSettings, SelectableSettings, SelectionEvent, PageChangeEvent, Cel
13
13
  import { SVGIcon as SVGIcon$1 } from '@progress/kendo-svg-icons/dist/svg-icon.interface';
14
14
  import { MenuItem, ContextMenuComponent, ContextMenuSelectEvent, ContextMenuPopupEvent } from '@progress/kendo-angular-menu';
15
15
  import { AutoCompleteComponent } from '@progress/kendo-angular-dropdowns';
16
- import { CompositeFilterDescriptor, SortDescriptor, State as State$1 } from '@progress/kendo-data-query';
16
+ import { State as State$1, CompositeFilterDescriptor, SortDescriptor } from '@progress/kendo-data-query';
17
17
  import { CanDeactivate } from '@angular/router';
18
18
 
19
19
  /**
@@ -41,8 +41,8 @@ import { CanDeactivate } from '@angular/router';
41
41
  */
42
42
  declare class ListViewFiltersDirective {
43
43
  readonly templateRef: TemplateRef<any>;
44
- static ɵfac: i0.ɵɵFactoryDeclaration<ListViewFiltersDirective, never>;
45
- static ɵdir: i0.ɵɵDirectiveDeclaration<ListViewFiltersDirective, "[mmListViewFilters]", never, {}, {}, never, never, true, never>;
44
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ListViewFiltersDirective, never>;
45
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<ListViewFiltersDirective, "[mmListViewFilters]", never, {}, {}, never, never, true, never>;
46
46
  }
47
47
 
48
48
  /**
@@ -92,7 +92,12 @@ type BadgeMappingTable = Record<string, BadgeMapping>;
92
92
  interface TableColumn {
93
93
  displayName?: string | null;
94
94
  field: string;
95
- dataType?: 'text' | 'numeric' | 'numericRange' | 'boolean' | 'date' | 'iso8601' | 'bytes' | 'statusIcons' | 'cronExpression' | 'progressBar' | 'badge' | 'component';
95
+ /**
96
+ * How the cell renders and filters. `booleanIcon` (AB#5623) shows a boolean as a check / x icon
97
+ * named "<column>: Yes|No" for screen readers (`role="img"` + `aria-label`, texts from
98
+ * `messages.booleanYes` / `booleanNo`) and filters like `boolean`; see {@link booleanIcons}.
99
+ */
100
+ dataType?: 'text' | 'numeric' | 'numericRange' | 'boolean' | 'booleanIcon' | 'date' | 'iso8601' | 'bytes' | 'statusIcons' | 'cronExpression' | 'progressBar' | 'badge' | 'component';
96
101
  format?: string;
97
102
  /**
98
103
  * Column width in pixels. If not set, the column will auto-size.
@@ -173,6 +178,13 @@ interface TableColumn {
173
178
  * a pill for `true` and nothing (rather than a "false" pill) for `false`.
174
179
  */
175
180
  badgeHideUnmapped?: boolean;
181
+ /**
182
+ * Icons of a `booleanIcon` column (AB#5623). Default: a check for `true`, an x for `false`.
183
+ * Set `false: null` to leave `false` cells empty (flag columns); `null` / `undefined` values
184
+ * always render an empty cell. Colours default to the theme tokens
185
+ * `--mm-list-boolean-true-color` / `--mm-list-boolean-false-color`.
186
+ */
187
+ booleanIcons?: BooleanIconMapping;
176
188
  /**
177
189
  * Optional callback that produces the cell's display string.
178
190
  * When set, this overrides the default rendering selected by `dataType`.
@@ -209,6 +221,17 @@ interface TableColumn {
209
221
  */
210
222
  cellInputs?: (item: unknown) => Record<string, unknown>;
211
223
  }
224
+ /** Icons of a `booleanIcon` column (AB#5623). */
225
+ interface BooleanIconMapping {
226
+ /** Icon for `true`. Default: a check icon. */
227
+ true?: SVGIcon;
228
+ /** Icon for `false`; `null` = no icon (empty cell). Default: an x icon. */
229
+ false?: SVGIcon | null;
230
+ /** CSS colour of the `true` icon. Default: `var(--mm-list-boolean-true-color, var(--kendo-color-success))`. */
231
+ trueColor?: string;
232
+ /** CSS colour of the `false` icon. Default: `var(--mm-list-boolean-false-color, var(--kendo-color-subtle))`. */
233
+ falseColor?: string;
234
+ }
212
235
  type ColumnDefinition = string | TableColumn;
213
236
  type ContextMenuType = 'contextMenu' | 'actionMenu';
214
237
  /**
@@ -230,6 +253,11 @@ type RowClassFn = (context: {
230
253
  /**
231
254
  * Translatable messages for the ListViewComponent.
232
255
  * Pass translated strings to override the English defaults.
256
+ *
257
+ * Members added after the interface was first published are optional, so an app that builds a
258
+ * complete `ListViewMessages` object for an older library version keeps compiling; a member that
259
+ * is missing (or `undefined`) falls back to {@link DEFAULT_LIST_VIEW_MESSAGES}. New members must
260
+ * be added as optional for the same reason.
233
261
  */
234
262
  interface ListViewMessages {
235
263
  /** Search input placeholder. Default: "Search in all columns..." */
@@ -242,12 +270,20 @@ interface ListViewMessages {
242
270
  exportToPdf: string;
243
271
  /** Tooltip for "Refresh Data" button. Default: "Refresh Data" */
244
272
  refreshData: string;
245
- /** Tooltip for the "Reset Filters" button. Default: "Reset Filters" */
246
- resetFilters: string;
247
- /** Tooltip for the collapsed command menu. Default: "Commands" */
248
- commands: string;
273
+ /** Tooltip for the "Reset Filters" button. Default: "Reset Filters". Optional (added in 3.4). */
274
+ resetFilters?: string;
275
+ /** Tooltip for the collapsed command menu. Default: "Commands". Optional (added in 3.4). */
276
+ commands?: string;
249
277
  /** Title for the actions command column. Default: "Actions" */
250
278
  actionsColumnTitle: string;
279
+ /** Accessible name of a row's menu button; `{name}` = the row's name. Default: "Actions for {name}" */
280
+ rowActionsFor?: string;
281
+ /** Accessible name of a row's menu button when the row has no name. Default: "Row actions" */
282
+ rowActions?: string;
283
+ /** Disabled reason of a row action whose `CommandItem` has no `disabledReason` (AB#5572). Default: "Not available for this row" */
284
+ rowActionUnavailable?: string;
285
+ /** Disabled reason of every row action while the list loads (AB#5572). Default: "The list is loading" */
286
+ rowActionsLoading?: string;
251
287
  /** PDF footer page template. Default: "Page {pageNum} of {totalPages}" */
252
288
  pdfPageTemplate: string;
253
289
  /** Pager: text after page size selector. Default: "items per page" */
@@ -268,6 +304,34 @@ interface ListViewMessages {
268
304
  pagerNextPage: string;
269
305
  /** Grid: no records message. Default: "No records available." */
270
306
  noRecords: string;
307
+ /** Empty state title while a search or filter matches nothing (`emptyState` set, AB#3444). Default: "No results". Optional. */
308
+ noResultsTitle?: string;
309
+ /** Empty state text while a search or filter matches nothing (AB#3444). Default: "Nothing matches the current search or filter." Optional. */
310
+ noResultsText?: string;
311
+ /** Accessible value of a `booleanIcon` cell that is true (AB#5623). Default: "Yes". Optional. */
312
+ booleanYes?: string;
313
+ /** Accessible value of a `booleanIcon` cell that is false (AB#5623). Default: "No". Optional. */
314
+ booleanNo?: string;
315
+ /** Accessible name of a `booleanIcon` cell; `{column}` = column name, `{value}` = Yes / No (AB#5623). Default: "{column}: {value}". Optional. */
316
+ booleanIconLabel?: string;
317
+ }
318
+ /**
319
+ * Texts of the list's shared empty state (`mm-list-view [emptyState]`, AB#3444). `title` / `text`
320
+ * describe a list without records ("No data flows yet"); the `filtered*` texts override the
321
+ * "no results" texts of {@link ListViewMessages} while a search or filter is active.
322
+ */
323
+ interface MmListEmptyState {
324
+ title: string;
325
+ text?: string | null;
326
+ filteredTitle?: string | null;
327
+ filteredText?: string | null;
328
+ }
329
+ /** Template context of `mm-list-view [emptyTemplate]` (AB#3444). */
330
+ interface MmListEmptyContext {
331
+ /** Same as `filtered`. */
332
+ $implicit: boolean;
333
+ /** A search, row filter or host filter is active (an empty list means "no results"). */
334
+ filtered: boolean;
271
335
  }
272
336
  /**
273
337
  * One entry of the list toolbar's command group (row filter, exports, reset,
@@ -280,10 +344,212 @@ interface ListViewCommand {
280
344
  svgIcon: SVGIcon;
281
345
  }
282
346
  /**
283
- * Default English messages for the ListViewComponent.
347
+ * Default English messages for the ListViewComponent. Complete: every member, including the
348
+ * optional ones, has a value.
349
+ */
350
+ declare const DEFAULT_LIST_VIEW_MESSAGES: Required<ListViewMessages>;
351
+ /**
352
+ * Merges app-supplied list-view messages over {@link DEFAULT_LIST_VIEW_MESSAGES}. Members that
353
+ * are missing, `undefined` or `null` keep their default, so an app compiled against an older
354
+ * `ListViewMessages` shape (or one that leaves a translation unset) never renders an empty label.
355
+ */
356
+ declare function resolveListViewMessages(messages: Partial<ListViewMessages> | null | undefined): Required<ListViewMessages>;
357
+
358
+ /**
359
+ * One user action (AB#5570): a row action, a toolbar action or a page action. The same
360
+ * definition drives the inline icon button, the overflow menu item and the text button, so
361
+ * label, icon, danger styling and the disabled reason never diverge between them.
362
+ *
363
+ * See `octo-frontend-refinery-studio/docs/concepts/studio-action-guideline.md`.
364
+ */
365
+ interface MmAction<TId extends string = string> {
366
+ /** Stable id, emitted with the event and rendered as `data-action` (tests, analytics). */
367
+ id: TId;
368
+ /**
369
+ * Verb phrase in sentence case ("Edit", "Delete dump", "Set value"). Used as tooltip,
370
+ * menu/button text (unless `menuLabel` is set) and — together with the row label — as the
371
+ * accessible name. Never ends with "…"; put that into `menuLabel`.
372
+ */
373
+ label: string;
374
+ /**
375
+ * Visible text in menus and text buttons when it differs from `label` — typically the "…" of
376
+ * actions that open a dialog ("Delete dump…"). Tooltips and accessible names keep `label`.
377
+ * Falls back to `label`.
378
+ */
379
+ menuLabel?: string;
380
+ /** Kendo SVG icon; take it from {@link MM_ACTION_ICONS} where a canonical icon exists. */
381
+ icon?: SVGIcon;
382
+ /** Destructive action: danger styling; the handler must confirm (danger dialog, named target). */
383
+ danger?: boolean;
384
+ /**
385
+ * Why the action is not available right now. A non-empty reason disables the action
386
+ * (`aria-disabled`, still focusable) and is announced via `aria-describedby` and shown in
387
+ * the tooltip. `null`/`undefined`/`''` = enabled.
388
+ */
389
+ disabledReason?: string | null;
390
+ /** `false` hides the action (no permission, not applicable to this row). Default: visible. */
391
+ visible?: boolean;
392
+ /** Always place the action in the overflow menu, even when there is room inline. */
393
+ overflow?: boolean;
394
+ /**
395
+ * Navigation target. Inline the action renders as a real link (`routerLink`, open in new tab
396
+ * works); in the overflow menu it navigates with the Router. `triggered` still fires.
397
+ */
398
+ link?: MmActionLink;
399
+ }
400
+ /** Router target of a navigating action (`Router.navigate(commands, {queryParams})`). */
401
+ interface MmActionLink {
402
+ commands: readonly unknown[] | string;
403
+ queryParams?: Record<string, string>;
404
+ }
405
+ /** Emitted when an enabled action is triggered. */
406
+ interface MmActionEvent<TId extends string = string> {
407
+ id: TId;
408
+ action: MmAction<TId>;
409
+ }
410
+ /** Default number of row action slots (inline buttons incl. the overflow button). */
411
+ declare const MM_ROW_ACTIONS_MAX_INLINE = 3;
412
+ /**
413
+ * Canonical action icons (AB#5570). One verb, one icon, everywhere: pick from this map
414
+ * instead of importing a Kendo icon ad hoc, so "Edit" never shows a gear in one list and a
415
+ * pencil in the next.
416
+ */
417
+ declare const MM_ACTION_ICONS: {
418
+ /** Create a new item ("New adapter", "Add mapping"). */
419
+ readonly add: SVGIcon;
420
+ /** Edit / open the editable form of the item. */
421
+ readonly edit: SVGIcon;
422
+ /** Read-only view / preview. */
423
+ readonly view: SVGIcon;
424
+ /** Open the item (or a related page) in its own view / new tab. */
425
+ readonly open: SVGIcon;
426
+ /** Delete / remove the item (always `danger`). */
427
+ readonly delete: SVGIcon;
428
+ /** Clear a stored value without deleting the item ("Not needed", "Clear secret"). */
429
+ readonly clear: SVGIcon;
430
+ /** Copy an id or value to the clipboard. */
431
+ readonly copy: SVGIcon;
432
+ /** Duplicate the item as a new item. */
433
+ readonly duplicate: SVGIcon;
434
+ /** Reload data. */
435
+ readonly refresh: SVGIcon;
436
+ /** Deploy to a pool / cluster. */
437
+ readonly deploy: SVGIcon;
438
+ /** Undeploy. */
439
+ readonly undeploy: SVGIcon;
440
+ /** Run / execute / start. */
441
+ readonly run: SVGIcon;
442
+ /** Stop / cancel a running job. */
443
+ readonly stop: SVGIcon;
444
+ /** Export data (file the user saves). */
445
+ readonly export: SVGIcon;
446
+ /** Import data. */
447
+ readonly import: SVGIcon;
448
+ /** Download a file. */
449
+ readonly download: SVGIcon;
450
+ /** Show a report / log. */
451
+ readonly report: SVGIcon;
452
+ /** Restore / roll back to a stored state (e.g. restore a dump); destructive restores are `danger`. */
453
+ readonly restore: SVGIcon;
454
+ /** Pin to a start page / favourites ("Pin to Home"). */
455
+ readonly pin: SVGIcon;
456
+ /** Remove a pin ("Unpin from Home"). */
457
+ readonly unpin: SVGIcon;
458
+ /** Merge one item into another (e.g. merge users); usually `danger`. */
459
+ readonly merge: SVGIcon;
460
+ /** Reset / set a password. */
461
+ readonly resetPassword: SVGIcon;
462
+ /** Fill a past time range from the source data (e.g. rollup backfill). */
463
+ readonly backfill: SVGIcon;
464
+ /** Recalculate derived values for a range (e.g. rollup recompute); not the same as `refresh`. */
465
+ readonly recompute: SVGIcon;
466
+ };
467
+ type MmActionIconName = keyof typeof MM_ACTION_ICONS;
468
+ /** True when the action is disabled (non-empty {@link MmAction.disabledReason}). */
469
+ declare function isActionDisabled(action: MmAction): boolean;
470
+ /** True unless the action is explicitly hidden. */
471
+ declare function isActionVisible(action: MmAction): boolean;
472
+ /**
473
+ * Accessible name of an action on a named target: "Delete dump Encrypt run 2026-10-06 17:09".
474
+ * Without a target the label alone.
475
+ */
476
+ declare function actionAccessibleName(action: MmAction, targetLabel?: string | null): string;
477
+ /** Tooltip: the label, plus the reason when disabled ("Delete dump — Requires SecretManagement"). */
478
+ declare function actionTooltip(action: MmAction): string;
479
+ /**
480
+ * Splits visible actions into inline buttons and overflow-menu items. At most `maxInline`
481
+ * slots are rendered: when the actions do not fit, the last slot becomes the overflow
482
+ * button. Actions with `overflow: true` always go to the menu (and need the overflow slot).
284
483
  */
285
- declare const DEFAULT_LIST_VIEW_MESSAGES: ListViewMessages;
484
+ declare function splitRowActions<TId extends string>(actions: readonly MmAction<TId>[], maxInline?: number): {
485
+ inline: MmAction<TId>[];
486
+ menu: MmAction<TId>[];
487
+ };
286
488
 
489
+ /**
490
+ * A row action of `mm-list-view` (AB#5572), declared once per list from the shared action model
491
+ * ({@link MmAction}): the per-row parts (`disabledReason`, `visible`, `link`) may be callbacks that
492
+ * receive the row. Rendered with the guideline rules — neutral icon buttons (danger colour only for
493
+ * `danger` actions), tooltip = label, accessible name = label + row name, at most
494
+ * `maxInlineRowActions` slots (default 3; the last one becomes "More actions for …"), disabled
495
+ * actions stay focusable and announce their reason.
496
+ *
497
+ * ```ts
498
+ * protected readonly rowActions: MmListRowAction<AdapterDto>[] = [
499
+ * { id: 'edit', label: 'Edit', icon: MM_ACTION_ICONS.edit, link: (row) => ({ commands: ['details', row.rtId] }) },
500
+ * { id: 'delete', label: 'Delete', menuLabel: 'Delete…', icon: MM_ACTION_ICONS.delete, danger: true,
501
+ * disabledReason: (row) => row.deployed ? 'Undeploy the adapter first' : null, run: (row) => this.delete(row) },
502
+ * ];
503
+ * ```
504
+ * ```html
505
+ * <mm-list-view [rowActions]="rowActions" (rowAction)="onRowAction($event)" … />
506
+ * ```
507
+ */
508
+ interface MmListRowAction<TRow = any, TId extends string = string> extends Omit<MmAction<TId>, 'disabledReason' | 'visible' | 'link'> {
509
+ /** Why the action is unavailable for this row; non-empty = disabled (focusable, announced). */
510
+ disabledReason?: string | null | ((row: TRow) => string | null | undefined);
511
+ /** `false` (or a callback returning false) hides the action for the row. */
512
+ visible?: boolean | ((row: TRow) => boolean);
513
+ /** Navigation target (inline: real router link; overflow menu: Router.navigate relative to the host route). */
514
+ link?: MmActionLink | ((row: TRow) => MmActionLink | null | undefined);
515
+ /** Optional handler; `(rowAction)` fires as well. Destructive handlers confirm first (danger dialog). */
516
+ run?: (row: TRow) => void | Promise<void>;
517
+ }
518
+ /** Emitted by `(rowAction)` for an enabled row action. */
519
+ interface MmListRowActionEvent<TRow = any, TId extends string = string> {
520
+ id: TId;
521
+ action: MmAction<TId>;
522
+ row: TRow;
523
+ }
524
+ /**
525
+ * One row action resolved for a concrete row: the rendered {@link MmAction} plus where it came from —
526
+ * a legacy `CommandItem` (`actionCommandItems`, handled via the CommandItem's link / onClick) or a
527
+ * {@link MmListRowAction} (`rowActions`).
528
+ */
529
+ interface ResolvedListRowAction {
530
+ action: MmAction;
531
+ commandItem?: CommandItem;
532
+ rowAction?: MmListRowAction;
533
+ }
534
+ /**
535
+ * Human label of a list row (AB#5623) — the row's name in row action names ("Actions for <label>"),
536
+ * dialog titles and danger confirmations. Reads `field` (a dotted path such as `contact.displayName`
537
+ * also works, a flat key with dots wins), then each of `fallbacks` (default `rtWellKnownName`,
538
+ * `rtId`); the first non-blank value wins. `''` when none is set.
539
+ */
540
+ declare function resolveListRowLabel(row: unknown, field: string | null | undefined, fallbacks?: readonly string[]): string;
541
+ /** Resolves the per-row callbacks of a {@link MmListRowAction}. */
542
+ declare function resolveListRowAction(definition: MmListRowAction, row: unknown): MmAction;
543
+ /** Structural equality of two rendered actions (keeps object identity stable across change detection). */
544
+ declare function sameAction(a: MmAction, b: MmAction): boolean;
545
+
546
+ /** Row actions of one row, split for rendering (AB#5572). */
547
+ interface RowActionsView {
548
+ inline: ResolvedListRowAction[];
549
+ menu: ResolvedListRowAction[];
550
+ /** The "…" button is shown (overflowing actions and/or context menu items). */
551
+ hasMenu: boolean;
552
+ }
287
553
  declare class ListViewComponent extends CommandBaseService implements OnDestroy, AfterViewInit {
288
554
  private readonly cronHumanizer;
289
555
  protected _columns: TableColumn[];
@@ -296,16 +562,27 @@ declare class ListViewComponent extends CommandBaseService implements OnDestroy,
296
562
  private _actionMenuSelectedRow;
297
563
  private _contextMenuSelectedRow;
298
564
  protected _actionMenuItems: MenuItem[];
565
+ private _rowActions;
566
+ /** Per-row resolved actions; identical results keep their identity (no NG0100, no re-render churn). */
567
+ private rowActionCache;
568
+ private readonly activatedRoute;
569
+ private readonly routerForActions;
299
570
  protected _contextMenuItems: MenuItem[];
300
571
  protected _showRowFilter: boolean;
301
572
  /** Indicates if the data source is currently loading data */
302
- protected isLoading: i0.WritableSignal<boolean>;
573
+ protected isLoading: _angular_core.WritableSignal<boolean>;
574
+ /**
575
+ * Whether the data source reported "not loading" at least once (AB#3444). {@link isLoading}
576
+ * follows the data source one macrotask late (asyncScheduler), so the first render would
577
+ * otherwise show the empty state while the first fetch is already in flight.
578
+ */
579
+ protected readonly loadSettled: _angular_core.WritableSignal<boolean>;
303
580
  /**
304
581
  * The component's own width in pixels, kept current via ResizeObserver.
305
582
  * `null` until the first measurement (before that, all columns render visible
306
583
  * and auto-sized). Drives `hideBelow` column hiding and `minWidth` pinning.
307
584
  */
308
- protected readonly containerWidth: i0.WritableSignal<number | null>;
585
+ protected readonly containerWidth: _angular_core.WritableSignal<number | null>;
309
586
  private readonly hostElement;
310
587
  private readonly ngZone;
311
588
  private resizeObserver?;
@@ -357,6 +634,20 @@ declare class ListViewComponent extends CommandBaseService implements OnDestroy,
357
634
  set actionCommandItems(commandItems: CommandItem[]);
358
635
  get contextMenuCommandItems(): CommandItem[];
359
636
  set contextMenuCommandItems(commandItems: CommandItem[]);
637
+ /**
638
+ * Row actions from the shared action model (AB#5572) — preferred over `actionCommandItems`.
639
+ * Rendered after the `actionCommandItems` (which keep working through an adapter); together they
640
+ * get at most {@link maxInlineRowActions} slots, the rest goes into the row's overflow menu.
641
+ */
642
+ set rowActions(actions: readonly MmListRowAction[] | null | undefined);
643
+ get rowActions(): readonly MmListRowAction[];
644
+ /**
645
+ * Row action slots incl. the overflow ("…") button (guideline §2.2: 3). When the actions do not
646
+ * fit, the last slot opens the overflow menu with the remaining actions and the context menu items.
647
+ */
648
+ maxInlineRowActions: number;
649
+ /** An enabled {@link rowActions} action was triggered (inline or from the overflow menu). */
650
+ rowAction: EventEmitter<MmListRowActionEvent<any, string>>;
360
651
  excelExportFileName: string;
361
652
  pdfExportFileName: string;
362
653
  pageable: PagerSettings;
@@ -412,6 +703,10 @@ declare class ListViewComponent extends CommandBaseService implements OnDestroy,
412
703
  * case the column has to be wide enough for.
413
704
  */
414
705
  private get maxActionButtons();
706
+ /** The context menu is opened from the row's "…" button (not by right click). */
707
+ private get hasContextMenuButton();
708
+ /** The list renders an actions column / card actions at all. */
709
+ protected get hasRowActions(): boolean;
415
710
  /**
416
711
  * The actions column width actually used.
417
712
  *
@@ -456,14 +751,50 @@ declare class ListViewComponent extends CommandBaseService implements OnDestroy,
456
751
  * the window ever resizing.
457
752
  */
458
753
  collapseCommandsBelow: number;
754
+ /**
755
+ * Tells the list that the host holds filters of its own (quick-view bars,
756
+ * app-side field filters) that a reset would clear. The toolbar's reset
757
+ * button only shows while something is filtered, and the list cannot see
758
+ * those host filters by itself.
759
+ */
760
+ hasExternalFilters: boolean;
761
+ /**
762
+ * Empty state of the list (AB#3444): when set, a list without records shows the shared
763
+ * `mm-empty-state` — one OctoBot `idle` with {@link MmListEmptyState.title} / `text` — instead
764
+ * of the plain "No records available." line; while a search, row filter or host filter
765
+ * ({@link hasExternalFilters}) is active it shows OctoBot `look` with the "no results" texts.
766
+ * Nothing is shown while the list loads (including before the first fetch answered). The figure appears once per list, never in rows.
767
+ */
768
+ emptyState: MmListEmptyState | null;
769
+ /**
770
+ * Fully custom empty state (wins over {@link emptyState}). Context: `$implicit` / `filtered`
771
+ * is `true` while a search or filter is active.
772
+ */
773
+ emptyTemplate: TemplateRef<MmListEmptyContext> | null;
774
+ /**
775
+ * Whether a search, row filter or host filter narrows the rows right now (sorting does not),
776
+ * i.e. an empty list means "no results" rather than "no records yet".
777
+ */
778
+ protected get isFiltered(): boolean;
779
+ protected get emptyContext(): MmListEmptyContext;
780
+ /**
781
+ * Whether anything narrows or reorders the default view right now: a row
782
+ * filter, a column sort, free-text search, or host-side filters announced
783
+ * through {@link hasExternalFilters}. Paging is deliberately not counted —
784
+ * the pager already gets back to page 1.
785
+ */
786
+ protected get hasActiveFilters(): boolean;
459
787
  /** True while the command buttons are collapsed into the overflow menu. */
460
788
  protected get commandsCollapsed(): boolean;
461
789
  /**
462
790
  * The commands available right now, in toolbar order. The row filter is
463
791
  * omitted in card mode: cards have no column headers for a filter row to
464
792
  * appear in, and the grid already drops `filterable` there — leaving the
465
- * button visible offered to toggle something that cannot exist. Reset stays
466
- * available, or a filter set before the switch could never be cleared.
793
+ * button visible offered to toggle something that cannot exist. Reset shows
794
+ * only while something is actually filtered, sorted or searched (see
795
+ * {@link hasActiveFilters}); on the default view there is nothing to reset,
796
+ * so the button would only be noise. It is independent of card mode, so a
797
+ * filter set before the switch can still be cleared.
467
798
  */
468
799
  protected get toolbarCommands(): ListViewCommand[];
469
800
  /**
@@ -486,9 +817,13 @@ declare class ListViewComponent extends CommandBaseService implements OnDestroy,
486
817
  */
487
818
  rowClass: RowClassFn | undefined;
488
819
  protected readonly defaultRowClass: RowClassFn;
489
- protected _messages: ListViewMessages;
490
- set messages(value: Partial<ListViewMessages>);
491
- get messages(): ListViewMessages;
820
+ protected _messages: Required<ListViewMessages>;
821
+ /**
822
+ * Translated messages. Partial: members that are not supplied (or are `undefined`) keep the
823
+ * English default from `DEFAULT_LIST_VIEW_MESSAGES`.
824
+ */
825
+ set messages(value: Partial<ListViewMessages> | null | undefined);
826
+ get messages(): Required<ListViewMessages>;
492
827
  selectable: SelectableSettings;
493
828
  set columns(cols: ColumnDefinition[]);
494
829
  get columns(): TableColumn[];
@@ -550,6 +885,22 @@ declare class ListViewComponent extends CommandBaseService implements OnDestroy,
550
885
  * with a hint message.
551
886
  */
552
887
  protected getToolbarItemDisabled(commandItem: CommandItem): boolean;
888
+ /**
889
+ * Accessible name of a host toolbar action. A button with a visible text is named by that
890
+ * text; an icon-only one (no text) gets its tooltip as `aria-label`, because `title` alone is
891
+ * not reliably announced (action guideline §2.2: icon-only = tooltip + aria-label).
892
+ */
893
+ protected toolbarItemAriaLabel(commandItem: CommandItem): string | null;
894
+ private readonly buttonAttributesCache;
895
+ private static readonly NO_BUTTON_ATTRIBUTES;
896
+ /**
897
+ * `buttonAttributes` for Kendo split / dropdown buttons: same rule as
898
+ * {@link toolbarItemAriaLabel}, cached per label so change detection sees a stable object.
899
+ */
900
+ protected toolbarItemButtonAttributes(commandItem: CommandItem): Record<string, string>;
901
+ /** `buttonAttributes` of the icon-only menu the commands collapse into. */
902
+ protected get commandsMenuButtonAttributes(): Record<string, string>;
903
+ private ariaLabelAttributes;
553
904
  protected getValue(element: Record<string, unknown>, column: TableColumn): unknown;
554
905
  /**
555
906
  * Produces the formatted cell content when a column defines a `formatter` callback.
@@ -564,6 +915,23 @@ declare class ListViewComponent extends CommandBaseService implements OnDestroy,
564
915
  */
565
916
  protected getCellTitle(element: Record<string, unknown>, column: TableColumn): string | null;
566
917
  protected getFilterType(column: TableColumn): 'text' | 'numeric' | 'boolean' | 'date';
918
+ /**
919
+ * State of a `booleanIcon` cell (AB#5623): `'true'` / `'false'` for booleans (also the strings
920
+ * "true" / "false"), `null` for an empty or non-boolean value (empty cell).
921
+ */
922
+ protected booleanIconState(element: Record<string, unknown>, column: TableColumn): 'true' | 'false' | null;
923
+ /** Icon of a `booleanIcon` cell: the column's `booleanIcons`, else check / x; `null` = no icon. */
924
+ protected booleanIcon(column: TableColumn, state: 'true' | 'false'): SVGIcon$1 | null;
925
+ /** Accessible name of a `booleanIcon` cell: "<column>: Yes|No" from the messages (AB#5623). */
926
+ protected booleanIconLabel(column: TableColumn, state: 'true' | 'false'): string;
927
+ /** Input attributes of a read-only boolean cell, cached per column and name (AB#5621). */
928
+ private readonly booleanCellAttributeCache;
929
+ /**
930
+ * Input attributes of a `boolean` cell's read-only checkbox: its accessible name is the column's
931
+ * display name (AB#5621), so a screen reader announces "<column>, checked" instead of an unnamed
932
+ * checkbox.
933
+ */
934
+ protected booleanCellAttributes(column: TableColumn): Record<string, string>;
567
935
  /**
568
936
  * Gets all status field configurations for a statusIcons column.
569
937
  * Returns an array of StatusFieldConfig, whether the column uses single or multi-field configuration.
@@ -636,11 +1004,34 @@ declare class ListViewComponent extends CommandBaseService implements OnDestroy,
636
1004
  */
637
1005
  private clampContextMenuX;
638
1006
  protected onSelectOptionActionItem(event: Event, dataItem: unknown, menuItem: MenuItem): Promise<void>;
1007
+ /**
1008
+ * Row field naming a row for assistive technology (row menu "Actions for <name>", action
1009
+ * buttons "<action> <name>"). Falls back to `rtWellKnownName`, then `rtId`. A dotted path
1010
+ * (`contact.displayName`) reads a nested value (AB#5623).
1011
+ */
1012
+ rowLabelField: string;
1013
+ /** Human name of a row (`rowLabelField`, `rtWellKnownName`, `rtId`), or '' when unknown. */
1014
+ protected rowLabel(dataItem: unknown): string;
1015
+ /** Accessible name and tooltip of the row menu button. */
1016
+ protected rowActionsLabel(dataItem: unknown): string;
639
1017
  protected getMenuItemVisible(menuItem: MenuItem, dataItem: unknown): boolean;
640
1018
  protected getMenuItemDisabled(menuItem: MenuItem, dataItem: unknown): boolean;
641
1019
  protected onContextMenu(dataItem: unknown, e: PointerEvent): void;
642
1020
  private buildContextMenuItemsWithDisabledState;
643
1021
  protected onContextMenuClosed(_event: ContextMenuPopupEvent): void;
1022
+ /**
1023
+ * Row actions of one row (AB#5572): `actionCommandItems` (adapter) followed by `rowActions`,
1024
+ * split into inline buttons and overflow-menu entries (max {@link maxInlineRowActions} slots,
1025
+ * context menu items and `overflow: true` actions force the "…" button).
1026
+ */
1027
+ protected rowActionsView(dataItem: unknown): RowActionsView;
1028
+ /** Accessible name of the row action group: "Actions for <row>". */
1029
+ protected rowActionsGroupLabel(dataItem: unknown): string;
1030
+ protected onInlineRowAction(entry: ResolvedListRowAction, dataItem: unknown): Promise<void>;
1031
+ private triggerRowAction;
1032
+ /** `CommandItem` → `MmAction` adapter (AB#5572): `isDisabled` → reason, `danger`, icon, text. */
1033
+ private commandItemAction;
1034
+ private stableView;
644
1035
  protected onToolbarCommand(commandItem: CommandItem): Promise<void>;
645
1036
  protected onToolbarDropdownItemClick(childItem: CommandItem): Promise<void>;
646
1037
  private buildMenuItems;
@@ -654,8 +1045,8 @@ declare class ListViewComponent extends CommandBaseService implements OnDestroy,
654
1045
  * are told apart by meaning rather than by dot orientation.
655
1046
  */
656
1047
  protected readonly commandsIcon: SVGIcon$1;
657
- static ɵfac: i0.ɵɵFactoryDeclaration<ListViewComponent, never>;
658
- static ɵcmp: i0.ɵɵComponentDeclaration<ListViewComponent, "mm-list-view", never, { "pageSize": { "alias": "pageSize"; "required": false; }; "skip": { "alias": "skip"; "required": false; }; "autoPageSize": { "alias": "autoPageSize"; "required": false; }; "rowIsClickable": { "alias": "rowIsClickable"; "required": false; }; "showRowCheckBoxes": { "alias": "showRowCheckBoxes"; "required": false; }; "showRowSelectAllCheckBox": { "alias": "showRowSelectAllCheckBox"; "required": false; }; "contextMenuType": { "alias": "contextMenuType"; "required": false; }; "leftToolbarActions": { "alias": "leftToolbarActions"; "required": false; }; "rightToolbarActions": { "alias": "rightToolbarActions"; "required": false; }; "actionCommandItems": { "alias": "actionCommandItems"; "required": false; }; "contextMenuCommandItems": { "alias": "contextMenuCommandItems"; "required": false; }; "excelExportFileName": { "alias": "excelExportFileName"; "required": false; }; "pdfExportFileName": { "alias": "pdfExportFileName"; "required": false; }; "pageable": { "alias": "pageable"; "required": false; }; "sortable": { "alias": "sortable"; "required": false; }; "rowFilterEnabled": { "alias": "rowFilterEnabled"; "required": false; }; "searchTextBoxEnabled": { "alias": "searchTextBoxEnabled"; "required": false; }; "persistListState": { "alias": "persistListState"; "required": false; }; "listStateKey": { "alias": "listStateKey"; "required": false; }; "resizable": { "alias": "resizable"; "required": false; }; "actionsColumnWidth": { "alias": "actionsColumnWidth"; "required": false; }; "hideCheckboxesBelow": { "alias": "hideCheckboxesBelow"; "required": false; }; "cardModeBelow": { "alias": "cardModeBelow"; "required": false; }; "collapseCommandsBelow": { "alias": "collapseCommandsBelow"; "required": false; }; "rowClass": { "alias": "rowClass"; "required": false; }; "messages": { "alias": "messages"; "required": false; }; "selectable": { "alias": "selectable"; "required": false; }; "columns": { "alias": "columns"; "required": false; }; }, { "rowClicked": "rowClicked"; "resetFilters": "resetFilters"; }, ["filtersTemplate"], never, true, never>;
1048
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ListViewComponent, never>;
1049
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ListViewComponent, "mm-list-view", never, { "pageSize": { "alias": "pageSize"; "required": false; }; "skip": { "alias": "skip"; "required": false; }; "autoPageSize": { "alias": "autoPageSize"; "required": false; }; "rowIsClickable": { "alias": "rowIsClickable"; "required": false; }; "showRowCheckBoxes": { "alias": "showRowCheckBoxes"; "required": false; }; "showRowSelectAllCheckBox": { "alias": "showRowSelectAllCheckBox"; "required": false; }; "contextMenuType": { "alias": "contextMenuType"; "required": false; }; "leftToolbarActions": { "alias": "leftToolbarActions"; "required": false; }; "rightToolbarActions": { "alias": "rightToolbarActions"; "required": false; }; "actionCommandItems": { "alias": "actionCommandItems"; "required": false; }; "contextMenuCommandItems": { "alias": "contextMenuCommandItems"; "required": false; }; "rowActions": { "alias": "rowActions"; "required": false; }; "maxInlineRowActions": { "alias": "maxInlineRowActions"; "required": false; }; "excelExportFileName": { "alias": "excelExportFileName"; "required": false; }; "pdfExportFileName": { "alias": "pdfExportFileName"; "required": false; }; "pageable": { "alias": "pageable"; "required": false; }; "sortable": { "alias": "sortable"; "required": false; }; "rowFilterEnabled": { "alias": "rowFilterEnabled"; "required": false; }; "searchTextBoxEnabled": { "alias": "searchTextBoxEnabled"; "required": false; }; "persistListState": { "alias": "persistListState"; "required": false; }; "listStateKey": { "alias": "listStateKey"; "required": false; }; "resizable": { "alias": "resizable"; "required": false; }; "actionsColumnWidth": { "alias": "actionsColumnWidth"; "required": false; }; "hideCheckboxesBelow": { "alias": "hideCheckboxesBelow"; "required": false; }; "cardModeBelow": { "alias": "cardModeBelow"; "required": false; }; "collapseCommandsBelow": { "alias": "collapseCommandsBelow"; "required": false; }; "hasExternalFilters": { "alias": "hasExternalFilters"; "required": false; }; "emptyState": { "alias": "emptyState"; "required": false; }; "emptyTemplate": { "alias": "emptyTemplate"; "required": false; }; "rowClass": { "alias": "rowClass"; "required": false; }; "messages": { "alias": "messages"; "required": false; }; "selectable": { "alias": "selectable"; "required": false; }; "columns": { "alias": "columns"; "required": false; }; "rowLabelField": { "alias": "rowLabelField"; "required": false; }; }, { "rowClicked": "rowClicked"; "rowAction": "rowAction"; "resetFilters": "resetFilters"; }, ["filtersTemplate"], never, true, never>;
659
1050
  }
660
1051
 
661
1052
  declare const upload: {
@@ -675,9 +1066,9 @@ declare class UploadFileDialogComponent extends DialogContentBase {
675
1066
  message: string;
676
1067
  mimeTypes: string | null;
677
1068
  fileExtensions: string | null;
678
- protected fileName: i0.WritableSignal<string>;
679
- protected fileSize: i0.WritableSignal<number>;
680
- protected uploadProgress: i0.WritableSignal<number>;
1069
+ protected fileName: _angular_core.WritableSignal<string>;
1070
+ protected fileSize: _angular_core.WritableSignal<number>;
1071
+ protected uploadProgress: _angular_core.WritableSignal<number>;
681
1072
  protected fileInput: ElementRef | undefined;
682
1073
  protected selectedFile: File | null;
683
1074
  protected uploadSuccess: boolean;
@@ -692,8 +1083,8 @@ declare class UploadFileDialogComponent extends DialogContentBase {
692
1083
  onCancel(): void;
693
1084
  protected get upload(): typeof upload;
694
1085
  protected get deleteIcon(): typeof deleteIcon;
695
- static ɵfac: i0.ɵɵFactoryDeclaration<UploadFileDialogComponent, never>;
696
- static ɵcmp: i0.ɵɵComponentDeclaration<UploadFileDialogComponent, "mm-upload-file-dialog", never, { "message": { "alias": "message"; "required": false; }; "mimeTypes": { "alias": "mimeTypes"; "required": false; }; "fileExtensions": { "alias": "fileExtensions"; "required": false; }; }, {}, never, never, true, never>;
1086
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UploadFileDialogComponent, never>;
1087
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<UploadFileDialogComponent, "mm-upload-file-dialog", never, { "message": { "alias": "message"; "required": false; }; "mimeTypes": { "alias": "mimeTypes"; "required": false; }; "fileExtensions": { "alias": "fileExtensions"; "required": false; }; }, {}, never, never, true, never>;
697
1088
  }
698
1089
 
699
1090
  interface InputDialogMessages {
@@ -714,8 +1105,8 @@ declare class InputDialogComponent extends DialogContentBase {
714
1105
  constructor();
715
1106
  protected onOk(): void;
716
1107
  protected onCancel(): void;
717
- static ɵfac: i0.ɵɵFactoryDeclaration<InputDialogComponent, never>;
718
- static ɵcmp: i0.ɵɵComponentDeclaration<InputDialogComponent, "mm-input-dialog", never, { "buttonOkText": { "alias": "buttonOkText"; "required": false; }; "message": { "alias": "message"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "inputValue": { "alias": "inputValue"; "required": false; }; "messages": { "alias": "messages"; "required": false; }; }, {}, never, never, true, never>;
1108
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<InputDialogComponent, never>;
1109
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<InputDialogComponent, "mm-input-dialog", never, { "buttonOkText": { "alias": "buttonOkText"; "required": false; }; "message": { "alias": "message"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "inputValue": { "alias": "inputValue"; "required": false; }; "messages": { "alias": "messages"; "required": false; }; }, {}, never, never, true, never>;
719
1110
  }
720
1111
 
721
1112
  declare abstract class HierarchyDataSource {
@@ -810,8 +1201,8 @@ declare class TreeComponent implements OnInit, AfterViewInit, OnDestroy {
810
1201
  setExpandedKeys(keys: string[]): void;
811
1202
  private _clearTimeouts;
812
1203
  ngOnDestroy(): void;
813
- static ɵfac: i0.ɵɵFactoryDeclaration<TreeComponent, never>;
814
- static ɵcmp: i0.ɵɵComponentDeclaration<TreeComponent, "mm-tree-view", never, { "dataSource": { "alias": "dataSource"; "required": false; }; }, { "nodeSelected": "nodeSelected"; "nodeClick": "nodeClick"; "nodeDoubleClick": "nodeDoubleClick"; "nodeDrop": "nodeDrop"; "expand": "expand"; "collapse": "collapse"; }, never, never, true, never>;
1204
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TreeComponent, never>;
1205
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TreeComponent, "mm-tree-view", never, { "dataSource": { "alias": "dataSource"; "required": false; }; }, { "nodeSelected": "nodeSelected"; "nodeClick": "nodeClick"; "nodeDoubleClick": "nodeDoubleClick"; "nodeDrop": "nodeDrop"; "expand": "expand"; "collapse": "collapse"; }, never, never, true, never>;
815
1206
  }
816
1207
 
817
1208
  /**
@@ -901,14 +1292,14 @@ declare class UnsavedChangesDirective {
901
1292
  */
902
1293
  onBeforeUnload(event: BeforeUnloadEvent): void;
903
1294
  private hostHasUnsavedChanges;
904
- static ɵfac: i0.ɵɵFactoryDeclaration<UnsavedChangesDirective, never>;
905
- static ɵdir: i0.ɵɵDirectiveDeclaration<UnsavedChangesDirective, "[mmUnsavedChanges]", never, {}, {}, never, never, true, never>;
1295
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UnsavedChangesDirective, never>;
1296
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<UnsavedChangesDirective, "[mmUnsavedChanges]", never, {}, {}, never, never, true, never>;
906
1297
  }
907
1298
 
908
1299
  declare class FormTitleExtraDirective {
909
1300
  readonly templateRef: TemplateRef<any>;
910
- static ɵfac: i0.ɵɵFactoryDeclaration<FormTitleExtraDirective, never>;
911
- static ɵdir: i0.ɵɵDirectiveDeclaration<FormTitleExtraDirective, "[mmFormTitleExtra]", never, {}, {}, never, never, true, never>;
1301
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FormTitleExtraDirective, never>;
1302
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<FormTitleExtraDirective, "[mmFormTitleExtra]", never, {}, {}, never, never, true, never>;
912
1303
  }
913
1304
  interface ResponsiveFormBreakPoint {
914
1305
  maxWidth: number;
@@ -1000,8 +1391,8 @@ declare class BaseFormComponent implements HasUnsavedChanges {
1000
1391
  * Uses config.hasChanges if provided, otherwise falls back to form.dirty.
1001
1392
  */
1002
1393
  hasUnsavedChanges(): boolean;
1003
- static ɵfac: i0.ɵɵFactoryDeclaration<BaseFormComponent, never>;
1004
- static ɵcmp: i0.ɵɵComponentDeclaration<BaseFormComponent, "mm-base-form", never, { "form": { "alias": "form"; "required": false; }; "config": { "alias": "config"; "required": false; }; }, { "saveForm": "saveForm"; "cancelForm": "cancelForm"; }, ["titleExtra"], ["*", "[additionalActions]"], true, [{ directive: typeof UnsavedChangesDirective; inputs: {}; outputs: {}; }]>;
1394
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<BaseFormComponent, never>;
1395
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<BaseFormComponent, "mm-base-form", never, { "form": { "alias": "form"; "required": false; }; "config": { "alias": "config"; "required": false; }; }, { "saveForm": "saveForm"; "cancelForm": "cancelForm"; }, ["titleExtra"], ["*", "[additionalActions]"], true, [{ directive: typeof UnsavedChangesDirective; inputs: {}; outputs: {}; }]>;
1005
1396
  }
1006
1397
 
1007
1398
  declare class BaseTreeDetailComponent<T = unknown> extends CommandBaseService {
@@ -1045,8 +1436,8 @@ declare class BaseTreeDetailComponent<T = unknown> extends CommandBaseService {
1045
1436
  getExpandedKeys(): string[];
1046
1437
  collapseAll(): void;
1047
1438
  setExpandedKeys(keys: string[]): void;
1048
- static ɵfac: i0.ɵɵFactoryDeclaration<BaseTreeDetailComponent<any>, never>;
1049
- static ɵcmp: i0.ɵɵComponentDeclaration<BaseTreeDetailComponent<any>, "mm-base-tree-detail", never, { "treeDataSource": { "alias": "treeDataSource"; "required": false; }; "leftPaneSize": { "alias": "leftPaneSize"; "required": false; }; "leftToolbarActions": { "alias": "leftToolbarActions"; "required": false; }; "rightToolbarActions": { "alias": "rightToolbarActions"; "required": false; }; }, { "nodeSelected": "nodeSelected"; "nodeDropped": "nodeDropped"; }, never, ["[slot=detail-panel]"], true, never>;
1439
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<BaseTreeDetailComponent<any>, never>;
1440
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<BaseTreeDetailComponent<any>, "mm-base-tree-detail", never, { "treeDataSource": { "alias": "treeDataSource"; "required": false; }; "leftPaneSize": { "alias": "leftPaneSize"; "required": false; }; "leftToolbarActions": { "alias": "leftToolbarActions"; "required": false; }; "rightToolbarActions": { "alias": "rightToolbarActions"; "required": false; }; }, { "nodeSelected": "nodeSelected"; "nodeDropped": "nodeDropped"; }, never, ["[slot=detail-panel]"], true, never>;
1050
1441
  }
1051
1442
 
1052
1443
  declare class ProgressValue {
@@ -1083,8 +1474,8 @@ declare class ProgressWindowComponent extends DialogContentBase implements OnDes
1083
1474
  ngAfterViewInit(): void;
1084
1475
  ngOnDestroy(): void;
1085
1476
  onCancelClick(): void;
1086
- static ɵfac: i0.ɵɵFactoryDeclaration<ProgressWindowComponent, never>;
1087
- static ɵcmp: i0.ɵɵComponentDeclaration<ProgressWindowComponent, "mm-progress-window", never, { "isDeterminate": { "alias": "isDeterminate"; "required": false; }; "progress": { "alias": "progress"; "required": false; }; "isCancelOperationAvailable": { "alias": "isCancelOperationAvailable"; "required": false; }; "cancelOperation": { "alias": "cancelOperation"; "required": false; }; "messages": { "alias": "messages"; "required": false; }; }, {}, never, never, true, never>;
1477
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ProgressWindowComponent, never>;
1478
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ProgressWindowComponent, "mm-progress-window", never, { "isDeterminate": { "alias": "isDeterminate"; "required": false; }; "progress": { "alias": "progress"; "required": false; }; "isCancelOperationAvailable": { "alias": "isCancelOperationAvailable"; "required": false; }; "cancelOperation": { "alias": "cancelOperation"; "required": false; }; "messages": { "alias": "messages"; "required": false; }; }, {}, never, never, true, never>;
1088
1479
  }
1089
1480
 
1090
1481
  declare class ProgressWindowService {
@@ -1107,8 +1498,8 @@ declare class ProgressWindowService {
1107
1498
  * @returns DialogRef for the progress window
1108
1499
  */
1109
1500
  showIndeterminateProgress(title: string, progress: Observable<ProgressValue>, options?: Partial<ProgressWindowOptions>): DialogRef;
1110
- static ɵfac: i0.ɵɵFactoryDeclaration<ProgressWindowService, never>;
1111
- static ɵprov: i0.ɵɵInjectableDeclaration<ProgressWindowService>;
1501
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ProgressWindowService, never>;
1502
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<ProgressWindowService>;
1112
1503
  }
1113
1504
  interface ProgressWindowConfig {
1114
1505
  title: string;
@@ -1162,6 +1553,8 @@ interface ConfirmationWindowData {
1162
1553
  dialogType: DialogType;
1163
1554
  buttonLabels?: ConfirmationButtonLabels;
1164
1555
  messages?: Partial<ConfirmationWindowMessages>;
1556
+ /** Destructive confirmation: the confirming (right-most) button is styled as danger (`themeColor="error"`). */
1557
+ danger?: boolean;
1165
1558
  }
1166
1559
  declare class ConfirmationWindowResult {
1167
1560
  result: ButtonTypes;
@@ -1189,11 +1582,17 @@ declare class ConfirmationWindowComponent extends DialogContentBase implements O
1189
1582
  protected button3Result: ButtonTypes | null;
1190
1583
  constructor();
1191
1584
  ngOnInit(): void;
1585
+ private readonly host;
1586
+ /**
1587
+ * Destructive confirmations start with the focus on the dismissing button (AB#5578): Enter must
1588
+ * never confirm a delete. Backs up the service's `autoFocusedElement`.
1589
+ */
1590
+ ngAfterViewInit(): void;
1192
1591
  onButton1(): void;
1193
1592
  onButton2(): void;
1194
1593
  onButton3(): void;
1195
- static ɵfac: i0.ɵɵFactoryDeclaration<ConfirmationWindowComponent, never>;
1196
- static ɵcmp: i0.ɵɵComponentDeclaration<ConfirmationWindowComponent, "mm-confirmation-window", never, { "data": { "alias": "data"; "required": false; }; }, {}, never, never, true, never>;
1594
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ConfirmationWindowComponent, never>;
1595
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ConfirmationWindowComponent, "mm-confirmation-window", never, { "data": { "alias": "data"; "required": false; }; }, {}, never, never, true, never>;
1197
1596
  }
1198
1597
 
1199
1598
  interface FetchResult<T = unknown> {
@@ -1245,7 +1644,7 @@ declare abstract class DataSourceBase {
1245
1644
  * Kept current by MmListViewDataBindingDirective; lets host pages show the
1246
1645
  * overall count (e.g. in a header badge) without a second query.
1247
1646
  */
1248
- readonly totalCount: i0.Signal<number | null>;
1647
+ readonly totalCount: _angular_core.Signal<number | null>;
1249
1648
  /** Set the total row count (called by MmListViewDataBindingDirective) */
1250
1649
  setTotalCount(count: number | null): void;
1251
1650
  protected constructor(listViewComponent: ListViewComponent);
@@ -1280,6 +1679,12 @@ declare class MmListViewDataBindingDirective extends DataBindingDirective implem
1280
1679
  get isLoading$(): Observable<boolean>;
1281
1680
  /** Current loading state */
1282
1681
  get isLoading(): boolean;
1682
+ /**
1683
+ * Read-only view of the grid state (filter, sort, skip, take) Kendo keeps
1684
+ * protected on the base directive. The list view consults it to decide
1685
+ * whether anything is filtered right now.
1686
+ */
1687
+ get currentState(): State$1;
1283
1688
  private _serviceSubscription;
1284
1689
  private _executeFilterSubscription;
1285
1690
  private _fetchAgainSubscription;
@@ -1328,20 +1733,20 @@ declare class MmListViewDataBindingDirective extends DataBindingDirective implem
1328
1733
  /** Writes the current sort/filter/skip + free-text search for this list to storage (best-effort). */
1329
1734
  private persistState;
1330
1735
  rebind(): void;
1331
- static ɵfac: i0.ɵɵFactoryDeclaration<MmListViewDataBindingDirective, never>;
1332
- static ɵdir: i0.ɵɵDirectiveDeclaration<MmListViewDataBindingDirective, "[mmListViewDataBinding]", never, {}, {}, never, never, true, never>;
1736
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MmListViewDataBindingDirective, never>;
1737
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<MmListViewDataBindingDirective, "[mmListViewDataBinding]", never, {}, {}, never, never, true, never>;
1333
1738
  }
1334
1739
 
1335
1740
  declare class PascalCasePipe implements PipeTransform {
1336
1741
  transform(value: string): string;
1337
- static ɵfac: i0.ɵɵFactoryDeclaration<PascalCasePipe, never>;
1338
- static ɵpipe: i0.ɵɵPipeDeclaration<PascalCasePipe, "pascalCase", true>;
1742
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<PascalCasePipe, never>;
1743
+ static ɵpipe: _angular_core.ɵɵPipeDeclaration<PascalCasePipe, "pascalCase", true>;
1339
1744
  }
1340
1745
 
1341
1746
  declare class BytesToSizePipe implements PipeTransform {
1342
1747
  transform(value: number, decimals?: number): string;
1343
- static ɵfac: i0.ɵɵFactoryDeclaration<BytesToSizePipe, never>;
1344
- static ɵpipe: i0.ɵɵPipeDeclaration<BytesToSizePipe, "bytesToSize", true>;
1748
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<BytesToSizePipe, never>;
1749
+ static ɵpipe: _angular_core.ɵɵPipeDeclaration<BytesToSizePipe, "bytesToSize", true>;
1345
1750
  }
1346
1751
 
1347
1752
  declare enum ImportStrategyDto {
@@ -1352,28 +1757,132 @@ declare enum ImportStrategyDto {
1352
1757
  declare class FileUploadService {
1353
1758
  private readonly dialogService;
1354
1759
  showUploadDialog(title: string, message: string, mimeTypes?: string | null, fileExtensions?: string | null): Promise<File | null>;
1355
- static ɵfac: i0.ɵɵFactoryDeclaration<FileUploadService, never>;
1356
- static ɵprov: i0.ɵɵInjectableDeclaration<FileUploadService>;
1760
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<FileUploadService, never>;
1761
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<FileUploadService>;
1762
+ }
1763
+
1764
+ /**
1765
+ * Texts of the danger confirmation (AB#5578); apps translate them like the other shared-ui
1766
+ * dialogs (`Partial<…Messages>` per call or as `ConfirmationService.defaultDangerMessages`).
1767
+ */
1768
+ interface DangerConfirmationMessages {
1769
+ /** Dismissing button. Default: "Cancel" */
1770
+ cancel: string;
1771
+ /** Label of the type-to-confirm input; `{name}` = target name. Default: "Type {name} to confirm" */
1772
+ typeToConfirm: string;
1773
+ /** Environment notice; `{environment}` = environment label. Default: "{environment} environment. Check the target before you confirm." */
1774
+ environmentNotice: string;
1775
+ /** Label in front of the target. Default: "Target" */
1776
+ target: string;
1777
+ }
1778
+ declare const DEFAULT_DANGER_CONFIRMATION_MESSAGES: DangerConfirmationMessages;
1779
+ /**
1780
+ * A destructive action's confirmation (Studio action guideline §2.4, AB#5578): the title names
1781
+ * the target, the body says what is lost, the confirming button names the verb + object and is
1782
+ * danger-styled on the right, Cancel on the left. Optionally the user has to type the target
1783
+ * name before the confirming button enables (production tenants).
1784
+ *
1785
+ * ```ts
1786
+ * const ok = await confirmation.showDangerConfirm({
1787
+ * title: 'Delete adapter Mesh Adapter?',
1788
+ * targetName: 'Mesh Adapter',
1789
+ * consequence: 'The adapter and its configuration are deleted. This cannot be undone.',
1790
+ * confirmText: 'Delete adapter',
1791
+ * });
1792
+ * ```
1793
+ */
1794
+ interface DangerConfirmationOptions {
1795
+ /** Dialog title naming the target ("Delete adapter Mesh Adapter?"). */
1796
+ title: string;
1797
+ /** Name of the affected item ("Mesh Adapter", "3 adapters"); shown emphasised and typed when required. */
1798
+ targetName: string;
1799
+ /** What is lost and whether it can be undone. */
1800
+ consequence: string;
1801
+ /** Confirming button: verb + object ("Delete adapter"), never "Yes" / "OK". */
1802
+ confirmText: string;
1803
+ /** Overrides `messages.cancel`. */
1804
+ cancelText?: string;
1805
+ /** The confirming button enables only once `targetName` is typed exactly (trimmed). */
1806
+ requireTypingName?: boolean;
1807
+ /** Environment label ("PRODUCTION", "STAGING") — shows the environment notice; omit in dev/test tenants. */
1808
+ environmentLabel?: string | null;
1809
+ messages?: Partial<DangerConfirmationMessages>;
1810
+ }
1811
+ /** Word typed when the target name is empty and no confirm text is set either. */
1812
+ declare const DANGER_CONFIRM_FALLBACK_WORD = "DELETE";
1813
+ /**
1814
+ * The text the user has to type when `requireTypingName` is set: the target name, or — when the
1815
+ * target name is empty/whitespace — the confirm button text, else {@link DANGER_CONFIRM_FALLBACK_WORD}.
1816
+ * Never empty, so an empty input can never satisfy the type-to-confirm rule.
1817
+ */
1818
+ declare function dangerConfirmTypingToken(options: Pick<DangerConfirmationOptions, 'targetName' | 'confirmText'>): string;
1819
+ /**
1820
+ * True when `typed` matches the target name (trimmed, case-sensitive). An empty/whitespace target
1821
+ * name never matches — use {@link dangerConfirmTypingToken} to get a non-empty word to type.
1822
+ */
1823
+ declare function dangerConfirmNameMatches(typed: string | null | undefined, targetName: string): boolean;
1824
+ /**
1825
+ * App-wide environment defaults of {@link ConfirmationService.showDangerConfirm} (AB#5578), e.g.
1826
+ * "production tenants type the target name". Applied whenever a caller — typically a library
1827
+ * component — leaves `requireTypingName` / `environmentLabel` unset; explicit caller options win.
1828
+ */
1829
+ interface DangerConfirmEnvironment {
1830
+ /** Default of `requireTypingName`. */
1831
+ requireTypingName: boolean;
1832
+ /** Default of `environmentLabel` ("PRODUCTION", "STAGING"); `null`/omitted = no notice. */
1833
+ environmentLabel?: string | null;
1357
1834
  }
1835
+ /**
1836
+ * Optional hook providing the current {@link DangerConfirmEnvironment}; evaluated each time a
1837
+ * danger confirmation opens (so it may read signals). Absent = behaviour unchanged.
1838
+ *
1839
+ * ```ts
1840
+ * { provide: DANGER_CONFIRM_ENVIRONMENT, useFactory: () => {
1841
+ * const mode = inject(MyEnvironmentService);
1842
+ * return () => ({ requireTypingName: mode.isProduction(), environmentLabel: mode.label() });
1843
+ * } }
1844
+ * ```
1845
+ */
1846
+ declare const DANGER_CONFIRM_ENVIRONMENT: InjectionToken<() => DangerConfirmEnvironment>;
1847
+ /** Applies the environment defaults to options that leave `requireTypingName` / `environmentLabel` unset. */
1848
+ declare function applyDangerConfirmEnvironment(options: DangerConfirmationOptions, environment: DangerConfirmEnvironment | null | undefined): DangerConfirmationOptions;
1358
1849
 
1359
1850
  declare class ConfirmationService {
1360
1851
  private readonly dialogService;
1852
+ /** Optional app-wide environment defaults (e.g. production → type the name), AB#5578. */
1853
+ private readonly dangerEnvironment;
1361
1854
  defaultMessages: Partial<ConfirmationWindowMessages> | undefined;
1855
+ /** App-wide translations of {@link showDangerConfirm}; per-call `options.messages` win. */
1856
+ defaultDangerMessages: Partial<DangerConfirmationMessages> | undefined;
1857
+ /**
1858
+ * Danger confirmation that names the target (Studio action guideline §2.4, AB#5578): title +
1859
+ * target + consequence, Cancel left / danger confirm right, initial focus on Cancel (or on the
1860
+ * type-to-confirm input when `requireTypingName`, e.g. in production tenants). Resolves `true`
1861
+ * only when the confirming button was used. Unset `requireTypingName` / `environmentLabel` fall
1862
+ * back to the app's {@link DANGER_CONFIRM_ENVIRONMENT}, if provided.
1863
+ */
1864
+ showDangerConfirm(callerOptions: DangerConfirmationOptions): Promise<boolean>;
1362
1865
  showYesNoConfirmationDialog(title: string, message: string, cssClass?: string, buttonLabels?: ConfirmationButtonLabels, messages?: Partial<ConfirmationWindowMessages>): Promise<boolean>;
1363
1866
  showYesNoCancelConfirmationDialog(title: string, message: string, buttonLabels?: ConfirmationButtonLabels, messages?: Partial<ConfirmationWindowMessages>): Promise<ConfirmationWindowResult | undefined>;
1364
1867
  showOkCancelConfirmationDialog(title: string, message: string, messages?: Partial<ConfirmationWindowMessages>): Promise<boolean>;
1868
+ /**
1869
+ * Confirmation of a destructive action: explicit verb labels instead of Yes / No (e.g.
1870
+ * "Rotate" / "Cancel") and the confirming button styled as danger. Resolves `true` only when
1871
+ * the confirming button was clicked.
1872
+ */
1873
+ showDestructiveConfirmationDialog(title: string, message: string, confirmLabel: string, cancelLabel?: string): Promise<boolean>;
1365
1874
  showOkDialog(title: string, message: string, messages?: Partial<ConfirmationWindowMessages>): Promise<boolean>;
1366
1875
  private openDialog;
1367
- static ɵfac: i0.ɵɵFactoryDeclaration<ConfirmationService, never>;
1368
- static ɵprov: i0.ɵɵInjectableDeclaration<ConfirmationService>;
1876
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ConfirmationService, never>;
1877
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<ConfirmationService>;
1369
1878
  }
1370
1879
 
1371
1880
  declare class InputService {
1372
1881
  private readonly dialogService;
1373
1882
  defaultMessages: Partial<InputDialogMessages> | undefined;
1374
1883
  showInputDialog(title: string, message: string, placeholder: string, buttonOkText?: string | null, messages?: Partial<InputDialogMessages>): Promise<string | null>;
1375
- static ɵfac: i0.ɵɵFactoryDeclaration<InputService, never>;
1376
- static ɵprov: i0.ɵɵInjectableDeclaration<InputService>;
1884
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<InputService, never>;
1885
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<InputService>;
1377
1886
  }
1378
1887
 
1379
1888
  interface NotificationDisplayMessages {
@@ -1381,13 +1890,43 @@ interface NotificationDisplayMessages {
1381
1890
  }
1382
1891
  declare const DEFAULT_NOTIFICATION_DISPLAY_MESSAGES: NotificationDisplayMessages;
1383
1892
 
1893
+ /**
1894
+ * How the {@link NotificationDisplayService} stacks its toasts. Provide it with
1895
+ * {@link NOTIFICATION_DISPLAY_OPTIONS}; without a provider the defaults keep the former behaviour
1896
+ * except for de-duplication, which is always safe.
1897
+ */
1898
+ interface NotificationDisplayOptions {
1899
+ /**
1900
+ * Milliseconds after which an error hides itself when the caller passes no `hideAfter`.
1901
+ * 0 (default) keeps errors until user interaction or navigation. A caller passing
1902
+ * `hideAfter: 0` explicitly always gets a sticky (critical) error.
1903
+ */
1904
+ errorHideAfter?: number;
1905
+ /** Same as {@link errorHideAfter} for warnings. */
1906
+ warningHideAfter?: number;
1907
+ /**
1908
+ * Errors and warnings that come with details (the "show details" button) stay until closed,
1909
+ * whatever {@link errorHideAfter} / {@link warningHideAfter} say. Default false.
1910
+ */
1911
+ stickyWithDetails?: boolean;
1912
+ /** Most toasts shown at once; beyond it the oldest toast of the LOWEST severity is hidden
1913
+ * (an error or warning is never dropped in favour of a success or info). 0 (default) = no limit. */
1914
+ maxVisible?: number;
1915
+ /** A toast with the same type, text and details as a visible one is not stacked again; the visible one's timer restarts. Default true. */
1916
+ dedupe?: boolean;
1917
+ }
1918
+ declare const NOTIFICATION_DISPLAY_OPTIONS: InjectionToken<NotificationDisplayOptions>;
1919
+ type ToastStyle = 'success' | 'info' | 'warning' | 'error';
1384
1920
  declare class NotificationDisplayService implements OnDestroy {
1385
1921
  private readonly notificationService;
1386
1922
  private readonly messageDetailsDialogService;
1387
1923
  private readonly router;
1388
1924
  private readonly ngZone;
1925
+ private readonly options;
1389
1926
  private notificationCounter;
1390
1927
  private activeNotifications;
1928
+ /** Every visible toast, oldest first (dedupe, stack cap, auto-hide timers). */
1929
+ private toasts;
1391
1930
  private subscriptions;
1392
1931
  private interactionDebounceTime;
1393
1932
  private gracePeriod;
@@ -1412,19 +1951,33 @@ declare class NotificationDisplayService implements OnDestroy {
1412
1951
  */
1413
1952
  showSuccess(title: string, hideAfter?: number): void;
1414
1953
  /**
1415
- * Shows an error notification (persists until user interaction or navigation)
1954
+ * Shows an error notification. It persists until user interaction or navigation, or hides
1955
+ * after `hideAfter` ms (default: `errorHideAfter` of the options; `0` = sticky).
1416
1956
  */
1417
1957
  showError(title: string, details?: string, hideAfter?: number): void;
1418
1958
  /**
1419
- * Shows a warning notification (persists until user interaction or navigation)
1959
+ * Shows a warning notification. It persists until user interaction or navigation, or hides
1960
+ * after `hideAfter` ms (default: `warningHideAfter` of the options; `0` = sticky).
1420
1961
  */
1421
1962
  showWarning(title: string, details?: string, hideAfter?: number): void;
1422
1963
  /**
1423
1964
  * Shows an info notification (auto-closes after 3 seconds)
1424
1965
  */
1425
1966
  showInfo(title: string, hideAfter?: number): void;
1426
- static ɵfac: i0.ɵɵFactoryDeclaration<NotificationDisplayService, never>;
1427
- static ɵprov: i0.ɵɵInjectableDeclaration<NotificationDisplayService>;
1967
+ /** The visible toasts as `[style, text]`, oldest first — for tests and diagnostics. */
1968
+ visibleToasts(): [ToastStyle, string][];
1969
+ private present;
1970
+ /** (Re)starts the auto-hide timer of a toast; a toast with `hideAfter` 0 stays, a hovered or focused one waits. */
1971
+ private schedule;
1972
+ /** Pauses the auto-hide while the pointer is over the toast or focus is inside it; restarts it afterwards. */
1973
+ private watchPointerAndFocus;
1974
+ /** Beyond `maxVisible`, hides the oldest toast of the lowest severity (success/info before warning before error). */
1975
+ private enforceLimit;
1976
+ private hideToast;
1977
+ private forget;
1978
+ private addDetailsButton;
1979
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NotificationDisplayService, never>;
1980
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<NotificationDisplayService>;
1428
1981
  }
1429
1982
 
1430
1983
  /**
@@ -1445,8 +1998,8 @@ declare class MessageListenerService implements OnDestroy {
1445
1998
  */
1446
1999
  stop(): void;
1447
2000
  ngOnDestroy(): void;
1448
- static ɵfac: i0.ɵɵFactoryDeclaration<MessageListenerService, never>;
1449
- static ɵprov: i0.ɵɵInjectableDeclaration<MessageListenerService>;
2001
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MessageListenerService, never>;
2002
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<MessageListenerService>;
1450
2003
  }
1451
2004
 
1452
2005
  /**
@@ -1502,8 +2055,8 @@ declare class ListStateService {
1502
2055
  private reviveFilterDates;
1503
2056
  private loadAll;
1504
2057
  private saveAll;
1505
- static ɵfac: i0.ɵɵFactoryDeclaration<ListStateService, never>;
1506
- static ɵprov: i0.ɵɵInjectableDeclaration<ListStateService>;
2058
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ListStateService, never>;
2059
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<ListStateService>;
1507
2060
  }
1508
2061
 
1509
2062
  interface MessageDetailsDialogMessages {
@@ -1537,8 +2090,8 @@ declare class MessageDetailsDialogComponent implements OnInit {
1537
2090
  onClose(): void;
1538
2091
  copyToClipboard(): Promise<void>;
1539
2092
  private fallbackCopyToClipboard;
1540
- static ɵfac: i0.ɵɵFactoryDeclaration<MessageDetailsDialogComponent, never>;
1541
- static ɵcmp: i0.ɵɵComponentDeclaration<MessageDetailsDialogComponent, "mm-message-details-dialog", never, {}, {}, never, never, true, never>;
2093
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MessageDetailsDialogComponent, never>;
2094
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<MessageDetailsDialogComponent, "mm-message-details-dialog", never, {}, {}, never, never, true, never>;
1542
2095
  }
1543
2096
 
1544
2097
  declare class MessageDetailsDialogService {
@@ -1546,8 +2099,8 @@ declare class MessageDetailsDialogService {
1546
2099
  private readonly windowStateService;
1547
2100
  defaultMessages: Partial<MessageDetailsDialogMessages> | undefined;
1548
2101
  showDetailsDialog(data: MessageDetailsDialogData): WindowRef;
1549
- static ɵfac: i0.ɵɵFactoryDeclaration<MessageDetailsDialogService, never>;
1550
- static ɵprov: i0.ɵɵInjectableDeclaration<MessageDetailsDialogService>;
2102
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<MessageDetailsDialogService, never>;
2103
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<MessageDetailsDialogService>;
1551
2104
  }
1552
2105
 
1553
2106
  /**
@@ -1728,8 +2281,8 @@ declare class EntitySelectInputComponent implements OnInit, OnDestroy, ControlVa
1728
2281
  private setupSearch;
1729
2282
  private selectEntity;
1730
2283
  openAdvancedSearch(event?: Event): Promise<void>;
1731
- static ɵfac: i0.ɵɵFactoryDeclaration<EntitySelectInputComponent, never>;
1732
- static ɵcmp: i0.ɵɵComponentDeclaration<EntitySelectInputComponent, "mm-entity-select-input", never, { "dataSource": { "alias": "dataSource"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "minSearchLength": { "alias": "minSearchLength"; "required": false; }; "maxResults": { "alias": "maxResults"; "required": false; }; "debounceMs": { "alias": "debounceMs"; "required": false; }; "prefix": { "alias": "prefix"; "required": false; }; "initialDisplayValue": { "alias": "initialDisplayValue"; "required": false; }; "dialogDataSource": { "alias": "dialogDataSource"; "required": false; }; "dialogTitle": { "alias": "dialogTitle"; "required": false; }; "multiSelect": { "alias": "multiSelect"; "required": false; }; "advancedSearchLabel": { "alias": "advancedSearchLabel"; "required": false; }; "dialogMessages": { "alias": "dialogMessages"; "required": false; }; "messages": { "alias": "messages"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "required": { "alias": "required"; "required": false; }; }, { "entitySelected": "entitySelected"; "entityCleared": "entityCleared"; "entitiesSelected": "entitiesSelected"; }, never, never, true, never>;
2284
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<EntitySelectInputComponent, never>;
2285
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<EntitySelectInputComponent, "mm-entity-select-input", never, { "dataSource": { "alias": "dataSource"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "minSearchLength": { "alias": "minSearchLength"; "required": false; }; "maxResults": { "alias": "maxResults"; "required": false; }; "debounceMs": { "alias": "debounceMs"; "required": false; }; "prefix": { "alias": "prefix"; "required": false; }; "initialDisplayValue": { "alias": "initialDisplayValue"; "required": false; }; "dialogDataSource": { "alias": "dialogDataSource"; "required": false; }; "dialogTitle": { "alias": "dialogTitle"; "required": false; }; "multiSelect": { "alias": "multiSelect"; "required": false; }; "advancedSearchLabel": { "alias": "advancedSearchLabel"; "required": false; }; "dialogMessages": { "alias": "dialogMessages"; "required": false; }; "messages": { "alias": "messages"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; "required": { "alias": "required"; "required": false; }; }, { "entitySelected": "entitySelected"; "entityCleared": "entityCleared"; "entitiesSelected": "entitiesSelected"; }, never, never, true, never>;
1733
2286
  }
1734
2287
 
1735
2288
  declare class EntitySelectDialogComponent<T> implements OnInit, OnDestroy {
@@ -1765,8 +2318,8 @@ declare class EntitySelectDialogComponent<T> implements OnInit, OnDestroy {
1765
2318
  onSelectionChange(event: SelectionEvent): void;
1766
2319
  onConfirm(): void;
1767
2320
  onCancel(): void;
1768
- static ɵfac: i0.ɵɵFactoryDeclaration<EntitySelectDialogComponent<any>, never>;
1769
- static ɵcmp: i0.ɵɵComponentDeclaration<EntitySelectDialogComponent<any>, "mm-entity-select-dialog", never, { "dataSource": { "alias": "dataSource"; "required": false; }; "multiSelect": { "alias": "multiSelect"; "required": false; }; "preSelectedEntities": { "alias": "preSelectedEntities"; "required": false; }; "messages": { "alias": "messages"; "required": false; }; }, {}, never, never, true, never>;
2321
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<EntitySelectDialogComponent<any>, never>;
2322
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<EntitySelectDialogComponent<any>, "mm-entity-select-dialog", never, { "dataSource": { "alias": "dataSource"; "required": false; }; "multiSelect": { "alias": "multiSelect"; "required": false; }; "preSelectedEntities": { "alias": "preSelectedEntities"; "required": false; }; "messages": { "alias": "messages"; "required": false; }; }, {}, never, never, true, never>;
1770
2323
  }
1771
2324
 
1772
2325
  declare class EntitySelectDialogService {
@@ -1779,8 +2332,47 @@ declare class EntitySelectDialogService {
1779
2332
  * @returns Promise resolving to selected entities or null if cancelled
1780
2333
  */
1781
2334
  open<T>(dataSource: EntitySelectDialogDataSource<T>, options: EntitySelectDialogOptions<T>): Promise<EntitySelectDialogResult<T> | null>;
1782
- static ɵfac: i0.ɵɵFactoryDeclaration<EntitySelectDialogService, never>;
1783
- static ɵprov: i0.ɵɵInjectableDeclaration<EntitySelectDialogService>;
2335
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<EntitySelectDialogService, never>;
2336
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<EntitySelectDialogService>;
2337
+ }
2338
+
2339
+ /** Selector of the element that gets the initial focus (never the destructive button). */
2340
+ declare function DANGER_CONFIRM_SAFE_FOCUS(requireTypingName: boolean): string;
2341
+ /** Result of the danger confirmation dialog: `true` only for the confirming button. */
2342
+ declare class DangerConfirmationResult {
2343
+ readonly confirmed: boolean;
2344
+ constructor(confirmed: boolean);
2345
+ }
2346
+ /**
2347
+ * Content of {@link ConfirmationService.showDangerConfirm} (AB#5578): environment notice,
2348
+ * target, consequence, optional type-to-confirm input; Cancel left, danger confirm right.
2349
+ */
2350
+ declare class DangerConfirmationWindowComponent extends DialogContentBase {
2351
+ private readonly ref;
2352
+ /** Set by the service right after opening. */
2353
+ readonly options: _angular_core.WritableSignal<DangerConfirmationOptions>;
2354
+ protected readonly typed: _angular_core.WritableSignal<string>;
2355
+ protected readonly inputId: string;
2356
+ protected readonly messages: _angular_core.Signal<DangerConfirmationMessages>;
2357
+ /** What has to be typed: the target name, or a non-empty fallback when it is empty. */
2358
+ protected readonly typingToken: _angular_core.Signal<string>;
2359
+ protected readonly typeLabel: _angular_core.Signal<string>;
2360
+ protected readonly environmentNotice: _angular_core.Signal<string>;
2361
+ protected readonly canConfirm: _angular_core.Signal<boolean>;
2362
+ constructor();
2363
+ private readonly host;
2364
+ /**
2365
+ * Initial focus never on the destructive button (Enter must not delete): the type-to-confirm
2366
+ * input when required, else Cancel. The service also passes `autoFocusedElement`; this is the
2367
+ * fallback for hosts that render the content themselves.
2368
+ */
2369
+ ngAfterViewInit(): void;
2370
+ /** Focuses the type-to-confirm input or Cancel (unless focus already sits on one of them). */
2371
+ focusSafeElement(): void;
2372
+ protected cancel(): void;
2373
+ protected confirm(): void;
2374
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<DangerConfirmationWindowComponent, never>;
2375
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<DangerConfirmationWindowComponent, "mm-danger-confirmation-window", never, {}, {}, never, never, true, never>;
1784
2376
  }
1785
2377
 
1786
2378
  /**
@@ -1813,8 +2405,8 @@ declare class EntitySelectDialogService {
1813
2405
  declare class UnsavedChangesGuard implements CanDeactivate<HasUnsavedChanges> {
1814
2406
  private readonly confirmationService;
1815
2407
  canDeactivate(component: HasUnsavedChanges): Promise<boolean>;
1816
- static ɵfac: i0.ɵɵFactoryDeclaration<UnsavedChangesGuard, never>;
1817
- static ɵprov: i0.ɵɵInjectableDeclaration<UnsavedChangesGuard>;
2408
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<UnsavedChangesGuard, never>;
2409
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<UnsavedChangesGuard>;
1818
2410
  }
1819
2411
 
1820
2412
  interface SaveAsDialogMessages {
@@ -1923,8 +2515,8 @@ declare class SaveAsDialogComponent extends DialogContentBase implements OnInit,
1923
2515
  canSave(): boolean;
1924
2516
  onSave(): void;
1925
2517
  onCancel(): void;
1926
- static ɵfac: i0.ɵɵFactoryDeclaration<SaveAsDialogComponent, never>;
1927
- static ɵcmp: i0.ɵɵComponentDeclaration<SaveAsDialogComponent, "mm-save-as-dialog", never, {}, {}, never, never, true, never>;
2518
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SaveAsDialogComponent, never>;
2519
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SaveAsDialogComponent, "mm-save-as-dialog", never, {}, {}, never, never, true, never>;
1928
2520
  }
1929
2521
 
1930
2522
  declare class SaveAsDialogService {
@@ -1935,8 +2527,8 @@ declare class SaveAsDialogService {
1935
2527
  * @returns Promise that resolves with the result containing confirmed status and entered name
1936
2528
  */
1937
2529
  showSaveAsDialog(options: SaveAsDialogOptions): Promise<SaveAsDialogResult>;
1938
- static ɵfac: i0.ɵɵFactoryDeclaration<SaveAsDialogService, never>;
1939
- static ɵprov: i0.ɵɵInjectableDeclaration<SaveAsDialogService>;
2530
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SaveAsDialogService, never>;
2531
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<SaveAsDialogService>;
1940
2532
  }
1941
2533
 
1942
2534
  /**
@@ -2200,18 +2792,18 @@ declare class TimeRangePickerComponent implements OnInit, OnChanges {
2200
2792
  * Emits the current selection state
2201
2793
  */
2202
2794
  selectionChange: EventEmitter<TimeRangeSelection>;
2203
- protected selectedType: i0.WritableSignal<TimeRangeType>;
2204
- protected selectedYear: i0.WritableSignal<number>;
2205
- protected selectedQuarter: i0.WritableSignal<Quarter>;
2206
- protected selectedMonth: i0.WritableSignal<number>;
2207
- protected selectedDay: i0.WritableSignal<number>;
2208
- protected relativeValue: i0.WritableSignal<number>;
2209
- protected relativeUnit: i0.WritableSignal<RelativeTimeUnit>;
2210
- protected hourFrom: i0.WritableSignal<number | null>;
2211
- protected hourTo: i0.WritableSignal<number | null>;
2212
- protected customFrom: i0.WritableSignal<Date>;
2213
- protected customTo: i0.WritableSignal<Date>;
2214
- protected mergedLabels: i0.Signal<{
2795
+ protected selectedType: _angular_core.WritableSignal<TimeRangeType>;
2796
+ protected selectedYear: _angular_core.WritableSignal<number>;
2797
+ protected selectedQuarter: _angular_core.WritableSignal<Quarter>;
2798
+ protected selectedMonth: _angular_core.WritableSignal<number>;
2799
+ protected selectedDay: _angular_core.WritableSignal<number>;
2800
+ protected relativeValue: _angular_core.WritableSignal<number>;
2801
+ protected relativeUnit: _angular_core.WritableSignal<RelativeTimeUnit>;
2802
+ protected hourFrom: _angular_core.WritableSignal<number | null>;
2803
+ protected hourTo: _angular_core.WritableSignal<number | null>;
2804
+ protected customFrom: _angular_core.WritableSignal<Date>;
2805
+ protected customTo: _angular_core.WritableSignal<Date>;
2806
+ protected mergedLabels: _angular_core.Signal<{
2215
2807
  rangeType?: string;
2216
2808
  year?: string;
2217
2809
  quarter?: string;
@@ -2238,18 +2830,18 @@ declare class TimeRangePickerComponent implements OnInit, OnChanges {
2238
2830
  quarter3?: string;
2239
2831
  quarter4?: string;
2240
2832
  }>;
2241
- protected typeOptions: i0.Signal<TimeRangeOption<TimeRangeType>[]>;
2242
- protected yearOptions: i0.Signal<TimeRangeOption<number>[]>;
2243
- protected quarterOptions: i0.Signal<TimeRangeOption<Quarter>[]>;
2244
- protected monthOptions: i0.Signal<TimeRangeOption<number>[]>;
2245
- protected dayOptions: i0.Signal<TimeRangeOption<number>[]>;
2246
- protected hourFromOptions: i0.Signal<TimeRangeOption<number>[]>;
2247
- protected hourToOptions: i0.Signal<TimeRangeOption<number>[]>;
2248
- protected relativeUnitOptions: i0.Signal<TimeRangeOption<RelativeTimeUnit>[]>;
2249
- protected currentRange: i0.Signal<TimeRange | null>;
2250
- protected minDate: i0.Signal<Date>;
2251
- protected maxDate: i0.Signal<Date>;
2252
- protected showTime: i0.Signal<boolean>;
2833
+ protected typeOptions: _angular_core.Signal<TimeRangeOption<TimeRangeType>[]>;
2834
+ protected yearOptions: _angular_core.Signal<TimeRangeOption<number>[]>;
2835
+ protected quarterOptions: _angular_core.Signal<TimeRangeOption<Quarter>[]>;
2836
+ protected monthOptions: _angular_core.Signal<TimeRangeOption<number>[]>;
2837
+ protected dayOptions: _angular_core.Signal<TimeRangeOption<number>[]>;
2838
+ protected hourFromOptions: _angular_core.Signal<TimeRangeOption<number>[]>;
2839
+ protected hourToOptions: _angular_core.Signal<TimeRangeOption<number>[]>;
2840
+ protected relativeUnitOptions: _angular_core.Signal<TimeRangeOption<RelativeTimeUnit>[]>;
2841
+ protected currentRange: _angular_core.Signal<TimeRange | null>;
2842
+ protected minDate: _angular_core.Signal<Date>;
2843
+ protected maxDate: _angular_core.Signal<Date>;
2844
+ protected showTime: _angular_core.Signal<boolean>;
2253
2845
  ngOnInit(): void;
2254
2846
  ngOnChanges(changes: SimpleChanges): void;
2255
2847
  private initializeDefaults;
@@ -2268,8 +2860,8 @@ declare class TimeRangePickerComponent implements OnInit, OnChanges {
2268
2860
  protected onCustomToChange(date: Date): void;
2269
2861
  private emitChange;
2270
2862
  protected isType(type: TimeRangeType): boolean;
2271
- static ɵfac: i0.ɵɵFactoryDeclaration<TimeRangePickerComponent, never>;
2272
- static ɵcmp: i0.ɵɵComponentDeclaration<TimeRangePickerComponent, "mm-time-range-picker", never, { "config": { "alias": "config"; "required": false; }; "labels": { "alias": "labels"; "required": false; }; "initialSelection": { "alias": "initialSelection"; "required": false; }; }, { "rangeChange": "rangeChange"; "rangeChangeISO": "rangeChangeISO"; "selectionChange": "selectionChange"; }, never, never, true, never>;
2863
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<TimeRangePickerComponent, never>;
2864
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<TimeRangePickerComponent, "mm-time-range-picker", never, { "config": { "alias": "config"; "required": false; }; "labels": { "alias": "labels"; "required": false; }; "initialSelection": { "alias": "initialSelection"; "required": false; }; }, { "rangeChange": "rangeChange"; "rangeChangeISO": "rangeChangeISO"; "selectionChange": "selectionChange"; }, never, never, true, never>;
2273
2865
  }
2274
2866
 
2275
2867
  /**
@@ -2373,33 +2965,33 @@ declare class CronBuilderComponent implements OnInit, ControlValueAccessor {
2373
2965
  protected readonly xIcon: _progress_kendo_svg_icons.SVGIcon;
2374
2966
  private onChange;
2375
2967
  private onTouched;
2376
- protected disabled: i0.WritableSignal<boolean>;
2377
- protected readonly expression: i0.WritableSignal<string>;
2378
- protected readonly selectedTabIndex: i0.WritableSignal<number>;
2379
- protected readonly copiedRecently: i0.WritableSignal<boolean>;
2968
+ protected disabled: _angular_core.WritableSignal<boolean>;
2969
+ protected readonly expression: _angular_core.WritableSignal<string>;
2970
+ protected readonly selectedTabIndex: _angular_core.WritableSignal<number>;
2971
+ protected readonly copiedRecently: _angular_core.WritableSignal<boolean>;
2380
2972
  private suppressOnChange;
2381
- protected readonly scheduleType: i0.WritableSignal<ScheduleType>;
2382
- protected readonly secondInterval: i0.WritableSignal<number>;
2383
- protected readonly minuteInterval: i0.WritableSignal<number>;
2384
- protected readonly hourInterval: i0.WritableSignal<number>;
2385
- protected readonly hourMinute: i0.WritableSignal<number>;
2386
- protected readonly hourSecond: i0.WritableSignal<number>;
2387
- protected readonly timeHour: i0.WritableSignal<number>;
2388
- protected readonly timeMinute: i0.WritableSignal<number>;
2389
- protected readonly timeSecond: i0.WritableSignal<number>;
2390
- protected readonly dailyMode: i0.WritableSignal<"every" | "weekdays" | "weekends" | "specific">;
2391
- protected readonly selectedDays: i0.WritableSignal<Weekday[]>;
2392
- protected readonly monthlyMode: i0.WritableSignal<"relative" | "specific">;
2393
- protected readonly dayOfMonth: i0.WritableSignal<number>;
2394
- protected readonly relativeWeek: i0.WritableSignal<string>;
2395
- protected readonly relativeDay: i0.WritableSignal<Weekday>;
2396
- protected readonly customSecond: i0.WritableSignal<string>;
2397
- protected readonly customMinute: i0.WritableSignal<string>;
2398
- protected readonly customHour: i0.WritableSignal<string>;
2399
- protected readonly customDayOfMonth: i0.WritableSignal<string>;
2400
- protected readonly customMonth: i0.WritableSignal<string>;
2401
- protected readonly customDayOfWeek: i0.WritableSignal<string>;
2402
- protected readonly mergedConfig: i0.Signal<{
2973
+ protected readonly scheduleType: _angular_core.WritableSignal<ScheduleType>;
2974
+ protected readonly secondInterval: _angular_core.WritableSignal<number>;
2975
+ protected readonly minuteInterval: _angular_core.WritableSignal<number>;
2976
+ protected readonly hourInterval: _angular_core.WritableSignal<number>;
2977
+ protected readonly hourMinute: _angular_core.WritableSignal<number>;
2978
+ protected readonly hourSecond: _angular_core.WritableSignal<number>;
2979
+ protected readonly timeHour: _angular_core.WritableSignal<number>;
2980
+ protected readonly timeMinute: _angular_core.WritableSignal<number>;
2981
+ protected readonly timeSecond: _angular_core.WritableSignal<number>;
2982
+ protected readonly dailyMode: _angular_core.WritableSignal<"every" | "weekdays" | "weekends" | "specific">;
2983
+ protected readonly selectedDays: _angular_core.WritableSignal<Weekday[]>;
2984
+ protected readonly monthlyMode: _angular_core.WritableSignal<"relative" | "specific">;
2985
+ protected readonly dayOfMonth: _angular_core.WritableSignal<number>;
2986
+ protected readonly relativeWeek: _angular_core.WritableSignal<string>;
2987
+ protected readonly relativeDay: _angular_core.WritableSignal<Weekday>;
2988
+ protected readonly customSecond: _angular_core.WritableSignal<string>;
2989
+ protected readonly customMinute: _angular_core.WritableSignal<string>;
2990
+ protected readonly customHour: _angular_core.WritableSignal<string>;
2991
+ protected readonly customDayOfMonth: _angular_core.WritableSignal<string>;
2992
+ protected readonly customMonth: _angular_core.WritableSignal<string>;
2993
+ protected readonly customDayOfWeek: _angular_core.WritableSignal<string>;
2994
+ protected readonly mergedConfig: _angular_core.Signal<{
2403
2995
  showPresets?: boolean;
2404
2996
  showHumanReadable?: boolean;
2405
2997
  showNextExecutions?: boolean;
@@ -2409,11 +3001,11 @@ declare class CronBuilderComponent implements OnInit, ControlValueAccessor {
2409
3001
  defaultScheduleType?: ScheduleType;
2410
3002
  locale?: string;
2411
3003
  }>;
2412
- protected readonly humanReadable: i0.Signal<string>;
2413
- protected readonly validationResult: i0.Signal<_meshmakers_shared_ui.CronValidationResult>;
2414
- protected readonly nextExecutions: i0.Signal<Date[]>;
2415
- protected readonly presets: i0.Signal<CronPreset[]>;
2416
- protected readonly presetsByCategory: i0.Signal<{
3004
+ protected readonly humanReadable: _angular_core.Signal<string>;
3005
+ protected readonly validationResult: _angular_core.Signal<_meshmakers_shared_ui.CronValidationResult>;
3006
+ protected readonly nextExecutions: _angular_core.Signal<Date[]>;
3007
+ protected readonly presets: _angular_core.Signal<CronPreset[]>;
3008
+ protected readonly presetsByCategory: _angular_core.Signal<{
2417
3009
  frequent: CronPreset[];
2418
3010
  hourly: CronPreset[];
2419
3011
  daily: CronPreset[];
@@ -2460,8 +3052,8 @@ declare class CronBuilderComponent implements OnInit, ControlValueAccessor {
2460
3052
  private parseExpressionToState;
2461
3053
  protected trackByValue(_index: number, item: DropdownOption): number | string;
2462
3054
  protected trackByPresetId(_index: number, item: CronPreset): string;
2463
- static ɵfac: i0.ɵɵFactoryDeclaration<CronBuilderComponent, never>;
2464
- static ɵcmp: i0.ɵɵComponentDeclaration<CronBuilderComponent, "mm-cron-builder", never, { "config": { "alias": "config"; "required": false; }; }, {}, never, never, true, never>;
3055
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CronBuilderComponent, never>;
3056
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CronBuilderComponent, "mm-cron-builder", never, { "config": { "alias": "config"; "required": false; }; }, {}, never, never, true, never>;
2465
3057
  }
2466
3058
 
2467
3059
  /**
@@ -2499,8 +3091,8 @@ declare class CronParserService {
2499
3091
  private generateMonthlyExpression;
2500
3092
  private generateCustomExpression;
2501
3093
  private getWeekNumber;
2502
- static ɵfac: i0.ɵɵFactoryDeclaration<CronParserService, never>;
2503
- static ɵprov: i0.ɵɵInjectableDeclaration<CronParserService>;
3094
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CronParserService, never>;
3095
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<CronParserService>;
2504
3096
  }
2505
3097
 
2506
3098
  /**
@@ -2535,8 +3127,8 @@ declare class CronHumanizerService {
2535
3127
  name: string;
2536
3128
  }[];
2537
3129
  private normalizeLocale;
2538
- static ɵfac: i0.ɵɵFactoryDeclaration<CronHumanizerService, never>;
2539
- static ɵprov: i0.ɵɵInjectableDeclaration<CronHumanizerService>;
3130
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CronHumanizerService, never>;
3131
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<CronHumanizerService>;
2540
3132
  }
2541
3133
 
2542
3134
  /**
@@ -2568,8 +3160,8 @@ declare class CopyableTextComponent {
2568
3160
  protected get hasValue(): boolean;
2569
3161
  /** Copies the value to clipboard and shows a notification. */
2570
3162
  protected copyToClipboard(): void;
2571
- static ɵfac: i0.ɵɵFactoryDeclaration<CopyableTextComponent, never>;
2572
- static ɵcmp: i0.ɵɵComponentDeclaration<CopyableTextComponent, "mm-copyable-text", never, { "value": { "alias": "value"; "required": true; }; "label": { "alias": "label"; "required": false; }; "copyLabel": { "alias": "copyLabel"; "required": false; }; "buttonTitle": { "alias": "buttonTitle"; "required": false; }; }, { "copied": "copied"; }, never, never, true, never>;
3163
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<CopyableTextComponent, never>;
3164
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<CopyableTextComponent, "mm-copyable-text", never, { "value": { "alias": "value"; "required": true; }; "label": { "alias": "label"; "required": false; }; "copyLabel": { "alias": "copyLabel"; "required": false; }; "buttonTitle": { "alias": "buttonTitle"; "required": false; }; }, { "copied": "copied"; }, never, never, true, never>;
2573
3165
  }
2574
3166
 
2575
3167
  declare class ImportStrategyDialogResult {
@@ -2584,15 +3176,15 @@ declare class ImportStrategyDialogComponent extends DialogContentBase {
2584
3176
  constructor();
2585
3177
  onImport(): void;
2586
3178
  onCancel(): void;
2587
- static ɵfac: i0.ɵɵFactoryDeclaration<ImportStrategyDialogComponent, never>;
2588
- static ɵcmp: i0.ɵɵComponentDeclaration<ImportStrategyDialogComponent, "mm-import-strategy-dialog", never, { "message": { "alias": "message"; "required": false; }; }, {}, never, never, true, never>;
3179
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ImportStrategyDialogComponent, never>;
3180
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ImportStrategyDialogComponent, "mm-import-strategy-dialog", never, { "message": { "alias": "message"; "required": false; }; }, {}, never, never, true, never>;
2589
3181
  }
2590
3182
 
2591
3183
  declare class ImportStrategyDialogService {
2592
3184
  private readonly dialogService;
2593
3185
  showImportStrategyDialog(title?: string, message?: string): Promise<ImportStrategyDto | null>;
2594
- static ɵfac: i0.ɵɵFactoryDeclaration<ImportStrategyDialogService, never>;
2595
- static ɵprov: i0.ɵɵInjectableDeclaration<ImportStrategyDialogService>;
3186
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ImportStrategyDialogService, never>;
3187
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<ImportStrategyDialogService>;
2596
3188
  }
2597
3189
 
2598
3190
  interface WindowDimensions {
@@ -2642,11 +3234,269 @@ declare class WindowStateService {
2642
3234
  private getOrCreateBackdropElement;
2643
3235
  private loadStates;
2644
3236
  private saveStates;
2645
- static ɵfac: i0.ɵɵFactoryDeclaration<WindowStateService, never>;
2646
- static ɵprov: i0.ɵɵInjectableDeclaration<WindowStateService>;
3237
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<WindowStateService, never>;
3238
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<WindowStateService>;
3239
+ }
3240
+
3241
+ /** Where the button sits; drives size, icon size (16 px rows, 20 px toolbars) and emphasis. */
3242
+ type MmActionContext = 'row' | 'toolbar' | 'page';
3243
+ /** What the button shows. Icon-only buttons always get a tooltip and an accessible name. */
3244
+ type MmActionDisplay = 'icon' | 'text' | 'icon-text';
3245
+ /**
3246
+ * One action as a button (AB#5570), rendered from a shared {@link MmAction} definition.
3247
+ *
3248
+ * - `display="icon"`: icon-only, native tooltip = label (+ disabled reason), `aria-label`
3249
+ * = label + `targetLabel` ("Delete dump Encrypt run 2026-10-06 17:09").
3250
+ * - `display="text"` / `"icon-text"`: visible label; `targetLabel` still extends the
3251
+ * accessible name when the same label repeats (one per row).
3252
+ * - Disabled (`disabledReason`): stays focusable, `aria-disabled="true"`, the reason is
3253
+ * linked via `aria-describedby` and shown in the tooltip; clicks are swallowed.
3254
+ * - `danger`: Kendo `themeColor="error"`. The consumer confirms before acting.
3255
+ * - `primary` (page/toolbar context only): solid primary button for the one main action.
3256
+ * - `link`: rendered as a real router link (`<a kendoButton [routerLink]>`, so open-in-new-tab
3257
+ * works); a disabled link action renders as a disabled button.
3258
+ *
3259
+ * ```html
3260
+ * <mm-action-button [action]="refresh" context="toolbar" (triggered)="reload()" />
3261
+ * <mm-action-button [action]="newAdapter" context="page" display="icon-text" primary (triggered)="create()" />
3262
+ * ```
3263
+ */
3264
+ declare class ActionButtonComponent<TId extends string = string> {
3265
+ /** The action definition. */
3266
+ readonly action: _angular_core.InputSignal<MmAction<TId>>;
3267
+ /** Name of the target (row) for the accessible name; required for repeated row actions. */
3268
+ readonly targetLabel: _angular_core.InputSignal<string | null | undefined>;
3269
+ readonly context: _angular_core.InputSignal<MmActionContext>;
3270
+ readonly display: _angular_core.InputSignal<MmActionDisplay>;
3271
+ /** Solid primary emphasis — at most one per page header / toolbar. */
3272
+ readonly primary: _angular_core.InputSignalWithTransform<boolean, unknown>;
3273
+ /** Fires for enabled actions only. */
3274
+ readonly triggered: _angular_core.OutputEmitterRef<MmActionEvent<TId>>;
3275
+ protected readonly reasonId: string;
3276
+ protected readonly disabled: _angular_core.Signal<boolean>;
3277
+ /** Icon-only needs an icon; without one the button falls back to its text. */
3278
+ protected readonly iconOnly: _angular_core.Signal<boolean>;
3279
+ /** Visible text: `menuLabel` ("Delete dump…") when set, else the label. */
3280
+ protected readonly visibleLabel: _angular_core.Signal<string>;
3281
+ protected readonly showIcon: _angular_core.Signal<boolean>;
3282
+ protected readonly tooltip: _angular_core.Signal<string | null>;
3283
+ protected readonly ariaLabel: _angular_core.Signal<string | null>;
3284
+ /** Kendo button classes for the link variant (same look as `button[kendoButton]`). */
3285
+ protected readonly linkClasses: _angular_core.Signal<string>;
3286
+ protected onClick(event: Event): void;
3287
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ActionButtonComponent<any>, never>;
3288
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ActionButtonComponent<any>, "mm-action-button", never, { "action": { "alias": "action"; "required": true; "isSignal": true; }; "targetLabel": { "alias": "targetLabel"; "required": false; "isSignal": true; }; "context": { "alias": "context"; "required": false; "isSignal": true; }; "display": { "alias": "display"; "required": false; "isSignal": true; }; "primary": { "alias": "primary"; "required": false; "isSignal": true; }; }, { "triggered": "triggered"; }, never, never, true, never>;
3289
+ }
3290
+
3291
+ /**
3292
+ * Texts of `mm-row-actions` (G16). `{name}` is replaced by the row label; the `…For` members are
3293
+ * used when the row has a label, the plain ones when it is empty.
3294
+ */
3295
+ interface RowActionsMessages {
3296
+ /** Accessible name of the action group: "Actions for {name}". */
3297
+ actionsFor: string;
3298
+ /** Group name without a row label. */
3299
+ actions: string;
3300
+ /** Accessible name and tooltip of the overflow button: "More actions for {name}". */
3301
+ moreActionsFor: string;
3302
+ /** Overflow button without a row label. */
3303
+ moreActions: string;
3304
+ }
3305
+ declare const DEFAULT_ROW_ACTIONS_MESSAGES: RowActionsMessages;
3306
+ /** App-wide translations of `mm-row-actions`. Partial: members left out keep their English default. */
3307
+ declare const MM_ROW_ACTIONS_MESSAGES: InjectionToken<Partial<RowActionsMessages>>;
3308
+ /**
3309
+ * Merges overrides over {@link DEFAULT_ROW_ACTIONS_MESSAGES}, later sources winning; members that
3310
+ * are missing, `undefined` or `null` keep the earlier value.
3311
+ */
3312
+ declare function resolveRowActionsMessages(...overrides: (Partial<RowActionsMessages> | null | undefined)[]): RowActionsMessages;
3313
+
3314
+ /** Overflow menu item handed to the Kendo DropDownButton. */
3315
+ interface RowActionMenuItem<TId extends string> {
3316
+ text: string;
3317
+ svgIcon?: MmAction<TId>['icon'];
3318
+ disabled: boolean;
3319
+ action: MmAction<TId>;
3320
+ }
3321
+ /**
3322
+ * The actions of one table row (AB#5570): icon buttons (16 px) with tooltip and an accessible
3323
+ * name that includes the row ("Edit Mesh Adapter"), from one shared action definition.
3324
+ * At most `maxInline` slots (default 3): when the actions do not fit, the last slot becomes a
3325
+ * "More actions for …" menu. Disabled actions stay focusable and announce their reason;
3326
+ * in the menu the reason is shown under the item text.
3327
+ *
3328
+ * Texts ("Actions for …", "More actions for …") come from {@link MM_ROW_ACTIONS_MESSAGES} and the
3329
+ * `messages` input (the input wins), English by default.
3330
+ *
3331
+ * The component only emits — destructive handlers confirm first (danger dialog naming the target).
3332
+ *
3333
+ * ```html
3334
+ * <td class="actions">
3335
+ * <mm-row-actions [actions]="rowActions(run)" [rowLabel]="runLabel(run)" (triggered)="onAction($event, run)" />
3336
+ * </td>
3337
+ * ```
3338
+ */
3339
+ declare class RowActionsComponent<TId extends string = string> {
3340
+ /** Action definitions for this row (hidden ones are filtered out). */
3341
+ readonly actions: _angular_core.InputSignal<readonly MmAction<TId>[]>;
3342
+ /** Human name of the row ("Mesh Adapter", "Encrypt run 2026-10-06 17:09"); part of every accessible name. */
3343
+ readonly rowLabel: _angular_core.InputSignal<string>;
3344
+ /** Slots incl. the overflow button. */
3345
+ readonly maxInline: _angular_core.InputSignalWithTransform<number, unknown>;
3346
+ /** Translations for this instance; members left out come from `MM_ROW_ACTIONS_MESSAGES`, else English. */
3347
+ readonly messages: _angular_core.InputSignal<Partial<RowActionsMessages> | null>;
3348
+ /** Fires for enabled actions only, inline or from the menu. */
3349
+ readonly triggered: _angular_core.OutputEmitterRef<MmActionEvent<TId>>;
3350
+ private readonly router;
3351
+ /** Menu links resolve like the inline `routerLink`: relative to the hosting route. */
3352
+ private readonly route;
3353
+ private readonly injectedMessages;
3354
+ protected readonly moreIcon: _progress_kendo_svg_icons.SVGIcon;
3355
+ private readonly m;
3356
+ protected readonly split: _angular_core.Signal<{
3357
+ inline: MmAction<TId>[];
3358
+ menu: MmAction<TId>[];
3359
+ }>;
3360
+ protected readonly menuItems: _angular_core.Signal<RowActionMenuItem<TId>[]>;
3361
+ /** No group semantics for an empty cell (all actions hidden). */
3362
+ protected readonly hasActions: _angular_core.Signal<boolean>;
3363
+ protected readonly moreLabel: _angular_core.Signal<string>;
3364
+ protected readonly groupLabel: _angular_core.Signal<string>;
3365
+ private format;
3366
+ protected onMenuItem(item: RowActionMenuItem<TId>): void;
3367
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<RowActionsComponent<any>, never>;
3368
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<RowActionsComponent<any>, "mm-row-actions", never, { "actions": { "alias": "actions"; "required": true; "isSignal": true; }; "rowLabel": { "alias": "rowLabel"; "required": true; "isSignal": true; }; "maxInline": { "alias": "maxInline"; "required": false; "isSignal": true; }; "messages": { "alias": "messages"; "required": false; "isSignal": true; }; }, { "triggered": "triggered"; }, never, never, true, never>;
3369
+ }
3370
+
3371
+ /** The OctoBot animations shipped with shared-ui (AB#3444). */
3372
+ type OctoBotAnimation = 'idle' | 'blink' | 'look' | 'swim' | 'thinking' | 'wave';
3373
+ /**
3374
+ * Image loading strategy (`loading` attribute): `lazy` (default) defers the request until the
3375
+ * figure nears the viewport; `eager` loads it right away — for places where the figure is visible
3376
+ * immediately (empty states, 404 / turned-off pages), so it does not pop in late.
3377
+ */
3378
+ type OctoBotLoading = 'lazy' | 'eager';
3379
+ /** Rendered sizes: `sm` 60 px, `md` 120 px, `lg` 240 px (square). */
3380
+ type OctoBotSize = 'sm' | 'md' | 'lg';
3381
+ /** Pixel edge length of each {@link OctoBotSize}. */
3382
+ declare const OCTOBOT_SIZE_PX: Readonly<Record<OctoBotSize, number>>;
3383
+ /**
3384
+ * Length of one loop of each animation in ms (identical for all sizes; read from the WebP frame
3385
+ * durations). Used by `playOnce`.
3386
+ */
3387
+ declare const OCTOBOT_LOOP_MS: Readonly<Record<OctoBotAnimation, number>>;
3388
+ /**
3389
+ * Base URL of the OctoBot images, with a trailing slash. Default `assets/octobot/` (relative to
3390
+ * the document base). The files ship as library assets in
3391
+ * `node_modules/@meshmakers/shared-ui/assets/octobot`; a host app copies them with an
3392
+ * `angular.json` assets entry:
3393
+ *
3394
+ * ```json
3395
+ * { "glob": "**\/*", "input": "node_modules/@meshmakers/shared-ui/assets/octobot", "output": "/assets/octobot" }
3396
+ * ```
3397
+ *
3398
+ * Provide a different value when the app serves them elsewhere (a CDN, a sub path).
3399
+ */
3400
+ declare const OCTOBOT_ASSET_BASE_URL: InjectionToken<string>;
3401
+ /**
3402
+ * App-wide "show stills only" switch, e.g. bound to a user setting "Reduce animations". When
3403
+ * `true`, every `mm-octobot` shows its still frame regardless of `prefers-reduced-motion`.
3404
+ */
3405
+ declare const OCTOBOT_FORCE_STILL: InjectionToken<boolean>;
3406
+ /**
3407
+ * `mm-octobot` — the meshmakers OctoBot mascot as a small animated pixel-art image (AB#3444).
3408
+ *
3409
+ * Renders one `<img>` with a fixed width and height (no layout shift), `loading="lazy"` (or
3410
+ * `eager` via the `loading` input),
3411
+ * `decoding="async"` and `image-rendering: pixelated`. The image is an 8-frame animated WebP
3412
+ * loaded by URL from {@link OCTOBOT_ASSET_BASE_URL} — nothing lands in the JS bundle.
3413
+ *
3414
+ * **Reduced motion:** while the user prefers reduced motion (`prefers-reduced-motion: reduce`,
3415
+ * followed live via `matchMedia`), when {@link OCTOBOT_FORCE_STILL} is `true` or when the `still`
3416
+ * input is set, the first frame is shown as a static PNG instead.
3417
+ *
3418
+ * **Accessibility:** without a `label` the figure is decorative (`alt=""`, `aria-hidden="true"`);
3419
+ * the surrounding text must carry the meaning (e.g. "Thinking…" next to `thinking`). With a
3420
+ * `label` the host gets `role="img"` and `aria-label`.
3421
+ *
3422
+ * **Placement rules (host responsibility, see `docs/actions.md` › OctoBot):** at most one
3423
+ * animated OctoBot per view — empty states (once per page), page loading, the assistant panel,
3424
+ * 404 / turned-off pages, onboarding. Never inside repeated elements (list rows, table cells,
3425
+ * cockpit tiles, buttons) and never in toasts or error messages (a still frame is acceptable
3426
+ * there if a figure is wanted at all).
3427
+ *
3428
+ * @example
3429
+ * ```html
3430
+ * <mm-octobot animation="idle" size="md" />
3431
+ * <mm-octobot animation="thinking" size="sm" label="The assistant is thinking" />
3432
+ * ```
3433
+ */
3434
+ declare class OctoBotComponent {
3435
+ private readonly baseUrl;
3436
+ private readonly forceStill;
3437
+ /** Which animation to play. Default `idle`. */
3438
+ readonly animation: _angular_core.InputSignal<OctoBotAnimation>;
3439
+ /** Rendered size. Default `md` (120 px). */
3440
+ readonly size: _angular_core.InputSignal<OctoBotSize>;
3441
+ /** Accessible name; when empty the figure is decorative. */
3442
+ readonly label: _angular_core.InputSignal<string | null | undefined>;
3443
+ /** Image loading strategy; `eager` where the figure is visible right away. Default `lazy`. */
3444
+ readonly loading: _angular_core.InputSignal<OctoBotLoading>;
3445
+ /** Show the still frame instead of the animation (e.g. after the assistant finished). */
3446
+ readonly still: _angular_core.InputSignalWithTransform<boolean, unknown>;
3447
+ /**
3448
+ * Plays the animation once ({@link OCTOBOT_LOOP_MS}) and then rests on the still frame — for
3449
+ * greetings (`wave`) that should not loop forever. The WebPs themselves loop endlessly.
3450
+ */
3451
+ readonly playOnce: _angular_core.InputSignalWithTransform<boolean, unknown>;
3452
+ private readonly prefersReducedMotion;
3453
+ private readonly played;
3454
+ protected readonly px: _angular_core.Signal<number>;
3455
+ protected readonly showStill: _angular_core.Signal<boolean>;
3456
+ protected readonly src: _angular_core.Signal<string>;
3457
+ constructor();
3458
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<OctoBotComponent, never>;
3459
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<OctoBotComponent, "mm-octobot", never, { "animation": { "alias": "animation"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "loading": { "alias": "loading"; "required": false; "isSignal": true; }; "still": { "alias": "still"; "required": false; "isSignal": true; }; "playOnce": { "alias": "playOnce"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
3460
+ }
3461
+
3462
+ /**
3463
+ * - `empty`: a list or page has no records yet → OctoBot `idle`.
3464
+ * - `no-results`: a search or filter matches nothing → OctoBot `look`.
3465
+ * - `error`: loading failed → no figure (errors stay sober), `role="alert"`, optional "Try again".
3466
+ */
3467
+ type EmptyStateVariant = 'empty' | 'no-results' | 'error';
3468
+ /** Default English "Try again" label of {@link EmptyStateComponent}. */
3469
+ declare const DEFAULT_EMPTY_STATE_RETRY_LABEL = "Try again";
3470
+ /**
3471
+ * `mm-empty-state` — the shared empty / no-results / error block of a page or list (AB#3444).
3472
+ *
3473
+ * One per page or list, never per row. The `empty` and `no-results` variants show one OctoBot
3474
+ * (`idle` / `look`, decorative) above the title; the `error` variant shows no figure and announces
3475
+ * itself as an alert. Project extra actions (e.g. "New data flow") as content.
3476
+ *
3477
+ * @example
3478
+ * ```html
3479
+ * <mm-empty-state heading="No data flows yet" text="Create your first data flow to start processing data." />
3480
+ * <mm-empty-state variant="error" heading="The blueprints could not be loaded." showRetry (retry)="load()" />
3481
+ * ```
3482
+ */
3483
+ declare class EmptyStateComponent {
3484
+ readonly variant: _angular_core.InputSignal<EmptyStateVariant>;
3485
+ readonly heading: _angular_core.InputSignal<string>;
3486
+ readonly text: _angular_core.InputSignal<string | null | undefined>;
3487
+ /** OctoBot size of the `empty` / `no-results` variants. Default `md`. */
3488
+ readonly size: _angular_core.InputSignal<OctoBotSize>;
3489
+ /** Shows the "Try again" button (error variant only). */
3490
+ readonly showRetry: _angular_core.InputSignalWithTransform<boolean, unknown>;
3491
+ readonly retryLabel: _angular_core.InputSignal<string>;
3492
+ /** Emitted by the "Try again" button. */
3493
+ readonly retry: _angular_core.OutputEmitterRef<void>;
3494
+ protected readonly figure: _angular_core.Signal<OctoBotAnimation | null>;
3495
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<EmptyStateComponent, never>;
3496
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<EmptyStateComponent, "mm-empty-state", never, { "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "heading": { "alias": "heading"; "required": true; "isSignal": true; }; "text": { "alias": "text"; "required": false; "isSignal": true; }; "size": { "alias": "size"; "required": false; "isSignal": true; }; "showRetry": { "alias": "showRetry"; "required": false; "isSignal": true; }; "retryLabel": { "alias": "retryLabel"; "required": false; "isSignal": true; }; }, { "retry": "retry"; }, never, ["*"], true, never>;
2647
3497
  }
2648
3498
 
2649
3499
  declare function provideMmSharedUi(): EnvironmentProviders;
2650
3500
 
2651
- export { BaseFormComponent, BaseTreeDetailComponent, ButtonTypes, BytesToSizePipe, CRON_PRESETS, ConfirmationService, ConfirmationWindowComponent, ConfirmationWindowResult, CopyableTextComponent, CronBuilderComponent, CronHumanizerService, CronParserService, DEFAULT_CONFIRMATION_WINDOW_MESSAGES, DEFAULT_CRON_BUILDER_CONFIG, DEFAULT_ENTITY_SELECT_DIALOG_MESSAGES, DEFAULT_ENTITY_SELECT_INPUT_MESSAGES, DEFAULT_INPUT_DIALOG_MESSAGES, DEFAULT_LIST_VIEW_MESSAGES, DEFAULT_MESSAGE_DETAILS_DIALOG_MESSAGES, DEFAULT_NOTIFICATION_DISPLAY_MESSAGES, DEFAULT_PROGRESS_WINDOW_MESSAGES, DEFAULT_RESPONSIVE_COLSPAN, DEFAULT_SAVE_AS_DIALOG_MESSAGES, DEFAULT_TIME_RANGE_LABELS, DataSourceBase, DataSourceTyped, DialogType, EntitySelectDialogComponent, EntitySelectDialogService, EntitySelectInputComponent, FetchResultBase, FetchResultTyped, FileUploadResult, FileUploadService, FormTitleExtraDirective, HAS_UNSAVED_CHANGES, HOUR_INTERVALS, HierarchyDataSource, HierarchyDataSourceBase, ImportStrategyDialogComponent, ImportStrategyDialogResult, ImportStrategyDialogService, ImportStrategyDto, InputDialogComponent, InputService, ListStateService, ListViewComponent, ListViewFiltersDirective, MINUTE_INTERVALS, MessageDetailsDialogComponent, MessageDetailsDialogService, MessageListenerService, MmListViewDataBindingDirective, NotificationDisplayService, PascalCasePipe, ProgressValue, ProgressWindowComponent, ProgressWindowService, RELATIVE_WEEKS, SECOND_INTERVALS, SaveAsDialogComponent, SaveAsDialogService, TimeRangePickerComponent, TimeRangeUtils, TreeComponent, UnsavedChangesDirective, UnsavedChangesGuard, UploadFileDialogComponent, WEEKDAYS, WEEKDAY_ABBREVIATIONS, WindowStateService, generateDayOfMonthOptions, generateHourOptions, generateMinuteOptions, provideMmSharedUi };
2652
- export type { BadgeMapping, BadgeMappingTable, BaseFormConfig, BaseFormMessages, ColumnDefinition, ConfirmationButtonLabels, ConfirmationWindowData, ConfirmationWindowMessages, ContextMenuType, CronBuilderConfig, CronFields, CronPreset, CronSchedule, CronValidationResult, DialogFetchOptions, DialogFetchResult, DropdownOption, EntitySelectDialogDataSource, EntitySelectDialogMessages, EntitySelectDialogOptions, EntitySelectDialogResult, EntitySelectInputMessages, FetchAgainOptions, FetchDataOptions, FetchResult, FileUploadData, HasUnsavedChanges, InputDialogMessages, ListViewCommand, ListViewMessages, MessageDetailsDialogData, MessageDetailsDialogMessages, NameAvailabilityResult, NodeDroppedEvent, NodeInfo, NotificationDisplayMessages, PersistedListState, ProgressWindowConfig, ProgressWindowData, ProgressWindowMessages, ProgressWindowOptions, ProgressWindowResult, Quarter, RelativeTimeUnit, ResponsiveFormBreakPoint, RowClassFn, SaveAsDialogDataSource, SaveAsDialogMessages, SaveAsDialogOptions, SaveAsDialogResult, ScheduleType, StatusFieldConfig, StatusIconMapping, StatusMapping, TableColumn, TimeRange, TimeRangeISO, TimeRangeOption, TimeRangePickerConfig, TimeRangePickerLabels, TimeRangeSelection, TimeRangeType, TimeRangeZone, UnsavedChangesMessages, Weekday, WindowDimensions };
3501
+ export { ActionButtonComponent, BaseFormComponent, BaseTreeDetailComponent, ButtonTypes, BytesToSizePipe, CRON_PRESETS, ConfirmationService, ConfirmationWindowComponent, ConfirmationWindowResult, CopyableTextComponent, CronBuilderComponent, CronHumanizerService, CronParserService, DANGER_CONFIRM_ENVIRONMENT, DANGER_CONFIRM_FALLBACK_WORD, DANGER_CONFIRM_SAFE_FOCUS, DEFAULT_CONFIRMATION_WINDOW_MESSAGES, DEFAULT_CRON_BUILDER_CONFIG, DEFAULT_DANGER_CONFIRMATION_MESSAGES, DEFAULT_EMPTY_STATE_RETRY_LABEL, DEFAULT_ENTITY_SELECT_DIALOG_MESSAGES, DEFAULT_ENTITY_SELECT_INPUT_MESSAGES, DEFAULT_INPUT_DIALOG_MESSAGES, DEFAULT_LIST_VIEW_MESSAGES, DEFAULT_MESSAGE_DETAILS_DIALOG_MESSAGES, DEFAULT_NOTIFICATION_DISPLAY_MESSAGES, DEFAULT_PROGRESS_WINDOW_MESSAGES, DEFAULT_RESPONSIVE_COLSPAN, DEFAULT_ROW_ACTIONS_MESSAGES, DEFAULT_SAVE_AS_DIALOG_MESSAGES, DEFAULT_TIME_RANGE_LABELS, DangerConfirmationResult, DangerConfirmationWindowComponent, DataSourceBase, DataSourceTyped, DialogType, EmptyStateComponent, EntitySelectDialogComponent, EntitySelectDialogService, EntitySelectInputComponent, FetchResultBase, FetchResultTyped, FileUploadResult, FileUploadService, FormTitleExtraDirective, HAS_UNSAVED_CHANGES, HOUR_INTERVALS, HierarchyDataSource, HierarchyDataSourceBase, ImportStrategyDialogComponent, ImportStrategyDialogResult, ImportStrategyDialogService, ImportStrategyDto, InputDialogComponent, InputService, ListStateService, ListViewComponent, ListViewFiltersDirective, MINUTE_INTERVALS, MM_ACTION_ICONS, MM_ROW_ACTIONS_MAX_INLINE, MM_ROW_ACTIONS_MESSAGES, MessageDetailsDialogComponent, MessageDetailsDialogService, MessageListenerService, MmListViewDataBindingDirective, NOTIFICATION_DISPLAY_OPTIONS, NotificationDisplayService, OCTOBOT_ASSET_BASE_URL, OCTOBOT_FORCE_STILL, OCTOBOT_LOOP_MS, OCTOBOT_SIZE_PX, OctoBotComponent, PascalCasePipe, ProgressValue, ProgressWindowComponent, ProgressWindowService, RELATIVE_WEEKS, RowActionsComponent, SECOND_INTERVALS, SaveAsDialogComponent, SaveAsDialogService, TimeRangePickerComponent, TimeRangeUtils, TreeComponent, UnsavedChangesDirective, UnsavedChangesGuard, UploadFileDialogComponent, WEEKDAYS, WEEKDAY_ABBREVIATIONS, WindowStateService, actionAccessibleName, actionTooltip, applyDangerConfirmEnvironment, dangerConfirmNameMatches, dangerConfirmTypingToken, generateDayOfMonthOptions, generateHourOptions, generateMinuteOptions, isActionDisabled, isActionVisible, provideMmSharedUi, resolveListRowAction, resolveListRowLabel, resolveListViewMessages, resolveRowActionsMessages, sameAction, splitRowActions };
3502
+ export type { BadgeMapping, BadgeMappingTable, BaseFormConfig, BaseFormMessages, BooleanIconMapping, ColumnDefinition, ConfirmationButtonLabels, ConfirmationWindowData, ConfirmationWindowMessages, ContextMenuType, CronBuilderConfig, CronFields, CronPreset, CronSchedule, CronValidationResult, DangerConfirmEnvironment, DangerConfirmationMessages, DangerConfirmationOptions, DialogFetchOptions, DialogFetchResult, DropdownOption, EmptyStateVariant, EntitySelectDialogDataSource, EntitySelectDialogMessages, EntitySelectDialogOptions, EntitySelectDialogResult, EntitySelectInputMessages, FetchAgainOptions, FetchDataOptions, FetchResult, FileUploadData, HasUnsavedChanges, InputDialogMessages, ListViewCommand, ListViewMessages, MessageDetailsDialogData, MessageDetailsDialogMessages, MmAction, MmActionContext, MmActionDisplay, MmActionEvent, MmActionIconName, MmActionLink, MmListEmptyContext, MmListEmptyState, MmListRowAction, MmListRowActionEvent, NameAvailabilityResult, NodeDroppedEvent, NodeInfo, NotificationDisplayMessages, NotificationDisplayOptions, OctoBotAnimation, OctoBotLoading, OctoBotSize, PersistedListState, ProgressWindowConfig, ProgressWindowData, ProgressWindowMessages, ProgressWindowOptions, ProgressWindowResult, Quarter, RelativeTimeUnit, ResolvedListRowAction, ResponsiveFormBreakPoint, RowActionsMessages, RowActionsView, RowClassFn, SaveAsDialogDataSource, SaveAsDialogMessages, SaveAsDialogOptions, SaveAsDialogResult, ScheduleType, StatusFieldConfig, StatusIconMapping, StatusMapping, TableColumn, TimeRange, TimeRangeISO, TimeRangeOption, TimeRangePickerConfig, TimeRangePickerLabels, TimeRangeSelection, TimeRangeType, TimeRangeZone, UnsavedChangesMessages, Weekday, WindowDimensions };