@yuuvis/client-framework 2.19.0 → 2.20.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 (27) hide show
  1. package/breadcrumb/index.d.ts +2 -0
  2. package/breadcrumb/lib/breadcrumb/breadcrumb.component.d.ts +94 -0
  3. package/breadcrumb/lib/models/breadcrumb-item.model.d.ts +14 -0
  4. package/breadcrumb/lib/models/index.d.ts +1 -0
  5. package/fesm2022/yuuvis-client-framework-breadcrumb.mjs +117 -0
  6. package/fesm2022/yuuvis-client-framework-breadcrumb.mjs.map +1 -0
  7. package/fesm2022/yuuvis-client-framework-list.mjs +365 -121
  8. package/fesm2022/yuuvis-client-framework-list.mjs.map +1 -1
  9. package/fesm2022/yuuvis-client-framework-object-details.mjs +28 -26
  10. package/fesm2022/yuuvis-client-framework-object-details.mjs.map +1 -1
  11. package/fesm2022/yuuvis-client-framework-object-form.mjs.map +1 -1
  12. package/fesm2022/yuuvis-client-framework-object-versions.mjs +1 -1
  13. package/fesm2022/yuuvis-client-framework-object-versions.mjs.map +1 -1
  14. package/fesm2022/yuuvis-client-framework-query-list.mjs +462 -127
  15. package/fesm2022/yuuvis-client-framework-query-list.mjs.map +1 -1
  16. package/fesm2022/yuuvis-client-framework-tile-list.mjs +695 -178
  17. package/fesm2022/yuuvis-client-framework-tile-list.mjs.map +1 -1
  18. package/lib/assets/i18n/ar.json +2 -1
  19. package/lib/assets/i18n/de.json +2 -1
  20. package/lib/assets/i18n/en.json +2 -1
  21. package/list/lib/list.component.d.ts +256 -44
  22. package/object-details/lib/object-details-header/object-details-header.component.d.ts +5 -2
  23. package/object-details/lib/object-details-shell/object-details-shell.component.d.ts +5 -2
  24. package/object-details/lib/object-details.component.d.ts +3 -1
  25. package/package.json +8 -4
  26. package/query-list/lib/query-list.component.d.ts +381 -86
  27. package/tile-list/lib/tile-list/tile-list.component.d.ts +527 -72
@@ -15,6 +15,7 @@
15
15
  "yuv.action-menu.action.delete.error.default": "تعذر حذف الكائن.",
16
16
  "yuv.action-menu.action.download.dms.object.content.description": "تنزيل ملف المستند الخاص بالكائن.",
17
17
  "yuv.action-menu.action.download.dms.object.content.label": "تنزيل ملف المستند",
18
+ "yuv.framework.breadcrumb.nav-label": "مسار التنقل",
18
19
  "yuv.clipboard.button.cancel": "إلغاء",
19
20
  "yuv.clipboard.button.paste": "لصق",
20
21
  "yuv.clipboard.text.copy.multiple": "تم نسخ {{count}} عناصر",
@@ -51,10 +52,10 @@
51
52
  "yuv.theme.highContrast.label": "سمة عالية التباين",
52
53
  "yuv.calendar.time.label": "الوقت",
53
54
  "yuv.form.element.data.grid.add-row.button.tooltip": "إضافة صف",
55
+ "yuv.form.element.data.grid.add.headline": "إضافة صف جديد",
54
56
  "yuv.form.element.data.grid.edit": "تحرير",
55
57
  "yuv.form.element.data.grid.edit.add": "إضافة",
56
58
  "yuv.form.element.data.grid.edit.cancel": "إلغاء",
57
- "yuv.form.element.data.grid.add.headline": "إضافة صف جديد",
58
59
  "yuv.form.element.data.grid.edit.headline": "تحرير الصف '{{headline}}'",
59
60
  "yuv.form.element.data.grid.noData": "لا توجد بيانات متاحة",
60
61
  "yuv.form.element.data.grid.remove": "إزالة",
@@ -15,6 +15,7 @@
15
15
  "yuv.action-menu.action.delete.error.default": "Das Objekt konnte nicht gelöscht werden.",
