@siemens/element-ng 49.9.0 → 49.11.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 (45) hide show
  1. package/fesm2022/siemens-element-ng-about.mjs +13 -4
  2. package/fesm2022/siemens-element-ng-about.mjs.map +1 -1
  3. package/fesm2022/siemens-element-ng-application-header.mjs +6 -6
  4. package/fesm2022/siemens-element-ng-application-header.mjs.map +1 -1
  5. package/fesm2022/siemens-element-ng-chat-messages.mjs +43 -19
  6. package/fesm2022/siemens-element-ng-chat-messages.mjs.map +1 -1
  7. package/fesm2022/siemens-element-ng-color-picker.mjs +9 -4
  8. package/fesm2022/siemens-element-ng-color-picker.mjs.map +1 -1
  9. package/fesm2022/siemens-element-ng-dashboard.mjs +459 -8
  10. package/fesm2022/siemens-element-ng-dashboard.mjs.map +1 -1
  11. package/fesm2022/siemens-element-ng-date-range-filter.mjs +12 -3
  12. package/fesm2022/siemens-element-ng-date-range-filter.mjs.map +1 -1
  13. package/fesm2022/siemens-element-ng-datepicker.mjs +1 -1
  14. package/fesm2022/siemens-element-ng-datepicker.mjs.map +1 -1
  15. package/fesm2022/siemens-element-ng-filtered-search.mjs +2 -2
  16. package/fesm2022/siemens-element-ng-filtered-search.mjs.map +1 -1
  17. package/fesm2022/siemens-element-ng-form.mjs +6 -6
  18. package/fesm2022/siemens-element-ng-form.mjs.map +1 -1
  19. package/fesm2022/siemens-element-ng-landing-page.mjs +2 -2
  20. package/fesm2022/siemens-element-ng-landing-page.mjs.map +1 -1
  21. package/fesm2022/siemens-element-ng-main-detail-container.mjs +2 -2
  22. package/fesm2022/siemens-element-ng-main-detail-container.mjs.map +1 -1
  23. package/fesm2022/siemens-element-ng-navbar-vertical-next.mjs +379 -264
  24. package/fesm2022/siemens-element-ng-navbar-vertical-next.mjs.map +1 -1
  25. package/fesm2022/siemens-element-ng-navbar-vertical.mjs +18 -2
  26. package/fesm2022/siemens-element-ng-navbar-vertical.mjs.map +1 -1
  27. package/fesm2022/siemens-element-ng-notification-item.mjs +2 -2
  28. package/fesm2022/siemens-element-ng-notification-item.mjs.map +1 -1
  29. package/fesm2022/siemens-element-ng-photo-upload.mjs +2 -2
  30. package/fesm2022/siemens-element-ng-select.mjs +2 -2
  31. package/fesm2022/siemens-element-ng-side-panel.mjs +2 -2
  32. package/fesm2022/siemens-element-ng-toast-notification.mjs +2 -2
  33. package/fesm2022/siemens-element-ng-tour.mjs +2 -2
  34. package/fesm2022/siemens-element-ng-translate.mjs.map +1 -1
  35. package/fesm2022/siemens-element-ng-tree-view.mjs +2 -2
  36. package/fesm2022/siemens-element-ng-tree-view.mjs.map +1 -1
  37. package/package.json +3 -3
  38. package/template-i18n.json +12 -6
  39. package/types/siemens-element-ng-about.d.ts +11 -1
  40. package/types/siemens-element-ng-chat-messages.d.ts +6 -3
  41. package/types/siemens-element-ng-color-picker.d.ts +7 -2
  42. package/types/siemens-element-ng-dashboard.d.ts +358 -4
  43. package/types/siemens-element-ng-date-range-filter.d.ts +10 -1
  44. package/types/siemens-element-ng-navbar-vertical-next.d.ts +172 -87
  45. package/types/siemens-element-ng-translate.d.ts +6 -0
@@ -1,18 +1,19 @@
1
1
  import * as i0 from '@angular/core';
2
- import { ChangeDetectionStrategy, Component, InjectionToken, model, input, booleanAttribute, inject, Injector, signal, afterNextRender, linkedSignal, untracked, computed, ViewContainerRef, effect, Directive, output, viewChild, NgModule } from '@angular/core';
2
+ import { ChangeDetectionStrategy, Component, InjectionToken, input, linkedSignal, untracked, signal, inject, computed, ViewContainerRef, DestroyRef, Injector, effect, Directive, booleanAttribute, ElementRef, model, viewChild, contentChildren, afterNextRender, output, NgModule } from '@angular/core';
3
3
  import { BreakpointObserver } from '@angular/cdk/layout';
4
- import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
5
- import { elementDoubleRight, elementDoubleLeft, elementRight2, elementDown2, elementSearch } from '@siemens/element-icons';
4
+ import * as i1 from '@angular/cdk/portal';
5
+ import { TemplatePortal, DomPortal, PortalModule } from '@angular/cdk/portal';
6
+ import { toSignal, takeUntilDestroyed } from '@angular/core/rxjs-interop';
7
+ import { elementRight2, elementDown2, elementLayoutPane2Right, elementLayoutPane2, elementDoubleRight, elementDoubleLeft, elementSearch } from '@siemens/element-icons';
6
8
  import { SI_UI_STATE_SERVICE } from '@siemens/element-ng/common';
7
9
  import { addIcons, SiIconComponent } from '@siemens/element-ng/icon';
8
10
  import { BOOTSTRAP_BREAKPOINTS } from '@siemens/element-ng/resize-observer';
9
11
  import { SiSkipLinkTargetDirective } from '@siemens/element-ng/skip-links';
10
12
  import { t, SiTranslatePipe } from '@siemens/element-translate-ng/translate';
13
+ import { RouterLinkActive } from '@angular/router';
14
+ import { EMPTY } from 'rxjs';
11
15
  import { Overlay } from '@angular/cdk/overlay';
12
- import { TemplatePortal } from '@angular/cdk/portal';
13
16
  import { CdkTrapFocus } from '@angular/cdk/a11y';
14
- import { RouterLinkActive } from '@angular/router';
15
- import { SiLinkDirective } from '@siemens/element-ng/link';
16
17
  import { SiSearchBarComponent } from '@siemens/element-ng/search-bar';
17
18
 
18
19
  /**
@@ -40,13 +41,336 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.8", ngImpor
40
41
  /** @experimental */
41
42
  const SI_NAVBAR_VERTICAL_NEXT = new InjectionToken('SI_NAVBAR_VERTICAL_NEXT');
42
43
 
