@ui5/webcomponents-base 0.0.0-a3eca7ade → 0.0.0-a7032d86e

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