16
16
  "yuv.action-menu.action.download.dms.object.content.description": "Lädt die Dokumentdatei des Objekts herunter.",
17
17
  "yuv.action-menu.action.download.dms.object.content.label": "Dokumentdatei herunterladen",
18
+ "yuv.framework.breadcrumb.nav-label": "Brotkrumen-Navigation",
18
19
  "yuv.clipboard.button.cancel": "Abbrechen",
19
20
  "yuv.clipboard.button.paste": "Einfügen",
20
21
  "yuv.clipboard.text.copy.multiple": "{{count}} Elemente kopiert",
@@ -51,10 +52,10 @@
51
52
  "yuv.theme.highContrast.label": "High Contrast Theme",
52
53
  "yuv.calendar.time.label": "Uhrzeit",
53
54
  "yuv.form.element.data.grid.add-row.button.tooltip": "Zeile hinzufügen",
55
+ "yuv.form.element.data.grid.add.headline": "Neue Zeile hinzufügen",
54
56
  "yuv.form.element.data.grid.edit": "Bearbeiten",
55
57
  "yuv.form.element.data.grid.edit.add": "Hinzufügen",
56
58
  "yuv.form.element.data.grid.edit.cancel": "Abbrechen",
57
- "yuv.form.element.data.grid.add.headline": "Neue Zeile hinzufügen",
58
59
  "yuv.form.element.data.grid.edit.headline": "Zeile in '{{headline}}' bearbeiten",
59
60
  "yuv.form.element.data.grid.noData": "Keine Daten verfügbar",
60
61
  "yuv.form.element.data.grid.remove": "Entfernen",
@@ -15,6 +15,7 @@
15
15
  "yuv.action-menu.action.delete.error.default": "Unable to delete the object.",
16
16
  "yuv.action-menu.action.download.dms.object.content.description": "Downloads the document file of the object.",
17
17
  "yuv.action-menu.action.download.dms.object.content.label": "Download document file",
18
+ "yuv.framework.breadcrumb.nav-label": "Breadcrumb",
18
19
  "yuv.clipboard.button.cancel": "Cancel",
19
20
  "yuv.clipboard.button.paste": "Paste",
20
21
  "yuv.clipboard.text.copy.multiple": "{{count}} elements copied",
@@ -51,10 +52,10 @@
51
52
  "yuv.theme.highContrast.label": "High contrast theme",
52
53
  "yuv.calendar.time.label": "Time",
53
54
  "yuv.form.element.data.grid.add-row.button.tooltip": "Add row",
55
+ "yuv.form.element.data.grid.add.headline": "Add new row",
54
56
  "yuv.form.element.data.grid.edit": "Edit",
55
57
  "yuv.form.element.data.grid.edit.add": "Add",
56
58
  "yuv.form.element.data.grid.edit.cancel": "Cancel",
57
- "yuv.form.element.data.grid.add.headline": "Add new row",
58
59
  "yuv.form.element.data.grid.edit.headline": "Edit row '{{headline}}'",
59
60
  "yuv.form.element.data.grid.noData": "No data available",
60
61
  "yuv.form.element.data.grid.remove": "Remove",
@@ -3,106 +3,318 @@ import { OnDestroy } from '@angular/core';
3
3
  import { ListItemDirective } from './list-item.directive';
4
4
  import * as i0 from "@angular/core";