44
+ /**
45
+ * Copyright (c) Siemens 2016 - 2026
46
+ * SPDX-License-Identifier: MIT
47
+ */
48
+ /**
49
+ * Using this component, to anchor the flyout inside the navbar within the a11y tree.
50
+ * Otherwise, without aria-owns, screen reader will announce the leaving of the navbar when moving to the flyout.
51
+ * Aria-owns cannot be put directly on the trigger
52
+ * as chrome will include the flyout children in the a11y label of the trigger.
53
+ * @experimental
54
+ */
55
+ class SiNavbarFlyoutAnchorComponent {
56
+ groupId = input(...(ngDevMode ? [undefined, { debugName: "groupId" }] : []));
57
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.8", ngImport: i0, type: SiNavbarFlyoutAnchorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
58
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.0.8", type: SiNavbarFlyoutAnchorComponent, isStandalone: true, selector: "si-navbar-flyout-anchor", inputs: { groupId: { classPropertyName: "groupId", publicName: "groupId", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.aria-owns": "groupId()" } }, ngImport: i0, template: '', isInline: true });
59
+ }
60
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.8", ngImport: i0, type: SiNavbarFlyoutAnchorComponent, decorators: [{
61
+ type: Component,
62
+ args: [{
63
+ selector: 'si-navbar-flyout-anchor',
64
+ template: '',
65
+ host: { '[attr.aria-owns]': 'groupId()' }
66
+ }]
67
+ }], propDecorators: { groupId: [{ type: i0.Input, args: [{ isSignal: true, alias: "groupId", required: false }] }] } });
68
+ /** @experimental */
69
+ class SiNavbarVerticalNextGroupTriggerDirective {
70
+ static idCounter = 0;
71
+ /** @internal */
72
+ groupId = `si-navbar-vertical-next-group-${SiNavbarVerticalNextGroupTriggerDirective.idCounter++}`;
73
+ id = `${this.groupId}-trigger`;
74
+ groupTemplate = input.required({ ...(ngDevMode ? { debugName: "groupTemplate" } : {}), alias: 'siNavbarVerticalNextGroupTriggerFor' });
75
+ stateId = input(...(ngDevMode ? [undefined, { debugName: "stateId" }] : []));
76
+ /** @defaultValue false */
77
+ expanded = linkedSignal({ ...(ngDevMode ? { debugName: "expanded" } : {}), source: () => {
78
+ const stateId = this.stateId();
79
+ return {
80
+ uiState: stateId ? this.navbar.uiStateExpandedItems()[stateId] : undefined,
81
+ alwaysFlyout: this.navbar.alwaysFlyout()
82
+ };
83
+ },
84
+ computation: (source, previous) => {
85
+ // `alwaysFlyout` toggled: reset expansion. When switching back to inline,
86
+ // surface the group that owns the active route.
87
+ if (previous && source.alwaysFlyout !== previous.source.alwaysFlyout) {
88
+ return !source.alwaysFlyout && untracked(() => this.active());
89
+ }
90
+ // First run or UIState (re)loaded: honor the persisted value when present,
91
+ // otherwise keep the user's current expansion.
92
+ if (source.uiState !== undefined) {
93
+ return source.uiState;
94
+ }
95
+ return previous?.value ?? false;
96
+ } });
97
+ /**
98
+ * Whether the group is currently rendered as a transient flyout overlay
99
+ * (true) or inline within the navbar (false). Automatically resets to
100
+ * `false` whenever the rendering mode changes.
101
+ * @internal
102
+ */
103
+ flyout = linkedSignal({ ...(ngDevMode ? { debugName: "flyout" } : {}), source: () => this.flyoutMode(),
104
+ computation: () => false });
105
+ /** `true` when this group contains the active route. Set by the group component.
106
+ * @internal
107
+ */
108
+ active = signal(false, ...(ngDevMode ? [{ debugName: "active" }] : []));
109
+ navbar = inject(SI_NAVBAR_VERTICAL_NEXT);
110
+ /** Signal mirror of the navbar's flyout mode. `true` when groups should render as transient overlays instead of inline.
111
+ * @internal
112
+ */
113
+ flyoutMode = computed(() => this.navbar.flyoutMode(), ...(ngDevMode ? [{ debugName: "flyoutMode" }] : []));
114
+ flyoutOutsideClickSubscription;
115
+ viewContainer = inject(ViewContainerRef);
116
+ overlay = inject(Overlay);
117
+ destroyRef = inject(DestroyRef);
118
+ injector = Injector.create({ parent: inject(Injector), providers: [] });
119
+ overlayRef = this.overlay.create({
120
+ positionStrategy: this.buildPositionStrategy(this.navbar.chipMode())
121
+ });
122
+ groupView;
123
+ flyoutAnchorComponentRef;
124
+ templatePortal = computed(() => new TemplatePortal(this.groupTemplate(), this.viewContainer, undefined, this.injector), ...(ngDevMode ? [{ debugName: "templatePortal" }] : []));
125
+ constructor() {
126
+ // Manage the rendering of the inline projection / flyout overlay in
127
+ // response to mode changes. Only side effects belong here; the related
128
+ // signal state is propagated by `flyout` / `expanded` linked signals.
129
+ effect(() => {
130
+ this.flyoutMode();
131
+ untracked(() => {
132
+ this.detachFlyout();
133
+ this.attachInline();
134
+ });
135
+ });
136
+ this.destroyRef.onDestroy(() => {
137
+ this.overlayRef.detach();
138
+ this.overlayRef.dispose();
139
+ });
140
+ }
141
+ /** @internal */
142
+ buildPositionStrategy(chipMode) {
143
+ const positions = chipMode
144
+ ? [
145
+ { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom' },
146
+ { originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top' }
147
+ ]
148
+ : [
149
+ { originX: 'end', originY: 'top', overlayX: 'start', overlayY: 'top' },
150
+ { originX: 'end', originY: 'bottom', overlayX: 'start', overlayY: 'bottom' }
151
+ ];
152
+ return this.overlay
153
+ .position()
154
+ .flexibleConnectedTo(this.viewContainer.element)
155
+ .withPositions(positions);
156
+ }
157
+ /** @internal */
158
+ hideFlyout() {
159
+ if (!this.flyout())
160
+ return;
161
+ this.flyout.set(false);
162
+ this.detachFlyout();
163
+ this.attachInline();
164
+ }
165
+ triggered() {
166
+ if (this.flyoutMode()) {
167
+ this.toggleFlyout();
168
+ }
169
+ else {
170
+ this.expanded.set(!this.expanded());
171
+ this.navbar.groupStateChanged(this.stateId(), this.expanded());
172
+ }
173
+ }
174
+ toggleFlyout() {
175
+ if (this.flyout()) {
176
+ this.hideFlyout();
177
+ }
178
+ else {
179
+ this.flyout.set(true);
180
+ this.attachFlyout();
181
+ }
182
+ }
183
+ attachInline() {
184
+ this.overlayRef.detach();
185
+ this.groupView?.destroy();
186
+ this.groupView = this.viewContainer.createEmbeddedView(this.groupTemplate(), undefined, {
187
+ injector: this.injector
188
+ });
189
+ }
190
+ attachFlyout() {
191
+ this.overlayRef.updatePositionStrategy(this.buildPositionStrategy(this.navbar.chipMode()));
192
+ this.groupView?.destroy();
193
+ this.groupView = this.overlayRef.attach(this.templatePortal());
194
+ // In chip mode the trigger's DOM is outside <nav> via DomPortal; use the
195
+ // navbar's in-nav anchor host so aria-owns stays within the navigation landmark.
196
+ const anchorHost = this.navbar.flyoutAnchorHost() ?? this.viewContainer;
197
+ this.flyoutAnchorComponentRef = anchorHost.createComponent(SiNavbarFlyoutAnchorComponent);
198
+ this.flyoutAnchorComponentRef.setInput('groupId', this.groupId);
199
+ this.flyoutOutsideClickSubscription = this.overlayRef
200
+ .outsidePointerEvents()
201
+ .subscribe(() => this.hideFlyout());
202
+ }
203
+ detachFlyout() {
204
+ this.flyoutAnchorComponentRef?.destroy();
205
+ this.flyoutAnchorComponentRef = undefined;
206
+ this.flyoutOutsideClickSubscription?.unsubscribe();
207
+ this.flyoutOutsideClickSubscription = undefined;
208
+ }
209
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.8", ngImport: i0, type: SiNavbarVerticalNextGroupTriggerDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
210
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.0.8", type: SiNavbarVerticalNextGroupTriggerDirective, isStandalone: true, selector: "button[siNavbarVerticalNextGroupTriggerFor]", inputs: { groupTemplate: { classPropertyName: "groupTemplate", publicName: "siNavbarVerticalNextGroupTriggerFor", isSignal: true, isRequired: true, transformFunction: null }, stateId: { classPropertyName: "stateId", publicName: "stateId", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "click": "triggered()" }, properties: { "id": "id", "class.show": "expanded()", "attr.aria-controls": "groupId", "attr.aria-expanded": "flyoutMode() ? flyout() : expanded()" }, classAttribute: "dropdown-toggle" }, ngImport: i0 });
211
+ }
212
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.8", ngImport: i0, type: SiNavbarVerticalNextGroupTriggerDirective, decorators: [{
213
+ type: Directive,
214
+ args: [{
215
+ selector: 'button[siNavbarVerticalNextGroupTriggerFor]',
216
+ host: {
217
+ class: 'dropdown-toggle',
218
+ '[id]': 'id',
219
+ '[class.show]': 'expanded()',
220
+ '[attr.aria-controls]': 'groupId',
221
+ '[attr.aria-expanded]': 'flyoutMode() ? flyout() : expanded()',
222
+ '(click)': 'triggered()'
223
+ }
224
+ }]
225
+ }], ctorParameters: () => [], propDecorators: { groupTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "siNavbarVerticalNextGroupTriggerFor", required: true }] }], stateId: [{ type: i0.Input, args: [{ isSignal: true, alias: "stateId", required: false }] }] } });
226
+
227
+ /**
228
+ * Copyright (c) Siemens 2016 - 2026
229
+ * SPDX-License-Identifier: MIT
230
+ */
231
+ /** @experimental */
232
+ class SiNavbarVerticalNextItemComponent {
233
+ icons = addIcons({ elementDown2, elementRight2 });
234
+ /** Optional icon to render before the label. */
235
+ icon = input(...(ngDevMode ? [undefined, { debugName: "icon" }] : []));
236
+ /** Badge value to display. */
237
+ badge = input(...(ngDevMode ? [undefined, { debugName: "badge" }] : []));
238
+ /** Color of the badge. */
239
+ badgeColor = input(...(ngDevMode ? [undefined, { debugName: "badgeColor" }] : []));
240
+ /**
241
+ * Hide the badge when the navbar is collapsed.
242
+ *
243
+ * @defaultValue false
244
+ */
245
+ hideBadgeWhenCollapsed = input(false, { ...(ngDevMode ? { debugName: "hideBadgeWhenCollapsed" } : {}), transform: booleanAttribute });
246
+ /** Override the active state. Useful for action items. */
247
+ activeOverride = input(...(ngDevMode ? [undefined, { debugName: "activeOverride" }] : []));
248
+ navbar = inject(SI_NAVBAR_VERTICAL_NEXT);
249
+ parent = inject(SiNavbarVerticalNextItemComponent, {
250
+ skipSelf: true,
251
+ optional: true
252
+ });
253
+ group = inject(SiNavbarVerticalNextGroupTriggerDirective, {
254
+ optional: true,
255
+ self: true
256
+ });
257
+ routerLinkActive = inject(RouterLinkActive, { optional: true });
258
+ /** Signal mirror of `RouterLinkActive.isActive`.
259
+ * @internal
260
+ */
261
+ routerActive = toSignal(this.routerLinkActive?.isActiveChange ?? EMPTY, { initialValue: this.routerLinkActive?.isActive ?? false });
262
+ /** @internal */
263
+ elementRef = inject(ElementRef);
264
+ /** DOM portal relocated into the chip slot when collapsed.
265
+ * @internal
266
+ */
267
+ hostPortal = new DomPortal(this.elementRef.nativeElement);
268
+ /** Signal mirror of the navbar's chip mode. `true` when inline-collapse is active and the navbar is collapsed.
269
+ * @internal
270
+ */
271
+ chipMode = computed(() => this.navbar.chipMode(), ...(ngDevMode ? [{ debugName: "chipMode" }] : []));
272
+ /**
273
+ * Determines if the badge contains text-only content (not numeric)
274
+ */
275
+ textOnlyBadge = computed(() => {
276
+ const badge = this.badge();
277
+ return badge != null && badge !== '' ? typeof badge !== 'number' : false;
278
+ }, ...(ngDevMode ? [{ debugName: "textOnlyBadge" }] : []));
279
+ /** `true` when the `active` CSS class should be applied to this item.
280
+ *
281
+ * In chip mode, root-level items use `is-chip` styling instead of `active`, so the
282
+ * class is suppressed unless the item is a sub-item (`parent` is set) or it is a
283
+ * group trigger whose flyout is currently open.
284
+ * Outside chip mode the value equals `active()`.
285
+ * @internal
286
+ */
287
+ showActive = computed(() => {
288
+ if (this.chipMode()) {
289
+ return (!!this.parent || this.group?.flyout()) && this.active();
290
+ }
291
+ return this.active();
292
+ }, ...(ngDevMode ? [{ debugName: "showActive" }] : []));
293
+ /**
294
+ * Formats badge value to limit display to "+99" for numbers greater than 99
295
+ */
296
+ formattedBadge = computed(() => {
297
+ const badge = this.badge();
298
+ if (badge == null || badge === '') {
299
+ return '';
300
+ }
301
+ if (typeof badge === 'number') {
302
+ return badge > 99 ? '+99' : badge.toString();
303
+ }
304
+ return badge.toString();
305
+ }, ...(ngDevMode ? [{ debugName: "formattedBadge" }] : []));
306
+ /** Active via override or router link — excludes group state.
307
+ * @internal
308
+ */
309
+ anyRouteActive = computed(() => !!this.activeOverride() || this.routerActive(), ...(ngDevMode ? [{ debugName: "anyRouteActive" }] : []));
310
+ /** Own route is active, or a descendant route is active — includes group state, not gated on expansion.
311
+ * @internal
312
+ */
313
+ isOnActiveRoute = computed(() => this.anyRouteActive() || !!this.group?.active(), ...(ngDevMode ? [{ debugName: "isOnActiveRoute" }] : []));
314
+ /**
315
+ * `true` when this item should reflect activity.
316
+ *
317
+ * For non-trigger items: equivalent to being on the active route.
318
+ *
319
+ * For group trigger items: also `true` when a descendant route is active and
320
+ * the descendant is not currently visible inline — i.e. the group is collapsed
321
+ * or the navbar is collapsed. This surfaces the active state on the trigger
322
+ * when the active child cannot show it itself.
323
+ */
324
+ active = computed(() => this.anyRouteActive() ||
325
+ ((!this.group?.expanded() || this.navbar.collapsed()) && !!this.group?.active()), ...(ngDevMode ? [{ debugName: "active" }] : []));
326
+ /** `true` when this is a root-level item on the active route (ungated, so the chip survives collapse↔expand).
327
+ * @internal
328
+ */
329
+ isActiveRootItem = computed(() => !this.parent && this.isOnActiveRoute(), ...(ngDevMode ? [{ debugName: "isActiveRootItem" }] : []));
330
+ /** `true` when this item is currently rendered as a chip in the inline-collapse bar.
331
+ * @internal
332
+ */
333
+ isChip = computed(() => this.navbar.chipPortalAttached() && this.isActiveRootItem(), ...(ngDevMode ? [{ debugName: "isChip" }] : []));
334
+ ngOnInit() {
335
+ if (this.group && this.active()) {
336
+ this.group.expanded.set(true);
337
+ }
338
+ }
339
+ triggered() {
340
+ this.parent?.group?.hideFlyout();
341
+ if (!this.group) {
342
+ this.navbar.itemTriggered();
343
+ }
344
+ }
345
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.8", ngImport: i0, type: SiNavbarVerticalNextItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
346
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.8", type: SiNavbarVerticalNextItemComponent, isStandalone: true, selector: "a[si-navbar-vertical-next-item], button[si-navbar-vertical-next-item]", inputs: { icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, badge: { classPropertyName: "badge", publicName: "badge", isSignal: true, isRequired: false, transformFunction: null }, badgeColor: { classPropertyName: "badgeColor", publicName: "badgeColor", isSignal: true, isRequired: false, transformFunction: null }, hideBadgeWhenCollapsed: { classPropertyName: "hideBadgeWhenCollapsed", publicName: "hideBadgeWhenCollapsed", isSignal: true, isRequired: false, transformFunction: null }, activeOverride: { classPropertyName: "activeOverride", publicName: "activeOverride", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "click": "triggered()" }, properties: { "class.focus-inside": "!chipMode() || !!parent", "class.navbar-vertical-item": "!isChip()", "class.active": "showActive()", "class.is-chip": "isChip()", "class.btn": "isChip()", "class.btn-primary-ghost": "isChip()", "class.hide-badge-collapsed": "hideBadgeWhenCollapsed()" } }, ngImport: i0, template: "@let icon = this.icon();\n@if (icon) {\n <si-icon [class]=\"isChip() ? 'icon' : 'icon-lg'\" [icon]=\"icon\" />\n}\n<div class=\"item-title text-truncate si-h5\">\n <ng-content />\n</div>\n@if (!isChip() && !navbar.textOnly() && formattedBadge()) {\n @let badgeColor = this.badgeColor();\n <span\n [class]=\"[\n 'badge',\n badgeColor ? `bg-${badgeColor}` : 'bg-default',\n textOnlyBadge() ? 'badge-text-only' : '',\n navbar.collapsed() ? 'badge-collapsed' : ''\n ]\"\n >{{ formattedBadge() }}</span\n >\n}\n@if (group) {\n <si-icon\n class=\"dropdown-caret me-0 text-body\"\n [icon]=\"group.flyoutMode() ? icons.elementRight2 : icons.elementDown2\"\n />\n}\n", styles: [":host(.navbar-vertical-item){display:flex;align-items:center;position:relative;color:var(--element-text-primary);background:none;border:0;font-size:.875rem;padding-block:8px;padding-inline:0 12px;min-inline-size:0;min-block-size:calc(1lh + 24px);inline-size:100%;border-radius:0}:host(.navbar-vertical-item) .item-title{margin-inline-start:12px}:host(.navbar-vertical-item) .icon-lg{margin-inline-start:12px}:host(.navbar-vertical-item) .icon-lg+.item-title{margin-inline-start:8px}:host(.navbar-vertical-item).show .badge:not(.badge-collapsed){display:none}:host(.navbar-vertical-item):not(.show) .badge+.dropdown-caret{margin-inline:0;padding-inline:0}:host(.navbar-vertical-item).active{color:var(--element-action-primary-hover);background:var(--element-base-1-selected)}:host(.navbar-vertical-item).active:after{content:\"\";position:absolute;inset-block:0;inset-inline-start:0;inline-size:4px;background:var(--element-action-primary-hover)}:host(.navbar-vertical-item):hover{text-decoration:none;background:var(--element-base-1-hover)}:host-context(si-navbar-vertical-next-items > .navbar-vertical-item)+:host(.navbar-vertical-item),:host-context(si-navbar-vertical-next-items > si-navbar-vertical-next-group)+:host(.navbar-vertical-item),:host-context(si-navbar-vertical-next-items > si-navbar-flyout-anchor)+:host(.navbar-vertical-item),:host-context(si-navbar-vertical-next-footer-items > .navbar-vertical-item)+:host(.navbar-vertical-item),:host-context(si-navbar-vertical-next-footer-items > si-navbar-vertical-next-group)+:host(.navbar-vertical-item),:host-context(si-navbar-vertical-next-footer-items > si-navbar-flyout-anchor)+:host(.navbar-vertical-item){margin-block-start:8px}:host-context(.nav-text-only si-navbar-vertical-next-group) .item-title{margin-inline-start:0}:host-context(si-navbar-vertical-next-group) :host(.navbar-vertical-item){padding-inline-start:32px}:host-context(si-navbar-vertical-next-group) :host(.navbar-vertical-item) .item-title{font-weight:400}:host-context(.dropdown-menu) :host(.navbar-vertical-item){padding-inline-start:0}:host-context(.dropdown-menu) :host(.navbar-vertical-item) .item-title{font-weight:400}:host-context(.nav-collapsed):not(.is-chip) .badge{position:absolute;inset-block-start:4px;inset-inline-end:6px;min-inline-size:.875rem;border-radius:.4375rem;font-size:.75rem;line-height:.875rem;padding-block:0;padding-inline:4px;font-family:var(--element-body-font-family);font-weight:600;text-align:center}:host-context(.nav-collapsed):not(.is-chip) .badge.badge-text-only{color:transparent;font-size:0}:host-context(.nav-collapsed):not(.is-chip) :is(.item-title,.dropdown-caret){position:absolute!important;inline-size:1px!important;block-size:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}:host-context(.nav-collapsed):not(.is-chip).hide-badge-collapsed .badge{display:none}.badge{margin-inline:auto 0}:host(.is-chip).active:after{display:none}:host(.is-chip) .dropdown-caret{display:none}:host(.is-chip) .item-title{font-weight:400}:host-context(.chip).is-chip{border-start-start-radius:0;border-end-start-radius:0;inline-size:100%;min-inline-size:0}\n"], dependencies: [{ kind: "component", type: SiIconComponent, selector: "si-icon", inputs: ["icon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
347
+ }
348
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.8", ngImport: i0, type: SiNavbarVerticalNextItemComponent, decorators: [{
349
+ type: Component,
350
+ args: [{ selector: 'a[si-navbar-vertical-next-item], button[si-navbar-vertical-next-item]', imports: [SiIconComponent], changeDetection: ChangeDetectionStrategy.OnPush, host: {
351
+ '[class.focus-inside]': '!chipMode() || !!parent',
352
+ '[class.navbar-vertical-item]': '!isChip()',
353
+ '[class.active]': 'showActive()',
354
+ '[class.is-chip]': 'isChip()',
355
+ '[class.btn]': 'isChip()',
356
+ '[class.btn-primary-ghost]': 'isChip()',
357
+ '[class.hide-badge-collapsed]': 'hideBadgeWhenCollapsed()',
358
+ '(click)': 'triggered()'
359
+ }, template: "@let icon = this.icon();\n@if (icon) {\n <si-icon [class]=\"isChip() ? 'icon' : 'icon-lg'\" [icon]=\"icon\" />\n}\n<div class=\"item-title text-truncate si-h5\">\n <ng-content />\n</div>\n@if (!isChip() && !navbar.textOnly() && formattedBadge()) {\n @let badgeColor = this.badgeColor();\n <span\n [class]=\"[\n 'badge',\n badgeColor ? `bg-${badgeColor}` : 'bg-default',\n textOnlyBadge() ? 'badge-text-only' : '',\n navbar.collapsed() ? 'badge-collapsed' : ''\n ]\"\n >{{ formattedBadge() }}</span\n >\n}\n@if (group) {\n <si-icon\n class=\"dropdown-caret me-0 text-body\"\n [icon]=\"group.flyoutMode() ? icons.elementRight2 : icons.elementDown2\"\n />\n}\n", styles: [":host(.navbar-vertical-item){display:flex;align-items:center;position:relative;color:var(--element-text-primary);background:none;border:0;font-size:.875rem;padding-block:8px;padding-inline:0 12px;min-inline-size:0;min-block-size:calc(1lh + 24px);inline-size:100%;border-radius:0}:host(.navbar-vertical-item) .item-title{margin-inline-start:12px}:host(.navbar-vertical-item) .icon-lg{margin-inline-start:12px}:host(.navbar-vertical-item) .icon-lg+.item-title{margin-inline-start:8px}:host(.navbar-vertical-item).show .badge:not(.badge-collapsed){display:none}:host(.navbar-vertical-item):not(.show) .badge+.dropdown-caret{margin-inline:0;padding-inline:0}:host(.navbar-vertical-item).active{color:var(--element-action-primary-hover);background:var(--element-base-1-selected)}:host(.navbar-vertical-item).active:after{content:\"\";position:absolute;inset-block:0;inset-inline-start:0;inline-size:4px;background:var(--element-action-primary-hover)}:host(.navbar-vertical-item):hover{text-decoration:none;background:var(--element-base-1-hover)}:host-context(si-navbar-vertical-next-items > .navbar-vertical-item)+:host(.navbar-vertical-item),:host-context(si-navbar-vertical-next-items > si-navbar-vertical-next-group)+:host(.navbar-vertical-item),:host-context(si-navbar-vertical-next-items > si-navbar-flyout-anchor)+:host(.navbar-vertical-item),:host-context(si-navbar-vertical-next-footer-items > .navbar-vertical-item)+:host(.navbar-vertical-item),:host-context(si-navbar-vertical-next-footer-items > si-navbar-vertical-next-group)+:host(.navbar-vertical-item),:host-context(si-navbar-vertical-next-footer-items > si-navbar-flyout-anchor)+:host(.navbar-vertical-item){margin-block-start:8px}:host-context(.nav-text-only si-navbar-vertical-next-group) .item-title{margin-inline-start:0}:host-context(si-navbar-vertical-next-group) :host(.navbar-vertical-item){padding-inline-start:32px}:host-context(si-navbar-vertical-next-group) :host(.navbar-vertical-item) .item-title{font-weight:400}:host-context(.dropdown-menu) :host(.navbar-vertical-item){padding-inline-start:0}:host-context(.dropdown-menu) :host(.navbar-vertical-item) .item-title{font-weight:400}:host-context(.nav-collapsed):not(.is-chip) .badge{position:absolute;inset-block-start:4px;inset-inline-end:6px;min-inline-size:.875rem;border-radius:.4375rem;font-size:.75rem;line-height:.875rem;padding-block:0;padding-inline:4px;font-family:var(--element-body-font-family);font-weight:600;text-align:center}:host-context(.nav-collapsed):not(.is-chip) .badge.badge-text-only{color:transparent;font-size:0}:host-context(.nav-collapsed):not(.is-chip) :is(.item-title,.dropdown-caret){position:absolute!important;inline-size:1px!important;block-size:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}:host-context(.nav-collapsed):not(.is-chip).hide-badge-collapsed .badge{display:none}.badge{margin-inline:auto 0}:host(.is-chip).active:after{display:none}:host(.is-chip) .dropdown-caret{display:none}:host(.is-chip) .item-title{font-weight:400}:host-context(.chip).is-chip{border-start-start-radius:0;border-end-start-radius:0;inline-size:100%;min-inline-size:0}\n"] }]
360
+ }], propDecorators: { icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], badge: [{ type: i0.Input, args: [{ isSignal: true, alias: "badge", required: false }] }], badgeColor: [{ type: i0.Input, args: [{ isSignal: true, alias: "badgeColor", required: false }] }], hideBadgeWhenCollapsed: [{ type: i0.Input, args: [{ isSignal: true, alias: "hideBadgeWhenCollapsed", required: false }] }], activeOverride: [{ type: i0.Input, args: [{ isSignal: true, alias: "activeOverride", required: false }] }] } });
361
+
43
362
  /**
44
363
  * Copyright (c) Siemens 2016 - 2026
45
364
  * SPDX-License-Identifier: MIT
46
365
  */
