@ui5/webcomponents-base 0.0.0-4821618b2 → 0.0.0-4a28ecb24

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 (700) hide show
  1. package/.eslintignore +5 -2
  2. package/CHANGELOG.md +392 -0
  3. package/README.md +53 -7
  4. package/bundle.esm.js +18 -12
  5. package/dist/AssetRegistry.d.ts +5 -0
  6. package/dist/AssetRegistry.js +2 -7
  7. package/dist/AssetRegistry.js.map +1 -0
  8. package/dist/Boot.d.ts +8 -0
  9. package/dist/Boot.js +31 -30
  10. package/dist/Boot.js.map +1 -0
  11. package/dist/CSP.d.ts +30 -0
  12. package/dist/CSP.js +51 -0
  13. package/dist/CSP.js.map +1 -0
  14. package/dist/CustomElementsRegistry.d.ts +5 -0
  15. package/dist/CustomElementsRegistry.js +69 -30
  16. package/dist/CustomElementsRegistry.js.map +1 -0
  17. package/dist/CustomElementsScope.d.ts +7 -0
  18. package/dist/CustomElementsScope.js +11 -108
  19. package/dist/CustomElementsScope.js.map +1 -0
  20. package/dist/CustomElementsScopeUtils.d.ts +55 -0
  21. package/dist/CustomElementsScopeUtils.js +90 -0
  22. package/dist/CustomElementsScopeUtils.js.map +1 -0
  23. package/dist/DOMObserver.d.ts +11 -0
  24. package/dist/DOMObserver.js +12 -54
  25. package/dist/DOMObserver.js.map +1 -0
  26. package/dist/Device.d.ts +12 -0
  27. package/dist/Device.js +63 -72
  28. package/dist/Device.js.map +1 -0
  29. package/dist/EventProvider.d.ts +25 -0
  30. package/dist/EventProvider.js +67 -88
  31. package/dist/EventProvider.js.map +1 -0
  32. package/dist/FeaturesRegistry.d.ts +3 -0
  33. package/dist/FeaturesRegistry.js +5 -7
  34. package/dist/FeaturesRegistry.js.map +1 -0
  35. package/dist/FontFace.d.ts +2 -0
  36. package/dist/FontFace.js +17 -110
  37. package/dist/FontFace.js.map +1 -0
  38. package/dist/InitialConfiguration.d.ts +22 -0
  39. package/dist/InitialConfiguration.js +112 -127
  40. package/dist/InitialConfiguration.js.map +1 -0
  41. package/dist/Keys.d.ts +57 -0
  42. package/dist/Keys.js +174 -235
  43. package/dist/Keys.js.map +1 -0
  44. package/dist/ManagedStyles.d.ts +8 -0
  45. package/dist/ManagedStyles.js +77 -0
  46. package/dist/ManagedStyles.js.map +1 -0
  47. package/dist/MarkedEvents.d.ts +9 -0
  48. package/dist/MarkedEvents.js +15 -0
  49. package/dist/MarkedEvents.js.map +1 -0
  50. package/dist/MediaRange.d.ts +37 -0
  51. package/dist/MediaRange.js +54 -65
  52. package/dist/MediaRange.js.map +1 -0
  53. package/dist/PropertiesFileFormat.d.ts +8 -0
  54. package/dist/PropertiesFileFormat.js +72 -82
  55. package/dist/PropertiesFileFormat.js.map +1 -0
  56. package/dist/Render.d.ts +47 -0
  57. package/dist/Render.js +82 -112
  58. package/dist/Render.js.map +1 -0
  59. package/dist/RenderQueue.d.ts +19 -0
  60. package/dist/RenderQueue.js +52 -62
  61. package/dist/RenderQueue.js.map +1 -0
  62. package/dist/Runtimes.d.ts +27 -0
  63. package/dist/Runtimes.js +86 -0
  64. package/dist/Runtimes.js.map +1 -0
  65. package/dist/StaticArea.d.ts +0 -0
  66. package/dist/StaticArea.js +4 -1
  67. package/dist/StaticArea.js.map +1 -0
  68. package/dist/StaticAreaItem.d.ts +36 -0
  69. package/dist/StaticAreaItem.js +86 -83
  70. package/dist/StaticAreaItem.js.map +1 -0
  71. package/dist/SystemCSSVars.d.ts +2 -0
  72. package/dist/SystemCSSVars.js +6 -28
  73. package/dist/SystemCSSVars.js.map +1 -0
  74. package/dist/Theming.d.ts +3 -0
  75. package/dist/Theming.js +1 -1
  76. package/dist/Theming.js.map +1 -0
  77. package/dist/UI5Element.d.ts +374 -0
  78. package/dist/UI5Element.js +931 -997
  79. package/dist/UI5Element.js.map +1 -0
  80. package/dist/UI5ElementMetadata.d.ts +150 -0
  81. package/dist/UI5ElementMetadata.js +278 -298
  82. package/dist/UI5ElementMetadata.js.map +1 -0
  83. package/dist/animations/AnimationQueue.d.ts +8 -0
  84. package/dist/animations/AnimationQueue.js +31 -38
  85. package/dist/animations/AnimationQueue.js.map +1 -0
  86. package/dist/animations/animate.d.ts +14 -0
  87. package/dist/animations/animate.js +46 -51
  88. package/dist/animations/animate.js.map +1 -0
  89. package/dist/animations/scroll.d.ts +5 -0
  90. package/dist/animations/scroll.js +18 -27
  91. package/dist/animations/scroll.js.map +1 -0
  92. package/dist/animations/slideDown.d.ts +5 -0
  93. package/dist/animations/slideDown.js +53 -78
  94. package/dist/animations/slideDown.js.map +1 -0
  95. package/dist/animations/slideUp.d.ts +5 -0
  96. package/dist/animations/slideUp.js +49 -70
  97. package/dist/animations/slideUp.js.map +1 -0
  98. package/dist/api.json +1 -0
  99. package/dist/asset-registries/Icons.d.ts +30 -0
  100. package/dist/asset-registries/Icons.js +87 -104
  101. package/dist/asset-registries/Icons.js.map +1 -0
  102. package/dist/asset-registries/Illustrations.d.ts +17 -0
  103. package/dist/asset-registries/Illustrations.js +41 -18
  104. package/dist/asset-registries/Illustrations.js.map +1 -0
  105. package/dist/asset-registries/LocaleData.d.ts +7 -0
  106. package/dist/asset-registries/LocaleData.js +104 -118
  107. package/dist/asset-registries/LocaleData.js.map +1 -0
  108. package/dist/asset-registries/Themes.d.ts +10 -0
  109. package/dist/asset-registries/Themes.js +38 -66
  110. package/dist/asset-registries/Themes.js.map +1 -0
  111. package/dist/asset-registries/i18n.d.ts +23 -0
  112. package/dist/asset-registries/i18n.js +55 -81
  113. package/dist/asset-registries/i18n.js.map +1 -0
  114. package/dist/assets/bundle.esm.2e322362.js +56 -0
  115. package/dist/assets-meta/IconCollectionsAlias.d.ts +17 -0
  116. package/dist/assets-meta/IconCollectionsAlias.js +18 -0
  117. package/dist/assets-meta/IconCollectionsAlias.js.map +1 -0
  118. package/dist/config/AnimationMode.d.ts +14 -0
  119. package/dist/config/AnimationMode.js +21 -18
  120. package/dist/config/AnimationMode.js.map +1 -0
  121. package/dist/config/CalendarType.d.ts +8 -0
  122. package/dist/config/CalendarType.js +13 -12
  123. package/dist/config/CalendarType.js.map +1 -0
  124. package/dist/config/FormatSettings.d.ts +11 -0
  125. package/dist/config/FormatSettings.js +10 -8
  126. package/dist/config/FormatSettings.js.map +1 -0
  127. package/dist/config/Icons.d.ts +30 -0
  128. package/dist/config/Icons.js +48 -0
  129. package/dist/config/Icons.js.map +1 -0
  130. package/dist/config/Language.d.ts +31 -0
  131. package/dist/config/Language.js +31 -43
  132. package/dist/config/Language.js.map +1 -0
  133. package/dist/config/NoConflict.d.ts +20 -0
  134. package/dist/config/NoConflict.js +40 -41
  135. package/dist/config/NoConflict.js.map +1 -0
  136. package/dist/config/RTL.d.ts +7 -0
  137. package/dist/config/RTL.js +23 -20
  138. package/dist/config/RTL.js.map +1 -0
  139. package/dist/config/Theme.d.ts +28 -0
  140. package/dist/config/Theme.js +45 -22
  141. package/dist/config/Theme.js.map +1 -0
  142. package/dist/config/ThemeRoots.d.ts +4 -0
  143. package/dist/config/ThemeRoots.js +28 -0
  144. package/dist/config/ThemeRoots.js.map +1 -0
  145. package/dist/css/BusyIndicator.css +80 -0
  146. package/dist/css/FontFace.css +66 -0
  147. package/dist/css/OverrideFontFace.css +32 -0
  148. package/dist/css/SystemCSSVars.css +17 -0
  149. package/dist/decorators/customElement.d.ts +8 -0
  150. package/dist/decorators/customElement.js +16 -0
  151. package/dist/decorators/customElement.js.map +1 -0
  152. package/dist/decorators/event.d.ts +10 -0
  153. package/dist/decorators/event.js +24 -0
  154. package/dist/decorators/event.js.map +1 -0
  155. package/dist/decorators/fastNavigation.d.ts +7 -0
  156. package/dist/decorators/fastNavigation.js +13 -0
  157. package/dist/decorators/fastNavigation.js.map +1 -0
  158. package/dist/decorators/languageAware.d.ts +7 -0
  159. package/dist/decorators/languageAware.js +13 -0
  160. package/dist/decorators/languageAware.js.map +1 -0
  161. package/dist/decorators/property.d.ts +9 -0
  162. package/dist/decorators/property.js +24 -0
  163. package/dist/decorators/property.js.map +1 -0
  164. package/dist/decorators/slot.d.ts +9 -0
  165. package/dist/decorators/slot.js +37 -0
  166. package/dist/decorators/slot.js.map +1 -0
  167. package/dist/decorators/themeAware.d.ts +7 -0
  168. package/dist/decorators/themeAware.js +13 -0
  169. package/dist/decorators/themeAware.js.map +1 -0
  170. package/dist/delegate/ItemNavigation.d.ts +113 -0
  171. package/dist/delegate/ItemNavigation.js +277 -246
  172. package/dist/delegate/ItemNavigation.js.map +1 -0
  173. package/dist/delegate/ResizeHandler.d.ts +24 -0
  174. package/dist/delegate/ResizeHandler.js +68 -91
  175. package/dist/delegate/ResizeHandler.js.map +1 -0
  176. package/dist/delegate/ScrollEnablement.d.ts +49 -0
  177. package/dist/delegate/ScrollEnablement.js +157 -180
  178. package/dist/delegate/ScrollEnablement.js.map +1 -0
  179. package/dist/features/F6Navigation.d.ts +16 -0
  180. package/dist/features/F6Navigation.js +112 -0
  181. package/dist/features/F6Navigation.js.map +1 -0
  182. package/dist/features/OpenUI5Element.d.ts +9 -0
  183. package/dist/features/OpenUI5Element.js +5 -0
  184. package/dist/features/OpenUI5Element.js.map +1 -0
  185. package/dist/features/OpenUI5Enablement.d.ts +11 -0
  186. package/dist/features/OpenUI5Enablement.js +96 -0
  187. package/dist/features/OpenUI5Enablement.js.map +1 -0
  188. package/dist/features/OpenUI5Support.d.ts +23 -0
  189. package/dist/features/OpenUI5Support.js +91 -119
  190. package/dist/features/OpenUI5Support.js.map +1 -0
  191. package/dist/generated/AssetParameters.js +1 -1
  192. package/dist/generated/VersionInfo.js +10 -0
  193. package/dist/generated/css/BusyIndicator.css.d.ts +3 -0
  194. package/dist/generated/css/BusyIndicator.css.js +7 -0
  195. package/dist/generated/css/BusyIndicator.css.js.map +1 -0
  196. package/dist/generated/css/FontFace.css.d.ts +3 -0
  197. package/dist/generated/css/FontFace.css.js +7 -0
  198. package/dist/generated/css/FontFace.css.js.map +1 -0
  199. package/dist/generated/css/OverrideFontFace.css.d.ts +3 -0
  200. package/dist/generated/css/OverrideFontFace.css.js +7 -0
  201. package/dist/generated/css/OverrideFontFace.css.js.map +1 -0
  202. package/dist/generated/css/SystemCSSVars.css.d.ts +3 -0
  203. package/dist/generated/css/SystemCSSVars.css.js +7 -0
  204. package/dist/generated/css/SystemCSSVars.css.js.map +1 -0
  205. package/dist/generated/templates/elements/WithComplexTemplateTemplate.lit.js +11 -0
  206. package/dist/getSharedResource.d.ts +11 -0
  207. package/dist/getSharedResource.js +12 -16
  208. package/dist/getSharedResource.js.map +1 -0
  209. package/dist/global.d.ts +38 -0
  210. package/dist/i18nBundle.d.ts +43 -0
  211. package/dist/i18nBundle.js +67 -44
  212. package/dist/i18nBundle.js.map +1 -0
  213. package/dist/locale/Locale.d.ts +22 -0
  214. package/dist/locale/Locale.js +75 -87
  215. package/dist/locale/Locale.js.map +1 -0
  216. package/dist/locale/RTLAwareRegistry.d.ts +4 -0
  217. package/dist/locale/RTLAwareRegistry.js +6 -11
  218. package/dist/locale/RTLAwareRegistry.js.map +1 -0
  219. package/dist/locale/applyDirection.d.ts +10 -0
  220. package/dist/locale/applyDirection.js +7 -7
  221. package/dist/locale/applyDirection.js.map +1 -0
  222. package/dist/locale/directionChange.d.ts +15 -0
  223. package/dist/locale/directionChange.js +7 -15
  224. package/dist/locale/directionChange.js.map +1 -0
  225. package/dist/locale/getEffectiveDir.d.ts +2 -0
  226. package/dist/locale/getEffectiveDir.js +20 -24
  227. package/dist/locale/getEffectiveDir.js.map +1 -0
  228. package/dist/locale/getLocale.d.ts +7 -0
  229. package/dist/locale/getLocale.js +26 -29
  230. package/dist/locale/getLocale.js.map +1 -0
  231. package/dist/locale/languageChange.d.ts +5 -0
  232. package/dist/locale/languageChange.js +8 -16
  233. package/dist/locale/languageChange.js.map +1 -0
  234. package/dist/locale/nextFallbackLocale.d.ts +8 -0
  235. package/dist/locale/nextFallbackLocale.js +15 -19
  236. package/dist/locale/nextFallbackLocale.js.map +1 -0
  237. package/dist/locale/normalizeLocale.d.ts +7 -0
  238. package/dist/locale/normalizeLocale.js +34 -41
  239. package/dist/locale/normalizeLocale.js.map +1 -0
  240. package/dist/renderer/LitRenderer.d.ts +14 -0
  241. package/dist/renderer/LitRenderer.js +33 -23
  242. package/dist/renderer/LitRenderer.js.map +1 -0
  243. package/dist/renderer/directives/style-map.js +72 -0
  244. package/dist/renderer/executeTemplate.d.ts +13 -0
  245. package/dist/renderer/executeTemplate.js +20 -7
  246. package/dist/renderer/executeTemplate.js.map +1 -0
  247. package/dist/sap/base/Log.js +28 -37
  248. package/dist/sap/base/assert.js +5 -10
  249. package/dist/sap/base/security/URLListValidator.js +13 -2
  250. package/dist/sap/base/security/encodeCSS.js +14 -0
  251. package/dist/sap/base/security/encodeXML.js +23 -0
  252. package/dist/sap/base/strings/toHex.js +8 -0
  253. package/dist/sap/ui/thirdparty/caja-html-sanitizer.js +1 -1
  254. package/dist/theming/CustomStyle.d.ts +6 -0
  255. package/dist/theming/CustomStyle.js +37 -31
  256. package/dist/theming/CustomStyle.js.map +1 -0
  257. package/dist/theming/ThemeLoaded.d.ts +5 -0
  258. package/dist/theming/ThemeLoaded.js +8 -16
  259. package/dist/theming/ThemeLoaded.js.map +1 -0
  260. package/dist/theming/applyTheme.d.ts +2 -0
  261. package/dist/theming/applyTheme.js +62 -65
  262. package/dist/theming/applyTheme.js.map +1 -0
  263. package/dist/theming/getConstructableStyle.d.ts +9 -0
  264. package/dist/theming/getConstructableStyle.js +12 -17
  265. package/dist/theming/getConstructableStyle.js.map +1 -0
  266. package/dist/theming/getEffectiveLinksHrefs.d.ts +3 -0
  267. package/dist/theming/getEffectiveLinksHrefs.js +17 -0
  268. package/dist/theming/getEffectiveLinksHrefs.js.map +1 -0
  269. package/dist/theming/getEffectiveStyle.d.ts +3 -0
  270. package/dist/theming/getEffectiveStyle.js +25 -23
  271. package/dist/theming/getEffectiveStyle.js.map +1 -0
  272. package/dist/theming/getStylesString.d.ts +3 -0
  273. package/dist/theming/getStylesString.js +9 -11
  274. package/dist/theming/getStylesString.js.map +1 -0
  275. package/dist/theming/getThemeDesignerTheme.d.ts +7 -0
  276. package/dist/theming/getThemeDesignerTheme.js +73 -60
  277. package/dist/theming/getThemeDesignerTheme.js.map +1 -0
  278. package/dist/theming/preloadLinks.d.ts +3 -0
  279. package/dist/theming/preloadLinks.js +19 -0
  280. package/dist/theming/preloadLinks.js.map +1 -0
  281. package/dist/thirdparty/_merge.d.ts +2 -0
  282. package/dist/thirdparty/_merge.js +7 -4
  283. package/dist/thirdparty/_merge.js.map +1 -0
  284. package/dist/thirdparty/isPlainObject.d.ts +2 -0
  285. package/dist/thirdparty/isPlainObject.js +11 -10
  286. package/dist/thirdparty/isPlainObject.js.map +1 -0
  287. package/dist/thirdparty/merge.d.ts +2 -0
  288. package/dist/thirdparty/merge.js +4 -8
  289. package/dist/thirdparty/merge.js.map +1 -0
  290. package/dist/types/AnimationMode.d.ts +32 -0
  291. package/dist/types/AnimationMode.js +33 -6
  292. package/dist/types/AnimationMode.js.map +1 -0
  293. package/dist/types/CSSColor.d.ts +16 -0
  294. package/dist/types/CSSColor.js +15 -5
  295. package/dist/types/CSSColor.js.map +1 -0
  296. package/dist/types/CalendarType.d.ts +37 -0
  297. package/dist/types/CalendarType.js +35 -18
  298. package/dist/types/CalendarType.js.map +1 -0
  299. package/dist/types/DOMReference.d.ts +17 -0
  300. package/dist/types/DOMReference.js +25 -0
  301. package/dist/types/DOMReference.js.map +1 -0
  302. package/dist/types/DataType.d.ts +25 -0
  303. package/dist/types/DataType.js +33 -14
  304. package/dist/types/DataType.js.map +1 -0
  305. package/dist/types/Float.d.ts +18 -0
  306. package/dist/types/Float.js +18 -6
  307. package/dist/types/Float.js.map +1 -0
  308. package/dist/types/Integer.d.ts +18 -0
  309. package/dist/types/Integer.js +18 -5
  310. package/dist/types/Integer.js.map +1 -0
  311. package/dist/types/InvisibleMessageMode.d.ts +25 -0
  312. package/dist/types/InvisibleMessageMode.js +20 -23
  313. package/dist/types/InvisibleMessageMode.js.map +1 -0
  314. package/dist/types/ItemNavigationBehavior.d.ts +24 -0
  315. package/dist/types/ItemNavigationBehavior.js +22 -12
  316. package/dist/types/ItemNavigationBehavior.js.map +1 -0
  317. package/dist/types/NavigationMode.d.ts +32 -0
  318. package/dist/types/NavigationMode.js +33 -6
  319. package/dist/types/NavigationMode.js.map +1 -0
  320. package/dist/types/ValueState.d.ts +42 -0
  321. package/dist/types/ValueState.js +41 -19
  322. package/dist/types/ValueState.js.map +1 -0
  323. package/dist/types.d.ts +18 -0
  324. package/dist/types.js +2 -0
  325. package/dist/types.js.map +1 -0
  326. package/dist/updateShadowRoot.d.ts +8 -0
  327. package/dist/updateShadowRoot.js +23 -15
  328. package/dist/updateShadowRoot.js.map +1 -0
  329. package/dist/util/AriaLabelHelper.d.ts +6 -0
  330. package/dist/util/AriaLabelHelper.js +37 -34
  331. package/dist/util/AriaLabelHelper.js.map +1 -0
  332. package/dist/util/Caret.d.ts +7 -0
  333. package/dist/util/Caret.js +16 -38
  334. package/dist/util/Caret.js.map +1 -0
  335. package/dist/util/ColorConversion.d.ts +30 -0
  336. package/dist/util/ColorConversion.js +315 -348
  337. package/dist/util/ColorConversion.js.map +1 -0
  338. package/dist/util/FetchHelper.d.ts +3 -0
  339. package/dist/util/FetchHelper.js +19 -25
  340. package/dist/util/FetchHelper.js.map +1 -0
  341. package/dist/util/FocusableElements.d.ts +4 -0
  342. package/dist/util/FocusableElements.js +66 -72
  343. package/dist/util/FocusableElements.js.map +1 -0
  344. package/dist/util/HTMLSanitizer.d.ts +3 -0
  345. package/dist/util/HTMLSanitizer.js +4 -5
  346. package/dist/util/HTMLSanitizer.js.map +1 -0
  347. package/dist/util/InvisibleMessage.d.ts +10 -0
  348. package/dist/util/InvisibleMessage.js +47 -39
  349. package/dist/util/InvisibleMessage.js.map +1 -0
  350. package/dist/util/PopupUtils.d.ts +7 -0
  351. package/dist/util/PopupUtils.js +58 -77
  352. package/dist/util/PopupUtils.js.map +1 -0
  353. package/dist/util/SlotsHelper.d.ts +9 -0
  354. package/dist/util/SlotsHelper.js +22 -35
  355. package/dist/util/SlotsHelper.js.map +1 -0
  356. package/dist/util/StringHelper.d.ts +3 -0
  357. package/dist/util/StringHelper.js +17 -20
  358. package/dist/util/StringHelper.js.map +1 -0
  359. package/dist/util/TabbableElements.d.ts +17 -0
  360. package/dist/util/TabbableElements.js +53 -43
  361. package/dist/util/TabbableElements.js.map +1 -0
  362. package/dist/util/arraysAreEqual.d.ts +2 -0
  363. package/dist/util/arraysAreEqual.js +10 -12
  364. package/dist/util/arraysAreEqual.js.map +1 -0
  365. package/dist/util/clamp.d.ts +9 -0
  366. package/dist/util/clamp.js +2 -2
  367. package/dist/util/clamp.js.map +1 -0
  368. package/dist/util/createLinkInHead.d.ts +7 -0
  369. package/dist/util/createLinkInHead.js +21 -0
  370. package/dist/util/createLinkInHead.js.map +1 -0
  371. package/dist/util/createStyleInHead.d.ts +8 -0
  372. package/dist/util/createStyleInHead.js +10 -10
  373. package/dist/util/createStyleInHead.js.map +1 -0
  374. package/dist/util/debounce.d.ts +2 -0
  375. package/dist/util/debounce.js +6 -8
  376. package/dist/util/debounce.js.map +1 -0
  377. package/dist/util/detectNavigatorLanguage.d.ts +2 -0
  378. package/dist/util/detectNavigatorLanguage.js +7 -10
  379. package/dist/util/detectNavigatorLanguage.js.map +1 -0
  380. package/dist/util/escapeRegex.d.ts +8 -0
  381. package/dist/util/escapeRegex.js +11 -0
  382. package/dist/util/escapeRegex.js.map +1 -0
  383. package/dist/util/formatMessage.d.ts +2 -0
  384. package/dist/util/formatMessage.js +15 -19
  385. package/dist/util/formatMessage.js.map +1 -0
  386. package/dist/util/generateHighlightedMarkup.d.ts +9 -0
  387. package/dist/util/generateHighlightedMarkup.js +41 -0
  388. package/dist/util/generateHighlightedMarkup.js.map +1 -0
  389. package/dist/util/getActiveElement.d.ts +2 -0
  390. package/dist/util/getActiveElement.js +6 -8
  391. package/dist/util/getActiveElement.js.map +1 -0
  392. package/dist/util/getClassCopy.d.ts +400 -0
  393. package/dist/util/getClassCopy.js +7 -7
  394. package/dist/util/getClassCopy.js.map +1 -0
  395. package/dist/util/getDesigntimePropertyAsArray.d.ts +2 -0
  396. package/dist/util/getDesigntimePropertyAsArray.js +4 -3
  397. package/dist/util/getDesigntimePropertyAsArray.js.map +1 -0
  398. package/dist/util/getEffectiveContentDensity.d.ts +2 -0
  399. package/dist/util/getEffectiveContentDensity.js +2 -3
  400. package/dist/util/getEffectiveContentDensity.js.map +1 -0
  401. package/dist/util/getEffectiveScrollbarStyle.d.ts +2 -0
  402. package/dist/util/getEffectiveScrollbarStyle.js +4 -0
  403. package/dist/util/getEffectiveScrollbarStyle.js.map +1 -0
  404. package/dist/util/getFastNavigationGroups.d.ts +2 -0
  405. package/dist/util/getFastNavigationGroups.js +51 -0
  406. package/dist/util/getFastNavigationGroups.js.map +1 -0
  407. package/dist/util/getFileExtension.d.ts +12 -0
  408. package/dist/util/getFileExtension.js +9 -11
  409. package/dist/util/getFileExtension.js.map +1 -0
  410. package/dist/util/getNormalizedTarget.d.ts +7 -0
  411. package/dist/util/getNormalizedTarget.js +14 -0
  412. package/dist/util/getNormalizedTarget.js.map +1 -0
  413. package/dist/util/getSingletonElementInstance.d.ts +2 -0
  414. package/dist/util/getSingletonElementInstance.js +7 -10
  415. package/dist/util/getSingletonElementInstance.js.map +1 -0
  416. package/dist/util/isElementClickable.d.ts +2 -0
  417. package/dist/util/isElementClickable.js +16 -0
  418. package/dist/util/isElementClickable.js.map +1 -0
  419. package/dist/util/isElementHidden.d.ts +2 -0
  420. package/dist/util/isElementHidden.js +8 -0
  421. package/dist/util/isElementHidden.js.map +1 -0
  422. package/dist/util/isElementInView.d.ts +6 -0
  423. package/dist/util/isElementInView.js +6 -9
  424. package/dist/util/isElementInView.js.map +1 -0
  425. package/dist/util/isElementTabbable.d.ts +9 -0
  426. package/dist/util/isElementTabbable.js +30 -0
  427. package/dist/util/isElementTabbable.js.map +1 -0
  428. package/dist/util/isValidPropertyName.d.ts +8 -0
  429. package/dist/util/isValidPropertyName.js +16 -17
  430. package/dist/util/isValidPropertyName.js.map +1 -0
  431. package/dist/util/whenDOMReady.d.ts +2 -0
  432. package/dist/util/whenDOMReady.js +11 -10
  433. package/dist/util/whenDOMReady.js.map +1 -0
  434. package/dist/util/willShowContent.d.ts +2 -0
  435. package/dist/util/willShowContent.js +7 -0
  436. package/dist/util/willShowContent.js.map +1 -0
  437. package/dist/validateThemeRoot.d.ts +2 -0
  438. package/dist/validateThemeRoot.js +47 -0
  439. package/dist/validateThemeRoot.js.map +1 -0
  440. package/lib/generate-asset-parameters/index.js +8 -5
  441. package/lib/generate-styles/index.js +31 -0
  442. package/lib/generate-version-info/index.js +32 -0
  443. package/package-scripts.js +37 -32
  444. package/package.json +11 -12
  445. package/src/{AssetRegistry.js → AssetRegistry.ts} +0 -0
  446. package/src/Boot.ts +61 -0
  447. package/src/CSP.ts +66 -0
  448. package/src/CustomElementsRegistry.ts +98 -0
  449. package/src/CustomElementsScope.ts +33 -0
  450. package/src/{CustomElementsScope.js → CustomElementsScopeUtils.ts} +14 -7
  451. package/src/DOMObserver.ts +28 -0
  452. package/src/{Device.js → Device.ts} +34 -10
  453. package/src/EventProvider.ts +87 -0
  454. package/src/FeaturesRegistry.ts +14 -0
  455. package/src/FontFace.ts +31 -0
  456. package/src/{InitialConfiguration.js → InitialConfiguration.ts} +62 -17
  457. package/src/Keys.ts +295 -0
  458. package/src/ManagedStyles.ts +92 -0
  459. package/src/MarkedEvents.ts +20 -0
  460. package/src/{MediaRange.js → MediaRange.ts} +54 -53
  461. package/src/{PropertiesFileFormat.js → PropertiesFileFormat.ts} +8 -8
  462. package/src/{Render.js → Render.ts} +27 -20
  463. package/src/{RenderQueue.js → RenderQueue.ts} +10 -5
  464. package/src/Runtimes.ts +114 -0
  465. package/src/{StaticArea.js → StaticArea.ts} +0 -0
  466. package/src/{StaticAreaItem.js → StaticAreaItem.ts} +39 -22
  467. package/src/SystemCSSVars.ts +10 -0
  468. package/src/{Theming.js → Theming.ts} +0 -0
  469. package/src/{UI5Element.js → UI5Element.ts} +309 -187
  470. package/src/{UI5ElementMetadata.js → UI5ElementMetadata.ts} +138 -60
  471. package/src/animations/{AnimationQueue.js → AnimationQueue.ts} +8 -7
  472. package/src/animations/animate.ts +64 -0
  473. package/src/animations/scroll.ts +21 -0
  474. package/src/animations/{slideDown.js → slideDown.ts} +27 -34
  475. package/src/animations/{slideUp.js → slideUp.ts} +28 -32
  476. package/src/asset-registries/Icons.ts +162 -0
  477. package/src/asset-registries/Illustrations.ts +75 -0
  478. package/src/asset-registries/{LocaleData.js → LocaleData.ts} +47 -25
  479. package/src/asset-registries/Themes.ts +67 -0
  480. package/src/asset-registries/{i18n.js → i18n.ts} +21 -24
  481. package/src/assets-meta/IconCollectionsAlias.ts +18 -0
  482. package/src/config/AnimationMode.ts +33 -0
  483. package/src/config/{CalendarType.js → CalendarType.ts} +8 -3
  484. package/src/config/FormatSettings.ts +21 -0
  485. package/src/config/Icons.ts +59 -0
  486. package/src/config/{Language.js → Language.ts} +22 -18
  487. package/src/config/NoConflict.ts +67 -0
  488. package/src/config/{RTL.js → RTL.ts} +14 -4
  489. package/src/config/Theme.ts +64 -0
  490. package/src/config/ThemeRoots.ts +41 -0
  491. package/src/css/BusyIndicator.css +80 -0
  492. package/src/css/FontFace.css +66 -0
  493. package/src/css/OverrideFontFace.css +32 -0
  494. package/src/css/SystemCSSVars.css +17 -0
  495. package/src/decorators/customElement.ts +17 -0
  496. package/src/decorators/event.ts +28 -0
  497. package/src/decorators/fastNavigation.ts +14 -0
  498. package/src/decorators/languageAware.ts +14 -0
  499. package/src/decorators/property.ts +30 -0
  500. package/src/decorators/slot.ts +49 -0
  501. package/src/decorators/themeAware.ts +14 -0
  502. package/src/delegate/{ItemNavigation.js → ItemNavigation.ts} +131 -23
  503. package/src/delegate/{ResizeHandler.js → ResizeHandler.ts} +25 -36
  504. package/src/delegate/ScrollEnablement.ts +224 -0
  505. package/src/features/F6Navigation.ts +141 -0
  506. package/src/features/OpenUI5Element.ts +11 -0
  507. package/src/features/OpenUI5Enablement.ts +117 -0
  508. package/src/features/OpenUI5Support.ts +148 -0
  509. package/src/generated/css/BusyIndicator.css.ts +9 -0
  510. package/src/generated/css/FontFace.css.ts +9 -0
  511. package/src/generated/css/OverrideFontFace.css.ts +9 -0
  512. package/src/generated/css/SystemCSSVars.css.ts +9 -0
  513. package/src/{getSharedResource.js → getSharedResource.ts} +3 -3
  514. package/src/global.d.ts +38 -0
  515. package/src/i18nBundle.ts +108 -0
  516. package/src/locale/{Locale.js → Locale.ts} +15 -5
  517. package/src/locale/RTLAwareRegistry.ts +16 -0
  518. package/src/locale/{applyDirection.js → applyDirection.ts} +4 -3
  519. package/src/locale/{directionChange.js → directionChange.ts} +6 -4
  520. package/src/locale/{getEffectiveDir.js → getEffectiveDir.ts} +1 -1
  521. package/src/locale/{getLocale.js → getLocale.ts} +12 -7
  522. package/src/locale/languageChange.ts +24 -0
  523. package/src/locale/{nextFallbackLocale.js → nextFallbackLocale.ts} +1 -1
  524. package/src/locale/{normalizeLocale.js → normalizeLocale.ts} +5 -3
  525. package/src/renderer/LitRenderer.ts +60 -0
  526. package/src/renderer/directives/style-map.js +72 -0
  527. package/src/renderer/executeTemplate.ts +40 -0
  528. package/src/theming/CustomStyle.ts +62 -0
  529. package/src/theming/{ThemeLoaded.js → ThemeLoaded.ts} +6 -4
  530. package/src/theming/applyTheme.ts +90 -0
  531. package/src/theming/{getConstructableStyle.js → getConstructableStyle.ts} +5 -4
  532. package/src/theming/getEffectiveLinksHrefs.ts +26 -0
  533. package/src/theming/{getEffectiveStyle.js → getEffectiveStyle.ts} +15 -4
  534. package/src/theming/getStylesString.ts +15 -0
  535. package/src/theming/getThemeDesignerTheme.ts +101 -0
  536. package/src/theming/preloadLinks.ts +24 -0
  537. package/src/thirdparty/{_merge.js → _merge.ts} +2 -2
  538. package/src/thirdparty/{isPlainObject.js → isPlainObject.ts} +1 -1
  539. package/src/thirdparty/merge.ts +5 -0
  540. package/src/types/AnimationMode.ts +33 -0
  541. package/src/types/{CSSColor.js → CSSColor.ts} +12 -1
  542. package/src/types/CalendarType.ts +38 -0
  543. package/src/types/DOMReference.ts +28 -0
  544. package/src/types/DataType.ts +51 -0
  545. package/src/types/Float.ts +25 -0
  546. package/src/types/Integer.ts +25 -0
  547. package/src/types/InvisibleMessageMode.ts +27 -0
  548. package/src/types/ItemNavigationBehavior.ts +26 -0
  549. package/src/types/NavigationMode.ts +33 -0
  550. package/src/types/ValueState.ts +47 -0
  551. package/src/types.ts +30 -0
  552. package/src/updateShadowRoot.ts +37 -0
  553. package/src/util/AriaLabelHelper.ts +63 -0
  554. package/src/util/Caret.ts +28 -0
  555. package/src/util/ColorConversion.ts +399 -0
  556. package/src/util/{FetchHelper.js → FetchHelper.ts} +7 -7
  557. package/src/util/FocusableElements.ts +92 -0
  558. package/src/util/{HTMLSanitizer.js → HTMLSanitizer.ts} +2 -0
  559. package/src/util/InvisibleMessage.ts +69 -0
  560. package/src/util/PopupUtils.ts +112 -0
  561. package/src/util/{SlotsHelper.js → SlotsHelper.ts} +9 -13
  562. package/src/util/{StringHelper.js → StringHelper.ts} +7 -7
  563. package/src/util/TabbableElements.ts +70 -0
  564. package/src/util/{arraysAreEqual.js → arraysAreEqual.ts} +1 -1
  565. package/src/util/{clamp.js → clamp.ts} +1 -1
  566. package/src/util/createLinkInHead.ts +25 -0
  567. package/src/util/{createStyleInHead.js → createStyleInHead.ts} +4 -2
  568. package/src/util/{debounce.js → debounce.ts} +5 -4
  569. package/src/util/{detectNavigatorLanguage.js → detectNavigatorLanguage.ts} +1 -1
  570. package/src/util/escapeRegex.ts +11 -0
  571. package/src/util/{formatMessage.js → formatMessage.ts} +4 -3
  572. package/src/util/generateHighlightedMarkup.ts +43 -0
  573. package/src/util/{getActiveElement.js → getActiveElement.ts} +0 -0
  574. package/src/util/{getClassCopy.js → getClassCopy.ts} +3 -1
  575. package/src/util/{getDesigntimePropertyAsArray.js → getDesigntimePropertyAsArray.ts} +1 -1
  576. package/src/util/getEffectiveContentDensity.ts +5 -0
  577. package/src/util/getEffectiveScrollbarStyle.ts +5 -0
  578. package/src/util/getFastNavigationGroups.ts +63 -0
  579. package/src/util/{getFileExtension.js → getFileExtension.ts} +3 -3
  580. package/src/util/getNormalizedTarget.ts +16 -0
  581. package/src/util/{getSingletonElementInstance.js → getSingletonElementInstance.ts} +1 -1
  582. package/src/util/isElementClickable.ts +19 -0
  583. package/src/util/isElementHidden.ts +9 -0
  584. package/src/util/{isElementInView.js → isElementInView.ts} +1 -1
  585. package/src/util/isElementTabbable.ts +37 -0
  586. package/src/util/{isValidPropertyName.js → isValidPropertyName.ts} +1 -1
  587. package/src/util/{whenDOMReady.js → whenDOMReady.ts} +1 -1
  588. package/src/util/willShowContent.ts +7 -0
  589. package/src/validateThemeRoot.ts +58 -0
  590. package/tsconfig.json +13 -0
  591. package/used-modules.txt +4 -1
  592. package/config/.eslintrc.js +0 -3
  593. package/config/rollup.config.js +0 -1
  594. package/dist/RenderScheduler.js +0 -44
  595. package/dist/animations/config.js +0 -5
  596. package/dist/config/AssetsPath.js +0 -17
  597. package/dist/isLegacyBrowser.js +0 -3
  598. package/dist/resources/bundle.esm.js +0 -26
  599. package/dist/resources/bundle.esm.js.map +0 -1
  600. package/dist/test-resources/assets/Themes.js +0 -17
  601. package/dist/test-resources/elements/Child.js +0 -35
  602. package/dist/test-resources/elements/Generic.js +0 -84
  603. package/dist/test-resources/elements/GenericExt.js +0 -26
  604. package/dist/test-resources/elements/NoShadowDOM.js +0 -13
  605. package/dist/test-resources/elements/Parent.js +0 -41
  606. package/dist/test-resources/elements/WithStaticArea.js +0 -76
  607. package/dist/test-resources/pages/AllTestElements.html +0 -39
  608. package/dist/test-resources/pages/Configuration.html +0 -18
  609. package/dist/test-resources/pages/ConfigurationScript.html +0 -34
  610. package/dist/test-resources/pages/assets/messagebundle_de.properties +0 -1
  611. package/dist/test-resources/pages/assets/messagebundle_en.properties +0 -1
  612. package/dist/test-resources/pages/assets/messagebundle_es.properties +0 -1
  613. package/dist/test-resources/pages/assets/messagebundle_fr.properties +0 -1
  614. package/dist/test-resources/pages/i18n.html +0 -35
  615. package/dist/test-resources/specs/ConfigurationChange.spec.js +0 -27
  616. package/dist/test-resources/specs/ConfigurationScript.spec.js +0 -63
  617. package/dist/test-resources/specs/ConfigurationURL.spec.js +0 -93
  618. package/dist/test-resources/specs/CustomTheme.spec.js +0 -27
  619. package/dist/test-resources/specs/StaticArea.spec.js +0 -36
  620. package/dist/test-resources/specs/Theming.spec.js +0 -33
  621. package/dist/test-resources/specs/UI5ElementInvalidation.js +0 -242
  622. package/dist/test-resources/specs/UI5ElementLifecycle.js +0 -98
  623. package/dist/test-resources/specs/UI5ElementListenForChildPropChanges.spec.js +0 -75
  624. package/dist/test-resources/specs/UI5ElementMetadataExt.js +0 -42
  625. package/dist/test-resources/specs/UI5ElementPropertyValidation.js +0 -14
  626. package/dist/test-resources/specs/UI5ElementPropsAndAttrs.spec.js +0 -67
  627. package/dist/test-resources/specs/UI5ElementShadowDOM.js +0 -24
  628. package/dist/test-resources/specs/UI5ElementSlots.js +0 -36
  629. package/dist/theming/createThemePropertiesStyleTag.js +0 -20
  630. package/dist/types/CSSSize.js +0 -9
  631. package/dist/types/PopupState.js +0 -37
  632. package/dist/util/encodeCSS.js +0 -24
  633. package/dist/util/findNodeOwner.js +0 -35
  634. package/dist/util/isDescendantOf.js +0 -15
  635. package/dist/util/isNodeClickable.js +0 -19
  636. package/dist/util/isNodeHidden.js +0 -9
  637. package/dist/util/isNodeTabbable.js +0 -28
  638. package/dist/util/setToArray.js +0 -10
  639. package/hash.txt +0 -1
  640. package/src/Boot.js +0 -43
  641. package/src/CustomElementsRegistry.js +0 -39
  642. package/src/DOMObserver.js +0 -65
  643. package/src/EventProvider.js +0 -91
  644. package/src/FeaturesRegistry.js +0 -11
  645. package/src/FontFace.js +0 -118
  646. package/src/Keys.js +0 -239
  647. package/src/RenderScheduler.js +0 -44
  648. package/src/SystemCSSVars.js +0 -31
  649. package/src/animations/animate.js +0 -53
  650. package/src/animations/config.js +0 -5
  651. package/src/animations/scroll.js +0 -28
  652. package/src/asset-registries/Icons.js +0 -121
  653. package/src/asset-registries/Illustrations.js +0 -23
  654. package/src/asset-registries/Themes.js +0 -78
  655. package/src/config/AnimationMode.js +0 -23
  656. package/src/config/AssetsPath.js +0 -17
  657. package/src/config/FormatSettings.js +0 -13
  658. package/src/config/NoConflict.js +0 -51
  659. package/src/config/Theme.js +0 -28
  660. package/src/delegate/ScrollEnablement.js +0 -188
  661. package/src/features/OpenUI5Support.js +0 -125
  662. package/src/i18nBundle.js +0 -55
  663. package/src/isLegacyBrowser.js +0 -3
  664. package/src/locale/RTLAwareRegistry.js +0 -14
  665. package/src/locale/languageChange.js +0 -22
  666. package/src/renderer/LitRenderer.js +0 -31
  667. package/src/renderer/executeTemplate.js +0 -17
  668. package/src/theming/CustomStyle.js +0 -40
  669. package/src/theming/applyTheme.js +0 -78
  670. package/src/theming/createThemePropertiesStyleTag.js +0 -20
  671. package/src/theming/getStylesString.js +0 -13
  672. package/src/theming/getThemeDesignerTheme.js +0 -67
  673. package/src/thirdparty/merge.js +0 -10
  674. package/src/types/AnimationMode.js +0 -7
  675. package/src/types/CSSSize.js +0 -9
  676. package/src/types/CalendarType.js +0 -22
  677. package/src/types/DataType.js +0 -25
  678. package/src/types/Float.js +0 -10
  679. package/src/types/Integer.js +0 -9
  680. package/src/types/InvisibleMessageMode.js +0 -30
  681. package/src/types/ItemNavigationBehavior.js +0 -16
  682. package/src/types/NavigationMode.js +0 -7
  683. package/src/types/PopupState.js +0 -37
  684. package/src/types/ValueState.js +0 -22
  685. package/src/updateShadowRoot.js +0 -26
  686. package/src/util/AriaLabelHelper.js +0 -41
  687. package/src/util/Caret.js +0 -45
  688. package/src/util/ColorConversion.js +0 -370
  689. package/src/util/FocusableElements.js +0 -77
  690. package/src/util/InvisibleMessage.js +0 -48
  691. package/src/util/PopupUtils.js +0 -93
  692. package/src/util/TabbableElements.js +0 -47
  693. package/src/util/encodeCSS.js +0 -24
  694. package/src/util/findNodeOwner.js +0 -35
  695. package/src/util/getEffectiveContentDensity.js +0 -5
  696. package/src/util/isDescendantOf.js +0 -15
  697. package/src/util/isNodeClickable.js +0 -19
  698. package/src/util/isNodeHidden.js +0 -9
  699. package/src/util/isNodeTabbable.js +0 -28
  700. package/src/util/setToArray.js +0 -10
