@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
@@ -103,11 +103,12 @@ class SiLocaleService {
103
103
  let initialLocale;
104
104
  const browserCultureLang = getBrowserCultureLanguage();
105
105
  const browserLang = getBrowserLanguage();
106
+ const currentLanguage = this.translate.currentLanguage;
106
107
  if (this.hasLocale(savedLocale)) {
107
108
  initialLocale = savedLocale;
108
109
  }
109
- else if (this.translate.currentLanguage) {
110
- initialLocale = this.translate.currentLanguage;
110
+ else if (currentLanguage) {
111
+ initialLocale = currentLanguage;
111
112
  }
112
113
  else if (this.hasLocale(browserCultureLang)) {
113
114
  initialLocale = browserCultureLang;
@@ -205,10 +206,10 @@ class SiLocaleService {
205
206
  }
206
207
  return false;
207
208
  }
208
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.8", ngImport: i0, type: SiLocaleService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
209
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.0.8", ngImport: i0, type: SiLocaleService, providedIn: 'root' });
209
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SiLocaleService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
210
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SiLocaleService, providedIn: 'root' });
210
211
  }
211
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.8", ngImport: i0, type: SiLocaleService, decorators: [{
212
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SiLocaleService, decorators: [{
212
213
  type: Injectable,
213
214
  args: [{ providedIn: 'root' }]
214
215
  }], ctorParameters: () => [] });
@@ -244,10 +245,10 @@ class SiLocaleId extends String {
244
245
  toLowerCase() {
245
246
  return this.toString().toLowerCase();
246
247
  }
247
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.8", ngImport: i0, type: SiLocaleId, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
248
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.0.8", ngImport: i0, type: SiLocaleId });
248
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SiLocaleId, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
249
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SiLocaleId });
249
250
  }
250
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.8", ngImport: i0, type: SiLocaleId, decorators: [{
251
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SiLocaleId, decorators: [{
251
252
  type: Injectable
252
253
  }], ctorParameters: () => [] });
253
254
 
@@ -278,7 +279,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.8", ngImpor
278
279
  class SiDirectionality {
279
280
  change = new EventEmitter();
280
281
  /** @defaultValue 'ltr' */
281
- valueSignal = signal('ltr', ...(ngDevMode ? [{ debugName: "valueSignal" }] : []));
282
+ valueSignal = signal('ltr', /* @ts-ignore */
283
+ ...(ngDevMode ? [{ debugName: "valueSignal" }] : /* istanbul ignore next */ []));
282
284
  get value() {
283
285
  const dir = isRTL() ? 'rtl' : 'ltr';
284
286
  this.valueSignal.set(dir);
@@ -289,10 +291,10 @@ class SiDirectionality {
289
291
  ngOnDestroy() {
290
292
  // empty, from Directionality
291
293
  }
292
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.8", ngImport: i0, type: SiDirectionality, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
293
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.0.8", ngImport: i0, type: SiDirectionality });
294
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SiDirectionality, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
295
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SiDirectionality });
294
296
  }
295
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.8", ngImport: i0, type: SiDirectionality, decorators: [{
297
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SiDirectionality, decorators: [{
296
298
  type: Injectable
297
299
  }] });
298
300
 
