@siemens/element-ng 47.3.0 → 47.4.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 (177) hide show
  1. package/badge/si-badge.component.d.ts +1 -1
  2. package/breadcrumb/breadcrumb-item.model.d.ts +36 -0
  3. package/breadcrumb/index.d.ts +7 -0
  4. package/breadcrumb/package.json +3 -0
  5. package/breadcrumb/si-breadcrumb-item-template.directive.d.ts +10 -0
  6. package/breadcrumb/si-breadcrumb.component.d.ts +46 -0
  7. package/breadcrumb/si-breadcrumb.module.d.ts +7 -0
  8. package/card/index.d.ts +6 -0
  9. package/card/package.json +3 -0
  10. package/card/si-card.component.d.ts +79 -0
  11. package/card/si-card.module.d.ts +7 -0
  12. package/circle-status/index.d.ts +6 -0
  13. package/circle-status/package.json +3 -0
  14. package/circle-status/si-circle-status.component.d.ts +66 -0
  15. package/circle-status/si-circle-status.module.d.ts +7 -0
  16. package/column-selection-dialog/column-selection-editor/si-column-selection-editor.component.d.ts +23 -0
  17. package/column-selection-dialog/index.d.ts +6 -0
  18. package/column-selection-dialog/package.json +3 -0
  19. package/column-selection-dialog/si-column-selection-dialog.component.d.ts +114 -0
  20. package/column-selection-dialog/si-column-selection-dialog.service.d.ts +20 -0
  21. package/column-selection-dialog/si-column-selection-dialog.types.d.ts +68 -0
  22. package/common/models/status-type.model.d.ts +2 -2
  23. package/date-range-filter/index.d.ts +8 -0
  24. package/date-range-filter/package.json +3 -0
  25. package/date-range-filter/si-date-range-calculation.service.d.ts +33 -0
  26. package/date-range-filter/si-date-range-filter.component.d.ts +248 -0
  27. package/date-range-filter/si-date-range-filter.module.d.ts +7 -0
  28. package/date-range-filter/si-date-range-filter.types.d.ts +40 -0
  29. package/date-range-filter/si-relative-date.component.d.ts +31 -0
  30. package/datepicker/components/si-calendar-body.component.d.ts +137 -0
  31. package/datepicker/components/si-calendar-date-cell.directive.d.ts +16 -0
  32. package/datepicker/components/si-calendar-direction-button.component.d.ts +18 -0
  33. package/datepicker/components/si-compare-adapter.d.ts +37 -0
  34. package/datepicker/components/si-day-selection.component.d.ts +76 -0
  35. package/datepicker/components/si-initial-focus.component.d.ts +74 -0
  36. package/datepicker/components/si-month-selection.component.d.ts +62 -0
  37. package/datepicker/components/si-year-selection.component.d.ts +65 -0
  38. package/datepicker/date-time-helper.d.ts +302 -0
  39. package/datepicker/index.d.ts +15 -0
  40. package/datepicker/package.json +3 -0
  41. package/datepicker/si-calendar-button.component.d.ts +49 -0
  42. package/datepicker/si-date-input.directive.d.ts +114 -0
  43. package/datepicker/si-date-range.component.d.ts +150 -0
  44. package/datepicker/si-datepicker-overlay.component.d.ts +82 -0
  45. package/datepicker/si-datepicker-overlay.directive.d.ts +104 -0
  46. package/datepicker/si-datepicker.component.d.ts +228 -0
  47. package/datepicker/si-datepicker.directive.d.ts +62 -0
  48. package/datepicker/si-datepicker.model.d.ts +129 -0
  49. package/datepicker/si-datepicker.module.d.ts +12 -0
  50. package/datepicker/si-timepicker.component.d.ts +214 -0
  51. package/electron-titlebar/electron.helpers.d.ts +5 -0
  52. package/electron-titlebar/index.d.ts +7 -0
  53. package/electron-titlebar/package.json +3 -0
  54. package/electron-titlebar/si-electron-titlebar.component.d.ts +72 -0
  55. package/electron-titlebar/si-electron-titlebar.module.d.ts +7 -0
  56. package/fesm2022/siemens-element-ng-badge.mjs.map +1 -1
  57. package/fesm2022/siemens-element-ng-breadcrumb.mjs +302 -0
  58. package/fesm2022/siemens-element-ng-breadcrumb.mjs.map +1 -0
  59. package/fesm2022/siemens-element-ng-card.mjs +122 -0
  60. package/fesm2022/siemens-element-ng-card.mjs.map +1 -0
  61. package/fesm2022/siemens-element-ng-circle-status.mjs +146 -0
  62. package/fesm2022/siemens-element-ng-circle-status.mjs.map +1 -0
  63. package/fesm2022/siemens-element-ng-column-selection-dialog.mjs +369 -0
  64. package/fesm2022/siemens-element-ng-column-selection-dialog.mjs.map +1 -0
  65. package/fesm2022/siemens-element-ng-common.mjs.map +1 -1
  66. package/fesm2022/siemens-element-ng-date-range-filter.mjs +649 -0
  67. package/fesm2022/siemens-element-ng-date-range-filter.mjs.map +1 -0
  68. package/fesm2022/siemens-element-ng-datepicker.mjs +4231 -0
  69. package/fesm2022/siemens-element-ng-datepicker.mjs.map +1 -0
  70. package/fesm2022/siemens-element-ng-electron-titlebar.mjs +142 -0
  71. package/fesm2022/siemens-element-ng-electron-titlebar.mjs.map +1 -0
  72. package/fesm2022/siemens-element-ng-file-uploader.mjs +751 -0
  73. package/fesm2022/siemens-element-ng-file-uploader.mjs.map +1 -0
  74. package/fesm2022/siemens-element-ng-filter-bar.mjs +153 -0
  75. package/fesm2022/siemens-element-ng-filter-bar.mjs.map +1 -0
  76. package/fesm2022/siemens-element-ng-icon.mjs +11 -1
  77. package/fesm2022/siemens-element-ng-icon.mjs.map +1 -1
  78. package/fesm2022/siemens-element-ng-info-page.mjs +63 -0
  79. package/fesm2022/siemens-element-ng-info-page.mjs.map +1 -0
  80. package/fesm2022/siemens-element-ng-inline-notification.mjs +4 -6
  81. package/fesm2022/siemens-element-ng-inline-notification.mjs.map +1 -1
  82. package/fesm2022/siemens-element-ng-ip-input.mjs +451 -0
  83. package/fesm2022/siemens-element-ng-ip-input.mjs.map +1 -0
  84. package/fesm2022/siemens-element-ng-localization.mjs +306 -0
  85. package/fesm2022/siemens-element-ng-localization.mjs.map +1 -0
  86. package/fesm2022/siemens-element-ng-photo-upload.mjs +480 -0
  87. package/fesm2022/siemens-element-ng-photo-upload.mjs.map +1 -0
  88. package/fesm2022/siemens-element-ng-search-bar.mjs +193 -0
  89. package/fesm2022/siemens-element-ng-search-bar.mjs.map +1 -0
  90. package/fesm2022/siemens-element-ng-slider.mjs +313 -0
  91. package/fesm2022/siemens-element-ng-slider.mjs.map +1 -0
  92. package/fesm2022/siemens-element-ng-sort-bar.mjs +89 -0
  93. package/fesm2022/siemens-element-ng-sort-bar.mjs.map +1 -0
  94. package/fesm2022/siemens-element-ng-split.mjs +575 -0
  95. package/fesm2022/siemens-element-ng-split.mjs.map +1 -0
  96. package/fesm2022/siemens-element-ng-status-toggle.mjs +196 -0
  97. package/fesm2022/siemens-element-ng-status-toggle.mjs.map +1 -0
  98. package/fesm2022/siemens-element-ng-system-banner.mjs +47 -0
  99. package/fesm2022/siemens-element-ng-system-banner.mjs.map +1 -0
  100. package/fesm2022/siemens-element-ng-tabs.mjs +395 -0
  101. package/fesm2022/siemens-element-ng-tabs.mjs.map +1 -0
  102. package/fesm2022/siemens-element-ng-translate.mjs.map +1 -1
  103. package/fesm2022/siemens-element-ng-unauthorized-page.mjs +76 -0
  104. package/fesm2022/siemens-element-ng-unauthorized-page.mjs.map +1 -0
  105. package/file-uploader/index.d.ts +8 -0
  106. package/file-uploader/package.json +3 -0
  107. package/file-uploader/si-file-dropzone.component.d.ts +106 -0
  108. package/file-uploader/si-file-uploader.component.d.ts +296 -0
  109. package/file-uploader/si-file-uploader.model.d.ts +12 -0
  110. package/file-uploader/si-file-uploader.module.d.ts +8 -0
  111. package/filter-bar/filter.d.ts +26 -0
  112. package/filter-bar/index.d.ts +8 -0
  113. package/filter-bar/package.json +3 -0
  114. package/filter-bar/si-filter-bar.component.d.ts +65 -0
  115. package/filter-bar/si-filter-bar.module.d.ts +7 -0
  116. package/filter-bar/si-filter-pill.component.d.ts +20 -0
  117. package/icon/element-icons.d.ts +10 -0
  118. package/info-page/index.d.ts +5 -0
  119. package/info-page/package.json +3 -0
  120. package/info-page/si-info-page.component.d.ts +38 -0
  121. package/inline-notification/si-inline-notification.component.d.ts +0 -2
  122. package/ip-input/address-utils.d.ts +28 -0
  123. package/ip-input/address-validators.d.ts +21 -0
  124. package/ip-input/index.d.ts +7 -0
  125. package/ip-input/package.json +3 -0
  126. package/ip-input/si-ip-input.directive.d.ts +53 -0
  127. package/ip-input/si-ip4-input.directive.d.ts +9 -0
  128. package/ip-input/si-ip6-input.directive.d.ts +10 -0
  129. package/localization/index.d.ts +8 -0
  130. package/localization/package.json +3 -0
  131. package/localization/si-directionality.d.ts +41 -0
  132. package/localization/si-locale-id.d.ts +22 -0
  133. package/localization/si-locale-store.d.ts +16 -0
  134. package/localization/si-locale.service.d.ts +73 -0
  135. package/package.json +91 -3
  136. package/photo-upload/index.d.ts +6 -0
  137. package/photo-upload/package.json +3 -0
  138. package/photo-upload/si-image-cropper-style.component.d.ts +5 -0
  139. package/photo-upload/si-photo-upload.component.d.ts +298 -0
  140. package/search-bar/index.d.ts +6 -0
  141. package/search-bar/package.json +3 -0
  142. package/search-bar/si-search-bar.component.d.ts +87 -0
  143. package/search-bar/si-search-bar.module.d.ts +7 -0
  144. package/slider/index.d.ts +6 -0
  145. package/slider/package.json +3 -0
  146. package/slider/si-slider.component.d.ts +129 -0
  147. package/slider/si-slider.module.d.ts +7 -0
  148. package/sort-bar/index.d.ts +6 -0
  149. package/sort-bar/package.json +3 -0
  150. package/sort-bar/si-sort-bar.component.d.ts +42 -0
  151. package/sort-bar/si-sort-bar.module.d.ts +7 -0
  152. package/split/index.d.ts +8 -0
  153. package/split/package.json +3 -0
  154. package/split/si-split-part.component.d.ts +154 -0
  155. package/split/si-split.component.d.ts +48 -0
  156. package/split/si-split.interfaces.d.ts +17 -0
  157. package/split/si-split.module.d.ts +8 -0
  158. package/status-toggle/index.d.ts +6 -0
  159. package/status-toggle/package.json +3 -0
  160. package/status-toggle/si-status-toggle.component.d.ts +54 -0
  161. package/status-toggle/status-toggle.model.d.ts +26 -0
  162. package/system-banner/index.d.ts +5 -0
  163. package/system-banner/package.json +3 -0
  164. package/system-banner/system-banner.component.d.ts +23 -0
  165. package/tabs/index.d.ts +7 -0
  166. package/tabs/package.json +3 -0
  167. package/tabs/si-tab/index.d.ts +5 -0
  168. package/tabs/si-tab/si-tab.component.d.ts +58 -0
  169. package/tabs/si-tabs.module.d.ts +8 -0
  170. package/tabs/si-tabset/index.d.ts +5 -0
  171. package/tabs/si-tabset/si-tabset.component.d.ts +100 -0
  172. package/template-i18n.json +82 -0
  173. package/translate/si-translatable-keys.interface.d.ts +82 -0
  174. package/unauthorized-page/index.d.ts +6 -0
  175. package/unauthorized-page/package.json +3 -0
  176. package/unauthorized-page/si-unauthorized-page.component.d.ts +35 -0
  177. package/unauthorized-page/si-unauthorized-page.module.d.ts +7 -0