@@ -1,6 +1,12 @@
1
1
  import merge from "./thirdparty/merge.js";
2
2
  import { boot } from "./Boot.js";
3
- import UI5ElementMetadata from "./UI5ElementMetadata.js";
3
+ import UI5ElementMetadata, {
4
+ Slot,
5
+ SlotValue,
6
+ State,
7
+ PropertyValue,
8
+ Metadata,
9
+ } from "./UI5ElementMetadata.js";
4
10
  import EventProvider from "./EventProvider.js";
5
11
  import getSingletonElementInstance from "./util/getSingletonElementInstance.js";
6
12
  import StaticAreaItem from "./StaticAreaItem.js";
@@ -10,28 +16,43 @@ import { registerTag, isTagRegistered, recordTagRegistrationFailure } from "./Cu
10
16
  import { observeDOMNode, unobserveDOMNode } from "./DOMObserver.js";
11
17
  import { skipOriginalEvent } from "./config/NoConflict.js";
12
18
  import getEffectiveDir from "./locale/getEffectiveDir.js";
13
- import Integer from "./types/Integer.js";
14
- import Float from "./types/Float.js";
19
+ import DataType from "./types/DataType.js";
15
20
  import { kebabToCamelCase, camelToKebabCase } from "./util/StringHelper.js";