@@ -1 +1 @@
1
- {"version":3,"file":"siemens-element-ng-localization.mjs","sources":["../../../../projects/element-ng/localization/si-locale-store.ts","../../../../projects/element-ng/localization/si-locale.service.ts","../../../../projects/element-ng/localization/si-locale-id.ts","../../../../projects/element-ng/localization/si-directionality.ts","../../../../projects/element-ng/localization/index.ts","../../../../projects/element-ng/localization/siemens-element-ng-localization.ts"],"sourcesContent":["/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nimport { Observable, of } from 'rxjs';\n\nexport abstract class SiLocaleStore {\n abstract get locale(): string | undefined;\n abstract saveLocale(locale: string): Observable<boolean>;\n}\n\nexport const SI_LOCALE_LOCAL_STORAGE_KEY = 'lang';\n\nexport class SiDefaultLocaleStore extends SiLocaleStore {\n constructor(private isBrowser: boolean) {\n super();\n }\n\n get locale(): string | undefined {\n if (this.isBrowser) {\n return localStorage.getItem(SI_LOCALE_LOCAL_STORAGE_KEY) ?? undefined;\n } else {\n return undefined;\n }\n }\n\n saveLocale(locale: string): Observable<boolean> {\n if (this.isBrowser) {\n localStorage.setItem(SI_LOCALE_LOCAL_STORAGE_KEY, locale);\n return of(true);\n } else {\n return of(false);\n }\n }\n}\n","/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nimport { isPlatformBrowser } from '@angular/common';\nimport { inject, Injectable, InjectionToken, PLATFORM_ID } from '@angular/core';\nimport {\n getBrowserCultureLanguage,\n getBrowserLanguage,\n injectSiTranslateService\n} from '@siemens/element-translate-ng/translate';\nimport { BehaviorSubject, ReplaySubject } from 'rxjs';\nimport { first } from 'rxjs/operators';\n\nimport { SiDefaultLocaleStore, SiLocaleStore } from './si-locale-store';\n\nexport const SI_LOCALE_STORE = new InjectionToken<string>('SI_LOCALE_STORE');\nexport const SI_LOCALE_CONFIG = new InjectionToken<SiLocaleConfig>('SI_LOCALE_CONFIG');\n\n// this is a function because Angular compiler exports arrows for no good reason\n// eslint-disable-next-line prefer-arrow/prefer-arrow-functions\nfunction defaultLocaleInitializer(localeId: string): Promise<void> {\n if (localeId === 'en') {\n return Promise.resolve();\n } else {\n return Promise.reject();\n }\n}\n\nexport interface SiLocaleConfig {\n /**\n * The default locale to be used, when no user preference\n * available and the browser language is not part of the\n * available languages.\n */\n defaultLocale?: string;\n /**\n * The list of available locales (e.g. en, fr, de, en-GB, de-AT)\n */\n availableLocales?: string[];\n /**\n * The localeInitializer function is invoked on every locale change.\n * Make sure to invoke `registerLocaleData` with the locale to enable\n * the Angular localization.\n */\n localeInitializer?: (localeId: string) => Promise<any>;\n /**\n * Set to true to also enable the default language on ngx-translate. When true,\n * ngx-translate will use a translate value from the default language when a required\n * value is not available in the current language. But note, this will also enforce\n * to load the default language translation file into the application, even if a different\n * locale is active. In other words, the application start time increases.\n */\n fallbackEnabled?: boolean;\n /**\n * Default is false and defines that on setting a new locale, the locale is stored and the\n * browser is reloaded. When changing to true, window reload is not invoked, but angular\n * pure pipes like DatePipe will not work.\n */\n dynamicLanguageChange?: boolean;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class SiLocaleService {\n /**\n * Holds the used locale definition like en, de, or en-US.\n */\n readonly locale$: BehaviorSubject<string>;\n /**\n * Emits to indicate that the localization package (e.g. \\@angular/common/locales/$\\{localeId\\})\n * is loaded and registered. Emits after calling `localeInitializer` from the `config` object.\n */\n readonly localePackageLoaded$ = new ReplaySubject<void>(1);\n\n private _nextLocale!: string;\n private isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n private translate = injectSiTranslateService();\n private localeStore =\n inject(SiLocaleStore, { optional: true }) ?? new SiDefaultLocaleStore(this.isBrowser);\n /**\n * The config for the local service.\n */\n config = inject(SI_LOCALE_CONFIG, { optional: true }) ?? {\n availableLocales: ['en'],\n defaultLocale: 'en',\n localeInitializer: defaultLocaleInitializer,\n fallbackEnabled: false,\n dynamicLanguageChange: false\n };\n\n constructor() {\n if (!this.config.defaultLocale) {\n if (this.config.availableLocales && this.config.availableLocales.length > 0) {\n this.config.defaultLocale = this.config.availableLocales[0];\n } else {\n this.config.defaultLocale = 'en';\n }\n }\n\n if (!this.config.availableLocales || this.config.availableLocales.length === 0) {\n this.config.availableLocales = [this.config.defaultLocale];\n }\n // Also adds all locales to the translate service to enable\n // components working with the translate service directly to still work.\n this.translate.availableLanguages = this.config.availableLocales;\n\n this.config.localeInitializer ??= defaultLocaleInitializer;\n this.config.fallbackEnabled ??= false;\n this.config.dynamicLanguageChange ??= false;\n\n const savedLocale = this.localeStore.locale;\n // The following check is important. We do not control the store and when it comes from\n // a remove backend, someone might give us a locale that we do not understand. In this\n // case we switch to the default.\n let initialLocale;\n const browserCultureLang = getBrowserCultureLanguage();\n const browserLang = getBrowserLanguage();\n if (this.hasLocale(savedLocale)) {\n initialLocale = savedLocale!;\n } else if (this.translate.currentLanguage) {\n initialLocale = this.translate.currentLanguage;\n } else if (this.hasLocale(browserCultureLang)) {\n initialLocale = browserCultureLang!;\n } else if (this.hasLocale(browserLang)) {\n initialLocale = browserLang!;\n } else {\n initialLocale = this.config.defaultLocale;\n }\n this.locale$ = new BehaviorSubject<string>(initialLocale);\n this.doSetLocale(initialLocale);\n\n // If a user changes the language on the translate service directly,\n // we synchronize the change again.\n this.translate.translationChange.subscribe(() => {\n const current = this.translate.currentLanguage;\n if (current) {\n this.locale = current;\n }\n });\n\n if (this.config.fallbackEnabled) {\n this.translate.setDefaultLanguage(this.config.defaultLocale);\n }\n }\n\n /**\n * Sets a new locale to the locale service and also to the translate\n * service.\n * @throws An error if the new value is not configured in the available locales\n * or if the new locale cannot be saved, an error is thrown.\n */\n set locale(value: string) {\n if (value === this.locale$.value || value === this._nextLocale) {\n return;\n }\n if (!this.hasLocale(value)) {\n throw new Error(`The value ${value} does not exist in the available locales.`);\n }\n this.localeStore\n .saveLocale(value)\n .pipe(first())\n .subscribe({\n next: (saveSucceed: boolean) => {\n if (saveSucceed) {\n if (this.config.dynamicLanguageChange) {\n this.doSetLocale(value);\n } else if (this.isBrowser) {\n window.location.reload();\n }\n } else {\n throw new Error(`Could not save new locale ${value}.`);\n }\n },\n error: () => {\n throw new Error(`Could not save new locale ${value}.`);\n }\n });\n }\n\n get locale(): string {\n return this.locale$.value;\n }\n\n private doSetLocale(value: string): void {\n this._nextLocale = value;\n this.config.localeInitializer!(value).then(\n () => {\n this.localePackageLoaded$.next();\n this.translate\n .setCurrentLanguage(value)\n .pipe(first())\n .subscribe(() => {\n if (this.locale$.value !== value) {\n this.locale$.next(value);\n }\n });\n },\n () => {\n console.error(\n `Could not initialize new locale ${value}. Setting default locale ${this.config.defaultLocale}`\n );\n // Initialization of locale rejected. Setting default locale.\n this.translate\n .setCurrentLanguage(this.config.defaultLocale!)\n .pipe(first())\n .subscribe(() => {\n if (this.locale$.value !== this.config.defaultLocale!) {\n this.locale$.next(this.config.defaultLocale!);\n }\n });\n }\n );\n }\n\n /**\n * Test if the given locale is part of the available locales.\n * @param locale - The locale to be tested.\n */\n hasLocale(locale?: string): boolean {\n if (locale) {\n return this.config.availableLocales!.includes(locale);\n }\n return false;\n }\n}\n","/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nimport { inject, Injectable } from '@angular/core';\n\nimport { SiLocaleService } from './si-locale.service';\n\n/**\n * The SiLocaleId is used to provide a locale id from the translate service\n * to the angular localization. The Angular services call toString or valueOf\n * so that the current locale of the translation service is provided. The Intl.\n * library does not invoke toString() and using the value directly in Intl\n * formatting results always having the `en` locale. Thus, when using the SiLocaleId\n * in other services, make sure to use the `toString()` method before.\n */\n@Injectable()\nexport class SiLocaleId extends String {\n protected service: SiLocaleService;\n\n // the constructor is needed for unknown reasons. w/o the inject() fails\n constructor() {\n super();\n this.service = inject(SiLocaleService);\n }\n\n /**\n * Outputs the locale id as a string.\n */\n override toString(): string {\n return this.service.locale === 'template' ? 'en' : this.service.locale;\n }\n\n override valueOf(): string {\n return this.toString();\n }\n\n override toLowerCase(): string {\n return this.toString().toLowerCase();\n }\n}\n","/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nimport { Direction, Directionality } from '@angular/cdk/bidi';\nimport { EventEmitter, Injectable, signal } from '@angular/core';\nimport { isRTL } from '@siemens/element-ng/common';\n\n/**\n * Provider for dynamic CDK directionality.\n *\n * CDK per default evaluates directionality once during initialization. This is a problem when\n * switching language later in the lifecycle. This provider can be used to make this dynamic.\n * To use, simply provide this in the `ApplicationConfig`:\n *\n * ```ts\n * import { Directionality } from '@angular/cdk/bidi';\n * import { SiDirectionality } from '@siemens/element-ng/localization';\n *\n * ...\n * export const APP_CONFIG: ApplicationConfig = {\n * providers: [\n * { provide: Directionality, useClass: SiDirectionality },\n * ...\n * ]\n * }\n *\n * bootstrapApplication(AppComponent, APP_CONFIG)\n * ...\n *\n * ```\n */\n\n@Injectable()\nexport class SiDirectionality implements Directionality {\n readonly change = new EventEmitter<Direction>();\n\n /** @defaultValue 'ltr' */\n readonly valueSignal = signal<Direction>('ltr');\n\n get value(): Direction {\n const dir = isRTL() ? 'rtl' : 'ltr';\n this.valueSignal.set(dir);\n return dir;\n }\n\n /** @internal */\n // eslint-disable-next-line @angular-eslint/use-lifecycle-interface, @angular-eslint/no-empty-lifecycle-method\n ngOnDestroy(): void {\n // empty, from Directionality\n }\n}\n","/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nexport * from './si-locale-id';\nexport * from './si-locale-store';\nexport * from './si-locale.service';\nexport * from './si-directionality';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"siemens-element-ng-localization.mjs","sources":["../../../../projects/element-ng/localization/si-locale-store.ts","../../../../projects/element-ng/localization/si-locale.service.ts","../../../../projects/element-ng/localization/si-locale-id.ts","../../../../projects/element-ng/localization/si-directionality.ts","../../../../projects/element-ng/localization/index.ts","../../../../projects/element-ng/localization/siemens-element-ng-localization.ts"],"sourcesContent":["/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nimport { Observable, of } from 'rxjs';\n\nexport abstract class SiLocaleStore {\n abstract get locale(): string | undefined;\n abstract saveLocale(locale: string): Observable<boolean>;\n}\n\nexport const SI_LOCALE_LOCAL_STORAGE_KEY = 'lang';\n\nexport class SiDefaultLocaleStore extends SiLocaleStore {\n constructor(private isBrowser: boolean) {\n super();\n }\n\n get locale(): string | undefined {\n if (this.isBrowser) {\n return localStorage.getItem(SI_LOCALE_LOCAL_STORAGE_KEY) ?? undefined;\n } else {\n return undefined;\n }\n }\n\n saveLocale(locale: string): Observable<boolean> {\n if (this.isBrowser) {\n localStorage.setItem(SI_LOCALE_LOCAL_STORAGE_KEY, locale);\n return of(true);\n } else {\n return of(false);\n }\n }\n}\n","/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nimport { isPlatformBrowser } from '@angular/common';\nimport { inject, Injectable, InjectionToken, PLATFORM_ID } from '@angular/core';\nimport {\n getBrowserCultureLanguage,\n getBrowserLanguage,\n injectSiTranslateService\n} from '@siemens/element-translate-ng/translate';\nimport { BehaviorSubject, ReplaySubject } from 'rxjs';\nimport { first } from 'rxjs/operators';\n\nimport { SiDefaultLocaleStore, SiLocaleStore } from './si-locale-store';\n\nexport const SI_LOCALE_STORE = new InjectionToken<string>('SI_LOCALE_STORE');\nexport const SI_LOCALE_CONFIG = new InjectionToken<SiLocaleConfig>('SI_LOCALE_CONFIG');\n\n// this is a function because Angular compiler exports arrows for no good reason\n// eslint-disable-next-line prefer-arrow/prefer-arrow-functions\nfunction defaultLocaleInitializer(localeId: string): Promise<void> {\n if (localeId === 'en') {\n return Promise.resolve();\n } else {\n return Promise.reject();\n }\n}\n\nexport interface SiLocaleConfig {\n /**\n * The default locale to be used, when no user preference\n * available and the browser language is not part of the\n * available languages.\n */\n defaultLocale?: string;\n /**\n * The list of available locales (e.g. en, fr, de, en-GB, de-AT)\n */\n availableLocales?: string[];\n /**\n * The localeInitializer function is invoked on every locale change.\n * Make sure to invoke `registerLocaleData` with the locale to enable\n * the Angular localization.\n */\n localeInitializer?: (localeId: string) => Promise<any>;\n /**\n * Set to true to also enable the default language on ngx-translate. When true,\n * ngx-translate will use a translate value from the default language when a required\n * value is not available in the current language. But note, this will also enforce\n * to load the default language translation file into the application, even if a different\n * locale is active. In other words, the application start time increases.\n */\n fallbackEnabled?: boolean;\n /**\n * Default is false and defines that on setting a new locale, the locale is stored and the\n * browser is reloaded. When changing to true, window reload is not invoked, but angular\n * pure pipes like DatePipe will not work.\n */\n dynamicLanguageChange?: boolean;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class SiLocaleService {\n /**\n * Holds the used locale definition like en, de, or en-US.\n */\n readonly locale$: BehaviorSubject<string>;\n /**\n * Emits to indicate that the localization package (e.g. \\@angular/common/locales/$\\{localeId\\})\n * is loaded and registered. Emits after calling `localeInitializer` from the `config` object.\n */\n readonly localePackageLoaded$ = new ReplaySubject<void>(1);\n\n private _nextLocale!: string;\n private isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n private translate = injectSiTranslateService();\n private localeStore =\n inject(SiLocaleStore, { optional: true }) ?? new SiDefaultLocaleStore(this.isBrowser);\n /**\n * The config for the local service.\n */\n config = inject(SI_LOCALE_CONFIG, { optional: true }) ?? {\n availableLocales: ['en'],\n defaultLocale: 'en',\n localeInitializer: defaultLocaleInitializer,\n fallbackEnabled: false,\n dynamicLanguageChange: false\n };\n\n constructor() {\n if (!this.config.defaultLocale) {\n if (this.config.availableLocales && this.config.availableLocales.length > 0) {\n this.config.defaultLocale = this.config.availableLocales[0];\n } else {\n this.config.defaultLocale = 'en';\n }\n }\n\n if (!this.config.availableLocales || this.config.availableLocales.length === 0) {\n this.config.availableLocales = [this.config.defaultLocale];\n }\n // Also adds all locales to the translate service to enable\n // components working with the translate service directly to still work.\n this.translate.availableLanguages = this.config.availableLocales;\n\n this.config.localeInitializer ??= defaultLocaleInitializer;\n this.config.fallbackEnabled ??= false;\n this.config.dynamicLanguageChange ??= false;\n\n const savedLocale = this.localeStore.locale;\n // The following check is important. We do not control the store and when it comes from\n // a remove backend, someone might give us a locale that we do not understand. In this\n // case we switch to the default.\n let initialLocale;\n const browserCultureLang = getBrowserCultureLanguage();\n const browserLang = getBrowserLanguage();\n const currentLanguage = this.translate.currentLanguage;\n if (this.hasLocale(savedLocale)) {\n initialLocale = savedLocale!;\n } else if (currentLanguage) {\n initialLocale = currentLanguage;\n } else if (this.hasLocale(browserCultureLang)) {\n initialLocale = browserCultureLang!;\n } else if (this.hasLocale(browserLang)) {\n initialLocale = browserLang!;\n } else {\n initialLocale = this.config.defaultLocale;\n }\n this.locale$ = new BehaviorSubject<string>(initialLocale);\n this.doSetLocale(initialLocale);\n\n // If a user changes the language on the translate service directly,\n // we synchronize the change again.\n this.translate.translationChange.subscribe(() => {\n const current = this.translate.currentLanguage;\n if (current) {\n this.locale = current;\n }\n });\n\n if (this.config.fallbackEnabled) {\n this.translate.setDefaultLanguage(this.config.defaultLocale);\n }\n }\n\n /**\n * Sets a new locale to the locale service and also to the translate\n * service.\n * @throws An error if the new value is not configured in the available locales\n * or if the new locale cannot be saved, an error is thrown.\n */\n set locale(value: string) {\n if (value === this.locale$.value || value === this._nextLocale) {\n return;\n }\n if (!this.hasLocale(value)) {\n throw new Error(`The value ${value} does not exist in the available locales.`);\n }\n this.localeStore\n .saveLocale(value)\n .pipe(first())\n .subscribe({\n next: (saveSucceed: boolean) => {\n if (saveSucceed) {\n if (this.config.dynamicLanguageChange) {\n this.doSetLocale(value);\n } else if (this.isBrowser) {\n window.location.reload();\n }\n } else {\n throw new Error(`Could not save new locale ${value}.`);\n }\n },\n error: () => {\n throw new Error(`Could not save new locale ${value}.`);\n }\n });\n }\n\n get locale(): string {\n return this.locale$.value;\n }\n\n private doSetLocale(value: string): void {\n this._nextLocale = value;\n this.config.localeInitializer!(value).then(\n () => {\n this.localePackageLoaded$.next();\n this.translate\n .setCurrentLanguage(value)\n .pipe(first())\n .subscribe(() => {\n if (this.locale$.value !== value) {\n this.locale$.next(value);\n }\n });\n },\n () => {\n console.error(\n `Could not initialize new locale ${value}. Setting default locale ${this.config.defaultLocale}`\n );\n // Initialization of locale rejected. Setting default locale.\n this.translate\n .setCurrentLanguage(this.config.defaultLocale!)\n .pipe(first())\n .subscribe(() => {\n if (this.locale$.value !== this.config.defaultLocale!) {\n this.locale$.next(this.config.defaultLocale!);\n }\n });\n }\n );\n }\n\n /**\n * Test if the given locale is part of the available locales.\n * @param locale - The locale to be tested.\n */\n hasLocale(locale?: string): boolean {\n if (locale) {\n return this.config.availableLocales!.includes(locale);\n }\n return false;\n }\n}\n","/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nimport { inject, Injectable } from '@angular/core';\n\nimport { SiLocaleService } from './si-locale.service';\n\n/**\n * The SiLocaleId is used to provide a locale id from the translate service\n * to the angular localization. The Angular services call toString or valueOf\n * so that the current locale of the translation service is provided. The Intl.\n * library does not invoke toString() and using the value directly in Intl\n * formatting results always having the `en` locale. Thus, when using the SiLocaleId\n * in other services, make sure to use the `toString()` method before.\n */\n@Injectable()\nexport class SiLocaleId extends String {\n protected service: SiLocaleService;\n\n // the constructor is needed for unknown reasons. w/o the inject() fails\n constructor() {\n super();\n this.service = inject(SiLocaleService);\n }\n\n /**\n * Outputs the locale id as a string.\n */\n override toString(): string {\n return this.service.locale === 'template' ? 'en' : this.service.locale;\n }\n\n override valueOf(): string {\n return this.toString();\n }\n\n override toLowerCase(): string {\n return this.toString().toLowerCase();\n }\n}\n","/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nimport { Direction, Directionality } from '@angular/cdk/bidi';\nimport { EventEmitter, Injectable, signal } from '@angular/core';\nimport { isRTL } from '@siemens/element-ng/common';\n\n/**\n * Provider for dynamic CDK directionality.\n *\n * CDK per default evaluates directionality once during initialization. This is a problem when\n * switching language later in the lifecycle. This provider can be used to make this dynamic.\n * To use, simply provide this in the `ApplicationConfig`:\n *\n * ```ts\n * import { Directionality } from '@angular/cdk/bidi';\n * import { SiDirectionality } from '@siemens/element-ng/localization';\n *\n * ...\n * export const APP_CONFIG: ApplicationConfig = {\n * providers: [\n * { provide: Directionality, useClass: SiDirectionality },\n * ...\n * ]\n * }\n *\n * bootstrapApplication(AppComponent, APP_CONFIG)\n * ...\n *\n * ```\n */\n\n@Injectable()\nexport class SiDirectionality implements Directionality {\n readonly change = new EventEmitter<Direction>();\n\n /** @defaultValue 'ltr' */\n readonly valueSignal = signal<Direction>('ltr');\n\n get value(): Direction {\n const dir = isRTL() ? 'rtl' : 'ltr';\n this.valueSignal.set(dir);\n return dir;\n }\n\n /** @internal */\n // eslint-disable-next-line @angular-eslint/use-lifecycle-interface, @angular-eslint/no-empty-lifecycle-method\n ngOnDestroy(): void {\n // empty, from Directionality\n }\n}\n","/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nexport * from './si-locale-id';\nexport * from './si-locale-store';\nexport * from './si-locale.service';\nexport * from './si-directionality';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -1,11 +1,11 @@
1
1
  import { NgTemplateOutlet } from '@angular/common';
2
2
  import * as i0 from '@angular/core';
3
- import { inject, ElementRef, ChangeDetectorRef, DestroyRef, input, output, model, booleanAttribute, computed, signal, ChangeDetectionStrategy, Component, NgModule } from '@angular/core';
3
+ import { inject, ElementRef, ChangeDetectorRef, DestroyRef, viewChild, input, output, model, booleanAttribute, computed, signal, Component, NgModule } from '@angular/core';
4
4
  import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
5
5
  import { elementBack } from '@siemens/element-icons';
6
6
  import { addIcons, SiIconComponent } from '@siemens/element-ng/icon';
7
7
  import { ResizeObserverService, BOOTSTRAP_BREAKPOINTS } from '@siemens/element-ng/resize-observer';
8
- import { SiSplitComponent, SiSplitPartComponent } from '@siemens/element-ng/split';
8
+ import { SiSplitPartComponent, SiSplitComponent } from '@siemens/element-ng/split';
9
9
  import { t, SiTranslatePipe } from '@siemens/element-translate-ng/translate';
10
10
  import { timer } from 'rxjs';
11
11
 
@@ -20,6 +20,8 @@ class SiMainDetailContainerComponent {
20
20
  resizeObserver = inject(ResizeObserverService);
21
21
  changeDetectorRef = inject(ChangeDetectorRef);
22
22
  destroyRef = inject(DestroyRef);
23
+ splitElement = viewChild('splitElement', { ...(ngDevMode ? { debugName: "splitElement" } : /* istanbul ignore next */ {}), read: ElementRef });
24
+ mainSplitPart = viewChild('mainSplitPart', { ...(ngDevMode ? { debugName: "mainSplitPart" } : /* istanbul ignore next */ {}), read: SiSplitPartComponent });
23
25
  /**
24
26
  * A numeric value defining the minimum width in px, which the container needs
25
27
  * to be displayed in its large layout. Whenever smaller than
@@ -28,7 +30,8 @@ class SiMainDetailContainerComponent {
28
30
  *
29
31
  * @defaultValue BOOTSTRAP_BREAKPOINTS.mdMinimum
30
32
  */
31
- largeLayoutBreakpoint = input(BOOTSTRAP_BREAKPOINTS.mdMinimum, ...(ngDevMode ? [{ debugName: "largeLayoutBreakpoint" }] : []));
33
+ largeLayoutBreakpoint = input(BOOTSTRAP_BREAKPOINTS.mdMinimum, /* @ts-ignore */
34
+ ...(ngDevMode ? [{ debugName: "largeLayoutBreakpoint" }] : /* istanbul ignore next */ []));
32
35
  /**
33
36
  * Whether the main-detail layout component has a large size or not,
34
37
  * `true` if the container´s width matches or exceeds the `largeLayoutBreakpoint`.
@@ -45,26 +48,29 @@ class SiMainDetailContainerComponent {
45
48
  *
46
49
  * @defaultValue false
47
50
  */
48
- detailsActive = model(false, ...(ngDevMode ? [{ debugName: "detailsActive" }] : []));
51
+ detailsActive = model(false, /* @ts-ignore */
52
+ ...(ngDevMode ? [{ debugName: "detailsActive" }] : /* istanbul ignore next */ []));
49
53
  /**
50
54
  * The heading of the main-detail layout component, usually a page heading.
51
55
  *
52
56
  * @defaultValue ''
53
57
  */
54
- heading = input('', ...(ngDevMode ? [{ debugName: "heading" }] : []));
58
+ heading = input('', /* @ts-ignore */
59
+ ...(ngDevMode ? [{ debugName: "heading" }] : /* istanbul ignore next */ []));
55
60
  /**
56
61
  * Whether the heading should be truncated (single line) or not.
57
62
  * Default value is `false`.
58
63
  *
59
64
  * @defaultValue false
60
65
  */
61
- truncateHeading = input(false, { ...(ngDevMode ? { debugName: "truncateHeading" } : {}), transform: booleanAttribute });
66
+ truncateHeading = input(false, { ...(ngDevMode ? { debugName: "truncateHeading" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
62
67
  /**
63
68
  * The heading of the detail area.
64
69
  *
65
70
  * @defaultValue ''
66
71
  */
67
- detailsHeading = input('', ...(ngDevMode ? [{ debugName: "detailsHeading" }] : []));
72
+ detailsHeading = input('', /* @ts-ignore */
73
+ ...(ngDevMode ? [{ debugName: "detailsHeading" }] : /* istanbul ignore next */ []));
68
74
  /**
69
75
  * Whether the main and detail parts should be resizable by a splitter or not.
70
76
  * This is only supported in the 'large' scenario (when `hasLargeSize` is `true`).
@@ -72,7 +78,7 @@ class SiMainDetailContainerComponent {
72
78
  *
73
79
  * @defaultValue false
74
80
  */
75
- resizableParts = input(false, { ...(ngDevMode ? { debugName: "resizableParts" } : {}), transform: booleanAttribute });
81
+ resizableParts = input(false, { ...(ngDevMode ? { debugName: "resizableParts" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
76
82
  /**
77
83
  * You can hide the back button in the mobile view by setting true. Required
78
84
  * in add, edit workflows on mobile sizes. During add or edit, the back button
@@ -80,7 +86,7 @@ class SiMainDetailContainerComponent {
80
86
  *
81
87
  * @defaultValue false
82
88
  */
83
- hideBackButton = input(false, { ...(ngDevMode ? { debugName: "hideBackButton" } : {}), transform: booleanAttribute });
89
+ hideBackButton = input(false, { ...(ngDevMode ? { debugName: "hideBackButton" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
84
90
  /**
85
91
  * Details back button text. Required for a11y.
86
92
  *
@@ -89,52 +95,76 @@ class SiMainDetailContainerComponent {
89
95
  * t(() => $localize`:@@SI_MAIN_DETAIL_CONTAINER.BACK:Back`)
90
96
  * ```
91
97
  */
92
- detailsBackButtonText = input(t(() => $localize `:@@SI_MAIN_DETAIL_CONTAINER.BACK:Back`), ...(ngDevMode ? [{ debugName: "detailsBackButtonText" }] : []));
98
+ detailsBackButtonText = input(t(() => $localize `:@@SI_MAIN_DETAIL_CONTAINER.BACK:Back`), /* @ts-ignore */
99
+ ...(ngDevMode ? [{ debugName: "detailsBackButtonText" }] : /* istanbul ignore next */ []));
93
100
  /**
94
101
  * CSS class(es) applied to the outermost container. Per default, Bootstrap classes
95
102
  * to handle responsive paddings are applied: `px-6 pt-6 px-md-9`.
96
103
  *
97
104
  * @defaultValue 'px-6 pt-6 px-md-9'
98
105
  */
99
- containerClass = input('px-6 pt-6 px-md-9', ...(ngDevMode ? [{ debugName: "containerClass" }] : []));
106
+ containerClass = input('px-6 pt-6 px-md-9', /* @ts-ignore */
107
+ ...(ngDevMode ? [{ debugName: "containerClass" }] : /* istanbul ignore next */ []));
100
108
  /**
101
109
  * CSS class(es) applied to the main container. In combination with `containerClass`,
102
110
  * this allows for settings individual padding and margin values on the individual containers.
103
111
  *
104
112
  * @defaultValue 'pb-6'
105
113
  */
106
- mainContainerClass = input('pb-6', ...(ngDevMode ? [{ debugName: "mainContainerClass" }] : []));
114
+ mainContainerClass = input('pb-6', /* @ts-ignore */
115
+ ...(ngDevMode ? [{ debugName: "mainContainerClass" }] : /* istanbul ignore next */ []));
107
116
  /**
108
117
  * CSS class(es) applied to the detail container. In combination with `containerClass`,
109
118
  * this allows for settings individual padding and margin values on the individual containers.
110
119
  *
111
120
  * @defaultValue 'pb-6'
112
121
  */
113
- detailContainerClass = input('pb-6', ...(ngDevMode ? [{ debugName: "detailContainerClass" }] : []));
122
+ detailContainerClass = input('pb-6', /* @ts-ignore */
123
+ ...(ngDevMode ? [{ debugName: "detailContainerClass" }] : /* istanbul ignore next */ []));
114
124
  /**
115
- * The percentage width of the main container from the overall component width.
116
- * Can be a number or `'default'`, which is 32% when {@link resizableParts} is active, otherwise 50%.
125
+ * Unit used for the main split part when {@link resizableParts} is enabled.
126
+ *
127
+ * @defaultValue 'px'
128
+ */
129
+ mainContainerWidthUnit = input('px', /* @ts-ignore */
130
+ ...(ngDevMode ? [{ debugName: "mainContainerWidthUnit" }] : /* istanbul ignore next */ []));
131
+ /**
132
+ * The size of the main container. When {@link resizableParts} is enabled,
133
+ * the value is interpreted using {@link mainContainerWidthUnit} and updates as the splitter is moved.
134
+ * With `mainContainerWidthUnit="fr"`, numeric values must be from `0` to `100` (inclusive).
135
+ * The main and detail fractional weights are the value and `100 - value`;
136
+ * out-of-range values fall back to `32` and `68`.
137
+ * In the static layout, numeric values represent a percentage from `0` to `100`
138
+ * (inclusive); out-of-range values leave both containers without max-size constraints.
139
+ * Pixel widths are not limited to the `0` to `100` range.
140
+ *
141
+ * With `'default'`, resizable pixel layouts use {@link minMainSize}, resizable fractional
142
+ * layouts use main and detail weights of `32` and `68`, and static layouts use `50%`.
117
143
  *
118
144
  * @defaultValue 'default'
119
145
  */
120
- mainContainerWidth = model('default', ...(ngDevMode ? [{ debugName: "mainContainerWidth" }] : []));
146
+ mainContainerWidth = model('default', /* @ts-ignore */
147
+ ...(ngDevMode ? [{ debugName: "mainContainerWidth" }] : /* istanbul ignore next */ []));
121
148
  /**
122
149
  * Sets the minimal width of the main container in pixel.
123
150
  *
124
151
  * @defaultValue 300
125
152
  */
126
- minMainSize = input(300, ...(ngDevMode ? [{ debugName: "minMainSize" }] : []));
153
+ minMainSize = input(300, /* @ts-ignore */
154
+ ...(ngDevMode ? [{ debugName: "minMainSize" }] : /* istanbul ignore next */ []));
127
155
  /**
128
156
  * Sets the minimal width of the detail container in pixel.
129
157
  *
130
158
  * @defaultValue 300
131
159
  */
132
- minDetailSize = input(300, ...(ngDevMode ? [{ debugName: "minDetailSize" }] : []));
160
+ minDetailSize = input(300, /* @ts-ignore */
161
+ ...(ngDevMode ? [{ debugName: "minDetailSize" }] : /* istanbul ignore next */ []));
133
162
  /**
134
163
  * An optional stateId to uniquely identify a component instance.
135
164
  * Required for persistence of ui state.
136
165
  */
137
- stateId = input(...(ngDevMode ? [undefined, { debugName: "stateId" }] : []));
166
+ stateId = input(/* @ts-ignore */
167
+ ...(ngDevMode ? [undefined, { debugName: "stateId" }] : /* istanbul ignore next */ []));
138
168
  /**
139
169
  * The attribute is set to true when the detail area is not visible to ensure that the user
140
170
  * can't tab to details area when it is hidden.
@@ -142,16 +172,16 @@ class SiMainDetailContainerComponent {
142
172
  preventFocusDetails = false;
143
173
  actualMainContainerWidth = computed(() => {
144
174
  const mainContainerWidth = this.mainContainerWidth();
145
- return mainContainerWidth === 'default'
146
- ? this.resizableParts()
147
- ? 32
148
- : 50
149
- : mainContainerWidth;
150
- }, ...(ngDevMode ? [{ debugName: "actualMainContainerWidth" }] : []));
151
- splitSizes = [
152
- this.actualMainContainerWidth(),
153
- 100 - this.actualMainContainerWidth()
154
- ];
175
+ if (mainContainerWidth !== 'default') {
176
+ return mainContainerWidth;
177
+ }
178
+ if (!this.resizableParts()) {
179
+ return 50;
180
+ }
181
+ return this.mainContainerWidthUnit() === 'px' ? this.minMainSize() : 32;
182
+ }, /* @ts-ignore */
183
+ ...(ngDevMode ? [{ debugName: "actualMainContainerWidth" }] : /* istanbul ignore next */ []));
184
+ splitSizes = this.getSplitSizes();
155
185
  // The max size to limit the main container in the static flex layout (if less than 50%), otherwise not set.
156
186
  maxMainSize = this.getMaxSize(0);
157
187
  // The max size to limit the detail container in the static flex layout (if less than 50%), otherwise not set.
@@ -159,20 +189,27 @@ class SiMainDetailContainerComponent {
159
189
  mainStateId = computed(() => {
160
190
  const stateId = this.stateId();
161
191
  return stateId ? `${stateId}-main` : undefined;
162
- }, ...(ngDevMode ? [{ debugName: "mainStateId" }] : []));
192
+ }, /* @ts-ignore */
193
+ ...(ngDevMode ? [{ debugName: "mainStateId" }] : /* istanbul ignore next */ []));
163
194
  detailStateId = computed(() => {
164
195
  const stateId = this.stateId();
165
196
  return stateId ? `${stateId}-detail` : undefined;
166
- }, ...(ngDevMode ? [{ debugName: "detailStateId" }] : []));
167
- animate = signal(false, ...(ngDevMode ? [{ debugName: "animate" }] : []));
168
- opacity = signal('0', ...(ngDevMode ? [{ debugName: "opacity" }] : []));
197
+ }, /* @ts-ignore */
198
+ ...(ngDevMode ? [{ debugName: "detailStateId" }] : /* istanbul ignore next */ []));
199
+ animate = signal(false, /* @ts-ignore */
200
+ ...(ngDevMode ? [{ debugName: "animate" }] : /* istanbul ignore next */ []));
201
+ opacity = signal('0', /* @ts-ignore */
202
+ ...(ngDevMode ? [{ debugName: "opacity" }] : /* istanbul ignore next */ []));
169
203
  ngOnChanges(changes) {
170
204
  if (changes.detailsActive) {
171
205
  this.updateDetailsFocusable();
172
206
  this.doAnimation(changes.detailsActive.currentValue);
173
207
  }
174
- if (changes.mainContainerWidth || changes.resizableParts) {
175
- this.splitSizes = [this.actualMainContainerWidth(), 100 - this.actualMainContainerWidth()];
208
+ if (changes.mainContainerWidth ||
209
+ changes.resizableParts ||
210
+ changes.mainContainerWidthUnit ||
211
+ changes.minMainSize) {
212
+ this.splitSizes = this.getSplitSizes();
176
213
  this.maxMainSize = this.getMaxSize(0);
177
214
  this.maxDetailSize = this.getMaxSize(1);
178
215
  }
@@ -184,7 +221,12 @@ class SiMainDetailContainerComponent {
184
221
  .subscribe(dimensions => this.determineLayout(dimensions));
185
222
  }
186
223
  onSplitSizesChange(sizes) {
187
- this.mainContainerWidth.set(sizes[0]);
224
+ if (this.mainContainerWidthUnit() === 'px') {
225
+ this.mainContainerWidth.set(this.getMainSizePx(sizes[0]));
226
+ }
227
+ else {
228
+ this.mainContainerWidth.set(sizes[0]);
229
+ }
188
230
  }
189
231
  detailsBackClicked() {
190
232
  this.detailsActive.set(false);
@@ -194,12 +236,35 @@ class SiMainDetailContainerComponent {
194
236
  * Get the max size to limit in the static flex layout (if less than 50%), otherwise not set
195
237
  */
196
238
  getMaxSize(part) {
197
- return this.resizableParts() ||
198
- this.mainContainerWidth() === 'default' ||
239
+ const mainContainerWidth = this.mainContainerWidth();
240
+ if (this.resizableParts() ||
241
+ mainContainerWidth === 'default' ||
199
242
  !this.hasLargeSize ||
200
- this.splitSizes[part] > 50
201
- ? ''
202
- : this.splitSizes[part] + '%';
243
+ mainContainerWidth < 0 ||
244
+ mainContainerWidth > 100) {
245
+ return '';
246
+ }
247
+ const size = part === 0 ? mainContainerWidth : 100 - mainContainerWidth;
248
+ return size > 50 ? '' : size + '%';
249
+ }
250
+ getSplitSizes() {
251
+ const mainSize = this.actualMainContainerWidth();
252
+ if (!this.resizableParts()) {
253
+ return mainSize >= 0 && mainSize <= 100 ? [mainSize, 100 - mainSize] : [50, 50];
254
+ }
255
+ if (this.mainContainerWidthUnit() === 'fr') {
256
+ return mainSize >= 0 && mainSize <= 100 ? [mainSize, 100 - mainSize] : [32, 68];
257
+ }
258
+ // The main size is in pixels; the detail part fills the remaining space with 1fr.
259
+ return [mainSize, 1];
260
+ }
261
+ getMainSizePx(fallbackPercentage) {
262
+ const mainPartSize = this.mainSplitPart()?.expandedSize();
263
+ if (mainPartSize !== undefined) {
264
+ return Math.round(mainPartSize);
265
+ }
266
+ const splitWidth = this.splitElement()?.nativeElement.getBoundingClientRect().width;
267
+ return splitWidth ? Math.round((splitWidth * fallbackPercentage) / 100) : this.minMainSize();
203
268
  }
204
269
  determineLayout(dimensions) {
205
270
  const newHasLargeSize = dimensions.width >= this.largeLayoutBreakpoint();
@@ -225,10 +290,10 @@ class SiMainDetailContainerComponent {
225
290
  updateDetailsFocusable() {
226
291
  this.preventFocusDetails = !this.hasLargeSize && !this.detailsActive();
227
292
  }
228
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.8", ngImport: i0, type: SiMainDetailContainerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
229
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.8", type: SiMainDetailContainerComponent, isStandalone: true, selector: "si-main-detail-container", inputs: { largeLayoutBreakpoint: { classPropertyName: "largeLayoutBreakpoint", publicName: "largeLayoutBreakpoint", isSignal: true, isRequired: false, transformFunction: null }, detailsActive: { classPropertyName: "detailsActive", publicName: "detailsActive", isSignal: true, isRequired: false, transformFunction: null }, heading: { classPropertyName: "heading", publicName: "heading", isSignal: true, isRequired: false, transformFunction: null }, truncateHeading: { classPropertyName: "truncateHeading", publicName: "truncateHeading", isSignal: true, isRequired: false, transformFunction: null }, detailsHeading: { classPropertyName: "detailsHeading", publicName: "detailsHeading", isSignal: true, isRequired: false, transformFunction: null }, resizableParts: { classPropertyName: "resizableParts", publicName: "resizableParts", isSignal: true, isRequired: false, transformFunction: null }, hideBackButton: { classPropertyName: "hideBackButton", publicName: "hideBackButton", isSignal: true, isRequired: false, transformFunction: null }, detailsBackButtonText: { classPropertyName: "detailsBackButtonText", publicName: "detailsBackButtonText", isSignal: true, isRequired: false, transformFunction: null }, containerClass: { classPropertyName: "containerClass", publicName: "containerClass", isSignal: true, isRequired: false, transformFunction: null }, mainContainerClass: { classPropertyName: "mainContainerClass", publicName: "mainContainerClass", isSignal: true, isRequired: false, transformFunction: null }, detailContainerClass: { classPropertyName: "detailContainerClass", publicName: "detailContainerClass", isSignal: true, isRequired: false, transformFunction: null }, mainContainerWidth: { classPropertyName: "mainContainerWidth", publicName: "mainContainerWidth", isSignal: true, isRequired: false, transformFunction: null }, minMainSize: { classPropertyName: "minMainSize", publicName: "minMainSize", isSignal: true, isRequired: false, transformFunction: null }, minDetailSize: { classPropertyName: "minDetailSize", publicName: "minDetailSize", isSignal: true, isRequired: false, transformFunction: null }, stateId: { classPropertyName: "stateId", publicName: "stateId", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { hasLargeSizeChange: "hasLargeSizeChange", detailsActive: "detailsActiveChange", mainContainerWidth: "mainContainerWidthChange" }, host: { properties: { "class.animate": "animate()", "style.opacity": "opacity()" }, classAttribute: "si-layout-inner" }, usesOnChanges: true, ngImport: i0, template: "@if (resizableParts() && hasLargeSize) {\n <div class=\"main-detail-layout d-flex flex-column\" [class]=\"containerClass()\">\n <ng-container *ngTemplateOutlet=\"headingTemplate\" />\n <si-split\n class=\"w-100 flex-grow-1\"\n orientation=\"horizontal\"\n [stateId]=\"stateId()\"\n [sizes]=\"splitSizes\"\n (sizesChange)=\"onSplitSizesChange($event)\"\n >\n <si-split-part\n scale=\"none\"\n [showCollapseButton]=\"false\"\n [showHeader]=\"false\"\n [minSize]=\"minMainSize()\"\n [stateId]=\"mainStateId()\"\n >\n <ng-container *ngTemplateOutlet=\"mainTemplate\" />\n </si-split-part>\n <si-split-part\n scale=\"auto\"\n [showCollapseButton]=\"false\"\n [showHeader]=\"false\"\n [minSize]=\"minDetailSize()\"\n [stateId]=\"detailStateId()\"\n >\n <ng-container *ngTemplateOutlet=\"detailTemplate\" />\n </si-split-part>\n </si-split>\n </div>\n} @else {\n <div\n class=\"main-detail-layout d-flex flex-column\"\n [class]=\"containerClass()\"\n [class.large-size]=\"hasLargeSize\"\n >\n <ng-container *ngTemplateOutlet=\"headingTemplate\" />\n <div\n class=\"main-detail-container d-flex flex-grow-1\"\n [class.details-active]=\"detailsActive() && !hasLargeSize\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n mainTemplate;\n context: { customClass: hasLargeSize ? 'col-3 ps-0 pe-4' : 'col-6 px-0' }\n \"\n />\n <ng-container\n *ngTemplateOutlet=\"\n detailTemplate;\n context: { customClass: hasLargeSize ? 'col-9 ps-4 pe-0' : 'col-6 px-0' }\n \"\n />\n </div>\n </div>\n}\n\n<!-- Templates -->\n<ng-template #headingTemplate>\n @if (heading()) {\n <div class=\"si-layout-header\">\n <h2 class=\"si-layout-title si-layout-top-element\" [class.text-truncate]=\"truncateHeading()\">{{\n heading() | translate\n }}</h2>\n </div>\n }\n</ng-template>\n\n<ng-template #mainTemplate let-customClass=\"customClass\">\n <div\n class=\"main-container d-flex flex-column\"\n [class]=\"[mainContainerClass(), customClass ? customClass : '']\"\n [style.max-inline-size]=\"maxMainSize\"\n >\n <div class=\"main-search-actions d-flex align-items-center\">\n <ng-content select=\"[slot=mainSearch]\" />\n <ng-content select=\"[slot=mainActions]\" />\n </div>\n <div class=\"main-data-container d-flex\">\n <ng-content select=\"[slot=mainData]\" />\n </div>\n </div>\n</ng-template>\n\n<ng-template #detailTemplate let-customClass=\"customClass\">\n <div\n class=\"detail-container d-flex flex-column\"\n [class]=\"[detailContainerClass(), customClass ? customClass : '']\"\n [style.max-inline-size]=\"maxDetailSize\"\n [attr.inert]=\"preventFocusDetails ? '' : null\"\n >\n <div class=\"detail-heading-actions d-flex align-items-center\">\n @if (!this.hasLargeSize && !this.hideBackButton()) {\n <button type=\"button\" class=\"btn btn-circle btn-secondary\" (click)=\"detailsBackClicked()\">\n <si-icon [icon]=\"icons.elementBack\" />\n <span class=\"visually-hidden\">{{ detailsBackButtonText() | translate }}</span>\n </button>\n }\n @if (detailsHeading()) {\n <span class=\"detail-heading si-h4 me-auto ms-6 my-auto text-truncate\">{{\n detailsHeading() | translate\n }}</span>\n }\n <ng-content select=\"[slot=detailActions]\" />\n </div>\n <ng-content select=\"[slot=details]\" />\n </div>\n</ng-template>\n", styles: [":host{display:flex;flex-direction:column;overflow-x:hidden;overflow-y:auto}:host ::ng-deep [slot=mainSearch]{flex:1 1 0}:host ::ng-deep [slot=mainSearch]+[slot=mainActions]{margin-inline-start:12px}:host ::ng-deep [slot=mainActions]{margin-inline-start:auto}:host ::ng-deep [slot=mainData],:host ::ng-deep [slot=details]{flex:1 1 0;min-block-size:0}:host ::ng-deep [slot=detailActions]{margin-inline-start:auto}:host ::ng-deep .detail-heading+[slot=detailActions]{margin-inline-start:12px}:host ::ng-deep si-split{--si-split-gutter-background: transparent;min-block-size:0}:host ::ng-deep si-split si-split-part,:host ::ng-deep si-split .si-split-container,:host ::ng-deep si-split .si-split-part-content{overflow:visible}:host.animate{--si-main-detail-animation-duration: calc(.5s * var(--element-animations-enabled, 1))}.main-detail-layout{overflow-x:hidden;position:relative}.main-detail-layout.large-size{--si-main-detail-container-width: 100%;--si-main-detail-container-transition: none;--si-main-detail-container-transform: none;--si-main-detail-transition: none;--si-main-detail-opacity: 1;--si-main-detail-pointer-events: auto}.main-detail-container{--si-main-detail-transition: opacity var(--si-main-detail-animation-duration, 0) ease-in-out;--si-main-detail-detail-opacity: 0;--si-main-detail-detail-pointer-events: none;inline-size:var(--si-main-detail-container-width, 200%);transform:var(--si-main-detail-container-transform, none);transform-origin:top left;transition:var(--si-main-detail-container-transition, transform var(--si-main-detail-animation-duration, 0) ease-in-out)}.main-detail-container.details-active{--si-main-detail-container-transform: translateX(-50%);--si-main-detail-main-opacity: 0;--si-main-detail-detail-opacity: 1;--si-main-detail-main-pointer-events: none;--si-main-detail-detail-pointer-events: auto}.main-detail-layout,.main-detail-container,.main-container,.detail-container,.main-data-container{flex:1 1 0;min-block-size:0}.main-container,.detail-container{transition:var(--si-main-detail-transition, none)}.main-container{opacity:var(--si-main-detail-opacity, var(--si-main-detail-main-opacity, 1));pointer-events:var(--si-main-detail-pointer-events, var(--si-main-detail-main-pointer-events, auto))}.detail-container{opacity:var(--si-main-detail-opacity, var(--si-main-detail-detail-opacity, 1));pointer-events:var(--si-main-detail-pointer-events, var(--si-main-detail-detail-pointer-events, auto))}.main-search-actions:not(:empty),.detail-heading-actions:not(:empty){min-block-size:calc(1lh + 16px);margin-block-end:16px}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: SiSplitComponent, selector: "si-split", inputs: ["gutterSize", "orientation", "sizes", "stateId"], outputs: ["sizesChange"] }, { kind: "component", type: SiSplitPartComponent, selector: "si-split-part", inputs: ["actions", "collapseDirection", "collapseIconClass", "collapseToMinSize", "headerTemplate", "heading", "minSize", "removeContentOnCollapse", "scale", "showCollapseButton", "showHeader", "collapseLabel", "stateId", "size", "collapseOthers", "expanded"], outputs: ["collapseChanged", "stateChange"] }, { kind: "component", type: SiIconComponent, selector: "si-icon", inputs: ["icon"] }, { kind: "pipe", type: SiTranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
293
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SiMainDetailContainerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
294
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: SiMainDetailContainerComponent, isStandalone: true, selector: "si-main-detail-container", inputs: { largeLayoutBreakpoint: { classPropertyName: "largeLayoutBreakpoint", publicName: "largeLayoutBreakpoint", isSignal: true, isRequired: false, transformFunction: null }, detailsActive: { classPropertyName: "detailsActive", publicName: "detailsActive", isSignal: true, isRequired: false, transformFunction: null }, heading: { classPropertyName: "heading", publicName: "heading", isSignal: true, isRequired: false, transformFunction: null }, truncateHeading: { classPropertyName: "truncateHeading", publicName: "truncateHeading", isSignal: true, isRequired: false, transformFunction: null }, detailsHeading: { classPropertyName: "detailsHeading", publicName: "detailsHeading", isSignal: true, isRequired: false, transformFunction: null }, resizableParts: { classPropertyName: "resizableParts", publicName: "resizableParts", isSignal: true, isRequired: false, transformFunction: null }, hideBackButton: { classPropertyName: "hideBackButton", publicName: "hideBackButton", isSignal: true, isRequired: false, transformFunction: null }, detailsBackButtonText: { classPropertyName: "detailsBackButtonText", publicName: "detailsBackButtonText", isSignal: true, isRequired: false, transformFunction: null }, containerClass: { classPropertyName: "containerClass", publicName: "containerClass", isSignal: true, isRequired: false, transformFunction: null }, mainContainerClass: { classPropertyName: "mainContainerClass", publicName: "mainContainerClass", isSignal: true, isRequired: false, transformFunction: null }, detailContainerClass: { classPropertyName: "detailContainerClass", publicName: "detailContainerClass", isSignal: true, isRequired: false, transformFunction: null }, mainContainerWidthUnit: { classPropertyName: "mainContainerWidthUnit", publicName: "mainContainerWidthUnit", isSignal: true, isRequired: false, transformFunction: null }, mainContainerWidth: { classPropertyName: "mainContainerWidth", publicName: "mainContainerWidth", isSignal: true, isRequired: false, transformFunction: null }, minMainSize: { classPropertyName: "minMainSize", publicName: "minMainSize", isSignal: true, isRequired: false, transformFunction: null }, minDetailSize: { classPropertyName: "minDetailSize", publicName: "minDetailSize", isSignal: true, isRequired: false, transformFunction: null }, stateId: { classPropertyName: "stateId", publicName: "stateId", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { hasLargeSizeChange: "hasLargeSizeChange", detailsActive: "detailsActiveChange", mainContainerWidth: "mainContainerWidthChange" }, host: { properties: { "class.animate": "animate()", "style.opacity": "opacity()" }, classAttribute: "si-layout-inner" }, viewQueries: [{ propertyName: "splitElement", first: true, predicate: ["splitElement"], descendants: true, read: ElementRef, isSignal: true }, { propertyName: "mainSplitPart", first: true, predicate: ["mainSplitPart"], descendants: true, read: SiSplitPartComponent, isSignal: true }], usesOnChanges: true, ngImport: i0, template: "@if (resizableParts() && hasLargeSize) {\n <div class=\"main-detail-layout d-flex flex-column\" [class]=\"containerClass()\">\n <ng-container *ngTemplateOutlet=\"headingTemplate\" />\n <si-split\n #splitElement\n class=\"w-100 flex-grow-1\"\n orientation=\"horizontal\"\n [stateId]=\"stateId()\"\n (sizesChange)=\"onSplitSizesChange($event)\"\n >\n <si-split-part\n #mainSplitPart\n [unit]=\"mainContainerWidthUnit()\"\n [size]=\"splitSizes[0]\"\n [showHeader]=\"false\"\n [minSize]=\"minMainSize()\"\n [stateId]=\"mainStateId()\"\n >\n <ng-container *ngTemplateOutlet=\"mainTemplate\" />\n </si-split-part>\n <si-split-part\n unit=\"fr\"\n [size]=\"splitSizes[1]\"\n [showHeader]=\"false\"\n [minSize]=\"minDetailSize()\"\n [stateId]=\"detailStateId()\"\n >\n <ng-container *ngTemplateOutlet=\"detailTemplate\" />\n </si-split-part>\n </si-split>\n </div>\n} @else {\n <div\n class=\"main-detail-layout d-flex flex-column\"\n [class]=\"containerClass()\"\n [class.large-size]=\"hasLargeSize\"\n >\n <ng-container *ngTemplateOutlet=\"headingTemplate\" />\n <div\n class=\"main-detail-container d-flex flex-grow-1\"\n [class.details-active]=\"detailsActive() && !hasLargeSize\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n mainTemplate;\n context: { customClass: hasLargeSize ? 'col-3 ps-0 pe-4' : 'col-6 px-0' }\n \"\n />\n <ng-container\n *ngTemplateOutlet=\"\n detailTemplate;\n context: { customClass: hasLargeSize ? 'col-9 ps-4 pe-0' : 'col-6 px-0' }\n \"\n />\n </div>\n </div>\n}\n\n<!-- Templates -->\n<ng-template #headingTemplate>\n @if (heading()) {\n <div class=\"si-layout-header\">\n <h2 class=\"si-layout-title si-layout-top-element\" [class.text-truncate]=\"truncateHeading()\">{{\n heading() | translate\n }}</h2>\n </div>\n }\n</ng-template>\n\n<ng-template #mainTemplate let-customClass=\"customClass\">\n <div\n class=\"main-container d-flex flex-column\"\n [class]=\"[mainContainerClass(), customClass ? customClass : '']\"\n [style.max-inline-size]=\"maxMainSize\"\n >\n <div class=\"main-search-actions d-flex align-items-center\">\n <ng-content select=\"[slot=mainSearch]\" />\n <ng-content select=\"[slot=mainActions]\" />\n </div>\n <div class=\"main-data-container d-flex\">\n <ng-content select=\"[slot=mainData]\" />\n </div>\n </div>\n</ng-template>\n\n<ng-template #detailTemplate let-customClass=\"customClass\">\n <div\n class=\"detail-container d-flex flex-column\"\n [class]=\"[detailContainerClass(), customClass ? customClass : '']\"\n [style.max-inline-size]=\"maxDetailSize\"\n [attr.inert]=\"preventFocusDetails ? '' : null\"\n >\n <div class=\"detail-heading-actions d-flex align-items-center\">\n @if (!this.hasLargeSize && !this.hideBackButton()) {\n <button type=\"button\" class=\"btn btn-circle btn-secondary\" (click)=\"detailsBackClicked()\">\n <si-icon [icon]=\"icons.elementBack\" />\n <span class=\"visually-hidden\">{{ detailsBackButtonText() | translate }}</span>\n </button>\n }\n @if (detailsHeading()) {\n <span class=\"detail-heading si-h4 me-auto ms-6 my-auto text-truncate\">{{\n detailsHeading() | translate\n }}</span>\n }\n <ng-content select=\"[slot=detailActions]\" />\n </div>\n <ng-content select=\"[slot=details]\" />\n </div>\n</ng-template>\n", styles: [":host{display:flex;flex-direction:column;overflow-x:hidden;overflow-y:auto}:host ::ng-deep [slot=mainSearch]{flex:1 1 0}:host ::ng-deep [slot=mainSearch]+[slot=mainActions]{margin-inline-start:var(--si-sys-sizing-spacing-x-50)}:host ::ng-deep [slot=mainActions]{margin-inline-start:auto}:host ::ng-deep [slot=mainData],:host ::ng-deep [slot=details]{flex:1 1 0;min-block-size:0}:host ::ng-deep [slot=detailActions]{margin-inline-start:auto}:host ::ng-deep .detail-heading+[slot=detailActions]{margin-inline-start:var(--si-sys-sizing-spacing-x-50)}:host ::ng-deep si-split{--si-split-gutter-background: transparent;min-block-size:0}:host ::ng-deep si-split si-split-part,:host ::ng-deep si-split .si-split-container,:host ::ng-deep si-split .si-split-part-content{overflow:visible}:host.animate{--si-main-detail-animation-duration: calc(.5s * var(--element-animations-enabled, 1))}.main-detail-layout{overflow-x:hidden;position:relative}.main-detail-layout.large-size{--si-main-detail-container-width: 100%;--si-main-detail-container-transition: none;--si-main-detail-container-transform: none;--si-main-detail-transition: none;--si-main-detail-opacity: 1;--si-main-detail-pointer-events: auto}.main-detail-container{--si-main-detail-transition: opacity var(--si-main-detail-animation-duration, 0) ease-in-out;--si-main-detail-detail-opacity: 0;--si-main-detail-detail-pointer-events: none;inline-size:var(--si-main-detail-container-width, 200%);transform:var(--si-main-detail-container-transform, none);transform-origin:top left;transition:var(--si-main-detail-container-transition, transform var(--si-main-detail-animation-duration, 0) ease-in-out)}.main-detail-container.details-active{--si-main-detail-container-transform: translateX(-50%);--si-main-detail-main-opacity: 0;--si-main-detail-detail-opacity: 1;--si-main-detail-main-pointer-events: none;--si-main-detail-detail-pointer-events: auto}.main-detail-layout,.main-detail-container,.main-container,.detail-container,.main-data-container{flex:1 1 0;min-block-size:0}.main-container,.detail-container{transition:var(--si-main-detail-transition, none)}.main-container{opacity:var(--si-main-detail-opacity, var(--si-main-detail-main-opacity, 1));pointer-events:var(--si-main-detail-pointer-events, var(--si-main-detail-main-pointer-events, auto))}.detail-container{opacity:var(--si-main-detail-opacity, var(--si-main-detail-detail-opacity, 1));pointer-events:var(--si-main-detail-pointer-events, var(--si-main-detail-detail-pointer-events, auto))}.main-search-actions:not(:empty),.detail-heading-actions:not(:empty){min-block-size:calc(1lh + 2 * var(--si-sys-sizing-spacing-y-40));margin-block-end:var(--si-sys-sizing-spacing-y-60)}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: SiSplitComponent, selector: "si-split", inputs: ["gutterSize", "orientation", "stateId"], outputs: ["sizesChange"] }, { kind: "component", type: SiSplitPartComponent, selector: "si-split-part", inputs: ["actions", "collapsible", "collapseIconClass", "collapseToMinSize", "headerTemplate", "heading", "minSize", "removeContentOnCollapse", "showHeader", "collapseLabel", "stateId", "size", "unit", "collapseOthers", "expanded"], outputs: ["collapseChanged", "stateChange"] }, { kind: "component", type: SiIconComponent, selector: "si-icon", inputs: ["icon"] }, { kind: "pipe", type: SiTranslatePipe, name: "translate" }] });
230
295
  }
231
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.8", ngImport: i0, type: SiMainDetailContainerComponent, decorators: [{
296
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SiMainDetailContainerComponent, decorators: [{
232
297
  type: Component,
233
298
  args: [{ selector: 'si-main-detail-container', imports: [
234
299
  NgTemplateOutlet,
@@ -236,23 +301,23 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.8", ngImpor
236
301
  SiSplitPartComponent,
237
302
  SiTranslatePipe,
238
303
  SiIconComponent
239
- ], changeDetection: ChangeDetectionStrategy.OnPush, host: {
304
+ ], host: {
240
305
  class: 'si-layout-inner',
241
306
  '[class.animate]': 'animate()',
242
307
  '[style.opacity]': 'opacity()'
243
- }, template: "@if (resizableParts() && hasLargeSize) {\n <div class=\"main-detail-layout d-flex flex-column\" [class]=\"containerClass()\">\n <ng-container *ngTemplateOutlet=\"headingTemplate\" />\n <si-split\n class=\"w-100 flex-grow-1\"\n orientation=\"horizontal\"\n [stateId]=\"stateId()\"\n [sizes]=\"splitSizes\"\n (sizesChange)=\"onSplitSizesChange($event)\"\n >\n <si-split-part\n scale=\"none\"\n [showCollapseButton]=\"false\"\n [showHeader]=\"false\"\n [minSize]=\"minMainSize()\"\n [stateId]=\"mainStateId()\"\n >\n <ng-container *ngTemplateOutlet=\"mainTemplate\" />\n </si-split-part>\n <si-split-part\n scale=\"auto\"\n [showCollapseButton]=\"false\"\n [showHeader]=\"false\"\n [minSize]=\"minDetailSize()\"\n [stateId]=\"detailStateId()\"\n >\n <ng-container *ngTemplateOutlet=\"detailTemplate\" />\n </si-split-part>\n </si-split>\n </div>\n} @else {\n <div\n class=\"main-detail-layout d-flex flex-column\"\n [class]=\"containerClass()\"\n [class.large-size]=\"hasLargeSize\"\n >\n <ng-container *ngTemplateOutlet=\"headingTemplate\" />\n <div\n class=\"main-detail-container d-flex flex-grow-1\"\n [class.details-active]=\"detailsActive() && !hasLargeSize\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n mainTemplate;\n context: { customClass: hasLargeSize ? 'col-3 ps-0 pe-4' : 'col-6 px-0' }\n \"\n />\n <ng-container\n *ngTemplateOutlet=\"\n detailTemplate;\n context: { customClass: hasLargeSize ? 'col-9 ps-4 pe-0' : 'col-6 px-0' }\n \"\n />\n </div>\n </div>\n}\n\n<!-- Templates -->\n<ng-template #headingTemplate>\n @if (heading()) {\n <div class=\"si-layout-header\">\n <h2 class=\"si-layout-title si-layout-top-element\" [class.text-truncate]=\"truncateHeading()\">{{\n heading() | translate\n }}</h2>\n </div>\n }\n</ng-template>\n\n<ng-template #mainTemplate let-customClass=\"customClass\">\n <div\n class=\"main-container d-flex flex-column\"\n [class]=\"[mainContainerClass(), customClass ? customClass : '']\"\n [style.max-inline-size]=\"maxMainSize\"\n >\n <div class=\"main-search-actions d-flex align-items-center\">\n <ng-content select=\"[slot=mainSearch]\" />\n <ng-content select=\"[slot=mainActions]\" />\n </div>\n <div class=\"main-data-container d-flex\">\n <ng-content select=\"[slot=mainData]\" />\n </div>\n </div>\n</ng-template>\n\n<ng-template #detailTemplate let-customClass=\"customClass\">\n <div\n class=\"detail-container d-flex flex-column\"\n [class]=\"[detailContainerClass(), customClass ? customClass : '']\"\n [style.max-inline-size]=\"maxDetailSize\"\n [attr.inert]=\"preventFocusDetails ? '' : null\"\n >\n <div class=\"detail-heading-actions d-flex align-items-center\">\n @if (!this.hasLargeSize && !this.hideBackButton()) {\n <button type=\"button\" class=\"btn btn-circle btn-secondary\" (click)=\"detailsBackClicked()\">\n <si-icon [icon]=\"icons.elementBack\" />\n <span class=\"visually-hidden\">{{ detailsBackButtonText() | translate }}</span>\n </button>\n }\n @if (detailsHeading()) {\n <span class=\"detail-heading si-h4 me-auto ms-6 my-auto text-truncate\">{{\n detailsHeading() | translate\n }}</span>\n }\n <ng-content select=\"[slot=detailActions]\" />\n </div>\n <ng-content select=\"[slot=details]\" />\n </div>\n</ng-template>\n", styles: [":host{display:flex;flex-direction:column;overflow-x:hidden;overflow-y:auto}:host ::ng-deep [slot=mainSearch]{flex:1 1 0}:host ::ng-deep [slot=mainSearch]+[slot=mainActions]{margin-inline-start:12px}:host ::ng-deep [slot=mainActions]{margin-inline-start:auto}:host ::ng-deep [slot=mainData],:host ::ng-deep [slot=details]{flex:1 1 0;min-block-size:0}:host ::ng-deep [slot=detailActions]{margin-inline-start:auto}:host ::ng-deep .detail-heading+[slot=detailActions]{margin-inline-start:12px}:host ::ng-deep si-split{--si-split-gutter-background: transparent;min-block-size:0}:host ::ng-deep si-split si-split-part,:host ::ng-deep si-split .si-split-container,:host ::ng-deep si-split .si-split-part-content{overflow:visible}:host.animate{--si-main-detail-animation-duration: calc(.5s * var(--element-animations-enabled, 1))}.main-detail-layout{overflow-x:hidden;position:relative}.main-detail-layout.large-size{--si-main-detail-container-width: 100%;--si-main-detail-container-transition: none;--si-main-detail-container-transform: none;--si-main-detail-transition: none;--si-main-detail-opacity: 1;--si-main-detail-pointer-events: auto}.main-detail-container{--si-main-detail-transition: opacity var(--si-main-detail-animation-duration, 0) ease-in-out;--si-main-detail-detail-opacity: 0;--si-main-detail-detail-pointer-events: none;inline-size:var(--si-main-detail-container-width, 200%);transform:var(--si-main-detail-container-transform, none);transform-origin:top left;transition:var(--si-main-detail-container-transition, transform var(--si-main-detail-animation-duration, 0) ease-in-out)}.main-detail-container.details-active{--si-main-detail-container-transform: translateX(-50%);--si-main-detail-main-opacity: 0;--si-main-detail-detail-opacity: 1;--si-main-detail-main-pointer-events: none;--si-main-detail-detail-pointer-events: auto}.main-detail-layout,.main-detail-container,.main-container,.detail-container,.main-data-container{flex:1 1 0;min-block-size:0}.main-container,.detail-container{transition:var(--si-main-detail-transition, none)}.main-container{opacity:var(--si-main-detail-opacity, var(--si-main-detail-main-opacity, 1));pointer-events:var(--si-main-detail-pointer-events, var(--si-main-detail-main-pointer-events, auto))}.detail-container{opacity:var(--si-main-detail-opacity, var(--si-main-detail-detail-opacity, 1));pointer-events:var(--si-main-detail-pointer-events, var(--si-main-detail-detail-pointer-events, auto))}.main-search-actions:not(:empty),.detail-heading-actions:not(:empty){min-block-size:calc(1lh + 16px);margin-block-end:16px}\n"] }]
244
- }], propDecorators: { largeLayoutBreakpoint: [{ type: i0.Input, args: [{ isSignal: true, alias: "largeLayoutBreakpoint", required: false }] }], hasLargeSizeChange: [{ type: i0.Output, args: ["hasLargeSizeChange"] }], detailsActive: [{ type: i0.Input, args: [{ isSignal: true, alias: "detailsActive", required: false }] }, { type: i0.Output, args: ["detailsActiveChange"] }], heading: [{ type: i0.Input, args: [{ isSignal: true, alias: "heading", required: false }] }], truncateHeading: [{ type: i0.Input, args: [{ isSignal: true, alias: "truncateHeading", required: false }] }], detailsHeading: [{ type: i0.Input, args: [{ isSignal: true, alias: "detailsHeading", required: false }] }], resizableParts: [{ type: i0.Input, args: [{ isSignal: true, alias: "resizableParts", required: false }] }], hideBackButton: [{ type: i0.Input, args: [{ isSignal: true, alias: "hideBackButton", required: false }] }], detailsBackButtonText: [{ type: i0.Input, args: [{ isSignal: true, alias: "detailsBackButtonText", required: false }] }], containerClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "containerClass", required: false }] }], mainContainerClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "mainContainerClass", required: false }] }], detailContainerClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "detailContainerClass", required: false }] }], mainContainerWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "mainContainerWidth", required: false }] }, { type: i0.Output, args: ["mainContainerWidthChange"] }], minMainSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "minMainSize", required: false }] }], minDetailSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "minDetailSize", required: false }] }], stateId: [{ type: i0.Input, args: [{ isSignal: true, alias: "stateId", required: false }] }] } });
308
+ }, template: "@if (resizableParts() && hasLargeSize) {\n <div class=\"main-detail-layout d-flex flex-column\" [class]=\"containerClass()\">\n <ng-container *ngTemplateOutlet=\"headingTemplate\" />\n <si-split\n #splitElement\n class=\"w-100 flex-grow-1\"\n orientation=\"horizontal\"\n [stateId]=\"stateId()\"\n (sizesChange)=\"onSplitSizesChange($event)\"\n >\n <si-split-part\n #mainSplitPart\n [unit]=\"mainContainerWidthUnit()\"\n [size]=\"splitSizes[0]\"\n [showHeader]=\"false\"\n [minSize]=\"minMainSize()\"\n [stateId]=\"mainStateId()\"\n >\n <ng-container *ngTemplateOutlet=\"mainTemplate\" />\n </si-split-part>\n <si-split-part\n unit=\"fr\"\n [size]=\"splitSizes[1]\"\n [showHeader]=\"false\"\n [minSize]=\"minDetailSize()\"\n [stateId]=\"detailStateId()\"\n >\n <ng-container *ngTemplateOutlet=\"detailTemplate\" />\n </si-split-part>\n </si-split>\n </div>\n} @else {\n <div\n class=\"main-detail-layout d-flex flex-column\"\n [class]=\"containerClass()\"\n [class.large-size]=\"hasLargeSize\"\n >\n <ng-container *ngTemplateOutlet=\"headingTemplate\" />\n <div\n class=\"main-detail-container d-flex flex-grow-1\"\n [class.details-active]=\"detailsActive() && !hasLargeSize\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n mainTemplate;\n context: { customClass: hasLargeSize ? 'col-3 ps-0 pe-4' : 'col-6 px-0' }\n \"\n />\n <ng-container\n *ngTemplateOutlet=\"\n detailTemplate;\n context: { customClass: hasLargeSize ? 'col-9 ps-4 pe-0' : 'col-6 px-0' }\n \"\n />\n </div>\n </div>\n}\n\n<!-- Templates -->\n<ng-template #headingTemplate>\n @if (heading()) {\n <div class=\"si-layout-header\">\n <h2 class=\"si-layout-title si-layout-top-element\" [class.text-truncate]=\"truncateHeading()\">{{\n heading() | translate\n }}</h2>\n </div>\n }\n</ng-template>\n\n<ng-template #mainTemplate let-customClass=\"customClass\">\n <div\n class=\"main-container d-flex flex-column\"\n [class]=\"[mainContainerClass(), customClass ? customClass : '']\"\n [style.max-inline-size]=\"maxMainSize\"\n >\n <div class=\"main-search-actions d-flex align-items-center\">\n <ng-content select=\"[slot=mainSearch]\" />\n <ng-content select=\"[slot=mainActions]\" />\n </div>\n <div class=\"main-data-container d-flex\">\n <ng-content select=\"[slot=mainData]\" />\n </div>\n </div>\n</ng-template>\n\n<ng-template #detailTemplate let-customClass=\"customClass\">\n <div\n class=\"detail-container d-flex flex-column\"\n [class]=\"[detailContainerClass(), customClass ? customClass : '']\"\n [style.max-inline-size]=\"maxDetailSize\"\n [attr.inert]=\"preventFocusDetails ? '' : null\"\n >\n <div class=\"detail-heading-actions d-flex align-items-center\">\n @if (!this.hasLargeSize && !this.hideBackButton()) {\n <button type=\"button\" class=\"btn btn-circle btn-secondary\" (click)=\"detailsBackClicked()\">\n <si-icon [icon]=\"icons.elementBack\" />\n <span class=\"visually-hidden\">{{ detailsBackButtonText() | translate }}</span>\n </button>\n }\n @if (detailsHeading()) {\n <span class=\"detail-heading si-h4 me-auto ms-6 my-auto text-truncate\">{{\n detailsHeading() | translate\n }}</span>\n }\n <ng-content select=\"[slot=detailActions]\" />\n </div>\n <ng-content select=\"[slot=details]\" />\n </div>\n</ng-template>\n", styles: [":host{display:flex;flex-direction:column;overflow-x:hidden;overflow-y:auto}:host ::ng-deep [slot=mainSearch]{flex:1 1 0}:host ::ng-deep [slot=mainSearch]+[slot=mainActions]{margin-inline-start:var(--si-sys-sizing-spacing-x-50)}:host ::ng-deep [slot=mainActions]{margin-inline-start:auto}:host ::ng-deep [slot=mainData],:host ::ng-deep [slot=details]{flex:1 1 0;min-block-size:0}:host ::ng-deep [slot=detailActions]{margin-inline-start:auto}:host ::ng-deep .detail-heading+[slot=detailActions]{margin-inline-start:var(--si-sys-sizing-spacing-x-50)}:host ::ng-deep si-split{--si-split-gutter-background: transparent;min-block-size:0}:host ::ng-deep si-split si-split-part,:host ::ng-deep si-split .si-split-container,:host ::ng-deep si-split .si-split-part-content{overflow:visible}:host.animate{--si-main-detail-animation-duration: calc(.5s * var(--element-animations-enabled, 1))}.main-detail-layout{overflow-x:hidden;position:relative}.main-detail-layout.large-size{--si-main-detail-container-width: 100%;--si-main-detail-container-transition: none;--si-main-detail-container-transform: none;--si-main-detail-transition: none;--si-main-detail-opacity: 1;--si-main-detail-pointer-events: auto}.main-detail-container{--si-main-detail-transition: opacity var(--si-main-detail-animation-duration, 0) ease-in-out;--si-main-detail-detail-opacity: 0;--si-main-detail-detail-pointer-events: none;inline-size:var(--si-main-detail-container-width, 200%);transform:var(--si-main-detail-container-transform, none);transform-origin:top left;transition:var(--si-main-detail-container-transition, transform var(--si-main-detail-animation-duration, 0) ease-in-out)}.main-detail-container.details-active{--si-main-detail-container-transform: translateX(-50%);--si-main-detail-main-opacity: 0;--si-main-detail-detail-opacity: 1;--si-main-detail-main-pointer-events: none;--si-main-detail-detail-pointer-events: auto}.main-detail-layout,.main-detail-container,.main-container,.detail-container,.main-data-container{flex:1 1 0;min-block-size:0}.main-container,.detail-container{transition:var(--si-main-detail-transition, none)}.main-container{opacity:var(--si-main-detail-opacity, var(--si-main-detail-main-opacity, 1));pointer-events:var(--si-main-detail-pointer-events, var(--si-main-detail-main-pointer-events, auto))}.detail-container{opacity:var(--si-main-detail-opacity, var(--si-main-detail-detail-opacity, 1));pointer-events:var(--si-main-detail-pointer-events, var(--si-main-detail-detail-pointer-events, auto))}.main-search-actions:not(:empty),.detail-heading-actions:not(:empty){min-block-size:calc(1lh + 2 * var(--si-sys-sizing-spacing-y-40));margin-block-end:var(--si-sys-sizing-spacing-y-60)}\n"] }]
309
+ }], propDecorators: { splitElement: [{ type: i0.ViewChild, args: ['splitElement', { ...{ read: ElementRef }, isSignal: true }] }], mainSplitPart: [{ type: i0.ViewChild, args: ['mainSplitPart', { ...{ read: SiSplitPartComponent }, isSignal: true }] }], largeLayoutBreakpoint: [{ type: i0.Input, args: [{ isSignal: true, alias: "largeLayoutBreakpoint", required: false }] }], hasLargeSizeChange: [{ type: i0.Output, args: ["hasLargeSizeChange"] }], detailsActive: [{ type: i0.Input, args: [{ isSignal: true, alias: "detailsActive", required: false }] }, { type: i0.Output, args: ["detailsActiveChange"] }], heading: [{ type: i0.Input, args: [{ isSignal: true, alias: "heading", required: false }] }], truncateHeading: [{ type: i0.Input, args: [{ isSignal: true, alias: "truncateHeading", required: false }] }], detailsHeading: [{ type: i0.Input, args: [{ isSignal: true, alias: "detailsHeading", required: false }] }], resizableParts: [{ type: i0.Input, args: [{ isSignal: true, alias: "resizableParts", required: false }] }], hideBackButton: [{ type: i0.Input, args: [{ isSignal: true, alias: "hideBackButton", required: false }] }], detailsBackButtonText: [{ type: i0.Input, args: [{ isSignal: true, alias: "detailsBackButtonText", required: false }] }], containerClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "containerClass", required: false }] }], mainContainerClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "mainContainerClass", required: false }] }], detailContainerClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "detailContainerClass", required: false }] }], mainContainerWidthUnit: [{ type: i0.Input, args: [{ isSignal: true, alias: "mainContainerWidthUnit", required: false }] }], mainContainerWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "mainContainerWidth", required: false }] }, { type: i0.Output, args: ["mainContainerWidthChange"] }], minMainSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "minMainSize", required: false }] }], minDetailSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "minDetailSize", required: false }] }], stateId: [{ type: i0.Input, args: [{ isSignal: true, alias: "stateId", required: false }] }] } });
245
310
 
246
311
  /**
247
312
  * Copyright (c) Siemens 2016 - 2026
248
313
  * SPDX-License-Identifier: MIT
249
314
  */
250
315
  class SiMainDetailContainerModule {
251
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.8", ngImport: i0, type: SiMainDetailContainerModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
252
- static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "21.0.8", ngImport: i0, type: SiMainDetailContainerModule, imports: [SiMainDetailContainerComponent], exports: [SiMainDetailContainerComponent] });
253
- static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "21.0.8", ngImport: i0, type: SiMainDetailContainerModule, imports: [SiMainDetailContainerComponent] });
316
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SiMainDetailContainerModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
317
+ static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "22.0.8", ngImport: i0, type: SiMainDetailContainerModule, imports: [SiMainDetailContainerComponent], exports: [SiMainDetailContainerComponent] });
318
+ static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SiMainDetailContainerModule, imports: [SiMainDetailContainerComponent] });
254
319
  }
255
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.8", ngImport: i0, type: SiMainDetailContainerModule, decorators: [{
320
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SiMainDetailContainerModule, decorators: [{
256
321
  type: NgModule,
257
322
  args: [{
258
323
  imports: [SiMainDetailContainerComponent],