@siemens/element-ng 47.3.0 → 47.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (313) hide show
  1. package/badge/si-badge.component.d.ts +1 -1
  2. package/breadcrumb/breadcrumb-item.model.d.ts +36 -0
  3. package/breadcrumb/index.d.ts +7 -0
  4. package/breadcrumb/package.json +3 -0
  5. package/breadcrumb/si-breadcrumb-item-template.directive.d.ts +10 -0
  6. package/breadcrumb/si-breadcrumb.component.d.ts +46 -0
  7. package/breadcrumb/si-breadcrumb.module.d.ts +7 -0
  8. package/card/index.d.ts +6 -0
  9. package/card/package.json +3 -0
  10. package/card/si-card.component.d.ts +79 -0
  11. package/card/si-card.module.d.ts +7 -0
  12. package/circle-status/index.d.ts +6 -0
  13. package/circle-status/package.json +3 -0
  14. package/circle-status/si-circle-status.component.d.ts +66 -0
  15. package/circle-status/si-circle-status.module.d.ts +7 -0
  16. package/column-selection-dialog/column-selection-editor/si-column-selection-editor.component.d.ts +23 -0
  17. package/column-selection-dialog/index.d.ts +6 -0
  18. package/column-selection-dialog/package.json +3 -0
  19. package/column-selection-dialog/si-column-selection-dialog.component.d.ts +114 -0
  20. package/column-selection-dialog/si-column-selection-dialog.service.d.ts +20 -0
  21. package/column-selection-dialog/si-column-selection-dialog.types.d.ts +68 -0
  22. package/common/models/status-type.model.d.ts +4 -2
  23. package/datatable/index.d.ts +42 -0
  24. package/datatable/package.json +3 -0
  25. package/datatable/si-datatable-interaction.directive.d.ts +34 -0
  26. package/datatable/si-datatable.module.d.ts +7 -0
  27. package/date-range-filter/index.d.ts +8 -0
  28. package/date-range-filter/package.json +3 -0
  29. package/date-range-filter/si-date-range-calculation.service.d.ts +33 -0
  30. package/date-range-filter/si-date-range-filter.component.d.ts +248 -0
  31. package/date-range-filter/si-date-range-filter.module.d.ts +7 -0
  32. package/date-range-filter/si-date-range-filter.types.d.ts +40 -0
  33. package/date-range-filter/si-relative-date.component.d.ts +31 -0
  34. package/datepicker/components/si-calendar-body.component.d.ts +137 -0
  35. package/datepicker/components/si-calendar-date-cell.directive.d.ts +16 -0
  36. package/datepicker/components/si-calendar-direction-button.component.d.ts +18 -0
  37. package/datepicker/components/si-compare-adapter.d.ts +37 -0
  38. package/datepicker/components/si-day-selection.component.d.ts +76 -0
  39. package/datepicker/components/si-initial-focus.component.d.ts +74 -0
  40. package/datepicker/components/si-month-selection.component.d.ts +62 -0
  41. package/datepicker/components/si-year-selection.component.d.ts +65 -0
  42. package/datepicker/date-time-helper.d.ts +302 -0
  43. package/datepicker/index.d.ts +15 -0
  44. package/datepicker/package.json +3 -0
  45. package/datepicker/si-calendar-button.component.d.ts +49 -0
  46. package/datepicker/si-date-input.directive.d.ts +114 -0
  47. package/datepicker/si-date-range.component.d.ts +150 -0
  48. package/datepicker/si-datepicker-overlay.component.d.ts +82 -0
  49. package/datepicker/si-datepicker-overlay.directive.d.ts +104 -0
  50. package/datepicker/si-datepicker.component.d.ts +228 -0
  51. package/datepicker/si-datepicker.directive.d.ts +62 -0
  52. package/datepicker/si-datepicker.model.d.ts +129 -0
  53. package/datepicker/si-datepicker.module.d.ts +12 -0
  54. package/datepicker/si-timepicker.component.d.ts +214 -0
  55. package/electron-titlebar/electron.helpers.d.ts +5 -0
  56. package/electron-titlebar/index.d.ts +7 -0
  57. package/electron-titlebar/package.json +3 -0
  58. package/electron-titlebar/si-electron-titlebar.component.d.ts +72 -0
  59. package/electron-titlebar/si-electron-titlebar.module.d.ts +7 -0
  60. package/fesm2022/siemens-element-ng-badge.mjs.map +1 -1
  61. package/fesm2022/siemens-element-ng-breadcrumb.mjs +302 -0
  62. package/fesm2022/siemens-element-ng-breadcrumb.mjs.map +1 -0
  63. package/fesm2022/siemens-element-ng-card.mjs +122 -0
  64. package/fesm2022/siemens-element-ng-card.mjs.map +1 -0
  65. package/fesm2022/siemens-element-ng-circle-status.mjs +146 -0
  66. package/fesm2022/siemens-element-ng-circle-status.mjs.map +1 -0
  67. package/fesm2022/siemens-element-ng-column-selection-dialog.mjs +369 -0
  68. package/fesm2022/siemens-element-ng-column-selection-dialog.mjs.map +1 -0
  69. package/fesm2022/siemens-element-ng-common.mjs.map +1 -1
  70. package/fesm2022/siemens-element-ng-datatable.mjs +173 -0
  71. package/fesm2022/siemens-element-ng-datatable.mjs.map +1 -0
  72. package/fesm2022/siemens-element-ng-date-range-filter.mjs +649 -0
  73. package/fesm2022/siemens-element-ng-date-range-filter.mjs.map +1 -0
  74. package/fesm2022/siemens-element-ng-datepicker.mjs +4231 -0
  75. package/fesm2022/siemens-element-ng-datepicker.mjs.map +1 -0
  76. package/fesm2022/siemens-element-ng-electron-titlebar.mjs +142 -0
  77. package/fesm2022/siemens-element-ng-electron-titlebar.mjs.map +1 -0
  78. package/fesm2022/siemens-element-ng-file-uploader.mjs +751 -0
  79. package/fesm2022/siemens-element-ng-file-uploader.mjs.map +1 -0
  80. package/fesm2022/siemens-element-ng-filter-bar.mjs +153 -0
  81. package/fesm2022/siemens-element-ng-filter-bar.mjs.map +1 -0
  82. package/fesm2022/siemens-element-ng-filtered-search.mjs +1139 -0
  83. package/fesm2022/siemens-element-ng-filtered-search.mjs.map +1 -0
  84. package/fesm2022/siemens-element-ng-formly.mjs +935 -0
  85. package/fesm2022/siemens-element-ng-formly.mjs.map +1 -0
  86. package/fesm2022/siemens-element-ng-icon.mjs +52 -14
  87. package/fesm2022/siemens-element-ng-icon.mjs.map +1 -1
  88. package/fesm2022/siemens-element-ng-info-page.mjs +63 -0
  89. package/fesm2022/siemens-element-ng-info-page.mjs.map +1 -0
  90. package/fesm2022/siemens-element-ng-inline-notification.mjs +4 -6
  91. package/fesm2022/siemens-element-ng-inline-notification.mjs.map +1 -1
  92. package/fesm2022/siemens-element-ng-ip-input.mjs +451 -0
  93. package/fesm2022/siemens-element-ng-ip-input.mjs.map +1 -0
  94. package/fesm2022/siemens-element-ng-list-details.mjs +390 -0
  95. package/fesm2022/siemens-element-ng-list-details.mjs.map +1 -0
  96. package/fesm2022/siemens-element-ng-loading-spinner.mjs +15 -12
  97. package/fesm2022/siemens-element-ng-loading-spinner.mjs.map +1 -1
  98. package/fesm2022/siemens-element-ng-localization.mjs +306 -0
  99. package/fesm2022/siemens-element-ng-localization.mjs.map +1 -0
  100. package/fesm2022/siemens-element-ng-modal.mjs +4 -1
  101. package/fesm2022/siemens-element-ng-modal.mjs.map +1 -1
  102. package/fesm2022/siemens-element-ng-password-strength.mjs +22 -16
  103. package/fesm2022/siemens-element-ng-password-strength.mjs.map +1 -1
  104. package/fesm2022/siemens-element-ng-phone-number.mjs +426 -0
  105. package/fesm2022/siemens-element-ng-phone-number.mjs.map +1 -0
  106. package/fesm2022/siemens-element-ng-photo-upload.mjs +480 -0
  107. package/fesm2022/siemens-element-ng-photo-upload.mjs.map +1 -0
  108. package/fesm2022/siemens-element-ng-result-details-list.mjs +74 -0
  109. package/fesm2022/siemens-element-ng-result-details-list.mjs.map +1 -0
  110. package/fesm2022/siemens-element-ng-search-bar.mjs +193 -0
  111. package/fesm2022/siemens-element-ng-search-bar.mjs.map +1 -0
  112. package/fesm2022/siemens-element-ng-shadow-root.mjs +70 -0
  113. package/fesm2022/siemens-element-ng-shadow-root.mjs.map +1 -0
  114. package/fesm2022/siemens-element-ng-side-panel.mjs +554 -0
  115. package/fesm2022/siemens-element-ng-side-panel.mjs.map +1 -0
  116. package/fesm2022/siemens-element-ng-slider.mjs +313 -0
  117. package/fesm2022/siemens-element-ng-slider.mjs.map +1 -0
  118. package/fesm2022/siemens-element-ng-sort-bar.mjs +89 -0
  119. package/fesm2022/siemens-element-ng-sort-bar.mjs.map +1 -0
  120. package/fesm2022/siemens-element-ng-split.mjs +575 -0
  121. package/fesm2022/siemens-element-ng-split.mjs.map +1 -0
  122. package/fesm2022/siemens-element-ng-status-bar.mjs +348 -0
  123. package/fesm2022/siemens-element-ng-status-bar.mjs.map +1 -0
  124. package/fesm2022/siemens-element-ng-status-toggle.mjs +196 -0
  125. package/fesm2022/siemens-element-ng-status-toggle.mjs.map +1 -0
  126. package/fesm2022/siemens-element-ng-system-banner.mjs +47 -0
  127. package/fesm2022/siemens-element-ng-system-banner.mjs.map +1 -0
  128. package/fesm2022/siemens-element-ng-tabs-next.mjs +491 -0
  129. package/fesm2022/siemens-element-ng-tabs-next.mjs.map +1 -0
  130. package/fesm2022/siemens-element-ng-tabs.mjs +395 -0
  131. package/fesm2022/siemens-element-ng-tabs.mjs.map +1 -0
  132. package/fesm2022/siemens-element-ng-translate.mjs.map +1 -1
  133. package/fesm2022/siemens-element-ng-tree-view.mjs +2936 -0
  134. package/fesm2022/siemens-element-ng-tree-view.mjs.map +1 -0
  135. package/fesm2022/siemens-element-ng-unauthorized-page.mjs +76 -0
  136. package/fesm2022/siemens-element-ng-unauthorized-page.mjs.map +1 -0
  137. package/fesm2022/siemens-element-ng-wizard.mjs +2 -2
  138. package/fesm2022/siemens-element-ng-wizard.mjs.map +1 -1
  139. package/file-uploader/index.d.ts +8 -0
  140. package/file-uploader/package.json +3 -0
  141. package/file-uploader/si-file-dropzone.component.d.ts +106 -0
  142. package/file-uploader/si-file-uploader.component.d.ts +296 -0
  143. package/file-uploader/si-file-uploader.model.d.ts +12 -0
  144. package/file-uploader/si-file-uploader.module.d.ts +8 -0
  145. package/filter-bar/filter.d.ts +26 -0
  146. package/filter-bar/index.d.ts +8 -0
  147. package/filter-bar/package.json +3 -0
  148. package/filter-bar/si-filter-bar.component.d.ts +65 -0
  149. package/filter-bar/si-filter-bar.module.d.ts +7 -0
  150. package/filter-bar/si-filter-pill.component.d.ts +20 -0
  151. package/filtered-search/index.d.ts +7 -0
  152. package/filtered-search/package.json +3 -0
  153. package/filtered-search/si-filtered-search-helper.d.ts +22 -0
  154. package/filtered-search/si-filtered-search-value.component.d.ts +53 -0
  155. package/filtered-search/si-filtered-search.component.d.ts +329 -0
  156. package/filtered-search/si-filtered-search.model.d.ts +139 -0
  157. package/filtered-search/si-filtered-search.module.d.ts +7 -0
  158. package/filtered-search/values/date-value/si-filtered-search-date-value.component.d.ts +57 -0
  159. package/filtered-search/values/si-filtered-search-value.base.d.ts +27 -0
  160. package/filtered-search/values/typeahead/si-filtered-search-typeahead.component.d.ts +45 -0
  161. package/formly/fields/button/si-formly-button.component.d.ts +7 -0
  162. package/formly/fields/date-range/si-formly-date-range.component.d.ts +6 -0
  163. package/formly/fields/datetime/si-formly-datetime.component.d.ts +13 -0
  164. package/formly/fields/email/si-formly-email.component.d.ts +6 -0
  165. package/formly/fields/ip-input/si-formly-ip-input.component.d.ts +6 -0
  166. package/formly/fields/number/si-formly-number.component.d.ts +6 -0
  167. package/formly/fields/password/si-formly-password.component.d.ts +6 -0
  168. package/formly/fields/select/si-formly-select.component.d.ts +6 -0
  169. package/formly/fields/text/si-formly-text-display.component.d.ts +7 -0
  170. package/formly/fields/textarea/si-formly-textarea.component.d.ts +18 -0
  171. package/formly/fields/time/si-formly-time.component.d.ts +13 -0
  172. package/formly/index.d.ts +6 -0
  173. package/formly/package.json +3 -0
  174. package/formly/si-formly-translate.extension.d.ts +11 -0
  175. package/formly/si-formly.component.d.ts +62 -0
  176. package/formly/si-formly.module.d.ts +35 -0
  177. package/formly/structural/si-formly-accordion/si-formly-accordion.component.d.ts +13 -0
  178. package/formly/structural/si-formly-array/si-formly-array.component.d.ts +6 -0
  179. package/formly/structural/si-formly-object/si-formly-object.component.d.ts +6 -0
  180. package/formly/structural/si-formly-object-grid/si-formly-object-grid.component.d.ts +22 -0
  181. package/formly/structural/si-formly-object-grid/si-formly-object-grid.model.d.ts +21 -0
  182. package/formly/structural/si-formly-object-plain/si-formly-object-plain.component.d.ts +6 -0
  183. package/formly/structural/si-formly-tabset/si-formly-object-tabset.component.d.ts +7 -0
  184. package/formly/utils.d.ts +6 -0
  185. package/formly/wrapper/si-formly-fieldset.component.d.ts +8 -0
  186. package/formly/wrapper/si-formly-form-field-provider.directive.d.ts +19 -0
  187. package/formly/wrapper/si-formly-horizontal-wrapper.component.d.ts +6 -0
  188. package/formly/wrapper/si-formly-icon-wrapper.component.d.ts +6 -0
  189. package/formly/wrapper/si-formly-wrapper.component.d.ts +8 -0
  190. package/icon/element-icons.d.ts +15 -0
  191. package/icon/si-status-icon.component.d.ts +6 -1
  192. package/info-page/index.d.ts +5 -0
  193. package/info-page/package.json +3 -0
  194. package/info-page/si-info-page.component.d.ts +38 -0
  195. package/inline-notification/si-inline-notification.component.d.ts +0 -2
  196. package/ip-input/address-utils.d.ts +28 -0
  197. package/ip-input/address-validators.d.ts +21 -0
  198. package/ip-input/index.d.ts +7 -0
  199. package/ip-input/package.json +3 -0
  200. package/ip-input/si-ip-input.directive.d.ts +53 -0
  201. package/ip-input/si-ip4-input.directive.d.ts +9 -0
  202. package/ip-input/si-ip6-input.directive.d.ts +10 -0
  203. package/list-details/index.d.ts +12 -0
  204. package/list-details/package.json +3 -0
  205. package/list-details/si-details-pane/si-details-pane.component.d.ts +8 -0
  206. package/list-details/si-details-pane-body/si-details-pane-body.component.d.ts +6 -0
  207. package/list-details/si-details-pane-footer/si-details-pane-footer.component.d.ts +6 -0
  208. package/list-details/si-details-pane-header/si-details-pane-header.component.d.ts +38 -0
  209. package/list-details/si-list-details.component.d.ts +100 -0
  210. package/list-details/si-list-pane/si-list-pane.component.d.ts +10 -0
  211. package/list-details/si-list-pane-body/si-list-pane-body.component.d.ts +6 -0
  212. package/list-details/si-list-pane-header/si-list-pane-header.component.d.ts +6 -0
  213. package/loading-spinner/si-loading-spinner.directive.d.ts +3 -2
  214. package/localization/index.d.ts +8 -0
  215. package/localization/package.json +3 -0
  216. package/localization/si-directionality.d.ts +41 -0
  217. package/localization/si-locale-id.d.ts +22 -0
  218. package/localization/si-locale-store.d.ts +16 -0
  219. package/localization/si-locale.service.d.ts +73 -0
  220. package/package.json +161 -9
  221. package/password-strength/si-password-strength.directive.d.ts +11 -0
  222. package/phone-number/index.d.ts +7 -0
  223. package/phone-number/package.json +3 -0
  224. package/phone-number/si-phone-number-input-select.directive.d.ts +10 -0
  225. package/phone-number/si-phone-number-input.component.d.ts +137 -0
  226. package/phone-number/si-phone-number-input.models.d.ts +48 -0
  227. package/phone-number/si-phone-number-input.module.d.ts +7 -0
  228. package/photo-upload/index.d.ts +6 -0
  229. package/photo-upload/package.json +3 -0
  230. package/photo-upload/si-image-cropper-style.component.d.ts +5 -0
  231. package/photo-upload/si-photo-upload.component.d.ts +298 -0
  232. package/result-details-list/index.d.ts +7 -0
  233. package/result-details-list/package.json +3 -0
  234. package/result-details-list/si-result-details-list.component.d.ts +14 -0
  235. package/result-details-list/si-result-details-list.datamodel.d.ts +48 -0
  236. package/result-details-list/si-result-details-list.module.d.ts +7 -0
  237. package/search-bar/index.d.ts +6 -0
  238. package/search-bar/package.json +3 -0
  239. package/search-bar/si-search-bar.component.d.ts +87 -0
  240. package/search-bar/si-search-bar.module.d.ts +7 -0
  241. package/shadow-root/index.d.ts +5 -0
  242. package/shadow-root/package.json +3 -0
  243. package/shadow-root/si-shadow-root.directive.d.ts +39 -0
  244. package/side-panel/index.d.ts +9 -0
  245. package/side-panel/package.json +3 -0
  246. package/side-panel/si-side-panel-content.component.d.ts +105 -0
  247. package/side-panel/si-side-panel.component.d.ts +108 -0
  248. package/side-panel/si-side-panel.module.d.ts +8 -0
  249. package/side-panel/si-side-panel.service.d.ts +45 -0
  250. package/side-panel/side-panel.model.d.ts +16 -0
  251. package/slider/index.d.ts +6 -0
  252. package/slider/package.json +3 -0
  253. package/slider/si-slider.component.d.ts +129 -0
  254. package/slider/si-slider.module.d.ts +7 -0
  255. package/sort-bar/index.d.ts +6 -0
  256. package/sort-bar/package.json +3 -0
  257. package/sort-bar/si-sort-bar.component.d.ts +42 -0
  258. package/sort-bar/si-sort-bar.module.d.ts +7 -0
  259. package/split/index.d.ts +8 -0
  260. package/split/package.json +3 -0
  261. package/split/si-split-part.component.d.ts +154 -0
  262. package/split/si-split.component.d.ts +48 -0
  263. package/split/si-split.interfaces.d.ts +17 -0
  264. package/split/si-split.module.d.ts +8 -0
  265. package/status-bar/index.d.ts +7 -0
  266. package/status-bar/package.json +3 -0
  267. package/status-bar/si-status-bar-item/index.d.ts +6 -0
  268. package/status-bar/si-status-bar-item/si-status-bar-item.component.d.ts +22 -0
  269. package/status-bar/si-status-bar-item/si-status-bar-item.model.d.ts +33 -0
  270. package/status-bar/si-status-bar.component.d.ts +116 -0
  271. package/status-bar/si-status-bar.module.d.ts +7 -0
  272. package/status-toggle/index.d.ts +6 -0
  273. package/status-toggle/package.json +3 -0
  274. package/status-toggle/si-status-toggle.component.d.ts +54 -0
  275. package/status-toggle/status-toggle.model.d.ts +26 -0
  276. package/system-banner/index.d.ts +5 -0
  277. package/system-banner/package.json +3 -0
  278. package/system-banner/system-banner.component.d.ts +23 -0
  279. package/tabs/index.d.ts +7 -0
  280. package/tabs/package.json +3 -0
  281. package/tabs/si-tab/index.d.ts +5 -0
  282. package/tabs/si-tab/si-tab.component.d.ts +58 -0
  283. package/tabs/si-tabs.module.d.ts +8 -0
  284. package/tabs/si-tabset/index.d.ts +5 -0
  285. package/tabs/si-tabset/si-tabset.component.d.ts +100 -0
  286. package/tabs-next/index.d.ts +7 -0
  287. package/tabs-next/package.json +3 -0
  288. package/tabs-next/si-tab-next-base.directive.d.ts +66 -0
  289. package/tabs-next/si-tab-next-link.component.d.ts +18 -0
  290. package/tabs-next/si-tab-next.component.d.ts +16 -0
  291. package/tabs-next/si-tabs-tokens.d.ts +7 -0
  292. package/tabs-next/si-tabset-next.component.d.ts +72 -0
  293. package/template-i18n.json +111 -0
  294. package/translate/si-translatable-keys.interface.d.ts +111 -0
  295. package/tree-view/drag-drop.util.d.ts +32 -0
  296. package/tree-view/index.d.ts +12 -0
  297. package/tree-view/package.json +3 -0
  298. package/tree-view/si-tree-view-converter.service.d.ts +41 -0
  299. package/tree-view/si-tree-view-item/si-tree-view-item.component.d.ts +105 -0
  300. package/tree-view/si-tree-view-item/si-tree-view-item.directive.d.ts +24 -0
  301. package/tree-view/si-tree-view-item-context.d.ts +11 -0
  302. package/tree-view/si-tree-view-item-height.service.d.ts +49 -0
  303. package/tree-view/si-tree-view-item-template.directive.d.ts +18 -0
  304. package/tree-view/si-tree-view-virtualization.service.d.ts +150 -0
  305. package/tree-view/si-tree-view.component.d.ts +466 -0
  306. package/tree-view/si-tree-view.model.d.ts +146 -0
  307. package/tree-view/si-tree-view.module.d.ts +10 -0
  308. package/tree-view/si-tree-view.service.d.ts +55 -0
  309. package/tree-view/si-tree-view.utils.d.ts +46 -0
  310. package/unauthorized-page/index.d.ts +6 -0
  311. package/unauthorized-page/package.json +3 -0
  312. package/unauthorized-page/si-unauthorized-page.component.d.ts +35 -0
  313. package/unauthorized-page/si-unauthorized-page.module.d.ts +7 -0
