@siemens/element-ng 49.14.0 → 51.0.0-rc.5

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 (254) hide show
  1. package/README.md +1 -1
  2. package/fesm2022/siemens-element-ng-about.mjs +41 -25
  3. package/fesm2022/siemens-element-ng-about.mjs.map +1 -1
  4. package/fesm2022/siemens-element-ng-accordion.mjs +58 -40
  5. package/fesm2022/siemens-element-ng-accordion.mjs.map +1 -1
  6. package/fesm2022/siemens-element-ng-action-modal.mjs +83 -53
  7. package/fesm2022/siemens-element-ng-action-modal.mjs.map +1 -1
  8. package/fesm2022/siemens-element-ng-ag-grid.mjs +15 -12
  9. package/fesm2022/siemens-element-ng-ag-grid.mjs.map +1 -1
  10. package/fesm2022/siemens-element-ng-application-header.mjs +176 -166
  11. package/fesm2022/siemens-element-ng-application-header.mjs.map +1 -1
  12. package/fesm2022/siemens-element-ng-auto-collapsable-list.mjs +34 -28
  13. package/fesm2022/siemens-element-ng-auto-collapsable-list.mjs.map +1 -1
  14. package/fesm2022/siemens-element-ng-autocomplete.mjs +27 -22
  15. package/fesm2022/siemens-element-ng-autocomplete.mjs.map +1 -1
  16. package/fesm2022/siemens-element-ng-avatar.mjs +31 -21
  17. package/fesm2022/siemens-element-ng-avatar.mjs.map +1 -1
  18. package/fesm2022/siemens-element-ng-badge.mjs +9 -8
  19. package/fesm2022/siemens-element-ng-badge.mjs.map +1 -1
  20. package/fesm2022/siemens-element-ng-breadcrumb-router.mjs +17 -14
  21. package/fesm2022/siemens-element-ng-breadcrumb-router.mjs.map +1 -1
  22. package/fesm2022/siemens-element-ng-breadcrumb.mjs +21 -17
  23. package/fesm2022/siemens-element-ng-breadcrumb.mjs.map +1 -1
  24. package/fesm2022/siemens-element-ng-card.mjs +71 -46
  25. package/fesm2022/siemens-element-ng-card.mjs.map +1 -1
  26. package/fesm2022/siemens-element-ng-carousel.mjs +57 -33
  27. package/fesm2022/siemens-element-ng-carousel.mjs.map +1 -1
  28. package/fesm2022/siemens-element-ng-chat-messages.mjs +181 -117
  29. package/fesm2022/siemens-element-ng-chat-messages.mjs.map +1 -1
  30. package/fesm2022/siemens-element-ng-circle-status.mjs +39 -25
  31. package/fesm2022/siemens-element-ng-circle-status.mjs.map +1 -1
  32. package/fesm2022/siemens-element-ng-color-picker.mjs +26 -17
  33. package/fesm2022/siemens-element-ng-color-picker.mjs.map +1 -1
  34. package/fesm2022/siemens-element-ng-column-selection-dialog.mjs +56 -35
  35. package/fesm2022/siemens-element-ng-column-selection-dialog.mjs.map +1 -1
  36. package/fesm2022/siemens-element-ng-common.mjs +12 -12
  37. package/fesm2022/siemens-element-ng-connection-strength.mjs +14 -12
  38. package/fesm2022/siemens-element-ng-connection-strength.mjs.map +1 -1
  39. package/fesm2022/siemens-element-ng-content-action-bar.mjs +36 -27
  40. package/fesm2022/siemens-element-ng-content-action-bar.mjs.map +1 -1
  41. package/fesm2022/siemens-element-ng-copyright-notice.mjs +19 -14
  42. package/fesm2022/siemens-element-ng-copyright-notice.mjs.map +1 -1
  43. package/fesm2022/siemens-element-ng-dashboard.mjs +335 -221
  44. package/fesm2022/siemens-element-ng-dashboard.mjs.map +1 -1
  45. package/fesm2022/siemens-element-ng-datatable.mjs +8 -8
  46. package/fesm2022/siemens-element-ng-datatable.mjs.map +1 -1
  47. package/fesm2022/siemens-element-ng-date-range-filter.mjs +119 -72
  48. package/fesm2022/siemens-element-ng-date-range-filter.mjs.map +1 -1
  49. package/fesm2022/siemens-element-ng-datepicker.mjs +376 -244
  50. package/fesm2022/siemens-element-ng-datepicker.mjs.map +1 -1
  51. package/fesm2022/siemens-element-ng-electron-titlebar.mjs +22 -17
  52. package/fesm2022/siemens-element-ng-electron-titlebar.mjs.map +1 -1
  53. package/fesm2022/siemens-element-ng-empty-state.mjs +15 -12
  54. package/fesm2022/siemens-element-ng-empty-state.mjs.map +1 -1
  55. package/fesm2022/siemens-element-ng-file-uploader.mjs +105 -91
  56. package/fesm2022/siemens-element-ng-file-uploader.mjs.map +1 -1
  57. package/fesm2022/siemens-element-ng-filter-bar.mjs +32 -24
  58. package/fesm2022/siemens-element-ng-filter-bar.mjs.map +1 -1
  59. package/fesm2022/siemens-element-ng-filtered-search.mjs +251 -153
  60. package/fesm2022/siemens-element-ng-filtered-search.mjs.map +1 -1
  61. package/fesm2022/siemens-element-ng-footer.mjs +12 -10
  62. package/fesm2022/siemens-element-ng-footer.mjs.map +1 -1
  63. package/fesm2022/siemens-element-ng-form.mjs +345 -113
  64. package/fesm2022/siemens-element-ng-form.mjs.map +1 -1
  65. package/fesm2022/siemens-element-ng-formly-legacy.mjs +99 -0
  66. package/fesm2022/siemens-element-ng-formly-legacy.mjs.map +1 -0
  67. package/fesm2022/siemens-element-ng-formly.mjs +222 -316
  68. package/fesm2022/siemens-element-ng-formly.mjs.map +1 -1
  69. package/fesm2022/siemens-element-ng-header-dropdown.mjs +40 -30
  70. package/fesm2022/siemens-element-ng-header-dropdown.mjs.map +1 -1
  71. package/fesm2022/siemens-element-ng-help-button.mjs +5 -5
  72. package/fesm2022/siemens-element-ng-help-button.mjs.map +1 -1
  73. package/fesm2022/siemens-element-ng-icon.mjs +46 -47
  74. package/fesm2022/siemens-element-ng-icon.mjs.map +1 -1
  75. package/fesm2022/siemens-element-ng-info-page.mjs +17 -11
  76. package/fesm2022/siemens-element-ng-info-page.mjs.map +1 -1
  77. package/fesm2022/siemens-element-ng-inline-notification.mjs +19 -14
  78. package/fesm2022/siemens-element-ng-inline-notification.mjs.map +1 -1
  79. package/fesm2022/siemens-element-ng-ip-input.mjs +25 -25
  80. package/fesm2022/siemens-element-ng-ip-input.mjs.map +1 -1
  81. package/fesm2022/siemens-element-ng-landing-page.mjs +120 -74
  82. package/fesm2022/siemens-element-ng-landing-page.mjs.map +1 -1
  83. package/fesm2022/siemens-element-ng-language-switcher.mjs +16 -12
  84. package/fesm2022/siemens-element-ng-language-switcher.mjs.map +1 -1
  85. package/fesm2022/siemens-element-ng-link.mjs +31 -21
  86. package/fesm2022/siemens-element-ng-link.mjs.map +1 -1
  87. package/fesm2022/siemens-element-ng-list-details.mjs +76 -56
  88. package/fesm2022/siemens-element-ng-list-details.mjs.map +1 -1
  89. package/fesm2022/siemens-element-ng-loading-spinner.mjs +46 -63
  90. package/fesm2022/siemens-element-ng-loading-spinner.mjs.map +1 -1
  91. package/fesm2022/siemens-element-ng-localization.mjs +14 -12
  92. package/fesm2022/siemens-element-ng-localization.mjs.map +1 -1
  93. package/fesm2022/siemens-element-ng-main-detail-container.mjs +47 -30
  94. package/fesm2022/siemens-element-ng-main-detail-container.mjs.map +1 -1
  95. package/fesm2022/siemens-element-ng-maplibre.mjs +42 -0
  96. package/fesm2022/siemens-element-ng-maplibre.mjs.map +1 -0
  97. package/fesm2022/siemens-element-ng-markdown-renderer.mjs +6 -5
  98. package/fesm2022/siemens-element-ng-markdown-renderer.mjs.map +1 -1
  99. package/fesm2022/siemens-element-ng-menu.mjs +56 -48
  100. package/fesm2022/siemens-element-ng-menu.mjs.map +1 -1
  101. package/fesm2022/siemens-element-ng-modal.mjs +14 -11
  102. package/fesm2022/siemens-element-ng-modal.mjs.map +1 -1
  103. package/fesm2022/siemens-element-ng-navbar-vertical-next.mjs +249 -204
  104. package/fesm2022/siemens-element-ng-navbar-vertical-next.mjs.map +1 -1
  105. package/fesm2022/siemens-element-ng-navbar-vertical.mjs +120 -83
  106. package/fesm2022/siemens-element-ng-navbar-vertical.mjs.map +1 -1
  107. package/fesm2022/siemens-element-ng-navbar.mjs +72 -45
  108. package/fesm2022/siemens-element-ng-navbar.mjs.map +1 -1
  109. package/fesm2022/siemens-element-ng-notification-item.mjs +19 -11
  110. package/fesm2022/siemens-element-ng-notification-item.mjs.map +1 -1
  111. package/fesm2022/siemens-element-ng-number-input.mjs +40 -28
  112. package/fesm2022/siemens-element-ng-number-input.mjs.map +1 -1
  113. package/fesm2022/siemens-element-ng-pagination.mjs +31 -20
  114. package/fesm2022/siemens-element-ng-pagination.mjs.map +1 -1
  115. package/fesm2022/siemens-element-ng-password-strength.mjs +32 -23
  116. package/fesm2022/siemens-element-ng-password-strength.mjs.map +1 -1
  117. package/fesm2022/siemens-element-ng-password-toggle.mjs +18 -13
  118. package/fesm2022/siemens-element-ng-password-toggle.mjs.map +1 -1
  119. package/fesm2022/siemens-element-ng-phone-number.mjs +123 -139
  120. package/fesm2022/siemens-element-ng-phone-number.mjs.map +1 -1
  121. package/fesm2022/siemens-element-ng-photo-upload.mjs +84 -51
  122. package/fesm2022/siemens-element-ng-photo-upload.mjs.map +1 -1
  123. package/fesm2022/siemens-element-ng-pills-input.mjs +63 -58
  124. package/fesm2022/siemens-element-ng-pills-input.mjs.map +1 -1
  125. package/fesm2022/siemens-element-ng-popover-legacy.mjs +43 -28
  126. package/fesm2022/siemens-element-ng-popover-legacy.mjs.map +1 -1
  127. package/fesm2022/siemens-element-ng-popover.mjs +35 -27
  128. package/fesm2022/siemens-element-ng-popover.mjs.map +1 -1
  129. package/fesm2022/siemens-element-ng-progressbar.mjs +23 -16
  130. package/fesm2022/siemens-element-ng-progressbar.mjs.map +1 -1
  131. package/fesm2022/siemens-element-ng-resize-observer.mjs +32 -43
  132. package/fesm2022/siemens-element-ng-resize-observer.mjs.map +1 -1
  133. package/fesm2022/siemens-element-ng-result-details-list.mjs +12 -10
  134. package/fesm2022/siemens-element-ng-result-details-list.mjs.map +1 -1
  135. package/fesm2022/siemens-element-ng-search-bar.mjs +38 -31
  136. package/fesm2022/siemens-element-ng-search-bar.mjs.map +1 -1
  137. package/fesm2022/siemens-element-ng-select.mjs +218 -163
  138. package/fesm2022/siemens-element-ng-select.mjs.map +1 -1
  139. package/fesm2022/siemens-element-ng-shadow-root.mjs +3 -3
  140. package/fesm2022/siemens-element-ng-side-panel.mjs +128 -86
  141. package/fesm2022/siemens-element-ng-side-panel.mjs.map +1 -1
  142. package/fesm2022/siemens-element-ng-skip-links.mjs +21 -24
  143. package/fesm2022/siemens-element-ng-skip-links.mjs.map +1 -1
  144. package/fesm2022/siemens-element-ng-slider.mjs +44 -29
  145. package/fesm2022/siemens-element-ng-slider.mjs.map +1 -1
  146. package/fesm2022/siemens-element-ng-split.mjs +273 -293
  147. package/fesm2022/siemens-element-ng-split.mjs.map +1 -1
  148. package/fesm2022/siemens-element-ng-status-bar.mjs +65 -51
  149. package/fesm2022/siemens-element-ng-status-bar.mjs.map +1 -1
  150. package/fesm2022/siemens-element-ng-status-counter.mjs +15 -11
  151. package/fesm2022/siemens-element-ng-status-counter.mjs.map +1 -1
  152. package/fesm2022/siemens-element-ng-status-toggle.mjs +26 -16
  153. package/fesm2022/siemens-element-ng-status-toggle.mjs.map +1 -1
  154. package/fesm2022/siemens-element-ng-summary-chip.mjs +25 -16
  155. package/fesm2022/siemens-element-ng-summary-chip.mjs.map +1 -1
  156. package/fesm2022/siemens-element-ng-summary-widget.mjs +27 -17
  157. package/fesm2022/siemens-element-ng-summary-widget.mjs.map +1 -1
  158. package/fesm2022/siemens-element-ng-system-banner.mjs +11 -8
  159. package/fesm2022/siemens-element-ng-system-banner.mjs.map +1 -1
  160. package/fesm2022/siemens-element-ng-tabs-legacy.mjs +20 -17
  161. package/fesm2022/siemens-element-ng-tabs-legacy.mjs.map +1 -1
  162. package/fesm2022/siemens-element-ng-tabs.mjs +73 -70
  163. package/fesm2022/siemens-element-ng-tabs.mjs.map +1 -1
  164. package/fesm2022/siemens-element-ng-theme.mjs +29 -6
  165. package/fesm2022/siemens-element-ng-theme.mjs.map +1 -1
  166. package/fesm2022/siemens-element-ng-threshold.mjs +60 -41
  167. package/fesm2022/siemens-element-ng-threshold.mjs.map +1 -1
  168. package/fesm2022/siemens-element-ng-toast-notification.mjs +45 -40
  169. package/fesm2022/siemens-element-ng-toast-notification.mjs.map +1 -1
  170. package/fesm2022/siemens-element-ng-tooltip.mjs +105 -82
  171. package/fesm2022/siemens-element-ng-tooltip.mjs.map +1 -1
  172. package/fesm2022/siemens-element-ng-tour.mjs +24 -18
  173. package/fesm2022/siemens-element-ng-tour.mjs.map +1 -1
  174. package/fesm2022/siemens-element-ng-translate.mjs +0 -1
  175. package/fesm2022/siemens-element-ng-translate.mjs.map +1 -1
  176. package/fesm2022/siemens-element-ng-tree-view.mjs +96 -75
  177. package/fesm2022/siemens-element-ng-tree-view.mjs.map +1 -1
  178. package/fesm2022/siemens-element-ng-typeahead.mjs +76 -70
  179. package/fesm2022/siemens-element-ng-typeahead.mjs.map +1 -1
  180. package/fesm2022/siemens-element-ng-wizard.mjs +72 -48
  181. package/fesm2022/siemens-element-ng-wizard.mjs.map +1 -1
  182. package/formly-legacy/package.json +4 -0
  183. package/maplibre/package.json +4 -0
  184. package/maplibre/styles/_index.scss +1 -0
  185. package/maplibre/styles/maplibre-gl.scss +715 -0
  186. package/package.json +37 -23
  187. package/schematics/migration.json +4 -4
  188. package/schematics/migrations/data/class-member-replacement.js +1 -19
  189. package/schematics/migrations/data/component-property-names.js +1 -25
  190. package/schematics/migrations/data/element-class-changes.js +1 -28
  191. package/schematics/migrations/data/element-migration-data.js +2 -0
  192. package/schematics/migrations/data/element-selectors.js +1 -11
  193. package/schematics/migrations/data/index.js +0 -4
  194. package/schematics/migrations/data/migration-test-data.js +9 -6
  195. package/schematics/migrations/data/provider-function-removals.js +7 -0
  196. package/schematics/migrations/data/symbol-removals.js +7 -7
  197. package/schematics/migrations/data/symbol-renaming.js +1 -48
  198. package/schematics/migrations/element-migration/element-migration.js +3 -6
  199. package/schematics/migrations/utilities/import-removal.js +39 -0
  200. package/schematics/migrations/utilities/index.js +2 -0
  201. package/schematics/migrations/utilities/provider-function-removal.migration.js +116 -0
  202. package/schematics/ng-update/index.js +1 -1
  203. package/schematics/ng-update/migrate-split-sizes.js +105 -0
  204. package/schematics/ng-update/{migrate-to-v49.js → migrate-to-v51.js} +5 -3
  205. package/template-i18n.json +45 -47
  206. package/types/siemens-element-ng-application-header.d.ts +8 -28
  207. package/types/siemens-element-ng-breadcrumb.d.ts +1 -1
  208. package/types/siemens-element-ng-chat-messages.d.ts +11 -9
  209. package/types/siemens-element-ng-circle-status.d.ts +1 -1
  210. package/types/siemens-element-ng-content-action-bar.d.ts +1 -1
  211. package/types/siemens-element-ng-dashboard.d.ts +2 -2
  212. package/types/siemens-element-ng-date-range-filter.d.ts +1 -1
  213. package/types/siemens-element-ng-datepicker.d.ts +3 -14
  214. package/types/siemens-element-ng-electron-titlebar.d.ts +1 -1
  215. package/types/siemens-element-ng-file-uploader.d.ts +13 -31
  216. package/types/siemens-element-ng-filter-bar.d.ts +1 -1
  217. package/types/siemens-element-ng-filtered-search.d.ts +4 -4
  218. package/types/siemens-element-ng-form.d.ts +180 -44
  219. package/types/siemens-element-ng-formly-legacy.d.ts +40 -0
  220. package/types/siemens-element-ng-formly.d.ts +34 -167
  221. package/types/siemens-element-ng-icon.d.ts +2 -19
  222. package/types/siemens-element-ng-ip-input.d.ts +1 -1
  223. package/types/siemens-element-ng-landing-page.d.ts +2 -2
  224. package/types/siemens-element-ng-loading-spinner.d.ts +7 -17
  225. package/types/siemens-element-ng-maplibre.d.ts +26 -0
  226. package/types/siemens-element-ng-navbar-vertical-next.d.ts +86 -38
  227. package/types/siemens-element-ng-navbar-vertical.d.ts +1 -1
  228. package/types/siemens-element-ng-navbar.d.ts +3 -3
  229. package/types/siemens-element-ng-notification-item.d.ts +12 -0
  230. package/types/siemens-element-ng-phone-number.d.ts +5 -8
  231. package/types/siemens-element-ng-photo-upload.d.ts +4 -4
  232. package/types/siemens-element-ng-resize-observer.d.ts +0 -17
  233. package/types/siemens-element-ng-search-bar.d.ts +1 -1
  234. package/types/siemens-element-ng-select.d.ts +1 -1
  235. package/types/siemens-element-ng-side-panel.d.ts +3 -3
  236. package/types/siemens-element-ng-split.d.ts +99 -70
  237. package/types/siemens-element-ng-status-bar.d.ts +5 -13
  238. package/types/siemens-element-ng-status-counter.d.ts +1 -1
  239. package/types/siemens-element-ng-tabs.d.ts +1 -2
  240. package/types/siemens-element-ng-theme.d.ts +12 -2
  241. package/types/siemens-element-ng-threshold.d.ts +1 -1
  242. package/types/siemens-element-ng-toast-notification.d.ts +0 -1
  243. package/types/siemens-element-ng-tooltip.d.ts +7 -7
  244. package/types/siemens-element-ng-translate.d.ts +2 -5
  245. package/fesm2022/siemens-element-ng-icon-status.mjs +0 -46
  246. package/fesm2022/siemens-element-ng-icon-status.mjs.map +0 -1
  247. package/fesm2022/siemens-element-ng-sort-bar.mjs +0 -99
  248. package/fesm2022/siemens-element-ng-sort-bar.mjs.map +0 -1
  249. package/icon-status/package.json +0 -4
  250. package/schematics/vitest-setup.js +0 -5
  251. package/sort-bar/package.json +0 -4
  252. package/types/siemens-element-ng-icon-status.d.ts +0 -25
  253. package/types/siemens-element-ng-sort-bar.d.ts +0 -59
  254. /package/{LICENSE.md → LICENSE} +0 -0