5
5
  /**
6
- * Component rendering a simple list of items. It supports keyboard
7
- * navigation and takes care of accessibility. To create a list just wrap
8
- * `yuvListItem` elements into this component:
6
+ * Accessible list component with keyboard navigation, single- and multi-selection,
7
+ * and flexible delegation of click- and selection-handling to the parent.
9
8
  *
9
+ * The component renders as an ARIA `listbox` and delegates keyboard focus tracking
10
+ * to Angular CDK's `ActiveDescendantKeyManager`. Content is projected via
11
+ * `[yuvListItem]`-attributed children (see `ListItemDirective`).
12
+ *
13
+ * **Key Features:**
14
+ * - Single and multi-selection (with Shift / Ctrl modifier support)
15
+ * - Full keyboard navigation (Arrow keys, Space, Enter, Escape)
16
+ * - Horizontal and vertical layout via the `horizontal` host attribute
17
+ * - Auto-selection on initialization via the `autoSelect` input
18
+ * - Selection guarding via `preventChangeUntil` callback
19
+ * - Optional delegation of click and selection handling to the parent component
20
+ * - Accessible: `role="listbox"`, active-descendant focus management, `aria-selected` on items
21
+ *
22
+ * **Basic usage:**
10
23
  * ```html
11
- * <yuv-list (itemSelect)="itemSelected($event)">
24
+ * <yuv-list (itemSelect)="onItemSelect($event)">
12
25
  * <div yuvListItem>Entry #1</div>
13
26
  * <div yuvListItem>Entry #2</div>
14
27
  * </yuv-list>
15
28
  * ```
29
+ *
30
+ * **Multi-selection with Shift/Ctrl:**
31
+ * ```html
32
+ * <yuv-list [multiselect]="true" (itemSelect)="onSelect($event)">
33
+ * @for (item of items; track item.id) {
34
+ * <div yuvListItem>{{ item.label }}</div>
35
+ * }
36
+ * </yuv-list>
37
+ * ```
38
+ *
39
+ * **Host Attributes (set declaratively in the template):**
40
+ * - `selectOnEnter` — treat the Enter key as a selection trigger (in addition to Space)
41
+ * - `horizontal` — switch key navigation to left/right arrows instead of up/down
42
+ *
43
+ * @example
44
+ * ```html
45
+ * <!-- Horizontal list, Enter key selects -->
46
+ * <yuv-list horizontal selectOnEnter (itemSelect)="onSelect($event)">
47
+ * <button yuvListItem>A</button>
48
+ * <button yuvListItem>B</button>
49
+ * </yuv-list>
50
+ * ```
16
51
  */
