@ui5/webcomponents 1.0.1 → 1.1.2

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 (474) hide show
  1. package/CHANGELOG.md +118 -0
  2. package/dist/Breadcrumbs.js +8 -6
  3. package/dist/BreadcrumbsItem.js +1 -1
  4. package/dist/BusyIndicator.js +2 -3
  5. package/dist/Button.js +28 -1
  6. package/dist/Calendar.js +7 -0
  7. package/dist/Carousel.js +9 -0
  8. package/dist/CheckBox.js +34 -1
  9. package/dist/ColorPalette.js +5 -4
  10. package/dist/ColorPalettePopover.js +27 -2
  11. package/dist/ComboBox.js +91 -23
  12. package/dist/DateComponentBase.js +6 -8
  13. package/dist/DatePicker.js +10 -2
  14. package/dist/DateRangePicker.js +22 -0
  15. package/dist/Dialog.js +5 -22
  16. package/dist/Icon.js +11 -8
  17. package/dist/Input.js +107 -15
  18. package/dist/Link.js +32 -14
  19. package/dist/List.js +14 -4
  20. package/dist/MessageStrip.js +39 -2
  21. package/dist/MultiComboBox.js +7 -3
  22. package/dist/MultiComboBoxItem.js +1 -1
  23. package/dist/MultiInput.js +55 -8
  24. package/dist/Option.js +12 -1
  25. package/dist/Panel.js +9 -0
  26. package/dist/Popover.js +106 -57
  27. package/dist/Popup.js +16 -2
  28. package/dist/RadioButton.js +15 -3
  29. package/dist/RatingIndicator.js +37 -7
  30. package/dist/ResponsivePopover.js +1 -0
  31. package/dist/SegmentedButton.js +14 -1
  32. package/dist/Select.js +2 -1
  33. package/dist/SliderBase.js +4 -0
  34. package/dist/SplitButton.js +425 -0
  35. package/dist/Switch.js +18 -0
  36. package/dist/Tab.js +10 -6
  37. package/dist/TabContainer.js +480 -108
  38. package/dist/TabSeparator.js +42 -3
  39. package/dist/Table.js +15 -5
  40. package/dist/TextArea.js +9 -3
  41. package/dist/ToggleButton.js +5 -0
  42. package/dist/Tokenizer.js +134 -7
  43. package/dist/TreeItem.js +21 -0
  44. package/dist/TreeListItem.js +8 -0
  45. package/dist/api.json +299 -26
  46. package/dist/css/themes/Badge.css +1 -1
  47. package/dist/css/themes/Breadcrumbs.css +1 -1
  48. package/dist/css/themes/BrowserScrollbar.css +1 -1
  49. package/dist/css/themes/BusyIndicator.css +1 -1
  50. package/dist/css/themes/CardHeader.css +1 -1
  51. package/dist/css/themes/CheckBox.css +1 -1
  52. package/dist/css/themes/ComboBox.css +1 -1
  53. package/dist/css/themes/CustomListItem.css +1 -1
  54. package/dist/css/themes/Dialog.css +1 -1
  55. package/dist/css/themes/Input.css +1 -1
  56. package/dist/css/themes/List.css +1 -1
  57. package/dist/css/themes/MultiComboBox.css +1 -1
  58. package/dist/css/themes/Panel.css +1 -1
  59. package/dist/css/themes/Popover.css +1 -1
  60. package/dist/css/themes/PopupsCommon.css +1 -1
  61. package/dist/css/themes/RadioButton.css +1 -1
  62. package/dist/css/themes/RatingIndicator.css +1 -1
  63. package/dist/css/themes/Select.css +1 -1
  64. package/dist/css/themes/SliderBase.css +1 -1
  65. package/dist/css/themes/SplitButton.css +1 -0
  66. package/dist/css/themes/TabContainer.css +1 -1
  67. package/dist/css/themes/TabInOverflow.css +1 -1
  68. package/dist/css/themes/TabInStrip.css +1 -1
  69. package/dist/css/themes/TabSeparatorInOverflow.css +1 -0
  70. package/dist/css/themes/TabSeparatorInStrip.css +1 -0
  71. package/dist/css/themes/Table.css +1 -1
  72. package/dist/css/themes/TableColumn.css +1 -1
  73. package/dist/css/themes/TextArea.css +1 -1
  74. package/dist/css/themes/TimeSelection.css +1 -1
  75. package/dist/css/themes/Token.css +1 -1
  76. package/dist/css/themes/ValueStateMessage.css +1 -1
  77. package/dist/css/themes/sap_belize/parameters-bundle.css +1 -1
  78. package/dist/css/themes/sap_belize_hcb/parameters-bundle.css +1 -1
  79. package/dist/css/themes/sap_belize_hcw/parameters-bundle.css +1 -1
  80. package/dist/css/themes/sap_fiori_3/parameters-bundle.css +1 -1
  81. package/dist/css/themes/sap_fiori_3_dark/parameters-bundle.css +1 -1
  82. package/dist/css/themes/sap_fiori_3_hcb/parameters-bundle.css +1 -1
  83. package/dist/css/themes/sap_fiori_3_hcw/parameters-bundle.css +1 -1
  84. package/dist/css/themes/sap_horizon/parameters-bundle.css +1 -1
  85. package/dist/css/themes/sap_horizon_exp/parameters-bundle.css +1 -1
  86. package/dist/features/InputSuggestions.js +88 -15
  87. package/dist/generated/assets/i18n/messagebundle_ar.json +1 -1
  88. package/dist/generated/assets/i18n/messagebundle_bg.json +1 -1
  89. package/dist/generated/assets/i18n/messagebundle_ca.json +1 -1
  90. package/dist/generated/assets/i18n/messagebundle_cs.json +1 -1
  91. package/dist/generated/assets/i18n/messagebundle_cy.json +1 -1
  92. package/dist/generated/assets/i18n/messagebundle_da.json +1 -1
  93. package/dist/generated/assets/i18n/messagebundle_de.json +1 -1
  94. package/dist/generated/assets/i18n/messagebundle_el.json +1 -1
  95. package/dist/generated/assets/i18n/messagebundle_en.json +1 -1
  96. package/dist/generated/assets/i18n/messagebundle_en_GB.json +1 -1
  97. package/dist/generated/assets/i18n/messagebundle_en_US_sappsd.json +1 -1
  98. package/dist/generated/assets/i18n/messagebundle_en_US_saprigi.json +1 -1
  99. package/dist/generated/assets/i18n/messagebundle_en_US_saptrc.json +1 -1
  100. package/dist/generated/assets/i18n/messagebundle_es.json +1 -1
  101. package/dist/generated/assets/i18n/messagebundle_es_MX.json +1 -1
  102. package/dist/generated/assets/i18n/messagebundle_et.json +1 -1
  103. package/dist/generated/assets/i18n/messagebundle_fi.json +1 -1
  104. package/dist/generated/assets/i18n/messagebundle_fr.json +1 -1
  105. package/dist/generated/assets/i18n/messagebundle_fr_CA.json +1 -1
  106. package/dist/generated/assets/i18n/messagebundle_hi.json +1 -1
  107. package/dist/generated/assets/i18n/messagebundle_hr.json +1 -1
  108. package/dist/generated/assets/i18n/messagebundle_hu.json +1 -1
  109. package/dist/generated/assets/i18n/messagebundle_it.json +1 -1
  110. package/dist/generated/assets/i18n/messagebundle_iw.json +1 -1
  111. package/dist/generated/assets/i18n/messagebundle_ja.json +1 -1
  112. package/dist/generated/assets/i18n/messagebundle_kk.json +1 -1
  113. package/dist/generated/assets/i18n/messagebundle_ko.json +1 -1
  114. package/dist/generated/assets/i18n/messagebundle_lt.json +1 -1
  115. package/dist/generated/assets/i18n/messagebundle_lv.json +1 -1
  116. package/dist/generated/assets/i18n/messagebundle_ms.json +1 -1
  117. package/dist/generated/assets/i18n/messagebundle_nl.json +1 -1
  118. package/dist/generated/assets/i18n/messagebundle_no.json +1 -1
  119. package/dist/generated/assets/i18n/messagebundle_pl.json +1 -1
  120. package/dist/generated/assets/i18n/messagebundle_pt.json +1 -1
  121. package/dist/generated/assets/i18n/messagebundle_pt_PT.json +1 -1
  122. package/dist/generated/assets/i18n/messagebundle_ro.json +1 -1
  123. package/dist/generated/assets/i18n/messagebundle_ru.json +1 -1
  124. package/dist/generated/assets/i18n/messagebundle_sh.json +1 -1
  125. package/dist/generated/assets/i18n/messagebundle_sk.json +1 -1
  126. package/dist/generated/assets/i18n/messagebundle_sl.json +1 -1
  127. package/dist/generated/assets/i18n/messagebundle_sv.json +1 -1
  128. package/dist/generated/assets/i18n/messagebundle_th.json +1 -1
  129. package/dist/generated/assets/i18n/messagebundle_tr.json +1 -1
  130. package/dist/generated/assets/i18n/messagebundle_uk.json +1 -1
  131. package/dist/generated/assets/i18n/messagebundle_vi.json +1 -1
  132. package/dist/generated/assets/i18n/messagebundle_zh_CN.json +1 -1
  133. package/dist/generated/assets/i18n/messagebundle_zh_TW.json +1 -1
  134. package/dist/generated/assets/themes/sap_belize/parameters-bundle.css.json +1 -1
  135. package/dist/generated/assets/themes/sap_belize_hcb/parameters-bundle.css.json +1 -1
  136. package/dist/generated/assets/themes/sap_belize_hcw/parameters-bundle.css.json +1 -1
  137. package/dist/generated/assets/themes/sap_fiori_3/parameters-bundle.css.json +1 -1
  138. package/dist/generated/assets/themes/sap_fiori_3_dark/parameters-bundle.css.json +1 -1
  139. package/dist/generated/assets/themes/sap_fiori_3_hcb/parameters-bundle.css.json +1 -1
  140. package/dist/generated/assets/themes/sap_fiori_3_hcw/parameters-bundle.css.json +1 -1
  141. package/dist/generated/assets/themes/sap_horizon/parameters-bundle.css.json +1 -1
  142. package/dist/generated/assets/themes/sap_horizon_exp/parameters-bundle.css.json +1 -1
  143. package/dist/generated/i18n/i18n-defaults.js +2 -2
  144. package/dist/generated/templates/BreadcrumbsPopoverTemplate.lit.js +1 -1
  145. package/dist/generated/templates/BreadcrumbsTemplate.lit.js +1 -1
  146. package/dist/generated/templates/BusyIndicatorTemplate.lit.js +1 -1
  147. package/dist/generated/templates/ButtonTemplate.lit.js +1 -1
  148. package/dist/generated/templates/CardHeaderTemplate.lit.js +1 -1
  149. package/dist/generated/templates/CarouselTemplate.lit.js +1 -1
  150. package/dist/generated/templates/CheckBoxTemplate.lit.js +1 -1
  151. package/dist/generated/templates/ColorPalettePopoverTemplate.lit.js +1 -1
  152. package/dist/generated/templates/ComboBoxPopoverTemplate.lit.js +1 -1
  153. package/dist/generated/templates/ComboBoxTemplate.lit.js +1 -1
  154. package/dist/generated/templates/CustomListItemTemplate.lit.js +2 -2
  155. package/dist/generated/templates/DialogTemplate.lit.js +1 -1
  156. package/dist/generated/templates/InputPopoverTemplate.lit.js +3 -3
  157. package/dist/generated/templates/InputTemplate.lit.js +1 -1
  158. package/dist/generated/templates/LinkTemplate.lit.js +1 -1
  159. package/dist/generated/templates/ListItemTemplate.lit.js +2 -2
  160. package/dist/generated/templates/MessageStripTemplate.lit.js +1 -1
  161. package/dist/generated/templates/MultiComboBoxPopoverTemplate.lit.js +1 -1
  162. package/dist/generated/templates/MultiInputTemplate.lit.js +1 -1
  163. package/dist/generated/templates/PanelTemplate.lit.js +1 -1
  164. package/dist/generated/templates/PopupBlockLayerTemplate.lit.js +1 -1
  165. package/dist/generated/templates/RangeSliderTemplate.lit.js +1 -1
  166. package/dist/generated/templates/ResponsivePopoverTemplate.lit.js +1 -1
  167. package/dist/generated/templates/SegmentedButtonTemplate.lit.js +1 -1
  168. package/dist/generated/templates/SelectPopoverTemplate.lit.js +2 -2
  169. package/dist/generated/templates/SliderBaseTemplate.lit.js +1 -1
  170. package/dist/generated/templates/SliderTemplate.lit.js +1 -1
  171. package/dist/generated/templates/SplitButtonTemplate.lit.js +7 -0
  172. package/dist/generated/templates/StandardListItemTemplate.lit.js +2 -2
  173. package/dist/generated/templates/SuggestionListItemTemplate.lit.js +2 -2
  174. package/dist/generated/templates/SwitchTemplate.lit.js +1 -1
  175. package/dist/generated/templates/TabContainerPopoverTemplate.lit.js +4 -2
  176. package/dist/generated/templates/TabContainerTemplate.lit.js +9 -10
  177. package/dist/generated/templates/TabInOverflowTemplate.lit.js +1 -1
  178. package/dist/generated/templates/TabInStripTemplate.lit.js +1 -1
  179. package/dist/generated/templates/TabSeparatorInOverflowTemplate.lit.js +7 -0
  180. package/dist/generated/templates/TabSeparatorInStripTemplate.lit.js +7 -0
  181. package/dist/generated/templates/TableTemplate.lit.js +1 -1
  182. package/dist/generated/templates/TextAreaPopoverTemplate.lit.js +1 -1
  183. package/dist/generated/templates/ToggleButtonTemplate.lit.js +1 -1
  184. package/dist/generated/templates/TreeListItemTemplate.lit.js +2 -2
  185. package/dist/generated/templates/TreeTemplate.lit.js +1 -1
  186. package/dist/generated/themes/Badge.css.js +1 -1
  187. package/dist/generated/themes/Breadcrumbs.css.js +1 -1
  188. package/dist/generated/themes/BrowserScrollbar.css.js +1 -1
  189. package/dist/generated/themes/BusyIndicator.css.js +1 -1
  190. package/dist/generated/themes/CardHeader.css.js +1 -1
  191. package/dist/generated/themes/CheckBox.css.js +1 -1
  192. package/dist/generated/themes/ComboBox.css.js +1 -1
  193. package/dist/generated/themes/CustomListItem.css.js +1 -1
  194. package/dist/generated/themes/Dialog.css.js +1 -1
  195. package/dist/generated/themes/Input.css.js +1 -1
  196. package/dist/generated/themes/List.css.js +1 -1
  197. package/dist/generated/themes/MultiComboBox.css.js +1 -1
  198. package/dist/generated/themes/Panel.css.js +1 -1
  199. package/dist/generated/themes/Popover.css.js +1 -1
  200. package/dist/generated/themes/PopupsCommon.css.js +1 -1
  201. package/dist/generated/themes/RadioButton.css.js +1 -1
  202. package/dist/generated/themes/RatingIndicator.css.js +1 -1
  203. package/dist/generated/themes/Select.css.js +1 -1
  204. package/dist/generated/themes/SliderBase.css.js +1 -1
  205. package/dist/generated/themes/SplitButton.css.js +8 -0
  206. package/dist/generated/themes/TabContainer.css.js +1 -1
  207. package/dist/generated/themes/TabInOverflow.css.js +1 -1
  208. package/dist/generated/themes/TabInStrip.css.js +1 -1
  209. package/dist/generated/themes/TabSeparatorInOverflow.css.js +8 -0
  210. package/dist/generated/themes/TabSeparatorInStrip.css.js +8 -0
  211. package/dist/generated/themes/Table.css.js +1 -1
  212. package/dist/generated/themes/TableColumn.css.js +1 -1
  213. package/dist/generated/themes/TextArea.css.js +1 -1
  214. package/dist/generated/themes/TimeSelection.css.js +1 -1
  215. package/dist/generated/themes/Token.css.js +1 -1
  216. package/dist/generated/themes/ValueStateMessage.css.js +1 -1
  217. package/dist/generated/themes/sap_belize/parameters-bundle.css.js +1 -1
  218. package/dist/generated/themes/sap_belize_hcb/parameters-bundle.css.js +1 -1
  219. package/dist/generated/themes/sap_belize_hcw/parameters-bundle.css.js +1 -1
  220. package/dist/generated/themes/sap_fiori_3/parameters-bundle.css.js +1 -1
  221. package/dist/generated/themes/sap_fiori_3_dark/parameters-bundle.css.js +1 -1
  222. package/dist/generated/themes/sap_fiori_3_hcb/parameters-bundle.css.js +1 -1
  223. package/dist/generated/themes/sap_fiori_3_hcw/parameters-bundle.css.js +1 -1
  224. package/dist/generated/themes/sap_horizon/parameters-bundle.css.js +1 -1
  225. package/dist/generated/themes/sap_horizon_exp/parameters-bundle.css.js +1 -1
  226. package/dist/i18n/messagebundle.properties +26 -1
  227. package/dist/i18n/messagebundle_ar.properties +13 -1
  228. package/dist/i18n/messagebundle_bg.properties +13 -1
  229. package/dist/i18n/messagebundle_ca.properties +13 -1
  230. package/dist/i18n/messagebundle_cs.properties +13 -1
  231. package/dist/i18n/messagebundle_cy.properties +13 -1
  232. package/dist/i18n/messagebundle_da.properties +13 -1
  233. package/dist/i18n/messagebundle_de.properties +13 -1
  234. package/dist/i18n/messagebundle_el.properties +13 -1
  235. package/dist/i18n/messagebundle_en.properties +13 -1
  236. package/dist/i18n/messagebundle_en_GB.properties +13 -1
  237. package/dist/i18n/messagebundle_en_US_sappsd.properties +18 -1
  238. package/dist/i18n/messagebundle_en_US_saprigi.properties +18 -1
  239. package/dist/i18n/messagebundle_en_US_saptrc.properties +18 -1
  240. package/dist/i18n/messagebundle_es.properties +13 -1
  241. package/dist/i18n/messagebundle_es_MX.properties +13 -1
  242. package/dist/i18n/messagebundle_et.properties +13 -1
  243. package/dist/i18n/messagebundle_fi.properties +14 -2
  244. package/dist/i18n/messagebundle_fr.properties +13 -1
  245. package/dist/i18n/messagebundle_fr_CA.properties +13 -1
  246. package/dist/i18n/messagebundle_hi.properties +13 -1
  247. package/dist/i18n/messagebundle_hr.properties +13 -1
  248. package/dist/i18n/messagebundle_hu.properties +13 -1
  249. package/dist/i18n/messagebundle_id.properties +13 -1
  250. package/dist/i18n/messagebundle_it.properties +13 -1
  251. package/dist/i18n/messagebundle_iw.properties +13 -1
  252. package/dist/i18n/messagebundle_ja.properties +13 -1
  253. package/dist/i18n/messagebundle_kk.properties +13 -1
  254. package/dist/i18n/messagebundle_ko.properties +13 -1
  255. package/dist/i18n/messagebundle_lt.properties +13 -1
  256. package/dist/i18n/messagebundle_lv.properties +13 -1
  257. package/dist/i18n/messagebundle_ms.properties +13 -1
  258. package/dist/i18n/messagebundle_nl.properties +13 -1
  259. package/dist/i18n/messagebundle_no.properties +13 -1
  260. package/dist/i18n/messagebundle_pl.properties +13 -1
  261. package/dist/i18n/messagebundle_pt.properties +13 -1
  262. package/dist/i18n/messagebundle_pt_PT.properties +13 -1
  263. package/dist/i18n/messagebundle_ro.properties +13 -1
  264. package/dist/i18n/messagebundle_ru.properties +13 -1
  265. package/dist/i18n/messagebundle_sh.properties +13 -1
  266. package/dist/i18n/messagebundle_sk.properties +13 -1
  267. package/dist/i18n/messagebundle_sl.properties +13 -1
  268. package/dist/i18n/messagebundle_sv.properties +13 -1
  269. package/dist/i18n/messagebundle_th.properties +12 -0
  270. package/dist/i18n/messagebundle_tr.properties +13 -1
  271. package/dist/i18n/messagebundle_uk.properties +13 -1
  272. package/dist/i18n/messagebundle_vi.properties +13 -1
  273. package/dist/i18n/messagebundle_zh_CN.properties +13 -1
  274. package/dist/i18n/messagebundle_zh_TW.properties +12 -0
  275. package/dist/types/HasPopup.js +62 -0
  276. package/dist/types/TabsOverflowMode.js +40 -0
  277. package/package.json +9 -9
  278. package/src/Breadcrumbs.hbs +3 -2
  279. package/src/Breadcrumbs.js +8 -6
  280. package/src/BreadcrumbsItem.js +1 -1
  281. package/src/BreadcrumbsPopover.hbs +2 -2
  282. package/src/BusyIndicator.hbs +1 -1
  283. package/src/BusyIndicator.js +2 -3
  284. package/src/Button.hbs +1 -1
  285. package/src/Button.js +28 -1
  286. package/src/Calendar.js +7 -0
  287. package/src/CardHeader.hbs +12 -5
  288. package/src/Carousel.hbs +1 -0
  289. package/src/Carousel.js +9 -0
  290. package/src/CheckBox.hbs +1 -0
  291. package/src/CheckBox.js +34 -1
  292. package/src/ColorPalette.js +5 -4
  293. package/src/ColorPalettePopover.hbs +7 -5
  294. package/src/ColorPalettePopover.js +27 -2
  295. package/src/ComboBox.hbs +1 -0
  296. package/src/ComboBox.js +91 -23
  297. package/src/ComboBoxPopover.hbs +1 -0
  298. package/src/DateComponentBase.js +6 -8
  299. package/src/DatePicker.js +10 -2
  300. package/src/DateRangePicker.js +22 -0
  301. package/src/Dialog.hbs +1 -1
  302. package/src/Dialog.js +5 -22
  303. package/src/Icon.js +11 -8
  304. package/src/Input.hbs +1 -1
  305. package/src/Input.js +107 -15
  306. package/src/InputPopover.hbs +2 -3
  307. package/src/Link.hbs +2 -1
  308. package/src/Link.js +32 -14
  309. package/src/List.js +14 -4
  310. package/src/ListItem.hbs +1 -0
  311. package/src/MessageStrip.hbs +1 -1
  312. package/src/MessageStrip.js +39 -2
  313. package/src/MultiComboBox.js +7 -3
  314. package/src/MultiComboBoxItem.js +1 -1
  315. package/src/MultiComboBoxPopover.hbs +1 -1
  316. package/src/MultiInput.js +55 -8
  317. package/src/Option.js +12 -1
  318. package/src/Panel.hbs +1 -1
  319. package/src/Panel.js +9 -0
  320. package/src/Popover.js +106 -57
  321. package/src/Popup.js +16 -2
  322. package/src/PopupBlockLayer.hbs +1 -1
  323. package/src/RadioButton.js +15 -3
  324. package/src/RatingIndicator.js +37 -7
  325. package/src/ResponsivePopover.hbs +2 -0
  326. package/src/ResponsivePopover.js +1 -0
  327. package/src/SegmentedButton.hbs +1 -0
  328. package/src/SegmentedButton.js +14 -1
  329. package/src/Select.js +2 -1
  330. package/src/SelectPopover.hbs +2 -1
  331. package/src/SliderBase.hbs +1 -1
  332. package/src/SliderBase.js +4 -0
  333. package/src/SplitButton.hbs +53 -0
  334. package/src/SplitButton.js +425 -0
  335. package/src/Switch.hbs +1 -0
  336. package/src/Switch.js +18 -0
  337. package/src/Tab.js +10 -6
  338. package/src/TabContainer.hbs +48 -58
  339. package/src/TabContainer.js +480 -108
  340. package/src/TabContainerPopover.hbs +9 -6
  341. package/src/TabInOverflow.hbs +0 -1
  342. package/src/TabInStrip.hbs +3 -8
  343. package/src/TabSeparator.js +42 -3
  344. package/src/TabSeparatorInOverflow.hbs +8 -0
  345. package/src/TabSeparatorInStrip.hbs +6 -0
  346. package/src/Table.hbs +1 -1
  347. package/src/Table.js +15 -5
  348. package/src/TextArea.js +9 -3
  349. package/src/TextAreaPopover.hbs +1 -1
  350. package/src/ToggleButton.js +5 -0
  351. package/src/Tokenizer.js +134 -7
  352. package/src/Tree.hbs +1 -0
  353. package/src/TreeItem.js +21 -0
  354. package/src/TreeListItem.js +8 -0
  355. package/src/features/InputSuggestions.js +88 -15
  356. package/src/i18n/messagebundle.properties +26 -1
  357. package/src/i18n/messagebundle_ar.properties +13 -1
  358. package/src/i18n/messagebundle_bg.properties +13 -1
  359. package/src/i18n/messagebundle_ca.properties +13 -1
  360. package/src/i18n/messagebundle_cs.properties +13 -1
  361. package/src/i18n/messagebundle_cy.properties +13 -1
  362. package/src/i18n/messagebundle_da.properties +13 -1
  363. package/src/i18n/messagebundle_de.properties +13 -1
  364. package/src/i18n/messagebundle_el.properties +13 -1
  365. package/src/i18n/messagebundle_en.properties +13 -1
  366. package/src/i18n/messagebundle_en_GB.properties +13 -1
  367. package/src/i18n/messagebundle_en_US_sappsd.properties +18 -1
  368. package/src/i18n/messagebundle_en_US_saprigi.properties +18 -1
  369. package/src/i18n/messagebundle_en_US_saptrc.properties +18 -1
  370. package/src/i18n/messagebundle_es.properties +13 -1
  371. package/src/i18n/messagebundle_es_MX.properties +13 -1
  372. package/src/i18n/messagebundle_et.properties +13 -1
  373. package/src/i18n/messagebundle_fi.properties +14 -2
  374. package/src/i18n/messagebundle_fr.properties +13 -1
  375. package/src/i18n/messagebundle_fr_CA.properties +13 -1
  376. package/src/i18n/messagebundle_hi.properties +13 -1
  377. package/src/i18n/messagebundle_hr.properties +13 -1
  378. package/src/i18n/messagebundle_hu.properties +13 -1
  379. package/src/i18n/messagebundle_id.properties +13 -1
  380. package/src/i18n/messagebundle_it.properties +13 -1
  381. package/src/i18n/messagebundle_iw.properties +13 -1
  382. package/src/i18n/messagebundle_ja.properties +13 -1
  383. package/src/i18n/messagebundle_kk.properties +13 -1
  384. package/src/i18n/messagebundle_ko.properties +13 -1
  385. package/src/i18n/messagebundle_lt.properties +13 -1
  386. package/src/i18n/messagebundle_lv.properties +13 -1
  387. package/src/i18n/messagebundle_ms.properties +13 -1
  388. package/src/i18n/messagebundle_nl.properties +13 -1
  389. package/src/i18n/messagebundle_no.properties +13 -1
  390. package/src/i18n/messagebundle_pl.properties +13 -1
  391. package/src/i18n/messagebundle_pt.properties +13 -1
  392. package/src/i18n/messagebundle_pt_PT.properties +13 -1
  393. package/src/i18n/messagebundle_ro.properties +13 -1
  394. package/src/i18n/messagebundle_ru.properties +13 -1
  395. package/src/i18n/messagebundle_sh.properties +13 -1
  396. package/src/i18n/messagebundle_sk.properties +13 -1
  397. package/src/i18n/messagebundle_sl.properties +13 -1
  398. package/src/i18n/messagebundle_sv.properties +13 -1
  399. package/src/i18n/messagebundle_th.properties +12 -0
  400. package/src/i18n/messagebundle_tr.properties +13 -1
  401. package/src/i18n/messagebundle_uk.properties +13 -1
  402. package/src/i18n/messagebundle_vi.properties +13 -1
  403. package/src/i18n/messagebundle_zh_CN.properties +13 -1
  404. package/src/i18n/messagebundle_zh_TW.properties +12 -0
  405. package/src/themes/Badge.css +3 -1
  406. package/src/themes/Breadcrumbs.css +100 -99
  407. package/src/themes/BrowserScrollbar.css +2 -0
  408. package/src/themes/BusyIndicator.css +3 -3
  409. package/src/themes/CardHeader.css +7 -3
  410. package/src/themes/CheckBox.css +15 -7
  411. package/src/themes/CustomListItem.css +2 -1
  412. package/src/themes/Dialog.css +1 -0
  413. package/src/themes/Input.css +14 -0
  414. package/src/themes/List.css +1 -0
  415. package/src/themes/Panel.css +4 -0
  416. package/src/themes/Popover.css +4 -0
  417. package/src/themes/PopupsCommon.css +0 -1
  418. package/src/themes/RadioButton.css +4 -3
  419. package/src/themes/RatingIndicator.css +0 -1
  420. package/src/themes/SliderBase.css +3 -2
  421. package/src/themes/SplitButton.css +98 -0
  422. package/src/themes/TabContainer.css +17 -53
  423. package/src/themes/TabInOverflow.css +25 -21
  424. package/src/themes/TabInStrip.css +124 -100
  425. package/src/themes/TabSeparatorInOverflow.css +8 -0
  426. package/src/themes/TabSeparatorInStrip.css +5 -0
  427. package/src/themes/Table.css +1 -1
  428. package/src/themes/TableColumn.css +0 -1
  429. package/src/themes/TextArea.css +9 -1
  430. package/src/themes/TimeSelection.css +4 -0
  431. package/src/themes/Token.css +2 -1
  432. package/src/themes/Tokenizer.css +1 -1
  433. package/src/themes/ValueStateMessage.css +3 -3
  434. package/src/themes/base/BrowserScrollbar-parameters.css +4 -0
  435. package/src/themes/base/Card-parameters.css +1 -1
  436. package/src/themes/base/Input-parameters.css +5 -0
  437. package/src/themes/base/TabContainer-parameters.css +1 -1
  438. package/src/themes/base/TextArea-parameters.css +1 -0
  439. package/src/themes/base/Title-parameters.css +6 -6
  440. package/src/themes/base/Token-parameters.css +1 -0
  441. package/src/themes/base/sizes-parameters.css +2 -2
  442. package/src/themes/sap_belize/BrowserScrollbar-parameters.css +4 -0
  443. package/src/themes/sap_belize/Table-parameters.css +3 -0
  444. package/src/themes/sap_belize/parameters-bundle.css +1 -0
  445. package/src/themes/sap_belize_hcb/BrowserScrollbar-parameters.css +4 -0
  446. package/src/themes/sap_belize_hcb/Input-parameters.css +1 -0
  447. package/src/themes/sap_belize_hcb/Table-parameters.css +1 -0
  448. package/src/themes/sap_belize_hcb/Token-parameters.css +1 -0
  449. package/src/themes/sap_belize_hcb/parameters-bundle.css +1 -0
  450. package/src/themes/sap_belize_hcw/BrowserScrollbar-parameters.css +4 -0
  451. package/src/themes/sap_belize_hcw/Input-parameters.css +1 -0
  452. package/src/themes/sap_belize_hcw/Table-parameters.css +1 -0
  453. package/src/themes/sap_belize_hcw/Token-parameters.css +1 -0
  454. package/src/themes/sap_belize_hcw/parameters-bundle.css +1 -0
  455. package/src/themes/sap_fiori_3/TabContainer-parameters.css +1 -1
  456. package/src/themes/sap_fiori_3/parameters-bundle.css +1 -0
  457. package/src/themes/sap_fiori_3_dark/parameters-bundle.css +1 -0
  458. package/src/themes/sap_fiori_3_hcb/Input-parameters.css +7 -0
  459. package/src/themes/sap_fiori_3_hcb/TextArea-parameters.css +2 -0
  460. package/src/themes/sap_fiori_3_hcb/Token-parameters.css +2 -1
  461. package/src/themes/sap_fiori_3_hcb/parameters-bundle.css +1 -0
  462. package/src/themes/sap_fiori_3_hcw/Input-parameters.css +7 -0
  463. package/src/themes/sap_fiori_3_hcw/TextArea-parameters.css +2 -0
  464. package/src/themes/sap_fiori_3_hcw/Token-parameters.css +2 -1
  465. package/src/themes/sap_fiori_3_hcw/parameters-bundle.css +1 -0
  466. package/src/themes/sap_horizon/Card-parameters.css +0 -1
  467. package/src/themes/sap_horizon/Table-parameters.css +1 -0
  468. package/src/themes/sap_horizon/parameters-bundle.css +1 -0
  469. package/src/themes/sap_horizon_exp/parameters-bundle.css +1 -0
  470. package/src/types/HasPopup.js +62 -0
  471. package/src/types/TabsOverflowMode.js +40 -0
  472. package/csp.js +0 -7
  473. package/dist/generated/templates/TabSeparatorTemplate.lit.js +0 -7
  474. package/src/TabSeparator.hbs +0 -1