16
21
  import isValidPropertyName from "./util/isValidPropertyName.js";
17
- import { isSlot, getSlotName, getSlottedElementsList } from "./util/SlotsHelper.js";
22
+ import { getSlotName, getSlottedNodesList } from "./util/SlotsHelper.js";
18
23
  import arraysAreEqual from "./util/arraysAreEqual.js";
19
- import getClassCopy from "./util/getClassCopy.js";
20
24
  import { markAsRtlAware } from "./locale/RTLAwareRegistry.js";
21
- import isLegacyBrowser from "./isLegacyBrowser.js";
25
+ import preloadLinks from "./theming/preloadLinks.js";
26
+ import { TemplateFunction, TemplateFunctionResult } from "./renderer/executeTemplate.js";
27
+ import { PromiseResolve, ComponentStylesData, ClassMap } from "./types.js";
22
28
 
23
29
  let autoId = 0;
24
30
 
25
- const elementTimeouts = new Map();
26
- const uniqueDependenciesCache = new Map();
31
+ const elementTimeouts = new Map<string, Promise<void>>();
32
+ const uniqueDependenciesCache = new Map<typeof UI5Element, Array<typeof UI5Element>>();
33
+
34
+ type ChangeInfo = {
35
+ type: "property" | "slot",
36
+ name: string,
37
+ reason?: string,
38
+ child?: SlotValue,
39
+ target?: UI5Element,
40
+ newValue?: PropertyValue,
41
+ oldValue?: PropertyValue,
42
+ }
43
+
44
+ type InvalidationInfo = ChangeInfo & { target: UI5Element };
45
+
46
+ type ChildChangeListener = (param: InvalidationInfo) => void;
47
+
48
+ type SlotChangeListener = (this: HTMLSlotElement, ev: Event) => void;
27
49
 
