@siemens/element-ng 47.4.0 → 47.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (145) hide show
  1. package/common/models/status-type.model.d.ts +2 -0
  2. package/datatable/index.d.ts +42 -0
  3. package/datatable/package.json +3 -0
  4. package/datatable/si-datatable-interaction.directive.d.ts +34 -0
  5. package/datatable/si-datatable.module.d.ts +7 -0
  6. package/fesm2022/siemens-element-ng-common.mjs.map +1 -1
  7. package/fesm2022/siemens-element-ng-datatable.mjs +173 -0
  8. package/fesm2022/siemens-element-ng-datatable.mjs.map +1 -0
  9. package/fesm2022/siemens-element-ng-filtered-search.mjs +1139 -0
  10. package/fesm2022/siemens-element-ng-filtered-search.mjs.map +1 -0
  11. package/fesm2022/siemens-element-ng-formly.mjs +935 -0
  12. package/fesm2022/siemens-element-ng-formly.mjs.map +1 -0
  13. package/fesm2022/siemens-element-ng-icon.mjs +42 -14
  14. package/fesm2022/siemens-element-ng-icon.mjs.map +1 -1
  15. package/fesm2022/siemens-element-ng-list-details.mjs +390 -0
  16. package/fesm2022/siemens-element-ng-list-details.mjs.map +1 -0
  17. package/fesm2022/siemens-element-ng-loading-spinner.mjs +15 -12
  18. package/fesm2022/siemens-element-ng-loading-spinner.mjs.map +1 -1
  19. package/fesm2022/siemens-element-ng-modal.mjs +4 -1
  20. package/fesm2022/siemens-element-ng-modal.mjs.map +1 -1
  21. package/fesm2022/siemens-element-ng-password-strength.mjs +22 -16
  22. package/fesm2022/siemens-element-ng-password-strength.mjs.map +1 -1
  23. package/fesm2022/siemens-element-ng-phone-number.mjs +426 -0
  24. package/fesm2022/siemens-element-ng-phone-number.mjs.map +1 -0
  25. package/fesm2022/siemens-element-ng-result-details-list.mjs +74 -0
  26. package/fesm2022/siemens-element-ng-result-details-list.mjs.map +1 -0
  27. package/fesm2022/siemens-element-ng-shadow-root.mjs +70 -0
  28. package/fesm2022/siemens-element-ng-shadow-root.mjs.map +1 -0
  29. package/fesm2022/siemens-element-ng-side-panel.mjs +554 -0
  30. package/fesm2022/siemens-element-ng-side-panel.mjs.map +1 -0
  31. package/fesm2022/siemens-element-ng-status-bar.mjs +348 -0
  32. package/fesm2022/siemens-element-ng-status-bar.mjs.map +1 -0
  33. package/fesm2022/siemens-element-ng-tabs-next.mjs +491 -0
  34. package/fesm2022/siemens-element-ng-tabs-next.mjs.map +1 -0
  35. package/fesm2022/siemens-element-ng-translate.mjs.map +1 -1
  36. package/fesm2022/siemens-element-ng-tree-view.mjs +2936 -0
  37. package/fesm2022/siemens-element-ng-tree-view.mjs.map +1 -0
  38. package/fesm2022/siemens-element-ng-wizard.mjs +2 -2
  39. package/fesm2022/siemens-element-ng-wizard.mjs.map +1 -1
  40. package/filtered-search/index.d.ts +7 -0
  41. package/filtered-search/package.json +3 -0
  42. package/filtered-search/si-filtered-search-helper.d.ts +22 -0
  43. package/filtered-search/si-filtered-search-value.component.d.ts +53 -0
  44. package/filtered-search/si-filtered-search.component.d.ts +329 -0
  45. package/filtered-search/si-filtered-search.model.d.ts +139 -0
  46. package/filtered-search/si-filtered-search.module.d.ts +7 -0
  47. package/filtered-search/values/date-value/si-filtered-search-date-value.component.d.ts +57 -0
  48. package/filtered-search/values/si-filtered-search-value.base.d.ts +27 -0
  49. package/filtered-search/values/typeahead/si-filtered-search-typeahead.component.d.ts +45 -0
  50. package/formly/fields/button/si-formly-button.component.d.ts +7 -0
  51. package/formly/fields/date-range/si-formly-date-range.component.d.ts +6 -0
  52. package/formly/fields/datetime/si-formly-datetime.component.d.ts +13 -0
  53. package/formly/fields/email/si-formly-email.component.d.ts +6 -0
  54. package/formly/fields/ip-input/si-formly-ip-input.component.d.ts +6 -0
  55. package/formly/fields/number/si-formly-number.component.d.ts +6 -0
  56. package/formly/fields/password/si-formly-password.component.d.ts +6 -0
  57. package/formly/fields/select/si-formly-select.component.d.ts +6 -0
  58. package/formly/fields/text/si-formly-text-display.component.d.ts +7 -0
  59. package/formly/fields/textarea/si-formly-textarea.component.d.ts +18 -0
  60. package/formly/fields/time/si-formly-time.component.d.ts +13 -0
  61. package/formly/index.d.ts +6 -0
  62. package/formly/package.json +3 -0
  63. package/formly/si-formly-translate.extension.d.ts +11 -0
  64. package/formly/si-formly.component.d.ts +62 -0
  65. package/formly/si-formly.module.d.ts +35 -0
  66. package/formly/structural/si-formly-accordion/si-formly-accordion.component.d.ts +13 -0
  67. package/formly/structural/si-formly-array/si-formly-array.component.d.ts +6 -0
  68. package/formly/structural/si-formly-object/si-formly-object.component.d.ts +6 -0
  69. package/formly/structural/si-formly-object-grid/si-formly-object-grid.component.d.ts +22 -0
  70. package/formly/structural/si-formly-object-grid/si-formly-object-grid.model.d.ts +21 -0
  71. package/formly/structural/si-formly-object-plain/si-formly-object-plain.component.d.ts +6 -0
  72. package/formly/structural/si-formly-tabset/si-formly-object-tabset.component.d.ts +7 -0
  73. package/formly/utils.d.ts +6 -0
  74. package/formly/wrapper/si-formly-fieldset.component.d.ts +8 -0
  75. package/formly/wrapper/si-formly-form-field-provider.directive.d.ts +19 -0
  76. package/formly/wrapper/si-formly-horizontal-wrapper.component.d.ts +6 -0
  77. package/formly/wrapper/si-formly-icon-wrapper.component.d.ts +6 -0
  78. package/formly/wrapper/si-formly-wrapper.component.d.ts +8 -0
  79. package/icon/element-icons.d.ts +5 -0
  80. package/icon/si-status-icon.component.d.ts +6 -1
  81. package/list-details/index.d.ts +12 -0
  82. package/list-details/package.json +3 -0
  83. package/list-details/si-details-pane/si-details-pane.component.d.ts +8 -0
  84. package/list-details/si-details-pane-body/si-details-pane-body.component.d.ts +6 -0
  85. package/list-details/si-details-pane-footer/si-details-pane-footer.component.d.ts +6 -0
  86. package/list-details/si-details-pane-header/si-details-pane-header.component.d.ts +38 -0
  87. package/list-details/si-list-details.component.d.ts +100 -0
  88. package/list-details/si-list-pane/si-list-pane.component.d.ts +10 -0
  89. package/list-details/si-list-pane-body/si-list-pane-body.component.d.ts +6 -0
  90. package/list-details/si-list-pane-header/si-list-pane-header.component.d.ts +6 -0
  91. package/loading-spinner/si-loading-spinner.directive.d.ts +3 -2
  92. package/package.json +73 -9
  93. package/password-strength/si-password-strength.directive.d.ts +11 -0
  94. package/phone-number/index.d.ts +7 -0
  95. package/phone-number/package.json +3 -0
  96. package/phone-number/si-phone-number-input-select.directive.d.ts +10 -0
  97. package/phone-number/si-phone-number-input.component.d.ts +137 -0
  98. package/phone-number/si-phone-number-input.models.d.ts +48 -0
  99. package/phone-number/si-phone-number-input.module.d.ts +7 -0
  100. package/result-details-list/index.d.ts +7 -0
  101. package/result-details-list/package.json +3 -0
  102. package/result-details-list/si-result-details-list.component.d.ts +14 -0
  103. package/result-details-list/si-result-details-list.datamodel.d.ts +48 -0
  104. package/result-details-list/si-result-details-list.module.d.ts +7 -0
  105. package/shadow-root/index.d.ts +5 -0
  106. package/shadow-root/package.json +3 -0
  107. package/shadow-root/si-shadow-root.directive.d.ts +39 -0
  108. package/side-panel/index.d.ts +9 -0
  109. package/side-panel/package.json +3 -0
  110. package/side-panel/si-side-panel-content.component.d.ts +105 -0
  111. package/side-panel/si-side-panel.component.d.ts +108 -0
  112. package/side-panel/si-side-panel.module.d.ts +8 -0
  113. package/side-panel/si-side-panel.service.d.ts +45 -0
  114. package/side-panel/side-panel.model.d.ts +16 -0
  115. package/status-bar/index.d.ts +7 -0
  116. package/status-bar/package.json +3 -0
  117. package/status-bar/si-status-bar-item/index.d.ts +6 -0
  118. package/status-bar/si-status-bar-item/si-status-bar-item.component.d.ts +22 -0
  119. package/status-bar/si-status-bar-item/si-status-bar-item.model.d.ts +33 -0
  120. package/status-bar/si-status-bar.component.d.ts +116 -0
  121. package/status-bar/si-status-bar.module.d.ts +7 -0
  122. package/tabs-next/index.d.ts +7 -0
  123. package/tabs-next/package.json +3 -0
  124. package/tabs-next/si-tab-next-base.directive.d.ts +66 -0
  125. package/tabs-next/si-tab-next-link.component.d.ts +18 -0
  126. package/tabs-next/si-tab-next.component.d.ts +16 -0
  127. package/tabs-next/si-tabs-tokens.d.ts +7 -0
  128. package/tabs-next/si-tabset-next.component.d.ts +72 -0
  129. package/template-i18n.json +29 -0
  130. package/translate/si-translatable-keys.interface.d.ts +29 -0
  131. package/tree-view/drag-drop.util.d.ts +32 -0
  132. package/tree-view/index.d.ts +12 -0
  133. package/tree-view/package.json +3 -0
  134. package/tree-view/si-tree-view-converter.service.d.ts +41 -0
  135. package/tree-view/si-tree-view-item/si-tree-view-item.component.d.ts +105 -0
  136. package/tree-view/si-tree-view-item/si-tree-view-item.directive.d.ts +24 -0
  137. package/tree-view/si-tree-view-item-context.d.ts +11 -0
  138. package/tree-view/si-tree-view-item-height.service.d.ts +49 -0
  139. package/tree-view/si-tree-view-item-template.directive.d.ts +18 -0
  140. package/tree-view/si-tree-view-virtualization.service.d.ts +150 -0
  141. package/tree-view/si-tree-view.component.d.ts +466 -0
  142. package/tree-view/si-tree-view.model.d.ts +146 -0
  143. package/tree-view/si-tree-view.module.d.ts +10 -0
  144. package/tree-view/si-tree-view.service.d.ts +55 -0
  145. package/tree-view/si-tree-view.utils.d.ts +46 -0