@@ -1,9 +1,11 @@
1
1
  import * as i0 from '@angular/core';
2
- import { EventEmitter, signal, computed, inject, ElementRef, booleanAttribute, numberAttribute, Input, Output, ChangeDetectionStrategy, Component, NgZone, ChangeDetectorRef, DOCUMENT, ContentChildren, NgModule } from '@angular/core';
2
+ import { input, booleanAttribute, numberAttribute, output, signal, linkedSignal, computed, inject, ElementRef, effect, untracked, Component, contentChildren, NgZone, ChangeDetectorRef, DOCUMENT, DestroyRef, NgModule } from '@angular/core';
3
3
  import { NgTemplateOutlet } from '@angular/common';
4
- import { SiIconComponent } from '@siemens/element-ng/icon';
5
- import { SiTranslatePipe } from '@siemens/element-translate-ng/translate';
4
+ import { elementDoubleRight } from '@siemens/element-icons';
5
+ import { addIcons, SiIconComponent } from '@siemens/element-ng/icon';
6
+ import { t, SiTranslatePipe } from '@siemens/element-translate-ng/translate';
6
7
  import { __decorate } from 'tslib';
8
+ import { toObservable, takeUntilDestroyed } from '@angular/core/rxjs-interop';
7
9
  import { SI_UI_STATE_SERVICE, isRTL, WebComponentContentChildren } from '@siemens/element-ng/common';