@@ -1,20 +1,28 @@
1
1
  import UI5Element from "@ui5/webcomponents-base/dist/UI5Element.js";
2
2
  import litRender from "@ui5/webcomponents-base/dist/renderer/LitRenderer.js";
3
3
  import ResizeHandler from "@ui5/webcomponents-base/dist/delegate/ResizeHandler.js";
4
- import ScrollEnablement from "@ui5/webcomponents-base/dist/delegate/ScrollEnablement.js";
5
4
  import slideDown from "@ui5/webcomponents-base/dist/animations/slideDown.js";
6
5
  import slideUp from "@ui5/webcomponents-base/dist/animations/slideUp.js";
7
6
  import AnimationMode from "@ui5/webcomponents-base/dist/types/AnimationMode.js";
8
7
  import { getAnimationMode } from "@ui5/webcomponents-base/dist/config/AnimationMode.js";
9
8
  import ItemNavigation from "@ui5/webcomponents-base/dist/delegate/ItemNavigation.js";
10
- import { isSpace, isEnter } from "@ui5/webcomponents-base/dist/Keys.js";
9
+ import {
10
+ isSpace,
11
+ isEnter,
12
+ isDown,
13
+ isRight,
14
+ isLeft,
15
+ } from "@ui5/webcomponents-base/dist/Keys.js";
11
16
  import MediaRange from "@ui5/webcomponents-base/dist/MediaRange.js";