@@ -0,0 +1,390 @@
1
+ import { trigger, state, transition, style, animate } from '@angular/animations';
2
+ import { NgTemplateOutlet } from '@angular/common';
3
+ import * as i0 from '@angular/core';
4
+ import { inject, ElementRef, input, computed, model, booleanAttribute, signal, ChangeDetectionStrategy, Component, viewChild } from '@angular/core';
5
+ import { areAnimationsDisabled } from '@siemens/element-ng/common';
6
+ import { ResizeObserverService, BOOTSTRAP_BREAKPOINTS } from '@siemens/element-ng/resize-observer';
7
+ import { SiSplitComponent, SiSplitPartComponent } from '@siemens/element-ng/split';
8
+ import * as i1 from '@siemens/element-translate-ng/translate';
9
+ import { SiTranslateModule } from '@siemens/element-translate-ng/translate';
10
+ import { Subject, BehaviorSubject } from 'rxjs';
11
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
12
+
13
+ /**
14
+ * Copyright Siemens 2016 - 2025.
15
+ * SPDX-License-Identifier: MIT
16
+ */
17
+ /** @experimental */
18
+ class SiListDetailsComponent {
19
+ resizeSubs;
20
+ elementRef = inject(ElementRef);
21
+ resizeObserver = inject(ResizeObserverService);
22
+ animationsGloballyDisabled = areAnimationsDisabled();
23
+ /**
24
+ * A numeric value defining the minimum width in px, which the component needs
25
+ * to be displayed in its large layout. Whenever smaller than
26
+ * this threshold, the small layout will be used. Default is
27
+ * value is BOOTSTRAP_BREAKPOINTS.mdMinimum.
28
+ *
29
+ * @defaultValue BOOTSTRAP_BREAKPOINTS.mdMinimum
30
+ */
31
+ expandBreakpoint = input(BOOTSTRAP_BREAKPOINTS.mdMinimum);
32
+ hasLargeSize = computed(() => {
33
+ const dimensions = this.resizeDimensions();
34
+ return !!dimensions && dimensions.width >= this.expandBreakpoint();
35
+ });
36
+ /**
37
+ * Whether the details are currently active or not, mostly relevant in the
38
+ * responsive scenario when the viewport only shows either the list or the detail.
39
+ *
40
+ * @defaultValue false
41
+ */
42
+ detailsActive = model(false);
43
+ /**
44
+ * Whether the list and detail parts should be resizable by a splitter or not.
45
+ * This is only supported in the 'large' scenario (when `hasLargeSize` is `true`).
46
+ * Default value is `false`.
47
+ *
48
+ * @defaultValue false
49
+ */
50
+ disableResizing = input(false, { transform: booleanAttribute });
51
+ /**
52
+ * The percentage width of the list view of the overall component width.
53
+ * Can be a number or `'default'`, which is 32%.
54
+ *
55
+ * @defaultValue 'default'
56
+ */
57
+ listWidth = model('default');
58
+ /**
59
+ * Sets the minimal width of the list component in pixel.
60
+ *
61
+ * @defaultValue 300
62
+ */
63
+ minListSize = input(300);
64
+ /**
65
+ * Sets the minimal width of the detail component in pixel.
66
+ *
67
+ * @defaultValue 300
68
+ */
69
+ minDetailsSize = input(300);
70
+ /**
71
+ * An optional stateId to uniquely identify a component instance.
72
+ * Required for persistence of ui state.
73
+ */
74
+ stateId = input();
75
+ actualListWidth = computed(() => {
76
+ const listWidth = this.listWidth();
77
+ return listWidth === 'default' ? 32 : listWidth;
78
+ });
79
+ splitSizes = computed(() => [
80
+ this.actualListWidth(),
81
+ 100 - this.actualListWidth()
82
+ ]);
83
+ /**
84
+ * The max size to limit the list view in the static flex layout (if less than 50%), otherwise not set.
85
+ * @internal
86
+ */
87
+ maxListSize = this.getMaxSize(0);
88
+ /**
89
+ * The max size to limit the details view in the static flex layout (if less than 50%), otherwise not set.
90
+ * @internal
91
+ */
92
+ maxDetailsSize = this.getMaxSize(1);
93
+ listStateId = computed(() => {
94
+ const stateId = this.stateId();
95
+ return stateId ? `${stateId}-list` : undefined;
96
+ });
97
+ detailsStateId = computed(() => {
98
+ const stateId = this.stateId();
99
+ return stateId ? `${stateId}-details` : undefined;
100
+ });
101
+ opacity = computed(() => (this.resizeDimensions() ? '' : '0'));
102
+ /** @internal */
103
+ detailsExpandedAnimation = computed(() => {
104
+ if (!this.animationsGloballyDisabled && !this.hasLargeSize()) {
105
+ return this.detailsActive() ? 'expanded' : 'collapsed';
106
+ }
107
+ else {
108
+ return 'disabled';
109
+ }
110
+ });
111
+ // Used for focus transfer, can not use a focus trap for this.
112
+ hadLargeSizePreviously;
113
+ detailsActivePreviously;
114
+ previouslyFocusedElementInList;
115
+ /** @internal */
116
+ transferFocusToList = new Subject();
117
+ /**
118
+ * A behavior subject because the details component may only be created when details are visible.
119
+ * @internal
120
+ */
121
+ transferFocusToDetails = new BehaviorSubject(false);
122
+ ngOnChanges(changes) {
123
+ if (changes.detailsActive) {
124
+ this.transferFocus();
125
+ }
126
+ }
127
+ ngOnInit() {
128
+ this.resizeSubs = this.resizeObserver
129
+ .observe(this.elementRef.nativeElement, 100, true)
130
+ .subscribe(dimensions => {
131
+ this.resizeDimensions.set(dimensions);
132
+ this.transferFocus();
133
+ });
134
+ }
135
+ ngOnDestroy() {
136
+ this.resizeSubs?.unsubscribe();
137
+ }
138
+ resizeDimensions = signal(undefined);
139
+ onSplitSizesChange(sizes) {
140
+ this.listWidth.set(sizes[0]);
141
+ }
142
+ /** @internal */
143
+ detailsBackClicked() {
144
+ this.detailsActive.set(false);
145
+ }
146
+ // Transfer focus onto child panes if they would be inaccesible.
147
+ transferFocus() {
148
+ // Check if dimensions have even been evaluated.
149
+ const hasLargeSize = this.resizeDimensions() ? this.hasLargeSize() : undefined;
150
+ const detailsActive = this.detailsActive();
151
+ if (this.hadLargeSizePreviously !== undefined && this.detailsActivePreviously !== undefined) {
152
+ if (detailsActive &&
153
+ !hasLargeSize &&
154
+ (!this.detailsActivePreviously || this.hadLargeSizePreviously)) {
155
+ if (!this.hadLargeSizePreviously) {
156
+ this.previouslyFocusedElementInList = document?.activeElement;
157
+ }
158
+ this.transferFocusToDetails.next(true);
159
+ }
160
+ if (!detailsActive && this.detailsActivePreviously) {
161
+ this.transferFocusToList.next(this.previouslyFocusedElementInList);
162
+ this.previouslyFocusedElementInList = undefined;
163
+ }
164
+ }
165
+ this.hadLargeSizePreviously = hasLargeSize;
166
+ this.detailsActivePreviously = detailsActive;
167
+ }
168
+ /**
169
+ * Get the max size to limit in the static flex layout (if less than 50%), otherwise not set
170
+ */
171
+ getMaxSize(part) {
172
+ return computed(() => !this.disableResizing() ||
173
+ this.listWidth() === 'default' ||
174
+ !this.hasLargeSize() ||
175
+ this.splitSizes()[part] > 50
176
+ ? ''
177
+ : this.splitSizes()[part] + '%');
178
+ }
179
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: SiListDetailsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
180
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.6", type: SiListDetailsComponent, isStandalone: true, selector: "si-list-details", inputs: { expandBreakpoint: { classPropertyName: "expandBreakpoint", publicName: "expandBreakpoint", isSignal: true, isRequired: false, transformFunction: null }, detailsActive: { classPropertyName: "detailsActive", publicName: "detailsActive", isSignal: true, isRequired: false, transformFunction: null }, disableResizing: { classPropertyName: "disableResizing", publicName: "disableResizing", isSignal: true, isRequired: false, transformFunction: null }, listWidth: { classPropertyName: "listWidth", publicName: "listWidth", isSignal: true, isRequired: false, transformFunction: null }, minListSize: { classPropertyName: "minListSize", publicName: "minListSize", isSignal: true, isRequired: false, transformFunction: null }, minDetailsSize: { classPropertyName: "minDetailsSize", publicName: "minDetailsSize", isSignal: true, isRequired: false, transformFunction: null }, stateId: { classPropertyName: "stateId", publicName: "stateId", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { detailsActive: "detailsActiveChange", listWidth: "listWidthChange" }, host: { properties: { "class.expanded": "hasLargeSize()", "style.opacity": "opacity()" }, classAttribute: "si-layout-inner list-details-layout d-flex flex-column" }, usesOnChanges: true, ngImport: i0, template: "@if (!disableResizing() && hasLargeSize()) {\n <si-split\n class=\"w-100 flex-grow-1\"\n orientation=\"horizontal\"\n [stateId]=\"stateId()\"\n [sizes]=\"splitSizes()\"\n (sizesChange)=\"onSplitSizesChange($event)\"\n >\n <si-split-part\n scale=\"none\"\n [showCollapseButton]=\"false\"\n [showHeader]=\"false\"\n [minSize]=\"minListSize()\"\n [stateId]=\"listStateId()\"\n >\n <ng-container *ngTemplateOutlet=\"listTemplate\" />\n </si-split-part>\n <si-split-part\n scale=\"auto\"\n [showCollapseButton]=\"false\"\n [showHeader]=\"false\"\n [minSize]=\"minDetailsSize()\"\n [stateId]=\"detailsStateId()\"\n >\n <ng-container *ngTemplateOutlet=\"detailsTemplate\" />\n </si-split-part>\n </si-split>\n} @else {\n <div\n class=\"list-details d-flex flex-row\"\n [class.gap-6]=\"hasLargeSize()\"\n [class.details-active]=\"detailsActive() && !hasLargeSize()\"\n [@detailsExpanded]=\"detailsExpandedAnimation()\"\n >\n <ng-container *ngTemplateOutlet=\"listTemplate\" />\n <ng-container *ngTemplateOutlet=\"detailsTemplate\" />\n </div>\n}\n\n<ng-template #listTemplate>\n <ng-content select=\"si-list-pane\" />\n</ng-template>\n\n<ng-template #detailsTemplate>\n <ng-content select=\"si-details-pane\" />\n</ng-template>\n", styles: [":host{display:flex;flex-direction:column;gap:16px;overflow-x:hidden}:host ::ng-deep si-split{min-block-size:0}:host ::ng-deep si-list-pane-header~si-list-pane-header{padding-block-start:0}:host .list-details{flex:1 1 0;min-block-size:0;inline-size:100%;position:relative}:host:not(.expanded) .list-details{inline-size:200%;transform-origin:top left;margin-inline-start:0}:host:not(.expanded) .list-details.details-active{margin-inline-start:-100%}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: SiSplitComponent, selector: "si-split", inputs: ["gutterSize", "orientation", "sizes", "stateId"], outputs: ["sizesChange"] }, { kind: "component", type: SiSplitPartComponent, selector: "si-split-part", inputs: ["actions", "collapseDirection", "collapseIconClass", "collapseToMinSize", "headerStatusColor", "headerStatusIconClass", "headerTemplate", "heading", "minSize", "removeContentOnCollapse", "scale", "showCollapseButton", "showHeader", "collapseLabel", "stateId", "size", "collapseOthers", "expanded"], outputs: ["collapseChanged", "stateChange"] }, { kind: "ngmodule", type: SiTranslateModule }], animations: [
181
+ trigger('detailsExpanded', [
182
+ state('collapsed', style({
183
+ marginInlineStart: '0'
184
+ })),
185
+ state('expanded', style({
186
+ marginInlineStart: '-100%'
187
+ })),
188
+ transition('collapsed <=> expanded', [animate('0.5s ease-in-out')])
189
+ ])
190
+ ], changeDetection: i0.ChangeDetectionStrategy.OnPush });
191
+ }
192
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: SiListDetailsComponent, decorators: [{
193
+ type: Component,
194
+ args: [{ selector: 'si-list-details', animations: [
195
+ trigger('detailsExpanded', [
196
+ state('collapsed', style({
197
+ marginInlineStart: '0'
198
+ })),
199
+ state('expanded', style({
200
+ marginInlineStart: '-100%'
201
+ })),
202
+ transition('collapsed <=> expanded', [animate('0.5s ease-in-out')])
203
+ ])
204
+ ], host: {
205
+ class: 'si-layout-inner list-details-layout d-flex flex-column',
206
+ '[class.expanded]': 'hasLargeSize()',
207
+ '[style.opacity]': 'opacity()'
208
+ }, changeDetection: ChangeDetectionStrategy.OnPush, imports: [NgTemplateOutlet, SiSplitComponent, SiSplitPartComponent, SiTranslateModule], template: "@if (!disableResizing() && hasLargeSize()) {\n <si-split\n class=\"w-100 flex-grow-1\"\n orientation=\"horizontal\"\n [stateId]=\"stateId()\"\n [sizes]=\"splitSizes()\"\n (sizesChange)=\"onSplitSizesChange($event)\"\n >\n <si-split-part\n scale=\"none\"\n [showCollapseButton]=\"false\"\n [showHeader]=\"false\"\n [minSize]=\"minListSize()\"\n [stateId]=\"listStateId()\"\n >\n <ng-container *ngTemplateOutlet=\"listTemplate\" />\n </si-split-part>\n <si-split-part\n scale=\"auto\"\n [showCollapseButton]=\"false\"\n [showHeader]=\"false\"\n [minSize]=\"minDetailsSize()\"\n [stateId]=\"detailsStateId()\"\n >\n <ng-container *ngTemplateOutlet=\"detailsTemplate\" />\n </si-split-part>\n </si-split>\n} @else {\n <div\n class=\"list-details d-flex flex-row\"\n [class.gap-6]=\"hasLargeSize()\"\n [class.details-active]=\"detailsActive() && !hasLargeSize()\"\n [@detailsExpanded]=\"detailsExpandedAnimation()\"\n >\n <ng-container *ngTemplateOutlet=\"listTemplate\" />\n <ng-container *ngTemplateOutlet=\"detailsTemplate\" />\n </div>\n}\n\n<ng-template #listTemplate>\n <ng-content select=\"si-list-pane\" />\n</ng-template>\n\n<ng-template #detailsTemplate>\n <ng-content select=\"si-details-pane\" />\n</ng-template>\n", styles: [":host{display:flex;flex-direction:column;gap:16px;overflow-x:hidden}:host ::ng-deep si-split{min-block-size:0}:host ::ng-deep si-list-pane-header~si-list-pane-header{padding-block-start:0}:host .list-details{flex:1 1 0;min-block-size:0;inline-size:100%;position:relative}:host:not(.expanded) .list-details{inline-size:200%;transform-origin:top left;margin-inline-start:0}:host:not(.expanded) .list-details.details-active{margin-inline-start:-100%}\n"] }]
209
+ }] });
210
+
211
+ /**
212
+ * Copyright Siemens 2016 - 2025.
213
+ * SPDX-License-Identifier: MIT
214
+ */
215
+ /** @experimental */
216
+ class SiListPaneComponent {
217
+ parent = inject(SiListDetailsComponent);
218
+ element = inject(ElementRef);
219
+ constructor() {
220
+ this.parent.transferFocusToList
221
+ .pipe(takeUntilDestroyed())
222
+ .subscribe(previouslyFocusedElement => {
223
+ // Needed so it's no longer "inert".
224
+ setTimeout(() => {
225
+ const currentlyFocused = document?.activeElement;
226
+ previouslyFocusedElement?.focus();
227
+ // If there was no previously focused element or if it couldn't be focused anymore, fall back to the focusing the list.
228
+ if (currentlyFocused === document?.activeElement) {
229
+ this.element?.nativeElement?.focus();
230
+ }
231
+ });
232
+ });
233
+ }
234
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: SiListPaneComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
235
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.0.6", type: SiListPaneComponent, isStandalone: true, selector: "si-list-pane", host: { properties: { "class.expanded": "parent.hasLargeSize()", "class.details-active": "parent.detailsActive() && !parent.hasLargeSize()", "attr.inert": "!parent.hasLargeSize() && parent.detailsActive() ? \"\" : null", "attr.tabindex": "-1", "style.max-inline-size": "parent.maxListSize()" } }, ngImport: i0, template: "<ng-content />\n", styles: [":host{flex:1;display:flex;flex-direction:column;block-size:100%;max-inline-size:100%;opacity:1;transition:opacity calc(.5s * var(--element-animations-enabled, 1)) ease-in-out}:host:not(.expanded){inline-size:100%}:host.details-active{pointer-events:none;opacity:0}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
236
+ }
237
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: SiListPaneComponent, decorators: [{
238
+ type: Component,
239
+ args: [{ selector: 'si-list-pane', host: {
240
+ '[class.expanded]': 'parent.hasLargeSize()',
241
+ '[class.details-active]': 'parent.detailsActive() && !parent.hasLargeSize()',
242
+ '[attr.inert]': '!parent.hasLargeSize() && parent.detailsActive() ? "" : null',
243
+ '[attr.tabindex]': '-1',
244
+ '[style.max-inline-size]': 'parent.maxListSize()'
245
+ }, changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-content />\n", styles: [":host{flex:1;display:flex;flex-direction:column;block-size:100%;max-inline-size:100%;opacity:1;transition:opacity calc(.5s * var(--element-animations-enabled, 1)) ease-in-out}:host:not(.expanded){inline-size:100%}:host.details-active{pointer-events:none;opacity:0}\n"] }]
246
+ }], ctorParameters: () => [] });
247
+
248
+ /**
249
+ * Copyright Siemens 2016 - 2025.
250
+ * SPDX-License-Identifier: MIT
251
+ */
252
+ /** @experimental */
253
+ class SiListPaneHeaderComponent {
254
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: SiListPaneHeaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
255
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.0.6", type: SiListPaneHeaderComponent, isStandalone: true, selector: "si-list-pane-header", ngImport: i0, template: "<ng-content />\n", styles: [":host{display:flex;flex-direction:row;justify-content:space-between;inline-size:100%;flex:none;gap:6px;padding-block:12px;padding-inline:16px}:host ::ng-deep si-menu-bar si-menu-item{block-size:auto}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
256
+ }
257
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: SiListPaneHeaderComponent, decorators: [{
258
+ type: Component,
259
+ args: [{ selector: 'si-list-pane-header', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-content />\n", styles: [":host{display:flex;flex-direction:row;justify-content:space-between;inline-size:100%;flex:none;gap:6px;padding-block:12px;padding-inline:16px}:host ::ng-deep si-menu-bar si-menu-item{block-size:auto}\n"] }]
260
+ }] });
261
+
262
+ /**
263
+ * Copyright Siemens 2016 - 2025.
264
+ * SPDX-License-Identifier: MIT
265
+ */
266
+ /** @experimental */
267
+ class SiListPaneBodyComponent {
268
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: SiListPaneBodyComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
269
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.0.6", type: SiListPaneBodyComponent, isStandalone: true, selector: "si-list-pane-body", ngImport: i0, template: "<ng-content />\n", styles: [":host{flex:1;display:flex;flex-direction:column;justify-content:space-between;max-inline-size:100%}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
270
+ }
271
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: SiListPaneBodyComponent, decorators: [{
272
+ type: Component,
273
+ args: [{ selector: 'si-list-pane-body', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-content />\n", styles: [":host{flex:1;display:flex;flex-direction:column;justify-content:space-between;max-inline-size:100%}\n"] }]
274
+ }] });
275
+
276
+ /**
277
+ * Copyright Siemens 2016 - 2025.
278
+ * SPDX-License-Identifier: MIT
279
+ */
280
+ /** @experimental */
281
+ class SiDetailsPaneComponent {
282
+ parent = inject(SiListDetailsComponent);
283
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: SiDetailsPaneComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
284
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.0.6", type: SiDetailsPaneComponent, isStandalone: true, selector: "si-details-pane", host: { properties: { "class.expanded": "parent.hasLargeSize()", "class.details-active": "parent.detailsActive() && !parent.hasLargeSize()", "attr.inert": "!parent.hasLargeSize() && !parent.detailsActive() ? \"\" : null", "style.max-inline-size": "parent.maxDetailsSize()" } }, ngImport: i0, template: "<ng-content />\n", styles: [":host{flex:1;display:flex;flex-direction:column;block-size:100%;max-inline-size:100%;pointer-events:none;opacity:0;transition:opacity calc(.5s * var(--element-animations-enabled, 1)) ease-in-out}:host:not(.expanded){inline-size:100%}:host.details-active,:host.expanded{pointer-events:auto;opacity:1}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
285
+ }
286
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: SiDetailsPaneComponent, decorators: [{
287
+ type: Component,
288
+ args: [{ selector: 'si-details-pane', imports: [], host: {
289
+ '[class.expanded]': 'parent.hasLargeSize()',
290
+ '[class.details-active]': 'parent.detailsActive() && !parent.hasLargeSize()',
291
+ '[attr.inert]': '!parent.hasLargeSize() && !parent.detailsActive() ? "" : null',
292
+ '[style.max-inline-size]': 'parent.maxDetailsSize()'
293
+ }, changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-content />\n", styles: [":host{flex:1;display:flex;flex-direction:column;block-size:100%;max-inline-size:100%;pointer-events:none;opacity:0;transition:opacity calc(.5s * var(--element-animations-enabled, 1)) ease-in-out}:host:not(.expanded){inline-size:100%}:host.details-active,:host.expanded{pointer-events:auto;opacity:1}\n"] }]
294
+ }] });
295
+
296
+ /**
297
+ * Copyright Siemens 2016 - 2025.
298
+ * SPDX-License-Identifier: MIT
299
+ */
300
+ /** @experimental */
301
+ class SiDetailsPaneHeaderComponent {
302
+ parent = inject(SiListDetailsComponent);
303
+ /**
304
+ * Optional title to be displayed.
305
+ */
306
+ title = input();
307
+ /**
308
+ * You can hide the back button in the mobile view by setting true. Required
309
+ * in add, edit workflows on mobile sizes. During add or edit, the back button
310
+ * should be hidden. Default value is `false`.
311
+ *
312
+ * @defaultValue false
313
+ */
314
+ hideBackButton = input(false, { transform: booleanAttribute });
315
+ /**
316
+ * Details back button text. Required for a11y.
317
+ *
318
+ * @defaultValue
319
+ * ```
320
+ * $localize`:@@SI_LIST_DETAILS.BACK:Back`
321
+ * ```
322
+ */
323
+ backButtonText = input($localize `:@@SI_LIST_DETAILS.BACK:Back`);
324
+ backButton = viewChild('backButton');
325
+ constructor() {
326
+ this.parent.transferFocusToDetails.pipe(takeUntilDestroyed()).subscribe(shouldFocus => {
327
+ if (shouldFocus) {
328
+ const backButton = this.backButton();
329
+ if (backButton) {
330
+ // Needed so it's no longer "inert" and loaded.
331
+ setTimeout(() => backButton?.nativeElement?.focus());
332
+ }
333
+ }
334
+ });
335
+ }
336
+ get hasLargeSize() {
337
+ return this.parent.hasLargeSize;
338
+ }
339
+ backClicked() {
340
+ this.parent.detailsBackClicked();
341
+ }
342
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: SiDetailsPaneHeaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
343
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.6", type: SiDetailsPaneHeaderComponent, isStandalone: true, selector: "si-details-pane-header", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, hideBackButton: { classPropertyName: "hideBackButton", publicName: "hideBackButton", isSignal: true, isRequired: false, transformFunction: null }, backButtonText: { classPropertyName: "backButtonText", publicName: "backButtonText", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "nav nav-tabs" }, viewQueries: [{ propertyName: "backButton", first: true, predicate: ["backButton"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"title-subgroup\">\n @if (!hasLargeSize() && !hideBackButton()) {\n <button\n #backButton\n type=\"button\"\n class=\"si-details-header-back nav-link focus-inside px-6 pe-5\"\n (click)=\"backClicked()\"\n ><span\n class=\"pe-2 d-inline-block position-relative element-back icon\"\n role=\"img\"\n aria-labelledby=\"backButton\"\n ></span\n >{{ backButtonText() | translate }}</button\n >\n }\n @if (title()) {\n <span class=\"si-details-header-title nav-link px-6 pe-5\">{{ title() | translate }}</span>\n }\n</div>\n<ng-content />\n", styles: [":host{flex:none;inline-size:100%;overflow:hidden}:host,:host .title-subgroup{display:flex;flex-direction:row;justify-content:space-between;gap:6px}:host>.nav-link,:host .title-subgroup>.nav-link{min-inline-size:auto}:host .si-details-header-title{cursor:unset;color:var(--element-text-secondary)}:host .si-details-header-title:hover{background-color:unset;border-block-end-color:transparent}:host ::ng-deep si-menu-bar si-menu-item{block-size:auto;margin-block-end:2px}\n"], dependencies: [{ kind: "ngmodule", type: SiTranslateModule }, { kind: "pipe", type: i1.SiTranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
344
+ }
345
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: SiDetailsPaneHeaderComponent, decorators: [{
346
+ type: Component,
347
+ args: [{ selector: 'si-details-pane-header', host: {
348
+ class: 'nav nav-tabs' // To allow nav-link styling.
349
+ }, imports: [SiTranslateModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"title-subgroup\">\n @if (!hasLargeSize() && !hideBackButton()) {\n <button\n #backButton\n type=\"button\"\n class=\"si-details-header-back nav-link focus-inside px-6 pe-5\"\n (click)=\"backClicked()\"\n ><span\n class=\"pe-2 d-inline-block position-relative element-back icon\"\n role=\"img\"\n aria-labelledby=\"backButton\"\n ></span\n >{{ backButtonText() | translate }}</button\n >\n }\n @if (title()) {\n <span class=\"si-details-header-title nav-link px-6 pe-5\">{{ title() | translate }}</span>\n }\n</div>\n<ng-content />\n", styles: [":host{flex:none;inline-size:100%;overflow:hidden}:host,:host .title-subgroup{display:flex;flex-direction:row;justify-content:space-between;gap:6px}:host>.nav-link,:host .title-subgroup>.nav-link{min-inline-size:auto}:host .si-details-header-title{cursor:unset;color:var(--element-text-secondary)}:host .si-details-header-title:hover{background-color:unset;border-block-end-color:transparent}:host ::ng-deep si-menu-bar si-menu-item{block-size:auto;margin-block-end:2px}\n"] }]
350
+ }], ctorParameters: () => [] });
351
+
352
+ /**
353
+ * Copyright Siemens 2016 - 2025.
354
+ * SPDX-License-Identifier: MIT
355
+ */
356
+ /** @experimental */
357
+ class SiDetailsPaneBodyComponent {
358
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: SiDetailsPaneBodyComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
359
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.0.6", type: SiDetailsPaneBodyComponent, isStandalone: true, selector: "si-details-pane-body", ngImport: i0, template: "<ng-content />\n", styles: [":host{flex:1;display:flex;flex-direction:column;justify-content:space-between;max-inline-size:100%}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
360
+ }
361
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: SiDetailsPaneBodyComponent, decorators: [{
362
+ type: Component,
363
+ args: [{ selector: 'si-details-pane-body', imports: [], changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-content />\n", styles: [":host{flex:1;display:flex;flex-direction:column;justify-content:space-between;max-inline-size:100%}\n"] }]
364
+ }] });
365
+
366
+ /**
367
+ * Copyright Siemens 2016 - 2025.
368
+ * SPDX-License-Identifier: MIT
369
+ */
370
+ /** @experimental */
371
+ class SiDetailsPaneFooterComponent {
372
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: SiDetailsPaneFooterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
373
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.0.6", type: SiDetailsPaneFooterComponent, isStandalone: true, selector: "si-details-pane-footer", ngImport: i0, template: "<ng-content />\n", styles: [":host{display:flex;flex-direction:row;flex:none;border-block-start:1px solid var(--element-ui-4);gap:16px;padding:16px}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
374
+ }
375
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: SiDetailsPaneFooterComponent, decorators: [{
376
+ type: Component,
377
+ args: [{ selector: 'si-details-pane-footer', imports: [], changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-content />\n", styles: [":host{display:flex;flex-direction:row;flex:none;border-block-start:1px solid var(--element-ui-4);gap:16px;padding:16px}\n"] }]
378
+ }] });
379
+
380
+ /**
381
+ * Copyright Siemens 2016 - 2025.
382
+ * SPDX-License-Identifier: MIT
383
+ */
384
+
385
+ /**
386
+ * Generated bundle index. Do not edit.
387
+ */
388
+
389
+ export { SiDetailsPaneBodyComponent, SiDetailsPaneComponent, SiDetailsPaneFooterComponent, SiDetailsPaneHeaderComponent, SiListDetailsComponent, SiListPaneBodyComponent, SiListPaneComponent, SiListPaneHeaderComponent };
390
+ //# sourceMappingURL=siemens-element-ng-list-details.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"siemens-element-ng-list-details.mjs","sources":["../../../../projects/element-ng/list-details/si-list-details.component.ts","../../../../projects/element-ng/list-details/si-list-details.component.html","../../../../projects/element-ng/list-details/si-list-pane/si-list-pane.component.ts","../../../../projects/element-ng/list-details/si-list-pane/si-list-pane.component.html","../../../../projects/element-ng/list-details/si-list-pane-header/si-list-pane-header.component.ts","../../../../projects/element-ng/list-details/si-list-pane-header/si-list-pane-header.component.html","../../../../projects/element-ng/list-details/si-list-pane-body/si-list-pane-body.component.ts","../../../../projects/element-ng/list-details/si-list-pane-body/si-list-pane-body.component.html","../../../../projects/element-ng/list-details/si-details-pane/si-details-pane.component.ts","../../../../projects/element-ng/list-details/si-details-pane/si-details-pane.component.html","../../../../projects/element-ng/list-details/si-details-pane-header/si-details-pane-header.component.ts","../../../../projects/element-ng/list-details/si-details-pane-header/si-details-pane-header.component.html","../../../../projects/element-ng/list-details/si-details-pane-body/si-details-pane-body.component.ts","../../../../projects/element-ng/list-details/si-details-pane-body/si-details-pane-body.component.html","../../../../projects/element-ng/list-details/si-details-pane-footer/si-details-pane-footer.component.ts","../../../../projects/element-ng/list-details/si-details-pane-footer/si-details-pane-footer.component.html","../../../../projects/element-ng/list-details/index.ts","../../../../projects/element-ng/list-details/siemens-element-ng-list-details.ts"],"sourcesContent":["/**\n * Copyright Siemens 2016 - 2025.\n * SPDX-License-Identifier: MIT\n */\nimport { animate, state, style, transition, trigger } from '@angular/animations';\nimport { NgTemplateOutlet } from '@angular/common';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n inject,\n input,\n model,\n OnChanges,\n OnDestroy,\n OnInit,\n Signal,\n signal,\n SimpleChanges\n} from '@angular/core';\nimport { areAnimationsDisabled } from '@siemens/element-ng/common';\nimport {\n BOOTSTRAP_BREAKPOINTS,\n ElementDimensions,\n ResizeObserverService\n} from '@siemens/element-ng/resize-observer';\nimport { SiSplitComponent, SiSplitPartComponent } from '@siemens/element-ng/split';\nimport { SiTranslateModule } from '@siemens/element-translate-ng/translate';\nimport { BehaviorSubject, Subject, Subscription } from 'rxjs';\n\n/** @experimental */\n@Component({\n selector: 'si-list-details',\n templateUrl: './si-list-details.component.html',\n styleUrl: './si-list-details.component.scss',\n animations: [\n trigger('detailsExpanded', [\n state(\n 'collapsed',\n style({\n marginInlineStart: '0'\n })\n ),\n state(\n 'expanded',\n style({\n marginInlineStart: '-100%'\n })\n ),\n transition('collapsed <=> expanded', [animate('0.5s ease-in-out')])\n ])\n ],\n host: {\n class: 'si-layout-inner list-details-layout d-flex flex-column',\n '[class.expanded]': 'hasLargeSize()',\n '[style.opacity]': 'opacity()'\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgTemplateOutlet, SiSplitComponent, SiSplitPartComponent, SiTranslateModule]\n})\nexport class SiListDetailsComponent implements OnInit, OnChanges, OnDestroy {\n private resizeSubs?: Subscription;\n private elementRef = inject(ElementRef);\n private resizeObserver = inject(ResizeObserverService);\n private readonly animationsGloballyDisabled = areAnimationsDisabled();\n\n /**\n * A numeric value defining the minimum width in px, which the component needs\n * to be displayed in its large layout. Whenever smaller than\n * this threshold, the small layout will be used. Default is\n * value is BOOTSTRAP_BREAKPOINTS.mdMinimum.\n *\n * @defaultValue BOOTSTRAP_BREAKPOINTS.mdMinimum\n */\n readonly expandBreakpoint = input(BOOTSTRAP_BREAKPOINTS.mdMinimum);\n\n readonly hasLargeSize = computed(() => {\n const dimensions = this.resizeDimensions();\n return !!dimensions && dimensions.width >= this.expandBreakpoint();\n });\n\n /**\n * Whether the details are currently active or not, mostly relevant in the\n * responsive scenario when the viewport only shows either the list or the detail.\n *\n * @defaultValue false\n */\n readonly detailsActive = model(false);\n\n /**\n * Whether the list and detail parts should be resizable by a splitter or not.\n * This is only supported in the 'large' scenario (when `hasLargeSize` is `true`).\n * Default value is `false`.\n *\n * @defaultValue false\n */\n readonly disableResizing = input(false, { transform: booleanAttribute });\n\n /**\n * The percentage width of the list view of the overall component width.\n * Can be a number or `'default'`, which is 32%.\n *\n * @defaultValue 'default'\n */\n readonly listWidth = model<number | 'default'>('default');\n\n /**\n * Sets the minimal width of the list component in pixel.\n *\n * @defaultValue 300\n */\n readonly minListSize = input(300);\n\n /**\n * Sets the minimal width of the detail component in pixel.\n *\n * @defaultValue 300\n */\n readonly minDetailsSize = input(300);\n\n /**\n * An optional stateId to uniquely identify a component instance.\n * Required for persistence of ui state.\n */\n readonly stateId = input<string>();\n\n private readonly actualListWidth = computed(() => {\n const listWidth = this.listWidth();\n return listWidth === 'default' ? 32 : listWidth;\n });\n\n protected readonly splitSizes = computed<[number, number]>(() => [\n this.actualListWidth(),\n 100 - this.actualListWidth()\n ]);\n /**\n * The max size to limit the list view in the static flex layout (if less than 50%), otherwise not set.\n * @internal\n */\n readonly maxListSize = this.getMaxSize(0);\n /**\n * The max size to limit the details view in the static flex layout (if less than 50%), otherwise not set.\n * @internal\n */\n readonly maxDetailsSize = this.getMaxSize(1);\n\n protected readonly listStateId = computed(() => {\n const stateId = this.stateId();\n return stateId ? `${stateId}-list` : undefined;\n });\n\n protected readonly detailsStateId = computed(() => {\n const stateId = this.stateId();\n return stateId ? `${stateId}-details` : undefined;\n });\n\n protected readonly opacity = computed(() => (this.resizeDimensions() ? '' : '0'));\n\n /** @internal */\n readonly detailsExpandedAnimation = computed(() => {\n if (!this.animationsGloballyDisabled && !this.hasLargeSize()) {\n return this.detailsActive() ? 'expanded' : 'collapsed';\n } else {\n return 'disabled';\n }\n });\n\n // Used for focus transfer, can not use a focus trap for this.\n private hadLargeSizePreviously: boolean | undefined;\n private detailsActivePreviously: boolean | undefined;\n private previouslyFocusedElementInList: HTMLElement | undefined;\n\n /** @internal */\n readonly transferFocusToList = new Subject<HTMLElement | undefined>();\n /**\n * A behavior subject because the details component may only be created when details are visible.\n * @internal\n */\n readonly transferFocusToDetails = new BehaviorSubject<boolean>(false);\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.detailsActive) {\n this.transferFocus();\n }\n }\n\n ngOnInit(): void {\n this.resizeSubs = this.resizeObserver\n .observe(this.elementRef.nativeElement, 100, true)\n .subscribe(dimensions => {\n this.resizeDimensions.set(dimensions);\n this.transferFocus();\n });\n }\n\n ngOnDestroy(): void {\n this.resizeSubs?.unsubscribe();\n }\n\n private readonly resizeDimensions = signal<ElementDimensions | undefined>(undefined);\n\n protected onSplitSizesChange(sizes: number[]): void {\n this.listWidth.set(sizes[0]);\n }\n\n /** @internal */\n detailsBackClicked(): void {\n this.detailsActive.set(false);\n }\n\n // Transfer focus onto child panes if they would be inaccesible.\n private transferFocus(): void {\n // Check if dimensions have even been evaluated.\n const hasLargeSize = this.resizeDimensions() ? this.hasLargeSize() : undefined;\n const detailsActive = this.detailsActive();\n if (this.hadLargeSizePreviously !== undefined && this.detailsActivePreviously !== undefined) {\n if (\n detailsActive &&\n !hasLargeSize &&\n (!this.detailsActivePreviously || this.hadLargeSizePreviously)\n ) {\n if (!this.hadLargeSizePreviously) {\n this.previouslyFocusedElementInList = document?.activeElement as HTMLElement | undefined;\n }\n this.transferFocusToDetails.next(true);\n }\n if (!detailsActive && this.detailsActivePreviously) {\n this.transferFocusToList.next(this.previouslyFocusedElementInList);\n this.previouslyFocusedElementInList = undefined;\n }\n }\n this.hadLargeSizePreviously = hasLargeSize;\n this.detailsActivePreviously = detailsActive;\n }\n\n /**\n * Get the max size to limit in the static flex layout (if less than 50%), otherwise not set\n */\n private getMaxSize(part: 0 | 1): Signal<string> {\n return computed(() =>\n !this.disableResizing() ||\n this.listWidth() === 'default' ||\n !this.hasLargeSize() ||\n this.splitSizes()[part] > 50\n ? ''\n : this.splitSizes()[part] + '%'\n );\n }\n}\n","@if (!disableResizing() && hasLargeSize()) {\n <si-split\n class=\"w-100 flex-grow-1\"\n orientation=\"horizontal\"\n [stateId]=\"stateId()\"\n [sizes]=\"splitSizes()\"\n (sizesChange)=\"onSplitSizesChange($event)\"\n >\n <si-split-part\n scale=\"none\"\n [showCollapseButton]=\"false\"\n [showHeader]=\"false\"\n [minSize]=\"minListSize()\"\n [stateId]=\"listStateId()\"\n >\n <ng-container *ngTemplateOutlet=\"listTemplate\" />\n </si-split-part>\n <si-split-part\n scale=\"auto\"\n [showCollapseButton]=\"false\"\n [showHeader]=\"false\"\n [minSize]=\"minDetailsSize()\"\n [stateId]=\"detailsStateId()\"\n >\n <ng-container *ngTemplateOutlet=\"detailsTemplate\" />\n </si-split-part>\n </si-split>\n} @else {\n <div\n class=\"list-details d-flex flex-row\"\n [class.gap-6]=\"hasLargeSize()\"\n [class.details-active]=\"detailsActive() && !hasLargeSize()\"\n [@detailsExpanded]=\"detailsExpandedAnimation()\"\n >\n <ng-container *ngTemplateOutlet=\"listTemplate\" />\n <ng-container *ngTemplateOutlet=\"detailsTemplate\" />\n </div>\n}\n\n<ng-template #listTemplate>\n <ng-content select=\"si-list-pane\" />\n</ng-template>\n\n<ng-template #detailsTemplate>\n <ng-content select=\"si-details-pane\" />\n</ng-template>\n","/**\n * Copyright Siemens 2016 - 2025.\n * SPDX-License-Identifier: MIT\n */\nimport { ChangeDetectionStrategy, Component, ElementRef, inject } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\nimport { SiListDetailsComponent } from '../si-list-details.component';\n\n/** @experimental */\n@Component({\n selector: 'si-list-pane',\n templateUrl: './si-list-pane.component.html',\n styleUrl: './si-list-pane.component.scss',\n host: {\n '[class.expanded]': 'parent.hasLargeSize()',\n '[class.details-active]': 'parent.detailsActive() && !parent.hasLargeSize()',\n '[attr.inert]': '!parent.hasLargeSize() && parent.detailsActive() ? \"\" : null',\n '[attr.tabindex]': '-1',\n '[style.max-inline-size]': 'parent.maxListSize()'\n },\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class SiListPaneComponent {\n protected parent = inject(SiListDetailsComponent);\n private element: ElementRef<HTMLElement> = inject(ElementRef);\n\n constructor() {\n this.parent.transferFocusToList\n .pipe(takeUntilDestroyed())\n .subscribe(previouslyFocusedElement => {\n // Needed so it's no longer \"inert\".\n setTimeout(() => {\n const currentlyFocused = document?.activeElement;\n previouslyFocusedElement?.focus();\n // If there was no previously focused element or if it couldn't be focused anymore, fall back to the focusing the list.\n if (currentlyFocused === document?.activeElement) {\n this.element?.nativeElement?.focus();\n }\n });\n });\n }\n}\n","<ng-content />\n","/**\n * Copyright Siemens 2016 - 2025.\n * SPDX-License-Identifier: MIT\n */\nimport { ChangeDetectionStrategy, Component } from '@angular/core';\n\n/** @experimental */\n@Component({\n selector: 'si-list-pane-header',\n templateUrl: './si-list-pane-header.component.html',\n styleUrl: './si-list-pane-header.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class SiListPaneHeaderComponent {}\n","<ng-content />\n","/**\n * Copyright Siemens 2016 - 2025.\n * SPDX-License-Identifier: MIT\n */\nimport { ChangeDetectionStrategy, Component } from '@angular/core';\n\n/** @experimental */\n@Component({\n selector: 'si-list-pane-body',\n templateUrl: './si-list-pane-body.component.html',\n styleUrl: './si-list-pane-body.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class SiListPaneBodyComponent {}\n","<ng-content />\n","/**\n * Copyright Siemens 2016 - 2025.\n * SPDX-License-Identifier: MIT\n */\nimport { ChangeDetectionStrategy, Component, inject } from '@angular/core';\n\nimport { SiListDetailsComponent } from '../si-list-details.component';\n\n/** @experimental */\n@Component({\n selector: 'si-details-pane',\n imports: [],\n templateUrl: './si-details-pane.component.html',\n styleUrl: './si-details-pane.component.scss',\n host: {\n '[class.expanded]': 'parent.hasLargeSize()',\n '[class.details-active]': 'parent.detailsActive() && !parent.hasLargeSize()',\n '[attr.inert]': '!parent.hasLargeSize() && !parent.detailsActive() ? \"\" : null',\n '[style.max-inline-size]': 'parent.maxDetailsSize()'\n },\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class SiDetailsPaneComponent {\n protected parent = inject(SiListDetailsComponent);\n}\n","<ng-content />\n","/**\n * Copyright Siemens 2016 - 2025.\n * SPDX-License-Identifier: MIT\n */\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n inject,\n input,\n Signal,\n viewChild\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { SiTranslateModule, TranslatableString } from '@siemens/element-translate-ng/translate';\n\nimport { SiListDetailsComponent } from '../si-list-details.component';\n\n/** @experimental */\n@Component({\n selector: 'si-details-pane-header',\n host: {\n class: 'nav nav-tabs' // To allow nav-link styling.\n },\n imports: [SiTranslateModule],\n templateUrl: './si-details-pane-header.component.html',\n styleUrl: './si-details-pane-header.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class SiDetailsPaneHeaderComponent {\n private parent = inject(SiListDetailsComponent);\n\n /**\n * Optional title to be displayed.\n */\n readonly title = input<TranslatableString>();\n\n /**\n * You can hide the back button in the mobile view by setting true. Required\n * in add, edit workflows on mobile sizes. During add or edit, the back button\n * should be hidden. Default value is `false`.\n *\n * @defaultValue false\n */\n readonly hideBackButton = input(false, { transform: booleanAttribute });\n\n /**\n * Details back button text. Required for a11y.\n *\n * @defaultValue\n * ```\n * $localize`:@@SI_LIST_DETAILS.BACK:Back`\n * ```\n */\n readonly backButtonText = input($localize`:@@SI_LIST_DETAILS.BACK:Back`);\n\n private readonly backButton = viewChild<ElementRef<HTMLElement>>('backButton');\n\n constructor() {\n this.parent.transferFocusToDetails.pipe(takeUntilDestroyed()).subscribe(shouldFocus => {\n if (shouldFocus) {\n const backButton = this.backButton();\n if (backButton) {\n // Needed so it's no longer \"inert\" and loaded.\n setTimeout(() => backButton?.nativeElement?.focus());\n }\n }\n });\n }\n\n protected get hasLargeSize(): Signal<boolean> {\n return this.parent.hasLargeSize;\n }\n\n protected backClicked(): void {\n this.parent.detailsBackClicked();\n }\n}\n","<div class=\"title-subgroup\">\n @if (!hasLargeSize() && !hideBackButton()) {\n <button\n #backButton\n type=\"button\"\n class=\"si-details-header-back nav-link focus-inside px-6 pe-5\"\n (click)=\"backClicked()\"\n ><span\n class=\"pe-2 d-inline-block position-relative element-back icon\"\n role=\"img\"\n aria-labelledby=\"backButton\"\n ></span\n >{{ backButtonText() | translate }}</button\n >\n }\n @if (title()) {\n <span class=\"si-details-header-title nav-link px-6 pe-5\">{{ title() | translate }}</span>\n }\n</div>\n<ng-content />\n","/**\n * Copyright Siemens 2016 - 2025.\n * SPDX-License-Identifier: MIT\n */\nimport { ChangeDetectionStrategy, Component } from '@angular/core';\n\n/** @experimental */\n@Component({\n selector: 'si-details-pane-body',\n imports: [],\n templateUrl: './si-details-pane-body.component.html',\n styleUrl: './si-details-pane-body.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class SiDetailsPaneBodyComponent {}\n","<ng-content />\n","/**\n * Copyright Siemens 2016 - 2025.\n * SPDX-License-Identifier: MIT\n */\nimport { ChangeDetectionStrategy, Component } from '@angular/core';\n\n/** @experimental */\n@Component({\n selector: 'si-details-pane-footer',\n imports: [],\n templateUrl: './si-details-pane-footer.component.html',\n styleUrl: './si-details-pane-footer.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class SiDetailsPaneFooterComponent {}\n","<ng-content />\n","/**\n * Copyright Siemens 2016 - 2025.\n * SPDX-License-Identifier: MIT\n */\nexport * from './si-list-details.component';\nexport * from './si-list-pane/si-list-pane.component';\nexport * from './si-list-pane-header/si-list-pane-header.component';\nexport * from './si-list-pane-body/si-list-pane-body.component';\nexport * from './si-details-pane/si-details-pane.component';\nexport * from './si-details-pane-header/si-details-pane-header.component';\nexport * from './si-details-pane-body/si-details-pane-body.component';\nexport * from './si-details-pane-footer/si-details-pane-footer.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { NgClass } from '@angular/common';
2
2
  import * as i0 from '@angular/core';
3
- import { InjectionToken, input, inject, HostBinding, ChangeDetectionStrategy, Component, booleanAttribute, ElementRef, ApplicationRef, computed, Injector, Directive, Injectable, NgModule } from '@angular/core';
3
+ import { InjectionToken, input, inject, HostBinding, ChangeDetectionStrategy, Component, booleanAttribute, ElementRef, ViewContainerRef, computed, Injector, Directive, Injectable, NgModule } from '@angular/core';
4
4
  import * as i1 from '@siemens/element-translate-ng/translate';
5
5
  import { SiTranslateModule } from '@siemens/element-translate-ng/translate';
6
6
  import { trigger, transition, style, animate } from '@angular/animations';
@@ -126,27 +126,29 @@ class SiLoadingSpinnerDirective {
126
126
  */
127
127
  initialDelay = input(true, { transform: booleanAttribute });
128
128
  el = inject(ElementRef);
129
- appRef = inject(ApplicationRef);
129
+ viewRef = inject(ViewContainerRef);
130
130
  sub;
131
131
  progressSubject = new BehaviorSubject(false);
132
132
  off$ = this.progressSubject.pipe(filter(val => !val));
133
133
  on$ = this.progressSubject.pipe(filter(val => val));
134
134
  initialWaitTime = computed(() => (this.initialDelay() ? 500 : 0));
135
135
  minSpinTime = 500;
136
- compPortal = new ComponentPortal(SiLoadingSpinnerComponent);
137
- // this makes sure the spinner only displays with a delay of 500ms and stays for 500ms so
138
- // that it doesn't flicker
139
- spinner$ = this.on$.pipe(switchMap(() => merge(timer(this.initialWaitTime()).pipe(map(() => true), takeUntil(this.off$)), combineLatest([this.off$, timer(this.initialWaitTime() + this.minSpinTime)]).pipe(map(() => false)))));
140
- createPortal() {
141
- const providers = [
142
- { provide: LOADING_SPINNER_BLOCKING, useValue: this.blocking() },
136
+ portalOutlet;
137
+ compPortal = new ComponentPortal(SiLoadingSpinnerComponent, this.viewRef, Injector.create({
138
+ providers: [
139
+ { provide: LOADING_SPINNER_BLOCKING, useFactory: () => this.blocking() },
143
140
  {
144
141
  provide: LOADING_SPINNER_OVERLAY,
145
142
  useValue: true
146
143
  }
147
- ];
148
- const outlet = new DomPortalOutlet(this.el.nativeElement, undefined, this.appRef, Injector.create({ providers }));
149
- this.compPortal.attach(outlet);
144
+ ]
145
+ }));
146
+ // this makes sure the spinner only displays with a delay of 500ms and stays for 500ms so
147
+ // that it doesn't flicker
148
+ spinner$ = this.on$.pipe(switchMap(() => merge(timer(this.initialWaitTime()).pipe(map(() => true), takeUntil(this.off$)), combineLatest([this.off$, timer(this.initialWaitTime() + this.minSpinTime)]).pipe(map(() => false)))));
149
+ createPortal() {
150
+ this.portalOutlet ??= new DomPortalOutlet(this.el.nativeElement);
151
+ this.compPortal.attach(this.portalOutlet);
150
152
  }
151
153
  ngOnInit() {
152
154
  this.sub = this.spinner$.subscribe(val => {
@@ -171,6 +173,7 @@ class SiLoadingSpinnerDirective {
171
173
  if (this.compPortal.isAttached) {
172
174
  this.compPortal.detach();
173
175
  }
176
+ this.portalOutlet?.dispose();
174
177
  }
175
178
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: SiLoadingSpinnerDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
176
179
  static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "19.0.6", type: SiLoadingSpinnerDirective, isStandalone: true, selector: "[siLoading]", inputs: { siLoading: { classPropertyName: "siLoading", publicName: "siLoading", isSignal: true, isRequired: true, transformFunction: null }, blocking: { classPropertyName: "blocking", publicName: "blocking", isSignal: true, isRequired: false, transformFunction: null }, initialDelay: { classPropertyName: "initialDelay", publicName: "initialDelay", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "position-relative" }, usesOnChanges: true, ngImport: i0 });