@ui5/webcomponents-base 0.0.0-2c7615fe9 → 0.0.0-2f7664755

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