@ui5/webcomponents-base 0.0.0-8db0ce01a → 0.0.0-918b4fbe7

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