47
366
  /** @experimental */
48
367
  class SiNavbarVerticalNextComponent {
49
- icons = addIcons({ elementDoubleLeft, elementDoubleRight });
368
+ icons = addIcons({
369
+ elementDoubleLeft,
370
+ elementDoubleRight,
371
+ elementLayoutPane2,
372
+ elementLayoutPane2Right
373
+ });
50
374
  /**
51
375
  * Whether the navbar-vertical is collapsed.
52
376
  *
@@ -59,6 +383,15 @@ class SiNavbarVerticalNextComponent {
59
383
  * @defaultValue false
60
384
  */
61
385
  textOnly = input(false, { ...(ngDevMode ? { debugName: "textOnly" } : {}), transform: booleanAttribute });
386
+ /**
387
+ * Enables an alternative inline-collapse behavior.
388
+ *
389
+ * When collapsed, nav content becomes inert while the toggle remains
390
+ * available in the page flow.
391
+ *
392
+ * @defaultValue false
393
+ */
394
+ inlineCollapse = input(false, { ...(ngDevMode ? { debugName: "inlineCollapse" } : {}), transform: booleanAttribute });
62
395
  /**
63
396
  * When `true`, item-groups always open as a transient flyout panel adjacent to the
64
397
  * trigger, regardless of whether the navbar is collapsed or expanded.
@@ -114,6 +447,22 @@ class SiNavbarVerticalNextComponent {
114
447
  injector = inject(Injector);
115
448
  ready = signal(false, ...(ngDevMode ? [{ debugName: "ready" }] : []));
116
449
  smallScreen = signal(false, ...(ngDevMode ? [{ debugName: "smallScreen" }] : []));
450
+ /** Stable ViewContainerRef inside <nav>, used to host flyout anchors when the chip DomPortal moves a trigger outside the nav.
451
+ * @internal
452
+ */
453
+ flyoutAnchorHost = viewChild('flyoutAnchorHost', { ...(ngDevMode ? { debugName: "flyoutAnchorHost" } : {}), read: ViewContainerRef });
454
+ /** All projected nav items, including descendants inside group templates.
455
+ * @internal
456
+ */
457
+ items = contentChildren(SiNavbarVerticalNextItemComponent, { ...(ngDevMode ? { debugName: "items" } : {}), descendants: true });
458
+ /** The active root-level item; group triggers resolve for nested routes.
459
+ * @internal
460
+ */
461
+ activeItem = computed(() => this.items().find(item => item.isActiveRootItem()), ...(ngDevMode ? [{ debugName: "activeItem" }] : []));
462
+ /** `true` when the active item's portal should occupy the chip slot.
463
+ * @internal
464
+ */
465
+ chipPortalAttached = computed(() => this.inlineCollapse() && this.collapsed() && !!this.activeItem(), ...(ngDevMode ? [{ debugName: "chipPortalAttached" }] : []));
117
466
  /**
118
467
  * @defaultValue
119
468
  * ```
@@ -123,6 +472,20 @@ class SiNavbarVerticalNextComponent {
123
472
  uiStateExpandedItems = signal({}, ...(ngDevMode ? [{ debugName: "uiStateExpandedItems" }] : []));
124
473
  // Indicates if the user prefers a collapsed navbar. Relevant for resizing.
125
474
  preferCollapse = false;
475
+ toggleIcon = computed(() => {
476
+ if (this.inlineCollapse()) {
477
+ return this.collapsed() ? this.icons.elementLayoutPane2 : this.icons.elementLayoutPane2Right;
478
+ }
479
+ return this.collapsed() ? this.icons.elementDoubleRight : this.icons.elementDoubleLeft;
480
+ }, ...(ngDevMode ? [{ debugName: "toggleIcon" }] : []));
481
+ /** `true` when inline-collapse is active and the nav is collapsed.
482
+ * @internal
483
+ */
484
+ chipMode = computed(() => this.inlineCollapse() && this.collapsed(), ...(ngDevMode ? [{ debugName: "chipMode" }] : []));
485
+ /** `true` when groups should render as flyout overlays.
486
+ * @internal
487
+ */
488
+ flyoutMode = computed(() => this.alwaysFlyout() || this.collapsed(), ...(ngDevMode ? [{ debugName: "flyoutMode" }] : []));
126
489
  constructor() {
127
490
  this.breakpointObserver
128
491
  .observe(`(max-width: ${BOOTSTRAP_BREAKPOINTS.lgMinimum}px)`)
@@ -203,18 +566,21 @@ class SiNavbarVerticalNextComponent {
203
566
  }
204
567
  }
205
568
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.8", ngImport: i0, type: SiNavbarVerticalNextComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
206
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.8", type: SiNavbarVerticalNextComponent, isStandalone: true, selector: "si-navbar-vertical-next", inputs: { collapsed: { classPropertyName: "collapsed", publicName: "collapsed", isSignal: true, isRequired: false, transformFunction: null }, textOnly: { classPropertyName: "textOnly", publicName: "textOnly", isSignal: true, isRequired: false, transformFunction: null }, alwaysFlyout: { classPropertyName: "alwaysFlyout", publicName: "alwaysFlyout", isSignal: true, isRequired: false, transformFunction: null }, visible: { classPropertyName: "visible", publicName: "visible", isSignal: true, isRequired: false, transformFunction: null }, toggleButtonText: { classPropertyName: "toggleButtonText", publicName: "toggleButtonText", isSignal: true, isRequired: false, transformFunction: null }, stateId: { classPropertyName: "stateId", publicName: "stateId", isSignal: true, isRequired: false, transformFunction: null }, skipLinkNavigationLabel: { classPropertyName: "skipLinkNavigationLabel", publicName: "skipLinkNavigationLabel", isSignal: true, isRequired: false, transformFunction: null }, skipLinkMainContentLabel: { classPropertyName: "skipLinkMainContentLabel", publicName: "skipLinkMainContentLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { collapsed: "collapsedChange" }, host: { properties: { "class.nav-collapsed": "collapsed()", "class.nav-text-only": "textOnly()", "class.visible": "visible()", "class.ready": "ready()" }, classAttribute: "si-layout-inner ready" }, providers: [{ provide: SI_NAVBAR_VERTICAL_NEXT, useExisting: SiNavbarVerticalNextComponent }], usesOnChanges: true, ngImport: i0, template: "@if (visible()) {\n @if (smallScreen() && !collapsed()) {\n <div class=\"modal-backdrop\" animate.leave=\"backdrop-leave\" (click)=\"toggleCollapse()\"></div>\n }\n <nav\n tabindex=\"-1\"\n class=\"bg-base-1 focus-sub-inside\"\n [class.expanded]=\"!collapsed()\"\n [siSkipLinkTarget]=\"skipLinkNavigationLabel()\"\n [class.text-only]=\"textOnly()\"\n >\n <div class=\"collapse-toggle ms-auto\">\n <div class=\"mobile-drawer focus-inside navbar-vertical-no-collapse\">\n <button\n type=\"button\"\n class=\"btn btn-icon btn-tertiary-ghost\"\n [attr.aria-label]=\"toggleButtonText() | translate\"\n [attr.aria-expanded]=\"!collapsed()\"\n (click)=\"toggleCollapse()\"\n >\n <si-icon\n class=\"flip-rtl\"\n [icon]=\"collapsed() ? icons.elementDoubleRight : icons.elementDoubleLeft\"\n />\n </button>\n </div>\n </div>\n <ng-content select=\"si-navbar-vertical-next-search\" />\n <ng-content select=\"si-navbar-vertical-next-items\" />\n <ng-content select=\"si-navbar-vertical-next-footer-items\" />\n </nav>\n}\n<main\n class=\"si-layout-inner focus-none\"\n tabindex=\"-1\"\n [siSkipLinkTarget]=\"skipLinkMainContentLabel()\"\n>\n <ng-content />\n</main>\n", styles: [":host{display:block;--si-layout-header-first-element-offset: 40px}:host.ready:not(.visible){padding-inline-start:0!important}:host.ready{transition:padding-inline-start calc(.5s * var(--element-animations-enabled, 1))}nav{display:flex;flex-direction:column;position:fixed;z-index:1031;inset-block-start:calc(1.5rem + 25px + var(--element-titlebar-spacing, 0px) + var(--element-system-banner-spacing, 0px));inset-block-end:0;inset-inline-start:0;inline-size:0;transition:inline-size calc(.5s * var(--element-animations-enabled, 1)) ease}:host(.nav-collapsed) nav{z-index:1030}nav.expanded{inline-size:240px}.mobile-drawer{display:block;text-align:end;border:0;inline-size:calc(1.5rem + 24px);color:var(--element-text-primary);padding-block:4px;padding-inline:8px;margin-block-start:8px;border-start-end-radius:var(--element-radius-2);border-end-end-radius:var(--element-radius-2);transition:inline-size calc(.5s * var(--element-animations-enabled, 1)) ease,background-color calc(.5s * var(--element-animations-enabled, 1)) ease,box-shadow calc(.5s * var(--element-animations-enabled, 1)) ease}:host(:not(.nav-collapsed)) .mobile-drawer{inline-size:240px}:host.nav-collapsed .mobile-drawer{border:0;color:var(--element-text-primary);background:var(--element-base-1);text-align:end;box-shadow:0 0 4px var(--element-box-shadow-color-1),0 4px 4px var(--element-box-shadow-color-2)}.modal-backdrop{z-index:1031;transition:opacity calc(.15s * var(--element-animations-enabled, 1)) linear;opacity:1}@starting-style{.modal-backdrop{opacity:0}}.modal-backdrop.backdrop-leave{opacity:0}@media(min-width:576px){:host:not(.nav-text-only),:host:not(.nav-collapsed){--si-layout-header-first-element-offset: 0}:host:not(.nav-text-only){padding-inline-start:calc(1.5rem + 24px)}:host:not(.nav-text-only) .mobile-drawer{background:transparent;box-shadow:none}:host:not(.nav-text-only) nav{inline-size:calc(1.5rem + 24px)}:host:not(.nav-text-only) nav.expanded{inline-size:240px}}@media(min-width:992px){:host:not(.nav-collapsed){padding-inline-start:240px}}\n"], dependencies: [{ kind: "component", type: SiIconComponent, selector: "si-icon", inputs: ["icon"] }, { kind: "directive", type: SiSkipLinkTargetDirective, selector: "[siSkipLinkTarget]", inputs: ["siSkipLinkTarget"] }, { kind: "pipe", type: SiTranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
569
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.8", type: SiNavbarVerticalNextComponent, isStandalone: true, selector: "si-navbar-vertical-next", inputs: { collapsed: { classPropertyName: "collapsed", publicName: "collapsed", isSignal: true, isRequired: false, transformFunction: null }, textOnly: { classPropertyName: "textOnly", publicName: "textOnly", isSignal: true, isRequired: false, transformFunction: null }, inlineCollapse: { classPropertyName: "inlineCollapse", publicName: "inlineCollapse", isSignal: true, isRequired: false, transformFunction: null }, alwaysFlyout: { classPropertyName: "alwaysFlyout", publicName: "alwaysFlyout", isSignal: true, isRequired: false, transformFunction: null }, visible: { classPropertyName: "visible", publicName: "visible", isSignal: true, isRequired: false, transformFunction: null }, toggleButtonText: { classPropertyName: "toggleButtonText", publicName: "toggleButtonText", isSignal: true, isRequired: false, transformFunction: null }, stateId: { classPropertyName: "stateId", publicName: "stateId", isSignal: true, isRequired: false, transformFunction: null }, skipLinkNavigationLabel: { classPropertyName: "skipLinkNavigationLabel", publicName: "skipLinkNavigationLabel", isSignal: true, isRequired: false, transformFunction: null }, skipLinkMainContentLabel: { classPropertyName: "skipLinkMainContentLabel", publicName: "skipLinkMainContentLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { collapsed: "collapsedChange" }, host: { properties: { "class.nav-collapsed": "collapsed()", "class.nav-text-only": "textOnly()", "class.nav-inline-collapse": "inlineCollapse()", "class.visible": "visible()", "class.ready": "ready()" }, classAttribute: "si-layout-inner ready" }, providers: [{ provide: SI_NAVBAR_VERTICAL_NEXT, useExisting: SiNavbarVerticalNextComponent }], queries: [{ propertyName: "items", predicate: SiNavbarVerticalNextItemComponent, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "flyoutAnchorHost", first: true, predicate: ["flyoutAnchorHost"], descendants: true, read: ViewContainerRef, isSignal: true }], usesOnChanges: true, ngImport: i0, template: "@if (visible()) {\n @if (smallScreen() && !collapsed()) {\n <div class=\"modal-backdrop\" animate.leave=\"backdrop-leave\" (click)=\"toggleCollapse()\"></div>\n }\n <nav\n tabindex=\"-1\"\n class=\"bg-base-1 focus-sub-inside\"\n [class.expanded]=\"!collapsed()\"\n [siSkipLinkTarget]=\"skipLinkNavigationLabel()\"\n [class.text-only]=\"textOnly()\"\n >\n <div class=\"collapse-toggle ms-auto\">\n <div class=\"mobile-drawer focus-inside\">\n <button\n type=\"button\"\n class=\"btn btn-icon toggle-button\"\n [class.btn-primary-ghost]=\"chipMode()\"\n [class.btn-tertiary-ghost]=\"!chipMode()\"\n [attr.aria-label]=\"toggleButtonText() | translate\"\n [attr.aria-expanded]=\"!collapsed()\"\n (click)=\"toggleCollapse()\"\n >\n <si-icon class=\"flip-rtl\" [icon]=\"toggleIcon()\" />\n </button>\n </div>\n </div>\n @if (inlineCollapse() && activeItem(); as item) {\n <div\n class=\"chip\"\n [class.chip-visible]=\"collapsed()\"\n [attr.inert]=\"collapsed() ? null : ''\"\n [attr.aria-hidden]=\"collapsed() ? null : 'true'\"\n >\n @if (chipPortalAttached()) {\n <ng-container [cdkPortalOutlet]=\"item.hostPortal\" />\n }\n </div>\n <ng-container #flyoutAnchorHost />\n }\n <div\n class=\"nav-content\"\n [attr.inert]=\"chipMode() ? '' : null\"\n [attr.aria-hidden]=\"chipMode() ? 'true' : null\"\n >\n <ng-content select=\"si-navbar-vertical-next-search\" />\n <ng-content select=\"si-navbar-vertical-next-items\" />\n <ng-content select=\"si-navbar-vertical-next-footer-items\" />\n </div>\n </nav>\n @if (inlineCollapse()) {\n <div class=\"toggle-placeholder\" aria-hidden=\"true\"></div>\n }\n}\n<main\n class=\"si-layout-inner focus-none\"\n tabindex=\"-1\"\n [siSkipLinkTarget]=\"skipLinkMainContentLabel()\"\n>\n <ng-content />\n</main>\n", styles: [":host{display:block;--si-layout-header-first-element-offset: 40px}:host.ready:not(.visible){padding-inline-start:0!important}:host.ready{transition:padding-inline-start calc(.5s * var(--element-animations-enabled, 1))}nav{display:flex;flex-direction:column;position:fixed;z-index:1031;inset-block-start:calc(1.5rem + 25px + var(--element-titlebar-spacing, 0px) + var(--element-system-banner-spacing, 0px));inset-block-end:0;inset-inline-start:0;inline-size:0;transition:inline-size calc(.5s * var(--element-animations-enabled, 1)) ease}:host(.nav-collapsed) nav{z-index:1030}nav.expanded{inline-size:240px}.mobile-drawer{display:block;text-align:end;border:0;inline-size:calc(1.5rem + 24px);color:var(--element-text-primary);padding-block:4px;padding-inline:8px;margin-block-start:8px;border-start-end-radius:var(--element-radius-2);border-end-end-radius:var(--element-radius-2);transition:inline-size calc(.5s * var(--element-animations-enabled, 1)) ease,background-color calc(.5s * var(--element-animations-enabled, 1)) ease,box-shadow calc(.5s * var(--element-animations-enabled, 1)) ease}:host(:not(.nav-collapsed):not(.nav-inline-collapse)) .mobile-drawer{inline-size:240px}.modal-backdrop{z-index:1031;transition:opacity calc(.15s * var(--element-animations-enabled, 1)) linear;opacity:1}@starting-style{.modal-backdrop{opacity:0}}.modal-backdrop.backdrop-leave{opacity:0}:host(.nav-text-only:not(.nav-inline-collapse)).nav-collapsed .mobile-drawer{background:var(--element-base-1);box-shadow:0 0 4px var(--element-box-shadow-color-1),0 4px 4px var(--element-box-shadow-color-2)}@media(max-width:575.98px){:host.nav-collapsed .mobile-drawer{background:var(--element-base-1);box-shadow:0 0 4px var(--element-box-shadow-color-1),0 4px 4px var(--element-box-shadow-color-2)}}@media(min-width:576px){:host:not(.nav-text-only),:host:not(.nav-collapsed),:host(.nav-inline-collapse){--si-layout-header-first-element-offset: 0}:host:where(:not(.nav-text-only):not(.nav-inline-collapse)){padding-inline-start:calc(1.5rem + 24px)}:host:where(:not(.nav-text-only):not(.nav-inline-collapse)) nav{inline-size:calc(1.5rem + 24px)}:host:where(:not(.nav-text-only):not(.nav-inline-collapse)) nav.expanded{inline-size:240px}}@media(min-width:992px){:host:not(.nav-collapsed){padding-inline-start:240px}}.nav-content{display:flex;flex-direction:column;flex:1 1 auto;min-block-size:0}:host(.nav-inline-collapse){--si-layout-header-first-element-offset: 0;--si-navbar-parked-inline-start: 16px}@media(min-width:768px){:host(.nav-inline-collapse){--si-navbar-parked-inline-start: 32px}}:host(.nav-inline-collapse) nav{overflow:hidden}:host(.nav-inline-collapse) nav:before{content:\"\";position:absolute;inset:0;background:var(--element-base-1);z-index:1;pointer-events:none}:host(.nav-inline-collapse) .nav-content{position:relative;z-index:2}:host(.nav-inline-collapse) .mobile-drawer:before{content:\"\";display:block;block-size:calc(1lh + 16px)}:host(.nav-inline-collapse) .toggle-placeholder{block-size:0;margin-block-start:0;transition:block-size calc(.5s * var(--element-animations-enabled, 1)) ease,margin-block-start calc(.5s * var(--element-animations-enabled, 1)) ease}:host(.nav-inline-collapse) .toggle-button{position:fixed;z-index:1031;inset-block-start:calc(calc(1.5rem + 25px + var(--element-titlebar-spacing, 0px) + var(--element-system-banner-spacing, 0px)) + 8px + 4px);inset-inline-start:calc(232px - (1lh + 16px));transition:inset-inline-start calc(.5s * var(--element-animations-enabled, 1)) ease,inset-block-start calc(.5s * var(--element-animations-enabled, 1)) ease}:host(.nav-inline-collapse) .chip{position:fixed;z-index:0;inset-block-start:calc(calc(1.5rem + 25px + var(--element-titlebar-spacing, 0px) + var(--element-system-banner-spacing, 0px)) + 16px);max-inline-size:calc(100vi - 2 * var(--si-navbar-parked-inline-start) - calc(1lh + 16px) - 1px);inset-inline-start:var(--si-navbar-parked-inline-start);opacity:0;transition:inset-inline-start calc(.5s * var(--element-animations-enabled, 1)) ease,opacity calc(.5s * var(--element-animations-enabled, 1)) ease}:host(.nav-inline-collapse) .chip:has(:focus-visible){z-index:1032}@starting-style{:host(.nav-inline-collapse) .chip.chip-visible{inset-inline-start:var(--si-navbar-parked-inline-start);opacity:0}}:host(.nav-inline-collapse) .chip.chip-visible{inset-inline-start:calc(var(--si-navbar-parked-inline-start) + calc(1lh + 16px) + 1px);opacity:1}:host(.nav-inline-collapse).nav-collapsed .toggle-placeholder{block-size:calc(1lh + 16px);margin-block-start:16px}:host(.nav-inline-collapse).nav-collapsed .toggle-button{inset-block-start:calc(calc(1.5rem + 25px + var(--element-titlebar-spacing, 0px) + var(--element-system-banner-spacing, 0px)) + 16px);inset-inline-start:var(--si-navbar-parked-inline-start)}:host(.nav-inline-collapse).nav-collapsed:has(.chip.chip-visible) .toggle-button{border-start-end-radius:0;border-end-end-radius:0}\n"], dependencies: [{ kind: "ngmodule", type: PortalModule }, { kind: "directive", type: i1.CdkPortalOutlet, selector: "[cdkPortalOutlet]", inputs: ["cdkPortalOutlet"], outputs: ["attached"], exportAs: ["cdkPortalOutlet"] }, { kind: "component", type: SiIconComponent, selector: "si-icon", inputs: ["icon"] }, { kind: "directive", type: SiSkipLinkTargetDirective, selector: "[siSkipLinkTarget]", inputs: ["siSkipLinkTarget"] }, { kind: "pipe", type: SiTranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
207
570
  }
208
571
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.8", ngImport: i0, type: SiNavbarVerticalNextComponent, decorators: [{
209
572
  type: Component,
210
- args: [{ selector: 'si-navbar-vertical-next', imports: [SiIconComponent, SiSkipLinkTargetDirective, SiTranslatePipe], providers: [{ provide: SI_NAVBAR_VERTICAL_NEXT, useExisting: SiNavbarVerticalNextComponent }], changeDetection: ChangeDetectionStrategy.OnPush, host: {
573
+ args: [{ selector: 'si-navbar-vertical-next', imports: [PortalModule, SiIconComponent, SiSkipLinkTargetDirective, SiTranslatePipe], providers: [{ provide: SI_NAVBAR_VERTICAL_NEXT, useExisting: SiNavbarVerticalNextComponent }], changeDetection: ChangeDetectionStrategy.OnPush, host: {
211
574
  class: 'si-layout-inner ready',
212
575
  '[class.nav-collapsed]': 'collapsed()',
213
576
  '[class.nav-text-only]': 'textOnly()',
577
+ '[class.nav-inline-collapse]': 'inlineCollapse()',
214
578
  '[class.visible]': 'visible()',
215
579
  '[class.ready]': 'ready()'
216
- }, template: "@if (visible()) {\n @if (smallScreen() && !collapsed()) {\n <div class=\"modal-backdrop\" animate.leave=\"backdrop-leave\" (click)=\"toggleCollapse()\"></div>\n }\n <nav\n tabindex=\"-1\"\n class=\"bg-base-1 focus-sub-inside\"\n [class.expanded]=\"!collapsed()\"\n [siSkipLinkTarget]=\"skipLinkNavigationLabel()\"\n [class.text-only]=\"textOnly()\"\n >\n <div class=\"collapse-toggle ms-auto\">\n <div class=\"mobile-drawer focus-inside navbar-vertical-no-collapse\">\n <button\n type=\"button\"\n class=\"btn btn-icon btn-tertiary-ghost\"\n [attr.aria-label]=\"toggleButtonText() | translate\"\n [attr.aria-expanded]=\"!collapsed()\"\n (click)=\"toggleCollapse()\"\n >\n <si-icon\n class=\"flip-rtl\"\n [icon]=\"collapsed() ? icons.elementDoubleRight : icons.elementDoubleLeft\"\n />\n </button>\n </div>\n </div>\n <ng-content select=\"si-navbar-vertical-next-search\" />\n <ng-content select=\"si-navbar-vertical-next-items\" />\n <ng-content select=\"si-navbar-vertical-next-footer-items\" />\n </nav>\n}\n<main\n class=\"si-layout-inner focus-none\"\n tabindex=\"-1\"\n [siSkipLinkTarget]=\"skipLinkMainContentLabel()\"\n>\n <ng-content />\n</main>\n", styles: [":host{display:block;--si-layout-header-first-element-offset: 40px}:host.ready:not(.visible){padding-inline-start:0!important}:host.ready{transition:padding-inline-start calc(.5s * var(--element-animations-enabled, 1))}nav{display:flex;flex-direction:column;position:fixed;z-index:1031;inset-block-start:calc(1.5rem + 25px + var(--element-titlebar-spacing, 0px) + var(--element-system-banner-spacing, 0px));inset-block-end:0;inset-inline-start:0;inline-size:0;transition:inline-size calc(.5s * var(--element-animations-enabled, 1)) ease}:host(.nav-collapsed) nav{z-index:1030}nav.expanded{inline-size:240px}.mobile-drawer{display:block;text-align:end;border:0;inline-size:calc(1.5rem + 24px);color:var(--element-text-primary);padding-block:4px;padding-inline:8px;margin-block-start:8px;border-start-end-radius:var(--element-radius-2);border-end-end-radius:var(--element-radius-2);transition:inline-size calc(.5s * var(--element-animations-enabled, 1)) ease,background-color calc(.5s * var(--element-animations-enabled, 1)) ease,box-shadow calc(.5s * var(--element-animations-enabled, 1)) ease}:host(:not(.nav-collapsed)) .mobile-drawer{inline-size:240px}:host.nav-collapsed .mobile-drawer{border:0;color:var(--element-text-primary);background:var(--element-base-1);text-align:end;box-shadow:0 0 4px var(--element-box-shadow-color-1),0 4px 4px var(--element-box-shadow-color-2)}.modal-backdrop{z-index:1031;transition:opacity calc(.15s * var(--element-animations-enabled, 1)) linear;opacity:1}@starting-style{.modal-backdrop{opacity:0}}.modal-backdrop.backdrop-leave{opacity:0}@media(min-width:576px){:host:not(.nav-text-only),:host:not(.nav-collapsed){--si-layout-header-first-element-offset: 0}:host:not(.nav-text-only){padding-inline-start:calc(1.5rem + 24px)}:host:not(.nav-text-only) .mobile-drawer{background:transparent;box-shadow:none}:host:not(.nav-text-only) nav{inline-size:calc(1.5rem + 24px)}:host:not(.nav-text-only) nav.expanded{inline-size:240px}}@media(min-width:992px){:host:not(.nav-collapsed){padding-inline-start:240px}}\n"] }]
217
- }], ctorParameters: () => [], propDecorators: { collapsed: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapsed", required: false }] }, { type: i0.Output, args: ["collapsedChange"] }], textOnly: [{ type: i0.Input, args: [{ isSignal: true, alias: "textOnly", required: false }] }], alwaysFlyout: [{ type: i0.Input, args: [{ isSignal: true, alias: "alwaysFlyout", required: false }] }], visible: [{ type: i0.Input, args: [{ isSignal: true, alias: "visible", required: false }] }], toggleButtonText: [{ type: i0.Input, args: [{ isSignal: true, alias: "toggleButtonText", required: false }] }], stateId: [{ type: i0.Input, args: [{ isSignal: true, alias: "stateId", required: false }] }], skipLinkNavigationLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "skipLinkNavigationLabel", required: false }] }], skipLinkMainContentLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "skipLinkMainContentLabel", required: false }] }] } });
580
+ }, template: "@if (visible()) {\n @if (smallScreen() && !collapsed()) {\n <div class=\"modal-backdrop\" animate.leave=\"backdrop-leave\" (click)=\"toggleCollapse()\"></div>\n }\n <nav\n tabindex=\"-1\"\n class=\"bg-base-1 focus-sub-inside\"\n [class.expanded]=\"!collapsed()\"\n [siSkipLinkTarget]=\"skipLinkNavigationLabel()\"\n [class.text-only]=\"textOnly()\"\n >\n <div class=\"collapse-toggle ms-auto\">\n <div class=\"mobile-drawer focus-inside\">\n <button\n type=\"button\"\n class=\"btn btn-icon toggle-button\"\n [class.btn-primary-ghost]=\"chipMode()\"\n [class.btn-tertiary-ghost]=\"!chipMode()\"\n [attr.aria-label]=\"toggleButtonText() | translate\"\n [attr.aria-expanded]=\"!collapsed()\"\n (click)=\"toggleCollapse()\"\n >\n <si-icon class=\"flip-rtl\" [icon]=\"toggleIcon()\" />\n </button>\n </div>\n </div>\n @if (inlineCollapse() && activeItem(); as item) {\n <div\n class=\"chip\"\n [class.chip-visible]=\"collapsed()\"\n [attr.inert]=\"collapsed() ? null : ''\"\n [attr.aria-hidden]=\"collapsed() ? null : 'true'\"\n >\n @if (chipPortalAttached()) {\n <ng-container [cdkPortalOutlet]=\"item.hostPortal\" />\n }\n </div>\n <ng-container #flyoutAnchorHost />\n }\n <div\n class=\"nav-content\"\n [attr.inert]=\"chipMode() ? '' : null\"\n [attr.aria-hidden]=\"chipMode() ? 'true' : null\"\n >\n <ng-content select=\"si-navbar-vertical-next-search\" />\n <ng-content select=\"si-navbar-vertical-next-items\" />\n <ng-content select=\"si-navbar-vertical-next-footer-items\" />\n </div>\n </nav>\n @if (inlineCollapse()) {\n <div class=\"toggle-placeholder\" aria-hidden=\"true\"></div>\n }\n}\n<main\n class=\"si-layout-inner focus-none\"\n tabindex=\"-1\"\n [siSkipLinkTarget]=\"skipLinkMainContentLabel()\"\n>\n <ng-content />\n</main>\n", styles: [":host{display:block;--si-layout-header-first-element-offset: 40px}:host.ready:not(.visible){padding-inline-start:0!important}:host.ready{transition:padding-inline-start calc(.5s * var(--element-animations-enabled, 1))}nav{display:flex;flex-direction:column;position:fixed;z-index:1031;inset-block-start:calc(1.5rem + 25px + var(--element-titlebar-spacing, 0px) + var(--element-system-banner-spacing, 0px));inset-block-end:0;inset-inline-start:0;inline-size:0;transition:inline-size calc(.5s * var(--element-animations-enabled, 1)) ease}:host(.nav-collapsed) nav{z-index:1030}nav.expanded{inline-size:240px}.mobile-drawer{display:block;text-align:end;border:0;inline-size:calc(1.5rem + 24px);color:var(--element-text-primary);padding-block:4px;padding-inline:8px;margin-block-start:8px;border-start-end-radius:var(--element-radius-2);border-end-end-radius:var(--element-radius-2);transition:inline-size calc(.5s * var(--element-animations-enabled, 1)) ease,background-color calc(.5s * var(--element-animations-enabled, 1)) ease,box-shadow calc(.5s * var(--element-animations-enabled, 1)) ease}:host(:not(.nav-collapsed):not(.nav-inline-collapse)) .mobile-drawer{inline-size:240px}.modal-backdrop{z-index:1031;transition:opacity calc(.15s * var(--element-animations-enabled, 1)) linear;opacity:1}@starting-style{.modal-backdrop{opacity:0}}.modal-backdrop.backdrop-leave{opacity:0}:host(.nav-text-only:not(.nav-inline-collapse)).nav-collapsed .mobile-drawer{background:var(--element-base-1);box-shadow:0 0 4px var(--element-box-shadow-color-1),0 4px 4px var(--element-box-shadow-color-2)}@media(max-width:575.98px){:host.nav-collapsed .mobile-drawer{background:var(--element-base-1);box-shadow:0 0 4px var(--element-box-shadow-color-1),0 4px 4px var(--element-box-shadow-color-2)}}@media(min-width:576px){:host:not(.nav-text-only),:host:not(.nav-collapsed),:host(.nav-inline-collapse){--si-layout-header-first-element-offset: 0}:host:where(:not(.nav-text-only):not(.nav-inline-collapse)){padding-inline-start:calc(1.5rem + 24px)}:host:where(:not(.nav-text-only):not(.nav-inline-collapse)) nav{inline-size:calc(1.5rem + 24px)}:host:where(:not(.nav-text-only):not(.nav-inline-collapse)) nav.expanded{inline-size:240px}}@media(min-width:992px){:host:not(.nav-collapsed){padding-inline-start:240px}}.nav-content{display:flex;flex-direction:column;flex:1 1 auto;min-block-size:0}:host(.nav-inline-collapse){--si-layout-header-first-element-offset: 0;--si-navbar-parked-inline-start: 16px}@media(min-width:768px){:host(.nav-inline-collapse){--si-navbar-parked-inline-start: 32px}}:host(.nav-inline-collapse) nav{overflow:hidden}:host(.nav-inline-collapse) nav:before{content:\"\";position:absolute;inset:0;background:var(--element-base-1);z-index:1;pointer-events:none}:host(.nav-inline-collapse) .nav-content{position:relative;z-index:2}:host(.nav-inline-collapse) .mobile-drawer:before{content:\"\";display:block;block-size:calc(1lh + 16px)}:host(.nav-inline-collapse) .toggle-placeholder{block-size:0;margin-block-start:0;transition:block-size calc(.5s * var(--element-animations-enabled, 1)) ease,margin-block-start calc(.5s * var(--element-animations-enabled, 1)) ease}:host(.nav-inline-collapse) .toggle-button{position:fixed;z-index:1031;inset-block-start:calc(calc(1.5rem + 25px + var(--element-titlebar-spacing, 0px) + var(--element-system-banner-spacing, 0px)) + 8px + 4px);inset-inline-start:calc(232px - (1lh + 16px));transition:inset-inline-start calc(.5s * var(--element-animations-enabled, 1)) ease,inset-block-start calc(.5s * var(--element-animations-enabled, 1)) ease}:host(.nav-inline-collapse) .chip{position:fixed;z-index:0;inset-block-start:calc(calc(1.5rem + 25px + var(--element-titlebar-spacing, 0px) + var(--element-system-banner-spacing, 0px)) + 16px);max-inline-size:calc(100vi - 2 * var(--si-navbar-parked-inline-start) - calc(1lh + 16px) - 1px);inset-inline-start:var(--si-navbar-parked-inline-start);opacity:0;transition:inset-inline-start calc(.5s * var(--element-animations-enabled, 1)) ease,opacity calc(.5s * var(--element-animations-enabled, 1)) ease}:host(.nav-inline-collapse) .chip:has(:focus-visible){z-index:1032}@starting-style{:host(.nav-inline-collapse) .chip.chip-visible{inset-inline-start:var(--si-navbar-parked-inline-start);opacity:0}}:host(.nav-inline-collapse) .chip.chip-visible{inset-inline-start:calc(var(--si-navbar-parked-inline-start) + calc(1lh + 16px) + 1px);opacity:1}:host(.nav-inline-collapse).nav-collapsed .toggle-placeholder{block-size:calc(1lh + 16px);margin-block-start:16px}:host(.nav-inline-collapse).nav-collapsed .toggle-button{inset-block-start:calc(calc(1.5rem + 25px + var(--element-titlebar-spacing, 0px) + var(--element-system-banner-spacing, 0px)) + 16px);inset-inline-start:var(--si-navbar-parked-inline-start)}:host(.nav-inline-collapse).nav-collapsed:has(.chip.chip-visible) .toggle-button{border-start-end-radius:0;border-end-end-radius:0}\n"] }]
581
+ }], ctorParameters: () => [], propDecorators: { collapsed: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapsed", required: false }] }, { type: i0.Output, args: ["collapsedChange"] }], textOnly: [{ type: i0.Input, args: [{ isSignal: true, alias: "textOnly", required: false }] }], inlineCollapse: [{ type: i0.Input, args: [{ isSignal: true, alias: "inlineCollapse", required: false }] }], alwaysFlyout: [{ type: i0.Input, args: [{ isSignal: true, alias: "alwaysFlyout", required: false }] }], visible: [{ type: i0.Input, args: [{ isSignal: true, alias: "visible", required: false }] }], toggleButtonText: [{ type: i0.Input, args: [{ isSignal: true, alias: "toggleButtonText", required: false }] }], stateId: [{ type: i0.Input, args: [{ isSignal: true, alias: "stateId", required: false }] }], skipLinkNavigationLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "skipLinkNavigationLabel", required: false }] }], skipLinkMainContentLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "skipLinkMainContentLabel", required: false }] }], flyoutAnchorHost: [{ type: i0.ViewChild, args: ['flyoutAnchorHost', { ...{ read: ViewContainerRef }, isSignal: true }] }], items: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => SiNavbarVerticalNextItemComponent), { ...{
582
+ descendants: true
583
+ }, isSignal: true }] }] } });
218
584
 
