@ui5/webcomponents-base 0.0.0-306572ffa → 0.0.0-35e2c9666

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 (328) hide show
  1. package/.eslintignore +3 -0
  2. package/CHANGELOG.md +242 -0
  3. package/README.md +26 -2
  4. package/bundle.esm.js +13 -11
  5. package/dist/AssetRegistry.js +8 -7
  6. package/dist/Boot.js +59 -0
  7. package/dist/CSP.js +59 -0
  8. package/dist/CustomElementsRegistry.js +60 -4
  9. package/dist/DOMObserver.js +65 -0
  10. package/dist/Device.js +69 -776
  11. package/dist/EventProvider.js +30 -26
  12. package/dist/FeaturesRegistry.js +4 -1
  13. package/dist/FontFace.js +19 -62
  14. package/dist/InitialConfiguration.js +43 -8
  15. package/dist/Keys.js +107 -0
  16. package/dist/ManagedStyles.js +83 -0
  17. package/dist/MediaRange.js +109 -0
  18. package/{src/util/parseProperties.js → dist/PropertiesFileFormat.js} +6 -0
  19. package/dist/Render.js +175 -0
  20. package/dist/RenderScheduler.js +16 -138
  21. package/dist/Runtimes.js +107 -0
  22. package/dist/StaticArea.js +1 -29
  23. package/dist/StaticAreaItem.js +58 -65
  24. package/dist/SystemCSSVars.js +4 -25
  25. package/dist/Theming.js +2 -1
  26. package/dist/UI5Element.js +310 -365
  27. package/dist/UI5ElementMetadata.js +131 -16
  28. package/dist/asset-registries/Icons.js +121 -13
  29. package/dist/asset-registries/Illustrations.js +30 -0
  30. package/dist/asset-registries/LocaleData.js +105 -66
  31. package/dist/asset-registries/Themes.js +23 -32
  32. package/dist/asset-registries/i18n.js +62 -48
  33. package/dist/assets-meta/IconCollectionsAlias.js +18 -0
  34. package/dist/config/Language.js +33 -6
  35. package/dist/config/Theme.js +25 -0
  36. package/dist/css/FontFace.css +45 -0
  37. package/dist/css/OverrideFontFace.css +32 -0
  38. package/dist/css/SystemCSSVars.css +17 -0
  39. package/dist/delegate/ItemNavigation.js +239 -170
  40. package/dist/delegate/ResizeHandler.js +78 -37
  41. package/dist/delegate/ScrollEnablement.js +49 -20
  42. package/dist/features/F6Navigation.js +108 -0
  43. package/dist/features/OpenUI5Support.js +41 -6
  44. package/dist/generated/AssetParameters.js +1 -1
  45. package/dist/generated/VersionInfo.js +10 -0
  46. package/dist/generated/css/FontFace.css.js +5 -0
  47. package/dist/generated/css/OverrideFontFace.css.js +5 -0
  48. package/dist/generated/css/SystemCSSVars.css.js +5 -0
  49. package/dist/i18nBundle.js +38 -4
  50. package/dist/isLegacyBrowser.js +3 -0
  51. package/dist/locale/applyDirection.js +6 -4
  52. package/dist/locale/directionChange.js +32 -0
  53. package/dist/locale/getEffectiveDir.js +28 -0
  54. package/dist/locale/getLocale.js +12 -2
  55. package/dist/locale/languageChange.js +1 -1
  56. package/dist/renderer/LitRenderer.js +24 -21
  57. package/dist/renderer/directives/style-map.js +72 -0
  58. package/dist/resources/bundle.esm.js +17 -109
  59. package/dist/resources/bundle.esm.js.map +1 -1
  60. package/dist/sap/base/Log.js +241 -0
  61. package/dist/sap/base/assert.js +8 -0
  62. package/dist/sap/base/security/URLListValidator.js +148 -0
  63. package/dist/sap/base/security/encodeCSS.js +14 -0
  64. package/dist/sap/base/security/encodeXML.js +23 -0
  65. package/dist/sap/base/security/sanitizeHTML.js +16 -0
  66. package/dist/sap/base/strings/toHex.js +8 -0
  67. package/dist/sap/base/util/now.js +7 -0
  68. package/dist/sap/ui/thirdparty/caja-html-sanitizer.js +3585 -0
  69. package/dist/test-resources/assets/Themes.js +8 -8
  70. package/dist/test-resources/elements/Parent.js +6 -2
  71. package/dist/test-resources/elements/WithStaticArea.js +2 -1
  72. package/dist/test-resources/pages/AllTestElements.html +3 -3
  73. package/dist/test-resources/pages/Configuration.html +0 -2
  74. package/dist/test-resources/pages/ConfigurationScript.html +0 -2
  75. package/dist/test-resources/pages/i18n.html +2 -9
  76. package/dist/test-resources/specs/ConfigurationChange.spec.js +10 -8
  77. package/dist/test-resources/specs/ConfigurationScript.spec.js +25 -23
  78. package/dist/test-resources/specs/ConfigurationURL.spec.js +65 -17
  79. package/dist/test-resources/specs/CustomTheme.spec.js +9 -7
  80. package/dist/test-resources/specs/EventProvider.spec.js +63 -0
  81. package/dist/test-resources/specs/StaticArea.spec.js +56 -12
  82. package/dist/test-resources/specs/Theming.spec.js +12 -10
  83. package/dist/test-resources/specs/UI5ElementInvalidation.js +54 -70
  84. package/dist/test-resources/specs/UI5ElementLifecycle.js +17 -15
  85. package/dist/test-resources/specs/UI5ElementListenForChildPropChanges.spec.js +25 -51
  86. package/dist/test-resources/specs/UI5ElementMetadataExt.js +9 -7
  87. package/dist/test-resources/specs/UI5ElementPropertyValidation.js +7 -5
  88. package/dist/test-resources/specs/UI5ElementPropsAndAttrs.spec.js +37 -35
  89. package/dist/test-resources/specs/UI5ElementShadowDOM.js +10 -8
  90. package/dist/test-resources/specs/UI5ElementSlots.js +10 -8
  91. package/dist/theming/CustomStyle.js +25 -5
  92. package/dist/theming/ThemeLoaded.js +22 -0
  93. package/dist/theming/applyTheme.js +13 -15
  94. package/dist/theming/getConstructableStyle.js +7 -6
  95. package/dist/theming/getEffectiveLinksHrefs.js +20 -0
  96. package/dist/theming/getEffectiveStyle.js +15 -8
  97. package/dist/theming/getStylesString.js +4 -2
  98. package/dist/theming/getThemeDesignerTheme.js +25 -5
  99. package/dist/theming/preloadLinks.js +23 -0
  100. package/dist/types/CSSColor.js +9 -0
  101. package/dist/types/CalendarType.js +1 -1
  102. package/dist/types/DataType.js +13 -1
  103. package/dist/types/Float.js +4 -0
  104. package/dist/types/Integer.js +4 -0
  105. package/dist/types/InvisibleMessageMode.js +30 -0
  106. package/dist/types/ItemNavigationBehavior.js +2 -7
  107. package/dist/types/PopupState.js +1 -1
  108. package/dist/types/ValueState.js +1 -1
  109. package/dist/updateShadowRoot.js +30 -0
  110. package/dist/util/AriaLabelHelper.js +41 -0
  111. package/dist/util/Caret.js +45 -0
  112. package/dist/util/ColorConversion.js +370 -0
  113. package/dist/util/FocusableElements.js +22 -9
  114. package/dist/util/HTMLSanitizer.js +7 -0
  115. package/dist/util/InvisibleMessage.js +60 -0
  116. package/dist/util/PopupUtils.js +93 -0
  117. package/dist/util/SlotsHelper.js +43 -0
  118. package/dist/util/TabbableElements.js +5 -1
  119. package/dist/util/arraysAreEqual.js +15 -0
  120. package/dist/util/clamp.js +12 -0
  121. package/dist/util/createLinkInHead.js +19 -0
  122. package/dist/util/debounce.js +17 -0
  123. package/dist/util/escapeRegex.js +10 -0
  124. package/dist/util/generateHighlightedMarkup.js +42 -0
  125. package/dist/util/getActiveElement.js +11 -0
  126. package/dist/util/getClassCopy.js +10 -0
  127. package/dist/util/getEffectiveContentDensity.js +5 -0
  128. package/dist/util/isElementInView.js +15 -0
  129. package/dist/util/isNodeHidden.js +1 -1
  130. package/dist/util/isNodeTabbable.js +4 -4
  131. package/dist/util/isValidPropertyName.js +4 -2
  132. package/hash.txt +1 -0
  133. package/index.js +1 -1
  134. package/lib/generate-asset-parameters/index.js +0 -1
  135. package/lib/generate-styles/index.js +18 -0
  136. package/lib/generate-version-info/index.js +27 -0
  137. package/package-scripts.js +34 -19
  138. package/package.json +19 -13
  139. package/src/AssetRegistry.js +8 -7
  140. package/src/Boot.js +59 -0
  141. package/src/CSP.js +59 -0
  142. package/src/CustomElementsRegistry.js +60 -4
  143. package/src/DOMObserver.js +65 -0
  144. package/src/Device.js +69 -776
  145. package/src/EventProvider.js +30 -26
  146. package/src/FeaturesRegistry.js +4 -1
  147. package/src/FontFace.js +19 -62
  148. package/src/InitialConfiguration.js +43 -8
  149. package/src/Keys.js +107 -0
  150. package/src/ManagedStyles.js +83 -0
  151. package/src/MediaRange.js +109 -0
  152. package/{dist/util/parseProperties.js → src/PropertiesFileFormat.js} +6 -0
  153. package/src/Render.js +175 -0
  154. package/src/RenderScheduler.js +16 -138
  155. package/src/Runtimes.js +107 -0
  156. package/src/StaticArea.js +1 -29
  157. package/src/StaticAreaItem.js +58 -65
  158. package/src/SystemCSSVars.js +4 -25
  159. package/src/Theming.js +2 -1
  160. package/src/UI5Element.js +310 -365
  161. package/src/UI5ElementMetadata.js +131 -16
  162. package/src/asset-registries/Icons.js +121 -13
  163. package/src/asset-registries/Illustrations.js +30 -0
  164. package/src/asset-registries/LocaleData.js +105 -66
  165. package/src/asset-registries/Themes.js +23 -32
  166. package/src/asset-registries/i18n.js +62 -48
  167. package/src/assets-meta/IconCollectionsAlias.js +18 -0
  168. package/src/config/Language.js +33 -6
  169. package/src/config/Theme.js +25 -0
  170. package/src/css/FontFace.css +45 -0
  171. package/src/css/OverrideFontFace.css +32 -0
  172. package/src/css/SystemCSSVars.css +17 -0
  173. package/src/delegate/ItemNavigation.js +239 -170
  174. package/src/delegate/ResizeHandler.js +78 -37
  175. package/src/delegate/ScrollEnablement.js +49 -20
  176. package/src/features/F6Navigation.js +108 -0
  177. package/src/features/OpenUI5Support.js +41 -6
  178. package/src/i18nBundle.js +38 -4
  179. package/src/isLegacyBrowser.js +3 -0
  180. package/src/locale/applyDirection.js +6 -4
  181. package/src/locale/directionChange.js +32 -0
  182. package/src/locale/getEffectiveDir.js +28 -0
  183. package/src/locale/getLocale.js +12 -2
  184. package/src/locale/languageChange.js +1 -1
  185. package/src/renderer/LitRenderer.js +24 -21
  186. package/src/renderer/directives/style-map.js +72 -0
  187. package/src/theming/CustomStyle.js +25 -5
  188. package/src/theming/ThemeLoaded.js +22 -0
  189. package/src/theming/applyTheme.js +13 -15
  190. package/src/theming/getConstructableStyle.js +7 -6
  191. package/src/theming/getEffectiveLinksHrefs.js +20 -0
  192. package/src/theming/getEffectiveStyle.js +15 -8
  193. package/src/theming/getStylesString.js +4 -2
  194. package/src/theming/getThemeDesignerTheme.js +25 -5
  195. package/src/theming/preloadLinks.js +23 -0
  196. package/src/types/CSSColor.js +9 -0
  197. package/src/types/CalendarType.js +1 -1
  198. package/src/types/DataType.js +13 -1
  199. package/src/types/Float.js +4 -0
  200. package/src/types/Integer.js +4 -0
  201. package/src/types/InvisibleMessageMode.js +30 -0
  202. package/src/types/ItemNavigationBehavior.js +2 -7
  203. package/src/types/PopupState.js +1 -1
  204. package/src/types/ValueState.js +1 -1
  205. package/src/updateShadowRoot.js +30 -0
  206. package/src/util/AriaLabelHelper.js +41 -0
  207. package/src/util/Caret.js +45 -0
  208. package/src/util/ColorConversion.js +370 -0
  209. package/src/util/FocusableElements.js +22 -9
  210. package/src/util/HTMLSanitizer.js +7 -0
  211. package/src/util/InvisibleMessage.js +60 -0
  212. package/src/util/PopupUtils.js +93 -0
  213. package/src/util/SlotsHelper.js +43 -0
  214. package/src/util/TabbableElements.js +5 -1
  215. package/src/util/arraysAreEqual.js +15 -0
  216. package/src/util/clamp.js +12 -0
  217. package/src/util/createLinkInHead.js +19 -0
  218. package/src/util/debounce.js +17 -0
  219. package/src/util/escapeRegex.js +10 -0
  220. package/src/util/generateHighlightedMarkup.js +42 -0
  221. package/src/util/getActiveElement.js +11 -0
  222. package/src/util/getClassCopy.js +10 -0
  223. package/src/util/getEffectiveContentDensity.js +5 -0
  224. package/src/util/isElementInView.js +15 -0
  225. package/src/util/isNodeHidden.js +1 -1
  226. package/src/util/isNodeTabbable.js +4 -4
  227. package/src/util/isValidPropertyName.js +4 -2
  228. package/used-modules.txt +10 -0
  229. package/bundle.es5.js +0 -28
  230. package/dist/SVGIconRegistry.js +0 -62
  231. package/dist/boot.js +0 -34
  232. package/dist/compatibility/DOMObserver.js +0 -62
  233. package/dist/compatibility/patchNodeValue.js +0 -24
  234. package/dist/compatibility/whenPolyfillLoaded.js +0 -26
  235. package/dist/delegate/CustomResize.js +0 -78
  236. package/dist/delegate/NativeResize.js +0 -44
  237. package/dist/features/PropertiesFormatSupport.js +0 -8
  238. package/dist/features/browsersupport/Edge.js +0 -6
  239. package/dist/features/browsersupport/IE11.js +0 -41
  240. package/dist/features/browsersupport/IE11WithWebComponentsPolyfill.js +0 -5
  241. package/dist/renderer/ifDefined.js +0 -21
  242. package/dist/renderer/scopeHTML.js +0 -32
  243. package/dist/resources/bundle.es5.js +0 -212
  244. package/dist/resources/bundle.es5.js.map +0 -1
  245. package/dist/theming/CSSVarsPonyfill.js +0 -24
  246. package/dist/theming/adaptCSSForIE.js +0 -95
  247. package/dist/theming/createComponentStyleTag.js +0 -55
  248. package/dist/theming/createThemePropertiesStyleTag.js +0 -20
  249. package/dist/thirdparty/Array.from.js +0 -16
  250. package/dist/thirdparty/Array.prototype.fill.js +0 -44
  251. package/dist/thirdparty/Array.prototype.find.js +0 -46
  252. package/dist/thirdparty/Array.prototype.includes.js +0 -51
  253. package/dist/thirdparty/Element.prototype.closest.js +0 -11
  254. package/dist/thirdparty/Element.prototype.matches.js +0 -6
  255. package/dist/thirdparty/Map.prototype.keys.js +0 -9
  256. package/dist/thirdparty/Number.isInteger.js +0 -5
  257. package/dist/thirdparty/Number.isNaN.js +0 -1
  258. package/dist/thirdparty/Number.parseInt.js +0 -1
  259. package/dist/thirdparty/Object.assign.js +0 -31
  260. package/dist/thirdparty/Object.entries.js +0 -11
  261. package/dist/thirdparty/Symbol.js +0 -2
  262. package/dist/thirdparty/WeakSet.js +0 -27
  263. package/dist/thirdparty/es6-string-methods.js +0 -182
  264. package/dist/thirdparty/events-polyfills.js +0 -89
  265. package/dist/thirdparty/fetch.js +0 -1
  266. package/dist/thirdparty/template.js +0 -600
  267. package/dist/thirdparty/webcomponents-sd-ce-pf.js +0 -318
  268. package/dist/util/getEffectiveAriaLabelText.js +0 -28
  269. package/dist/util/isSlot.js +0 -3
  270. package/dist/webcomponentsjs/LICENSE.md +0 -19
  271. package/dist/webcomponentsjs/README.md +0 -229
  272. package/dist/webcomponentsjs/bundles/webcomponents-ce.js +0 -63
  273. package/dist/webcomponentsjs/bundles/webcomponents-ce.js.map +0 -1
  274. package/dist/webcomponentsjs/bundles/webcomponents-sd-ce-pf.js +0 -297
  275. package/dist/webcomponentsjs/bundles/webcomponents-sd-ce-pf.js.map +0 -1
  276. package/dist/webcomponentsjs/bundles/webcomponents-sd-ce.js +0 -208
  277. package/dist/webcomponentsjs/bundles/webcomponents-sd-ce.js.map +0 -1
  278. package/dist/webcomponentsjs/bundles/webcomponents-sd.js +0 -166
  279. package/dist/webcomponentsjs/bundles/webcomponents-sd.js.map +0 -1
  280. package/dist/webcomponentsjs/custom-elements-es5-adapter.js +0 -15
  281. package/dist/webcomponentsjs/package.json +0 -46
  282. package/dist/webcomponentsjs/src/entrypoints/custom-elements-es5-adapter-index.js +0 -16
  283. package/dist/webcomponentsjs/src/entrypoints/webcomponents-bundle-index.js +0 -53
  284. package/dist/webcomponentsjs/src/entrypoints/webcomponents-ce-index.js +0 -17
  285. package/dist/webcomponentsjs/src/entrypoints/webcomponents-sd-ce-index.js +0 -19
  286. package/dist/webcomponentsjs/src/entrypoints/webcomponents-sd-ce-pf-index.js +0 -28
  287. package/dist/webcomponentsjs/src/entrypoints/webcomponents-sd-index.js +0 -18
  288. package/dist/webcomponentsjs/webcomponents-bundle.js +0 -298
  289. package/dist/webcomponentsjs/webcomponents-bundle.js.map +0 -1
  290. package/dist/webcomponentsjs/webcomponents-loader.js +0 -185
  291. package/src/SVGIconRegistry.js +0 -62
  292. package/src/boot.js +0 -34
  293. package/src/compatibility/DOMObserver.js +0 -62
  294. package/src/compatibility/patchNodeValue.js +0 -24
  295. package/src/compatibility/whenPolyfillLoaded.js +0 -26
  296. package/src/delegate/CustomResize.js +0 -78
  297. package/src/delegate/NativeResize.js +0 -44
  298. package/src/features/PropertiesFormatSupport.js +0 -8
  299. package/src/features/browsersupport/Edge.js +0 -6
  300. package/src/features/browsersupport/IE11.js +0 -41
  301. package/src/features/browsersupport/IE11WithWebComponentsPolyfill.js +0 -5
  302. package/src/renderer/ifDefined.js +0 -21
  303. package/src/renderer/scopeHTML.js +0 -32
  304. package/src/theming/CSSVarsPonyfill.js +0 -24
  305. package/src/theming/adaptCSSForIE.js +0 -95
  306. package/src/theming/createComponentStyleTag.js +0 -55
  307. package/src/theming/createThemePropertiesStyleTag.js +0 -20
  308. package/src/thirdparty/Array.from.js +0 -16
  309. package/src/thirdparty/Array.prototype.fill.js +0 -44
  310. package/src/thirdparty/Array.prototype.find.js +0 -46
  311. package/src/thirdparty/Array.prototype.includes.js +0 -51
  312. package/src/thirdparty/Element.prototype.closest.js +0 -11
  313. package/src/thirdparty/Element.prototype.matches.js +0 -6
  314. package/src/thirdparty/Map.prototype.keys.js +0 -9
  315. package/src/thirdparty/Number.isInteger.js +0 -5
  316. package/src/thirdparty/Number.isNaN.js +0 -1
  317. package/src/thirdparty/Number.parseInt.js +0 -1
  318. package/src/thirdparty/Object.assign.js +0 -31
  319. package/src/thirdparty/Object.entries.js +0 -11
  320. package/src/thirdparty/Symbol.js +0 -2
  321. package/src/thirdparty/WeakSet.js +0 -27
  322. package/src/thirdparty/es6-string-methods.js +0 -182
  323. package/src/thirdparty/events-polyfills.js +0 -89
  324. package/src/thirdparty/fetch.js +0 -1
  325. package/src/thirdparty/template.js +0 -600
  326. package/src/thirdparty/webcomponents-sd-ce-pf.js +0 -318
  327. package/src/util/getEffectiveAriaLabelText.js +0 -28
  328. package/src/util/isSlot.js +0 -3