17
52
  export declare class ListComponent implements OnDestroy {
18
53
  #private;
19
- protected onKeydown(event: KeyboardEvent): void;
20
- protected onFocus(): void;
54
+ /**
55
+ * All `[yuvListItem]` children projected into this list.
56
+ *
57
+ * Queried reactively via `contentChildren` — every time the projected content
58
+ * changes (items added, removed, or reordered), the `#itemsEffect` re-runs,
59
+ * rebuilds the key manager, and re-attaches click handlers.
60
+ */
21
61
  items: import("@angular/core").Signal<readonly ListItemDirective[]>;
22
62
  /**
23
- * Function that returns `true` if selection changes should be prevented.
24
- * This can be used to temporarily block selection changes, e.g. while
25
- * there is a pending change inside another component that refers to the
26
- * current selection.
63
+ * Guard function that temporarily blocks all selection changes.
64
+ *
65
+ * Provide a factory that returns a predicate; as long as that predicate
66
+ * returns `true`, any attempt to change the selection (via click, keyboard,
67
+ * or programmatic API) is silently ignored. Useful when the parent has
68
+ * unsaved changes tied to the current selection and needs to prevent the user
69
+ * from accidentally navigating away.
70
+ *
71
+ * @example
72
+ * ```ts
73
+ * // Block selection while a save is in progress
74
+ * preventChangeUntil = () => () => this.isSaving();
75
+ * ```
76
+ *
77
+ * @default () => false (never prevents)
27
78
  */
28
79
  preventChangeUntil: import("@angular/core").InputSignal<() => boolean>;
29
80
  /**
30
- * If `true`, multiple items can be selected at once.
81
+ * Enables multi-selection mode.
82
+ *
83
+ * When `true`, the user can hold **Shift** to range-select items between the last
84
+ * selected item and the clicked one, or hold **Ctrl** to toggle individual items
85
+ * in and out of the selection. The programmatic `multiSelect()` method is also
86
+ * only effective when this input is `true`.
87
+ *
31
88
  * @default false
32
89
  */
33
90
  multiselect: import("@angular/core").InputSignal<boolean>;
34
91
  /**
35
- * If `true`, the component will handle selection itself. This means that
36
- * the parent component will be responsible for styling the selected and
37
- * focused items. If `false`, the component will take care of visualizing
38
- * the selection and focus states.
92
+ * Delegates visual selection and focus state rendering to the parent component.
93
+ *
94
+ * When `false` (default), `yuv-list` applies `.selected` and `.active` CSS classes
95
+ * to items via `ListItemDirective` signals, so the list stylesheet controls the look.
96
+ * When `true`, those signals are still updated but the host gets the
97
+ * `self-handle-selection` CSS class, which the parent can use to opt into its own
98
+ * visual treatment — useful when item templates have custom selected/focused styling.
99
+ *
39
100
  * @default false
40
101
  */
41
102
  selfHandleSelection: import("@angular/core").InputSignal<boolean>;
42
103
  /**
43
- * By default the list handles click events on its items to select them.
44
- * If this input is set to `true`, the parent component has to handle
45
- * click events itself and call the `select()` method accordingly.
104
+ * Disables the built-in click-to-select behavior, letting the parent component
105
+ * decide when `select()` is called.
106
+ *
107
+ * By default the list attaches an `onClick` handler to every `ListItemDirective`
108
+ * that calls `select()` with the correct Shift/Ctrl modifier flags. Set this
109
+ * input to `true` to suppress that wiring — the parent must then call `select()`
110
+ * imperatively in response to whatever interaction it chooses (e.g. a single-click
111
+ * that is distinguished from a double-click by `ClickDoubleDirective`).
46
112
  *
47
- * If you for example use the `ClickDoubleDirective` on the list items,
48
- * you have to set this input to `true` to prevent the list from
49
- * selecting items on single click.
50
113
  * @default false
51
114
  */
52
115
  selfHandleClick: import("@angular/core").InputSignal<boolean>;
53
116
  /**
54
- * If `true`, the list will select an item automatically on initialization.
55
- * First, list will search for an item item that has the "selected"-attribute
56
- * and is not disabled. If no such item exists, the first item will be selected.
117
+ * Automatically selects an item when the list is first rendered.
118
+ *
119
+ * The selection logic runs once per content-children change (see `#itemsEffect`)
120
+ * and follows this priority order:
121
+ * 1. The first non-disabled item that already carries the `selected` attribute.
122
+ * 2. If no such item exists and `autoSelect` is `true`, the item at index 0.
123
+ *
124
+ * Accepts any truthy string value in addition to a real boolean because the
125
+ * input is also consumable as a plain HTML attribute (`<yuv-list autoSelect>`).
126
+ *
57
127
  * @default false
58
128
  */
59
129
  autoSelect: import("@angular/core").InputSignalWithTransform<boolean, BooleanInput>;
60
130
  /**
61
- * Emits the selected items indices.
131
+ * Emits the current selection as an array of zero-based item indices whenever
132
+ * the selection changes — via click, keyboard, or programmatic API calls.
133
+ *
134
+ * An empty array signals that the selection has been cleared.
135
+ *
136
+ * @example
137
+ * ```ts
138
+ * onItemSelect(indices: number[]): void {
139
+ * this.selectedItems = indices.map(i => this.items[i]);
140
+ * }
141
+ * ```
62
142
  */
63
143
  itemSelect: import("@angular/core").OutputEmitterRef<number[]>;
64
144
  /**
65
- * Emits the index of the item that has focus.
66
- * @type {output<number>}
145
+ * Emits the zero-based index of the item that received keyboard focus
146
+ * (i.e. the active descendant managed by `ActiveDescendantKeyManager`).
147
+ *
148
+ * Note that focus and selection are independent: navigating with arrow keys
149
+ * moves focus without changing the selection until Space (or Enter when
150
+ * `selectOnEnter` is set) is pressed.
67
151
  */
68
152
  itemFocus: import("@angular/core").OutputEmitterRef<number>;
69
- selectOnEnter: boolean;
70
- horizontal: boolean;
71
153
  /**
72
- * If `true`, the list will not allow selection of items.
73
- * This is useful for lists that are used for display purposes only.
154
+ * Puts the list into a display-only mode where no item can be selected.
155
+ *
156
+ * When `true`, all selection paths are blocked: clicks, keyboard shortcuts
157
+ * (`Space`, `Enter`, `Escape`), and programmatic calls to `select()`,
158
+ * `multiSelect()`, and `clear()` are all no-ops. The list still renders
159
+ * normally and keyboard navigation still moves the focus indicator.
160
+ *
161
+ * @default false
74
162
  */
75
163
  disableSelection: import("@angular/core").InputSignal<boolean>;
76
164
  /**
77
- * Sets the active (focused) item by index. This updates the visual focus
78
- * indicator and scrolls the item into view, without changing the selection.
165
+ * When `true`, pressing **Enter** triggers item selection in addition to **Space**.
166
+ *
167
+ * Resolved once at construction time from the static `selectOnEnter` host attribute.
168
+ * Useful in contexts where Enter has a conventional "confirm" meaning (e.g. search
169
+ * result lists, command palettes).
170
+ *
171
+ * Set declaratively in the template: `<yuv-list selectOnEnter>`.
172
+ */
173
+ selectOnEnter: boolean;
174
+ /**
175
+ * When `true`, switches the `ActiveDescendantKeyManager` to horizontal mode so that
176
+ * the **Left** / **Right** arrow keys navigate between items instead of **Up** / **Down**.
177
+ *
178
+ * Resolved once at construction time from the static `horizontal` host attribute.
179
+ * The text direction of the document is respected automatically (RTL-aware via CDK
180
+ * `Directionality`).
181
+ *
182
+ * Set declaratively in the template: `<yuv-list horizontal>`.
183
+ */
184
+ horizontal: boolean;
185
+ constructor();
186
+ ngOnDestroy(): void;
187
+ /**
188
+ * Moves keyboard focus to the item at the given index and selects it.
189
+ *
190
+ * Combines three operations in one call: updating the CDK key manager's active
191
+ * descendant (which drives the ARIA active-descendant attribute and the visual focus ring),
192
+ * selecting the item, and transferring DOM focus to the list host element so that
193
+ * subsequent keyboard events are processed correctly.
194
+ *
195
+ * Safe to call before the key manager is initialized — the guard at the top of
196
+ * the method prevents errors during early lifecycle phases.
197
+ *
198
+ * @param index Zero-based index of the item to activate.
79
199
  */
80
200
  setActiveItem(index: number): void;
201
+ /**
202
+ * Transfers DOM focus to the list host element.
203
+ *
204
+ * Calling this ensures that subsequent keyboard events (arrow keys, Space, etc.)
205
+ * are routed to the list's `(keydown)` handler. Called internally by
206
+ * `setActiveItem()`, but also useful from the parent when programmatic focus
207
+ * management is needed (e.g. after closing a dialog that was triggered from a
208
+ * list item).
209
+ */
81
210
  focus(): void;
211
+ /**
212
+ * Smoothly scrolls the list container back to the top.
213
+ *
214
+ * Useful after programmatically refreshing the list contents when the user may
215
+ * have scrolled far down and the new result set should be shown from the beginning.
216
+ */
82
217
  scrollToTop(): void;
83
218
  /**
84
- * Shift the current selection by the given offset. Used for dynamically
85
- * adding items to the list without losing the current selection.
86
- * @param offset Number of items to shift the selection by.
219
+ * Shifts all selected and focused item indices by the given offset.
220
+ *
221
+ * Use this when items are prepended or inserted at the beginning of the list so
222
+ * that the existing selection and keyboard-focus position stay attached to the
223
+ * same logical items after the index space shifts. A positive offset moves
224
+ * indices forward (items were inserted before the selection); a negative offset
225
+ * moves them backward (items were removed before the selection).
226
+ *
227
+ * Does **not** emit `itemSelect` — the selection indices change structurally,
228
+ * not because the user chose different items.
229
+ *
230
+ * @param offset Number of positions to shift every selected index by.
87
231
  */
88
232
  shiftSelectionBy(offset: number): void;
89
233
  /**
90
- * Select multiple items by their indices.
234
+ * Programmatically replaces the entire selection with the given indices.
235
+ *
236
+ * Only effective when `multiselect` is `true` and `disableSelection` is `false`.
237
+ * Out-of-range indices are silently discarded. The resulting selection is sorted
238
+ * ascending before being applied and emitted.
239
+ *
240
+ * Use this when the parent needs to restore a previously saved multi-selection
241
+ * state, e.g. after navigation or on component re-initialization.
242
+ *
243
+ * @param index Array of zero-based item indices to select.
91
244
  */
92
245
  multiSelect(index: number[]): void;
93
246
  /**
94
- * Selects a single item by its index.
95
- * @param index Index of the item to select.
96
- * @param shiftKey If `true`, selection will be extended from the last selected item to the given index.
97
- * @param ctrlKey If `true`, the item at the given index will be toggled in the selection.
247
+ * Selects the item at the given index, optionally extending or toggling
248
+ * the existing selection using modifier-key semantics.
249
+ *
250
+ * - **No modifiers** (default): replaces the current selection with the single item.
251
+ * - **`shiftKey = true`** (`multiselect` only): range-selects all items between the
252
+ * last selected index and `index` (inclusive of neither endpoint, matching typical
253
+ * OS list behavior).
254
+ * - **`ctrlKey = true`** (`multiselect` only): toggles `index` in the selection
255
+ * without affecting the rest.
256
+ *
257
+ * Index is clamped to `[0, items.length - 1]`. Negative values and calls while
258
+ * `disableSelection` is `true` are ignored. The `preventChangeUntil` guard is
259
+ * also respected.
260
+ *
261
+ * Emits `itemSelect` after updating the visual state.
262
+ *
263
+ * @param index Zero-based index of the item to select.
264
+ * @param shiftKey Extend the selection from the last selected item to `index`.
265
+ * @param ctrlKey Toggle `index` in or out of the current selection.
98
266
  */
99
267
  select(index: number, shiftKey?: boolean, ctrlKey?: boolean): void;
100
268
  /**
101
- * Clear the current selection.
102
- * @param silent If `true`, the `itemSelect` event will not be emitted.
269
+ * Clears the current selection and resets the active keyboard-focus index.
270
+ *
271
+ * If the selection is already empty, the method is a no-op (no event emitted,
272
+ * no state update). The `preventChangeUntil` guard is respected — if the guard
273
+ * returns `true`, the clear is blocked entirely.
274
+ *
275
+ * Also triggered internally when the user presses **Escape**.
276
+ *
277
+ * @param silent When `true`, skips emitting `itemSelect` after clearing. Use this
278
+ * when the parent needs to reset state programmatically without
279
+ * triggering downstream reactions.
103
280
  */
104
281
  clear(silent?: boolean): void;
105
- ngOnDestroy(): void;
282
+ /**
283
+ * Host `keydown` handler — routes keyboard events to selection or navigation logic.
284
+ *
285
+ * Handled keys:
286
+ * - **Escape**: clears the selection.
287
+ * - **Space** (always) / **Enter** (when `selectOnEnter` is set): selects the
288
+ * currently focused item. `preventDefault()` is called to stop the browser
289
+ * from scrolling the container when Space is pressed.
290
+ * - **All other keys**: forwarded to `ActiveDescendantKeyManager` so arrow keys,
291
+ * Home, End, etc. move the focus indicator without changing the selection.
292
+ *
293
+ * When `disableSelection` is `true`, only navigation keys are forwarded to the
294
+ * key manager — selection keys (Space, Enter, Escape) are suppressed.
295
+ *
296
+ * Bound via the `host` metadata as `(keydown)`.
297
+ *
298
+ * @param event The keyboard event originating from the list host element.
299
+ */
300
+ protected onKeydown(event: KeyboardEvent): void;
301
+ /**
302
+ * Host `focus` handler — restores a sensible focus position when the list
303
+ * host element receives DOM focus without an item already being active.
304
+ *
305
+ * The logic runs inside a 300 ms timeout so that focus events triggered by
306
+ * an item being clicked (which also bubbles a focus event up to the host)
307
+ * have already resolved their own active-item state before this handler acts.
308
+ * If an active item already exists when the timeout fires, nothing happens.
309
+ *
310
+ * Focus target priority:
311
+ * 1. The first index in the current selection (so the user lands back on the
312
+ * previously selected item when tabbing into the list).
313
+ * 2. Index 0 as the fallback when there is no selection.
314
+ *
315
+ * Bound via the `host` metadata as `(focus)`.
316
+ */
317
+ protected onFocus(): void;
106
318
  static ɵfac: i0.ɵɵFactoryDeclaration<ListComponent, never>;
107
319
  static ɵcmp: i0.ɵɵComponentDeclaration<ListComponent, "yuv-list", never, { "preventChangeUntil": { "alias": "preventChangeUntil"; "required": false; "isSignal": true; }; "multiselect": { "alias": "multiselect"; "required": false; "isSignal": true; }; "selfHandleSelection": { "alias": "selfHandleSelection"; "required": false; "isSignal": true; }; "selfHandleClick": { "alias": "selfHandleClick"; "required": false; "isSignal": true; }; "autoSelect": { "alias": "autoSelect"; "required": false; "isSignal": true; }; "disableSelection": { "alias": "disableSelection"; "required": false; "isSignal": true; }; }, { "itemSelect": "itemSelect"; "itemFocus": "itemFocus"; }, ["items"], ["*"], true, never>;
108
320
  }