28
50
  /**
29
51
  * Triggers re-rendering of a UI5Element instance due to state change.
30
- *
31
- * @param changeInfo An object with information about the change that caused invalidation.
52
+ * @param {ChangeInfo} changeInfo An object with information about the change that caused invalidation.
32
53
  * @private
33
54
  */
34
- function _invalidate(changeInfo) {
55
+ function _invalidate(this: UI5Element, changeInfo: ChangeInfo) {
35
56
  // Invalidation should be suppressed: 1) before the component is rendered for the first time 2) and during the execution of onBeforeRendering
36
57
  // This is necessary not only as an optimization, but also to avoid infinite loops on invalidation between children and parents (when invalidateOnChildChange is used)
37
58
  if (this._suppressInvalidation) {
@@ -43,23 +64,47 @@ function _invalidate(changeInfo) {
43
64
 
44
65
  this._changedState.push(changeInfo);
45
66
  renderDeferred(this);
46
- this._eventProvider.fireEvent("change", { ...changeInfo, target: this });
67
+ this._eventProvider.fireEvent("invalidate", { ...changeInfo, target: this });
47
68
  }
48
69
 
70
+ let metadata = {} as Metadata;
71
+
49
72
  /**
50
73
  * Base class for all UI5 Web Components
51
74
  *
52
75
  * @class
53
76
  * @constructor
54
77
  * @author SAP SE
55
- * @alias sap.ui.webcomponents.base.UI5Element
78
+ * @alias sap.ui.webc.base.UI5Element
56
79
  * @extends HTMLElement
57
80
  * @public
58
81
  */
59
- class UI5Element extends HTMLElement {
82
+ abstract class UI5Element extends HTMLElement {
83
+ __id?: string;
84
+ _suppressInvalidation: boolean;
85
+ _changedState: Array<ChangeInfo>;
86
+ _eventProvider: EventProvider<InvalidationInfo, void>;
87
+ _inDOM: boolean;
88
+ _fullyConnected: boolean;
89
+ _childChangeListeners: Map<string, ChildChangeListener>;
90
+ _slotChangeListeners: Map<string, SlotChangeListener>;
91
+ _domRefReadyPromise: Promise<void> & { _deferredResolve?: PromiseResolve };
92
+ _doNotSyncAttributes: Set<string>;
93
+ _state: State;
94
+ _onComponentStateFinalized?: () => void;
95
+ _getRealDomRef?: () => HTMLElement;
96
+
97
+ staticAreaItem?: StaticAreaItem;
98
+
99
+ static template?: TemplateFunction;
100
+ static staticAreaTemplate?: TemplateFunction;
101
+ static _metadata: UI5ElementMetadata;
102
+ static render: (templateFunctionResult: TemplateFunctionResult, container: HTMLElement | DocumentFragment, styleStrOrHrefsArr: string | Array<string> | undefined, forStaticArea: boolean, options: { host: HTMLElement }) => void;
103
+
60
104
  constructor() {
61
105
  super();
62
106
 
107
+ const ctor = this.constructor as typeof UI5Element;
63
108
  this._changedState = []; // Filled on each invalidation, cleared on re-render (used for debugging)
64
109
  this._suppressInvalidation = true; // A flag telling whether all invalidations should be ignored. Initialized with "true" because a UI5Element can not be invalidated until it is rendered for the first time
65
110
  this._inDOM = false; // A flag telling whether the UI5Element is currently in the DOM tree of the document or not
@@ -72,11 +117,13 @@ class UI5Element extends HTMLElement {
72
117
  deferredResolve = resolve;
73
118
  });
74
119
  this._domRefReadyPromise._deferredResolve = deferredResolve;
120
+ this._doNotSyncAttributes = new Set(); // attributes that are excluded from attributeChangedCallback synchronization
121
+
122
+ this._state = { ...ctor.getMetadata().getInitialState() };
75
123
 
76
- this._initializeState();
77
124
  this._upgradeAllProperties();
78
125
 
79
- if (this.constructor._needsShadowDOM()) {
126
+ if (ctor._needsShadowDOM()) {
80
127
  this.attachShadow({ mode: "open" });
81
128
  }
82
129
  }
@@ -100,10 +147,14 @@ class UI5Element extends HTMLElement {
100
147
  * @private
101
148
  */
102
149
  async connectedCallback() {
103
- this.setAttribute(this.constructor.getMetadata().getPureTag(), "");
150
+ const ctor = this.constructor as typeof UI5Element;
151
+
152
+ this.setAttribute(ctor.getMetadata().getPureTag(), "");
153
+ if (ctor.getMetadata().supportsF6FastNavigation()) {
154
+ this.setAttribute("data-sap-ui-fastnavgroup", "true");
155
+ }
104
156
 
105
- const needsShadowDOM = this.constructor._needsShadowDOM();
106
- const slotsAreManaged = this.constructor.getMetadata().slotsAreManaged();
157
+ const slotsAreManaged = ctor.getMetadata().slotsAreManaged();
107
158
 
108
159
  this._inDOM = true;
109
160
 
@@ -113,20 +164,14 @@ class UI5Element extends HTMLElement {
113
164
  await this._processChildren();
114
165
  }
115
166
 
116
- if (needsShadowDOM && !this.shadowRoot) { // Workaround for Firefox74 bug
117
- await Promise.resolve();
118
- }
119
-
120
167
  if (!this._inDOM) { // Component removed from DOM while _processChildren was running
121
168
  return;
122
169
  }
123
170
 
124
171
  renderImmediately(this);
125
- this._domRefReadyPromise._deferredResolve();
172
+ this._domRefReadyPromise._deferredResolve!();
126
173
  this._fullyConnected = true;
127
- if (typeof this.onEnterDOM === "function") {
128
- this.onEnterDOM();
129
- }
174
+ this.onEnterDOM();
130
175
  }
131
176
 
132
177
  /**
@@ -134,8 +179,8 @@ class UI5Element extends HTMLElement {
134
179
  * @private
135
180
  */
136
181
  disconnectedCallback() {
137
- const needsShadowDOM = this.constructor._needsShadowDOM();
138
- const slotsAreManaged = this.constructor.getMetadata().slotsAreManaged();
182
+ const ctor = this.constructor as typeof UI5Element;
183
+ const slotsAreManaged = ctor.getMetadata().slotsAreManaged();
139
184
 
140
185
  this._inDOM = false;
141
186
 
@@ -143,13 +188,9 @@ class UI5Element extends HTMLElement {
143
188
  this._stopObservingDOMChildren();
144
189
  }
145
190
 
146
- if (needsShadowDOM) {
147
- if (this._fullyConnected) {
148
- if (typeof this.onExitDOM === "function") {
149
- this.onExitDOM();
150
- }
151
- this._fullyConnected = false;
152
- }
191
+ if (this._fullyConnected) {
192
+ this.onExitDOM();
193
+ this._fullyConnected = false;
153
194
  }
154
195
 
155
196
  if (this.staticAreaItem && this.staticAreaItem.parentElement) {
@@ -159,22 +200,47 @@ class UI5Element extends HTMLElement {
159
200
  cancelRender(this);
160
201
  }
161
202
 
203
+ /**
204
+ * Called every time before the component renders.
205
+ * @public
206
+ */
207
+ onBeforeRendering() {}
208
+
209
+ /**
210
+ * Called every time after the component renders.
211
+ * @public
212
+ */
213
+ onAfterRendering() {}
214
+
215
+ /**
216
+ * Called on connectedCallback - added to the DOM.
217
+ * @public
218
+ */
219
+ onEnterDOM() {}
220
+
221
+ /**
222
+ * Called on disconnectedCallback - removed from the DOM.
223
+ * @public
224
+ */
225
+ onExitDOM() {}
226
+
162
227
  /**
163
228
  * @private
164
229
  */
165
230
  _startObservingDOMChildren() {
166
- const shouldObserveChildren = this.constructor.getMetadata().hasSlots();
231
+ const ctor = this.constructor as typeof UI5Element;
232
+ const shouldObserveChildren = ctor.getMetadata().hasSlots();
167
233
  if (!shouldObserveChildren) {
168
234
  return;
169
235
  }
170
236
 
171
- const canSlotText = this.constructor.getMetadata().canSlotText();
237
+ const canSlotText = ctor.getMetadata().canSlotText();
172
238
  const mutationObserverOptions = {
173
239
  childList: true,
174
240
  subtree: canSlotText,
175
241
  characterData: canSlotText,
176
242
  };
177
- observeDOMNode(this, this._processChildren.bind(this), mutationObserverOptions);
243
+ observeDOMNode(this, this._processChildren.bind(this) as MutationCallback, mutationObserverOptions);
178
244
  }
179
245
 
180
246
  /**
@@ -189,7 +255,7 @@ class UI5Element extends HTMLElement {
189
255
  * @private
190
256
  */
191
257
  async _processChildren() {
192
- const hasSlots = this.constructor.getMetadata().hasSlots();
258
+ const hasSlots = (this.constructor as typeof UI5Element).getMetadata().hasSlots();
193
259
  if (hasSlots) {
194
260
  await this._updateSlots();
195
261
  }
@@ -199,23 +265,24 @@ class UI5Element extends HTMLElement {
199
265
  * @private
200
266
  */
201
267
  async _updateSlots() {
202
- const slotsMap = this.constructor.getMetadata().getSlots();
203
- const canSlotText = this.constructor.getMetadata().canSlotText();
204
- const domChildren = Array.from(canSlotText ? this.childNodes : this.children);
268
+ const ctor = this.constructor as typeof UI5Element;
269
+ const slotsMap = ctor.getMetadata().getSlots();
270
+ const canSlotText = ctor.getMetadata().canSlotText();
271
+ const domChildren = Array.from(canSlotText ? this.childNodes : this.children) as Array<Node>;
205
272
 
206
- const slotsCachedContentMap = new Map(); // Store here the content of each slot before the mutation occurred
207
- const propertyNameToSlotMap = new Map(); // Used for reverse lookup to determine to which slot the property name corresponds
273
+ const slotsCachedContentMap = new Map<string, Array<SlotValue>>(); // Store here the content of each slot before the mutation occurred
274
+ const propertyNameToSlotMap = new Map<string, string>(); // Used for reverse lookup to determine to which slot the property name corresponds
208
275
 
209
276
  // Init the _state object based on the supported slots and store the previous values
210
277
  for (const [slotName, slotData] of Object.entries(slotsMap)) { // eslint-disable-line
211
278
  const propertyName = slotData.propertyName || slotName;
212
279
  propertyNameToSlotMap.set(propertyName, slotName);
213
- slotsCachedContentMap.set(propertyName, [...this._state[propertyName]]);
280
+ slotsCachedContentMap.set(propertyName, [...(this._state[propertyName] as Array<SlotValue>)]);
214
281
  this._clearSlot(slotName, slotData);
215
282
  }
216
283
 
217
- const autoIncrementMap = new Map();
218
- const slottedChildrenMap = new Map();
284
+ const autoIncrementMap = new Map<string, number>();
285
+ const slottedChildrenMap = new Map<string, Array<{child: Node, idx: number }>>();
219
286
 
220
287
  const allChildrenUpgraded = domChildren.map(async (child, idx) => {
221
288
  // Determine the type of the child (mainly by the slot attribute)
@@ -224,8 +291,11 @@ class UI5Element extends HTMLElement {
224
291
 
225
292
  // Check if the slotName is supported
226
293
  if (slotData === undefined) {
227
- const validValues = Object.keys(slotsMap).join(", ");
228
- console.warn(`Unknown slotName: ${slotName}, ignoring`, child, `Valid values are: ${validValues}`); // eslint-disable-line
294
+ if (slotName !== "default") {
295
+ const validValues = Object.keys(slotsMap).join(", ");
296
+ console.warn(`Unknown slotName: ${slotName}, ignoring`, child, `Valid values are: ${validValues}`); // eslint-disable-line
297
+ }
298
+
229
299
  return;
230
300
  }
231
301
 
@@ -233,7 +303,7 @@ class UI5Element extends HTMLElement {
233
303
  if (slotData.individualSlots) {
234
304
  const nextIndex = (autoIncrementMap.get(slotName) || 0) + 1;
235
305
  autoIncrementMap.set(slotName, nextIndex);
236
- child._individualSlot = `${slotName}-${nextIndex}`;
306
+ (child as Record<string, any>)._individualSlot = `${slotName}-${nextIndex}`;
237
307
  }
238
308
 
239
309
  // Await for not-yet-defined custom elements
@@ -255,22 +325,26 @@ class UI5Element extends HTMLElement {
255
325
  }
256
326
  }
257
327
 
258
- child = this.constructor.getMetadata().constructor.validateSlotValue(child, slotData);
328
+ child = (ctor.getMetadata().constructor as typeof UI5ElementMetadata).validateSlotValue(child, slotData);
259
329
 
260
330
  // Listen for any invalidation on the child if invalidateOnChildChange is true or an object (ignore when false or not set)
261
- if (child.isUI5Element && slotData.invalidateOnChildChange) {
262
- child._attachChange(this._getChildChangeListener(slotName));
331
+ if (instanceOfUI5Element(child) && slotData.invalidateOnChildChange) {
332
+ const childChangeListener = this._getChildChangeListener(slotName);
333
+
334
+ if (childChangeListener) {
335
+ child.attachInvalidate.call(child, childChangeListener);
336
+ }
263
337
  }
264
338
 
265
339
  // Listen for the slotchange event if the child is a slot itself
266
- if (isSlot(child)) {
340
+ if (child instanceof HTMLSlotElement) {
267
341
  this._attachSlotChange(child, slotName);
268
342
  }
269
343
 
270
344
  const propertyName = slotData.propertyName || slotName;
271
345
 
272
346
  if (slottedChildrenMap.has(propertyName)) {
273
- slottedChildrenMap.get(propertyName).push({ child, idx });
347
+ slottedChildrenMap.get(propertyName)!.push({ child, idx });
274
348
  } else {
275
349
  slottedChildrenMap.set(propertyName, [{ child, idx }]);
276
350
  }
@@ -288,10 +362,10 @@ class UI5Element extends HTMLElement {
288
362
  let invalidated = false;
289
363
  for (const [slotName, slotData] of Object.entries(slotsMap)) { // eslint-disable-line
290
364
  const propertyName = slotData.propertyName || slotName;
291
- if (!arraysAreEqual(slotsCachedContentMap.get(propertyName), this._state[propertyName])) {
365
+ if (!arraysAreEqual(slotsCachedContentMap.get(propertyName)!, this._state[propertyName] as Array<SlotValue>)) {
292
366
  _invalidate.call(this, {
293
367
  type: "slot",
294
- name: propertyNameToSlotMap.get(propertyName),
368
+ name: propertyNameToSlotMap.get(propertyName)!,
295
369
  reason: "children",
296
370
  });
297
371
  invalidated = true;
@@ -313,16 +387,20 @@ class UI5Element extends HTMLElement {
313
387
  * Removes all children from the slot and detaches listeners, if any
314
388
  * @private
315
389
  */
316
- _clearSlot(slotName, slotData) {
390
+ _clearSlot(slotName: string, slotData: Slot) {
317
391
  const propertyName = slotData.propertyName || slotName;
318
- const children = this._state[propertyName];
392
+ const children = this._state[propertyName] as Array<SlotValue>;
319
393
 
320
394
  children.forEach(child => {
321
- if (child && child.isUI5Element) {
322
- child._detachChange(this._getChildChangeListener(slotName));
395
+ if (instanceOfUI5Element(child)) {
396
+ const childChangeListener = this._getChildChangeListener(slotName);
397
+
398
+ if (childChangeListener) {
399
+ child.detachInvalidate.call(child, childChangeListener);
400
+ }
323
401
  }
324
402
 
325
- if (isSlot(child)) {
403
+ if (child instanceof HTMLSlotElement) {
326
404
  this._detachSlotChange(child, slotName);
327
405
  }
328
406
  });
@@ -333,32 +411,32 @@ class UI5Element extends HTMLElement {
333
411
  /**
334
412
  * Attach a callback that will be executed whenever the component is invalidated
335
413
  *
336
- * @param callback
337
- * @protected
414
+ * @param {InvalidationInfo} callback
415
+ * @public
338
416
  */
339
- _attachChange(callback) {
340
- this._eventProvider.attachEvent("change", callback);
417
+ attachInvalidate(callback: (param: InvalidationInfo) => void) {
418
+ this._eventProvider.attachEvent("invalidate", callback);
341
419
  }
342
420
 
343
421
  /**
344
422
  * Detach the callback that is executed whenever the component is invalidated
345
423
  *
346
- * @param callback
347
- * @protected
424
+ * @param {InvalidationInfo} callback
425
+ * @public
348
426
  */
349
- _detachChange(callback) {
350
- this._eventProvider.detachEvent("change", callback);
427
+ detachInvalidate(callback: (param: InvalidationInfo) => void) {
428
+ this._eventProvider.detachEvent("invalidate", callback);
351
429
  }
352
430
 
353
431
  /**
354
432
  * Callback that is executed whenever a monitored child changes its state
355
433
  *
356
- * @param slotName the slot in which a child was invalidated
357
- * @param childChangeInfo the changeInfo object for the child in the given slot
434
+ * @param {sting} slotName the slot in which a child was invalidated
435
+ * @param { ChangeInfo } childChangeInfo the changeInfo object for the child in the given slot
358
436
  * @private
359
437
  */
360
- _onChildChange(slotName, childChangeInfo) {
361
- if (!this.constructor.getMetadata().shouldInvalidateOnChildChange(slotName, childChangeInfo.type, childChangeInfo.name)) {
438
+ _onChildChange(slotName: string, childChangeInfo: ChangeInfo) {
439
+ if (!(this.constructor as typeof UI5Element).getMetadata().shouldInvalidateOnChildChange(slotName, childChangeInfo.type, childChangeInfo.name)) {
362
440
  return;
363
441
  }
364
442
 
@@ -376,58 +454,86 @@ class UI5Element extends HTMLElement {
376
454
  * Do not override this method in derivatives of UI5Element
377
455
  * @private
378
456
  */
379
- attributeChangedCallback(name, oldValue, newValue) {
380
- const properties = this.constructor.getMetadata().getProperties();
457
+ attributeChangedCallback(name: string, oldValue: string | null, newValue: string | null) {
458
+ let newPropertyValue: PropertyValue;
459
+ if (this._doNotSyncAttributes.has(name)) { // This attribute is mutated internally, not by the user
460
+ return;
461
+ }
462
+
463
+ const properties = (this.constructor as typeof UI5Element).getMetadata().getProperties();
381
464
  const realName = name.replace(/^ui5-/, "");
382
465
  const nameInCamelCase = kebabToCamelCase(realName);
383
466
  if (properties.hasOwnProperty(nameInCamelCase)) { // eslint-disable-line
384
- const propertyTypeClass = properties[nameInCamelCase].type;
385
- if (propertyTypeClass === Boolean) {
386
- newValue = newValue !== null;
387
- }
388
- if (propertyTypeClass === Integer) {
389
- newValue = parseInt(newValue);
467
+ const propData = properties[nameInCamelCase];
468
+ const propertyType = propData.type;
469
+ let propertyValidator = propData.validator as typeof DataType;
470
+
471
+ if (propertyType && (propertyType as typeof DataType).isDataTypeClass) {
472
+ propertyValidator = propertyType as typeof DataType;
390
473
  }
391
- if (propertyTypeClass === Float) {
392
- newValue = parseFloat(newValue);
474
+
475
+ if (propertyValidator) {
476
+ newPropertyValue = propertyValidator.attributeToProperty(newValue);
477
+ } else if (propertyType === Boolean) {
478
+ newPropertyValue = newValue !== null;
479
+ } else {
480
+ newPropertyValue = newValue as string;
393
481
  }
394
- this[nameInCamelCase] = newValue;
482
+
483
+ (this as Record<string, any>)[nameInCamelCase] = newPropertyValue;
395
484
  }
396
485
  }
397
486
 
398
487
  /**
399
488
  * @private
400
489
  */
401
- _updateAttribute(name, newValue) {
402
- if (!this.constructor.getMetadata().hasAttribute(name)) {
403
- return;
404
- }
490
+ _updateAttribute(name: string, newValue: PropertyValue) {
491
+ const ctor = this.constructor as typeof UI5Element;
405
492
 
406
- if (typeof newValue === "object") {
493
+ if (!ctor.getMetadata().hasAttribute(name)) {
407
494
  return;
408
495
  }
409
-
496
+ const properties = ctor.getMetadata().getProperties();
497
+ const propData = properties[name];
498
+ const propertyType = propData.type;
499
+ let propertyValidator = propData.validator as typeof DataType;
410
500
  const attrName = camelToKebabCase(name);
411
501
  const attrValue = this.getAttribute(attrName);
412
- if (typeof newValue === "boolean") {
502
+
503
+ if (propertyType && (propertyType as typeof DataType).isDataTypeClass) {
504
+ propertyValidator = propertyType as typeof DataType;
505
+ }
506
+
507
+ if (propertyValidator) {
508
+ const newAttrValue = propertyValidator.propertyToAttribute(newValue);
509
+ if (newAttrValue === null) { // null means there must be no attribute for the current value of the property
510
+ this._doNotSyncAttributes.add(attrName); // skip the attributeChangedCallback call for this attribute
511
+ this.removeAttribute(attrName); // remove the attribute safely (will not trigger synchronization to the property value due to the above line)
512
+ this._doNotSyncAttributes.delete(attrName); // enable synchronization again for this attribute
513
+ } else {
514
+ this.setAttribute(attrName, newAttrValue);
515
+ }
516
+ } else if (propertyType === Boolean) {
413
517
  if (newValue === true && attrValue === null) {
414
518
  this.setAttribute(attrName, "");
415
519
  } else if (newValue === false && attrValue !== null) {
416
520
  this.removeAttribute(attrName);
417
521
  }
418
- } else if (attrValue !== newValue) {
419
- this.setAttribute(attrName, newValue);
420
- }
522
+ } else if (typeof newValue !== "object") {
523
+ if (attrValue !== newValue) {
524
+ this.setAttribute(attrName, newValue as string);
525
+ }
526
+ } // else { return; } // old object handling
421
527
  }
422
528
 
423
529
  /**
424
530
  * @private
425
531
  */
426
- _upgradeProperty(prop) {
427
- if (this.hasOwnProperty(prop)) { // eslint-disable-line
428
- const value = this[prop];
429
- delete this[prop];
430
- this[prop] = value;
532
+ _upgradeProperty(this: Record<string, any>, propertyName: string) {
533
+ if (this.hasOwnProperty(propertyName)) { // eslint-disable-line
534
+ const value = this[propertyName];
535
+ delete this[propertyName];
536
+ this[propertyName] = value;
431
537
  }
432
538
  }
433
539
 
@@ -435,25 +541,18 @@ class UI5Element extends HTMLElement {
435
541
  * @private
436
542
  */
437
543
  _upgradeAllProperties() {
438
- const allProps = this.constructor.getMetadata().getPropertiesList();
439
- allProps.forEach(this._upgradeProperty, this);
440
- }
441
-
442
- /**
443
- * @private
444
- */
445
- _initializeState() {
446
- this._state = { ...this.constructor.getMetadata().getInitialState() };
544
+ const allProps = (this.constructor as typeof UI5Element).getMetadata().getPropertiesList();
545
+ allProps.forEach(this._upgradeProperty.bind(this));
447
546
  }
448
547
 
449
548
  /**
450
549
  * Returns a singleton event listener for the "change" event of a child in a given slot
451
550
  *
452
551
  * @param slotName the name of the slot, where the child is
453
- * @returns {any}
552
+ * @returns {ChildChangeListener}
454
553
  * @private
455
554
  */
456
- _getChildChangeListener(slotName) {
555
+ _getChildChangeListener(slotName: string) {
457
556
  if (!this._childChangeListeners.has(slotName)) {
458
557
  this._childChangeListeners.set(slotName, this._onChildChange.bind(this, slotName));
459
558
  }
@@ -464,27 +563,30 @@ class UI5Element extends HTMLElement {
464
563
  * Returns a singleton slotchange event listener that invalidates the component due to changes in the given slot
465
564
  *
466
565
  * @param slotName the name of the slot, where the slot element (whose slotchange event we're listening to) is
467
- * @returns {any}
566
+ * @returns {SlotChangeListener}
468
567
  * @private
469
568
  */
470
- _getSlotChangeListener(slotName) {
569
+ _getSlotChangeListener(slotName: string) {
471
570
  if (!this._slotChangeListeners.has(slotName)) {
472
571
  this._slotChangeListeners.set(slotName, this._onSlotChange.bind(this, slotName));
473
572
  }
474
- return this._slotChangeListeners.get(slotName);
573
+ return this._slotChangeListeners.get(slotName)!;
475
574
  }
476
575
 
477
576
  /**
478
577
  * @private
479
578
  */
480
- _attachSlotChange(child, slotName) {
481
- child.addEventListener("slotchange", this._getSlotChangeListener(slotName));
579
+ _attachSlotChange(child: HTMLSlotElement, slotName: string) {
580
+ const slotChangeListener = this._getSlotChangeListener(slotName);
581
+ if (slotChangeListener) {
582
+ child.addEventListener("slotchange", slotChangeListener);
583
+ }
482
584
  }
483
585
 
484
586
  /**
485
587
  * @private
486
588
  */
487
- _detachSlotChange(child, slotName) {
589
+ _detachSlotChange(child: HTMLSlotElement, slotName: string) {
488
590
  child.removeEventListener("slotchange", this._getSlotChangeListener(slotName));
489
591
  }
490
592
 
@@ -494,7 +596,7 @@ class UI5Element extends HTMLElement {
494
596
  * @param slotName the name of the slot, where the slot element (whose slotchange event we're listening to) is
495
597
  * @private
496
598
  */
497
- _onSlotChange(slotName) {
599
+ _onSlotChange(slotName: string) {
498
600
  _invalidate.call(this, {
499
601
  type: "slot",
500
602
  name: slotName,
@@ -529,21 +631,20 @@ class UI5Element extends HTMLElement {
529
631
  *
530
632
  * @public
531
633
  */
532
- onInvalidation(changeInfo) {}
634
+ onInvalidation(changeInfo: ChangeInfo) {} // eslint-disable-line
533
635
 
534
636
  /**
535
637
  * Do not call this method directly, only intended to be called by js
536
638
  * @protected
537
639
  */
538
640
  _render() {
539
- const hasIndividualSlots = this.constructor.getMetadata().hasIndividualSlots();
641
+ const ctor = this.constructor as typeof UI5Element;
642
+ const hasIndividualSlots = ctor.getMetadata().hasIndividualSlots();
540
643
 
541
644
  // suppress invalidation to prevent state changes scheduling another rendering
542
645
  this._suppressInvalidation = true;
543
646
 
544
- if (typeof this.onBeforeRendering === "function") {
545
- this.onBeforeRendering();
546
- }
647
+ this.onBeforeRendering();
547
648
 
548
649
  // Intended for framework usage only. Currently ItemNavigation updates tab indexes after the component has updated its state but before the template is rendered
549
650
  if (this._onComponentStateFinalized) {
@@ -567,7 +668,7 @@ class UI5Element extends HTMLElement {
567
668
  }
568
669
  res = `${res}: ${x.name}`;
569
670
  if (x.type === "property") {
570
- res = `${res} ${x.oldValue} => ${x.newValue}`;
671
+ res = `${res} ${JSON.stringify(x.oldValue)} => ${JSON.stringify(x.newValue)}`;
571
672
  }
572
673
 
573
674
  return res;
@@ -577,7 +678,7 @@ class UI5Element extends HTMLElement {
577
678
  this._changedState = [];
578
679
 
579
680
  // Update shadow root and static area item
580
- if (this.constructor._needsShadowDOM()) {
681
+ if (ctor._needsShadowDOM()) {
581
682
  updateShadowRoot(this);
582
683
  }
583
684
  if (this.staticAreaItem) {
@@ -590,9 +691,7 @@ class UI5Element extends HTMLElement {
590
691
  }
591
692
 
592
693
  // Call the onAfterRendering hook
593
- if (typeof this.onAfterRendering === "function") {
594
- this.onAfterRendering();
595
- }
694
+ this.onAfterRendering();
596
695
  }
597
696
 
598
697
  /**
@@ -601,7 +700,7 @@ class UI5Element extends HTMLElement {
601
700
  _assignIndividualSlotsToChildren() {
602
701
  const domChildren = Array.from(this.children);
603
702
 
604
- domChildren.forEach(child => {
703
+ domChildren.forEach((child: Record<string, any>) => {
605
704
  if (child._individualSlot) {
606
705
  child.setAttribute("slot", child._individualSlot);
607
706
  }
@@ -617,25 +716,27 @@ class UI5Element extends HTMLElement {
617
716
 
618
717
  /**
619
718
  * Returns the DOM Element inside the Shadow Root that corresponds to the opening tag in the UI5 Web Component's template
719
+ * *Note:* For logical (abstract) elements (items, options, etc...), returns the part of the parent's DOM that represents this option
620
720
  * Use this method instead of "this.shadowRoot" to read the Shadow DOM, if ever necessary
721
+ *
621
722
  * @public
622
723
  */
623
724
  getDomRef() {
725
+ // If a component set _getRealDomRef to its children, use the return value of this function
726
+ if (typeof this._getRealDomRef === "function") {
727
+ return this._getRealDomRef();
728
+ }
729
+
624
730
  if (!this.shadowRoot || this.shadowRoot.children.length === 0) {
625
731
  return;
626
732
  }
627
733
 
628
- this._assertShadowRootStructure();
629
-
630
- return this.shadowRoot.children.length === 1
631
- ? this.shadowRoot.children[0] : this.shadowRoot.children[1];
632
- }
633
-
634
- _assertShadowRootStructure() {
635
- const expectedChildrenCount = document.adoptedStyleSheets || isLegacyBrowser() ? 1 : 2;
636
- if (this.shadowRoot.children.length !== expectedChildrenCount) {
637
- console.warn(`The shadow DOM for ${this.constructor.getMetadata().getTag()} does not have a top level element, the getDomRef() method might not work as expected`); // eslint-disable-line
734
+ const children = [...this.shadowRoot.children].filter(child => !["link", "style"].includes(child.localName));
735
+ if (children.length !== 1) {
736
+ console.warn(`The shadow DOM for ${(this.constructor as typeof UI5Element).getMetadata().getTag()} does not have a top level element, the getDomRef() method might not work as expected`); // eslint-disable-line
638
737
  }
738
+
739
+ return children[0] as HTMLElement;
639
740
  }
640
741
 
641
742
  /**
@@ -646,7 +747,7 @@ class UI5Element extends HTMLElement {
646
747
  getFocusDomRef() {
647
748
  const domRef = this.getDomRef();
648
749
  if (domRef) {
649
- const focusRef = domRef.querySelector("[data-sap-focus-ref]");
750
+ const focusRef = domRef.querySelector("[data-sap-focus-ref]") as HTMLElement;
650
751
  return focusRef || domRef;
651
752
  }
652
753
  }
@@ -661,28 +762,18 @@ class UI5Element extends HTMLElement {
661
762
  return this.getFocusDomRef();
662
763
  }
663
764
 
664
- /**
665
- * Use this method in order to get a reference to an element in the shadow root of the web component or the static area item of the component
666
- * @public
667
- * @method
668
- * @param {String} refName Defines the name of the stable DOM ref
669
- */
670
- getStableDomRef(refName) {
671
- const staticAreaResult = this.staticAreaItem && this.staticAreaItem.getStableDomRef(refName);
672
- return staticAreaResult || this.getDomRef().querySelector(`[data-ui5-stable=${refName}]`);
673
- }
674
-
675
765
  /**
676
766
  * Set the focus to the element, returned by "getFocusDomRef()" (marked by "data-sap-focus-ref")
767
+ * @param {FocusOptions} focusOptions additional options for the focus
677
768
  * @public
678
769
  */
679
- async focus() {
770
+ async focus(focusOptions?: FocusOptions) {
680
771
  await this._waitForDomRef();
681
772
 
682
773
  const focusDomRef = this.getFocusDomRef();
683
774
 
684
775
  if (focusDomRef && typeof focusDomRef.focus === "function") {
685
- focusDomRef.focus();
776
+ focusDomRef.focus(focusOptions);
686
777
  }
687
778
  }
688
779
 
@@ -695,7 +786,7 @@ class UI5Element extends HTMLElement {
695
786
  * @param bubbles - true, if the event bubbles
696
787
  * @returns {boolean} false, if the event was cancelled (preventDefault called), true otherwise
697
788
  */
698
- fireEvent(name, data, cancelable = false, bubbles = true) {
789
+ fireEvent<T>(name: string, data?: T, cancelable = false, bubbles = true) {
699
790
  const eventResult = this._fireEvent(name, data, cancelable, bubbles);
700
791
  const camelCaseEventName = kebabToCamelCase(name);
701
792
 
@@ -706,8 +797,8 @@ class UI5Element extends HTMLElement {
706
797
  return eventResult;
707
798
  }
708
799
 
709
- _fireEvent(name, data, cancelable = false, bubbles = true) {
710
- const noConflictEvent = new CustomEvent(`ui5-${name}`, {
800
+ _fireEvent<T>(name: string, data?: T, cancelable = false, bubbles = true) {
801
+ const noConflictEvent = new CustomEvent<T>(`ui5-${name}`, {
711
802
  detail: data,
712
803
  composed: false,
713
804
  bubbles,
@@ -721,7 +812,7 @@ class UI5Element extends HTMLElement {
721
812
  return noConflictEventResult;
722
813
  }
723
814
 
724
- const normalEvent = new CustomEvent(name, {
815
+ const normalEvent = new CustomEvent<T>(name, {
725
816
  detail: data,
726
817
  composed: false,
727
818
  bubbles,
@@ -740,8 +831,8 @@ class UI5Element extends HTMLElement {
740
831
  * Useful when there are transitive slots in nested component scenarios and you don't want to get a list of the slots, but rather of their content.
741
832
  * @public
742
833
  */
743
- getSlottedNodes(slotName) {
744
- return getSlottedElementsList(this[slotName]);
834
+ getSlottedNodes(slotName: string) {
835
+ return getSlottedNodesList((this as unknown as Record<string, Array<SlotValue>>)[slotName]);
745
836
  }
746
837
 
747
838
  /**
@@ -752,7 +843,7 @@ class UI5Element extends HTMLElement {
752
843
  * @returns {String|undefined}
753
844
  */
754
845
  get effectiveDir() {
755
- markAsRtlAware(this.constructor); // if a UI5 Element calls this method, it's considered to be rtl-aware
846
+ markAsRtlAware(this.constructor as typeof UI5Element); // if a UI5 Element calls this method, it's considered to be rtl-aware
756
847
  return getEffectiveDir(this);
757
848
  }
758
849
 
@@ -765,6 +856,10 @@ class UI5Element extends HTMLElement {
765
856
  return true;
766
857
  }
767
858
 
859
+ get classes(): ClassMap {
860
+ return {};
861
+ }
862
+
768
863
  /**
769
864
  * Do not override this method in derivatives of UI5Element, use metadata properties instead
770
865
  * @private
@@ -791,7 +886,7 @@ class UI5Element extends HTMLElement {
791
886
  * @public
792
887
  */
793
888
  getStaticAreaItemDomRef() {
794
- if (!this.constructor._needsStaticArea()) {
889
+ if (!(this.constructor as typeof UI5Element)._needsStaticArea()) {
795
890
  throw new Error("This component does not use the static area");
796
891
  }
797
892
 
@@ -837,7 +932,7 @@ class UI5Element extends HTMLElement {
837
932
  }
838
933
 
839
934
  Object.defineProperty(proto, prop, {
840
- get() {
935
+ get(this: UI5Element) {
841
936
  if (this._state[prop] !== undefined) {
842
937
  return this._state[prop];
843
938
  }
@@ -854,12 +949,24 @@ class UI5Element extends HTMLElement {
854
949
  return propDefaultValue;
855
950
  }
856
951
  },
857
- set(value) {
952
+
953
+ set(this: UI5Element, value: PropertyValue) {
858
954
  let isDifferent;
859
- value = this.constructor.getMetadata().constructor.validatePropertyValue(value, propData);
955
+ const ctor = this.constructor as typeof UI5Element;
956
+ const metadataCtor = ctor.getMetadata().constructor as typeof UI5ElementMetadata;
860
957
 
958
+ value = metadataCtor.validatePropertyValue(value, propData);
959
+ const propertyType = propData.type;
960
+ let propertyValidator = propData.validator as typeof DataType;
861
961
  const oldState = this._state[prop];
862
- if (propData.multiple && propData.compareValues) {
962
+
963
+ if (propertyType && (propertyType as typeof DataType).isDataTypeClass) {
964
+ propertyValidator = propertyType as typeof DataType;
965
+ }
966
+
967
+ if (propertyValidator) {
968
+ isDifferent = !propertyValidator.valuesAreEqual(oldState, value);
969
+ } else if (Array.isArray(oldState) && Array.isArray(value) && propData.multiple && propData.compareValues) { // compareValues is added for IE, test if needed now
863
970
  isDifferent = !arraysAreEqual(oldState, value);
864
971
  } else {
865
972
  isDifferent = oldState !== value;
@@ -889,7 +996,7 @@ class UI5Element extends HTMLElement {
889
996
 
890
997
  const propertyName = slotData.propertyName || slotName;
891
998
  Object.defineProperty(proto, propertyName, {
892
- get() {
999
+ get(this: UI5Element) {
893
1000
  if (this._state[propertyName] !== undefined) {
894
1001
  return this._state[propertyName];
895
1002
  }
@@ -908,14 +1015,22 @@ class UI5Element extends HTMLElement {
908
1015
  * @protected
909
1016
  */
910
1017
  static get metadata() {
911
- return {};
1018
+ return metadata;
1019
+ }
1020
+
1021
+ /**
1022
+ * Sets a new metadata object for this UI5 Web Component Class
1023
+ * @protected
1024
+ */
1025
+ static set metadata(newMetadata) {
1026
+ metadata = newMetadata;
912
1027
  }
913
1028
 
914
1029
  /**
915
1030
  * Returns the CSS for this UI5 Web Component Class
916
1031
  * @protected
917
1032
  */
918
- static get styles() {
1033
+ static get styles(): ComponentStylesData {
919
1034
  return "";
920
1035
  }
921
1036
 
@@ -923,7 +1038,7 @@ class UI5Element extends HTMLElement {
923
1038
  * Returns the Static Area CSS for this UI5 Web Component Class
924
1039
  * @protected
925
1040
  */
926
- static get staticAreaStyles() {
1041
+ static get staticAreaStyles(): ComponentStylesData {
927
1042
  return "";
928
1043
  }
929
1044
 
@@ -934,7 +1049,7 @@ class UI5Element extends HTMLElement {
934
1049
  *
935
1050
  * @protected
936
1051
  */
937
- static get dependencies() {
1052
+ static get dependencies(): Array<typeof UI5Element> {
938
1053
  return [];
939
1054
  }
940
1055
 
@@ -943,21 +1058,21 @@ class UI5Element extends HTMLElement {
943
1058
  *
944
1059
  * @public
945
1060
  */
946
- static getUniqueDependencies() {
1061
+ static getUniqueDependencies(this: typeof UI5Element) {
947
1062
  if (!uniqueDependenciesCache.has(this)) {
948
1063
  const filtered = this.dependencies.filter((dep, index, deps) => deps.indexOf(dep) === index);
949
1064
  uniqueDependenciesCache.set(this, filtered);
950
1065
  }
951
1066
 
952
- return uniqueDependenciesCache.get(this);
1067
+ return uniqueDependenciesCache.get(this) || [];
953
1068
  }
954
1069
 
955
1070
  /**
956
1071
  * Returns a promise that resolves whenever all dependencies for this UI5 Web Component have resolved
957
1072
  *
958
- * @returns {Promise<any[]>}
1073
+ * @returns {Promise}
959
1074
  */
960
- static whenDependenciesDefined() {
1075
+ static whenDependenciesDefined(): Promise<Array<typeof UI5Element>> {
961
1076
  return Promise.all(this.getUniqueDependencies().map(dep => dep.define()));
962
1077
  }
963
1078
 
@@ -985,7 +1100,6 @@ class UI5Element extends HTMLElement {
985
1100
  ]);
986
1101
 
987
1102
  const tag = this.getMetadata().getTag();
988
- const altTag = this.getMetadata().getAltTag();
989
1103
 
990
1104
  const definedLocally = isTagRegistered(tag);
991
1105
  const definedGlobally = customElements.get(tag);
@@ -995,14 +1109,8 @@ class UI5Element extends HTMLElement {
995
1109
  } else if (!definedGlobally) {
996
1110
  this._generateAccessors();
997
1111
  registerTag(tag);
998
- window.customElements.define(tag, this);
999
-
1000
- if (altTag && !customElements.get(altTag)) {
1001
- registerTag(altTag);
1002
- window.customElements.define(altTag, getClassCopy(this, () => {
1003
- console.log(`The ${altTag} tag is deprecated and will be removed in the next release, please use ${tag} instead.`); // eslint-disable-line
1004
- }));
1005
- }
1112
+ window.customElements.define(tag, this as unknown as CustomElementConstructor);
1113
+ preloadLinks(this);
1006
1114
  }
1007
1115
  return this;
1008
1116
  }
@@ -1018,17 +1126,31 @@ class UI5Element extends HTMLElement {
1018
1126
  return this._metadata;
1019
1127
  }
1020
1128
 
1021
- const metadataObjects = [this.metadata];
1129
+ const effectiveMetadata = Object.keys(this.metadata).length ? this.metadata : this.decoratorMetadata;
1130
+ const metadataObjects = [effectiveMetadata];
1022
1131
  let klass = this; // eslint-disable-line
1023
1132
  while (klass !== UI5Element) {
1024
1133
  klass = Object.getPrototypeOf(klass);
1025
- metadataObjects.unshift(klass.metadata);
1134
+ const effectiveKlassMetadata = Object.keys(klass.metadata).length ? klass.metadata : klass.decoratorMetadata;
1135
+ metadataObjects.unshift(effectiveKlassMetadata);
1026
1136
  }
1027
- const mergedMetadata = merge({}, ...metadataObjects);
1137
+ const mergedMetadata = merge({}, ...metadataObjects) as Metadata;
1028
1138
 
1029
1139
  this._metadata = new UI5ElementMetadata(mergedMetadata);
1030
1140
  return this._metadata;
1031
1141
  }
1142
+
1143
+ static decoratorMetadata: Metadata = {};
1032
1144
  }
1033
1145
 
1146
+ /**
1147
+ * Always use duck-typing to cover all runtimes on the page.
1148
+ * @returns {boolean}
1149
+ */
1150
+ const instanceOfUI5Element = (object: any): object is UI5Element => {
1151
+ return "isUI5Element" in object;
1152
+ };
1153
+
1034
1154
  export default UI5Element;
1155
+ export { instanceOfUI5Element };
1156
+ export type { ChangeInfo };