@@ -0,0 +1,93 @@
1
+ import getSharedResource from "../getSharedResource.js";
2
+ import { getFeature } from "../FeaturesRegistry.js";
3
+ import getActiveElement from "./getActiveElement.js";
4
+
5
+ const PopupUtilsData = getSharedResource("PopupUtilsData", {});
6
+ PopupUtilsData.currentZIndex = PopupUtilsData.currentZIndex || 100;
7
+
8
+ const getFocusedElement = () => {
9
+ const element = getActiveElement();
10
+ return (element && typeof element.focus === "function") ? element : null;
11
+ };
12
+
13
+ const isFocusedElementWithinNode = node => {
14
+ const fe = getFocusedElement();
15
+
16
+ if (fe) {
17
+ return isNodeContainedWithin(node, fe);
18
+ }
19
+
20
+ return false;
21
+ };
22
+
23
+ const isNodeContainedWithin = (parent, child) => {
24
+ let currentNode = parent;
25
+
26
+ if (currentNode.shadowRoot) {
27
+ currentNode = Array.from(currentNode.shadowRoot.children).find(n => n.localName !== "style");
28
+ }
29
+
30
+ if (currentNode === child) {
31
+ return true;
32
+ }
33
+
34
+ const childNodes = currentNode.localName === "slot" ? currentNode.assignedNodes() : currentNode.children;
35
+
36
+ if (childNodes) {
37
+ return Array.from(childNodes).some(n => isNodeContainedWithin(n, child));
38
+ }
39
+ };
40
+
41
+ const isPointInRect = (x, y, rect) => {
42
+ return x >= rect.left && x <= rect.right
43
+ && y >= rect.top && y <= rect.bottom;
44
+ };
45
+
46
+ const isClickInRect = (event, rect) => {
47
+ let x;
48
+ let y;
49
+
50
+ if (event.touches) {
51
+ const touch = event.touches[0];
52
+ x = touch.clientX;
53
+ y = touch.clientY;
54
+ } else {
55
+ x = event.clientX;
56
+ y = event.clientY;
57
+ }
58
+
59
+ return isPointInRect(x, y, rect);
60
+ };
61
+
62
+ const getClosedPopupParent = el => {
63
+ const parent = el.parentElement || (el.getRootNode && el.getRootNode().host);
64
+
65
+ if (parent && ((parent.showAt && parent.isUI5Element) || (parent.open && parent.isUI5Element) || parent === document.documentElement)) {
66
+ return parent;
67
+ }
68
+
69
+ return getClosedPopupParent(parent);
70
+ };
71
+
72
+ const getNextZIndex = () => {
73
+ const OpenUI5Support = getFeature("OpenUI5Support");
74
+ if (OpenUI5Support && OpenUI5Support.isLoaded()) { // use OpenUI5 for getting z-index values, if loaded
75
+ return OpenUI5Support.getNextZIndex();
76
+ }
77
+
78
+ PopupUtilsData.currentZIndex += 2;
79
+ return PopupUtilsData.currentZIndex;
80
+ };
81
+
82
+ const getCurrentZIndex = () => {
83
+ return PopupUtilsData.currentZIndex;
84
+ };
85
+
86
+ export {
87
+ getFocusedElement,
88
+ isClickInRect,
89
+ getClosedPopupParent,
90
+ getNextZIndex,
91
+ getCurrentZIndex,
92
+ isFocusedElementWithinNode,
93
+ };
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Determines the slot to which a node should be assigned
3
+ * @param node Text node or HTML element
4
+ * @returns {string}
5
+ */
6
+ const getSlotName = node => {
7
+ // Text nodes can only go to the default slot
8
+ if (!(node instanceof HTMLElement)) {
9
+ return "default";
10
+ }
11
+
12
+ // Discover the slot based on the real slot name (f.e. footer => footer, or content-32 => content)
13
+ const slot = node.getAttribute("slot");
14
+ if (slot) {
15
+ const match = slot.match(/^(.+?)-\d+$/);
16
+ return match ? match[1] : slot;
17
+ }
18
+
19
+ // Use default slot as a fallback
20
+ return "default";
21
+ };
22
+
23
+ const isSlot = el => el && el instanceof HTMLElement && el.localName === "slot";
24
+
25
+ const getSlottedElements = el => {
26
+ if (isSlot(el)) {
27
+ return el.assignedNodes({ flatten: true }).filter(item => item instanceof HTMLElement);
28
+ }
29
+
30
+ return [el];
31
+ };
32
+
33
+ const getSlottedElementsList = elList => {
34
+ const reducer = (acc, curr) => acc.concat(getSlottedElements(curr));
35
+ return elList.reduce(reducer, []);
36
+ };
37
+
38
+ export {
39
+ getSlotName,
40
+ isSlot,
41
+ getSlottedElements,
42
+ getSlottedElementsList,
43
+ };
@@ -17,7 +17,7 @@ const getTabbables = (nodes, tabbables) => {
17
17
  }
