@ui5/webcomponents-base 0.0.0-e818f286e → 0.0.0-ee3bbe46b

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