@siemens/element-ng 49.16.0 → 51.0.0-rc.10

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