@@ -0,0 +1,491 @@
1
+ import { FocusKeyManager } from '@angular/cdk/a11y';
2
+ import { CdkMenu, CdkMenuTrigger } from '@angular/cdk/menu';
3
+ import { NgClass, NgTemplateOutlet } from '@angular/common';
4
+ import * as i0 from '@angular/core';
5
+ import { InjectionToken, input, booleanAttribute, output, computed, inject, ElementRef, viewChild, TemplateRef, Directive, signal, effect, ChangeDetectionStrategy, Component, model, contentChildren, INJECTOR } from '@angular/core';
6
+ import * as i1$1 from '@angular/router';
7
+ import { Router, RouterLink, RouterLinkActive } from '@angular/router';
8
+ import { SiMenuDirective, SiMenuItemComponent } from '@siemens/element-ng/menu';
9
+ import * as i2 from '@siemens/element-ng/resize-observer';
10
+ import { SiResizeObserverModule } from '@siemens/element-ng/resize-observer';
11
+ import * as i1 from '@siemens/element-translate-ng/translate';
12
+ import { SiTranslateModule } from '@siemens/element-translate-ng/translate';
13
+ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
14
+ import { addIcons, elementCancel, SiIconNextComponent } from '@siemens/element-ng/icon';
15
+
16
+ /**
17
+ * Copyright Siemens 2016 - 2025.
18
+ * SPDX-License-Identifier: MIT
19
+ */
20
+ const SI_TABSET_NEXT = new InjectionToken('SiTabsetNextComponent');
21
+
22
+ class SiTabNextBaseDirective {
23
+ /** Title of the tab item. */
24
+ heading = input.required();
25
+ /**
26
+ * Icon of the tab item.
27
+ * If provided, heading text will be ignored and only icon will be displayed.
28
+ */
29
+ icon = input();
30
+ /**
31
+ * Additional badge content. A value of
32
+ * - `true` will render a red dot
33
+ * - any string without a `badgeColor` will render a red dot with text
34
+ * - any string with a `badgeColor` will render a normal badge
35
+ */
36
+ badgeContent = input();
37
+ /**
38
+ * Background color of the badge.
39
+ * If no color is provided a red dot badge will be rendered.
40
+ */
41
+ badgeColor = input();
42
+ /**
43
+ * Disables the tab.
44
+ *
45
+ * @defaultValue false
46
+ */
47
+ disabledTab = input(false, {
48
+ transform: booleanAttribute,
49
+ // eslint-disable-next-line @angular-eslint/no-input-rename
50
+ alias: 'disabled'
51
+ });
52
+ /**
53
+ * Close the current tab.
54
+ *
55
+ * @defaultValue false
56
+ */
57
+ closable = input(false, {
58
+ transform: booleanAttribute
59
+ });
60
+ /** Event emitter to notify when a tab is closed. */
61
+ closeTriggered = output();
62
+ /** @internal */
63
+ badgeIsNumber = computed(() => {
64
+ return typeof this.badgeContent() !== 'boolean';
65
+ });
66
+ tabButton = inject(ElementRef);
67
+ tabContent = viewChild('tabContent', { read: TemplateRef });
68
+ static tabCounter = 0;
69
+ retainFocus = false;
70
+ indexBeforeClose = -1;
71
+ /** @internal */
72
+ tabId = `${SiTabNextBaseDirective.tabCounter++}`;
73
+ icons = addIcons({ elementCancel });
74
+ tabset = inject(SI_TABSET_NEXT);
75
+ /** @internal */
76
+ index = computed(() => this.tabset.tabPanels().findIndex(tab => tab.tabId === this.tabId));
77
+ /** @internal */
78
+ isTabButtonFullyVisible() {
79
+ const tabButton = this.tabButton.nativeElement;
80
+ const tabsetElement = this.tabset.tabScrollContainer().nativeElement;
81
+ const tabButtonRect = tabButton.getBoundingClientRect();
82
+ const tabsetRect = tabsetElement.getBoundingClientRect();
83
+ return (Math.round(tabButtonRect.left) >= Math.round(tabsetRect.left) &&
84
+ Math.round(tabButtonRect.right) <= Math.round(tabsetRect.right));
85
+ }
86
+ ngOnDestroy() {
87
+ // adjust the focus index and selected tab index if component is destroyed
88
+ // as a side effect to close tab event
89
+ if (this.indexBeforeClose >= 0) {
90
+ const indexToFocus = this.tabset.getNextIndexToFocus(this.indexBeforeClose);
91
+ if (this.retainFocus) {
92
+ // wait for a cycle to render the tab if not visible
93
+ setTimeout(() => {
94
+ this.tabset.focusKeyManager?.setActiveItem(indexToFocus);
95
+ });
96
+ }
97
+ else if (this.indexBeforeClose >= 0 && this.active()) {
98
+ this.tabset.focusKeyManager?.updateActiveItem(indexToFocus);
99
+ this.tabset.tabPanels()[indexToFocus].tabButton.nativeElement.focus();
100
+ }
101
+ else {
102
+ let selectedItemIndex = this.tabset.activeTabIndex() ?? 0;
103
+ if (selectedItemIndex > this.indexBeforeClose) {
104
+ selectedItemIndex--;
105
+ }
106
+ this.tabset.focusKeyManager?.updateActiveItem(selectedItemIndex);
107
+ this.tabset.tabPanels()[selectedItemIndex].tabButton.nativeElement.focus();
108
+ }
109
+ // if this tab was the active one we need to select next tab as active
110
+ if (this.active()) {
111
+ const targetActiveTab = this.tabset.tabPanels()[indexToFocus];
112
+ if (targetActiveTab) {
113
+ targetActiveTab.active.set(true);
114
+ }
115
+ }
116
+ this.tabset.updateVisibleTabIndexes(indexToFocus, 'next', true);
117
+ }
118
+ }
119
+ closeTab(event, retainFocus = false) {
120
+ if (this.closable() && !this.disabledTab()) {
121
+ event.stopPropagation();
122
+ const index = this.index();
123
+ this.closeTriggered.emit();
124
+ this.retainFocus = retainFocus;
125
+ this.indexBeforeClose = index;
126
+ }
127
+ }
128
+ focus(origin) {
129
+ this.tabButton.nativeElement.focus();
130
+ }
131
+ get disabled() {
132
+ return this.disabledTab();
133
+ }
134
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: SiTabNextBaseDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
135
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.2.0", version: "19.0.6", type: SiTabNextBaseDirective, isStandalone: true, selector: "[siTabNextBase]", inputs: { heading: { classPropertyName: "heading", publicName: "heading", isSignal: true, isRequired: true, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, badgeContent: { classPropertyName: "badgeContent", publicName: "badgeContent", isSignal: true, isRequired: false, transformFunction: null }, badgeColor: { classPropertyName: "badgeColor", publicName: "badgeColor", isSignal: true, isRequired: false, transformFunction: null }, disabledTab: { classPropertyName: "disabledTab", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, closable: { classPropertyName: "closable", publicName: "closable", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { closeTriggered: "closeTriggered" }, host: { attributes: { "role": "tab" }, listeners: { "keydown.arrowLeft": "tabset.focusPrevious($event)", "keydown.arrowRight": "tabset.focusNext($event)", "keydown.delete": "closeTab($event, true)" }, properties: { "class.disabled": "disabledTab()", "attr.id": "'tab-' + tabId", "attr.aria-disabled": "disabledTab()", "attr.tabindex": "tabset.focusKeyManager?.activeItem === this && !disabledTab() ? 0 : -1", "attr.aria-controls": "'content-' + tabId" }, classAttribute: "nav-link focus-inside px-5 si-title-1" }, viewQueries: [{ propertyName: "tabContent", first: true, predicate: ["tabContent"], descendants: true, read: TemplateRef, isSignal: true }], ngImport: i0 });
136
+ }
137
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: SiTabNextBaseDirective, decorators: [{
138
+ type: Directive,
139
+ args: [{
140
+ selector: '[siTabNextBase]',
141
+ host: {
142
+ class: 'nav-link focus-inside px-5 si-title-1',
143
+ role: 'tab',
144
+ '[class.disabled]': 'disabledTab()',
145
+ '[attr.id]': "'tab-' + tabId",
146
+ '[attr.aria-disabled]': 'disabledTab()',
147
+ '[attr.tabindex]': 'tabset.focusKeyManager?.activeItem === this && !disabledTab() ? 0 : -1',
148
+ '[attr.aria-controls]': "'content-' + tabId",
149
+ '(keydown.arrowLeft)': 'tabset.focusPrevious($event)',
150
+ '(keydown.arrowRight)': 'tabset.focusNext($event)',
151
+ '(keydown.delete)': 'closeTab($event, true)'
152
+ }
153
+ }]
154
+ }] });
155
+
156
+ /**
157
+ * Copyright Siemens 2016 - 2025.
158
+ * SPDX-License-Identifier: MIT
159
+ */
160
+ /** @experimental */
161
+ class SiTabNextLinkComponent extends SiTabNextBaseDirective {
162
+ router = inject(Router, { optional: true });
163
+ /** @defaultValue false */
164
+ active = signal(false);
165
+ /** @internal */
166
+ routerLink = inject(RouterLink, { optional: true, self: true });
167
+ routerLinkActive = inject(RouterLinkActive, { self: true });
168
+ constructor() {
169
+ super();
170
+ this.routerLinkActive.isActiveChange
171
+ .pipe(takeUntilDestroyed())
172
+ .subscribe(isActive => this.active.set(isActive));
173
+ effect(() => {
174
+ if (this.active()) {
175
+ if (this.router && this.routerLink?.urlTree) {
176
+ this.router.navigateByUrl(this.routerLink.urlTree);
177
+ }
178
+ }
179
+ });
180
+ }
181
+ /** @internal */
182
+ selectTab(retainFocus) {
183
+ if (!this.isTabButtonFullyVisible()) {
184
+ this.tabset.updateVisibleTabIndexes(this.index(), 'next');
185
+ this.tabset.focusKeyManager?.updateActiveItem(this.index());
186
+ }
187
+ if (retainFocus) {
188
+ setTimeout(() => {
189
+ this.tabset.focusKeyManager?.setActiveItem(this);
190
+ });
191
+ }
192
+ }
193
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: SiTabNextLinkComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
194
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.6", type: SiTabNextLinkComponent, isStandalone: true, selector: "a[si-tab-next][routerLink]", host: { properties: { "class.active": "routerLinkActive.isActive", "attr.aria-selected": "routerLinkActive.isActive" } }, usesInheritance: true, hostDirectives: [{ directive: i1$1.RouterLinkActive }], ngImport: i0, template: "@let icon = this.icon();\n@if (icon) {\n <si-icon-next class=\"tab-icon\" [icon]=\"icon\" [attr.title]=\"heading() | translate\" />\n} @else {\n <span class=\"text-truncate\">{{ heading() | translate }}</span>\n}\n@if (badgeContent() === true) {\n <span class=\"badge-dot\"></span>\n} @else if (badgeContent() && badgeColor()) {\n <span class=\"badge\" [ngClass]=\"'bg-' + badgeColor()\">\n <!-- eslint-disable-next-line @angular-eslint/template/no-any -->\n {{ $any(badgeContent() ?? '') | translate }}\n </span>\n} @else if (badgeContent() && !badgeColor()) {\n <!-- eslint-disable-next-line @angular-eslint/template/no-any -->\n <span class=\"badge-text\"> {{ $any(badgeContent() ?? '') | translate }}</span>\n}\n@if (closable() && !disabledTab()) {\n <si-icon-next\n class=\"ms-4 me-n4 btn btn-circle btn-xs btn-ghost close\"\n [icon]=\"icons.elementCancel\"\n (click)=\"closeTab($event)\"\n />\n}\n\n<ng-template #tabContent>\n <ng-content />\n</ng-template>\n", styles: [":host.nav-link{flex-shrink:0;transform:translate(0);color:var(--element-text-primary)}:host.nav-link span.badge-dot{inset-block-end:100%;inset-inline-start:12px;margin-inline-end:12px}:host.nav-link span.badge-text{inset-block-end:calc(100% - 7px);inset-inline-start:2px}.tab-icon{font-size:24px}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: SiIconNextComponent, selector: "si-icon-next", inputs: ["icon"] }, { kind: "ngmodule", type: SiTranslateModule }, { kind: "pipe", type: i1.SiTranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
195
+ }
196
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: SiTabNextLinkComponent, decorators: [{
197
+ type: Component,
198
+ args: [{ selector: 'a[si-tab-next][routerLink]', imports: [NgClass, SiIconNextComponent, SiTranslateModule], changeDetection: ChangeDetectionStrategy.OnPush, host: {
199
+ '[class.active]': 'routerLinkActive.isActive',
200
+ '[attr.aria-selected]': 'routerLinkActive.isActive'
201
+ }, hostDirectives: [
202
+ {
203
+ directive: RouterLinkActive
204
+ }
205
+ ], template: "@let icon = this.icon();\n@if (icon) {\n <si-icon-next class=\"tab-icon\" [icon]=\"icon\" [attr.title]=\"heading() | translate\" />\n} @else {\n <span class=\"text-truncate\">{{ heading() | translate }}</span>\n}\n@if (badgeContent() === true) {\n <span class=\"badge-dot\"></span>\n} @else if (badgeContent() && badgeColor()) {\n <span class=\"badge\" [ngClass]=\"'bg-' + badgeColor()\">\n <!-- eslint-disable-next-line @angular-eslint/template/no-any -->\n {{ $any(badgeContent() ?? '') | translate }}\n </span>\n} @else if (badgeContent() && !badgeColor()) {\n <!-- eslint-disable-next-line @angular-eslint/template/no-any -->\n <span class=\"badge-text\"> {{ $any(badgeContent() ?? '') | translate }}</span>\n}\n@if (closable() && !disabledTab()) {\n <si-icon-next\n class=\"ms-4 me-n4 btn btn-circle btn-xs btn-ghost close\"\n [icon]=\"icons.elementCancel\"\n (click)=\"closeTab($event)\"\n />\n}\n\n<ng-template #tabContent>\n <ng-content />\n</ng-template>\n", styles: [":host.nav-link{flex-shrink:0;transform:translate(0);color:var(--element-text-primary)}:host.nav-link span.badge-dot{inset-block-end:100%;inset-inline-start:12px;margin-inline-end:12px}:host.nav-link span.badge-text{inset-block-end:calc(100% - 7px);inset-inline-start:2px}.tab-icon{font-size:24px}\n"] }]
206
+ }], ctorParameters: () => [] });
207
+
208
+ /**
209
+ * Copyright Siemens 2016 - 2025.
210
+ * SPDX-License-Identifier: MIT
211
+ */
212
+ /** @experimental */
213
+ class SiTabNextComponent extends SiTabNextBaseDirective {
214
+ /**
215
+ * Whether the tab is active or not.
216
+ * If set to `true`, the tab will be selected and its content will be displayed.
217
+ * @defaultValue false
218
+ * */
219
+ active = model(false);
220
+ /** @internal */
221
+ selectTab(retainFocus) {
222
+ const tabs = this.tabset.tabPanels();
223
+ const newTabIndex = this.index();
224
+ const currentTabIndex = this.tabset.activeTabIndex();
225
+ let continueWithSelection = newTabIndex !== currentTabIndex;
226
+ if (continueWithSelection && currentTabIndex !== -1) {
227
+ const currentTab = tabs[currentTabIndex];
228
+ const deselectEvent = {
229
+ target: currentTab,
230
+ tabIndex: currentTabIndex,
231
+ cancel: () => {
232
+ continueWithSelection = false;
233
+ currentTab.active.set(true);
234
+ }
235
+ };
236
+ currentTab.active.set(false);
237
+ this.tabset.deselect.emit(deselectEvent);
238
+ }
239
+ if (continueWithSelection) {
240
+ this.active.set(true);
241
+ this.tabset.focusKeyManager?.updateActiveItem(newTabIndex);
242
+ }
243
+ if (!this.isTabButtonFullyVisible()) {
244
+ this.tabset.updateVisibleTabIndexes(newTabIndex, 'next');
245
+ this.tabset.focusKeyManager?.updateActiveItem(newTabIndex);
246
+ }
247
+ if (retainFocus) {
248
+ setTimeout(() => {
249
+ this.tabset.focusKeyManager?.activeItem?.focus();
250
+ });
251
+ }
252
+ }
253
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: SiTabNextComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
254
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.6", type: SiTabNextComponent, isStandalone: true, selector: "si-tab-next", inputs: { active: { classPropertyName: "active", publicName: "active", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { active: "activeChange" }, host: { listeners: { "click": "selectTab()", "keydown.enter": "selectTab()" }, properties: { "class.active": "active()", "attr.aria-selected": "active()" } }, usesInheritance: true, ngImport: i0, template: "@let icon = this.icon();\n@if (icon) {\n <si-icon-next class=\"tab-icon\" [icon]=\"icon\" [attr.title]=\"heading() | translate\" />\n} @else {\n <span class=\"text-truncate\">{{ heading() | translate }}</span>\n}\n@if (badgeContent() === true) {\n <span class=\"badge-dot\"></span>\n} @else if (badgeContent() && badgeColor()) {\n <span class=\"badge\" [ngClass]=\"'bg-' + badgeColor()\">\n <!-- eslint-disable-next-line @angular-eslint/template/no-any -->\n {{ $any(badgeContent() ?? '') | translate }}\n </span>\n} @else if (badgeContent() && !badgeColor()) {\n <!-- eslint-disable-next-line @angular-eslint/template/no-any -->\n <span class=\"badge-text\"> {{ $any(badgeContent() ?? '') | translate }}</span>\n}\n@if (closable() && !disabledTab()) {\n <si-icon-next\n class=\"ms-4 me-n4 btn btn-circle btn-xs btn-ghost close\"\n [icon]=\"icons.elementCancel\"\n (click)=\"closeTab($event)\"\n />\n}\n\n<ng-template #tabContent>\n <ng-content />\n</ng-template>\n", styles: [":host.nav-link{flex-shrink:0;transform:translate(0);color:var(--element-text-primary)}:host.nav-link span.badge-dot{inset-block-end:100%;inset-inline-start:12px;margin-inline-end:12px}:host.nav-link span.badge-text{inset-block-end:calc(100% - 7px);inset-inline-start:2px}.tab-icon{font-size:24px}\n"], dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: SiIconNextComponent, selector: "si-icon-next", inputs: ["icon"] }, { kind: "ngmodule", type: SiTranslateModule }, { kind: "pipe", type: i1.SiTranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
255
+ }
256
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: SiTabNextComponent, decorators: [{
257
+ type: Component,
258
+ args: [{ selector: 'si-tab-next', changeDetection: ChangeDetectionStrategy.OnPush, imports: [NgClass, SiIconNextComponent, SiTranslateModule], host: {
259
+ '[class.active]': 'active()',
260
+ '[attr.aria-selected]': 'active()',
261
+ '(click)': 'selectTab()',
262
+ '(keydown.enter)': 'selectTab()'
263
+ }, template: "@let icon = this.icon();\n@if (icon) {\n <si-icon-next class=\"tab-icon\" [icon]=\"icon\" [attr.title]=\"heading() | translate\" />\n} @else {\n <span class=\"text-truncate\">{{ heading() | translate }}</span>\n}\n@if (badgeContent() === true) {\n <span class=\"badge-dot\"></span>\n} @else if (badgeContent() && badgeColor()) {\n <span class=\"badge\" [ngClass]=\"'bg-' + badgeColor()\">\n <!-- eslint-disable-next-line @angular-eslint/template/no-any -->\n {{ $any(badgeContent() ?? '') | translate }}\n </span>\n} @else if (badgeContent() && !badgeColor()) {\n <!-- eslint-disable-next-line @angular-eslint/template/no-any -->\n <span class=\"badge-text\"> {{ $any(badgeContent() ?? '') | translate }}</span>\n}\n@if (closable() && !disabledTab()) {\n <si-icon-next\n class=\"ms-4 me-n4 btn btn-circle btn-xs btn-ghost close\"\n [icon]=\"icons.elementCancel\"\n (click)=\"closeTab($event)\"\n />\n}\n\n<ng-template #tabContent>\n <ng-content />\n</ng-template>\n", styles: [":host.nav-link{flex-shrink:0;transform:translate(0);color:var(--element-text-primary)}:host.nav-link span.badge-dot{inset-block-end:100%;inset-inline-start:12px;margin-inline-end:12px}:host.nav-link span.badge-text{inset-block-end:calc(100% - 7px);inset-inline-start:2px}.tab-icon{font-size:24px}\n"] }]
264
+ }] });
265
+
266
+ /**
267
+ * Copyright Siemens 2016 - 2025.
268
+ * SPDX-License-Identifier: MIT
269
+ */
270
+ /** @experimental */
271
+ class SiTabsetNextComponent {
272
+ /**
273
+ * Event emitter to notify when a tab became inactive.
274
+ */
275
+ deselect = output();
276
+ /** @internal */
277
+ visibleTabIndexes = signal([]);
278
+ /** @internal */
279
+ activeTab = computed(() => {
280
+ return this.tabPanels().find(tab => tab.active());
281
+ });
282
+ /** @internal */
283
+ activeTabIndex = computed(() => this.activeTab()?.index() ?? -1);
284
+ /** @internal */
285
+ focusKeyManager;
286
+ tabPanelsLinks = contentChildren(SiTabNextLinkComponent);
287
+ tabPanelsComponents = contentChildren(SiTabNextComponent);
288
+ /** @internal */
289
+ tabPanels = computed(() => {
290
+ const allTabs = [
291
+ ...this.tabPanelsLinks(),
292
+ ...this.tabPanelsComponents()
293
+ ];
294
+ return allTabs;
295
+ });
296
+ /** @internal */
297
+ tabContainer = viewChild.required('tabContainer');
298
+ tabScrollContainer = viewChild.required('tabScrollContainer');
299
+ maxWrapperWidth = computed(() => {
300
+ const visibleIndexes = this.visibleTabIndexes();
301
+ return visibleIndexes.length
302
+ ? this.tabButtons()
303
+ .filter((_, index) => visibleIndexes.includes(index))
304
+ .reduce((total, current) => {
305
+ return total + current.nativeElement.clientWidth;
306
+ }, 0)
307
+ : undefined;
308
+ });
309
+ menu = viewChild('menu', { read: CdkMenu });
310
+ tabButtons = computed(() => {
311
+ return this.tabPanels().map(tab => tab.tabButton);
312
+ });
313
+ menuButton = viewChild('menuButton');
314
+ previousWidth = 0;
315
+ injector = inject(INJECTOR);
316
+ ngAfterViewInit() {
317
+ this.focusKeyManager = new FocusKeyManager(this.tabPanels, this.injector);
318
+ // To avoid ExpressionChangedAfterItHasBeenCheckedError
319
+ setTimeout(() => {
320
+ this.focusKeyManager?.updateActiveItem(this.tabPanels().findIndex(tab => !tab.disabledTab()));
321
+ });
322
+ }
323
+ resize(e) {
324
+ if (this.previousWidth && this.previousWidth === e.width) {
325
+ return;
326
+ }
327
+ else {
328
+ this.previousWidth = e.width;
329
+ }
330
+ this.updateVisibleTabIndexes(this.activeTabIndex(), 'next', true);
331
+ }
332
+ menuOpened() {
333
+ // wait for menu items to be rendered
334
+ setTimeout(() => {
335
+ const nextMenuItemToFocus = this.getNextIndexToFocus(this.activeTabIndex() + 1);
336
+ const menuItems = this.menu()?.items.toArray() ?? [];
337
+ if (nextMenuItemToFocus >= 0 && nextMenuItemToFocus < menuItems.length) {
338
+ menuItems[nextMenuItemToFocus].focus();
339
+ // bug in cdk as setting focus on menu item does not update focus manager active item
340
+ // eslint-disable-next-line @typescript-eslint/dot-notation
341
+ const focusManager = this.menu()?.['keyManager'];
342
+ focusManager?.updateActiveItem(nextMenuItemToFocus);
343
+ }
344
+ else {
345
+ menuItems[0].focus();
346
+ }
347
+ });
348
+ }
349
+ tabIsLink(tab) {
350
+ return tab instanceof SiTabNextLinkComponent;
351
+ }
352
+ /** @internal */
353
+ focusPrevious(e) {
354
+ e.preventDefault();
355
+ const activeItemIndex = this.focusKeyManager?.activeItemIndex;
356
+ if (activeItemIndex > 0) {
357
+ this.focusKeyManager?.setPreviousItemActive();
358
+ this.updateVisibleTabIndexes(this.focusKeyManager.activeItemIndex, 'previous');
359
+ setTimeout(() => {
360
+ this.focusKeyManager?.setActiveItem(this.focusKeyManager.activeItemIndex);
361
+ });
362
+ }
363
+ }
364
+ /** @internal */
365
+ focusNext(e) {
366
+ e.preventDefault();
367
+ const activeItemIndex = this.focusKeyManager?.activeItemIndex;
368
+ if (activeItemIndex < this.tabButtons().length) {
369
+ this.focusKeyManager?.setNextItemActive();
370
+ this.updateVisibleTabIndexes(this.focusKeyManager.activeItemIndex, 'next');
371
+ setTimeout(() => {
372
+ this.focusKeyManager?.setActiveItem(this.focusKeyManager.activeItemIndex);
373
+ });
374
+ }
375
+ }
376
+ /** @internal */
377
+ updateVisibleTabIndexes(startIndex, type, forceUpdate) {
378
+ if (startIndex < this.tabButtons().length) {
379
+ if (!this.visibleTabIndexes().includes(startIndex) || forceUpdate) {
380
+ let availableWidth = this.tabContainer().nativeElement.clientWidth;
381
+ if (this.menuButton()) {
382
+ availableWidth = availableWidth - this.menuButton().nativeElement.clientWidth;
383
+ }
384
+ let consumedWidth = 0;
385
+ const visibleTabIndexes = [];
386
+ const calculateConsumedWidth = (i) => {
387
+ consumedWidth += this.tabButtons()[i].nativeElement.clientWidth;
388
+ if (visibleTabIndexes.includes(0) &&
389
+ i === this.tabButtons().length - 1 &&
390
+ this.menuButton()) {
391
+ availableWidth = availableWidth + this.menuButton().nativeElement.clientWidth;
392
+ }
393
+ if (consumedWidth <= availableWidth) {
394
+ visibleTabIndexes.push(i);
395
+ return false;
396
+ }
397
+ else {
398
+ consumedWidth -= this.tabButtons()[i].nativeElement.clientWidth;
399
+ return true;
400
+ }
401
+ };
402
+ const isNextDirection = type === 'next';
403
+ // First pass: Calculate in primary direction
404
+ const primaryRange = this.getPrimaryRange(isNextDirection, startIndex, this.tabButtons().length);
405
+ this.traverseRange(primaryRange, calculateConsumedWidth);
406
+ // Second pass: Calculate in opposite direction if space available
407
+ if (consumedWidth < availableWidth) {
408
+ const secondaryRange = this.getSecondaryRange(isNextDirection, startIndex, this.tabButtons().length);
409
+ this.traverseRange(secondaryRange, calculateConsumedWidth);
410
+ }
411
+ visibleTabIndexes.sort((a, b) => a - b);
412
+ this.visibleTabIndexes.set(visibleTabIndexes);
413
+ this.scrollFirstVisibleTabIntoView();
414
+ }
415
+ }
416
+ }
417
+ /** @internal */
418
+ getNextIndexToFocus(currentIndex) {
419
+ for (let i = 0; i < this.tabPanels().length; i++) {
420
+ // Get the actual index using modulo to wrap around
421
+ const checkIndex = (currentIndex + i) % this.tabPanels().length;
422
+ if (!this.tabPanels()[checkIndex].disabledTab()) {
423
+ return this.tabPanels()[checkIndex].index();
424
+ }
425
+ }
426
+ return -1;
427
+ }
428
+ getPrimaryRange(isNextDirection, startIndex, length) {
429
+ return isNextDirection
430
+ ? { start: startIndex, end: 0, step: -1 }
431
+ : { start: startIndex, end: length - 1, step: 1 };
432
+ }
433
+ getSecondaryRange(isNextDirection, startIndex, length) {
434
+ return isNextDirection
435
+ ? { start: startIndex + 1, end: length - 1, step: 1 }
436
+ : { start: startIndex - 1, end: 0, step: -1 };
437
+ }
438
+ traverseRange(range, callback) {
439
+ const condition = (i) => (range.step > 0 ? i <= range.end : i >= range.end);
440
+ for (let i = range.start; condition(i); i += range.step) {
441
+ if (callback(i)) {
442
+ break;
443
+ }
444
+ }
445
+ }
446
+ scrollFirstVisibleTabIntoView() {
447
+ setTimeout(() => {
448
+ this.tabButtons().at(this.visibleTabIndexes()[0])?.nativeElement.scrollIntoView({
449
+ behavior: 'instant',
450
+ inline: 'start',
451
+ block: 'nearest'
452
+ });
453
+ });
454
+ }
455
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: SiTabsetNextComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
456
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.6", type: SiTabsetNextComponent, isStandalone: true, selector: "si-tabset-next", outputs: { deselect: "deselect" }, providers: [
457
+ {
458
+ provide: SI_TABSET_NEXT,
459
+ useExisting: SiTabsetNextComponent
460
+ }
461
+ ], queries: [{ propertyName: "tabPanelsLinks", predicate: SiTabNextLinkComponent, isSignal: true }, { propertyName: "tabPanelsComponents", predicate: SiTabNextComponent, isSignal: true }], viewQueries: [{ propertyName: "tabContainer", first: true, predicate: ["tabContainer"], descendants: true, isSignal: true }, { propertyName: "tabScrollContainer", first: true, predicate: ["tabScrollContainer"], descendants: true, isSignal: true }, { propertyName: "menu", first: true, predicate: ["menu"], descendants: true, read: CdkMenu, isSignal: true }, { propertyName: "menuButton", first: true, predicate: ["menuButton"], descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"tabs-container\">\n <div\n #tabContainer\n class=\"tab-container-buttonbar-list nav nav-tabs\"\n (siResizeObserver)=\"resize($event)\"\n >\n <div\n #tabScrollContainer\n role=\"tablist\"\n tabindex=\"-1\"\n class=\"d-flex tabs-wrapper\"\n [style.max-width.px]=\"maxWrapperWidth()\"\n >\n <ng-content />\n </div>\n\n @if (visibleTabIndexes().length < tabPanels().length) {\n <button\n #menuButton\n type=\"button\"\n class=\"dropdown btn btn-tertiary focus-inside\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n [cdkMenuTriggerFor]=\"tabsMenu\"\n (cdkMenuOpened)=\"menuOpened()\"\n >\n <i class=\"icon element-options m-0\"></i>\n </button>\n }\n </div>\n @let tabContent = this.activeTab()?.tabContent();\n @let activeTab = this.activeTab();\n\n @if (activeTab) {\n <div\n class=\"tab-content\"\n role=\"tabpanel\"\n [id]=\"'content-' + activeTab.tabId\"\n [attr.aria-labelledby]=\"'tab-' + activeTab.tabId\"\n >\n @if (tabContent) {\n <ng-container [ngTemplateOutlet]=\"tabContent\" />\n }\n\n <ng-content select=\"router-outlet\" />\n </div>\n }\n</div>\n\n<ng-template #tabsMenu>\n <si-menu #menu>\n @for (tab of tabPanels(); track tab) {\n @let badgeColor = tab.badgeColor();\n @let badgeIsNumber = tab.badgeIsNumber();\n\n @if (badgeColor && badgeIsNumber) {\n <!-- eslint-disable @angular-eslint/template/no-any -->\n <a\n #menuItem\n si-menu-item\n [disabled]=\"tab.disabledTab()\"\n [badgeColor]=\"badgeColor\"\n [badge]=\"$any(tab.badgeContent())\"\n [icon]=\"tab.icon()\"\n [routerLink]=\"tabIsLink(tab) ? tab.routerLink?.urlTree : undefined\"\n (keydown.enter)=\"tab.selectTab(true)\"\n (triggered)=\"tab.selectTab(true)\"\n >\n <ng-container [ngTemplateOutlet]=\"badgeTemplate\" [ngTemplateOutletContext]=\"{ tab }\" />\n </a>\n } @else if (badgeIsNumber && badgeColor) {\n <a\n #menuItem\n si-menu-item\n [disabled]=\"tab.disabledTab()\"\n [icon]=\"tab.icon()\"\n [badgeColor]=\"badgeColor\"\n [badge]=\"$any(tab.badgeContent())\"\n [routerLink]=\"tabIsLink(tab) ? tab.routerLink?.urlTree : undefined\"\n (keydown.enter)=\"tab.selectTab(true)\"\n (triggered)=\"tab.selectTab(true)\"\n >\n <!-- eslint-enable -->\n <ng-container [ngTemplateOutlet]=\"badgeTemplate\" [ngTemplateOutletContext]=\"{ tab }\" />\n </a>\n } @else {\n <a\n #menuItem\n si-menu-item\n [disabled]=\"tab.disabledTab()\"\n [icon]=\"tab.icon()\"\n [routerLink]=\"tabIsLink(tab) ? tab.routerLink?.urlTree : undefined\"\n (keydown.enter)=\"tab.selectTab(true)\"\n (triggered)=\"tab.selectTab(true)\"\n >\n <ng-container [ngTemplateOutlet]=\"badgeTemplate\" [ngTemplateOutletContext]=\"{ tab }\" />\n </a>\n }\n }\n </si-menu>\n</ng-template>\n\n<ng-template #badgeTemplate let-tab=\"tab\">\n <div class=\"d-flex align-items-center space-between flex-no-wrap justify-content-between\">\n {{ tab.heading() }}\n @if (tab.badgeContent() === true) {\n <span class=\"badge-dot\"></span>\n } @else if (tab.badgeContent() && !tab.badgeColor()) {\n <!-- eslint-disable-next-line @angular-eslint/template/no-any -->\n <span class=\"badge-text\"> {{ $any(tab.badgeContent() ?? '') | translate }}</span>\n }\n </div>\n</ng-template>\n", styles: [":host{display:block;flex-direction:column}.tabs-container{display:flex;flex-wrap:wrap;overflow:hidden;block-size:100%;min-block-size:40px}.tabs-container:before{inset-block-start:38px;inset-block-end:auto}.tab-container-buttonbar-list{display:flex;min-block-size:40px;overflow:hidden;flex:1;order:1;min-inline-size:100px}.btn.dropdown{color:var(--element-text-primary);min-inline-size:0;border-block-end:2px solid var(--element-ui-4);order:2;block-size:40px;padding-inline:12px}.btn.dropdown:hover{border-color:var(--element-ui-4);color:var(--element-action-secondary-text-hover)}a[si-menu-item] .badge-dot{inset-block-end:4px;min-inline-size:12px;margin-inline-start:4px}.tab-content{inline-size:100%;block-size:calc(100% - 40px);order:3}.tabs-wrapper{overflow-y:hidden;overflow-x:auto;scroll-behavior:smooth;scrollbar-width:none}\n"], dependencies: [{ kind: "ngmodule", type: SiTranslateModule }, { kind: "pipe", type: i1.SiTranslatePipe, name: "translate" }, { kind: "directive", type: SiMenuDirective, selector: "si-menu" }, { kind: "component", type: SiMenuItemComponent, selector: "si-menu-item, a[si-menu-item], button[si-menu-item]" }, { kind: "directive", type: CdkMenuTrigger, selector: "[cdkMenuTriggerFor]", inputs: ["cdkMenuTriggerFor", "cdkMenuPosition", "cdkMenuTriggerData"], outputs: ["cdkMenuOpened", "cdkMenuClosed"], exportAs: ["cdkMenuTriggerFor"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: SiResizeObserverModule }, { kind: "directive", type: i2.SiResizeObserverDirective, selector: "[siResizeObserver]", inputs: ["resizeThrottle"], outputs: ["siResizeObserver"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
462
+ }
463
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.6", ngImport: i0, type: SiTabsetNextComponent, decorators: [{
464
+ type: Component,
465
+ args: [{ selector: 'si-tabset-next', changeDetection: ChangeDetectionStrategy.OnPush, imports: [
466
+ SiTranslateModule,
467
+ SiMenuDirective,
468
+ SiMenuItemComponent,
469
+ CdkMenuTrigger,
470
+ NgTemplateOutlet,
471
+ SiResizeObserverModule,
472
+ RouterLink
473
+ ], providers: [
474
+ {
475
+ provide: SI_TABSET_NEXT,
476
+ useExisting: SiTabsetNextComponent
477
+ }
478
+ ], template: "<div class=\"tabs-container\">\n <div\n #tabContainer\n class=\"tab-container-buttonbar-list nav nav-tabs\"\n (siResizeObserver)=\"resize($event)\"\n >\n <div\n #tabScrollContainer\n role=\"tablist\"\n tabindex=\"-1\"\n class=\"d-flex tabs-wrapper\"\n [style.max-width.px]=\"maxWrapperWidth()\"\n >\n <ng-content />\n </div>\n\n @if (visibleTabIndexes().length < tabPanels().length) {\n <button\n #menuButton\n type=\"button\"\n class=\"dropdown btn btn-tertiary focus-inside\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n [cdkMenuTriggerFor]=\"tabsMenu\"\n (cdkMenuOpened)=\"menuOpened()\"\n >\n <i class=\"icon element-options m-0\"></i>\n </button>\n }\n </div>\n @let tabContent = this.activeTab()?.tabContent();\n @let activeTab = this.activeTab();\n\n @if (activeTab) {\n <div\n class=\"tab-content\"\n role=\"tabpanel\"\n [id]=\"'content-' + activeTab.tabId\"\n [attr.aria-labelledby]=\"'tab-' + activeTab.tabId\"\n >\n @if (tabContent) {\n <ng-container [ngTemplateOutlet]=\"tabContent\" />\n }\n\n <ng-content select=\"router-outlet\" />\n </div>\n }\n</div>\n\n<ng-template #tabsMenu>\n <si-menu #menu>\n @for (tab of tabPanels(); track tab) {\n @let badgeColor = tab.badgeColor();\n @let badgeIsNumber = tab.badgeIsNumber();\n\n @if (badgeColor && badgeIsNumber) {\n <!-- eslint-disable @angular-eslint/template/no-any -->\n <a\n #menuItem\n si-menu-item\n [disabled]=\"tab.disabledTab()\"\n [badgeColor]=\"badgeColor\"\n [badge]=\"$any(tab.badgeContent())\"\n [icon]=\"tab.icon()\"\n [routerLink]=\"tabIsLink(tab) ? tab.routerLink?.urlTree : undefined\"\n (keydown.enter)=\"tab.selectTab(true)\"\n (triggered)=\"tab.selectTab(true)\"\n >\n <ng-container [ngTemplateOutlet]=\"badgeTemplate\" [ngTemplateOutletContext]=\"{ tab }\" />\n </a>\n } @else if (badgeIsNumber && badgeColor) {\n <a\n #menuItem\n si-menu-item\n [disabled]=\"tab.disabledTab()\"\n [icon]=\"tab.icon()\"\n [badgeColor]=\"badgeColor\"\n [badge]=\"$any(tab.badgeContent())\"\n [routerLink]=\"tabIsLink(tab) ? tab.routerLink?.urlTree : undefined\"\n (keydown.enter)=\"tab.selectTab(true)\"\n (triggered)=\"tab.selectTab(true)\"\n >\n <!-- eslint-enable -->\n <ng-container [ngTemplateOutlet]=\"badgeTemplate\" [ngTemplateOutletContext]=\"{ tab }\" />\n </a>\n } @else {\n <a\n #menuItem\n si-menu-item\n [disabled]=\"tab.disabledTab()\"\n [icon]=\"tab.icon()\"\n [routerLink]=\"tabIsLink(tab) ? tab.routerLink?.urlTree : undefined\"\n (keydown.enter)=\"tab.selectTab(true)\"\n (triggered)=\"tab.selectTab(true)\"\n >\n <ng-container [ngTemplateOutlet]=\"badgeTemplate\" [ngTemplateOutletContext]=\"{ tab }\" />\n </a>\n }\n }\n </si-menu>\n</ng-template>\n\n<ng-template #badgeTemplate let-tab=\"tab\">\n <div class=\"d-flex align-items-center space-between flex-no-wrap justify-content-between\">\n {{ tab.heading() }}\n @if (tab.badgeContent() === true) {\n <span class=\"badge-dot\"></span>\n } @else if (tab.badgeContent() && !tab.badgeColor()) {\n <!-- eslint-disable-next-line @angular-eslint/template/no-any -->\n <span class=\"badge-text\"> {{ $any(tab.badgeContent() ?? '') | translate }}</span>\n }\n </div>\n</ng-template>\n", styles: [":host{display:block;flex-direction:column}.tabs-container{display:flex;flex-wrap:wrap;overflow:hidden;block-size:100%;min-block-size:40px}.tabs-container:before{inset-block-start:38px;inset-block-end:auto}.tab-container-buttonbar-list{display:flex;min-block-size:40px;overflow:hidden;flex:1;order:1;min-inline-size:100px}.btn.dropdown{color:var(--element-text-primary);min-inline-size:0;border-block-end:2px solid var(--element-ui-4);order:2;block-size:40px;padding-inline:12px}.btn.dropdown:hover{border-color:var(--element-ui-4);color:var(--element-action-secondary-text-hover)}a[si-menu-item] .badge-dot{inset-block-end:4px;min-inline-size:12px;margin-inline-start:4px}.tab-content{inline-size:100%;block-size:calc(100% - 40px);order:3}.tabs-wrapper{overflow-y:hidden;overflow-x:auto;scroll-behavior:smooth;scrollbar-width:none}\n"] }]
479
+ }] });
480
+
481
+ /**
482
+ * Copyright Siemens 2016 - 2025.
483
+ * SPDX-License-Identifier: MIT
484
+ */
485
+
486
+ /**
487
+ * Generated bundle index. Do not edit.
488
+ */
489
+
490
+ export { SiTabNextComponent, SiTabNextLinkComponent, SiTabsetNextComponent };
491
+ //# sourceMappingURL=siemens-element-ng-tabs-next.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"siemens-element-ng-tabs-next.mjs","sources":["../../../../projects/element-ng/tabs-next/si-tabs-tokens.ts","../../../../projects/element-ng/tabs-next/si-tab-next-base.directive.ts","../../../../projects/element-ng/tabs-next/si-tab-next-link.component.ts","../../../../projects/element-ng/tabs-next/si-tab-next.component.html","../../../../projects/element-ng/tabs-next/si-tab-next.component.ts","../../../../projects/element-ng/tabs-next/si-tabset-next.component.ts","../../../../projects/element-ng/tabs-next/si-tabset-next.component.html","../../../../projects/element-ng/tabs-next/index.ts","../../../../projects/element-ng/tabs-next/siemens-element-ng-tabs-next.ts"],"sourcesContent":["/**\n * Copyright Siemens 2016 - 2025.\n * SPDX-License-Identifier: MIT\n */\nimport { InjectionToken } from '@angular/core';\n\nimport { SiTabsetNextComponent } from './si-tabset-next.component';\n\nexport const SI_TABSET_NEXT = new InjectionToken<SiTabsetNextComponent>('SiTabsetNextComponent');\n","/**\n * Copyright Siemens 2016 - 2025.\n * SPDX-License-Identifier: MIT\n */\nimport { FocusableOption, FocusOrigin } from '@angular/cdk/a11y';\nimport {\n booleanAttribute,\n computed,\n Directive,\n ElementRef,\n inject,\n input,\n OnDestroy,\n output,\n TemplateRef,\n viewChild,\n WritableSignal\n} from '@angular/core';\nimport { addIcons, elementCancel } from '@siemens/element-ng/icon';\nimport { TranslatableString } from '@siemens/element-translate-ng/translate';\n\nimport { SI_TABSET_NEXT } from './si-tabs-tokens';\n\n@Directive({\n selector: '[siTabNextBase]',\n host: {\n class: 'nav-link focus-inside px-5 si-title-1',\n role: 'tab',\n '[class.disabled]': 'disabledTab()',\n '[attr.id]': \"'tab-' + tabId\",\n '[attr.aria-disabled]': 'disabledTab()',\n '[attr.tabindex]': 'tabset.focusKeyManager?.activeItem === this && !disabledTab() ? 0 : -1',\n '[attr.aria-controls]': \"'content-' + tabId\",\n '(keydown.arrowLeft)': 'tabset.focusPrevious($event)',\n '(keydown.arrowRight)': 'tabset.focusNext($event)',\n '(keydown.delete)': 'closeTab($event, true)'\n }\n})\nexport abstract class SiTabNextBaseDirective implements OnDestroy, FocusableOption {\n abstract readonly active: WritableSignal<boolean>;\n /** Title of the tab item. */\n readonly heading = input.required<TranslatableString>();\n /**\n * Icon of the tab item.\n * If provided, heading text will be ignored and only icon will be displayed.\n */\n readonly icon = input<string>();\n /**\n * Additional badge content. A value of\n * - `true` will render a red dot\n * - any string without a `badgeColor` will render a red dot with text\n * - any string with a `badgeColor` will render a normal badge\n */\n readonly badgeContent = input<TranslatableString | boolean>();\n /**\n * Background color of the badge.\n * If no color is provided a red dot badge will be rendered.\n */\n readonly badgeColor = input<string>();\n /**\n * Disables the tab.\n *\n * @defaultValue false\n */\n readonly disabledTab = input(false, {\n transform: booleanAttribute,\n // eslint-disable-next-line @angular-eslint/no-input-rename\n alias: 'disabled'\n });\n /**\n * Close the current tab.\n *\n * @defaultValue false\n */\n readonly closable = input(false, {\n transform: booleanAttribute\n });\n /** Event emitter to notify when a tab is closed. */\n readonly closeTriggered = output();\n\n /** @internal */\n readonly badgeIsNumber = computed(() => {\n return typeof this.badgeContent() !== 'boolean';\n });\n\n readonly tabButton = inject<ElementRef<HTMLElement>>(ElementRef);\n readonly tabContent = viewChild('tabContent', { read: TemplateRef });\n\n private static tabCounter = 0;\n private retainFocus = false;\n private indexBeforeClose = -1;\n\n /** @internal */\n tabId = `${SiTabNextBaseDirective.tabCounter++}`;\n protected readonly icons = addIcons({ elementCancel });\n protected tabset = inject(SI_TABSET_NEXT);\n /** @internal */\n readonly index = computed(() =>\n this.tabset.tabPanels().findIndex(tab => tab.tabId === this.tabId)\n );\n\n /** @internal */\n isTabButtonFullyVisible(): boolean {\n const tabButton = this.tabButton.nativeElement;\n const tabsetElement = this.tabset.tabScrollContainer().nativeElement;\n\n const tabButtonRect = tabButton.getBoundingClientRect();\n const tabsetRect = tabsetElement.getBoundingClientRect();\n return (\n Math.round(tabButtonRect.left) >= Math.round(tabsetRect.left) &&\n Math.round(tabButtonRect.right) <= Math.round(tabsetRect.right)\n );\n }\n\n ngOnDestroy(): void {\n // adjust the focus index and selected tab index if component is destroyed\n // as a side effect to close tab event\n if (this.indexBeforeClose >= 0) {\n const indexToFocus = this.tabset.getNextIndexToFocus(this.indexBeforeClose);\n if (this.retainFocus) {\n // wait for a cycle to render the tab if not visible\n setTimeout(() => {\n this.tabset.focusKeyManager?.setActiveItem(indexToFocus);\n });\n } else if (this.indexBeforeClose >= 0 && this.active()) {\n this.tabset.focusKeyManager?.updateActiveItem(indexToFocus);\n this.tabset.tabPanels()[indexToFocus].tabButton.nativeElement.focus();\n } else {\n let selectedItemIndex = this.tabset.activeTabIndex() ?? 0;\n if (selectedItemIndex > this.indexBeforeClose) {\n selectedItemIndex--;\n }\n this.tabset.focusKeyManager?.updateActiveItem(selectedItemIndex);\n this.tabset.tabPanels()[selectedItemIndex].tabButton.nativeElement.focus();\n }\n // if this tab was the active one we need to select next tab as active\n if (this.active()) {\n const targetActiveTab = this.tabset.tabPanels()[indexToFocus];\n if (targetActiveTab) {\n targetActiveTab.active.set(true);\n }\n }\n this.tabset.updateVisibleTabIndexes(indexToFocus, 'next', true);\n }\n }\n\n protected closeTab(event: Event, retainFocus = false): void {\n if (this.closable() && !this.disabledTab()) {\n event.stopPropagation();\n const index = this.index();\n this.closeTriggered.emit();\n this.retainFocus = retainFocus;\n this.indexBeforeClose = index;\n }\n }\n\n focus(origin?: FocusOrigin): void {\n this.tabButton.nativeElement.focus();\n }\n\n get disabled(): boolean {\n return this.disabledTab();\n }\n\n abstract selectTab(retainFocus?: boolean): void;\n}\n","/**\n * Copyright Siemens 2016 - 2025.\n * SPDX-License-Identifier: MIT\n */\nimport { NgClass } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, effect, inject, signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { Router, RouterLink, RouterLinkActive } from '@angular/router';\nimport { SiIconNextComponent } from '@siemens/element-ng/icon';\nimport { SiTranslateModule } from '@siemens/element-translate-ng/translate';\n\nimport { SiTabNextBaseDirective } from './si-tab-next-base.directive';\n\n/** @experimental */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'a[si-tab-next][routerLink]',\n templateUrl: './si-tab-next.component.html',\n styleUrl: './si-tab-next.component.scss',\n imports: [NgClass, SiIconNextComponent, SiTranslateModule],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class.active]': 'routerLinkActive.isActive',\n '[attr.aria-selected]': 'routerLinkActive.isActive'\n },\n hostDirectives: [\n {\n directive: RouterLinkActive\n }\n ]\n})\nexport class SiTabNextLinkComponent extends SiTabNextBaseDirective {\n private router = inject(Router, { optional: true });\n /** @defaultValue false */\n override readonly active = signal(false);\n /** @internal */\n routerLink = inject(RouterLink, { optional: true, self: true });\n private routerLinkActive = inject(RouterLinkActive, { self: true });\n constructor() {\n super();\n this.routerLinkActive.isActiveChange\n .pipe(takeUntilDestroyed())\n .subscribe(isActive => this.active.set(isActive));\n\n effect(() => {\n if (this.active()) {\n if (this.router && this.routerLink?.urlTree) {\n this.router.navigateByUrl(this.routerLink.urlTree);\n }\n }\n });\n }\n\n /** @internal */\n override selectTab(retainFocus?: boolean): void {\n if (!this.isTabButtonFullyVisible()) {\n this.tabset.updateVisibleTabIndexes(this.index(), 'next');\n this.tabset.focusKeyManager?.updateActiveItem(this.index());\n }\n if (retainFocus) {\n setTimeout(() => {\n this.tabset.focusKeyManager?.setActiveItem(this);\n });\n }\n }\n}\n","@let icon = this.icon();\n@if (icon) {\n <si-icon-next class=\"tab-icon\" [icon]=\"icon\" [attr.title]=\"heading() | translate\" />\n} @else {\n <span class=\"text-truncate\">{{ heading() | translate }}</span>\n}\n@if (badgeContent() === true) {\n <span class=\"badge-dot\"></span>\n} @else if (badgeContent() && badgeColor()) {\n <span class=\"badge\" [ngClass]=\"'bg-' + badgeColor()\">\n <!-- eslint-disable-next-line @angular-eslint/template/no-any -->\n {{ $any(badgeContent() ?? '') | translate }}\n </span>\n} @else if (badgeContent() && !badgeColor()) {\n <!-- eslint-disable-next-line @angular-eslint/template/no-any -->\n <span class=\"badge-text\"> {{ $any(badgeContent() ?? '') | translate }}</span>\n}\n@if (closable() && !disabledTab()) {\n <si-icon-next\n class=\"ms-4 me-n4 btn btn-circle btn-xs btn-ghost close\"\n [icon]=\"icons.elementCancel\"\n (click)=\"closeTab($event)\"\n />\n}\n\n<ng-template #tabContent>\n <ng-content />\n</ng-template>\n","/**\n * Copyright Siemens 2016 - 2025.\n * SPDX-License-Identifier: MIT\n */\nimport { NgClass } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, model, OnDestroy } from '@angular/core';\nimport { SiIconNextComponent } from '@siemens/element-ng/icon';\nimport { SiTranslateModule } from '@siemens/element-translate-ng/translate';\n\nimport { SiTabNextBaseDirective } from './si-tab-next-base.directive';\n\n/** @experimental */\n@Component({\n selector: 'si-tab-next',\n templateUrl: './si-tab-next.component.html',\n styleUrl: './si-tab-next.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgClass, SiIconNextComponent, SiTranslateModule],\n host: {\n '[class.active]': 'active()',\n '[attr.aria-selected]': 'active()',\n '(click)': 'selectTab()',\n '(keydown.enter)': 'selectTab()'\n }\n})\nexport class SiTabNextComponent extends SiTabNextBaseDirective implements OnDestroy {\n /**\n * Whether the tab is active or not.\n * If set to `true`, the tab will be selected and its content will be displayed.\n * @defaultValue false\n * */\n override readonly active = model(false);\n\n /** @internal */\n selectTab(retainFocus?: boolean): void {\n const tabs = this.tabset.tabPanels();\n const newTabIndex = this.index();\n const currentTabIndex = this.tabset.activeTabIndex();\n let continueWithSelection = newTabIndex !== currentTabIndex;\n\n if (continueWithSelection && currentTabIndex !== -1) {\n const currentTab = tabs[currentTabIndex];\n const deselectEvent = {\n target: currentTab,\n tabIndex: currentTabIndex,\n cancel: () => {\n continueWithSelection = false;\n currentTab.active.set(true);\n }\n };\n\n currentTab.active.set(false);\n this.tabset.deselect.emit(deselectEvent);\n }\n\n if (continueWithSelection) {\n this.active.set(true);\n this.tabset.focusKeyManager?.updateActiveItem(newTabIndex);\n }\n if (!this.isTabButtonFullyVisible()) {\n this.tabset.updateVisibleTabIndexes(newTabIndex, 'next');\n this.tabset.focusKeyManager?.updateActiveItem(newTabIndex);\n }\n if (retainFocus) {\n setTimeout(() => {\n this.tabset.focusKeyManager?.activeItem?.focus();\n });\n }\n }\n}\n","/**\n * Copyright Siemens 2016 - 2025.\n * SPDX-License-Identifier: MIT\n */\nimport { FocusKeyManager } from '@angular/cdk/a11y';\nimport { CdkMenu, CdkMenuTrigger } from '@angular/cdk/menu';\nimport { NgTemplateOutlet } from '@angular/common';\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChildren,\n ElementRef,\n inject,\n INJECTOR,\n output,\n signal,\n viewChild\n} from '@angular/core';\nimport { RouterLink } from '@angular/router';\nimport { SiMenuDirective, SiMenuItemComponent } from '@siemens/element-ng/menu';\nimport { ElementDimensions, SiResizeObserverModule } from '@siemens/element-ng/resize-observer';\nimport { SiTranslateModule } from '@siemens/element-translate-ng/translate';\n\nimport { SiTabNextLinkComponent } from './si-tab-next-link.component';\nimport { SiTabNextComponent } from './si-tab-next.component';\nimport { SI_TABSET_NEXT } from './si-tabs-tokens';\n\n/** @experimental */\nexport interface SiTabNextDeselectionEvent {\n /**\n * The target tab\n */\n target: SiTabNextComponent | SiTabNextLinkComponent;\n /**\n * The index of target tab\n */\n tabIndex: number;\n /**\n * To be called to prevent switching the tab\n */\n cancel: () => void;\n}\n\ninterface RangeConfig {\n start: number;\n end: number;\n step: number;\n}\n\n/** @experimental */\n@Component({\n selector: 'si-tabset-next',\n templateUrl: './si-tabset-next.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n styleUrl: './si-tabset-next.component.scss',\n imports: [\n SiTranslateModule,\n SiMenuDirective,\n SiMenuItemComponent,\n CdkMenuTrigger,\n NgTemplateOutlet,\n SiResizeObserverModule,\n RouterLink\n ],\n providers: [\n {\n provide: SI_TABSET_NEXT,\n useExisting: SiTabsetNextComponent\n }\n ]\n})\nexport class SiTabsetNextComponent implements AfterViewInit {\n /**\n * Event emitter to notify when a tab became inactive.\n */\n readonly deselect = output<SiTabNextDeselectionEvent>();\n\n /** @internal */\n readonly visibleTabIndexes = signal<number[]>([]);\n /** @internal */\n readonly activeTab = computed(() => {\n return this.tabPanels().find(tab => tab.active());\n });\n /** @internal */\n readonly activeTabIndex = computed(() => this.activeTab()?.index() ?? -1);\n\n /** @internal */\n focusKeyManager?: FocusKeyManager<SiTabNextComponent | SiTabNextLinkComponent>;\n\n private readonly tabPanelsLinks = contentChildren(SiTabNextLinkComponent);\n private readonly tabPanelsComponents = contentChildren(SiTabNextComponent);\n\n /** @internal */\n readonly tabPanels = computed(() => {\n const allTabs: (SiTabNextLinkComponent | SiTabNextComponent)[] = [\n ...this.tabPanelsLinks(),\n ...this.tabPanelsComponents()\n ];\n return allTabs;\n });\n /** @internal */\n private readonly tabContainer = viewChild.required<ElementRef<HTMLDivElement>>('tabContainer');\n readonly tabScrollContainer =\n viewChild.required<ElementRef<HTMLDivElement>>('tabScrollContainer');\n\n protected readonly maxWrapperWidth = computed(() => {\n const visibleIndexes = this.visibleTabIndexes();\n return visibleIndexes.length\n ? this.tabButtons()\n .filter((_, index) => visibleIndexes.includes(index))\n .reduce((total, current) => {\n return total + current.nativeElement.clientWidth;\n }, 0)\n : undefined;\n });\n protected readonly menu = viewChild('menu', { read: CdkMenu });\n\n private readonly tabButtons = computed(() => {\n return this.tabPanels().map(tab => tab.tabButton);\n });\n\n private readonly menuButton = viewChild<ElementRef<HTMLButtonElement>>('menuButton');\n private previousWidth = 0;\n private injector = inject(INJECTOR);\n\n ngAfterViewInit(): void {\n this.focusKeyManager = new FocusKeyManager(this.tabPanels, this.injector);\n // To avoid ExpressionChangedAfterItHasBeenCheckedError\n setTimeout(() => {\n this.focusKeyManager?.updateActiveItem(this.tabPanels().findIndex(tab => !tab.disabledTab()));\n });\n }\n\n protected resize(e: ElementDimensions): void {\n if (this.previousWidth && this.previousWidth === e.width) {\n return;\n } else {\n this.previousWidth = e.width;\n }\n this.updateVisibleTabIndexes(this.activeTabIndex(), 'next', true);\n }\n\n protected menuOpened(): void {\n // wait for menu items to be rendered\n setTimeout(() => {\n const nextMenuItemToFocus = this.getNextIndexToFocus(this.activeTabIndex() + 1);\n const menuItems = this.menu()?.items.toArray() ?? [];\n if (nextMenuItemToFocus >= 0 && nextMenuItemToFocus < menuItems.length) {\n menuItems[nextMenuItemToFocus].focus();\n // bug in cdk as setting focus on menu item does not update focus manager active item\n // eslint-disable-next-line @typescript-eslint/dot-notation\n const focusManager = this.menu()?.['keyManager'];\n focusManager?.updateActiveItem(nextMenuItemToFocus);\n } else {\n menuItems[0].focus();\n }\n });\n }\n\n protected tabIsLink(tab: unknown): tab is SiTabNextLinkComponent {\n return tab instanceof SiTabNextLinkComponent;\n }\n\n /** @internal */\n focusPrevious(e: Event): void {\n e.preventDefault();\n const activeItemIndex = this.focusKeyManager?.activeItemIndex;\n if (activeItemIndex! > 0) {\n this.focusKeyManager?.setPreviousItemActive();\n this.updateVisibleTabIndexes(this.focusKeyManager!.activeItemIndex!, 'previous');\n setTimeout(() => {\n this.focusKeyManager?.setActiveItem(this.focusKeyManager!.activeItemIndex!);\n });\n }\n }\n\n /** @internal */\n focusNext(e: Event): void {\n e.preventDefault();\n const activeItemIndex = this.focusKeyManager?.activeItemIndex;\n if (activeItemIndex! < this.tabButtons().length) {\n this.focusKeyManager?.setNextItemActive();\n this.updateVisibleTabIndexes(this.focusKeyManager!.activeItemIndex!, 'next');\n setTimeout(() => {\n this.focusKeyManager?.setActiveItem(this.focusKeyManager!.activeItemIndex!);\n });\n }\n }\n\n /** @internal */\n updateVisibleTabIndexes(\n startIndex: number,\n type: 'next' | 'previous',\n forceUpdate?: boolean\n ): void {\n if (startIndex < this.tabButtons().length) {\n if (!this.visibleTabIndexes().includes(startIndex) || forceUpdate) {\n let availableWidth = this.tabContainer().nativeElement.clientWidth;\n\n if (this.menuButton()) {\n availableWidth = availableWidth - this.menuButton()!.nativeElement.clientWidth;\n }\n\n let consumedWidth = 0;\n const visibleTabIndexes: number[] = [];\n\n const calculateConsumedWidth = (i: number): boolean => {\n consumedWidth += this.tabButtons()[i].nativeElement.clientWidth;\n if (\n visibleTabIndexes.includes(0) &&\n i === this.tabButtons().length - 1 &&\n this.menuButton()\n ) {\n availableWidth = availableWidth + this.menuButton()!.nativeElement.clientWidth;\n }\n if (consumedWidth <= availableWidth) {\n visibleTabIndexes.push(i);\n return false;\n } else {\n consumedWidth -= this.tabButtons()[i].nativeElement.clientWidth;\n return true;\n }\n };\n\n const isNextDirection: boolean = type === 'next';\n\n // First pass: Calculate in primary direction\n const primaryRange = this.getPrimaryRange(\n isNextDirection,\n startIndex,\n this.tabButtons().length\n );\n this.traverseRange(primaryRange, calculateConsumedWidth);\n\n // Second pass: Calculate in opposite direction if space available\n if (consumedWidth < availableWidth) {\n const secondaryRange = this.getSecondaryRange(\n isNextDirection,\n startIndex,\n this.tabButtons().length\n );\n this.traverseRange(secondaryRange, calculateConsumedWidth);\n }\n visibleTabIndexes.sort((a, b) => a - b);\n this.visibleTabIndexes.set(visibleTabIndexes);\n this.scrollFirstVisibleTabIntoView();\n }\n }\n }\n\n /** @internal */\n getNextIndexToFocus(currentIndex: number): number {\n for (let i = 0; i < this.tabPanels().length; i++) {\n // Get the actual index using modulo to wrap around\n const checkIndex = (currentIndex + i) % this.tabPanels().length;\n\n if (!this.tabPanels()[checkIndex].disabledTab()) {\n return this.tabPanels()[checkIndex].index();\n }\n }\n return -1;\n }\n\n private getPrimaryRange(\n isNextDirection: boolean,\n startIndex: number,\n length: number\n ): RangeConfig {\n return isNextDirection\n ? { start: startIndex, end: 0, step: -1 }\n : { start: startIndex, end: length - 1, step: 1 };\n }\n\n private getSecondaryRange(\n isNextDirection: boolean,\n startIndex: number,\n length: number\n ): RangeConfig {\n return isNextDirection\n ? { start: startIndex + 1, end: length - 1, step: 1 }\n : { start: startIndex - 1, end: 0, step: -1 };\n }\n\n private traverseRange(range: RangeConfig, callback: (index: number) => boolean): void {\n const condition = (i: number): boolean => (range.step > 0 ? i <= range.end : i >= range.end);\n\n for (let i = range.start; condition(i); i += range.step) {\n if (callback(i)) {\n break;\n }\n }\n }\n\n private scrollFirstVisibleTabIntoView(): void {\n setTimeout(() => {\n this.tabButtons().at(this.visibleTabIndexes()[0])?.nativeElement.scrollIntoView({\n behavior: 'instant',\n inline: 'start',\n block: 'nearest'\n });\n });\n }\n}\n","<div class=\"tabs-container\">\n <div\n #tabContainer\n class=\"tab-container-buttonbar-list nav nav-tabs\"\n (siResizeObserver)=\"resize($event)\"\n >\n <div\n #tabScrollContainer\n role=\"tablist\"\n tabindex=\"-1\"\n class=\"d-flex tabs-wrapper\"\n [style.max-width.px]=\"maxWrapperWidth()\"\n >\n <ng-content />\n </div>\n\n @if (visibleTabIndexes().length < tabPanels().length) {\n <button\n #menuButton\n type=\"button\"\n class=\"dropdown btn btn-tertiary focus-inside\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n [cdkMenuTriggerFor]=\"tabsMenu\"\n (cdkMenuOpened)=\"menuOpened()\"\n >\n <i class=\"icon element-options m-0\"></i>\n </button>\n }\n </div>\n @let tabContent = this.activeTab()?.tabContent();\n @let activeTab = this.activeTab();\n\n @if (activeTab) {\n <div\n class=\"tab-content\"\n role=\"tabpanel\"\n [id]=\"'content-' + activeTab.tabId\"\n [attr.aria-labelledby]=\"'tab-' + activeTab.tabId\"\n >\n @if (tabContent) {\n <ng-container [ngTemplateOutlet]=\"tabContent\" />\n }\n\n <ng-content select=\"router-outlet\" />\n </div>\n }\n</div>\n\n<ng-template #tabsMenu>\n <si-menu #menu>\n @for (tab of tabPanels(); track tab) {\n @let badgeColor = tab.badgeColor();\n @let badgeIsNumber = tab.badgeIsNumber();\n\n @if (badgeColor && badgeIsNumber) {\n <!-- eslint-disable @angular-eslint/template/no-any -->\n <a\n #menuItem\n si-menu-item\n [disabled]=\"tab.disabledTab()\"\n [badgeColor]=\"badgeColor\"\n [badge]=\"$any(tab.badgeContent())\"\n [icon]=\"tab.icon()\"\n [routerLink]=\"tabIsLink(tab) ? tab.routerLink?.urlTree : undefined\"\n (keydown.enter)=\"tab.selectTab(true)\"\n (triggered)=\"tab.selectTab(true)\"\n >\n <ng-container [ngTemplateOutlet]=\"badgeTemplate\" [ngTemplateOutletContext]=\"{ tab }\" />\n </a>\n } @else if (badgeIsNumber && badgeColor) {\n <a\n #menuItem\n si-menu-item\n [disabled]=\"tab.disabledTab()\"\n [icon]=\"tab.icon()\"\n [badgeColor]=\"badgeColor\"\n [badge]=\"$any(tab.badgeContent())\"\n [routerLink]=\"tabIsLink(tab) ? tab.routerLink?.urlTree : undefined\"\n (keydown.enter)=\"tab.selectTab(true)\"\n (triggered)=\"tab.selectTab(true)\"\n >\n <!-- eslint-enable -->\n <ng-container [ngTemplateOutlet]=\"badgeTemplate\" [ngTemplateOutletContext]=\"{ tab }\" />\n </a>\n } @else {\n <a\n #menuItem\n si-menu-item\n [disabled]=\"tab.disabledTab()\"\n [icon]=\"tab.icon()\"\n [routerLink]=\"tabIsLink(tab) ? tab.routerLink?.urlTree : undefined\"\n (keydown.enter)=\"tab.selectTab(true)\"\n (triggered)=\"tab.selectTab(true)\"\n >\n <ng-container [ngTemplateOutlet]=\"badgeTemplate\" [ngTemplateOutletContext]=\"{ tab }\" />\n </a>\n }\n }\n </si-menu>\n</ng-template>\n\n<ng-template #badgeTemplate let-tab=\"tab\">\n <div class=\"d-flex align-items-center space-between flex-no-wrap justify-content-between\">\n {{ tab.heading() }}\n @if (tab.badgeContent() === true) {\n <span class=\"badge-dot\"></span>\n } @else if (tab.badgeContent() && !tab.badgeColor()) {\n <!-- eslint-disable-next-line @angular-eslint/template/no-any -->\n <span class=\"badge-text\"> {{ $any(tab.badgeContent() ?? '') | translate }}</span>\n }\n </div>\n</ng-template>\n","/**\n * Copyright Siemens 2016 - 2025.\n * SPDX-License-Identifier: MIT\n */\nexport * from './si-tabset-next.component';\nexport * from './si-tab-next.component';\nexport * from './si-tab-next-link.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i2"],"mappings":"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"}