@@ -31,10 +31,13 @@ export declare class ObjectDetailsHeaderComponent {
31
31
  * Bucket of the object config to retrieve header data from
32
32
  */
33
33
  bucket: import("@angular/core").InputSignal<string | undefined>;
34
- actions: import("@angular/core").InputSignal<TemplateRef<any> | undefined>;
34
+ /** Template rendered in the actions area, aligned to the right of the title row. */
35
+ actions: import("@angular/core").InputSignal<TemplateRef<unknown> | undefined>;
36
+ /** Template rendered in the badges area, aligned to the right of the subtitle row. */
37
+ badges: import("@angular/core").InputSignal<TemplateRef<unknown> | undefined>;
35
38
  headerData: import("@angular/core").Signal<HeaderData | undefined>;
36
39
  constructor();
37
40
  static ɵfac: i0.ɵɵFactoryDeclaration<ObjectDetailsHeaderComponent, never>;
38
- static ɵcmp: i0.ɵɵComponentDeclaration<ObjectDetailsHeaderComponent, "yuv-object-details-header", never, { "dmsObject": { "alias": "dmsObject"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": true; "isSignal": true; }; "bucket": { "alias": "bucket"; "required": false; "isSignal": true; }; "actions": { "alias": "actions"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
41
+ static ɵcmp: i0.ɵɵComponentDeclaration<ObjectDetailsHeaderComponent, "yuv-object-details-header", never, { "dmsObject": { "alias": "dmsObject"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": true; "isSignal": true; }; "bucket": { "alias": "bucket"; "required": false; "isSignal": true; }; "actions": { "alias": "actions"; "required": false; "isSignal": true; }; "badges": { "alias": "badges"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
39
42
  }
40
43
  export {};
@@ -12,7 +12,10 @@ export declare class ObjectDetailsShellComponent {
12
12
  contextError: import("@angular/core").WritableSignal<string | undefined>;
13
13
  dmsObject: import("@angular/core").Signal<DmsObject | undefined>;
14
14
  busy: import("@angular/core").WritableSignal<boolean>;
15
- actions: import("@angular/core").InputSignal<TemplateRef<any> | undefined>;
15
+ /** Template rendered in the actions area, aligned to the right of the title row. */
16
+ actions: import("@angular/core").InputSignal<TemplateRef<unknown> | undefined>;
17
+ /** Template rendered in the badges area, aligned to the right of the subtitle row. */
18
+ badges: import("@angular/core").InputSignal<TemplateRef<unknown> | undefined>;
16
19
  /**
17
20
  * Virtual object type to use for retrieving header data
18
21
  */
@@ -27,5 +30,5 @@ export declare class ObjectDetailsShellComponent {
27
30
  hideHeader: import("@angular/core").InputSignal<boolean>;
28
31
  constructor();
29
32
  static ɵfac: i0.ɵɵFactoryDeclaration<ObjectDetailsShellComponent, never>;
30
- static ɵcmp: i0.ɵɵComponentDeclaration<ObjectDetailsShellComponent, "yuv-object-details-shell", never, { "actions": { "alias": "actions"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": true; "isSignal": true; }; "bucket": { "alias": "bucket"; "required": false; "isSignal": true; }; "hideHeader": { "alias": "hideHeader"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
33
+ static ɵcmp: i0.ɵɵComponentDeclaration<ObjectDetailsShellComponent, "yuv-object-details-shell", never, { "actions": { "alias": "actions"; "required": false; "isSignal": true; }; "badges": { "alias": "badges"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": true; "isSignal": true; }; "bucket": { "alias": "bucket"; "required": false; "isSignal": true; }; "hideHeader": { "alias": "hideHeader"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
31
34
  }
@@ -39,7 +39,9 @@ export declare class ObjectDetailsComponent {
39
39
  */
40
40
  hideHeader: import("@angular/core").InputSignal<boolean>;
41
41
  actions: import("@angular/core").InputSignal<TemplateRef<any> | undefined>;
42
+ /** Template rendered in the badges area, aligned to the right of the subtitle row. */
43
+ badges: import("@angular/core").InputSignal<TemplateRef<unknown> | undefined>;
42
44
  onIndexdataSaved(updatedObject: DmsObject): void;
43
45
  static ɵfac: i0.ɵɵFactoryDeclaration<ObjectDetailsComponent, never>;
44
- static ɵcmp: i0.ɵɵComponentDeclaration<ObjectDetailsComponent, "yuv-object-details", never, { "dmsObjectInput": { "alias": "dmsObject"; "required": false; "isSignal": true; }; "flavors": { "alias": "flavors"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": true; "isSignal": true; }; "objectConfigBucket": { "alias": "objectConfigBucket"; "required": false; "isSignal": true; }; "objectId": { "alias": "objectId"; "required": false; "isSignal": true; }; "hideHeader": { "alias": "hideHeader"; "required": false; "isSignal": true; }; "actions": { "alias": "actions"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
46
+ static ɵcmp: i0.ɵɵComponentDeclaration<ObjectDetailsComponent, "yuv-object-details", never, { "dmsObjectInput": { "alias": "dmsObject"; "required": false; "isSignal": true; }; "flavors": { "alias": "flavors"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": true; "isSignal": true; }; "objectConfigBucket": { "alias": "objectConfigBucket"; "required": false; "isSignal": true; }; "objectId": { "alias": "objectId"; "required": false; "isSignal": true; }; "hideHeader": { "alias": "hideHeader"; "required": false; "isSignal": true; }; "actions": { "alias": "actions"; "required": false; "isSignal": true; }; "badges": { "alias": "badges"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
45
47
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yuuvis/client-framework",
3
- "version": "2.19.0",
3
+ "version": "2.20.0",
4
4
  "author": "OPTIMAL SYSTEMS GmbH <npm@optimal-systems.de>",
5
5
  "license": "MIT",
6
6
  "peerDependencies": {
@@ -8,15 +8,15 @@
8
8
  "@angular/common": "^19.2.1",
9
9
  "@angular/core": "^19.2.1",
10
10
  "angular-gridster2": "^19.0.0",
11
- "@yuuvis/client-core": "^2.19.0",
12
- "@yuuvis/client-shell-core": "^2.19.0",
11
+ "@yuuvis/client-core": "^2.20.0",
12
+ "@yuuvis/client-shell-core": "^2.20.0",
13
13
  "ng-dynamic-component": "^10.8.2",
14
14
  "modern-normalize": "^3.0.1"
15
15
  },
16
16
  "dependencies": {
17
17
  "@angular/material": "^19.2.15",
18
18
  "@ngrx/signals": "^19.2.0",
19
- "@yuuvis/material": "2.19.0",
19
+ "@yuuvis/material": "2.20.0",
20
20
  "@yuuvis/media-viewer": "^2.2.0",
21
21
  "angular-split": "^19.0.0",
22
22
  "vis-network": "^10.0.2",
@@ -44,6 +44,10 @@
44
44
  "types": "./autocomplete/index.d.ts",
45
45
  "default": "./fesm2022/yuuvis-client-framework-autocomplete.mjs"
46
46
  },
47
+ "./breadcrumb": {
48
+ "types": "./breadcrumb/index.d.ts",
49
+ "default": "./fesm2022/yuuvis-client-framework-breadcrumb.mjs"
50
+ },
47
51
  "./clipboard": {
48
52
  "types": "./clipboard/index.d.ts",
49
53
  "default": "./fesm2022/yuuvis-client-framework-clipboard.mjs"