@ui5/webcomponents-base 0.0.0-0a074c90e → 0.0.0-111ecd79a

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