8
10
  import { asapScheduler, merge, fromEvent } from 'rxjs';
9
11
  import { observeOn, takeUntil } from 'rxjs/operators';
@@ -12,38 +14,50 @@ import { observeOn, takeUntil } from 'rxjs/operators';
12
14
  * Copyright (c) Siemens 2016 - 2026
13
15
  * SPDX-License-Identifier: MIT
14
16
  */
15
- /* eslint-disable @angular-eslint/prefer-output-emitter-ref */
16
17
  class SiSplitPartComponent {
17
- /** @defaultValue [] */
18
- actions = [];
18
+ icons = addIcons({ elementDoubleRight });
19
19
  /**
20
+ * Action buttons displayed in the split part header.
21
+ *
22
+ * @defaultValue []
23
+ */
24
+ actions = input([], /* @ts-ignore */
25
+ ...(ngDevMode ? [{ debugName: "actions" }] : /* istanbul ignore next */ []));
26
+ /**
27
+ * Defines which direction the split part collapses to.
28
+ *
20
29
  * @defaultValue 'start'
21
30
  */
22
- collapseDirection = 'start';
31
+ collapseDirection = input('start', /* @ts-ignore */
32
+ ...(ngDevMode ? [{ debugName: "collapseDirection" }] : /* istanbul ignore next */ []));
23
33
  /**
24
34
  * Sets the icon class that is used in the buttons of split parts to
25
35
  * collapse and uncollapse the parts.
26
- *
27
- * @defaultValue 'element-double-right'
28
36
  */
29
- collapseIconClass = 'element-double-right';
37
+ collapseIconClass = input(/* @ts-ignore */
38
+ ...(ngDevMode ? [undefined, { debugName: "collapseIconClass" }] : /* istanbul ignore next */ []));
30
39
  /**
31
40
  * Collapse only to the given min size.
32
41
  *
33
42
  * @defaultValue false
34
43
  */
35
- collapseToMinSize = false;
36
- headerTemplate;
44
+ collapseToMinSize = input(false, { ...(ngDevMode ? { debugName: "collapseToMinSize" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
45
+ /**
46
+ * Custom template for the split part header. The template receives the component instance as implicit context.
47
+ */
48
+ headerTemplate = input(/* @ts-ignore */
49
+ ...(ngDevMode ? [undefined, { debugName: "headerTemplate" }] : /* istanbul ignore next */ []));
37
50
  /**
38
51
  * Sets the title of the split part header.
39
52
  */
40
- heading;
53
+ heading = input(/* @ts-ignore */
54
+ ...(ngDevMode ? [undefined, { debugName: "heading" }] : /* istanbul ignore next */ []));
41
55
  /**
42
56
  * Minimum size in px.
43
57
  *
44
58
  * @defaultValue 0
45
59
  */
46
- minSize = 0;
60
+ minSize = input(0, { ...(ngDevMode ? { debugName: "minSize" } : /* istanbul ignore next */ {}), transform: numberAttribute });
47
61
  /**
48
62
  * When a split part is collapsed, the content gets hidden but it will
49
63
  * still remain within the DOM. If you want to remove and destroy the component
@@ -52,41 +66,52 @@ class SiSplitPartComponent {
52
66
  *
53
67
  * @defaultValue false
54
68
  */
55
- removeContentOnCollapse = false;
69
+ removeContentOnCollapse = input(false, { ...(ngDevMode ? { debugName: "removeContentOnCollapse" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
56
70
  /**
57
71
  * Defines the behavior of the split part during scaling.
58
72
  * E.g. when set to `none`, the spit part will keep its current size even when the parent container grows or shrinks.
59
73
  *
60
74
  * @defaultValue 'auto'
61
75
  */
62
- scale = 'auto';
76
+ scale = input('auto', /* @ts-ignore */
77
+ ...(ngDevMode ? [{ debugName: "scale" }] : /* istanbul ignore next */ []));
63
78
  /**
64
79
  * Defines if the collapse button of a split part is displayed. Default value is true.
65
80
  *
66
81
  * @defaultValue true
67
82
  */
68
- showCollapseButton = true;
83
+ showCollapseButton = input(true, { ...(ngDevMode ? { debugName: "showCollapseButton" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
69
84
  /**
70
85
  * Defines if the header of the split part is visible. Default is true.
71
86
  *
72
87
  * @defaultValue true
73
88
  */
74
- showHeader = true;
89
+ showHeader = input(true, { ...(ngDevMode ? { debugName: "showHeader" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
75
90
  /**
76
91
  * Aria label for collapse button. Needed for a11y
77
92
  *
78
- * @defaultValue 'collapse'
93
+ * @defaultValue
94
+ * ```
95
+ * t(() => $localize`:@@SI_SPLIT.COLLAPSE_LABEL:Collapse`)
96
+ * ```
79
97
  */
80
- collapseLabel = 'collapse';
98
+ collapseLabel = input(t(() => $localize `:@@SI_SPLIT.COLLAPSE_LABEL:Collapse`), /* @ts-ignore */
99
+ ...(ngDevMode ? [{ debugName: "collapseLabel" }] : /* istanbul ignore next */ []));
81
100
  /**
82
101
  * An optional stateId to uniquely identify a component instance.
83
102
  * Required for persistence of ui state.
84
103
  */
85
- stateId;
104
+ stateId = input(/* @ts-ignore */
105
+ ...(ngDevMode ? [undefined, { debugName: "stateId" }] : /* istanbul ignore next */ []));
106
+ /**
107
+ * Expanded size.
108
+ */
109
+ size = input.required({ ...(ngDevMode ? { debugName: "size" } : /* istanbul ignore next */ {}), transform: numberAttribute });
86
110
  /**
87
- * Expanded size in px.
111
+ * Unit for the configured {@link size}.
88
112
  */
89
- size;
113
+ unit = input.required(/* @ts-ignore */
114
+ ...(ngDevMode ? [{ debugName: "unit" }] : /* istanbul ignore next */ []));
90
115
  /**
91
116
  * This toggles the behavior when collapsing this split part.
92
117
  * 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.
@@ -94,21 +119,43 @@ class SiSplitPartComponent {
94
119
  *
95
120
  * @defaultValue false
96
121
  */
97
- collapseOthers = false;
98
- collapseChanged = new EventEmitter();
99
- stateChange = new EventEmitter();
122
+ collapseOthers = input(false, { ...(ngDevMode ? { debugName: "collapseOthers" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
123
+ /**
124
+ * Sets the initial expanded or collapsed state of the split part.
125
+ *
126
+ * @defaultValue true
127
+ */
128
+ expanded = input(true, { ...(ngDevMode ? { debugName: "expanded" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
129
+ collapseChanged = output();
130
+ stateChange = output();
100
131
  /** @internal */
101
132
  index = 0;
102
133
  /** @internal */
103
- before;
104
- /** @internal */
105
- after;
134
+ before = signal(undefined, /* @ts-ignore */
135
+ ...(ngDevMode ? [{ debugName: "before" }] : /* istanbul ignore next */ []));
106
136
  /** @internal */
107
- fractionalSize = signal(undefined, ...(ngDevMode ? [{ debugName: "fractionalSize" }] : []));
137
+ after = signal(undefined, /* @ts-ignore */
138
+ ...(ngDevMode ? [{ debugName: "after" }] : /* istanbul ignore next */ []));
108
139
  /** @internal */
109
- collapsedSize = signal(0, ...(ngDevMode ? [{ debugName: "collapsedSize" }] : []));
140
+ fractionalSize = linkedSignal(() => (this.unit() === 'fr' ? this.size() : undefined), /* @ts-ignore */
141
+ ...(ngDevMode ? [{ debugName: "fractionalSize" }] : /* istanbul ignore next */ []));
110
142
  /** @internal */
111
- collapsedState = signal(false, ...(ngDevMode ? [{ debugName: "collapsedState" }] : []));
143
+ collapsedSize = computed(() => (this.collapseToMinSize() ? (this.minSize() ?? 40) : 40), /* @ts-ignore */
144
+ ...(ngDevMode ? [{ debugName: "collapsedSize" }] : /* istanbul ignore next */ []));
145
+ /**
146
+ * Internal, mutable collapsed state. Initialized from the {@link expanded} input but can be
147
+ * overwritten while toggling, cascading to sibling parts or restoring the persisted ui state.
148
+ * @internal
149
+ */
150
+ collapsedState = linkedSignal(() => !this.expanded(), /* @ts-ignore */
151
+ ...(ngDevMode ? [{ debugName: "collapsedState" }] : /* istanbul ignore next */ []));
152
+ /**
153
+ * Internal, mutable collapse direction. Initialized from the {@link collapseDirection}
154
+ * input but can be overwritten while cascading collapse state to sibling parts.
155
+ * @internal
156
+ */
157
+ collapseDirectionState = linkedSignal(() => this.collapseDirection(), /* @ts-ignore */
158
+ ...(ngDevMode ? [{ debugName: "collapseDirectionState" }] : /* istanbul ignore next */ []));
112
159
  /**
113
160
  * Get collapsed state.
114
161
  * @returns True if the split part is collapsed, false is expanded.
@@ -117,14 +164,16 @@ class SiSplitPartComponent {
117
164
  return this.collapsedState();
118
165
  }
119
166
  /** @internal */
120
- expandedSize = signal(undefined, ...(ngDevMode ? [{ debugName: "expandedSize" }] : []));
167
+ expandedSize = linkedSignal({ ...(ngDevMode ? { debugName: "expandedSize" } : /* istanbul ignore next */ {}), source: () => ({ size: this.size(), unit: this.unit() }),
168
+ computation: source => (source.unit === 'fr' ? undefined : source.size) });
121
169
  /** @internal */
122
170
  actualSize = computed(() => {
123
171
  if (this.collapsedState()) {
124
172
  return this.collapsedSize();
125
173
  }
126
174
  return this.expandedSize() ?? 0;
127
- }, ...(ngDevMode ? [{ debugName: "actualSize" }] : []));
175
+ }, /* @ts-ignore */
176
+ ...(ngDevMode ? [{ debugName: "actualSize" }] : /* istanbul ignore next */ []));
128
177
  /** @internal */
129
178
  saveUIState;
130
179
  /** @internal */
@@ -132,34 +181,25 @@ class SiSplitPartComponent {
132
181
  if (!this.collapsedState()) {
133
182
  return this;
134
183
  }
135
- const nextExpanded = this.after ? this.after.nextExpandedAfter() : this;
184
+ const after = this.after();
185
+ const nextExpanded = after ? after.nextExpandedAfter() : this;
136
186
  return nextExpanded;
137
- }, ...(ngDevMode ? [{ debugName: "nextExpandedAfter" }] : []));
187
+ }, /* @ts-ignore */
188
+ ...(ngDevMode ? [{ debugName: "nextExpandedAfter" }] : /* istanbul ignore next */ []));
138
189
  elementRef = inject(ElementRef);
139
190
  headerContext = {
140
191
  $implicit: this
141
192
  };
142
- /** @defaultValue true */
143
- set expanded(value) {
144
- this.collapsedState.set(!value);
145
- if (this.collapseOthers) {
146
- this.before?.refreshCollapseToStart();
147
- this.after?.refreshCollapsedToEnd();
148
- }
149
- }
150
- get expanded() {
151
- return !this.collapsedState();
152
- }
153
- ngOnChanges(changes) {
154
- if (changes.collapseToMinSize && this.collapseToMinSize) {
155
- this.collapsedSize.set(this.minSize ?? 40);
156
- }
157
- else {
158
- this.collapsedSize.set(40); // 40px is default size of the header
159
- }
160
- if (changes.size) {
161
- this.expandedSize.set(this.size);
162
- }
193
+ constructor() {
194
+ effect(() => {
195
+ this.expanded();
196
+ untracked(() => {
197
+ if (this.collapseOthers()) {
198
+ this.before()?.refreshCollapseToStart();
199
+ this.after()?.refreshCollapsedToEnd();
200
+ }
201
+ });
202
+ });
163
203
  }
164
204
  /** @internal */
165
205
  refreshSizePx(orientation) {
@@ -178,223 +218,160 @@ class SiSplitPartComponent {
178
218
  */
179
219
  toggleCollapse() {
180
220
  this.collapsedState.update(v => !v);
181
- if (this.collapseOthers) {
182
- this.before?.refreshCollapseToStart();
183
- this.after?.refreshCollapsedToEnd();
221
+ if (this.collapseOthers()) {
222
+ this.before()?.refreshCollapseToStart();
223
+ this.after()?.refreshCollapsedToEnd();
184
224
  }
185
225
  this.collapseChanged.emit(this.collapsedState());
186
- this.stateChange.emit({ expanded: this.expanded, size: this.actualSize() });
226
+ this.stateChange.emit({ expanded: !this.collapsedState(), size: this.actualSize() });
187
227
  this.saveUIState();
188
228
  }
189
229
  refreshCollapsedToEnd() {
190
- if (this.before?.collapsedState() && this.before.collapseDirection === 'end') {
230
+ const before = this.before();
231
+ if (before?.collapsedState() && before.collapseDirectionState() === 'end') {
191
232
  this.collapsedState.set(true);
192
- this.collapseDirection = 'end';
193
- this.after?.refreshCollapsedToEnd();
233
+ this.collapseDirectionState.set('end');
234
+ this.after()?.refreshCollapsedToEnd();
194
235
  }
195
236
  }
196
237
  refreshCollapseToStart() {
197
- if (this.after?.collapsedState() && this.after.collapseDirection === 'start') {
238
+ const after = this.after();
239
+ if (after?.collapsedState() && after.collapseDirectionState() === 'start') {
198
240
  this.collapsedState.set(true);
199
- this.collapseDirection = 'start';
200
- this.before?.refreshCollapseToStart();
241
+ this.collapseDirectionState.set('start');
242
+ this.before()?.refreshCollapseToStart();
201
243
  }
202
244
  }
203
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.8", ngImport: i0, type: SiSplitPartComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
204
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.8", type: SiSplitPartComponent, isStandalone: true, selector: "si-split-part", inputs: { actions: "actions", collapseDirection: "collapseDirection", collapseIconClass: "collapseIconClass", collapseToMinSize: ["collapseToMinSize", "collapseToMinSize", booleanAttribute], 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 [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 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:600;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: SiIconComponent, selector: "si-icon", inputs: ["icon"] }, { kind: "pipe", type: SiTranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.Default });
245
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: SiSplitPartComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
246
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.7", type: SiSplitPartComponent, isStandalone: true, selector: "si-split-part", inputs: { actions: { classPropertyName: "actions", publicName: "actions", isSignal: true, isRequired: false, transformFunction: null }, collapseDirection: { classPropertyName: "collapseDirection", publicName: "collapseDirection", isSignal: true, isRequired: false, transformFunction: null }, collapseIconClass: { classPropertyName: "collapseIconClass", publicName: "collapseIconClass", isSignal: true, isRequired: false, transformFunction: null }, collapseToMinSize: { classPropertyName: "collapseToMinSize", publicName: "collapseToMinSize", isSignal: true, isRequired: false, transformFunction: null }, headerTemplate: { classPropertyName: "headerTemplate", publicName: "headerTemplate", isSignal: true, isRequired: false, transformFunction: null }, heading: { classPropertyName: "heading", publicName: "heading", isSignal: true, isRequired: false, transformFunction: null }, minSize: { classPropertyName: "minSize", publicName: "minSize", isSignal: true, isRequired: false, transformFunction: null }, removeContentOnCollapse: { classPropertyName: "removeContentOnCollapse", publicName: "removeContentOnCollapse", isSignal: true, isRequired: false, transformFunction: null }, scale: { classPropertyName: "scale", publicName: "scale", isSignal: true, isRequired: false, transformFunction: null }, showCollapseButton: { classPropertyName: "showCollapseButton", publicName: "showCollapseButton", isSignal: true, isRequired: false, transformFunction: null }, showHeader: { classPropertyName: "showHeader", publicName: "showHeader", isSignal: true, isRequired: false, transformFunction: null }, collapseLabel: { classPropertyName: "collapseLabel", publicName: "collapseLabel", isSignal: true, isRequired: false, transformFunction: null }, stateId: { classPropertyName: "stateId", publicName: "stateId", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: true, transformFunction: null }, unit: { classPropertyName: "unit", publicName: "unit", isSignal: true, isRequired: true, transformFunction: null }, collapseOthers: { classPropertyName: "collapseOthers", publicName: "collapseOthers", isSignal: true, isRequired: false, transformFunction: null }, expanded: { classPropertyName: "expanded", publicName: "expanded", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { collapseChanged: "collapseChanged", stateChange: "stateChange" }, host: { properties: { "class.is-collapsed": "collapsedState()", "class.collapse-start": "collapseDirectionState() === \"start\"", "style.grid-area": "\"p-\" + this.index" } }, 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 [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 class=\"collapse-icon\" [icon]=\"collapseIconClass() ?? icons.elementDoubleRight\" />\n </button>\n </div>\n }\n </div>\n}\n\n@if (headerTemplate(); as 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:600;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: SiIconComponent, selector: "si-icon", inputs: ["icon"] }, { kind: "pipe", type: SiTranslatePipe, name: "translate" }] });
205
247
  }
206
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.8", ngImport: i0, type: SiSplitPartComponent, decorators: [{
248
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: SiSplitPartComponent, decorators: [{
207
249
  type: Component,
208
- args: [{ selector: 'si-split-part', imports: [NgTemplateOutlet, SiIconComponent, SiTranslatePipe], changeDetection: ChangeDetectionStrategy.Default, host: {
250
+ args: [{ selector: 'si-split-part', imports: [NgTemplateOutlet, SiIconComponent, SiTranslatePipe], host: {
209
251
  '[class.is-collapsed]': 'collapsedState()',
210
- '[class.collapse-start]': 'collapseDirection === "start"',
252
+ '[class.collapse-start]': 'collapseDirectionState() === "start"',
211
253
  '[style.grid-area]': '"p-" + this.index'
212
- }, 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 [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 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:600;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"] }]
213
- }], propDecorators: { actions: [{
214
- type: Input
215
- }], collapseDirection: [{
216
- type: Input
217
- }], collapseIconClass: [{
218
- type: Input
219
- }], collapseToMinSize: [{
220
- type: Input,
221
- args: [{ transform: booleanAttribute }]
222
- }], headerTemplate: [{
223
- type: Input
224
- }], heading: [{
225
- type: Input
226
- }], minSize: [{
227
- type: Input,
228
- args: [{ transform: numberAttribute }]
229
- }], removeContentOnCollapse: [{
230
- type: Input,
231
- args: [{ transform: booleanAttribute }]
232
- }], scale: [{
233
- type: Input
234
- }], showCollapseButton: [{
235
- type: Input,
236
- args: [{ transform: booleanAttribute }]
237
- }], showHeader: [{
238
- type: Input,
239
- args: [{ transform: booleanAttribute }]
240
- }], collapseLabel: [{
241
- type: Input
242
- }], stateId: [{
243
- type: Input
244
- }], size: [{
245
- type: Input,
246
- args: [{ transform: numberAttribute }]
247
- }], collapseOthers: [{
248
- type: Input,
249
- args: [{ transform: booleanAttribute }]
250
- }], collapseChanged: [{
251
- type: Output
252
- }], stateChange: [{
253
- type: Output
254
- }], expanded: [{
255
- type: Input,
256
- args: [{ transform: booleanAttribute }]
257
- }] } });
254
+ }, 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 [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 class=\"collapse-icon\" [icon]=\"collapseIconClass() ?? icons.elementDoubleRight\" />\n </button>\n </div>\n }\n </div>\n}\n\n@if (headerTemplate(); as 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:600;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"] }]
255
+ }], ctorParameters: () => [], propDecorators: { actions: [{ type: i0.Input, args: [{ isSignal: true, alias: "actions", required: false }] }], collapseDirection: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapseDirection", required: false }] }], collapseIconClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapseIconClass", required: false }] }], collapseToMinSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapseToMinSize", required: false }] }], headerTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "headerTemplate", required: false }] }], heading: [{ type: i0.Input, args: [{ isSignal: true, alias: "heading", required: false }] }], minSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "minSize", required: false }] }], removeContentOnCollapse: [{ type: i0.Input, args: [{ isSignal: true, alias: "removeContentOnCollapse", required: false }] }], scale: [{ type: i0.Input, args: [{ isSignal: true, alias: "scale", required: false }] }], showCollapseButton: [{ type: i0.Input, args: [{ isSignal: true, alias: "showCollapseButton", required: false }] }], showHeader: [{ type: i0.Input, args: [{ isSignal: true, alias: "showHeader", required: false }] }], collapseLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapseLabel", required: false }] }], stateId: [{ type: i0.Input, args: [{ isSignal: true, alias: "stateId", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: true }] }], unit: [{ type: i0.Input, args: [{ isSignal: true, alias: "unit", required: true }] }], collapseOthers: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapseOthers", required: false }] }], expanded: [{ type: i0.Input, args: [{ isSignal: true, alias: "expanded", required: false }] }], collapseChanged: [{ type: i0.Output, args: ["collapseChanged"] }], stateChange: [{ type: i0.Output, args: ["stateChange"] }] } });
258
256
 
259
257
  class SiSplitComponent {
260
- /** @defaultValue 16 */
261
- gutterSize = 16;
262
- // eslint-disable-next-line @typescript-eslint/naming-convention
263
- _orientation = signal('horizontal', ...(ngDevMode ? [{ debugName: "_orientation" }] : []));
264
- get orientation() {
265
- return this._orientation();
266
- }
267
- set orientation(value) {
268
- this._orientation.set(value);
269
- }
270
- /** @defaultValue [] */
271
- sizes = [];
258
+ /**
259
+ * Size of the gutter (divider) between split parts in pixels.
260
+ *
261
+ * @defaultValue 16
262
+ */
263
+ gutterSize = input(16, /* @ts-ignore */
264
+ ...(ngDevMode ? [{ debugName: "gutterSize" }] : /* istanbul ignore next */ []));
265
+ /**
266
+ * Defines the split layout direction.
267
+ *
268
+ * @defaultValue 'horizontal'
269
+ */
270
+ orientation = input('horizontal', /* @ts-ignore */
271
+ ...(ngDevMode ? [{ debugName: "orientation" }] : /* istanbul ignore next */ []));
272
272
  /**
273
273
  * An optional stateId to uniquely identify a component instance.
274
274
  * Required for persistence of ui state.
275
275
  */
276
- stateId;
277
- sizesChange = new EventEmitter();
278
- parts;
279
- gutters = [];
280
- // eslint-disable-next-line
281
- gridTemplateRows = signal('', ...(ngDevMode ? [{ debugName: "gridTemplateRows" }] : []));
282
- // eslint-disable-next-line
283
- gridTemplateColumns = signal('', ...(ngDevMode ? [{ debugName: "gridTemplateColumns" }] : []));
284
- // eslint-disable-next-line
285
- gridTemplateAreas = signal('', ...(ngDevMode ? [{ debugName: "gridTemplateAreas" }] : []));
276
+ stateId = input(/* @ts-ignore */
277
+ ...(ngDevMode ? [undefined, { debugName: "stateId" }] : /* istanbul ignore next */ []));
278
+ sizesChange = output();
279
+ parts = contentChildren(SiSplitPartComponent, /* @ts-ignore */
280
+ ...(ngDevMode ? [{ debugName: "parts" }] : /* istanbul ignore next */ []));
281
+ gutters = signal([], /* @ts-ignore */
282
+ ...(ngDevMode ? [{ debugName: "gutters" }] : /* istanbul ignore next */ []));
283
+ gridTemplate = computed(() => {
284
+ if (!this.initialized()) {
285
+ return '';
286
+ }
287
+ return this.parts()
288
+ .map(part => part.collapsedState()
289
+ ? part.collapseToMinSize()
290
+ ? `${part.minSize()}px`
291
+ : 'min-content'
292
+ : part.unit() === 'px'
293
+ ? `minmax(${part.minSize()}px, ${part.expandedSize() ?? part.size()}px)`
294
+ : `minmax(${part.minSize()}px, ${part.expandedSize() === undefined
295
+ ? part.fractionalSize() * this.fractionalSizeToExpandedSizeFactor()
296
+ : part.fractionalSize()}fr)`)
297
+ .join(' min-content ');
298
+ }, /* @ts-ignore */
299
+ ...(ngDevMode ? [{ debugName: "gridTemplate" }] : /* istanbul ignore next */ []));
300
+ gridTemplateRows = computed(() => this.orientation() === 'vertical' ? this.gridTemplate() : '1fr', /* @ts-ignore */
301
+ ...(ngDevMode ? [{ debugName: "gridTemplateRows" }] : /* istanbul ignore next */ []));
302
+ gridTemplateColumns = computed(() => this.orientation() === 'horizontal' ? this.gridTemplate() : '1fr', /* @ts-ignore */
303
+ ...(ngDevMode ? [{ debugName: "gridTemplateColumns" }] : /* istanbul ignore next */ []));
304
+ gridTemplateAreas = computed(() => {
305
+ if (!this.initialized()) {
306
+ return '';
307
+ }
308
+ const areaNames = this.parts()
309
+ .map((part, index) => [`p-${index}`, part.after() ? `g-${index}` : []])
310
+ .flat(2);
311
+ if (this.orientation() === 'horizontal') {
312
+ return `"${areaNames.join(' ')}"`;
313
+ }
314
+ else {
315
+ return `"${areaNames.join('" "')}"`;
316
+ }
317
+ }, /* @ts-ignore */
318
+ ...(ngDevMode ? [{ debugName: "gridTemplateAreas" }] : /* istanbul ignore next */ []));
286
319
  elementRef = inject((ElementRef));
287
320
  ngZone = inject(NgZone);
288
321
  changeDetectorRef = inject(ChangeDetectorRef);
289
322
  document = inject(DOCUMENT);
290
323
  uiStateService = inject(SI_UI_STATE_SERVICE, { optional: true });
291
- // New parts won't be measured, so we need this to scale up their fractional size to the expanded size.
292
- // Using 10, as the sum of all fractional sizes is 1, so we need to scale them up as fr-values should be >= 1.
293
- fractionalSizeToExpandedSizeFactor = 10;
294
- ngOnChanges(changes) {
295
- if (changes.sizes && !changes.sizes.firstChange) {
296
- this.sizes.forEach((size, index) => {
297
- const part = this.parts.get(index);
298
- if (part) {
299
- part.fractionalSize.set(size);
300
- part.expandedSize.set(undefined);
301
- }
302
- });
303
- this.alignRelativeSizes();
304
- }
305
- }
306
- ngAfterContentInit() {
307
- this.parts.changes.pipe(observeOn(asapScheduler)).subscribe(() => {
308
- this.changeDetectorRef.markForCheck();
309
- this.gutters = [];
310
- for (let index = 0; index < this.parts.length; index++) {
311
- const component = this.parts.get(index);
312
- component.index = index;
313
- component.after = this.parts.get(index + 1);
314
- component.before = this.parts.get(index - 1);
315
- component.fractionalSize.set(this.sizes[index]);
316
- component.saveUIState = () => this.saveUIState();
317
- if (component.after) {
318
- this.gutters.push({
319
- before: component,
320
- after: this.parts.get(index + 1),
321
- visible: computed(() => {
322
- const afterPart = component.after.nextExpandedAfter();
323
- return !afterPart.collapsedState() && !component.collapsedState();
324
- })
325
- });
326
- }
327
- }
328
- this.alignRelativeSizes();
329
- this.updateFractionalSizeToExpandSizeFactor();
330
- this.restoreFormUIState();
331
- const gridTemplate = computed(() => this.parts
332
- .map(part => part.collapsedState()
333
- ? part.collapseToMinSize
334
- ? `${part.minSize}px`
335
- : 'min-content'
336
- : part.actualSize()
337
- ? part.scale === 'auto'
338
- ? `minmax(${part.minSize}px, ${part.actualSize()}fr)`
339
- : `minmax(${part.minSize}px, ${part.actualSize()}px)`
340
- : `minmax(${part.minSize}px, ${part.fractionalSize() * this.fractionalSizeToExpandedSizeFactor}fr)`)
341
- .join(' min-content '), ...(ngDevMode ? [{ debugName: "gridTemplate" }] : []));
342
- this.gridTemplateRows = computed(() => this._orientation() === 'vertical' ? gridTemplate() : '1fr', ...(ngDevMode ? [{ debugName: "gridTemplateRows" }] : []));
343
- this.gridTemplateColumns = computed(() => this._orientation() === 'horizontal' ? gridTemplate() : '1fr', ...(ngDevMode ? [{ debugName: "gridTemplateColumns" }] : []));
344
- this.gridTemplateAreas = computed(() => {
345
- const areaNames = this.parts
346
- .map((part, index) => [`p-${index}`, part.after ? `g-${index}` : []])
347
- .flat(2);
348
- if (this._orientation() === 'horizontal') {
349
- return `"${areaNames.join(' ')}"`;
350
- }
351
- else {
352
- return `"${areaNames.join('" "')}"`;
353
- }
354
- }, ...(ngDevMode ? [{ debugName: "gridTemplateAreas" }] : []));
355
- setTimeout(() => this.refreshAllPartSizes());
356
- });
357
- this.parts.notifyOnChanges();
358
- }
359
- alignRelativeSizes() {
360
- const requestedNoSize = this.parts.filter(part => !part.size && !part.fractionalSize());
361
- const requestedRelSize = this.parts.filter(part => part.fractionalSize() && !part.size);
362
- if (requestedRelSize.length) {
363
- const totalRequestedRelSize = requestedRelSize.reduce((a, b) => a + b.fractionalSize(), 0);
364
- const averageRelSize = totalRequestedRelSize / requestedRelSize.length;
365
- const totalAssignedRelSize = totalRequestedRelSize + requestedNoSize.length * averageRelSize;
366
- requestedNoSize.forEach(part => part.fractionalSize.set(averageRelSize / totalAssignedRelSize));
367
- requestedRelSize.forEach(part => part.fractionalSize.set(part.fractionalSize() / totalAssignedRelSize));
368
- }
369
- else {
370
- requestedNoSize.forEach(part => part.fractionalSize.set(1 / requestedNoSize.length));
371
- }
324
+ destroyRef = inject(DestroyRef);
325
+ // Existing fr parts are measured in pixels after layout or dragging, so their fr weights become
326
+ // pixel-derived. A newly added fr part has not been measured yet and still has its configured
327
+ // weight. This factor converts that configured weight into the same scale until it is measured.
328
+ // It is the ratio of measured expanded sizes to configured weights of visible measured fr parts.
329
+ fractionalSizeToExpandedSizeFactor = computed(() => {
330
+ const measuredParts = this.parts().filter(part => !part.collapsedState() && part.unit() === 'fr' && part.expandedSize() !== undefined);
331
+ const configuredSizeSum = measuredParts.reduce((sum, part) => sum + part.size(), 0);
332
+ const expandedSizeSum = measuredParts.reduce((sum, part) => sum + part.expandedSize(), 0);
333
+ return configuredSizeSum ? expandedSizeSum / configuredSizeSum : 1;
334
+ }, /* @ts-ignore */
335
+ ...(ngDevMode ? [{ debugName: "fractionalSizeToExpandedSizeFactor" }] : /* istanbul ignore next */ []));
336
+ initialized = signal(false, /* @ts-ignore */
337
+ ...(ngDevMode ? [{ debugName: "initialized" }] : /* istanbul ignore next */ []));
338
+ constructor() {
339
+ toObservable(this.parts)
340
+ .pipe(observeOn(asapScheduler), takeUntilDestroyed())
341
+ .subscribe(() => this.setupParts());
372
342
  }
373
- updateFractionalSizeToExpandSizeFactor() {
374
- let previousScalableFractionalSum = 0;
375
- let previousScalableExpandedSizeSum = 0;
376
- for (let index = 0; index < this.parts.length; index++) {
377
- const component = this.parts.get(index);
378
- if (component.scale === 'auto' && component.expandedSize() !== undefined) {
379
- previousScalableExpandedSizeSum += component.expandedSize();
380
- previousScalableFractionalSum += component.fractionalSize();
343
+ setupParts() {
344
+ this.initialized.set(true);
345
+ const gutters = [];
346
+ const parts = this.parts();
347
+ for (let index = 0; index < parts.length; index++) {
348
+ const component = parts[index];
349
+ component.index = index;
350
+ component.after.set(parts[index + 1]);
351
+ component.before.set(parts[index - 1]);
352
+ component.saveUIState = () => this.saveUIState();
353
+ if (component.after()) {
354
+ gutters.push({
355
+ before: component,
356
+ after: parts[index + 1],
357
+ visible: computed(() => {
358
+ const afterPart = component.after().nextExpandedAfter();
359
+ return !afterPart.collapsedState() && !component.collapsedState();
360
+ })
361
+ });
381
362
  }
382
363
  }
383
- this.fractionalSizeToExpandedSizeFactor = previousScalableFractionalSum
384
- ? previousScalableExpandedSizeSum / previousScalableFractionalSum
385
- : 10;
364
+ this.gutters.set(gutters);
365
+ this.restoreFromUIState();
366
+ setTimeout(() => this.refreshAllPartSizes());
386
367
  }
387
368
  refreshAllPartSizes() {
388
- const refParts = this.parts.filter(part => !part.collapsedState() &&
389
- part.scale === 'auto' &&
390
- (part.expandedSize() || part.fractionalSize()));
391
- const beforeFrSum = refParts.reduce((a, b) => a + (b.expandedSize() ?? b.fractionalSize()), 0);
392
- this.parts.forEach(part => part.refreshSizePx(this.orientation));
393
- const afterFrSum = refParts.reduce((a, b) => a + b.expandedSize(), 0);
394
- const beforeToAfterFactor = afterFrSum / beforeFrSum;
395
- this.parts
396
- .filter(part => part.collapsedState() && (part.scale === 'auto' || part.expandedSize() === undefined))
397
- .forEach(part => part.expandedSize.update(prev => (prev ?? part.fractionalSize()) * beforeToAfterFactor));
369
+ this.parts().forEach(part => {
370
+ part.refreshSizePx(this.orientation());
371
+ if (!part.collapsedState() && part.unit() === 'fr') {
372
+ part.fractionalSize.set(part.expandedSize());
373
+ }
374
+ });
398
375
  }
399
376
  resizeStart(gutter, event) {
400
377
  this.refreshAllPartSizes();
@@ -405,17 +382,17 @@ class SiSplitComponent {
405
382
  let appliedDelta = 0;
406
383
  const rtl = isRTL();
407
384
  const startPosition = this.getPosition(event);
408
- const minDelta = -1 * (beforeSize - gutter.before.minSize);
409
- const maxDelta = afterSize - afterPart.minSize;
385
+ const minDelta = -1 * (beforeSize - gutter.before.minSize());
386
+ const maxDelta = afterSize - afterPart.minSize();
410
387
  const containerSize = this.measureContainerSize();
411
388
  event.preventDefault(); // prevents text-selection
412
389
  this.ngZone.runOutsideAngular(() => {
413
390
  merge(fromEvent(this.document, 'mousemove'), fromEvent(this.document, 'touchmove'))
414
- .pipe(takeUntil(merge(fromEvent(this.document, 'mouseup'), fromEvent(this.document, 'touchend'))))
391
+ .pipe(takeUntil(merge(fromEvent(this.document, 'mouseup'), fromEvent(this.document, 'touchend'))), takeUntilDestroyed(this.destroyRef))
415
392
  .subscribe({
416
393
  next: move => {
417
394
  let delta = this.getPosition(move) - startPosition;
418
- if (rtl && this.orientation === 'horizontal') {
395
+ if (rtl && this.orientation() === 'horizontal') {
419
396
  delta *= -1;
420
397
  }
421
398
  delta -= appliedDelta;
@@ -433,13 +410,19 @@ class SiSplitComponent {
433
410
  appliedDelta += delta;
434
411
  gutter.before.expandedSize.set(beforeSize);
435
412
  afterPart.expandedSize.set(afterSize);
436
- if (this.orientation === 'vertical') {
413
+ if (gutter.before.unit() === 'fr') {
414
+ gutter.before.fractionalSize.set(beforeSize);
415
+ }
416
+ if (afterPart.unit() === 'fr') {
417
+ afterPart.fractionalSize.set(afterSize);
418
+ }
419
+ if (this.orientation() === 'vertical') {
437
420
  this.elementRef.nativeElement.style.setProperty('grid-template-rows', this.gridTemplateRows());
438
421
  }
439
422
  else {
440
423
  this.elementRef.nativeElement.style.setProperty('grid-template-columns', this.gridTemplateColumns());
441
424
  }
442
- this.ngZone.run(() => this.sizesChange.emit(this.parts.map(part => (part.actualSize() * 100) / containerSize)));
425
+ this.ngZone.run(() => this.sizesChange.emit(this.parts().map(part => (part.actualSize() * 100) / containerSize)));
443
426
  },
444
427
  complete: () => this.saveUIState()
445
428
  });
@@ -447,7 +430,7 @@ class SiSplitComponent {
447
430
  }
448
431
  measureContainerSize() {
449
432
  const rect = this.elementRef.nativeElement.getBoundingClientRect();
450
- if (this._orientation() === 'vertical') {
433
+ if (this.orientation() === 'vertical') {
451
434
  return rect.height;
452
435
  }
453
436
  else {
@@ -456,86 +439,83 @@ class SiSplitComponent {
456
439
  }
457
440
  getPosition(event) {
458
441
  const positionObject = event.touches?.[0] ?? event;
459
- return this.orientation === 'horizontal'
442
+ return this.orientation() === 'horizontal'
460
443
  ? (positionObject.clientX ?? 0)
461
444
  : (positionObject.clientY ?? 0);
462
445
  }
463
446
  saveUIState() {
464
- if (!this.stateId || !this.uiStateService) {
447
+ const stateId = this.stateId();
448
+ if (!stateId || !this.uiStateService) {
465
449
  return;
466
450
  }
467
- const containerSize = this.measureContainerSize();
468
- const state = this.parts.reduce((partState, part) => {
469
- if (part.stateId) {
470
- partState[part.stateId] = {
471
- size: ((part.expandedSize() ?? 0) * 100) / containerSize,
472
- initialSize: this.sizes[part.index],
473
- expanded: part.expanded
451
+ const state = this.parts().reduce((partState, part) => {
452
+ const partStateId = part.stateId();
453
+ if (partStateId) {
454
+ const unit = part.unit();
455
+ partState[partStateId] = {
456
+ size: unit === 'px' ? part.expandedSize() : part.fractionalSize(),
457
+ initialSize: part.size(),
458
+ initialUnit: unit,
459
+ expanded: !part.collapsedState()
474
460
  };
475
461
  }
476
462
  return partState;
477
463
  }, {});
478
- this.uiStateService.save(this.stateId, state);
464
+ this.uiStateService.save(stateId, state);
479
465
  }
480
- restoreFormUIState() {
481
- if (!this.stateId || !this.uiStateService) {
466
+ restoreFromUIState() {
467
+ const stateId = this.stateId();
468
+ if (!stateId || !this.uiStateService) {
482
469
  return;
483
470
  }
484
- this.uiStateService.load(this.stateId).then(uiState => {
471
+ this.uiStateService.load(stateId).then(uiState => {
485
472
  if (!uiState) {
486
473
  return;
487
474
  }
488
- this.parts
489
- .filter(part => part.stateId)
490
- .map(part => ({ part, state: uiState[part.stateId] }))
491
- .filter(({ part, state }) => this.sizes[part.index] === state?.initialSize)
475
+ this.parts()
476
+ .filter(part => part.stateId())
477
+ .map(part => ({ part, state: uiState[part.stateId()] }))
478
+ .filter((item) => !!item.state &&
479
+ item.state.initialSize === item.part.size() &&
480
+ item.state.initialUnit === item.part.unit())
492
481
  .forEach(({ part, state }) => {
493
- part.expandedSize.set(undefined);
494
- part.fractionalSize.set(state?.size);
495
- part.collapsedState.set(!(state?.expanded ?? true));
482
+ if (part.unit() === 'px') {
483
+ part.expandedSize.set(state.size);
484
+ }
485
+ else {
486
+ part.fractionalSize.set(state.size);
487
+ }
488
+ part.collapsedState.set(!state.expanded);
496
489
  });
497
490
  setTimeout(() => this.refreshAllPartSizes());
498
491
  });
499
492
  }
500
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.8", ngImport: i0, type: SiSplitComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
501
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.8", 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 });
493
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: SiSplitComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
494
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.7", type: SiSplitComponent, isStandalone: true, selector: "si-split", inputs: { gutterSize: { classPropertyName: "gutterSize", publicName: "gutterSize", isSignal: true, isRequired: false, transformFunction: null }, orientation: { classPropertyName: "orientation", publicName: "orientation", isSignal: true, isRequired: false, transformFunction: null }, stateId: { classPropertyName: "stateId", publicName: "stateId", isSignal: true, isRequired: false, transformFunction: null } }, 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, isSignal: 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:col-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:-1px;inline-size:2px;block-size:40px;background:var(--element-ui-2)}:host(.vertical)>.si-split-gutter{inline-size:auto;cursor:row-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"] });
502
495
  }
503
496
  __decorate([
504
497
  WebComponentContentChildren(SiSplitPartComponent)
505
498
  ], SiSplitComponent.prototype, "parts", void 0);
506
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.8", ngImport: i0, type: SiSplitComponent, decorators: [{
499
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: SiSplitComponent, decorators: [{
507
500
  type: Component,
508
- args: [{ selector: 'si-split', changeDetection: ChangeDetectionStrategy.OnPush, host: {
509
- '[class]': '_orientation()',
501
+ args: [{ selector: 'si-split', host: {
502
+ '[class]': 'orientation()',
510
503
  '[style.grid-template-rows]': 'gridTemplateRows()',
511
504
  '[style.grid-template-columns]': 'gridTemplateColumns()',
512
505
  '[style.grid-template-areas]': 'gridTemplateAreas()'
513
- }, 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"] }]
514
- }], propDecorators: { gutterSize: [{
515
- type: Input
516
- }], orientation: [{
517
- type: Input
518
- }], sizes: [{
519
- type: Input
520
- }], stateId: [{
521
- type: Input
522
- }], sizesChange: [{
523
- type: Output
524
- }], parts: [{
525
- type: ContentChildren,
526
- args: [SiSplitPartComponent]
527
- }] } });
506
+ }, 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:col-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:-1px;inline-size:2px;block-size:40px;background:var(--element-ui-2)}:host(.vertical)>.si-split-gutter{inline-size:auto;cursor:row-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"] }]
507
+ }], ctorParameters: () => [], propDecorators: { gutterSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "gutterSize", required: false }] }], orientation: [{ type: i0.Input, args: [{ isSignal: true, alias: "orientation", required: false }] }], stateId: [{ type: i0.Input, args: [{ isSignal: true, alias: "stateId", required: false }] }], sizesChange: [{ type: i0.Output, args: ["sizesChange"] }], parts: [] } });
528
508
 
529
509
  /**
530
510
  * Copyright (c) Siemens 2016 - 2026
531
511
  * SPDX-License-Identifier: MIT
532
512
  */
533
513
  class SiSplitModule {
534
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.8", ngImport: i0, type: SiSplitModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
535
- static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.0.8", ngImport: i0, type: SiSplitModule, imports: [SiSplitComponent, SiSplitPartComponent], exports: [SiSplitComponent, SiSplitPartComponent] });
536
- static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "21.0.8", ngImport: i0, type: SiSplitModule, imports: [SiSplitPartComponent] });
514
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: SiSplitModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
515
+ static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "22.0.7", ngImport: i0, type: SiSplitModule, imports: [SiSplitComponent, SiSplitPartComponent], exports: [SiSplitComponent, SiSplitPartComponent] });
516
+ static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: SiSplitModule, imports: [SiSplitPartComponent] });
537
517
  }
538
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.8", ngImport: i0, type: SiSplitModule, decorators: [{
518
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.7", ngImport: i0, type: SiSplitModule, decorators: [{
539
519
  type: NgModule,
540
520
  args: [{
541
521
  imports: [SiSplitComponent, SiSplitPartComponent],