@ui5/webcomponents-base 2.9.0-rc.1 → 2.9.0-rc.3

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 (39) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/cypress/specs/util/FocusableElements.cy.tsx +48 -0
  3. package/dist/.tsbuildinfobuild +1 -1
  4. package/dist/custom-elements-internal.json +15 -0
  5. package/dist/custom-elements.json +15 -0
  6. package/dist/generated/AssetParameters.js +1 -1
  7. package/dist/generated/AssetParameters.js.map +1 -1
  8. package/dist/generated/VersionInfo.js +3 -3
  9. package/dist/generated/VersionInfo.js.map +1 -1
  10. package/dist/index.d.ts +42 -6
  11. package/dist/index.js +88 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/locale/nextFallbackLocale.js +6 -2
  14. package/dist/locale/nextFallbackLocale.js.map +1 -1
  15. package/dist/prod/generated/AssetParameters.js +1 -1
  16. package/dist/prod/generated/AssetParameters.js.map +1 -1
  17. package/dist/prod/generated/VersionInfo.js +1 -1
  18. package/dist/prod/generated/VersionInfo.js.map +1 -1
  19. package/dist/prod/index.js +2 -0
  20. package/dist/prod/index.js.map +7 -0
  21. package/dist/prod/locale/nextFallbackLocale.js +1 -1
  22. package/dist/prod/locale/nextFallbackLocale.js.map +3 -3
  23. package/dist/prod/thirdparty/preact/jsxRuntime.module.d.js +1 -1
  24. package/dist/prod/thirdparty/preact/jsxRuntime.module.d.js.map +2 -2
  25. package/dist/prod/util/FocusableElements.js +1 -1
  26. package/dist/prod/util/FocusableElements.js.map +3 -3
  27. package/dist/prod/util/HTMLSanitizer.js.map +1 -1
  28. package/dist/thirdparty/preact/jsx.d.ts +1 -1
  29. package/dist/thirdparty/preact/jsxRuntime.module.d.ts +3 -3
  30. package/dist/util/FocusableElements.js +18 -2
  31. package/dist/util/FocusableElements.js.map +1 -1
  32. package/dist/util/HTMLSanitizer.d.ts +2 -0
  33. package/dist/util/HTMLSanitizer.js +2 -2
  34. package/dist/util/HTMLSanitizer.js.map +1 -1
  35. package/package-scripts.cjs +2 -2
  36. package/package.json +6 -6
  37. package/dist/prod/index.d.js +0 -2
  38. package/dist/prod/index.d.js.map +0 -7
  39. package/index.js +0 -208