18
18
 
19
19
  Array.from(nodes).forEach(currentNode => {
20
- if (currentNode.nodeType === Node.TEXT_NODE || currentNode.nodeType === Node.COMMENT_NODE) {
20
+ if (currentNode.nodeType === Node.TEXT_NODE || currentNode.nodeType === Node.COMMENT_NODE || currentNode.hasAttribute("data-sap-no-tab-ref")) {
21
21
  return;
22
22
  }
23
23
 
@@ -27,6 +27,10 @@ const getTabbables = (nodes, tabbables) => {
27
27
  currentNode = Array.from(children).find(node => node.tagName !== "STYLE");
28
28
  }
29
29
 
30
+ if (!currentNode) {
31
+ return;
32
+ }
33
+
30
34
  if (isNodeTabbable(currentNode)) {
31
35
  tabbablesNodes.push(currentNode);
32
36
  }
@@ -0,0 +1,15 @@
1
+ const arraysAreEqual = (arr1, arr2) => {
2
+ if (arr1.length !== arr2.length) {
3
+ return false;
4
+ }
5
+
6
+ for (let i = 0; i < arr1.length; i++) {
7
+ if (arr1[i] !== arr2[i]) {
8
+ return false;
9
+ }
10
+ }
11
+
12
+ return true;
13
+ };
14
+
15
+ export default arraysAreEqual;
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Returns a value clamped between an upper bound 'max' and lower bound 'min'.
3
+ * @param {number} val value
4
+ * @param {number} min lower bound
5
+ * @param {number} max upper bound
6
+ * @returns {number}
7
+ */
8
+ const clamp = (val, min, max) => {
9
+ return Math.min(Math.max(val, min), max);
10
+ };
11
+
12
+ export default clamp;
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Creates a <link> tag in the <head> tag
3
+ * @param href - the CSS
4
+ * @param attributes - optional attributes to add to the tag
5
+ * @returns {HTMLElement}
6
+ */
7
+ const createLinkInHead = (href, attributes = {}) => {
8
+ const link = document.createElement("link");
9
+ link.type = "text/css";
10
+ link.rel = "stylesheet";
11
+
12
+ Object.entries(attributes).forEach(pair => link.setAttribute(...pair));
13
+
14
+ link.href = href;
15
+ document.head.appendChild(link);
16
+ return link;
17
+ };
18
+
19
+ export default createLinkInHead;
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Delays function execution by given threshold.
3
+ * @param fn {Function}
4
+ * @param delay {Integer}
5
+ */
6
+
7
+ let debounceInterval = null;
8
+
9
+ const debounce = (fn, delay) => {
10
+ clearTimeout(debounceInterval);
11
+ debounceInterval = setTimeout(() => {
12
+ debounceInterval = null;
13
+ fn();
14
+ }, delay);
15
+ };
16
+
17
+ export default debounce;
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Escape a regular expression text so that it can be used in a regular expression.
3
+ * @param {string} text The string to be interpreted literally
4
+ * @returns Regular expression string to pass to regex
5
+ */
6
+ function escapeRegex(text) {
7
+ return text.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
8
+ }
9
+
10
+ export default escapeRegex;
@@ -0,0 +1,42 @@
1
+ import escapeRegex from "./escapeRegex.js";
2
+ import encodeXML from "../sap/base/security/encodeXML.js";
3
+
4
+ // utility to replace all occurances of a string
5
+ function replaceAll(text, find, replace, caseInsensitive) {
6
+ return text.replace(new RegExp(escapeRegex(find), `${caseInsensitive ? "i" : ""}g`), replace);
7
+ }
8
+
9
+ /**
10
+ * Generate markup for a raw string where a particular text is wrapped with some tag, by default `<b>` (bold) tag.
11
+ * All inputs to this function are considered literal text, and special characters will always be escaped.
12
+ * @param {string} text The text to add highlighting to
13
+ * @param {string} textToHighlight The text which should be highlighted
14
+ * @return {string} the markup HTML which contains all occurrances of the input text surrounded with a `<b>` tag.
15
+ */
16
+ function generateHighlightedMarkup(text, textToHighlight) {
17
+ if (!text || !textToHighlight) {
18
+ return text;
19
+ }
20
+ // a token is some string that does not appear in either of the input strings
21
+ // repeat the token until it does not appear in the string
22
+ const makeToken = t => {
23
+ const [s, e] = t.split("");
24
+ while (text.indexOf(t) >= 0 || textToHighlight.indexOf(t) >= 0) {
25
+ t = `${s}${t}${e}`;
26
+ }
27
+ return t;
28
+ };
29
+ // It doesn't matter what characters are used as long as all 4 of them are unique
30
+ // And also that encodeXML will not change these characters
31
+ const openToken = makeToken("12");
32
+ const closeToken = makeToken("34");
33
+ // wrap every occurance of the textToHighlight using the open/close tokens (instead of markup at this point)
34
+ let result = encodeXML(replaceAll(text, textToHighlight, match => `${openToken}${match}${closeToken}`, true));
35
+ // now replace the open and close tokens with the markup that we expect
36
+ [[openToken, "<b>"], [closeToken, "</b>"]].forEach(([find, replace]) => {
37
+ result = replaceAll(result, find, replace);
38
+ });
39
+ return result;
40
+ }
41
+
42
+ export default generateHighlightedMarkup;
@@ -0,0 +1,11 @@
1
+ const getActiveElement = () => {
2
+ let element = document.activeElement;
3
+
4
+ while (element && element.shadowRoot && element.shadowRoot.activeElement) {
5
+ element = element.shadowRoot.activeElement;
6
+ }
7
+
8
+ return element;
9
+ };
10
+
11
+ export default getActiveElement;
@@ -0,0 +1,10 @@
1
+ const getClassCopy = (klass, constructorCallback) => {
2
+ return class classCopy extends klass {
3
+ constructor() {
4
+ super();
5
+ constructorCallback && constructorCallback();
6
+ }
7
+ };
8
+ };
9
+
10
+ export default getClassCopy;
@@ -0,0 +1,5 @@
1
+ const GLOBAL_CONTENT_DENSITY_CSS_VAR = "--_ui5_content_density";
2
+
3
+ const getEffectiveContentDensity = el => getComputedStyle(el).getPropertyValue(GLOBAL_CONTENT_DENSITY_CSS_VAR);
4
+
5
+ export default getEffectiveContentDensity;
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Determines if the element is within the viewport.
3
+ * @param el {HTMLElement}
4
+ */
5
+ const isElementInView = el => {
6
+ const rect = el.getBoundingClientRect();
7
+
8
+ return (
9
+ rect.top >= 0 && rect.left >= 0
10
+ && rect.bottom <= (window.innerHeight || document.documentElement.clientHeight)
11
+ && rect.right <= (window.innerWidth || document.documentElement.clientWidth)
12
+ );
13
+ };
14
+
15
+ export default isElementInView;
@@ -3,7 +3,7 @@ const isNodeHidden = node => {
3
3
  return false;
4
4
  }
5
5
 
6
- return (node.offsetWidth <= 0 && node.offsetHeight <= 0) || node.style.visibility === "hidden";
6
+ return (node.offsetWidth <= 0 && node.offsetHeight <= 0) || (node.style && node.style.visibility === "hidden");
7
7
  };
8
8
 
9
9
  export default isNodeHidden;
@@ -15,14 +15,14 @@ const isNodeTabbable = node => {
15
15
  return false;
16
16
  }
17
17
 
18
- if (nodeName === "a" || /input|select|textarea|button|object/.test(nodeName)) {
19
- return !node.disabled;
20
- }
21
-
22
18
  const tabIndex = node.getAttribute("tabindex");
23
19
  if (tabIndex !== null && tabIndex !== undefined) {
24
20
  return parseInt(tabIndex) >= 0;
25
21
  }
22
+
23
+ if (nodeName === "a" || /input|select|textarea|button|object/.test(nodeName)) {
24
+ return !node.disabled;
25
+ }
26
26
  };
27
27
 
28
28
  export default isNodeTabbable;
@@ -1,9 +1,11 @@
1
1
  // Note: disabled is present in IE so we explicitly allow it here.
2
2
  // Others, such as title/hidden, we explicitly override, so valid too
3
- const whitelist = [
3
+ const allowList = [
4
4
  "disabled",
5
5
  "title",
6
6
  "hidden",
7
+ "role",
8
+ "draggable",
7
9
  ];
8
10
 
9
11
  /**
@@ -13,7 +15,7 @@ const whitelist = [
13
15
  * @returns {boolean}
14
16
  */
15
17
  const isValidPropertyName = name => {
16
- if (whitelist.includes(name) || name.startsWith("aria")) {
18
+ if (allowList.includes(name) || name.startsWith("aria")) {
17
19
  return true;
18
20
  }
19
21
  const classes = [
package/hash.txt ADDED
@@ -0,0 +1 @@
1
+ I4TfrV2472ebGZwpjbcsrQmOLcI=
package/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import UI5Element from "./src/UI5Element.js";
1
+ import UI5Element from "./dist/UI5Element.js";
2
2
 
3
3
  export default UI5Element;
4
4
  export { UI5Element };
@@ -1,5 +1,4 @@
1
1
  const fs = require('fs');
2
- const path = require('path');
3
2
  const mkdirp = require('mkdirp');
4
3
  const assets = require('@ui5/webcomponents-tools/assets-meta.js');
5
4
 
@@ -0,0 +1,18 @@
1
+ const fs = require('fs');
2
+ const path = require('path');
3
+ const mkdirp = require('mkdirp');
4
+ const CleanCSS = require('clean-css');
5
+
6
+ mkdirp.sync("dist/generated/css/");
7
+ fs.readdirSync("src/css/").filter(file => file.endsWith(".css")).forEach(file => {
8
+ let content = fs.readFileSync(path.join("src/css/", file));
9
+ const res = new CleanCSS().minify(`${content}`);
10
+ content = `export default {
11
+ packageName: "@ui5/webcomponents-base",
12
+ fileName: "${file}",
13
+ content: \`${res.styles}\`
14
+ };`;
15
+
16
+ fs.writeFileSync(path.join("dist/generated/css/", `${file}.js`), content);
17
+ });
18
+
@@ -0,0 +1,27 @@
1
+ const fs = require('fs');
2
+ const mkdirp = require('mkdirp');
3
+
4
+ const version = JSON.parse(fs.readFileSync("package.json")).version;
5
+
6
+ // Parse version
7
+ const matches = version.match(/^([0-9]+)\.([0-9]+)\.([0-9]+)(.*)$/);
8
+ if (!matches) {
9
+ throw new Error("Unsupported version format");
10
+ }
11
+
12
+ const isNext = version.match(/[a-f0-9]{9}$/);
13
+ const buildTime = Math.floor(new Date().getTime() / 1000);
14
+
15
+ const fileContent = `const VersionInfo = {
16
+ version: "${version}",
17
+ major: ${matches[1]},
18
+ minor: ${matches[2]},
19
+ patch: ${matches[3]},
20
+ suffix: "${matches[4]}",
21
+ isNext: ${isNext ? "true" : "false"},
22
+ buildTime: ${buildTime},
23
+ };
24
+ export default VersionInfo;`;
25
+
26
+ mkdirp.sync("dist/generated/");
27
+ fs.writeFileSync("dist/generated/VersionInfo.js", fileContent);
@@ -1,44 +1,59 @@
1
- const path = require("path");
2
1
  const resolve = require("resolve");
3
2
 
4
- const serveConfig = `../tools/components-package/serve.json`;
5
- const port = `9191`;
6
-
7
3
  const assetParametersScript = resolve.sync("@ui5/webcomponents-base/lib/generate-asset-parameters/index.js");
4
+ const stylesScript = resolve.sync("@ui5/webcomponents-base/lib/generate-styles/index.js");
5
+ const versionScript = resolve.sync("@ui5/webcomponents-base/lib/generate-version-info/index.js");
6
+ const serve = resolve.sync("@ui5/webcomponents-tools/lib/serve/index.js");
7
+ const generateHash = resolve.sync("@ui5/webcomponents-tools/lib/hash/generate.js");
8
+ const hashIsUpToDate = resolve.sync("@ui5/webcomponents-tools/lib/hash/upToDate.js");
9
+ const copyUsedModules = resolve.sync("@ui5/webcomponents-tools/lib/copy-list/index.js");
10
+ const esmAbsToRel = resolve.sync("@ui5/webcomponents-tools/lib/esm-abs-to-rel/index.js");
11
+ const UP_TO_DATE = `node "${hashIsUpToDate}" dist/ hash.txt && echo "Up to date."`;
8
12
 
9
13
  const scripts = {
10
- clean: "rimraf dist",
14
+ clean: "rimraf dist && rimraf .port",
11
15
  lint: "eslint . --config config/.eslintrc.js",
12
- prepare: "nps clean copy generateAssetParameters",
16
+ prepare: "nps clean integrate copy generateAssetParameters generateVersionInfo generateStyles",
17
+ integrate: {
18
+ default: "nps integrate.copy-used-modules integrate.replace-amd integrate.amd-to-es6 integrate.esm-abs-to-rel integrate.third-party",
19
+ "copy-used-modules": `node "${copyUsedModules}" ./used-modules.txt dist/`,
20
+ "replace-amd": "replace-in-file sap.ui.define define dist/**/*.js",
21
+ "amd-to-es6": "amdtoes6 --src=dist/ --replace --glob=**/*.js",
22
+ "esm-abs-to-rel": `node "${esmAbsToRel}" dist/ dist/`,
23
+ "third-party": {
24
+ default: "nps integrate.third-party.copy integrate.third-party.fix",
25
+ copy: "mkdirp dist/sap/ui/thirdparty/ && copy-and-watch ../../node_modules/@openui5/sap.ui.core/src/sap/ui/thirdparty/caja-html-sanitizer.js dist/sap/ui/thirdparty/",
26
+ fix: "replace-in-file 240 xA0 dist/sap/ui/thirdparty/caja-html-sanitizer.js"
27
+ },
28
+ },
13
29
  build: {
14
- default: "nps lint prepare build.bundle",
15
- bundle: "rollup --config config/rollup.config.js --environment ES5_BUILD",
30
+ default: `${UP_TO_DATE} || nps lint prepare build.bundle hash`,
31
+ bundle: "rollup --config config/rollup.config.js",
16
32
  },
17
33
  copy: {
18
- default: "nps copy.src copy.test copy.webcomponents-polyfill",
19
- src: "copy-and-watch \"src/**/*.js\" dist/",
20
- test: "copy-and-watch \"test/**/*.*\" dist/test-resources",
21
- "webcomponents-polyfill": "copy-and-watch \"../../node_modules/@webcomponents/webcomponentsjs/**/*.*\" dist/webcomponentsjs/",
34
+ default: "nps copy.src copy.test",
35
+ src: `copy-and-watch "src/**/*.{js,css}" dist/`,
36
+ test: `copy-and-watch "test/**/*.*" dist/test-resources`,
22
37
  },
23
38
  generateAssetParameters: `node "${assetParametersScript}"`,
39
+ generateVersionInfo: `node "${versionScript}"`,
40
+ generateStyles: `node "${stylesScript}"`,
24
41
  watch: {
25
- default: 'concurrently "nps watch.test" "nps watch.src" "nps watch.bundle"',
42
+ default: 'concurrently "nps watch.test" "nps watch.src" "nps watch.bundle" "nps watch.styles"',
26
43
  src: 'nps "copy.src --watch --skip-initial-copy"',
27
44
  test: 'nps "copy.test --watch --skip-initial-copy"',
28
- bundle: "rollup --config config/rollup.config.js -w --environment ES5_BUILD,DEV",
45
+ bundle: "rollup --config config/rollup.config.js -w --environment DEV",
46
+ styles: 'chokidar "src/css/*.css" -c "nps generateStyles"'
29
47
  },
30
48
  dev: 'concurrently "nps serve" "nps watch"',
31
49
  start: "nps prepare dev",
32
- serve: {
33
- default: "nps serve.prepare serve.run",
34
- prepare: `copy-and-watch "${serveConfig}" dist/`,
35
- run: `serve --no-clipboard -l ${port} dist`,
36
- },
50
+ serve: `node "${serve}" --dir="dist/" --port=9191 --packageName="@ui5/webcomponents-base"`,
37
51
  test: {
38
52
  // --success first - report the exit code of the test run (first command to finish), as serve is always terminated and has a non-0 exit code
39
53
  default: 'concurrently "nps serve" "nps test.run" --kill-others --success first',
40
54
  run: "cross-env WDIO_LOG_LEVEL=error FORCE_COLOR=0 wdio config/wdio.conf.js",
41
55
  },
56
+ hash: `node "${generateHash}" dist/ hash.txt`,
42
57
  };
43
58
 
44
59
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ui5/webcomponents-base",
3
- "version": "0.0.0-306572ffa",
3
+ "version": "0.0.0-35e2c9666",
4
4
  "description": "UI5 Web Components: webcomponents.base",
5
5
  "author": "SAP SE (https://www.sap.com)",
6
6
  "license": "Apache-2.0",
@@ -15,28 +15,34 @@
15
15
  "url": "https://github.com/SAP/ui5-webcomponents.git",
16
16
  "directory": "packages/base"
17
17
  },
18
+ "exports": {
19
+ ".": "./index.js",
20
+ "./dist/*": "./dist/*",
21
+ "./package.json": "./package.json",
22
+ "./bundle.esm.js": "./bundle.esm.js",
23
+ "./*": "./dist/*"
24
+ },
18
25
  "scripts": {
19
26
  "clean": "nps clean",
20
27
  "lint": "nps lint",
21
28
  "start": "nps start",
22
29
  "build": "nps build",
23
30
  "test": "nps test",
31
+ "hash": "nps hash",
24
32
  "prepublishOnly": "npm run clean && npm run build"
25
33
  },
26
34
  "dependencies": {
27
- "css-vars-ponyfill": "^2.1.2",
28
- "lit-html": "^1.0.0",
29
- "regenerator-runtime": "0.12.1",
30
- "url-search-params-polyfill": "^5.0.0"
35
+ "lit-html": "2.0.1"
31
36
  },
32
37
  "devDependencies": {
33
- "@ui5/webcomponents-tools": "0.0.0-306572ffa",
34
- "array-uniq": "^2.0.0",
35
- "chromedriver": "latest",
36
- "copy-and-watch": "^0.1.4",
37
- "eslint": "^5.13.0",
38
- "eslint-config-airbnb-base": "^13.1.0",
39
- "npm-run-all": "^4.1.5",
40
- "path-exists-cli": "^1.0.0"
38
+ "@buxlabs/amd-to-es6": "0.16.1",
39
+ "@openui5/sap.ui.core": "1.94.0",
40
+ "@ui5/webcomponents-tools": "0.0.0-35e2c9666",
41
+ "chromedriver": "99.0.0",
42
+ "clean-css": "^5.2.2",
43
+ "copy-and-watch": "^0.1.5",
44
+ "eslint": "^7.22.0",
45
+ "mkdirp": "^1.0.4",
46
+ "resolve": "^1.20.0"
41
47
  }
42
48
  }
@@ -1,10 +1,11 @@
1
- import { registerI18nBundle } from "./asset-registries/i18n.js";
2
- import { registerCldr, _registerMappingFunction as registerCldrMappingFunction } from "./asset-registries/LocaleData.js";
3
- import { registerThemeProperties } from "./asset-registries/Themes.js";
1
+ import { registerI18nLoader } from "./asset-registries/i18n.js";
2
+ import { registerLocaleDataLoader } from "./asset-registries/LocaleData.js";
3
+ import { registerThemePropertiesLoader } from "./asset-registries/Themes.js";
4
+ import { registerIconLoader } from "./asset-registries/Icons.js";
4
5
 
5
6
  export {
6
- registerCldr,
7
- registerCldrMappingFunction,
8
- registerThemeProperties,
9
- registerI18nBundle,
7
+ registerI18nLoader,
8
+ registerLocaleDataLoader,
9
+ registerThemePropertiesLoader,
10
+ registerIconLoader,
10
11
  };
package/src/Boot.js ADDED
@@ -0,0 +1,59 @@
1
+ import whenDOMReady from "./util/whenDOMReady.js";
2
+ import insertFontFace from "./FontFace.js";
3
+ import insertSystemCSSVars from "./SystemCSSVars.js";
4
+ import { getTheme } from "./config/Theme.js";
5
+ import applyTheme from "./theming/applyTheme.js";
6
+ import { registerCurrentRuntime } from "./Runtimes.js";
7
+ import { getFeature } from "./FeaturesRegistry.js";
8
+
9
+ let bootPromise;
10
+
11
+ /**
12
+ * Attach a callback that will be executed on boot
13
+ * @public
14
+ * @param listener
15
+ */
16
+ const attachBoot = async listener => {
17
+ await boot();
18
+ listener();
19
+ };
20
+
21
+ const boot = async () => {
22
+ if (bootPromise) {
23
+ return bootPromise;
24
+ }
25
+
26
+ /* eslint-disable no-alert, no-async-promise-executor */
27
+ /*
28
+ Note(since we disable eslint rule):
29
+ If an async executor function throws an error, the error will be lost and won't cause the newly-constructed Promise to reject.
30
+ This could make it difficult to debug and handle some errors.
31
+ */
32
+ bootPromise = new Promise(async resolve => {
33
+ registerCurrentRuntime();
34
+
35
+ const OpenUI5Support = getFeature("OpenUI5Support");
36
+ const F6Navigation = getFeature("F6Navigation");
37
+ if (OpenUI5Support) {
38
+ await OpenUI5Support.init();
39
+ } else if (F6Navigation) {
40
+ F6Navigation.init();
41
+ }
42
+
43
+ await whenDOMReady();
44
+ await applyTheme(getTheme());
45
+ OpenUI5Support && OpenUI5Support.attachListeners();
46
+ insertFontFace();
47
+ insertSystemCSSVars();
48
+
49
+ resolve();
50
+ });
51
+ /* eslint-enable no-alert, no-async-promise-executor */
52
+
53
+ return bootPromise;
54
+ };
55
+
56
+ export {
57
+ boot,
58
+ attachBoot,
59
+ };