@@ -0,0 +1,575 @@
1
+ import * as i0 from '@angular/core';
2
+ import { EventEmitter, signal, computed, inject, ElementRef, booleanAttribute, numberAttribute, Input, Output, Component, NgZone, ChangeDetectorRef, ContentChildren, ChangeDetectionStrategy, NgModule } from '@angular/core';
3
+ import { NgTemplateOutlet, DOCUMENT } from '@angular/common';
4
+ import { SiIconNextComponent } from '@siemens/element-ng/icon';
5
+ import * as i1 from '@siemens/element-translate-ng/translate';
6
+ import { SiTranslateModule } from '@siemens/element-translate-ng/translate';
7
+ import { __decorate } from 'tslib';
8
+ import { SI_UI_STATE_SERVICE, isRTL, WebComponentContentChildren } from '@siemens/element-ng/common';
9
+ import { asapScheduler, merge, fromEvent } from 'rxjs';
10
+ import { observeOn, takeUntil } from 'rxjs/operators';
11
+
12
+ /**
13
+ * Copyright Siemens 2016 - 2025.
14
+ * SPDX-License-Identifier: MIT
15
+ */
16
+ class SiSplitPartComponent {
17
+ /** @defaultValue [] */
18
+ actions = [];
19
+ /**
20
+ * @defaultValue 'start'
21
+ */
22
+ collapseDirection = 'start';
23
+ /**
24
+ * Sets the icon class that is used in the buttons of split parts to
25
+ * collapse and uncollapse the parts.
26
+ *
27
+ * @defaultValue 'element-double-right'
28
+ */
29
+ collapseIconClass = 'element-double-right';
30
+ /**
31
+ * Collapse only to the given min size.
32
+ *
33
+ * @defaultValue false
34
+ */
35
+ collapseToMinSize = false;
36
+ /**
37
+ * Sets the status color on the split part header, visible as a bottom border and,
38
+ * if a headerStatusIcon is defined, as the icon´s background color.
39
+ *
40
+ * @deprecated Legacy input with no functionality. Will be removed in future major release.
41
+ */
42
+ headerStatusColor;
43
+ /**
44
+ * Sets the icon class that is used as status icon in the split part header.
45
+ *
46
+ * @deprecated Legacy input with no functionality. Will be removed in future major release.
47
+ */
48
+ headerStatusIconClass;
49
+ headerTemplate;
50
+ /**
51
+ * Sets the title of the split part header.
52
+ */
53
+ heading;
54
+ /**
55
+ * Minimum size in px.
56
+ *
57
+ * @defaultValue 0
58
+ */
59
+ minSize = 0;
60
+ /**
61
+ * When a split part is collapsed, the content gets hidden but it will
62
+ * still remain within the DOM. If you want to remove and destroy the component
63
+ * in collapsed mode and recreate it on un-collapse, set this property to
64
+ * true.
65
+ *
66
+ * @defaultValue false
67
+ */
68
+ removeContentOnCollapse = false;
69
+ /**
70
+ * Defines the behavior of the split part during scaling.
71
+ * E.g. when set to `none`, the spit part will keep its current size even when the parent container grows or shrinks.
72
+ *
73
+ * @defaultValue 'auto'
74
+ */
75
+ scale = 'auto';
76
+ /**
77
+ * Defines if the collapse button of a split part is displayed. Default value is true.
78
+ *
79
+ * @defaultValue true
80
+ */
81
+ showCollapseButton = true;
82
+ /**
83
+ * Defines if the header of the split part is visible. Default is true.
84
+ *
85
+ * @defaultValue true
86
+ */
87
+ showHeader = true;
88
+ /**
89
+ * Aria label for collapse button. Needed for a11y
90
+ *
91
+ * @defaultValue 'collapse'
92
+ */
93
+ collapseLabel = 'collapse';
94
+ /**
95
+ * An optional stateId to uniquely identify a component instance.
96
+ * Required for persistence of ui state.
97
+ */
98
+ stateId;
99
+ /**
100
+ * Expanded size in px.
101
+ */
102
+ size;
103
+ /**
104
+ * This toggles the behavior when collapsing this split part.
105
+ * If enabled, all split parts between this one and the end of the split in the respective direction will be collapsed if this part is collapsed.
106
+ * If disabled, only this split part will be collapsed.
107
+ *
108
+ * The default value will change to false in v48.
109
+ *
110
+ * @defaultValue true
111
+ */
112
+ collapseOthers = true;
113
+ collapseChanged = new EventEmitter();
114
+ stateChange = new EventEmitter();
115
+ /** @internal */
116
+ index = 0;
117
+ /** @internal */
118
+ before;
119
+ /** @internal */
120
+ after;
121
+ /** @internal */
122
+ fractionalSize = signal(undefined);
123
+ /** @internal */
124
+ collapsedSize = signal(0);
125
+ /** @internal */
126
+ collapsedState = signal(false);
127
+ /**
128
+ * Get collapsed state.
129
+ * @returns True if the split part is collapsed, false is expanded.
130
+ */
131
+ get collapsed() {
132
+ return this.collapsedState();
133
+ }
134
+ /** @internal */
135
+ expandedSize = signal(undefined);
136
+ /** @internal */
137
+ actualSize = computed(() => {
138
+ if (this.collapsedState()) {
139
+ return this.collapsedSize();
140
+ }
141
+ return this.expandedSize() ?? 0;
142
+ });
143
+ /** @internal */
144
+ saveUIState;
145
+ /** @internal */
146
+ nextExpandedAfter = computed(() => {
147
+ if (!this.collapsedState()) {
148
+ return this;
149
+ }
150
+ const nextExpanded = this.after ? this.after.nextExpandedAfter() : this;
151
+ return nextExpanded;
152
+ });
153
+ elementRef = inject(ElementRef);
154
+ headerContext = {
155
+ $implicit: this
156
+ };
157
+ /** @defaultValue true */
158
+ set expanded(value) {
159
+ this.collapsedState.set(!value);
160
+ if (this.collapseOthers) {
161
+ this.before?.refreshCollapseToStart();
162
+ this.after?.refreshCollapsedToEnd();
163
+ }
164
+ }
165
+ get expanded() {
166
+ return !this.collapsedState();
167
+ }
168
+ ngOnChanges(changes) {
169
+ if (changes.collapseToMinSize && this.collapseToMinSize) {
170
+ this.collapsedSize.set(this.minSize ?? 40);
171
+ }
172
+ else {
173
+ this.collapsedSize.set(40); // 40px is default size of the header
174
+ }
175
+ if (changes.size) {
176
+ this.expandedSize.set(this.size);
177
+ }
178
+ }
179
+ /** @internal */
180
+ refreshSizePx(orientation) {
181
+ if (!this.collapsedState()) {
182
+ const rect = this.elementRef.nativeElement.getBoundingClientRect();
183
+ if (orientation === 'vertical') {
184
+ this.expandedSize.set(rect.height);
185
+ }
186
+ else {
187
+ this.expandedSize.set(rect.width);
188
+ }
189
+ }
190
+ }
191
+ /**
192
+ * Toggles the collapsed or expanded state.
193
+ */
194
+ toggleCollapse() {
195
+ this.collapsedState.update(v => !v);
196
+ if (this.collapseOthers) {
197
+ this.before?.refreshCollapseToStart();
198
+ this.after?.refreshCollapsedToEnd();
199
+ }
200
+ this.collapseChanged.emit(this.collapsedState());
201
+ this.stateChange.emit({ expanded: this.expanded, size: this.actualSize() });
202
+ this.saveUIState();
203
+ }
204
+ refreshCollapsedToEnd() {
205
+ if (this.before?.collapsedState() && this.before.collapseDirection === 'end') {
206
+ this.collapsedState.set(true);
207
+ this.collapseDirection = 'end';
208
+ this.after?.refreshCollapsedToEnd();
209
+ }
210
+ }
211
+ refreshCollapseToStart() {
212
+ if (this.after?.collapsedState() && this.after.collapseDirection === 'start') {
213
+ this.collapsedState.set(true);
214
+ this.collapseDirection = 'start';
215
+ this.before?.refreshCollapseToStart();
216
+ }
217
+ }
218
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: SiSplitPartComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
219
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.6", type: SiSplitPartComponent, isStandalone: true, selector: "si-split-part", inputs: { actions: "actions", collapseDirection: "collapseDirection", collapseIconClass: "collapseIconClass", collapseToMinSize: ["collapseToMinSize", "collapseToMinSize", booleanAttribute], headerStatusColor: "headerStatusColor", headerStatusIconClass: "headerStatusIconClass", headerTemplate: "headerTemplate", heading: "heading", minSize: ["minSize", "minSize", numberAttribute], removeContentOnCollapse: ["removeContentOnCollapse", "removeContentOnCollapse", booleanAttribute], scale: "scale", showCollapseButton: ["showCollapseButton", "showCollapseButton", booleanAttribute], showHeader: ["showHeader", "showHeader", booleanAttribute], collapseLabel: "collapseLabel", stateId: "stateId", size: ["size", "size", numberAttribute], collapseOthers: ["collapseOthers", "collapseOthers", booleanAttribute], expanded: ["expanded", "expanded", booleanAttribute] }, outputs: { collapseChanged: "collapseChanged", stateChange: "stateChange" }, host: { properties: { "class.is-collapsed": "collapsedState()", "class.collapse-start": "collapseDirection === \"start\"", "style.grid-area": "\"p-\" + this.index" } }, usesOnChanges: true, ngImport: i0, template: "@if (!headerTemplate && showHeader) {\n <div class=\"si-split-part-header\" [class.is-collapsed]=\"collapsedState()\">\n <div class=\"si-split-part-title text-truncate\">\n {{ heading | translate }}\n </div>\n @if (!collapsedState()) {\n <div class=\"si-split-part-actions\">\n @for (action of actions; track $index) {\n <button\n type=\"button\"\n class=\"si-split-button\"\n [title]=\"action.tooltip || ''\"\n [attr.aria-label]=\"action.tooltip\"\n (click)=\"action.click($event)\"\n >\n <si-icon-next [icon]=\"action.iconClass\" />\n </button>\n }\n </div>\n }\n @if (showCollapseButton) {\n <div class=\"si-split-part-collapse-button\">\n <button\n type=\"button\"\n class=\"si-split-button\"\n [attr.aria-label]=\"collapseLabel | translate\"\n (click)=\"toggleCollapse()\"\n >\n <si-icon-next class=\"collapse-icon\" [icon]=\"collapseIconClass\" />\n </button>\n </div>\n }\n </div>\n}\n\n@if (headerTemplate) {\n <ng-container *ngTemplateOutlet=\"headerTemplate; context: headerContext\" />\n}\n\n<div\n class=\"si-split-part-content\"\n [class.d-none]=\"!removeContentOnCollapse && collapsedState() && !collapseToMinSize\"\n>\n @if (!removeContentOnCollapse || !collapsedState()) {\n <ng-content />\n }\n</div>\n", styles: [":host{display:flex;flex-direction:column;overflow:hidden}.si-split-part-content{flex:1 1 auto;display:flex;overflow:hidden;flex-direction:column}.si-split-part-header{display:flex;flex-direction:row;flex:none;align-items:center;padding:6px;background:var(--element-base-0);block-size:40px}:host-context(.horizontal)>:host(.is-collapsed) .si-split-part-header{flex:auto;flex-direction:column;max-block-size:100%;padding:6px}:host-context(.horizontal)>:host(.is-collapsed) .si-split-part-header .si-split-part-title{inline-size:100%;writing-mode:vertical-rl;transform:rotate(180deg)}:host-context(.horizontal)>:host(.is-collapsed) .si-split-part-header .si-split-part-collapse-button{order:-1}.si-split-part-title{font-weight:700;flex:1}.si-split-part-actions{padding-inline:8px;flex:0 0 auto}.si-split-button{display:inline-block;padding:4px;color:var(--element-text-primary);overflow:hidden;white-space:nowrap;text-overflow:ellipsis;text-decoration:none;font-size:20px;line-height:1;vertical-align:middle;-webkit-user-select:none;user-select:none;background:none;border:0;cursor:pointer}.si-split-button:hover{background:var(--element-action-secondary-hover)}:host-context(.vertical)>:host .si-split-button{--orientation-rotate: rotate(90deg)}[dir=rtl] :host-context(.horizontal)>:host .si-split-button{--orientation-rtl: scaleX(-1)}:dir(rtl) :host-context(.horizontal)>:host .si-split-button{--orientation-rtl: scaleX(-1)}:host(.is-collapsed) .si-split-button{--collapse-rotate: rotate(180deg)}:host(.collapse-start) .si-split-button{--collapse-direction: rotate(180deg)}.si-split-button .collapse-icon{transform:var(--orientation-rotate, rotate(0)) var(--collapse-rotate, rotate(0)) var(--collapse-direction, rotate(0)) var(--orientation-rtl, scaleX(1))}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: SiIconNextComponent, selector: "si-icon-next", inputs: ["icon"] }, { kind: "ngmodule", type: SiTranslateModule }, { kind: "pipe", type: i1.SiTranslatePipe, name: "translate" }] });
220
+ }
221
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: SiSplitPartComponent, decorators: [{
222
+ type: Component,
223
+ args: [{ selector: 'si-split-part', imports: [NgTemplateOutlet, SiIconNextComponent, SiTranslateModule], host: {
224
+ '[class.is-collapsed]': 'collapsedState()',
225
+ '[class.collapse-start]': 'collapseDirection === "start"',
226
+ '[style.grid-area]': '"p-" + this.index'
227
+ }, template: "@if (!headerTemplate && showHeader) {\n <div class=\"si-split-part-header\" [class.is-collapsed]=\"collapsedState()\">\n <div class=\"si-split-part-title text-truncate\">\n {{ heading | translate }}\n </div>\n @if (!collapsedState()) {\n <div class=\"si-split-part-actions\">\n @for (action of actions; track $index) {\n <button\n type=\"button\"\n class=\"si-split-button\"\n [title]=\"action.tooltip || ''\"\n [attr.aria-label]=\"action.tooltip\"\n (click)=\"action.click($event)\"\n >\n <si-icon-next [icon]=\"action.iconClass\" />\n </button>\n }\n </div>\n }\n @if (showCollapseButton) {\n <div class=\"si-split-part-collapse-button\">\n <button\n type=\"button\"\n class=\"si-split-button\"\n [attr.aria-label]=\"collapseLabel | translate\"\n (click)=\"toggleCollapse()\"\n >\n <si-icon-next class=\"collapse-icon\" [icon]=\"collapseIconClass\" />\n </button>\n </div>\n }\n </div>\n}\n\n@if (headerTemplate) {\n <ng-container *ngTemplateOutlet=\"headerTemplate; context: headerContext\" />\n}\n\n<div\n class=\"si-split-part-content\"\n [class.d-none]=\"!removeContentOnCollapse && collapsedState() && !collapseToMinSize\"\n>\n @if (!removeContentOnCollapse || !collapsedState()) {\n <ng-content />\n }\n</div>\n", styles: [":host{display:flex;flex-direction:column;overflow:hidden}.si-split-part-content{flex:1 1 auto;display:flex;overflow:hidden;flex-direction:column}.si-split-part-header{display:flex;flex-direction:row;flex:none;align-items:center;padding:6px;background:var(--element-base-0);block-size:40px}:host-context(.horizontal)>:host(.is-collapsed) .si-split-part-header{flex:auto;flex-direction:column;max-block-size:100%;padding:6px}:host-context(.horizontal)>:host(.is-collapsed) .si-split-part-header .si-split-part-title{inline-size:100%;writing-mode:vertical-rl;transform:rotate(180deg)}:host-context(.horizontal)>:host(.is-collapsed) .si-split-part-header .si-split-part-collapse-button{order:-1}.si-split-part-title{font-weight:700;flex:1}.si-split-part-actions{padding-inline:8px;flex:0 0 auto}.si-split-button{display:inline-block;padding:4px;color:var(--element-text-primary);overflow:hidden;white-space:nowrap;text-overflow:ellipsis;text-decoration:none;font-size:20px;line-height:1;vertical-align:middle;-webkit-user-select:none;user-select:none;background:none;border:0;cursor:pointer}.si-split-button:hover{background:var(--element-action-secondary-hover)}:host-context(.vertical)>:host .si-split-button{--orientation-rotate: rotate(90deg)}[dir=rtl] :host-context(.horizontal)>:host .si-split-button{--orientation-rtl: scaleX(-1)}:dir(rtl) :host-context(.horizontal)>:host .si-split-button{--orientation-rtl: scaleX(-1)}:host(.is-collapsed) .si-split-button{--collapse-rotate: rotate(180deg)}:host(.collapse-start) .si-split-button{--collapse-direction: rotate(180deg)}.si-split-button .collapse-icon{transform:var(--orientation-rotate, rotate(0)) var(--collapse-rotate, rotate(0)) var(--collapse-direction, rotate(0)) var(--orientation-rtl, scaleX(1))}\n"] }]
228
+ }], propDecorators: { actions: [{
229
+ type: Input
230
+ }], collapseDirection: [{
231
+ type: Input
232
+ }], collapseIconClass: [{
233
+ type: Input
234
+ }], collapseToMinSize: [{
235
+ type: Input,
236
+ args: [{ transform: booleanAttribute }]
237
+ }], headerStatusColor: [{
238
+ type: Input
239
+ }], headerStatusIconClass: [{
240
+ type: Input
241
+ }], headerTemplate: [{
242
+ type: Input
243
+ }], heading: [{
244
+ type: Input
245
+ }], minSize: [{
246
+ type: Input,
247
+ args: [{ transform: numberAttribute }]
248
+ }], removeContentOnCollapse: [{
249
+ type: Input,
250
+ args: [{ transform: booleanAttribute }]
251
+ }], scale: [{
252
+ type: Input
253
+ }], showCollapseButton: [{
254
+ type: Input,
255
+ args: [{ transform: booleanAttribute }]
256
+ }], showHeader: [{
257
+ type: Input,
258
+ args: [{ transform: booleanAttribute }]
259
+ }], collapseLabel: [{
260
+ type: Input
261
+ }], stateId: [{
262
+ type: Input
263
+ }], size: [{
264
+ type: Input,
265
+ args: [{ transform: numberAttribute }]
266
+ }], collapseOthers: [{
267
+ type: Input,
268
+ args: [{ transform: booleanAttribute }]
269
+ }], collapseChanged: [{
270
+ type: Output
271
+ }], stateChange: [{
272
+ type: Output
273
+ }], expanded: [{
274
+ type: Input,
275
+ args: [{ transform: booleanAttribute }]
276
+ }] } });
277
+
278
+ class SiSplitComponent {
279
+ /** @defaultValue 16 */
280
+ gutterSize = 16;
281
+ // eslint-disable-next-line @typescript-eslint/naming-convention
282
+ _orientation = signal('horizontal');
283
+ get orientation() {
284
+ return this._orientation();
285
+ }
286
+ set orientation(value) {
287
+ this._orientation.set(value);
288
+ }
289
+ /** @defaultValue [] */
290
+ sizes = [];
291
+ /**
292
+ * An optional stateId to uniquely identify a component instance.
293
+ * Required for persistence of ui state.
294
+ */
295
+ stateId;
296
+ sizesChange = new EventEmitter();
297
+ parts;
298
+ gutters = [];
299
+ // eslint-disable-next-line
300
+ gridTemplateRows = signal('');
301
+ // eslint-disable-next-line
302
+ gridTemplateColumns = signal('');
303
+ // eslint-disable-next-line
304
+ gridTemplateAreas = signal('');
305
+ elementRef = inject((ElementRef));
306
+ ngZone = inject(NgZone);
307
+ changeDetectorRef = inject(ChangeDetectorRef);
308
+ document = inject(DOCUMENT);
309
+ uiStateService = inject(SI_UI_STATE_SERVICE, { optional: true });
310
+ // New parts won't be measured, so we need this to scale up their fractional size to the expanded size.
311
+ // Using 10, as the sum of all fractional sizes is 1, so we need to scale them up as fr-values should be >= 1.
312
+ fractionalSizeToExpandedSizeFactor = 10;
313
+ ngOnChanges(changes) {
314
+ if (changes.sizes && !changes.sizes.firstChange) {
315
+ this.sizes.forEach((size, index) => {
316
+ const part = this.parts.get(index);
317
+ if (part) {
318
+ part.fractionalSize.set(size);
319
+ part.expandedSize.set(undefined);
320
+ }
321
+ });
322
+ this.alignRelativeSizes();
323
+ }
324
+ }
325
+ ngAfterContentInit() {
326
+ this.parts.changes.pipe(observeOn(asapScheduler)).subscribe(() => {
327
+ this.changeDetectorRef.markForCheck();
328
+ this.gutters = [];
329
+ for (let index = 0; index < this.parts.length; index++) {
330
+ const component = this.parts.get(index);
331
+ component.index = index;
332
+ component.after = this.parts.get(index + 1);
333
+ component.before = this.parts.get(index - 1);
334
+ component.fractionalSize.set(this.sizes[index]);
335
+ component.saveUIState = () => this.saveUIState();
336
+ if (component.after) {
337
+ this.gutters.push({
338
+ before: component,
339
+ after: this.parts.get(index + 1),
340
+ visible: computed(() => {
341
+ const afterPart = component.after.nextExpandedAfter();
342
+ return !afterPart.collapsedState() && !component.collapsedState();
343
+ })
344
+ });
345
+ }
346
+ }
347
+ this.alignRelativeSizes();
348
+ this.updateFractionalSizeToExpandSizeFactor();
349
+ this.restoreFormUIState();
350
+ const gridTemplate = computed(() => this.parts
351
+ .map(part => part.collapsedState()
352
+ ? part.collapseToMinSize
353
+ ? `${part.minSize}px`
354
+ : 'min-content'
355
+ : part.actualSize()
356
+ ? part.scale === 'auto'
357
+ ? `minmax(${part.minSize}px, ${part.actualSize()}fr)`
358
+ : `minmax(${part.minSize}px, ${part.actualSize()}px)`
359
+ : `minmax(${part.minSize}px, ${part.fractionalSize() * this.fractionalSizeToExpandedSizeFactor}fr)`)
360
+ .join(' min-content '));
361
+ this.gridTemplateRows = computed(() => this._orientation() === 'vertical' ? gridTemplate() : '1fr');
362
+ this.gridTemplateColumns = computed(() => this._orientation() === 'horizontal' ? gridTemplate() : '1fr');
363
+ this.gridTemplateAreas = computed(() => {
364
+ const areaNames = this.parts
365
+ .map((part, index) => [`p-${index}`, part.after ? `g-${index}` : []])
366
+ .flat(2);
367
+ if (this._orientation() === 'horizontal') {
368
+ return `"${areaNames.join(' ')}"`;
369
+ }
370
+ else {
371
+ return `"${areaNames.join('" "')}"`;
372
+ }
373
+ });
374
+ setTimeout(() => this.refreshAllPartSizes());
375
+ });
376
+ this.parts.notifyOnChanges();
377
+ }
378
+ alignRelativeSizes() {
379
+ const requestedNoSize = this.parts.filter(part => !part.size && !part.fractionalSize());
380
+ const requestedRelSize = this.parts.filter(part => part.fractionalSize() && !part.size);
381
+ if (requestedRelSize.length) {
382
+ const totalRequestedRelSize = requestedRelSize.reduce((a, b) => a + b.fractionalSize(), 0);
383
+ const averageRelSize = totalRequestedRelSize / requestedRelSize.length;
384
+ const totalAssignedRelSize = totalRequestedRelSize + requestedNoSize.length * averageRelSize;
385
+ requestedNoSize.forEach(part => part.fractionalSize.set(averageRelSize / totalAssignedRelSize));
386
+ requestedRelSize.forEach(part => part.fractionalSize.set(part.fractionalSize() / totalAssignedRelSize));
387
+ }
388
+ else {
389
+ requestedNoSize.forEach(part => part.fractionalSize.set(1 / requestedNoSize.length));
390
+ }
391
+ }
392
+ updateFractionalSizeToExpandSizeFactor() {
393
+ let previousScalableFractionalSum = 0;
394
+ let previousScalableExpandedSizeSum = 0;
395
+ for (let index = 0; index < this.parts.length; index++) {
396
+ const component = this.parts.get(index);
397
+ if (component.scale === 'auto' && component.expandedSize() !== undefined) {
398
+ previousScalableExpandedSizeSum += component.expandedSize();
399
+ previousScalableFractionalSum += component.fractionalSize();
400
+ }
401
+ }
402
+ this.fractionalSizeToExpandedSizeFactor = previousScalableFractionalSum
403
+ ? previousScalableExpandedSizeSum / previousScalableFractionalSum
404
+ : 10;
405
+ }
406
+ refreshAllPartSizes() {
407
+ const refParts = this.parts.filter(part => !part.collapsedState() &&
408
+ part.scale === 'auto' &&
409
+ (part.expandedSize() || part.fractionalSize()));
410
+ const beforeFrSum = refParts.reduce((a, b) => a + (b.expandedSize() ?? b.fractionalSize()), 0);
411
+ this.parts.forEach(part => part.refreshSizePx(this.orientation));
412
+ const afterFrSum = refParts.reduce((a, b) => a + b.expandedSize(), 0);
413
+ const beforeToAfterFactor = afterFrSum / beforeFrSum;
414
+ this.parts
415
+ .filter(part => part.collapsedState() && (part.scale === 'auto' || part.expandedSize() === undefined))
416
+ .forEach(part => part.expandedSize.update(prev => (prev ?? part.fractionalSize()) * beforeToAfterFactor));
417
+ }
418
+ resizeStart(gutter, event) {
419
+ this.refreshAllPartSizes();
420
+ this.changeDetectorRef.detectChanges();
421
+ const afterPart = gutter.after.nextExpandedAfter();
422
+ let beforeSize = gutter.before.expandedSize();
423
+ let afterSize = afterPart.expandedSize();
424
+ let appliedDelta = 0;
425
+ const rtl = isRTL();
426
+ const startPosition = this.getPosition(event);
427
+ const minDelta = -1 * (beforeSize - gutter.before.minSize);
428
+ const maxDelta = afterSize - afterPart.minSize;
429
+ const containerSize = this.measureContainerSize();
430
+ event.preventDefault(); // prevents text-selection
431
+ this.ngZone.runOutsideAngular(() => {
432
+ merge(fromEvent(this.document, 'mousemove'), fromEvent(this.document, 'touchmove'))
433
+ .pipe(takeUntil(merge(fromEvent(this.document, 'mouseup'), fromEvent(this.document, 'touchend'))))
434
+ .subscribe({
435
+ next: move => {
436
+ let delta = this.getPosition(move) - startPosition;
437
+ if (rtl && this.orientation === 'horizontal') {
438
+ delta *= -1;
439
+ }
440
+ delta -= appliedDelta;
441
+ if (maxDelta < appliedDelta + delta) {
442
+ delta = maxDelta - appliedDelta;
443
+ }
444
+ else if (minDelta > appliedDelta + delta) {
445
+ delta = minDelta - appliedDelta;
446
+ }
447
+ if (delta === 0) {
448
+ return;
449
+ }
450
+ beforeSize += delta;
451
+ afterSize -= delta;
452
+ appliedDelta += delta;
453
+ gutter.before.expandedSize.set(beforeSize);
454
+ afterPart.expandedSize.set(afterSize);
455
+ if (this.orientation === 'vertical') {
456
+ this.elementRef.nativeElement.style.setProperty('grid-template-rows', this.gridTemplateRows());
457
+ }
458
+ else {
459
+ this.elementRef.nativeElement.style.setProperty('grid-template-columns', this.gridTemplateColumns());
460
+ }
461
+ this.ngZone.run(() => this.sizesChange.emit(this.parts.map(part => (part.actualSize() * 100) / containerSize)));
462
+ },
463
+ complete: () => this.saveUIState()
464
+ });
465
+ });
466
+ }
467
+ measureContainerSize() {
468
+ const rect = this.elementRef.nativeElement.getBoundingClientRect();
469
+ if (this._orientation() === 'vertical') {
470
+ return rect.height;
471
+ }
472
+ else {
473
+ return rect.width;
474
+ }
475
+ }
476
+ getPosition(event) {
477
+ const positionObject = event.touches?.[0] ?? event;
478
+ return this.orientation === 'horizontal'
479
+ ? (positionObject.clientX ?? 0)
480
+ : (positionObject.clientY ?? 0);
481
+ }
482
+ saveUIState() {
483
+ if (!this.stateId || !this.uiStateService) {
484
+ return;
485
+ }
486
+ const containerSize = this.measureContainerSize();
487
+ const state = this.parts.reduce((partState, part) => {
488
+ if (part.stateId) {
489
+ partState[part.stateId] = {
490
+ size: ((part.expandedSize() ?? 0) * 100) / containerSize,
491
+ initialSize: this.sizes[part.index],
492
+ expanded: part.expanded
493
+ };
494
+ }
495
+ return partState;
496
+ }, {});
497
+ this.uiStateService.save(this.stateId, state);
498
+ }
499
+ restoreFormUIState() {
500
+ if (!this.stateId || !this.uiStateService) {
501
+ return;
502
+ }
503
+ this.uiStateService.load(this.stateId).then(uiState => {
504
+ if (!uiState) {
505
+ return;
506
+ }
507
+ this.parts
508
+ .filter(part => part.stateId)
509
+ .map(part => ({ part, state: uiState[part.stateId] }))
510
+ .filter(({ part, state }) => this.sizes[part.index] === state?.initialSize)
511
+ .forEach(({ part, state }) => {
512
+ part.expandedSize.set(undefined);
513
+ part.fractionalSize.set(state?.size);
514
+ part.collapsedState.set(!(state?.expanded ?? true));
515
+ });
516
+ setTimeout(() => this.refreshAllPartSizes());
517
+ });
518
+ }
519
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: SiSplitComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
520
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.6", type: SiSplitComponent, isStandalone: true, selector: "si-split", inputs: { gutterSize: "gutterSize", orientation: "orientation", sizes: "sizes", stateId: "stateId" }, outputs: { sizesChange: "sizesChange" }, host: { properties: { "class": "_orientation()", "style.grid-template-rows": "gridTemplateRows()", "style.grid-template-columns": "gridTemplateColumns()", "style.grid-template-areas": "gridTemplateAreas()" } }, queries: [{ propertyName: "parts", predicate: SiSplitPartComponent }], usesOnChanges: true, ngImport: i0, template: "<ng-content />\n\n@for (gutter of gutters; track $index) {\n @if ($index < parts.length - 1) {\n <div\n class=\"si-split-gutter\"\n [class.d-none]=\"!gutter.visible()\"\n [style.grid-area]=\"'g-' + $index\"\n [style.width.px]=\"orientation === 'horizontal' ? gutterSize : null\"\n [style.height.px]=\"orientation === 'vertical' ? gutterSize : null\"\n (mousedown)=\"resizeStart(gutter, $event)\"\n (touchstart)=\"resizeStart(gutter, $event)\"\n ></div>\n }\n}\n", styles: [":host{display:grid;inline-size:100%;block-size:100%}.si-split-gutter{flex:0 0 auto;background:var(--element-base-0);cursor:ew-resize}.si-split-gutter:before{display:block;content:\"\";position:relative;inset-block-start:50%;margin-block-start:-20px;inset-inline-start:50%;margin-inline-start:-3px;inline-size:6px;block-size:40px;background:var(--element-ui-2);border-radius:3px}:host(.vertical)>.si-split-gutter{inline-size:auto;cursor:ns-resize}:host(.vertical)>.si-split-gutter:before{transform:rotate(90deg)}.si-split-gutter:hover:before{background:var(--element-ui-0-hover)}.si-split-gutter:active:before{background:var(--element-ui-0)}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
521
+ }
522
+ __decorate([
523
+ WebComponentContentChildren(SiSplitPartComponent)
524
+ ], SiSplitComponent.prototype, "parts", void 0);
525
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: SiSplitComponent, decorators: [{
526
+ type: Component,
527
+ args: [{ selector: 'si-split', changeDetection: ChangeDetectionStrategy.OnPush, host: {
528
+ '[class]': '_orientation()',
529
+ '[style.grid-template-rows]': 'gridTemplateRows()',
530
+ '[style.grid-template-columns]': 'gridTemplateColumns()',
531
+ '[style.grid-template-areas]': 'gridTemplateAreas()'
532
+ }, template: "<ng-content />\n\n@for (gutter of gutters; track $index) {\n @if ($index < parts.length - 1) {\n <div\n class=\"si-split-gutter\"\n [class.d-none]=\"!gutter.visible()\"\n [style.grid-area]=\"'g-' + $index\"\n [style.width.px]=\"orientation === 'horizontal' ? gutterSize : null\"\n [style.height.px]=\"orientation === 'vertical' ? gutterSize : null\"\n (mousedown)=\"resizeStart(gutter, $event)\"\n (touchstart)=\"resizeStart(gutter, $event)\"\n ></div>\n }\n}\n", styles: [":host{display:grid;inline-size:100%;block-size:100%}.si-split-gutter{flex:0 0 auto;background:var(--element-base-0);cursor:ew-resize}.si-split-gutter:before{display:block;content:\"\";position:relative;inset-block-start:50%;margin-block-start:-20px;inset-inline-start:50%;margin-inline-start:-3px;inline-size:6px;block-size:40px;background:var(--element-ui-2);border-radius:3px}:host(.vertical)>.si-split-gutter{inline-size:auto;cursor:ns-resize}:host(.vertical)>.si-split-gutter:before{transform:rotate(90deg)}.si-split-gutter:hover:before{background:var(--element-ui-0-hover)}.si-split-gutter:active:before{background:var(--element-ui-0)}\n"] }]
533
+ }], propDecorators: { gutterSize: [{
534
+ type: Input
535
+ }], orientation: [{
536
+ type: Input
537
+ }], sizes: [{
538
+ type: Input
539
+ }], stateId: [{
540
+ type: Input
541
+ }], sizesChange: [{
542
+ type: Output
543
+ }], parts: [{
544
+ type: ContentChildren,
545
+ args: [SiSplitPartComponent]
546
+ }] } });
547
+
548
+ /**
549
+ * Copyright Siemens 2016 - 2025.
550
+ * SPDX-License-Identifier: MIT
551
+ */
552
+ class SiSplitModule {
553
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: SiSplitModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
554
+ static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "19.0.6", ngImport: i0, type: SiSplitModule, imports: [SiSplitComponent, SiSplitPartComponent], exports: [SiSplitComponent, SiSplitPartComponent] });
555
+ static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: SiSplitModule, imports: [SiSplitPartComponent] });
556
+ }
557
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: SiSplitModule, decorators: [{
558
+ type: NgModule,
559
+ args: [{
560
+ imports: [SiSplitComponent, SiSplitPartComponent],
561
+ exports: [SiSplitComponent, SiSplitPartComponent]
562
+ }]
563
+ }] });
564
+
565
+ /**
566
+ * Copyright Siemens 2016 - 2025.
567
+ * SPDX-License-Identifier: MIT
568
+ */
569
+
570
+ /**
571
+ * Generated bundle index. Do not edit.
572
+ */
573
+
574
+ export { SiSplitComponent, SiSplitModule, SiSplitPartComponent };
575
+ //# sourceMappingURL=siemens-element-ng-split.mjs.map