@@ -25,6 +25,15 @@ const getLastFocusableElement = async (container, startFromContainer) => {
25
25
  const isElemFocusable = (el) => {
26
26
  return el.hasAttribute("data-ui5-focus-redirect") || !isElementHidden(el);
27
27
  };
28
+ const isUI5ElementWithNegativeTabIndex = (el) => {
29
+ if (instanceOfUI5Element(el)) {
30
+ const tabIndex = el.getAttribute("tabindex");
31
+ if (tabIndex !== null && parseInt(tabIndex) < 0) {
32
+ return true;
33
+ }
34
+ }
35
+ return false;
36
+ };
28
37
  const findFocusableElement = async (container, forward, startFromContainer) => {
29
38
  let child;
30
39
  let assignedElements;
@@ -47,9 +56,16 @@ const findFocusableElement = async (container, forward, startFromContainer) => {
47
56
  /* eslint-disable no-await-in-loop */
48
57
  while (child) {
49
58
  const originalChild = child;
50
- if (!isElementHidden(originalChild)) {
59
+ if (!isElementHidden(originalChild) && !isUI5ElementWithNegativeTabIndex(originalChild)) {
51
60
  if (instanceOfUI5Element(child)) {
52
- child = await child.getFocusDomRefAsync();
61
+ // getDomRef is used because some components mark their focusable ref in an inner
62
+ // html but there might also be focusable targets outside of it
63
+ // as an example - TreeItemBase
64
+ // div - root of the component returned by getDomRef()
65
+ // li.ui5-li-tree - returned by getFocusDomRef() and may not be focusable (ItemNavigation manages tabindex)
66
+ // ul.subtree - may still contain focusable targets (sub nodes of the tree item)
67
+ await child._waitForDomRef();
68
+ child = child.getDomRef();
53
69
  }
54
70
  if (!child || isElementHidden(child)) {
55
71
  return null;
@@ -1 +1 @@
1
- {"version":3,"file":"FocusableElements.js","sourceRoot":"","sources":["../../src/util/FocusableElements.ts"],"names":[],"mappings":"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","sourcesContent":["import isElementHidden from \"./isElementHidden.js\";\nimport isElementClickable from \"./isElementClickable.js\";\nimport { instanceOfUI5Element } from \"../UI5Element.js\";\nimport { isSafari } from \"../Device.js\";\n\ntype FocusableElementPromise = Promise<HTMLElement | null>;\n\nconst isFocusTrap = (el: HTMLElement) => {\n\treturn el.hasAttribute(\"data-ui5-focus-trap\");\n};\n\nconst isScrollable = (el: HTMLElement) => {\n\tconst computedStyle = getComputedStyle(el);\n\n\treturn (el.scrollHeight > el.clientHeight && [\"scroll\", \"auto\"].indexOf(computedStyle.overflowY) >= 0)\n\t\t|| (el.scrollWidth > el.clientWidth && [\"scroll\", \"auto\"].indexOf(computedStyle.overflowX) >= 0);\n};\n\nconst getFirstFocusableElement = async (container: HTMLElement, startFromContainer?: boolean): FocusableElementPromise => {\n\tif (!container || isElementHidden(container)) {\n\t\treturn null;\n\t}\n\n\treturn findFocusableElement(container, true, startFromContainer);\n};\n\nconst getLastFocusableElement = async (container: HTMLElement, startFromContainer?: boolean): FocusableElementPromise => {\n\tif (!container || isElementHidden(container)) {\n\t\treturn null;\n\t}\n\n\treturn findFocusableElement(container, false, startFromContainer);\n};\n\nconst isElemFocusable = (el: HTMLElement) => {\n\treturn el.hasAttribute(\"data-ui5-focus-redirect\") || !isElementHidden(el);\n};\n\nconst findFocusableElement = async (container: HTMLElement, forward: boolean, startFromContainer?: boolean): FocusableElementPromise => {\n\tlet child: HTMLElement | undefined;\n\tlet assignedElements;\n\tlet currentIndex = -1;\n\n\tif (container.shadowRoot) {\n\t\tchild = forward ? container.shadowRoot.firstChild as HTMLElement : container.shadowRoot.lastChild as HTMLElement;\n\t} else if (container instanceof HTMLSlotElement && container.assignedNodes()) {\n\t\tassignedElements = container.assignedNodes();\n\t\tcurrentIndex = forward ? 0 : assignedElements.length - 1;\n\t\tchild = assignedElements[currentIndex] as HTMLElement;\n\t} else if (startFromContainer) {\n\t\tchild = container;\n\t} else {\n\t\tchild = forward ? container.firstElementChild as HTMLElement : container.lastElementChild as HTMLElement;\n\t}\n\n\tlet focusableDescendant;\n\n\t/* eslint-disable no-await-in-loop */\n\n\twhile (child) {\n\t\tconst originalChild: HTMLElement | undefined = child;\n\n\t\tif (!isElementHidden(originalChild)) {\n\t\t\tif (instanceOfUI5Element(child)) {\n\t\t\t\tchild = await child.getFocusDomRefAsync();\n\t\t\t}\n\n\t\t\tif (!child || isElementHidden(child)) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif (child.nodeType === 1 && isElemFocusable(child) && !isFocusTrap(child)) {\n\t\t\t\tif (isElementClickable(child)) {\n\t\t\t\t\treturn (child && typeof child.focus === \"function\") ? child : null;\n\t\t\t\t}\n\n\t\t\t\tfocusableDescendant = await findFocusableElement(child, forward);\n\n\t\t\t\t// check if it is a keyboard focusable scroll container\n\t\t\t\tif (!isSafari() && !focusableDescendant && isScrollable(child)) {\n\t\t\t\t\treturn (child && typeof child.focus === \"function\") ? child : null;\n\t\t\t\t}\n\n\t\t\t\tif (focusableDescendant) {\n\t\t\t\t\treturn (focusableDescendant && typeof focusableDescendant.focus === \"function\") ? focusableDescendant : null;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tchild = forward ? originalChild.nextSibling as HTMLElement : originalChild.previousSibling as HTMLElement;\n\n\t\t// If the child element is not part of the currently assigned element,\n\t\t// we have to check the next/previous element assigned to the slot or continue with the next/previous sibling of the slot,\n\t\t// otherwise, the nextSibling/previousSibling is the next element inside the light DOM\n\t\tif (assignedElements && !assignedElements[currentIndex].contains(child)) {\n\t\t\tcurrentIndex = forward ? currentIndex + 1 : currentIndex - 1;\n\n\t\t\tchild = assignedElements[currentIndex] as HTMLElement;\n\t\t}\n\t}\n\n\t/* eslint-enable no-await-in-loop */\n\n\treturn null;\n};\n\nexport {\n\tgetFirstFocusableElement,\n\tgetLastFocusableElement,\n};\n"]}
1
+ {"version":3,"file":"FocusableElements.js","sourceRoot":"","sources":["../../src/util/FocusableElements.ts"],"names":[],"mappings":"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","sourcesContent":["import isElementHidden from \"./isElementHidden.js\";\nimport isElementClickable from \"./isElementClickable.js\";\nimport { instanceOfUI5Element } from \"../UI5Element.js\";\nimport { isSafari } from \"../Device.js\";\n\ntype FocusableElementPromise = Promise<HTMLElement | null>;\n\nconst isFocusTrap = (el: HTMLElement) => {\n\treturn el.hasAttribute(\"data-ui5-focus-trap\");\n};\n\nconst isScrollable = (el: HTMLElement) => {\n\tconst computedStyle = getComputedStyle(el);\n\n\treturn (el.scrollHeight > el.clientHeight && [\"scroll\", \"auto\"].indexOf(computedStyle.overflowY) >= 0)\n\t\t|| (el.scrollWidth > el.clientWidth && [\"scroll\", \"auto\"].indexOf(computedStyle.overflowX) >= 0);\n};\n\nconst getFirstFocusableElement = async (container: HTMLElement, startFromContainer?: boolean): FocusableElementPromise => {\n\tif (!container || isElementHidden(container)) {\n\t\treturn null;\n\t}\n\n\treturn findFocusableElement(container, true, startFromContainer);\n};\n\nconst getLastFocusableElement = async (container: HTMLElement, startFromContainer?: boolean): FocusableElementPromise => {\n\tif (!container || isElementHidden(container)) {\n\t\treturn null;\n\t}\n\n\treturn findFocusableElement(container, false, startFromContainer);\n};\n\nconst isElemFocusable = (el: HTMLElement) => {\n\treturn el.hasAttribute(\"data-ui5-focus-redirect\") || !isElementHidden(el);\n};\n\nconst isUI5ElementWithNegativeTabIndex = (el: HTMLElement) => {\n\tif (instanceOfUI5Element(el)) {\n\t\tconst tabIndex = el.getAttribute(\"tabindex\");\n\t\tif (tabIndex !== null && parseInt(tabIndex) < 0) {\n\t\t\treturn true;\n\t\t}\n\t}\n\n\treturn false;\n};\n\nconst findFocusableElement = async (container: HTMLElement, forward: boolean, startFromContainer?: boolean): FocusableElementPromise => {\n\tlet child: HTMLElement | undefined;\n\tlet assignedElements;\n\tlet currentIndex = -1;\n\n\tif (container.shadowRoot) {\n\t\tchild = forward ? container.shadowRoot.firstChild as HTMLElement : container.shadowRoot.lastChild as HTMLElement;\n\t} else if (container instanceof HTMLSlotElement && container.assignedNodes()) {\n\t\tassignedElements = container.assignedNodes();\n\t\tcurrentIndex = forward ? 0 : assignedElements.length - 1;\n\t\tchild = assignedElements[currentIndex] as HTMLElement;\n\t} else if (startFromContainer) {\n\t\tchild = container;\n\t} else {\n\t\tchild = forward ? container.firstElementChild as HTMLElement : container.lastElementChild as HTMLElement;\n\t}\n\n\tlet focusableDescendant;\n\n\t/* eslint-disable no-await-in-loop */\n\n\twhile (child) {\n\t\tconst originalChild: HTMLElement | undefined = child;\n\n\t\tif (!isElementHidden(originalChild) && !isUI5ElementWithNegativeTabIndex(originalChild)) {\n\t\t\tif (instanceOfUI5Element(child)) {\n\t\t\t\t// getDomRef is used because some components mark their focusable ref in an inner\n\t\t\t\t// html but there might also be focusable targets outside of it\n\t\t\t\t// as an example - TreeItemBase\n\t\t\t\t// div - root of the component returned by getDomRef()\n\t\t\t\t// \tli.ui5-li-tree - returned by getFocusDomRef() and may not be focusable (ItemNavigation manages tabindex)\n\t\t\t\t// \tul.subtree - may still contain focusable targets (sub nodes of the tree item)\n\t\t\t\tawait child._waitForDomRef();\n\t\t\t\tchild = child.getDomRef();\n\t\t\t}\n\n\t\t\tif (!child || isElementHidden(child)) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif (child.nodeType === 1 && isElemFocusable(child) && !isFocusTrap(child)) {\n\t\t\t\tif (isElementClickable(child)) {\n\t\t\t\t\treturn (child && typeof child.focus === \"function\") ? child : null;\n\t\t\t\t}\n\n\t\t\t\tfocusableDescendant = await findFocusableElement(child, forward);\n\n\t\t\t\t// check if it is a keyboard focusable scroll container\n\t\t\t\tif (!isSafari() && !focusableDescendant && isScrollable(child)) {\n\t\t\t\t\treturn (child && typeof child.focus === \"function\") ? child : null;\n\t\t\t\t}\n\n\t\t\t\tif (focusableDescendant) {\n\t\t\t\t\treturn (focusableDescendant && typeof focusableDescendant.focus === \"function\") ? focusableDescendant : null;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tchild = forward ? originalChild.nextSibling as HTMLElement : originalChild.previousSibling as HTMLElement;\n\n\t\t// If the child element is not part of the currently assigned element,\n\t\t// we have to check the next/previous element assigned to the slot or continue with the next/previous sibling of the slot,\n\t\t// otherwise, the nextSibling/previousSibling is the next element inside the light DOM\n\t\tif (assignedElements && !assignedElements[currentIndex].contains(child)) {\n\t\t\tcurrentIndex = forward ? currentIndex + 1 : currentIndex - 1;\n\n\t\t\tchild = assignedElements[currentIndex] as HTMLElement;\n\t\t}\n\t}\n\n\t/* eslint-enable no-await-in-loop */\n\n\treturn null;\n};\n\nexport {\n\tgetFirstFocusableElement,\n\tgetLastFocusableElement,\n};\n"]}
@@ -1,3 +1,5 @@
1
+ /** @ts-expect-error */
1
2
  import sanitizeHTML from "../sap/base/security/sanitizeHTML.js";
3
+ /** @ts-expect-error */
2
4
  import URLListValidator from "../sap/base/security/URLListValidator.js";
3
5
  export { URLListValidator, sanitizeHTML, };
@@ -1,6 +1,6 @@
1
- // @ts-ignore
1
+ /** @ts-expect-error */
2
2
  import sanitizeHTML from "../sap/base/security/sanitizeHTML.js";
3
- // @ts-ignore
3
+ /** @ts-expect-error */
4
4
  import URLListValidator from "../sap/base/security/URLListValidator.js";
5
5
  export { URLListValidator, sanitizeHTML, };
6
6
  //# sourceMappingURL=HTMLSanitizer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"HTMLSanitizer.js","sourceRoot":"","sources":["../../src/util/HTMLSanitizer.ts"],"names":[],"mappings":"AAAA,aAAa;AACb,OAAO,YAAY,MAAM,sCAAsC,CAAC;AAChE,aAAa;AACb,OAAO,gBAAgB,MAAM,0CAA0C,CAAC;AAExE,OAAO,EACN,gBAAgB,EAChB,YAAY,GACZ,CAAC","sourcesContent":["// @ts-ignore\nimport sanitizeHTML from \"../sap/base/security/sanitizeHTML.js\";\n// @ts-ignore\nimport URLListValidator from \"../sap/base/security/URLListValidator.js\";\n\nexport {\n\tURLListValidator,\n\tsanitizeHTML,\n};\n"]}
1
+ {"version":3,"file":"HTMLSanitizer.js","sourceRoot":"","sources":["../../src/util/HTMLSanitizer.ts"],"names":[],"mappings":"AAAA,uBAAuB;AACvB,OAAO,YAAY,MAAM,sCAAsC,CAAC;AAChE,uBAAuB;AACvB,OAAO,gBAAgB,MAAM,0CAA0C,CAAC;AAExE,OAAO,EACN,gBAAgB,EAChB,YAAY,GACZ,CAAC","sourcesContent":["/** @ts-expect-error */\nimport sanitizeHTML from \"../sap/base/security/sanitizeHTML.js\";\n/** @ts-expect-error */\nimport URLListValidator from \"../sap/base/security/URLListValidator.js\";\n\nexport {\n\tURLListValidator,\n\tsanitizeHTML,\n};\n"]}
@@ -49,8 +49,8 @@ const scripts = {
49
49
  },
50
50
  generateAPI: {
51
51
  default: "nps generateAPI.generateCEM generateAPI.validateCEM",
52
- generateCEM: `cem analyze --config "${LIB}/cem/custom-elements-manifest.config.mjs" --dev`,
53
- validateCEM: `node "${LIB}/cem/validate.js" --dev`,
52
+ generateCEM: `cross-env UI5_CEM_MODE='dev' cem analyze --config "${LIB}/cem/custom-elements-manifest.config.mjs"`,
53
+ validateCEM: `cross-env UI5_CEM_MODE='dev' node "${LIB}/cem/validate.js"`,
54
54
  },
55
55
  watch: {
56
56
  default: 'concurrently "nps watch.src" "nps watch.styles"',
package/package.json CHANGED
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "@ui5/webcomponents-base",
3
- "version": "2.9.0-rc.1",
3
+ "version": "2.9.0-rc.3",
4
4
  "description": "UI5 Web Components: webcomponents.base",
5
5
  "author": "SAP SE (https://www.sap.com)",
6
6
  "license": "Apache-2.0",
7
7
  "type": "module",
8
- "module": "index.js",
8
+ "module": "./dist/index.js",
9
9
  "keywords": [
10
10
  "openui5",
11
11
  "sapui5",
@@ -25,8 +25,8 @@
25
25
  "default": "./dist/ssr-dom.js"
26
26
  },
27
27
  ".": {
28
- "types": "./src/index.d.ts",
29
- "default": "./index.js"
28
+ "types": "./dist/index.d.ts",
29
+ "default": "./dist/index.js"
30
30
  },
31
31
  "./dist/*": {
32
32
  "production": "./dist/prod/*",
@@ -62,7 +62,7 @@
62
62
  "devDependencies": {
63
63
  "@openui5/sap.ui.core": "1.120.17",
64
64
  "@ui5/cypress-internal": "0.0.0",
65
- "@ui5/webcomponents-tools": "2.9.0-rc.1",
65
+ "@ui5/webcomponents-tools": "2.9.0-rc.3",
66
66
  "chromedriver": "^133.0.0",
67
67
  "clean-css": "^5.2.2",
68
68
  "copy-and-watch": "^0.1.5",
@@ -73,5 +73,5 @@
73
73
  "resolve": "^1.20.0",
74
74
  "touch": "^3.1.0"
75
75
  },
76
- "gitHead": "028a680226a4eab512df2749f1cc94ce4bc5b535"
76
+ "gitHead": "fb9dd216f139bf86008bf909956471e780c63ba4"
77
77
  }
@@ -1,2 +0,0 @@
1
- "use strict";
2
- //# sourceMappingURL=index.d.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": [],
4
- "sourcesContent": [],
5
- "mappings": "",
6
- "names": []
7
- }
package/index.js DELETED
@@ -1,208 +0,0 @@
1
- // animations/
2
- import scroll from "./dist/animations/scroll.js";
3
- import slideDown from "./dist/animations/slideDown.js";
4
- import slideUp from "./dist/animations/slideUp.js";
5
-
6
- // config/
7
- import { getAnimationMode, setAnimationMode } from "./dist/config/AnimationMode.js";
8
- import { getCalendarType } from "./dist/config/CalendarType.js";
9
- import { getFirstDayOfWeek, getLegacyDateCalendarCustomizing } from "./dist/config/FormatSettings.js";
10
- import {
11
- setDefaultIconCollection,
12
- getDefaultIconCollection,
13
- } from "./dist/config/Icons.js";
14
- import { RegisteredIconCollection } from "./dist/asset-registries/util/IconCollectionsByTheme.js";
15
- import getEffectiveIconCollection from "./dist/asset-registries/util/getIconCollectionByTheme.js";
16
- import {
17
- getLanguage,
18
- setLanguage,
19
- getDefaultLanguage,
20
- setFetchDefaultLanguage,
21
- getFetchDefaultLanguage,
22
- } from "./dist/config/Language.js";
23
- import { getNoConflict, setNoConflict } from "./dist/config/NoConflict.js";
24
- import {
25
- getTheme,
26
- setTheme,
27
- getDefaultTheme,
28
- } from "./dist/config/Theme.js";
29
-
30
- // decorators/
31
- import customElement from "./dist/decorators/customElement.js";
32
- import event from "./dist/decorators/event.js";
33
- import property from "./dist/decorators/property.js";
34
- import slot from "./dist/decorators/slot.js";
35
-
36
- // delegate/
37
- import ItemNavigation from "./dist/delegate/ItemNavigation.js";
38
- import ResizeHandler from "./dist/delegate/ResizeHandler.js";
39
- import ScrollEnablement from "./dist/delegate/ScrollEnablement.js";
40
-
41
- // locale/
42
- import applyDirection from "./dist/locale/applyDirection.js";
43
- import { attachDirectionChange, detachDirectionChange } from "./dist/locale/directionChange.js";
44
- import getEffectiveDir from "./dist/locale/getEffectiveDir.js";
45
- import { attachLanguageChange, detachLanguageChange } from "./dist/locale/languageChange.js";
46
-
47
- // util/
48
- import { URLListValidator, sanitizeHTML } from "./dist/util/HTMLSanitizer.js";
49
-
50
- // Assets.ts
51
- import { registerI18nLoader } from "./dist/asset-registries/i18n.js";
52
- import { registerLocaleDataLoader } from "./dist/asset-registries/LocaleData.js";
53
- import { registerThemePropertiesLoader } from "./dist/asset-registries/Themes.js";
54
- import { registerIconLoader } from "./dist/asset-registries/Icons.js";
55
-
56
- // Boot.ts
57
- import { attachBoot } from "./dist/Boot.js";
58
-
59
- // CustomElementsScope.ts
60
- import {
61
- setCustomElementsScopingSuffix,
62
- getCustomElementsScopingSuffix,
63
- setCustomElementsScopingRules,
64
- getCustomElementsScopingRules,
65
- getEffectiveScopingSuffixForTag,
66
- } from "./dist/CustomElementsScope.js";
67
-
68
- // Device.ts
69
- import {
70
- supportsTouch,
71
- isSafari,
72
- isChrome,
73
- isFirefox,
74
- isPhone,
75
- isTablet,
76
- isDesktop,
77
- isCombi,
78
- isIOS,
79
- isAndroid,
80
- } from "./dist/Device.js";
81
-
82
- // EventProvider.ts
83
- import EventProvider from "./dist/EventProvider.js";
84
-
85
- // i18nBundle.ts
86
- import I18nBundle, { getI18nBundle, registerCustomI18nBundleGetter } from "./dist/i18nBundle.js";
87
-
88
- // MediaRange.ts
89
- import MediaRange from "./dist/MediaRange.js";
90
-
91
- // Render.ts
92
- import {
93
- renderDeferred,
94
- renderImmediately,
95
- cancelRender,
96
- renderFinished,
97
- } from "./dist/Render.js";
98
-
99
- // Theming.ts
100
- import { addCustomCSS, attachThemeLoaded, detachThemeLoaded } from "./dist/Theming.js";
101
-
102
- // UI5Element.ts
103
- import UI5Element from "./dist/UI5Element.js";
104
-
105
- export default UI5Element;
106
- export {
107
- // animations/
108
- scroll,
109
- slideDown,
110
- slideUp,
111
-
112
- // config/
113
- getAnimationMode,
114
- setAnimationMode,
115
- getCalendarType,
116
- getFirstDayOfWeek,
117
- getLegacyDateCalendarCustomizing,
118
- setDefaultIconCollection,
119
- getDefaultIconCollection,
120
- getEffectiveIconCollection,
121
- RegisteredIconCollection,
122
- getLanguage,
123
- setLanguage,
124
- getDefaultLanguage,
125
- setFetchDefaultLanguage,
126
- getFetchDefaultLanguage,
127
- getNoConflict,
128
- setNoConflict,
129
- getTheme,
130
- setTheme,
131
- getDefaultTheme,
132
-
133
- // decorators/
134
- customElement,
135
- event,
136
- property,
137
- slot,
138
-
139
- // delegate/
140
- ItemNavigation,
141
- ResizeHandler,
142
- ScrollEnablement,
143
-
144
- // locale/
145
- applyDirection,
146
- attachDirectionChange,
147
- detachDirectionChange,
148
- getEffectiveDir,
149
- attachLanguageChange,
150
- detachLanguageChange,
151
-
152
- // util/
153
- URLListValidator,
154
- sanitizeHTML,
155
-
156
- // Assets.ts
157
- registerI18nLoader,
158
- registerLocaleDataLoader,
159
- registerThemePropertiesLoader,
160
- registerIconLoader,
161
-
162
- // Boot.ts
163
- attachBoot,
164
-
165
- // CustomElementsScope.ts
166
- setCustomElementsScopingSuffix,
167
- getCustomElementsScopingSuffix,
168
- setCustomElementsScopingRules,
169
- getCustomElementsScopingRules,
170
- getEffectiveScopingSuffixForTag,
171
-
172
- // Device.ts
173
- supportsTouch,
174
- isSafari,
175
- isChrome,
176
- isFirefox,
177
- isPhone,
178
- isTablet,
179
- isDesktop,
180
- isCombi,
181
- isIOS,
182
- isAndroid,
183
-
184
- // EventProvider.ts
185
- EventProvider,
186
-
187
- // i18nBundle.ts
188
- I18nBundle,
189
- getI18nBundle,
190
- registerCustomI18nBundleGetter,
191
-
192
- // MediaRange.ts
193
- MediaRange,
194
-
195
- // Render.ts
196
- renderDeferred,
197
- renderImmediately,
198
- cancelRender,
199
- renderFinished,
200
-
201
- // Theming.ts
202
- addCustomCSS,
203
- attachThemeLoaded,
204
- detachThemeLoaded,
205
-
206
- // UI5Element.ts
207
- UI5Element,
208
- };