12
17
  import { getI18nBundle } from "@ui5/webcomponents-base/dist/i18nBundle.js";
13
18
  import "@ui5/webcomponents-icons/dist/slim-arrow-up.js";
14
19
  import "@ui5/webcomponents-icons/dist/slim-arrow-down.js";
15
- import "@ui5/webcomponents-icons/dist/slim-arrow-left.js";
16
- import "@ui5/webcomponents-icons/dist/slim-arrow-right.js";
17
- import { TABCONTAINER_PREVIOUS_ICON_ACC_NAME, TABCONTAINER_NEXT_ICON_ACC_NAME, TABCONTAINER_OVERFLOW_MENU_TITLE } from "./generated/i18n/i18n-defaults.js";
20
+ import {
21
+ TABCONTAINER_PREVIOUS_ICON_ACC_NAME,
22
+ TABCONTAINER_NEXT_ICON_ACC_NAME,
23
+ TABCONTAINER_OVERFLOW_MENU_TITLE,
24
+ TABCONTAINER_END_OVERFLOW,
25
+ } from "./generated/i18n/i18n-defaults.js";
18
26
  import Button from "./Button.js";
19
27
  import Icon from "./Icon.js";
20
28
  import List from "./List.js";
@@ -29,8 +37,7 @@ import TabContainerPopoverTemplate from "./generated/templates/TabContainerPopov
29
37
  import tabContainerCss from "./generated/themes/TabContainer.css.js";