219
585
  /**
220
586
  * Copyright (c) Siemens 2016 - 2026
@@ -252,171 +618,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.8", ngImpor
252
618
  args: [{ selector: 'si-navbar-vertical-next-footer-items', template: '<ng-content />', changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block;overflow-x:hidden;margin-block-start:auto;padding-block-end:8px}:host-context(.nav-collapsed){display:none}@media(min-width:576px){:host-context(:not(.nav-text-only).nav-collapsed){display:block}}\n"] }]
253
619
  }] });
254
620
 
255
- /**
256
- * Copyright (c) Siemens 2016 - 2026
257
- * SPDX-License-Identifier: MIT
258
- */
259
- /**
260
- * Using this component, to anchor the flyout inside the navbar within the a11y tree.
261
- * Otherwise, without aria-owns, screen reader will announce the leaving of the navbar when moving to the flyout.
262
- * Aria-owns cannot be put directly on the trigger
263
- * as chrome will include the flyout children in the a11y label of the trigger.
264
- * @experimental
265
- */
266
- class SiNavbarFlyoutAnchorComponent {
267
- groupId = input(...(ngDevMode ? [undefined, { debugName: "groupId" }] : []));
268
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.8", ngImport: i0, type: SiNavbarFlyoutAnchorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
269
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.0.8", type: SiNavbarFlyoutAnchorComponent, isStandalone: true, selector: "si-navbar-flyout-anchor", inputs: { groupId: { classPropertyName: "groupId", publicName: "groupId", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.aria-owns": "groupId()" } }, ngImport: i0, template: '', isInline: true });
270
- }
271
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.8", ngImport: i0, type: SiNavbarFlyoutAnchorComponent, decorators: [{
272
- type: Component,
273
- args: [{
274
- selector: 'si-navbar-flyout-anchor',
275
- template: '',
276
- host: { '[attr.aria-owns]': 'groupId()' }
277
- }]
278
- }], propDecorators: { groupId: [{ type: i0.Input, args: [{ isSignal: true, alias: "groupId", required: false }] }] } });
279
- /** @experimental */
280
- class SiNavbarVerticalNextGroupTriggerDirective {
281
- static idCounter = 0;
282
- /** @internal */
283
- groupId = `si-navbar-vertical-next-group-${SiNavbarVerticalNextGroupTriggerDirective.idCounter++}`;
284
- id = `${this.groupId}-trigger`;
285
- groupTemplate = input.required({ ...(ngDevMode ? { debugName: "groupTemplate" } : {}), alias: 'siNavbarVerticalNextGroupTriggerFor' });
286
- stateId = input(...(ngDevMode ? [undefined, { debugName: "stateId" }] : []));
287
- /** @defaultValue false */
288
- expanded = linkedSignal({ ...(ngDevMode ? { debugName: "expanded" } : {}), source: () => {
289
- const stateId = this.stateId();
290
- return {
291
- uiState: stateId ? this.navbar.uiStateExpandedItems()[stateId] : undefined,
292
- alwaysFlyout: this.navbar.alwaysFlyout()
293
- };
294
- },
295
- computation: (source, previous) => {
296
- // `alwaysFlyout` toggled: reset expansion. When switching back to inline,
297
- // surface the group that owns the active route.
298
- if (previous && source.alwaysFlyout !== previous.source.alwaysFlyout) {
299
- return !source.alwaysFlyout && untracked(() => this.active());
300
- }
301
- // First run or UIState (re)loaded: honor the persisted value when present,
302
- // otherwise keep the user's current expansion.
303
- if (source.uiState !== undefined) {
304
- return source.uiState;
305
- }
306
- return previous?.value ?? false;
307
- } });
308
- /**
309
- * Whether the group is currently rendered as a transient flyout overlay
310
- * (true) or inline within the navbar (false). Automatically resets to
311
- * `false` whenever the rendering mode changes.
312
- * @internal
313
- */
314
- flyout = linkedSignal({ ...(ngDevMode ? { debugName: "flyout" } : {}), source: () => this.flyoutMode(),
315
- computation: () => false });
316
- /**
317
- * Whether the open flyout overlay currently contains the active route.
318
- * Reset together with `flyout` so it never lingers across mode changes.
319
- * @internal
320
- */
321
- active = linkedSignal({ ...(ngDevMode ? { debugName: "active" } : {}), source: () => this.flyout(),
322
- computation: (open, previous) => (open ? (previous?.value ?? false) : false) });
323
- navbar = inject(SI_NAVBAR_VERTICAL_NEXT);
324
- /** @internal */
325
- flyoutMode = computed(() => this.navbar.alwaysFlyout() || this.navbar.collapsed(), ...(ngDevMode ? [{ debugName: "flyoutMode" }] : []));
326
- flyoutOutsideClickSubscription;
327
- viewContainer = inject(ViewContainerRef);
328
- overlay = inject(Overlay);
329
- injector = Injector.create({ parent: inject(Injector), providers: [] });
330
- overlayRef = this.overlay.create({
331
- positionStrategy: this.overlay
332
- .position()
333
- .flexibleConnectedTo(this.viewContainer.element)
334
- .withPositions([
335
- { originX: 'end', originY: 'top', overlayX: 'start', overlayY: 'top' },
336
- { originX: 'end', originY: 'bottom', overlayX: 'start', overlayY: 'bottom' }
337
- ])
338
- });
339
- groupView;
340
- flyoutAnchorComponentRef;
341
- templatePortal = computed(() => new TemplatePortal(this.groupTemplate(), this.viewContainer, undefined, this.injector), ...(ngDevMode ? [{ debugName: "templatePortal" }] : []));
342
- constructor() {
343
- // Manage the rendering of the inline projection / flyout overlay in
344
- // response to mode changes. Only side effects belong here; the related
345
- // signal state is propagated by `flyout` / `expanded` linked signals.
346
- effect(() => {
347
- this.flyoutMode();
348
- untracked(() => {
349
- this.detachFlyout();
350
- this.attachInline();
351
- });
352
- });
353
- }
354
- /** @internal */
355
- hideFlyout() {
356
- if (!this.flyout())
357
- return;
358
- this.flyout.set(false);
359
- this.detachFlyout();
360
- this.attachInline();
361
- }
362
- triggered() {
363
- if (this.flyoutMode()) {
364
- this.toggleFlyout();
365
- }
366
- else {
367
- this.expanded.set(!this.expanded());
368
- this.navbar.groupStateChanged(this.stateId(), this.expanded());
369
- }
370
- }
371
- toggleFlyout() {
372
- if (this.flyout()) {
373
- this.hideFlyout();
374
- }
375
- else {
376
- this.flyout.set(true);
377
- this.attachFlyout();
378
- }
379
- }
380
- attachInline() {
381
- this.overlayRef.detach();
382
- this.groupView?.destroy();
383
- this.groupView = this.viewContainer.createEmbeddedView(this.groupTemplate(), undefined, {
384
- injector: this.injector
385
- });
386
- }
387
- attachFlyout() {
388
- this.groupView?.destroy();
389
- this.groupView = this.overlayRef.attach(this.templatePortal());
390
- this.flyoutAnchorComponentRef = this.viewContainer.createComponent(SiNavbarFlyoutAnchorComponent);
391
- this.flyoutAnchorComponentRef.setInput('groupId', this.groupId);
392
- this.flyoutOutsideClickSubscription = this.overlayRef
393
- .outsidePointerEvents()
394
- .subscribe(() => this.hideFlyout());
395
- }
396
- detachFlyout() {
397
- this.flyoutAnchorComponentRef?.destroy();
398
- this.flyoutAnchorComponentRef = undefined;
399
- this.flyoutOutsideClickSubscription?.unsubscribe();
400
- this.flyoutOutsideClickSubscription = undefined;
401
- }
402
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.8", ngImport: i0, type: SiNavbarVerticalNextGroupTriggerDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
403
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "21.0.8", type: SiNavbarVerticalNextGroupTriggerDirective, isStandalone: true, selector: "button[siNavbarVerticalNextGroupTriggerFor]", inputs: { groupTemplate: { classPropertyName: "groupTemplate", publicName: "siNavbarVerticalNextGroupTriggerFor", isSignal: true, isRequired: true, transformFunction: null }, stateId: { classPropertyName: "stateId", publicName: "stateId", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "click": "triggered()" }, properties: { "id": "id", "class.show": "expanded()", "attr.aria-controls": "groupId", "attr.aria-expanded": "expanded()" }, classAttribute: "dropdown-toggle" }, ngImport: i0 });
404
- }
405
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.8", ngImport: i0, type: SiNavbarVerticalNextGroupTriggerDirective, decorators: [{
406
- type: Directive,
407
- args: [{
408
- selector: 'button[siNavbarVerticalNextGroupTriggerFor]',
409
- host: {
410
- class: 'dropdown-toggle',
411
- '[id]': 'id',
412
- '[class.show]': 'expanded()',
413
- '[attr.aria-controls]': 'groupId',
414
- '[attr.aria-expanded]': 'expanded()',
415
- '(click)': 'triggered()'
416
- }
417
- }]
418
- }], ctorParameters: () => [], propDecorators: { groupTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "siNavbarVerticalNextGroupTriggerFor", required: true }] }], stateId: [{ type: i0.Input, args: [{ isSignal: true, alias: "stateId", required: false }] }] } });
419
-
420
621
  /**
421
622
  * Copyright (c) Siemens 2016 - 2026
422
623
  * SPDX-License-Identifier: MIT
@@ -511,92 +712,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.8", ngImpor
511
712
  }, styles: [".divider,.title{opacity:1;transition:opacity calc(.25s * var(--element-animations-enabled, 1)) calc(.25s * var(--element-animations-enabled, 1)) ease-out}@starting-style{.divider,.title{opacity:0}}:host{display:flex;align-items:center;block-size:calc(1lh + 24px);transition:block-size calc(.5s * var(--element-animations-enabled, 1)) ease-out}:host.collapsed{block-size:13px}:host.component-enter{transition:none}:host.component-enter .title,:host.component-enter .divider{transition:none}.title.title-leave{opacity:0;transition:opacity calc(.25s * var(--element-animations-enabled, 1)) ease-in}.divider{flex:1;margin-block:0}.divider.divider-leave{opacity:0;transition-delay:0s}\n"] }]
512
713
  }] });
513
714
 
514
- /**
515
- * Copyright (c) Siemens 2016 - 2026
516
- * SPDX-License-Identifier: MIT
517
- */
518
- /** @experimental */
519
- class SiNavbarVerticalNextItemComponent {
520
- icons = addIcons({ elementDown2, elementRight2 });
521
- /** Optional icon to render before the label. */
522
- icon = input(...(ngDevMode ? [undefined, { debugName: "icon" }] : []));
523
- /** Badge value to display. */
524
- badge = input(...(ngDevMode ? [undefined, { debugName: "badge" }] : []));
525
- /** Color of the badge. */
526
- badgeColor = input(...(ngDevMode ? [undefined, { debugName: "badgeColor" }] : []));
527
- /**
528
- * Hide the badge when the navbar is collapsed.
529
- *
530
- * @defaultValue false
531
- */
532
- hideBadgeWhenCollapsed = input(false, { ...(ngDevMode ? { debugName: "hideBadgeWhenCollapsed" } : {}), transform: booleanAttribute });
533
- /** Override the active state. Useful for action items. */
534
- activeOverride = input(...(ngDevMode ? [undefined, { debugName: "activeOverride" }] : []));
535
- navbar = inject(SI_NAVBAR_VERTICAL_NEXT);
536
- parent = inject(SiNavbarVerticalNextItemComponent, {
537
- skipSelf: true,
538
- optional: true
539
- });
540
- group = inject(SiNavbarVerticalNextGroupTriggerDirective, {
541
- optional: true,
542
- self: true
543
- });
544
- routerLinkActive = inject(RouterLinkActive, { optional: true });
545
- siLink = inject(SiLinkDirective, { optional: true });
546
- /**
547
- * Determines if the badge contains text-only content (not numeric)
548
- */
549
- textOnlyBadge = computed(() => {
550
- const badge = this.badge();
551
- return badge != null && badge !== '' ? typeof badge !== 'number' : false;
552
- }, ...(ngDevMode ? [{ debugName: "textOnlyBadge" }] : []));
553
- /**
554
- * Formats badge value to limit display to "+99" for numbers greater than 99
555
- */
556
- formattedBadge = computed(() => {
557
- const badge = this.badge();
558
- if (badge == null || badge === '') {
559
- return '';
560
- }
561
- if (typeof badge === 'number') {
562
- return badge > 99 ? '+99' : badge.toString();
563
- }
564
- return badge.toString();
565
- }, ...(ngDevMode ? [{ debugName: "formattedBadge" }] : []));
566
- isDropdownItem = computed(() => !this.navbar.alwaysFlyout() && !!this.parent?.group?.flyout(), ...(ngDevMode ? [{ debugName: "isDropdownItem" }] : []));
567
- ngOnInit() {
568
- if (this.group && this.active) {
569
- this.group.expanded.set(true);
570
- }
571
- }
572
- triggered() {
573
- this.parent?.group?.hideFlyout();
574
- if (!this.group) {
575
- this.navbar.itemTriggered();
576
- }
577
- }
578
- get active() {
579
- return (this.activeOverride() ||
580
- this.routerLinkActive?.isActive ||
581
- this.siLink?.active() ||
582
- ((!this.group?.expanded() || this.navbar.collapsed()) && this.group?.active()) ||
583
- false);
584
- }
585
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.8", ngImport: i0, type: SiNavbarVerticalNextItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
586
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.8", type: SiNavbarVerticalNextItemComponent, isStandalone: true, selector: "a[si-navbar-vertical-next-item], button[si-navbar-vertical-next-item]", inputs: { icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, badge: { classPropertyName: "badge", publicName: "badge", isSignal: true, isRequired: false, transformFunction: null }, badgeColor: { classPropertyName: "badgeColor", publicName: "badgeColor", isSignal: true, isRequired: false, transformFunction: null }, hideBadgeWhenCollapsed: { classPropertyName: "hideBadgeWhenCollapsed", publicName: "hideBadgeWhenCollapsed", isSignal: true, isRequired: false, transformFunction: null }, activeOverride: { classPropertyName: "activeOverride", publicName: "activeOverride", isSignal: true, isRequired: false, transformFunction: null } }, host: { listeners: { "click": "triggered()" }, properties: { "class.dropdown-item": "isDropdownItem()", "class.navbar-vertical-item": "!isDropdownItem()", "class.active": "active", "class.hide-badge-collapsed": "hideBadgeWhenCollapsed()" }, classAttribute: "focus-inside" }, ngImport: i0, template: "@let icon = this.icon();\n@if (icon) {\n <si-icon class=\"icon-lg\" [icon]=\"icon\" />\n}\n<div class=\"item-title text-truncate si-h5\">\n <ng-content />\n</div>\n@if (!navbar.textOnly() && formattedBadge()) {\n @let badgeColor = this.badgeColor();\n <span\n [class]=\"[\n 'badge',\n badgeColor ? `bg-${badgeColor}` : 'bg-default',\n textOnlyBadge() ? 'badge-text-only' : '',\n navbar.collapsed() ? 'badge-collapsed' : ''\n ]\"\n >{{ formattedBadge() }}</span\n >\n}\n@if (group) {\n <si-icon\n class=\"dropdown-caret me-0 text-body\"\n [icon]=\"group.flyoutMode() ? icons.elementRight2 : icons.elementDown2\"\n />\n}\n", styles: [":host(.navbar-vertical-item){display:flex;align-items:center;position:relative;color:var(--element-text-primary);background:none;border:0;font-size:.875rem;padding-block:8px;padding-inline:0 12px;min-inline-size:0;min-block-size:calc(1lh + 24px);inline-size:100%;border-radius:0}:host(.navbar-vertical-item) .item-title{margin-inline-start:12px}:host(.navbar-vertical-item) .icon-lg{margin-inline-start:12px}:host(.navbar-vertical-item) .icon-lg+.item-title{margin-inline-start:8px}:host(.navbar-vertical-item).show .badge:not(.badge-collapsed){display:none}:host(.navbar-vertical-item):not(.show) .badge+.dropdown-caret{margin-inline:0;padding-inline:0}:host(.navbar-vertical-item).active{color:var(--element-action-primary-hover);background:var(--element-base-1-selected)}:host(.navbar-vertical-item).active:after{content:\"\";position:absolute;inset-block:0;inset-inline-start:0;inline-size:4px;background:var(--element-action-primary-hover)}:host(.navbar-vertical-item):hover{text-decoration:none;background:var(--element-base-1-hover)}:host-context(si-navbar-vertical-next-items > .navbar-vertical-item)+:host(.navbar-vertical-item),:host-context(si-navbar-vertical-next-items > si-navbar-vertical-next-group)+:host(.navbar-vertical-item),:host-context(si-navbar-vertical-next-items > si-navbar-flyout-anchor)+:host(.navbar-vertical-item),:host-context(si-navbar-vertical-next-footer-items > .navbar-vertical-item)+:host(.navbar-vertical-item),:host-context(si-navbar-vertical-next-footer-items > si-navbar-vertical-next-group)+:host(.navbar-vertical-item),:host-context(si-navbar-vertical-next-footer-items > si-navbar-flyout-anchor)+:host(.navbar-vertical-item){margin-block-start:8px}:host-context(.nav-text-only si-navbar-vertical-next-group) .item-title{margin-inline-start:0}:host-context(si-navbar-vertical-next-group) :host(.navbar-vertical-item){padding-inline-start:32px}:host-context(si-navbar-vertical-next-group) :host(.navbar-vertical-item) .item-title{font-weight:400}:host-context(.dropdown-menu) :host(.navbar-vertical-item){padding-inline-start:0}:host(.dropdown-item) .item-title{font-weight:400}:host-context(.nav-collapsed) .badge{position:absolute;inset-block-start:4px;inset-inline-end:6px;min-inline-size:.875rem;border-radius:.4375rem;font-size:.75rem;line-height:.875rem;padding-block:0;padding-inline:4px;font-family:var(--element-body-font-family);font-weight:600;text-align:center}:host-context(.nav-collapsed) .badge.badge-text-only{color:transparent;font-size:0}:host-context(.nav-collapsed) :is(.item-title,.dropdown-caret){position:absolute!important;inline-size:1px!important;block-size:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}:host-context(.nav-collapsed).hide-badge-collapsed .badge{display:none}.badge{margin-inline:auto 0}\n"], dependencies: [{ kind: "component", type: SiIconComponent, selector: "si-icon", inputs: ["icon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
587
- }
588
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.8", ngImport: i0, type: SiNavbarVerticalNextItemComponent, decorators: [{
589
- type: Component,
590
- args: [{ selector: 'a[si-navbar-vertical-next-item], button[si-navbar-vertical-next-item]', imports: [SiIconComponent], changeDetection: ChangeDetectionStrategy.OnPush, host: {
591
- 'class': 'focus-inside',
592
- '[class.dropdown-item]': 'isDropdownItem()',
593
- '[class.navbar-vertical-item]': '!isDropdownItem()',
594
- '[class.active]': 'active',
595
- '[class.hide-badge-collapsed]': 'hideBadgeWhenCollapsed()',
596
- '(click)': 'triggered()'
597
- }, template: "@let icon = this.icon();\n@if (icon) {\n <si-icon class=\"icon-lg\" [icon]=\"icon\" />\n}\n<div class=\"item-title text-truncate si-h5\">\n <ng-content />\n</div>\n@if (!navbar.textOnly() && formattedBadge()) {\n @let badgeColor = this.badgeColor();\n <span\n [class]=\"[\n 'badge',\n badgeColor ? `bg-${badgeColor}` : 'bg-default',\n textOnlyBadge() ? 'badge-text-only' : '',\n navbar.collapsed() ? 'badge-collapsed' : ''\n ]\"\n >{{ formattedBadge() }}</span\n >\n}\n@if (group) {\n <si-icon\n class=\"dropdown-caret me-0 text-body\"\n [icon]=\"group.flyoutMode() ? icons.elementRight2 : icons.elementDown2\"\n />\n}\n", styles: [":host(.navbar-vertical-item){display:flex;align-items:center;position:relative;color:var(--element-text-primary);background:none;border:0;font-size:.875rem;padding-block:8px;padding-inline:0 12px;min-inline-size:0;min-block-size:calc(1lh + 24px);inline-size:100%;border-radius:0}:host(.navbar-vertical-item) .item-title{margin-inline-start:12px}:host(.navbar-vertical-item) .icon-lg{margin-inline-start:12px}:host(.navbar-vertical-item) .icon-lg+.item-title{margin-inline-start:8px}:host(.navbar-vertical-item).show .badge:not(.badge-collapsed){display:none}:host(.navbar-vertical-item):not(.show) .badge+.dropdown-caret{margin-inline:0;padding-inline:0}:host(.navbar-vertical-item).active{color:var(--element-action-primary-hover);background:var(--element-base-1-selected)}:host(.navbar-vertical-item).active:after{content:\"\";position:absolute;inset-block:0;inset-inline-start:0;inline-size:4px;background:var(--element-action-primary-hover)}:host(.navbar-vertical-item):hover{text-decoration:none;background:var(--element-base-1-hover)}:host-context(si-navbar-vertical-next-items > .navbar-vertical-item)+:host(.navbar-vertical-item),:host-context(si-navbar-vertical-next-items > si-navbar-vertical-next-group)+:host(.navbar-vertical-item),:host-context(si-navbar-vertical-next-items > si-navbar-flyout-anchor)+:host(.navbar-vertical-item),:host-context(si-navbar-vertical-next-footer-items > .navbar-vertical-item)+:host(.navbar-vertical-item),:host-context(si-navbar-vertical-next-footer-items > si-navbar-vertical-next-group)+:host(.navbar-vertical-item),:host-context(si-navbar-vertical-next-footer-items > si-navbar-flyout-anchor)+:host(.navbar-vertical-item){margin-block-start:8px}:host-context(.nav-text-only si-navbar-vertical-next-group) .item-title{margin-inline-start:0}:host-context(si-navbar-vertical-next-group) :host(.navbar-vertical-item){padding-inline-start:32px}:host-context(si-navbar-vertical-next-group) :host(.navbar-vertical-item) .item-title{font-weight:400}:host-context(.dropdown-menu) :host(.navbar-vertical-item){padding-inline-start:0}:host(.dropdown-item) .item-title{font-weight:400}:host-context(.nav-collapsed) .badge{position:absolute;inset-block-start:4px;inset-inline-end:6px;min-inline-size:.875rem;border-radius:.4375rem;font-size:.75rem;line-height:.875rem;padding-block:0;padding-inline:4px;font-family:var(--element-body-font-family);font-weight:600;text-align:center}:host-context(.nav-collapsed) .badge.badge-text-only{color:transparent;font-size:0}:host-context(.nav-collapsed) :is(.item-title,.dropdown-caret){position:absolute!important;inline-size:1px!important;block-size:1px!important;padding:0!important;margin:-1px!important;overflow:hidden!important;clip:rect(0,0,0,0)!important;white-space:nowrap!important;border:0!important}:host-context(.nav-collapsed).hide-badge-collapsed .badge{display:none}.badge{margin-inline:auto 0}\n"] }]
598
- }], propDecorators: { icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], badge: [{ type: i0.Input, args: [{ isSignal: true, alias: "badge", required: false }] }], badgeColor: [{ type: i0.Input, args: [{ isSignal: true, alias: "badgeColor", required: false }] }], hideBadgeWhenCollapsed: [{ type: i0.Input, args: [{ isSignal: true, alias: "hideBadgeWhenCollapsed", required: false }] }], activeOverride: [{ type: i0.Input, args: [{ isSignal: true, alias: "activeOverride", required: false }] }] } });
599
-
600
715
  /**
601
716
  * Copyright (c) Siemens 2016 - 2026
602
717
  * SPDX-License-Identifier: MIT
@@ -629,11 +744,11 @@ class SiNavbarVerticalNextSearchComponent {
629
744
  setTimeout(() => this.searchBar().focus());
630
745
  }
631
746
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.8", ngImport: i0, type: SiNavbarVerticalNextSearchComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
632
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.0.8", type: SiNavbarVerticalNextSearchComponent, isStandalone: true, selector: "si-navbar-vertical-next-search", inputs: { placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, debounceTime: { classPropertyName: "debounceTime", publicName: "debounceTime", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { searchChange: "searchChange" }, viewQueries: [{ propertyName: "searchBar", first: true, predicate: SiSearchBarComponent, descendants: true, isSignal: true }], ngImport: i0, template: "<si-search-bar\n class=\"mx-4\"\n colorVariant=\"base-0\"\n prohibitedCharacters=\"*?\"\n [placeholder]=\"placeholder() | translate\"\n [debounceTime]=\"debounceTime()\"\n [showIcon]=\"true\"\n (searchChange)=\"searchChange.emit($event)\"\n/>\n<button\n type=\"button\"\n class=\"btn-search bg-base-0 px-3 mx-4 mobile navbar-vertical-no-collapse text-secondary\"\n [attr.aria-label]=\"placeholder() | translate\"\n (click)=\"expandForSearch()\"\n>\n <si-icon class=\"icon\" [icon]=\"icons.elementSearch\" />\n</button>\n", styles: [":host{display:flex;align-items:center;margin-block-start:8px;padding-block:4px;overflow-x:hidden}:host-context(.nav-collapsed){display:none}:host-context(.nav-collapsed) si-search-bar{display:none}si-search-bar{inline-size:100%}.btn-search{display:none;border:0;border-radius:var(--element-radius-2);block-size:calc(1lh + 16px);inline-size:calc(1.5rem + 8px);text-align:start}@media(min-width:576px){:host-context(:not(.nav-text-only).nav-collapsed){display:flex}.btn-search{display:none}:host-context(.nav-collapsed) .btn-search{display:block}}\n"], dependencies: [{ kind: "component", type: SiIconComponent, selector: "si-icon", inputs: ["icon"] }, { kind: "component", type: SiSearchBarComponent, selector: "si-search-bar", inputs: ["debounceTime", "prohibitedCharacters", "placeholder", "showIcon", "tabbable", "value", "readonly", "colorVariant", "disabled", "maxlength", "clearButtonAriaLabel"], outputs: ["searchChange"] }, { kind: "pipe", type: SiTranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
747
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "21.0.8", type: SiNavbarVerticalNextSearchComponent, isStandalone: true, selector: "si-navbar-vertical-next-search", inputs: { placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, debounceTime: { classPropertyName: "debounceTime", publicName: "debounceTime", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { searchChange: "searchChange" }, viewQueries: [{ propertyName: "searchBar", first: true, predicate: SiSearchBarComponent, descendants: true, isSignal: true }], ngImport: i0, template: "<si-search-bar\n class=\"mx-4\"\n colorVariant=\"base-0\"\n prohibitedCharacters=\"*?\"\n [placeholder]=\"placeholder() | translate\"\n [debounceTime]=\"debounceTime()\"\n [showIcon]=\"true\"\n (searchChange)=\"searchChange.emit($event)\"\n/>\n<button\n type=\"button\"\n class=\"btn-search bg-base-0 px-3 mx-4 mobile text-secondary\"\n [attr.aria-label]=\"placeholder() | translate\"\n (click)=\"expandForSearch()\"\n>\n <si-icon class=\"icon\" [icon]=\"icons.elementSearch\" />\n</button>\n", styles: [":host{display:flex;align-items:center;margin-block-start:8px;padding-block:4px;overflow-x:hidden}:host-context(.nav-collapsed){display:none}:host-context(.nav-collapsed) si-search-bar{display:none}si-search-bar{inline-size:100%}.btn-search{display:none;border:0;border-radius:var(--element-radius-2);block-size:calc(1lh + 16px);inline-size:calc(1.5rem + 8px);text-align:start}@media(min-width:576px){:host-context(:not(.nav-text-only).nav-collapsed){display:flex}.btn-search{display:none}:host-context(.nav-collapsed) .btn-search{display:block}}\n"], dependencies: [{ kind: "component", type: SiIconComponent, selector: "si-icon", inputs: ["icon"] }, { kind: "component", type: SiSearchBarComponent, selector: "si-search-bar", inputs: ["debounceTime", "prohibitedCharacters", "placeholder", "showIcon", "tabbable", "value", "readonly", "colorVariant", "disabled", "maxlength", "clearButtonAriaLabel"], outputs: ["searchChange"] }, { kind: "pipe", type: SiTranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
633
748
  }
634
749
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.8", ngImport: i0, type: SiNavbarVerticalNextSearchComponent, decorators: [{
635
750
  type: Component,
636
- args: [{ selector: 'si-navbar-vertical-next-search', imports: [SiIconComponent, SiSearchBarComponent, SiTranslatePipe], changeDetection: ChangeDetectionStrategy.OnPush, template: "<si-search-bar\n class=\"mx-4\"\n colorVariant=\"base-0\"\n prohibitedCharacters=\"*?\"\n [placeholder]=\"placeholder() | translate\"\n [debounceTime]=\"debounceTime()\"\n [showIcon]=\"true\"\n (searchChange)=\"searchChange.emit($event)\"\n/>\n<button\n type=\"button\"\n class=\"btn-search bg-base-0 px-3 mx-4 mobile navbar-vertical-no-collapse text-secondary\"\n [attr.aria-label]=\"placeholder() | translate\"\n (click)=\"expandForSearch()\"\n>\n <si-icon class=\"icon\" [icon]=\"icons.elementSearch\" />\n</button>\n", styles: [":host{display:flex;align-items:center;margin-block-start:8px;padding-block:4px;overflow-x:hidden}:host-context(.nav-collapsed){display:none}:host-context(.nav-collapsed) si-search-bar{display:none}si-search-bar{inline-size:100%}.btn-search{display:none;border:0;border-radius:var(--element-radius-2);block-size:calc(1lh + 16px);inline-size:calc(1.5rem + 8px);text-align:start}@media(min-width:576px){:host-context(:not(.nav-text-only).nav-collapsed){display:flex}.btn-search{display:none}:host-context(.nav-collapsed) .btn-search{display:block}}\n"] }]
751
+ args: [{ selector: 'si-navbar-vertical-next-search', imports: [SiIconComponent, SiSearchBarComponent, SiTranslatePipe], changeDetection: ChangeDetectionStrategy.OnPush, template: "<si-search-bar\n class=\"mx-4\"\n colorVariant=\"base-0\"\n prohibitedCharacters=\"*?\"\n [placeholder]=\"placeholder() | translate\"\n [debounceTime]=\"debounceTime()\"\n [showIcon]=\"true\"\n (searchChange)=\"searchChange.emit($event)\"\n/>\n<button\n type=\"button\"\n class=\"btn-search bg-base-0 px-3 mx-4 mobile text-secondary\"\n [attr.aria-label]=\"placeholder() | translate\"\n (click)=\"expandForSearch()\"\n>\n <si-icon class=\"icon\" [icon]=\"icons.elementSearch\" />\n</button>\n", styles: [":host{display:flex;align-items:center;margin-block-start:8px;padding-block:4px;overflow-x:hidden}:host-context(.nav-collapsed){display:none}:host-context(.nav-collapsed) si-search-bar{display:none}si-search-bar{inline-size:100%}.btn-search{display:none;border:0;border-radius:var(--element-radius-2);block-size:calc(1lh + 16px);inline-size:calc(1.5rem + 8px);text-align:start}@media(min-width:576px){:host-context(:not(.nav-text-only).nav-collapsed){display:flex}.btn-search{display:none}:host-context(.nav-collapsed) .btn-search{display:block}}\n"] }]
637
752
  }], propDecorators: { placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], debounceTime: [{ type: i0.Input, args: [{ isSignal: true, alias: "debounceTime", required: false }] }], searchChange: [{ type: i0.Output, args: ["searchChange"] }], searchBar: [{ type: i0.ViewChild, args: [i0.forwardRef(() => SiSearchBarComponent), { isSignal: true }] }] } });
638
753
 
639
754
  /**