30
38
  import ResponsivePopoverCommonCss from "./generated/themes/ResponsivePopoverCommon.css.js";
31
39
  import TabLayout from "./types/TabLayout.js";
32
-
33
- const SCROLL_STEP = 128;
40
+ import TabsOverflowMode from "./types/TabsOverflowMode.js";
34
41
 
35
42
  const tabStyles = [];
36
43
  const staticAreaTabStyles = [];
@@ -42,6 +49,7 @@ const metadata = {
42
49
  tag: "ui5-tabcontainer",
43
50
  languageAware: true,
44
51
  managedSlots: true,
52
+ fastNavigation: true,
45
53
  slots: /** @lends sap.ui.webcomponents.main.TabContainer.prototype */ {
46
54
  /**
47
55
  * Defines the tabs.
@@ -63,7 +71,8 @@ const metadata = {
63
71
  },
64
72
 
65
73
  /**
66
- * Defines the button which will open the overflow menu. If nothing is provided to this slot, the default button will be used.
74
+ * Defines the button which will open the overflow menu. If nothing is provided to this slot,
75
+ * the default button will be used.
67
76
  *
68
77
  * @type {sap.ui.webcomponents.main.IButton}
69
78
  * @public
@@ -73,6 +82,19 @@ const metadata = {
73
82
  overflowButton: {
74
83
  type: HTMLElement,
75
84
  },
85
+
86
+ /**
87
+ * Defines the button which will open the start overflow menu if available. If nothing is provided to this slot,
88
+ * the default button will be used.
89
+ *
90
+ * @type {sap.ui.webcomponents.main.IButton}
91
+ * @public
92
+ * @slot
93
+ * @since 1.1.0
94
+ */
95
+ startOverflowButton: {
96
+ type: HTMLElement,
97
+ },
76
98
  },
77
99
  properties: /** @lends sap.ui.webcomponents.main.TabContainer.prototype */ {
78
100
  /**
@@ -99,7 +121,7 @@ const metadata = {
99
121
  },
100
122
 
101
123
  /**
102
- * Defines the placement of the tab strip (tab buttons area) relative to the actual tabs' content.
124
+ * Defines the placement of the tab strip relative to the actual tabs' content.
103
125
  * <br><br>
104
126
  * <b>Note:</b> By default the tab strip is displayed above the tabs' content area and this is the recommended
105
127
  * layout for most scenarios. Set to <code>Bottom</code> only when the component is at the
@@ -125,12 +147,14 @@ const metadata = {
125
147
  /**
126
148
  * Defines whether the overflow select list is displayed.
127
149
  * <br><br>
128
- * The overflow select list represents a list, where all tab filters are displayed
129
- * so that it's easier for the user to select a specific tab filter.
150
+ * The overflow select list represents a list, where all tabs are displayed
151
+ * so that it's easier for the user to select a specific tab.
130
152
  *
131
153
  * @type {boolean}
132
154
  * @defaultvalue false
133
155
  * @public
156
+ * @deprecated Since the introduction of TabsOverflowMode overflows will always be visible if there is not enough space for all tabs,
157
+ * all hidden tabs are moved to a select list in the respective overflows and are accessible via the overflowButton and / or startOverflowButton
134
158
  */
135
159
  showOverflow: {
136
160
  type: Boolean,
@@ -160,6 +184,32 @@ const metadata = {
160
184
  defaultValue: TabLayout.Standard,
161
185
  },
162
186
 
187
+ /**
188
+ * Defines the overflow mode of the tab strip. If you have a large number of tabs, only the tabs that can fit on screen will be visible.
189
+ * All other tabs that can 't fit on the screen are available in an overflow tab "More".
190
+ *
191
+ * <br><br>
192
+ * <b>Note:</b>
193
+ * Only one overflow at the end would be displayed by default,
194
+ * but when set to <code>StartAndEnd</code>, there will be two overflows on both ends, and tab order will not change on tab selection.
195
+ *
196
+ * <br><br>
197
+ * Available options are:
198
+ * <ul>
199
+ * <li><code>End</code></li>
200
+ * <li><code>StartAndEnd</code></li>
201
+ * </ul>
202
+ *
203
+ * @type {TabsOverflowMode}
204
+ * @defaultvalue "End"
205
+ * @since 1.1.0
206
+ * @public
207
+ */
208
+ tabsOverflowMode: {
209
+ type: TabsOverflowMode,
210
+ defaultValue: TabsOverflowMode.End,
211
+ },
212
+
163
213
  /**
164
214
  * Defines the current media query size.
165
215
  *
@@ -174,29 +224,35 @@ const metadata = {
174
224
  type: Object,
175
225
  },
176
226
 
177
- _scrollable: {
227
+ _animationRunning: {
178
228
  type: Boolean,
179
229
  noAttribute: true,
180
230
  },
181
231
 
182
- _scrollableBack: {
232
+ _contentCollapsed: {
183
233
  type: Boolean,
184
234
  noAttribute: true,
185
235
  },
186
236
 
187
- _scrollableForward: {
188
- type: Boolean,
237
+ _startOverflowText: {
238
+ type: String,
189
239
  noAttribute: true,
190
240
  },
191
241
 
192
- _animationRunning: {
193
- type: Boolean,
242
+ _endOverflowText: {
243
+ type: String,
194
244
  noAttribute: true,
245
+ defaultValue: "More",
195
246
  },
196
247
 
197
- _contentCollapsed: {
198
- type: Boolean,
199
- noAttribute: true,
248
+ _startOverflowItems: {
249
+ type: Object,
250
+ multiple: true,
251
+ },
252
+
253
+ _endOverflowItems: {
254
+ type: Object,
255
+ multiple: true,
200
256
  },
201
257
  },
202
258
  events: /** @lends sap.ui.webcomponents.main.TabContainer.prototype */ {
@@ -235,6 +291,14 @@ const metadata = {
235
291
  * <li><code>ui5-tab-separator</code> - used to separate tabs with a vertical line</li>
236
292
  * </ul>
237
293
  *
294
+ * <h3>Keyboard Handling</h3>
295
+ *
296
+ * <h4>Fast Navigation</h4>
297
+ * This component provides a build in fast navigation group which can be used via <code>F6 / Shift + F6</code> or <code> Ctrl + Alt(Option) + Down / Ctrl + Alt(Option) + Up</code>.
298
+ * In order to use this functionality, you need to import the following module:
299
+ * <code>import "@ui5/webcomponents-base/dist/features/F6Navigation.js"</code>
300
+ * <br><br>
301
+ *
238
302
  * <h3>ES6 Module Import</h3>
239
303
  *
240
304
  * <code>import "@ui5/webcomponents/dist/TabContainer";</code>
@@ -289,17 +353,25 @@ class TabContainer extends UI5Element {
289
353
 
290
354
  this._handleResize = this._handleResize.bind(this);
291
355
 
292
- // Init ScrollEnablement
293
- this._scrollEnablement = new ScrollEnablement(this);
294
- this._scrollEnablement.attachEvent("scroll", this._updateScrolling.bind(this));
295
-
296
356
  // Init ItemNavigation
297
357
  this._itemNavigation = new ItemNavigation(this, {
298
- getItemsCallback: () => this._getTabs(),
358
+ getItemsCallback: () => this._getFocusableTabs(),
299
359
  });
300
360
  }
301
361
 
302
362
  onBeforeRendering() {
363
+ // update selected tab
364
+ const tabs = this._getTabs();
365
+ if (tabs.length) {
366
+ const selectedTabs = tabs.filter(tab => tab.selected);
367
+ if (selectedTabs.length) {
368
+ this._selectedTab = selectedTabs[0];
369
+ } else {
370
+ this._selectedTab = tabs[0];
371
+ this._selectedTab._selected = true;
372
+ }
373
+ }
374
+
303
375
  // Set external properties to items
304
376
  this.items.filter(item => !item.isSeparator).forEach((item, index, arr) => {
305
377
  item._isInline = this.tabLayout === TabLayout.Inline;
@@ -316,12 +388,13 @@ class TabContainer extends UI5Element {
316
388
  if (!this._animationRunning) {
317
389
  this._contentCollapsed = this.collapsed;
318
390
  }
391
+
392
+ if (this.showOverflow) {
393
+ console.warn(`The "show-overflow" property is deprecated and will be removed in a future release.`); // eslint-disable-line
394
+ }
319
395
  }
320
396
 
321
397
  onAfterRendering() {
322
- this._scrollEnablement.scrollContainer = this._getHeaderScrollContainer();
323
- this._updateScrolling();
324
-
325
398
  this.items.forEach(item => {
326
399
  item._getTabInStripDomRef = this.getDomRef().querySelector(`*[data-ui5-stable="${item.stableDomRef}"]`);
327
400
  });
@@ -335,27 +408,7 @@ class TabContainer extends UI5Element {
335
408
  ResizeHandler.deregister(this._getHeader(), this._handleResize);
336
409
  }
337
410
 
338
- _onTablistFocusin(event) {
339
- const target = event.target;
340
-
341
- if (!this._scrollable || !target.classList.contains("ui5-tab-strip-item")) {
342
- return;
343
- }
344
-
345
- const headerScrollContainer = this._getHeaderScrollContainer();
346
- const leftArrowWidth = this.shadowRoot.querySelector(".ui5-tc__headerArrowLeft").offsetWidth;
347
- const rightArrowWidth = this.shadowRoot.querySelector(".ui5-tc__headerArrowRight").offsetWidth;
348
-
349
- if (this._scrollableBack && (target.offsetLeft - leftArrowWidth < headerScrollContainer.scrollLeft)) {
350
- this._scrollEnablement.move(target.offsetLeft - leftArrowWidth - headerScrollContainer.scrollLeft, 0, true);
351
- this._updateScrolling();
352
- } else if (this._scrollableForward && (target.offsetLeft + target.offsetWidth > headerScrollContainer.scrollLeft + headerScrollContainer.offsetWidth - rightArrowWidth)) {
353
- this._scrollEnablement.move(target.offsetLeft + target.offsetWidth - headerScrollContainer.scrollLeft - headerScrollContainer.offsetWidth + rightArrowWidth, 0, true);
354
- this._updateScrolling();
355
- }
356
- }
357
-
358
- _onHeaderClick(event) {
411
+ _onTabStripClick(event) {
359
412
  const tab = getTab(event.target);
360
413
  if (!tab) {
361
414
  return;
@@ -364,7 +417,7 @@ class TabContainer extends UI5Element {
364
417
  this._onHeaderItemSelect(tab);
365
418
  }
366
419
 
367
- _onHeaderKeyDown(event) {
420
+ _onTabStripKeyDown(event) {
368
421
  const tab = getTab(event.target);
369
422
  if (!tab) {
370
423
  return;
@@ -380,7 +433,7 @@ class TabContainer extends UI5Element {
380
433
  }
381
434
  }
382
435
 
383
- _onHeaderKeyUp(event) {
436
+ _onTabStripKeyUp(event) {
384
437
  const tab = getTab(event.target);
385
438
  if (!tab) {
386
439
  return;
@@ -394,13 +447,21 @@ class TabContainer extends UI5Element {
394
447
  _onHeaderItemSelect(tab) {
395
448
  if (!tab.hasAttribute("disabled")) {
396
449
  this._onItemSelect(tab);
450
+
451
+ if (!this.isModeStartAndEnd) {
452
+ this._setItemsForStrip();
453
+ }
397
454
  }
398
455
  }
399
456
 
400
- _onOverflowListItemSelect(event) {
401
- this._onItemSelect(event.detail.item);
457
+ _onOverflowListItemClick(event) {
458
+ event.preventDefault(); // cancel the item selection
459
+ const { item } = event.detail;
460
+
461
+ this._onItemSelect(item);
402
462
  this.responsivePopover.close();
403
- this.shadowRoot.querySelector(`#${event.detail.item.id}`).focus();
463
+ this._setItemsForStrip();
464
+ this.shadowRoot.querySelector(`#${item.id}`).focus();
404
465
  }
405
466
 
406
467
  _onItemSelect(target) {
@@ -409,16 +470,15 @@ class TabContainer extends UI5Element {
409
470
  const selectedTab = this.items[selectedIndex];
410
471
 
411
472
  // update selected items
412
- this.items.forEach((item, index) => {
413
- if (!item.isSeparator) {
473
+ this.items
474
+ .forEach((item, index) => {
414
475
  const selected = selectedIndex === index;
415
476
  item.selected = selected;
416
477
 
417
- if (selected) {
418
- this._itemNavigation.setCurrentItem(item);
478
+ if (item._selected) {
479
+ item._selected = false;
419
480
  }
420
- }
421
- }, this);
481
+ });
422
482
 
423
483
  if (this.fixed) {
424
484
  this.selectTab(selectedTab, selectedTabIndex);
@@ -481,34 +541,343 @@ class TabContainer extends UI5Element {
481
541
  return slideUp({ element }).promise();
482
542
  }
483
543
 
484
- async _onOverflowButtonClick(event) {
485
- const button = this.overflowButton[0] || this.getDomRef().querySelector(".ui-tc__overflowButton > [ui5-button]");
486
-
487
- if (event.target !== button) {
544
+ async _onOverflowClick(event) {
545
+ if (event.target.classList.contains("ui5-tc__overflow")) {
546
+ // the empty area in the overflow was clicked
488
547
  return;
489
548
  }
490
549
 
550
+ const overflow = event.currentTarget;
551
+ const isEndOverflow = overflow.classList.contains("ui5-tc__overflow--end");
552
+ const isStartOverflow = overflow.classList.contains("ui5-tc__overflow--start");
553
+ const items = [];
554
+
555
+ const overflowAttr = isEndOverflow ? "end-overflow" : "start-overflow";
556
+
557
+ this._startOverflowItems = [];
558
+ this._endOverflowItems = [];
559
+
560
+ this.items.forEach(item => {
561
+ if (item.getTabInStripDomRef() && item.getTabInStripDomRef().hasAttribute(overflowAttr)) {
562
+ items.push(item);
563
+ }
564
+ });
565
+
566
+ let button;
567
+ if (isEndOverflow) {
568
+ button = this.overflowButton[0] || overflow.querySelector("[ui5-button]");
569
+ this._endOverflowItems = items;
570
+ }
571
+
572
+ if (isStartOverflow) {
573
+ button = this.startOverflowButton[0] || overflow.querySelector("[ui5-button]");
574
+ this._startOverflowItems = items;
575
+ }
576
+
491
577
  this.responsivePopover = await this._respPopover();
492
578
  if (this.responsivePopover.opened) {
493
579
  this.responsivePopover.close();
494
580
  } else {
581
+ this.responsivePopover.initialFocus = this.responsivePopover.content[0].items.filter(item => item.classList.contains("ui5-tab-overflow-item"))[0].id;
495
582
  this.responsivePopover.showAt(button);
496
583
  }
497
584
  }
498
585
 
499
- _onHeaderBackArrowClick() {
500
- this._scrollEnablement.move(-SCROLL_STEP, 0).promise()
501
- .then(_ => this._updateScrolling());
502
- }
586
+ async _onOverflowKeyDown(event) {
587
+ const isEndOverflow = event.currentTarget.classList.contains("ui5-tc__overflow--end");
588
+ const isStartOverflow = event.currentTarget.classList.contains("ui5-tc__overflow--start");
503
589
 
504
- _onHeaderForwardArrowClick() {
505
- this._scrollEnablement.move(SCROLL_STEP, 0).promise()
506
- .then(_ => this._updateScrolling());
590
+ switch (true) {
591
+ case isDown(event):
592
+ case isStartOverflow && isLeft(event):
593
+ case isEndOverflow && isRight(event):
594
+ await this._onOverflowClick(event);
595
+ }
507
596
  }
508
597
 
509
598
  _handleResize() {
510
- this._updateScrolling();
599
+ if (this.responsivePopover && this.responsivePopover.opened) {
600
+ this.responsivePopover.close();
601
+ }
511
602
  this._updateMediaRange();
603
+ this._setItemsForStrip();
604
+ }
605
+
606
+ _setItemsForStrip() {
607
+ const tabStrip = this._getTabStrip();
608
+ let allItemsWidth = 0;
609
+
610
+ if (!this._selectedTab) {
611
+ return;
612
+ }
613
+
614
+ const itemsDomRefs = this.items.map(item => item.getTabInStripDomRef());
615
+
616
+ // make sure the overflows are hidden
617
+ this._getStartOverflow().setAttribute("hidden", "");
618
+ this._getEndOverflow().setAttribute("hidden", "");
619
+
620
+ // show all tabs
621
+ for (let i = 0; i < itemsDomRefs.length; i++) {
622
+ itemsDomRefs[i].removeAttribute("hidden");
623
+ itemsDomRefs[i].removeAttribute("start-overflow");
624
+ itemsDomRefs[i].removeAttribute("end-overflow");
625
+ }
626
+
627
+ itemsDomRefs.forEach(item => {
628
+ allItemsWidth += this._getItemWidth(item);
629
+ });
630
+
631
+ const hasOverflow = tabStrip.offsetWidth < allItemsWidth;
632
+
633
+ if (!hasOverflow) {
634
+ this._closeRespPopover();
635
+ return;
636
+ }
637
+
638
+ if (this.isModeStartAndEnd) {
639
+ this._updateStartAndEndOverflow(itemsDomRefs);
640
+ this._updateOverflowCounters();
641
+ } else {
642
+ this._updateEndOverflow(itemsDomRefs);
643
+ }
644
+
645
+ this._itemNavigation._init();
646
+ this._itemNavigation.setCurrentItem(this._selectedTab);
647
+ }
648
+
649
+ _updateEndOverflow(itemsDomRefs) {
650
+ // show end overflow
651
+ this._getEndOverflow().removeAttribute("hidden");
652
+
653
+ const selectedTabDomRef = this._selectedTab.getTabInStripDomRef();
654
+ const containerWidth = this._getTabStrip().offsetWidth;
655
+
656
+ const selectedItemIndexAndWidth = this._getSelectedItemIndexAndWidth(itemsDomRefs, selectedTabDomRef);
657
+ const lastVisibleTabIndex = this._findLastVisibleItem(itemsDomRefs, containerWidth, selectedItemIndexAndWidth.width);
658
+
659
+ for (let i = lastVisibleTabIndex + 1; i < itemsDomRefs.length; i++) {
660
+ itemsDomRefs[i].setAttribute("hidden", "");
661
+ itemsDomRefs[i].setAttribute("end-overflow", "");
662
+ }
663
+
664
+ this._endOverflowText = this.overflowButtonText;
665
+ }
666
+
667
+ _updateStartAndEndOverflow(itemsDomRefs) {
668
+ let containerWidth = this._getTabStrip().offsetWidth;
669
+ const selectedTabDomRef = this._selectedTab.getTabInStripDomRef();
670
+ const selectedItemIndexAndWidth = this._getSelectedItemIndexAndWidth(itemsDomRefs, selectedTabDomRef);
671
+ const hasStartOverflow = this._hasStartOverflow(containerWidth, itemsDomRefs, selectedItemIndexAndWidth);
672
+ const hasEndOverflow = this._hasEndOverflow(containerWidth, itemsDomRefs, selectedItemIndexAndWidth);
673
+ let firstVisible;
674
+ let lastVisible;
675
+
676
+ // has "end", but no "start" overflow
677
+ if (!hasStartOverflow) {
678
+ // show "end" overflow
679
+ this._getEndOverflow().removeAttribute("hidden");
680
+ // width is changed
681
+ containerWidth = this._getTabStrip().offsetWidth;
682
+
683
+ lastVisible = this._findLastVisibleItem(itemsDomRefs, containerWidth, selectedItemIndexAndWidth.width);
684
+
685
+ for (let i = lastVisible + 1; i < itemsDomRefs.length; i++) {
686
+ itemsDomRefs[i].setAttribute("hidden", "");
687
+ itemsDomRefs[i].setAttribute("end-overflow", "");
688
+ }
689
+
690
+ return;
691
+ }
692
+
693
+ // has "start", but no "end" overflow
694
+ if (!hasEndOverflow) {
695
+ // show "start" overflow
696
+ this._getStartOverflow().removeAttribute("hidden");
697
+ // width is changed
698
+ containerWidth = this._getTabStrip().offsetWidth;
699
+
700
+ firstVisible = this._findFirstVisibleItem(itemsDomRefs, containerWidth, selectedItemIndexAndWidth.width);
701
+
702
+ for (let i = firstVisible - 1; i >= 0; i--) {
703
+ itemsDomRefs[i].setAttribute("hidden", "");
704
+ itemsDomRefs[i].setAttribute("start-overflow", "");
705
+ }
706
+
707
+ return;
708
+ }
709
+
710
+ // show "start" overflow
711
+ this._getStartOverflow().removeAttribute("hidden");
712
+ // show "end" overflow
713
+ this._getEndOverflow().removeAttribute("hidden");
714
+ // width is changed
715
+ containerWidth = this._getTabStrip().offsetWidth;
716
+
717
+ firstVisible = this._findFirstVisibleItem(itemsDomRefs, containerWidth, selectedItemIndexAndWidth.width, selectedItemIndexAndWidth.index - 1);
718
+ lastVisible = this._findLastVisibleItem(itemsDomRefs, containerWidth, selectedItemIndexAndWidth.width, firstVisible);
719
+
720
+ for (let i = firstVisible - 1; i >= 0; i--) {
721
+ itemsDomRefs[i].setAttribute("hidden", "");
722
+ itemsDomRefs[i].setAttribute("start-overflow", "");
723
+ }
724
+
725
+ for (let i = lastVisible + 1; i < itemsDomRefs.length; i++) {
726
+ itemsDomRefs[i].setAttribute("hidden", "");
727
+ itemsDomRefs[i].setAttribute("end-overflow", "");
728
+ }
729
+ }
730
+
731
+ _hasStartOverflow(containerWidth, itemsDomRefs, selectedItemIndexAndWidth) {
732
+ if (selectedItemIndexAndWidth.index === 0) {
733
+ return false;
734
+ }
735
+
736
+ let leftItemsWidth = 0;
737
+
738
+ for (let i = selectedItemIndexAndWidth.index - 1; i >= 0; i--) {
739
+ leftItemsWidth += this._getItemWidth(itemsDomRefs[i]);
740
+ }
741
+
742
+ let hasStartOverflow = containerWidth < leftItemsWidth + selectedItemIndexAndWidth.width;
743
+
744
+ // if there is no "start" overflow, it has "end" overflow
745
+ // check it again with the "end" overflow
746
+ if (!hasStartOverflow) {
747
+ this._getEndOverflow().removeAttribute("hidden");
748
+ containerWidth = this._getTabStrip().offsetWidth;
749
+ hasStartOverflow = containerWidth < leftItemsWidth + selectedItemIndexAndWidth.width;
750
+ this._getEndOverflow().setAttribute("hidden", "");
751
+ }
752
+
753
+ return hasStartOverflow;
754
+ }
755
+
756
+ _hasEndOverflow(containerWidth, itemsDomRefs, selectedItemIndexAndWidth) {
757
+ if (selectedItemIndexAndWidth.index >= itemsDomRefs.length) {
758
+ return false;
759
+ }
760
+
761
+ let rightItemsWidth = 0;
762
+
763
+ for (let i = selectedItemIndexAndWidth.index; i < itemsDomRefs.length; i++) {
764
+ rightItemsWidth += this._getItemWidth(itemsDomRefs[i]);
765
+ }
766
+
767
+ let hasEndOverflow = containerWidth < rightItemsWidth + selectedItemIndexAndWidth.width;
768
+
769
+ // if there is no "end" overflow, it has "start" overflow
770
+ // check it again with the "start" overflow
771
+ if (!hasEndOverflow) {
772
+ this._getStartOverflow().removeAttribute("hidden");
773
+ containerWidth = this._getTabStrip().offsetWidth;
774
+ hasEndOverflow = containerWidth < rightItemsWidth + selectedItemIndexAndWidth.width;
775
+ this._getStartOverflow().setAttribute("hidden", "");
776
+ }
777
+
778
+ return hasEndOverflow;
779
+ }
780
+
781
+ _getItemWidth(itemDomRef) {
782
+ const styles = window.getComputedStyle(itemDomRef);
783
+ const margins = Number.parseInt(styles.marginLeft) + Number.parseInt(styles.marginRight);
784
+
785
+ return itemDomRef.offsetWidth + margins;
786
+ }
787
+
788
+ _getSelectedItemIndexAndWidth(itemsDomRefs, selectedTabDomRef) {
789
+ let index = itemsDomRefs.indexOf(selectedTabDomRef);
790
+ let width = selectedTabDomRef.offsetWidth;
791
+ let selectedSeparator;
792
+
793
+ if (itemsDomRefs[index - 1] && itemsDomRefs[index - 1].isSeparator) {
794
+ selectedSeparator = itemsDomRefs[index - 1];
795
+ width += this._getItemWidth(selectedSeparator);
796
+ }
797
+
798
+ itemsDomRefs.splice(index, 1);
799
+
800
+ // if previous item is a separator - remove it
801
+ if (selectedSeparator) {
802
+ itemsDomRefs.splice(index - 1, 1);
803
+ index--;
804
+ }
805
+
806
+ return {
807
+ index,
808
+ width,
809
+ };
810
+ }
811
+
812
+ _findFirstVisibleItem(itemsDomRefs, containerWidth, selectedItemWidth, startIndex) {
813
+ if (startIndex === undefined) {
814
+ startIndex = itemsDomRefs.length - 1;
815
+ }
816
+
817
+ let lastVisible = startIndex + 1;
818
+
819
+ for (let index = startIndex; index >= 0; index--) {
820
+ const itemWidth = this._getItemWidth(itemsDomRefs[index]);
821
+
822
+ if (containerWidth < selectedItemWidth + itemWidth) {
823
+ break;
824
+ }
825
+
826
+ selectedItemWidth += itemWidth;
827
+ lastVisible = index;
828
+ }
829
+
830
+ return lastVisible;
831
+ }
832
+
833
+ _findLastVisibleItem(itemsDomRefs, containerWidth, selectedItemWidth, startIndex) {
834
+ startIndex = startIndex || 0;
835
+
836
+ let lastVisibleIndex = startIndex - 1;
837
+ let index = startIndex;
838
+
839
+ for (; index < itemsDomRefs.length; index++) {
840
+ const itemWidth = this._getItemWidth(itemsDomRefs[index]);
841
+
842
+ if (containerWidth < selectedItemWidth + itemWidth) {
843
+ break;
844
+ }
845
+
846
+ selectedItemWidth += itemWidth;
847
+ lastVisibleIndex = index;
848
+ }
849
+
850
+ // if prev item is separator - hide it
851
+ const prevItem = itemsDomRefs[index - 1];
852
+ if (prevItem && prevItem.isSeparator) {
853
+ lastVisibleIndex -= 1;
854
+ }
855
+
856
+ return lastVisibleIndex;
857
+ }
858
+
859
+ get isModeStartAndEnd() {
860
+ return this.tabsOverflowMode === TabsOverflowMode.StartAndEnd;
861
+ }
862
+
863
+ _updateOverflowCounters() {
864
+ let startOverflowItemsCount = 0;
865
+ let endOverflowItemsCount = 0;
866
+
867
+ this._getTabs()
868
+ .map(tab => tab.getTabInStripDomRef())
869
+ .forEach(tab => {
870
+ if (tab.hasAttribute("start-overflow")) {
871
+ startOverflowItemsCount++;
872
+ }
873
+
874
+ if (tab.hasAttribute("end-overflow")) {
875
+ endOverflowItemsCount++;
876
+ }
877
+ });
878
+
879
+ this._startOverflowText = `+${startOverflowItemsCount}`;
880
+ this._endOverflowText = `+${endOverflowItemsCount}`;
512
881
  }
513
882
 
514
883
  async _closeRespPopover() {
@@ -516,16 +885,28 @@ class TabContainer extends UI5Element {
516
885
  this.responsivePopover.close();
517
886
  }
518
887
 
519
- _updateScrolling() {
520
- const headerScrollContainer = this._getHeaderScrollContainer();
888
+ _getFocusableTabs() {
889
+ if (!this.getDomRef()) {
890
+ return [];
891
+ }
521
892
 
522
- this._scrollable = headerScrollContainer.offsetWidth < headerScrollContainer.scrollWidth;
523
- this._scrollableBack = headerScrollContainer.scrollLeft > 0;
524
- this._scrollableForward = Math.ceil(headerScrollContainer.scrollLeft) < headerScrollContainer.scrollWidth - headerScrollContainer.offsetWidth;
893
+ const focusableTabs = [];
525
894
 
526
- if (!this._scrollable) {
527
- this._closeRespPopover();
895
+ if (!this._getStartOverflow().hasAttribute("hidden")) {
896
+ focusableTabs.push(this._getStartOverflow().querySelector("[ui5-button]"));
528
897
  }
898
+
899
+ this._getTabs().forEach(tab => {
900
+ if (tab.getTabInStripDomRef() && !tab.getTabInStripDomRef().hasAttribute("hidden")) {
901
+ focusableTabs.push(tab);
902
+ }
903
+ });
904
+
905
+ if (!this._getEndOverflow().hasAttribute("hidden")) {
906
+ focusableTabs.push(this._getEndOverflow().querySelector("[ui5-button]"));
907
+ }
908
+
909
+ return focusableTabs;
529
910
  }
530
911
 
531
912
  _updateMediaRange() {
@@ -540,8 +921,16 @@ class TabContainer extends UI5Element {
540
921
  return this.items.filter(item => !item.isSeparator);
541
922
  }
542
923
 
543
- _getHeaderScrollContainer() {
544
- return this.shadowRoot.querySelector(`#${this._id}-headerScrollContainer`);
924
+ _getTabStrip() {
925
+ return this.shadowRoot.querySelector(`#${this._id}-tabStrip`);
926
+ }
927
+
928
+ _getStartOverflow() {
929
+ return this.shadowRoot.querySelector(".ui5-tc__overflow--start");
930
+ }
931
+
932
+ _getEndOverflow() {
933
+ return this.shadowRoot.querySelector(".ui5-tc__overflow--end");
545
934
  }
546
935
 
547
936
  async _respPopover() {
@@ -549,44 +938,23 @@ class TabContainer extends UI5Element {
549
938
  return staticAreaItem.querySelector(`#${this._id}-overflowMenu`);
550
939
  }
551
940
 
552
- get shouldShowOverflow() {
553
- return this.showOverflow && this._scrollable;
554
- }
555
-
556
941
  get classes() {
557
942
  return {
558
943
  root: {
559
944
  "ui5-tc-root": true,
560
945
  "ui5-tc--textOnly": this.textOnly,
561
- "ui5-tc--withAdditonalText": this.withAdditonalText,
946
+ "ui5-tc--withAdditionalText": this.withAdditionalText,
562
947
  "ui5-tc--standardTabLayout": this.standardTabLayout,
563
948
  },
564
949
  header: {
565
950
  "ui5-tc__header": true,
566
- "ui5-tc__header--scrollable": this._scrollable,
567
951
  },
568
- headerInnerContainer: {
569
- "ui5-tc__headerInnerContainer": true,
570
- },
571
- headerScrollContainer: {
572
- "ui-tc__headerScrollContainer": true,
573
- },
574
- headerList: {
575
- "ui5-tc__headerList": true,
952
+ tabStrip: {
953
+ "ui5-tc__tabStrip": true,
576
954
  },
577
955
  separator: {
578
956
  "ui5-tc__separator": true,
579
957
  },
580
- headerBackArrow: {
581
- "ui5-tc__headerArrow": true,
582
- "ui5-tc__headerArrowLeft": true,
583
- "ui5-tc__headerArrow--visible": this._scrollableBack,
584
- },
585
- headerForwardArrow: {
586
- "ui5-tc__headerArrow": true,
587
- "ui5-tc__headerArrowRight": true,
588
- "ui5-tc__headerArrow--visible": this._scrollableForward,
589
- },
590
958
  content: {
591
959
  "ui5-tc__content": true,
592
960
  "ui5-tc__content--collapsed": this._contentCollapsed,
@@ -602,7 +970,7 @@ class TabContainer extends UI5Element {
602
970
  return this.items.every(item => !item.icon);
603
971
  }
604
972
 
605
- get withAdditonalText() {
973
+ get withAdditionalText() {
606
974
  return this.items.some(item => !!item.additionalText);
607
975
  }
608
976
 
@@ -630,6 +998,10 @@ class TabContainer extends UI5Element {
630
998
  return this.tabsAtTheBottom ? "slim-arrow-up" : "slim-arrow-down";
631
999
  }
632
1000
 
1001
+ get overflowButtonText() {
1002
+ return TabContainer.i18nBundle.getText(TABCONTAINER_END_OVERFLOW);
1003
+ }
1004
+
633
1005
  get animate() {
634
1006
  return getAnimationMode() !== AnimationMode.None;
635
1007
  }
@@ -648,11 +1020,11 @@ class TabContainer extends UI5Element {
648
1020
  }
649
1021
  }
650
1022
 
651
- const isTabLi = el => el.localName === "li" && el.getAttribute("role") === "tab";
1023
+ const isTabDiv = el => el.localName === "div" && el.getAttribute("role") === "tab";
652
1024
 
653
1025
  const getTab = el => {
654
1026
  while (el) {
655
- if (isTabLi(el)) {
1027
+ if (isTabDiv(el)) {
656
1028
  return el;
657
1029
  }
658
1030