cx 26.0.14 → 26.1.1
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.
- package/build/ui/VDOM.d.ts +1 -20
- package/build/ui/VDOM.js +1 -3
- package/build/ui/Widget.d.ts +1 -1
- package/build/ui/Widget.js +0 -5
- package/build/ui/app/startAppLoop.js +2 -10
- package/build/util/Component.js +5 -0
- package/build/util/test/createTestRenderer.d.ts +3 -1
- package/build/util/test/createTestRenderer.js +8 -2
- package/build/widgets/form/Checkbox.d.ts +0 -1
- package/build/widgets/form/Checkbox.js +1 -0
- package/build/widgets/form/ColorField.d.ts +0 -1
- package/build/widgets/form/ColorField.js +2 -2
- package/build/widgets/form/DateTimeField.d.ts +0 -2
- package/build/widgets/form/DateTimeField.js +1 -0
- package/build/widgets/form/DateTimePicker.d.ts +0 -2
- package/build/widgets/form/DateTimePicker.js +1 -0
- package/build/widgets/form/Radio.d.ts +0 -1
- package/build/widgets/form/Slider.js +9 -1
- package/build/widgets/form/Switch.d.ts +0 -1
- package/build/widgets/form/Switch.js +1 -1
- package/build/widgets/form/Wheel.d.ts +0 -1
- package/build/widgets/grid/Grid.d.ts +0 -2
- package/build/widgets/grid/GridCellEditor.js +3 -1
- package/build/widgets/icons/calendar.js +4 -3
- package/build/widgets/icons/check.js +2 -2
- package/build/widgets/icons/clear.js +2 -2
- package/build/widgets/icons/close.js +2 -2
- package/build/widgets/icons/cx.js +2 -2
- package/build/widgets/icons/drop-down.js +2 -2
- package/build/widgets/icons/file.js +2 -2
- package/build/widgets/icons/folder-open.js +2 -2
- package/build/widgets/icons/folder.js +2 -2
- package/build/widgets/icons/forward.js +2 -2
- package/build/widgets/icons/loading.js +2 -2
- package/build/widgets/icons/menu.js +2 -2
- package/build/widgets/icons/pixel-picker.js +2 -2
- package/build/widgets/icons/search.js +2 -2
- package/build/widgets/icons/sort-asc.js +2 -2
- package/build/widgets/icons/square.js +2 -2
- package/build/widgets/overlay/Overlay.d.ts +3 -0
- package/build/widgets/overlay/Overlay.js +3 -2
- package/dist/manifest.js +867 -867
- package/dist/ui.js +4 -18
- package/dist/util.js +4 -0
- package/dist/widgets.js +395 -319
- package/package.json +11 -8
- package/src/charts/Chart.ts +108 -108
- package/src/core.d.ts +182 -182
- package/src/data/Expression.spec.ts +229 -229
- package/src/data/Expression.ts +233 -233
- package/src/data/Grouper.ts +158 -158
- package/src/data/Selector.ts +10 -10
- package/src/data/StringTemplate.spec.ts +132 -132
- package/src/data/StructuredSelector.ts +146 -146
- package/src/data/ZoomIntoPropertyView.spec.ts +64 -64
- package/src/data/comparer.ts +78 -78
- package/src/data/computable.spec.ts +87 -87
- package/src/data/createStructuredSelector.ts +62 -62
- package/src/data/getAccessor.spec.ts +11 -11
- package/src/data/getAccessor.ts +74 -74
- package/src/data/getSelector.spec.ts +43 -43
- package/src/data/getSelector.ts +66 -66
- package/src/data/ops/filter.spec.ts +35 -35
- package/src/data/ops/filter.ts +9 -9
- package/src/data/ops/merge.ts +13 -13
- package/src/data/ops/removeTreeNodes.spec.ts +37 -37
- package/src/data/ops/updateArray.spec.ts +69 -69
- package/src/data/ops/updateArray.ts +31 -31
- package/src/data/test-types.ts +7 -7
- package/src/hooks/invokeCallback.spec.tsx +4 -4
- package/src/hooks/resolveCallback.spec.tsx +4 -4
- package/src/hooks/store.spec.tsx +15 -15
- package/src/hooks/useTrigger.spec.tsx +16 -10
- package/src/hooks/useTrigger.ts +26 -26
- package/src/index.scss +6 -6
- package/src/jsx-runtime.ts +79 -79
- package/src/svg/BoundedObject.ts +101 -101
- package/src/svg/util/Rect.ts +105 -105
- package/src/ui/CSS.ts +87 -87
- package/src/ui/CSSHelper.ts +17 -17
- package/src/ui/ContentResolver.spec.tsx +31 -29
- package/src/ui/Controller.spec.tsx +47 -39
- package/src/ui/Culture.ts +159 -159
- package/src/ui/Cx.spec.tsx +10 -8
- package/src/ui/DataProxy.spec.tsx +18 -18
- package/src/ui/Instance.ts +866 -866
- package/src/ui/IsolatedScope.spec.tsx +16 -9
- package/src/ui/Prop.ts +140 -140
- package/src/ui/PureContainer.spec.tsx +20 -18
- package/src/ui/RenderingContext.ts +99 -99
- package/src/ui/Repeater.spec.tsx +8 -6
- package/src/ui/Rescope.spec.tsx +13 -13
- package/src/ui/Restate.spec.tsx +31 -27
- package/src/ui/StructuredInstanceDataAccessor.ts +32 -32
- package/src/ui/VDOM.ts +1 -34
- package/src/ui/Widget.tsx +0 -7
- package/src/ui/adapter/TreeAdapter.spec.ts +76 -76
- package/src/ui/adapter/TreeAdapter.ts +185 -185
- package/src/ui/app/History.ts +133 -133
- package/src/ui/app/Url.spec.ts +50 -50
- package/src/ui/app/startAppLoop.tsx +5 -9
- package/src/ui/app/startHotAppLoop.ts +41 -41
- package/src/ui/createFunctionalComponent.spec.tsx +20 -18
- package/src/ui/layout/ContentPlaceholder.spec.tsx +46 -34
- package/src/ui/layout/FirstVisibleChildLayout.spec.tsx +31 -19
- package/src/ui/layout/FirstVisibleChildLayout.ts +60 -60
- package/src/ui/selection/PropertySelection.ts +87 -87
- package/src/util/Component.spec.ts +30 -0
- package/src/util/Component.ts +301 -296
- package/src/util/Console.ts +13 -13
- package/src/util/DOM.ts +88 -88
- package/src/util/hasKey.ts +18 -18
- package/src/util/index.ts +55 -55
- package/src/util/isArray.ts +3 -3
- package/src/util/isDefined.ts +3 -3
- package/src/util/isString.ts +3 -3
- package/src/util/test/createTestRenderer.tsx +9 -2
- package/src/widgets/AccessorBindings.spec.tsx +4 -4
- package/src/widgets/DocumentTitle.ts +95 -95
- package/src/widgets/HtmlElement.spec.tsx +6 -6
- package/src/widgets/ReactElementWrapper.spec.tsx +37 -37
- package/src/widgets/autoFocus.ts +9 -9
- package/src/widgets/cx.ts +63 -63
- package/src/widgets/form/Checkbox.tsx +0 -1
- package/src/widgets/form/ColorField.tsx +15 -12
- package/src/widgets/form/DateTimeField.tsx +0 -2
- package/src/widgets/form/DateTimePicker.tsx +0 -2
- package/src/widgets/form/Radio.tsx +0 -1
- package/src/widgets/form/Slider.tsx +12 -4
- package/src/widgets/form/Switch.tsx +2 -3
- package/src/widgets/form/ValidationGroup.spec.tsx +12 -12
- package/src/widgets/form/Wheel.tsx +0 -1
- package/src/widgets/grid/Grid.tsx +0 -1
- package/src/widgets/grid/GridCellEditor.tsx +7 -1
- package/src/widgets/icons/calendar.tsx +20 -15
- package/src/widgets/icons/check.tsx +2 -1
- package/src/widgets/icons/clear.tsx +2 -1
- package/src/widgets/icons/close.tsx +2 -2
- package/src/widgets/icons/cx.tsx +2 -1
- package/src/widgets/icons/drop-down.tsx +2 -1
- package/src/widgets/icons/file.tsx +2 -1
- package/src/widgets/icons/folder-open.tsx +2 -1
- package/src/widgets/icons/folder.tsx +2 -1
- package/src/widgets/icons/forward.tsx +2 -1
- package/src/widgets/icons/loading.tsx +2 -1
- package/src/widgets/icons/menu.tsx +2 -1
- package/src/widgets/icons/pixel-picker.tsx +2 -2
- package/src/widgets/icons/search.tsx +2 -1
- package/src/widgets/icons/sort-asc.tsx +2 -1
- package/src/widgets/icons/square.tsx +2 -1
- package/src/widgets/nav/Route.spec.tsx +2 -2
- package/src/widgets/overlay/Overlay.tsx +5 -1
- package/src/widgets/overlay/captureMouse.ts +195 -195
- package/src/widgets/overlay/createHotPromiseWindowFactory.ts +71 -71
- package/src/widgets/overlay/index.d.ts +11 -11
- package/src/widgets/overlay/tooltip-ops.ts +173 -173
- package/build/data/ArrayElementView.spec.d.ts +0 -1
- package/build/data/ArrayElementView.spec.js +0 -81
- package/build/data/Binding.spec.d.ts +0 -1
- package/build/data/Binding.spec.js +0 -61
- package/build/data/Expression.spec.d.ts +0 -1
- package/build/data/Expression.spec.js +0 -196
- package/build/data/Grouper.spec.d.ts +0 -1
- package/build/data/Grouper.spec.js +0 -48
- package/build/data/Ref.spec.d.ts +0 -1
- package/build/data/Ref.spec.js +0 -72
- package/build/data/Store.spec.d.ts +0 -1
- package/build/data/Store.spec.js +0 -19
- package/build/data/StoreRef.spec.d.ts +0 -1
- package/build/data/StoreRef.spec.js +0 -22
- package/build/data/StringTemplate.spec.d.ts +0 -1
- package/build/data/StringTemplate.spec.js +0 -112
- package/build/data/StructuredSelector.spec.d.ts +0 -1
- package/build/data/StructuredSelector.spec.js +0 -102
- package/build/data/View.spec.d.ts +0 -1
- package/build/data/View.spec.js +0 -44
- package/build/data/ZoomIntoPropertyView.spec.d.ts +0 -1
- package/build/data/ZoomIntoPropertyView.spec.js +0 -54
- package/build/data/comparer.spec.d.ts +0 -1
- package/build/data/comparer.spec.js +0 -50
- package/build/data/computable.spec.d.ts +0 -1
- package/build/data/computable.spec.js +0 -56
- package/build/data/createAccessorModelProxy.spec.d.ts +0 -1
- package/build/data/createAccessorModelProxy.spec.js +0 -30
- package/build/data/createStructuredSelector.spec.d.ts +0 -1
- package/build/data/createStructuredSelector.spec.js +0 -42
- package/build/data/diff/diffs.spec.d.ts +0 -1
- package/build/data/diff/diffs.spec.js +0 -45
- package/build/data/getAccessor.spec.d.ts +0 -1
- package/build/data/getAccessor.spec.js +0 -10
- package/build/data/getSelector.spec.d.ts +0 -1
- package/build/data/getSelector.spec.js +0 -36
- package/build/data/ops/append.spec.d.ts +0 -1
- package/build/data/ops/append.spec.js +0 -24
- package/build/data/ops/filter.spec.d.ts +0 -1
- package/build/data/ops/filter.spec.js +0 -25
- package/build/data/ops/findTreeNode.spec.d.ts +0 -1
- package/build/data/ops/findTreeNode.spec.js +0 -20
- package/build/data/ops/merge.spec.d.ts +0 -1
- package/build/data/ops/merge.spec.js +0 -23
- package/build/data/ops/removeTreeNodes.spec.d.ts +0 -1
- package/build/data/ops/removeTreeNodes.spec.js +0 -35
- package/build/data/ops/updateArray.spec.d.ts +0 -1
- package/build/data/ops/updateArray.spec.js +0 -33
- package/build/data/ops/updateTree.spec.d.ts +0 -1
- package/build/data/ops/updateTree.spec.js +0 -44
- package/build/hooks/invokeCallback.spec.d.ts +0 -1
- package/build/hooks/invokeCallback.spec.js +0 -44
- package/build/hooks/resolveCallback.spec.d.ts +0 -1
- package/build/hooks/resolveCallback.spec.js +0 -35
- package/build/hooks/store.spec.d.ts +0 -1
- package/build/hooks/store.spec.js +0 -48
- package/build/hooks/useTrigger.spec.d.ts +0 -1
- package/build/hooks/useTrigger.spec.js +0 -59
- package/build/ui/Controller.spec.d.ts +0 -1
- package/build/ui/Controller.spec.js +0 -247
- package/build/ui/Cx.spec.d.ts +0 -1
- package/build/ui/Cx.spec.js +0 -153
- package/build/ui/DataProxy.spec.d.ts +0 -1
- package/build/ui/DataProxy.spec.js +0 -208
- package/build/ui/IsolatedScope.spec.d.ts +0 -1
- package/build/ui/IsolatedScope.spec.js +0 -42
- package/build/ui/PureContainer.spec.d.ts +0 -1
- package/build/ui/PureContainer.spec.js +0 -149
- package/build/ui/Repeater.spec.d.ts +0 -1
- package/build/ui/Repeater.spec.js +0 -109
- package/build/ui/Rescope.spec.d.ts +0 -1
- package/build/ui/Rescope.spec.js +0 -134
- package/build/ui/Restate.spec.d.ts +0 -1
- package/build/ui/Restate.spec.js +0 -257
- package/build/ui/adapter/ArrayAdapter.spec.d.ts +0 -1
- package/build/ui/adapter/ArrayAdapter.spec.js +0 -44
- package/build/ui/adapter/TreeAdapter.spec.d.ts +0 -1
- package/build/ui/adapter/TreeAdapter.spec.js +0 -71
- package/build/ui/app/Url.spec.d.ts +0 -1
- package/build/ui/app/Url.spec.js +0 -43
- package/build/ui/createFunctionalComponent.spec.d.ts +0 -1
- package/build/ui/createFunctionalComponent.spec.js +0 -272
- package/build/ui/layout/ContentPlaceholder.spec.d.ts +0 -1
- package/build/ui/layout/ContentPlaceholder.spec.js +0 -333
- package/build/ui/layout/FirstVisibleChildLayout.spec.d.ts +0 -1
- package/build/ui/layout/FirstVisibleChildLayout.spec.js +0 -101
- package/build/util/Format.spec.d.ts +0 -1
- package/build/util/Format.spec.js +0 -58
- package/build/util/TraversalStack.spec.d.ts +0 -1
- package/build/util/TraversalStack.spec.js +0 -43
- package/build/util/date/upperBoundCheck.spec.d.ts +0 -1
- package/build/util/date/upperBoundCheck.spec.js +0 -22
- package/build/util/getSearchQueryPredicate.spec.d.ts +0 -1
- package/build/util/getSearchQueryPredicate.spec.js +0 -33
- package/build/util/isValidIdentifierName.spec.d.ts +0 -1
- package/build/util/isValidIdentifierName.spec.js +0 -28
- package/build/util/routeAppend.spec.d.ts +0 -1
- package/build/util/routeAppend.spec.js +0 -14
- package/build/widgets/AccessorBindings.spec.d.ts +0 -1
- package/build/widgets/AccessorBindings.spec.js +0 -40
- package/build/widgets/HtmlElement.spec.d.ts +0 -1
- package/build/widgets/HtmlElement.spec.js +0 -38
- package/build/widgets/form/ValidationGroup.spec.d.ts +0 -1
- package/build/widgets/form/ValidationGroup.spec.js +0 -62
- package/build/widgets/nav/Route.spec.d.ts +0 -1
- package/build/widgets/nav/Route.spec.js +0 -15
- package/dist/manifest.d.ts +0 -1443
package/src/util/DOM.ts
CHANGED
|
@@ -1,88 +1,88 @@
|
|
|
1
|
-
import { isNumber } from "../util/isNumber";
|
|
2
|
-
|
|
3
|
-
type ElementFilter = (el: Element, condition: (el: Element) => boolean) => Element | null;
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Returns first child element, or the parent element itself, that satisfies the `condition` function.
|
|
7
|
-
* @param el
|
|
8
|
-
* @param condition
|
|
9
|
-
* @returns {Element}
|
|
10
|
-
*/
|
|
11
|
-
export function findFirst<T extends Element>(el: Element, condition: (el: Element) => el is T): T | null;
|
|
12
|
-
export function findFirst(el: Element, condition: (el: Element) => boolean): Element | null;
|
|
13
|
-
export function findFirst(el: Element, condition: (el: Element) => boolean): Element | null {
|
|
14
|
-
if (condition(el)) return el;
|
|
15
|
-
|
|
16
|
-
var children = el.children;
|
|
17
|
-
if (children)
|
|
18
|
-
for (var i = 0; i < children.length; i++) {
|
|
19
|
-
var child = findFirst(children[i], condition);
|
|
20
|
-
if (child) return child;
|
|
21
|
-
}
|
|
22
|
-
return null;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
export function findFirstChild<T extends Element>(el: Element, condition: (el: Element) => el is T): T | null;
|
|
26
|
-
export function findFirstChild(el: Element, condition: (el: Element) => boolean): Element | null;
|
|
27
|
-
export function findFirstChild(el: Element, condition: (el: Element) => boolean): Element | null {
|
|
28
|
-
var children = el.children;
|
|
29
|
-
if (children)
|
|
30
|
-
for (var i = 0; i < children.length; i++) {
|
|
31
|
-
var child = findFirst(children[i], condition);
|
|
32
|
-
if (child) return child;
|
|
33
|
-
}
|
|
34
|
-
return null;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
export function closest(el: HTMLElement | null, condition: (el: HTMLElement) => boolean): HTMLElement | null;
|
|
38
|
-
export function closest(el: Element | null, condition: (el: Element) => boolean): Element | null;
|
|
39
|
-
export function closest(el: Element | null, condition: (el: any) => boolean): Element | null {
|
|
40
|
-
while (el) {
|
|
41
|
-
if (condition(el)) return el;
|
|
42
|
-
el = el.parentElement;
|
|
43
|
-
}
|
|
44
|
-
return null;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
export function closestParent(el: HTMLElement, condition: (el: HTMLElement) => boolean): HTMLElement | null;
|
|
48
|
-
export function closestParent(el: Element, condition: (el: HTMLElement) => boolean): HTMLElement | null;
|
|
49
|
-
export function closestParent(el: Element, condition: (el: any) => boolean): HTMLElement | null {
|
|
50
|
-
return el && closest(el.parentElement, condition);
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
export function isFocused(el: Element): boolean {
|
|
54
|
-
return document.activeElement == el;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
export function isFocusedDeep(el: Element): boolean {
|
|
58
|
-
return document.activeElement == el || (!!document.activeElement && el.contains(document.activeElement));
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
const focusableWithoutTabIndex = ["INPUT", "SELECT", "TEXTAREA", "A", "BUTTON"];
|
|
62
|
-
|
|
63
|
-
export function isFocusable(el: Element): el is HTMLElement {
|
|
64
|
-
if (!(el instanceof HTMLElement)) return false;
|
|
65
|
-
|
|
66
|
-
var firstPass = el && isNumber(el.tabIndex) && el.tabIndex >= 0;
|
|
67
|
-
if (!firstPass) return false;
|
|
68
|
-
|
|
69
|
-
if (focusableWithoutTabIndex.indexOf(el.tagName) != -1 && !el.hasAttribute("disabled")) return true;
|
|
70
|
-
|
|
71
|
-
return el.hasAttribute("tabindex");
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
/**
|
|
75
|
-
* Returns focused element.
|
|
76
|
-
* @returns {Element}
|
|
77
|
-
*/
|
|
78
|
-
export function getFocusedElement(): Element | null {
|
|
79
|
-
return document.activeElement;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
export function isDescendant(el: Element, descEl: Element): boolean {
|
|
83
|
-
return el.contains(descEl);
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
export function isSelfOrDescendant(el: Element, descEl: Element): boolean {
|
|
87
|
-
return el == descEl || el.contains(descEl);
|
|
88
|
-
}
|
|
1
|
+
import { isNumber } from "../util/isNumber";
|
|
2
|
+
|
|
3
|
+
type ElementFilter = (el: Element, condition: (el: Element) => boolean) => Element | null;
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Returns first child element, or the parent element itself, that satisfies the `condition` function.
|
|
7
|
+
* @param el
|
|
8
|
+
* @param condition
|
|
9
|
+
* @returns {Element}
|
|
10
|
+
*/
|
|
11
|
+
export function findFirst<T extends Element>(el: Element, condition: (el: Element) => el is T): T | null;
|
|
12
|
+
export function findFirst(el: Element, condition: (el: Element) => boolean): Element | null;
|
|
13
|
+
export function findFirst(el: Element, condition: (el: Element) => boolean): Element | null {
|
|
14
|
+
if (condition(el)) return el;
|
|
15
|
+
|
|
16
|
+
var children = el.children;
|
|
17
|
+
if (children)
|
|
18
|
+
for (var i = 0; i < children.length; i++) {
|
|
19
|
+
var child = findFirst(children[i], condition);
|
|
20
|
+
if (child) return child;
|
|
21
|
+
}
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export function findFirstChild<T extends Element>(el: Element, condition: (el: Element) => el is T): T | null;
|
|
26
|
+
export function findFirstChild(el: Element, condition: (el: Element) => boolean): Element | null;
|
|
27
|
+
export function findFirstChild(el: Element, condition: (el: Element) => boolean): Element | null {
|
|
28
|
+
var children = el.children;
|
|
29
|
+
if (children)
|
|
30
|
+
for (var i = 0; i < children.length; i++) {
|
|
31
|
+
var child = findFirst(children[i], condition);
|
|
32
|
+
if (child) return child;
|
|
33
|
+
}
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export function closest(el: HTMLElement | null, condition: (el: HTMLElement) => boolean): HTMLElement | null;
|
|
38
|
+
export function closest(el: Element | null, condition: (el: Element) => boolean): Element | null;
|
|
39
|
+
export function closest(el: Element | null, condition: (el: any) => boolean): Element | null {
|
|
40
|
+
while (el) {
|
|
41
|
+
if (condition(el)) return el;
|
|
42
|
+
el = el.parentElement;
|
|
43
|
+
}
|
|
44
|
+
return null;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export function closestParent(el: HTMLElement, condition: (el: HTMLElement) => boolean): HTMLElement | null;
|
|
48
|
+
export function closestParent(el: Element, condition: (el: HTMLElement) => boolean): HTMLElement | null;
|
|
49
|
+
export function closestParent(el: Element, condition: (el: any) => boolean): HTMLElement | null {
|
|
50
|
+
return el && closest(el.parentElement, condition);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export function isFocused(el: Element): boolean {
|
|
54
|
+
return document.activeElement == el;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export function isFocusedDeep(el: Element): boolean {
|
|
58
|
+
return document.activeElement == el || (!!document.activeElement && el.contains(document.activeElement));
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const focusableWithoutTabIndex = ["INPUT", "SELECT", "TEXTAREA", "A", "BUTTON"];
|
|
62
|
+
|
|
63
|
+
export function isFocusable(el: Element): el is HTMLElement {
|
|
64
|
+
if (!(el instanceof HTMLElement)) return false;
|
|
65
|
+
|
|
66
|
+
var firstPass = el && isNumber(el.tabIndex) && el.tabIndex >= 0;
|
|
67
|
+
if (!firstPass) return false;
|
|
68
|
+
|
|
69
|
+
if (focusableWithoutTabIndex.indexOf(el.tagName) != -1 && !el.hasAttribute("disabled")) return true;
|
|
70
|
+
|
|
71
|
+
return el.hasAttribute("tabindex");
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Returns focused element.
|
|
76
|
+
* @returns {Element}
|
|
77
|
+
*/
|
|
78
|
+
export function getFocusedElement(): Element | null {
|
|
79
|
+
return document.activeElement;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export function isDescendant(el: Element, descEl: Element): boolean {
|
|
83
|
+
return el.contains(descEl);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
export function isSelfOrDescendant(el: Element, descEl: Element): boolean {
|
|
87
|
+
return el == descEl || el.contains(descEl);
|
|
88
|
+
}
|
package/src/util/hasKey.ts
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
import { isFunction } from "./isFunction";
|
|
2
|
-
import { isString } from "./isString";
|
|
3
|
-
|
|
4
|
-
export function hasKey<K extends string>(obj: object, key: K): obj is Record<K, unknown> {
|
|
5
|
-
return key in obj;
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
export function hasStringAtKey<K extends string>(obj: object, key: K): obj is Record<K, string> {
|
|
9
|
-
return hasKey(obj, key) && isString(obj[key]);
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
export function hasValueAtKey<K extends string>(obj: object, key: K, value: unknown): obj is Record<K, unknown> {
|
|
13
|
-
return hasKey(obj, key) && obj[key] === value;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export function hasFunctionAtKey<K extends string>(obj: object, key: K): obj is Record<K, (...args: any[]) => any> {
|
|
17
|
-
return hasKey(obj, key) && isFunction(obj[key]);
|
|
18
|
-
}
|
|
1
|
+
import { isFunction } from "./isFunction";
|
|
2
|
+
import { isString } from "./isString";
|
|
3
|
+
|
|
4
|
+
export function hasKey<K extends string>(obj: object, key: K): obj is Record<K, unknown> {
|
|
5
|
+
return key in obj;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export function hasStringAtKey<K extends string>(obj: object, key: K): obj is Record<K, string> {
|
|
9
|
+
return hasKey(obj, key) && isString(obj[key]);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export function hasValueAtKey<K extends string>(obj: object, key: K, value: unknown): obj is Record<K, unknown> {
|
|
13
|
+
return hasKey(obj, key) && obj[key] === value;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export function hasFunctionAtKey<K extends string>(obj: object, key: K): obj is Record<K, (...args: any[]) => any> {
|
|
17
|
+
return hasKey(obj, key) && isFunction(obj[key]);
|
|
18
|
+
}
|
package/src/util/index.ts
CHANGED
|
@@ -1,55 +1,55 @@
|
|
|
1
|
-
export * from "./Console";
|
|
2
|
-
export * from "./Debug";
|
|
3
|
-
export * from "./DOM";
|
|
4
|
-
export * from "./Format";
|
|
5
|
-
export * from "./expandFatArrows";
|
|
6
|
-
export * from "./GlobalCacheIdentifier";
|
|
7
|
-
export * from "./innerTextTrim";
|
|
8
|
-
export * from "./isDigit";
|
|
9
|
-
export * from "./isPromise";
|
|
10
|
-
export * from "./isTouchDevice";
|
|
11
|
-
export * from "./KeyCode";
|
|
12
|
-
export * from "./parseStyle";
|
|
13
|
-
export * from "./quote";
|
|
14
|
-
export * from "./scrollElementIntoView";
|
|
15
|
-
export * from "./shallowEquals";
|
|
16
|
-
export * from "./Timing";
|
|
17
|
-
export * from "./date/index";
|
|
18
|
-
export * from "./color/index";
|
|
19
|
-
export * from "./getVendorPrefix";
|
|
20
|
-
export * from "./eventCallbacks";
|
|
21
|
-
export * from "./getSearchQueryPredicate";
|
|
22
|
-
export * from "./escapeSpecialRegexCharacters";
|
|
23
|
-
export * from "./browserSupportsPassiveEventHandlers";
|
|
24
|
-
export * from "./isTouchEvent";
|
|
25
|
-
export * from "./debounce";
|
|
26
|
-
export * from "./throttle";
|
|
27
|
-
export * from "./SubscriberList";
|
|
28
|
-
export * from "./findScrollableParent";
|
|
29
|
-
export * from "./getScrollerBoundingClientRect";
|
|
30
|
-
export * from "./isNonEmptyArray";
|
|
31
|
-
export * from "./isArray";
|
|
32
|
-
export * from "./isObject";
|
|
33
|
-
export * from "./isNumber";
|
|
34
|
-
export * from "./isFunction";
|
|
35
|
-
export * from "./isString";
|
|
36
|
-
export * from "./isUndefined";
|
|
37
|
-
export * from "./isDefined";
|
|
38
|
-
export * from "./routeAppend";
|
|
39
|
-
export * from "./reverseSlice";
|
|
40
|
-
export * from "./getTopLevelBoundingClientRect";
|
|
41
|
-
export * from "./getParentFrameBoundingClientRect";
|
|
42
|
-
export * from "./getActiveElement";
|
|
43
|
-
export * from "./Component";
|
|
44
|
-
export * from "./onIdleCallback";
|
|
45
|
-
export * from "./validatedDebounce";
|
|
46
|
-
export * from "./addEventListenerWithOptions";
|
|
47
|
-
export * from "./coalesce";
|
|
48
|
-
export * from "./dummyCallback";
|
|
49
|
-
export * from "./calculateNaturalElementHeight";
|
|
50
|
-
export * from "./isTextInputElement";
|
|
51
|
-
export * from "./capitalize";
|
|
52
|
-
export * from "./isValidIdentifierName";
|
|
53
|
-
export * from "./isDataRecord";
|
|
54
|
-
export * from "./TraversalStack";
|
|
55
|
-
export * from "./hasKey"
|
|
1
|
+
export * from "./Console";
|
|
2
|
+
export * from "./Debug";
|
|
3
|
+
export * from "./DOM";
|
|
4
|
+
export * from "./Format";
|
|
5
|
+
export * from "./expandFatArrows";
|
|
6
|
+
export * from "./GlobalCacheIdentifier";
|
|
7
|
+
export * from "./innerTextTrim";
|
|
8
|
+
export * from "./isDigit";
|
|
9
|
+
export * from "./isPromise";
|
|
10
|
+
export * from "./isTouchDevice";
|
|
11
|
+
export * from "./KeyCode";
|
|
12
|
+
export * from "./parseStyle";
|
|
13
|
+
export * from "./quote";
|
|
14
|
+
export * from "./scrollElementIntoView";
|
|
15
|
+
export * from "./shallowEquals";
|
|
16
|
+
export * from "./Timing";
|
|
17
|
+
export * from "./date/index";
|
|
18
|
+
export * from "./color/index";
|
|
19
|
+
export * from "./getVendorPrefix";
|
|
20
|
+
export * from "./eventCallbacks";
|
|
21
|
+
export * from "./getSearchQueryPredicate";
|
|
22
|
+
export * from "./escapeSpecialRegexCharacters";
|
|
23
|
+
export * from "./browserSupportsPassiveEventHandlers";
|
|
24
|
+
export * from "./isTouchEvent";
|
|
25
|
+
export * from "./debounce";
|
|
26
|
+
export * from "./throttle";
|
|
27
|
+
export * from "./SubscriberList";
|
|
28
|
+
export * from "./findScrollableParent";
|
|
29
|
+
export * from "./getScrollerBoundingClientRect";
|
|
30
|
+
export * from "./isNonEmptyArray";
|
|
31
|
+
export * from "./isArray";
|
|
32
|
+
export * from "./isObject";
|
|
33
|
+
export * from "./isNumber";
|
|
34
|
+
export * from "./isFunction";
|
|
35
|
+
export * from "./isString";
|
|
36
|
+
export * from "./isUndefined";
|
|
37
|
+
export * from "./isDefined";
|
|
38
|
+
export * from "./routeAppend";
|
|
39
|
+
export * from "./reverseSlice";
|
|
40
|
+
export * from "./getTopLevelBoundingClientRect";
|
|
41
|
+
export * from "./getParentFrameBoundingClientRect";
|
|
42
|
+
export * from "./getActiveElement";
|
|
43
|
+
export * from "./Component";
|
|
44
|
+
export * from "./onIdleCallback";
|
|
45
|
+
export * from "./validatedDebounce";
|
|
46
|
+
export * from "./addEventListenerWithOptions";
|
|
47
|
+
export * from "./coalesce";
|
|
48
|
+
export * from "./dummyCallback";
|
|
49
|
+
export * from "./calculateNaturalElementHeight";
|
|
50
|
+
export * from "./isTextInputElement";
|
|
51
|
+
export * from "./capitalize";
|
|
52
|
+
export * from "./isValidIdentifierName";
|
|
53
|
+
export * from "./isDataRecord";
|
|
54
|
+
export * from "./TraversalStack";
|
|
55
|
+
export * from "./hasKey"
|
package/src/util/isArray.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export function isArray<T = unknown>(x: unknown): x is T[] {
|
|
2
|
-
return Array.isArray(x);
|
|
3
|
-
}
|
|
1
|
+
export function isArray<T = unknown>(x: unknown): x is T[] {
|
|
2
|
+
return Array.isArray(x);
|
|
3
|
+
}
|
package/src/util/isDefined.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export function isDefined<T>(x: T | undefined): x is T {
|
|
2
|
-
return x !== undefined;
|
|
3
|
-
}
|
|
1
|
+
export function isDefined<T>(x: T | undefined): x is T {
|
|
2
|
+
return x !== undefined;
|
|
3
|
+
}
|
package/src/util/isString.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export function isString(x: unknown): x is string {
|
|
2
|
-
return typeof x === "string";
|
|
3
|
-
}
|
|
1
|
+
export function isString(x: unknown): x is string {
|
|
2
|
+
return typeof x === "string";
|
|
3
|
+
}
|
|
@@ -1,12 +1,19 @@
|
|
|
1
1
|
/** @jsxImportSource react */
|
|
2
2
|
import renderer from "react-test-renderer";
|
|
3
|
+
import { act } from "react";
|
|
3
4
|
import { Cx } from "../../ui/Cx";
|
|
4
5
|
import { View } from "../../data/View";
|
|
5
6
|
|
|
6
|
-
export function createTestRenderer(store: View, widget: any) {
|
|
7
|
-
|
|
7
|
+
export async function createTestRenderer(store: View, widget: any) {
|
|
8
|
+
let result: renderer.ReactTestRenderer;
|
|
9
|
+
await act(async () => {
|
|
10
|
+
result = renderer.create(createTestWidget(store, widget));
|
|
11
|
+
});
|
|
12
|
+
return result!;
|
|
8
13
|
}
|
|
9
14
|
|
|
10
15
|
export function createTestWidget(store: View, widget: any) {
|
|
11
16
|
return <Cx widget={widget} store={store} subscribe immediate />;
|
|
12
17
|
}
|
|
18
|
+
|
|
19
|
+
export { act };
|
|
@@ -15,7 +15,7 @@ interface Model {
|
|
|
15
15
|
let { $page } = createAccessorModelProxy<Model>();
|
|
16
16
|
|
|
17
17
|
describe("Accessors", () => {
|
|
18
|
-
it("work as regular bindings", () => {
|
|
18
|
+
it("work as regular bindings", async () => {
|
|
19
19
|
let widget = (
|
|
20
20
|
<cx>
|
|
21
21
|
<div text={$page.text} />
|
|
@@ -30,7 +30,7 @@ describe("Accessors", () => {
|
|
|
30
30
|
},
|
|
31
31
|
});
|
|
32
32
|
|
|
33
|
-
const component = createTestRenderer(store, widget);
|
|
33
|
+
const component = await createTestRenderer(store, widget);
|
|
34
34
|
|
|
35
35
|
let tree = component.toJSON();
|
|
36
36
|
assert(tree && !Array.isArray(tree));
|
|
@@ -38,7 +38,7 @@ describe("Accessors", () => {
|
|
|
38
38
|
assert.deepStrictEqual(tree.children, ["Test"]);
|
|
39
39
|
});
|
|
40
40
|
|
|
41
|
-
it("support expressions", () => {
|
|
41
|
+
it("support expressions", async () => {
|
|
42
42
|
let widget = (
|
|
43
43
|
<cx>
|
|
44
44
|
<div text={expr($page.a, $page.b, (a, b) => a + b)} />
|
|
@@ -54,7 +54,7 @@ describe("Accessors", () => {
|
|
|
54
54
|
},
|
|
55
55
|
});
|
|
56
56
|
|
|
57
|
-
const component = createTestRenderer(store, widget);
|
|
57
|
+
const component = await createTestRenderer(store, widget);
|
|
58
58
|
|
|
59
59
|
let tree = component.toJSON();
|
|
60
60
|
assert(tree && !Array.isArray(tree));
|
|
@@ -1,95 +1,95 @@
|
|
|
1
|
-
import { Widget, WidgetConfig } from "../ui/Widget";
|
|
2
|
-
import { RenderingContext } from "../ui/RenderingContext";
|
|
3
|
-
import { Instance } from "../ui/Instance";
|
|
4
|
-
import { StringProp } from "../ui/Prop";
|
|
5
|
-
|
|
6
|
-
export interface DocumentTitleConfig extends WidgetConfig {
|
|
7
|
-
/** Text value to be used for the document title. */
|
|
8
|
-
value?: StringProp;
|
|
9
|
-
|
|
10
|
-
/** Text value to be used for the document title. */
|
|
11
|
-
text?: StringProp;
|
|
12
|
-
|
|
13
|
-
/** Deprecated. Use `action: "append"` instead. */
|
|
14
|
-
append?: boolean;
|
|
15
|
-
|
|
16
|
-
/** How to combine the title with existing document title. Default is `append`. */
|
|
17
|
-
action?: "append" | "replace" | "prepend";
|
|
18
|
-
|
|
19
|
-
/** Separator used when appending or prepending to the title. Default is empty string. */
|
|
20
|
-
separator?: StringProp;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
export class DocumentTitle extends Widget<DocumentTitleConfig> {
|
|
24
|
-
declare value?: StringProp;
|
|
25
|
-
declare text?: StringProp;
|
|
26
|
-
declare append?: boolean;
|
|
27
|
-
declare action?: "append" | "replace" | "prepend";
|
|
28
|
-
declare separator?: StringProp;
|
|
29
|
-
|
|
30
|
-
constructor(config?: DocumentTitleConfig) {
|
|
31
|
-
super(config);
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
init(): void {
|
|
35
|
-
if (this.value) this.text = this.value;
|
|
36
|
-
|
|
37
|
-
if (this.append) this.action = "append";
|
|
38
|
-
|
|
39
|
-
super.init();
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
declareData(...args: Record<string, unknown>[]): void {
|
|
43
|
-
super.declareData(...args, {
|
|
44
|
-
value: undefined,
|
|
45
|
-
text: undefined,
|
|
46
|
-
action: undefined,
|
|
47
|
-
separator: undefined,
|
|
48
|
-
});
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
explore(context: RenderingContext, instance: Instance): void {
|
|
52
|
-
if (!(context as any).documentTitle) {
|
|
53
|
-
(context as any).documentTitle = {
|
|
54
|
-
activeInstance: instance,
|
|
55
|
-
title: "",
|
|
56
|
-
};
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
let { data } = instance;
|
|
60
|
-
|
|
61
|
-
if (data.text) {
|
|
62
|
-
switch (data.action) {
|
|
63
|
-
case "append":
|
|
64
|
-
if ((context as any).documentTitle.title) (context as any).documentTitle.title += data.separator;
|
|
65
|
-
(context as any).documentTitle.title += data.text;
|
|
66
|
-
break;
|
|
67
|
-
|
|
68
|
-
case "prepend":
|
|
69
|
-
(context as any).documentTitle.title = data.text + data.separator + (context as any).documentTitle.title;
|
|
70
|
-
break;
|
|
71
|
-
|
|
72
|
-
default:
|
|
73
|
-
case "replace":
|
|
74
|
-
(context as any).documentTitle.title = data.text;
|
|
75
|
-
break;
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
super.explore(context, instance);
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
prepare(context: RenderingContext, instance: Instance): void {
|
|
83
|
-
if ((context as any).documentTitle.activeInstance == instance)
|
|
84
|
-
document.title = (context as any).documentTitle.title;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
render(): null {
|
|
88
|
-
return null;
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
DocumentTitle.prototype.action = "append";
|
|
93
|
-
DocumentTitle.prototype.separator = "";
|
|
94
|
-
|
|
95
|
-
Widget.alias("document-title", DocumentTitle);
|
|
1
|
+
import { Widget, WidgetConfig } from "../ui/Widget";
|
|
2
|
+
import { RenderingContext } from "../ui/RenderingContext";
|
|
3
|
+
import { Instance } from "../ui/Instance";
|
|
4
|
+
import { StringProp } from "../ui/Prop";
|
|
5
|
+
|
|
6
|
+
export interface DocumentTitleConfig extends WidgetConfig {
|
|
7
|
+
/** Text value to be used for the document title. */
|
|
8
|
+
value?: StringProp;
|
|
9
|
+
|
|
10
|
+
/** Text value to be used for the document title. */
|
|
11
|
+
text?: StringProp;
|
|
12
|
+
|
|
13
|
+
/** Deprecated. Use `action: "append"` instead. */
|
|
14
|
+
append?: boolean;
|
|
15
|
+
|
|
16
|
+
/** How to combine the title with existing document title. Default is `append`. */
|
|
17
|
+
action?: "append" | "replace" | "prepend";
|
|
18
|
+
|
|
19
|
+
/** Separator used when appending or prepending to the title. Default is empty string. */
|
|
20
|
+
separator?: StringProp;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export class DocumentTitle extends Widget<DocumentTitleConfig> {
|
|
24
|
+
declare value?: StringProp;
|
|
25
|
+
declare text?: StringProp;
|
|
26
|
+
declare append?: boolean;
|
|
27
|
+
declare action?: "append" | "replace" | "prepend";
|
|
28
|
+
declare separator?: StringProp;
|
|
29
|
+
|
|
30
|
+
constructor(config?: DocumentTitleConfig) {
|
|
31
|
+
super(config);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
init(): void {
|
|
35
|
+
if (this.value) this.text = this.value;
|
|
36
|
+
|
|
37
|
+
if (this.append) this.action = "append";
|
|
38
|
+
|
|
39
|
+
super.init();
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
declareData(...args: Record<string, unknown>[]): void {
|
|
43
|
+
super.declareData(...args, {
|
|
44
|
+
value: undefined,
|
|
45
|
+
text: undefined,
|
|
46
|
+
action: undefined,
|
|
47
|
+
separator: undefined,
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
explore(context: RenderingContext, instance: Instance): void {
|
|
52
|
+
if (!(context as any).documentTitle) {
|
|
53
|
+
(context as any).documentTitle = {
|
|
54
|
+
activeInstance: instance,
|
|
55
|
+
title: "",
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
let { data } = instance;
|
|
60
|
+
|
|
61
|
+
if (data.text) {
|
|
62
|
+
switch (data.action) {
|
|
63
|
+
case "append":
|
|
64
|
+
if ((context as any).documentTitle.title) (context as any).documentTitle.title += data.separator;
|
|
65
|
+
(context as any).documentTitle.title += data.text;
|
|
66
|
+
break;
|
|
67
|
+
|
|
68
|
+
case "prepend":
|
|
69
|
+
(context as any).documentTitle.title = data.text + data.separator + (context as any).documentTitle.title;
|
|
70
|
+
break;
|
|
71
|
+
|
|
72
|
+
default:
|
|
73
|
+
case "replace":
|
|
74
|
+
(context as any).documentTitle.title = data.text;
|
|
75
|
+
break;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
super.explore(context, instance);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
prepare(context: RenderingContext, instance: Instance): void {
|
|
83
|
+
if ((context as any).documentTitle.activeInstance == instance)
|
|
84
|
+
document.title = (context as any).documentTitle.title;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
render(): null {
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
DocumentTitle.prototype.action = "append";
|
|
93
|
+
DocumentTitle.prototype.separator = "";
|
|
94
|
+
|
|
95
|
+
Widget.alias("document-title", DocumentTitle);
|
|
@@ -5,7 +5,7 @@ import { bind } from "../ui/bind";
|
|
|
5
5
|
import { VDOM } from "../ui/Widget";
|
|
6
6
|
|
|
7
7
|
describe("HtmlElement", () => {
|
|
8
|
-
it("renders textual content provided through the text property", () => {
|
|
8
|
+
it("renders textual content provided through the text property", async () => {
|
|
9
9
|
let widget = (
|
|
10
10
|
<cx>
|
|
11
11
|
<div text={bind("text")} />
|
|
@@ -18,7 +18,7 @@ describe("HtmlElement", () => {
|
|
|
18
18
|
},
|
|
19
19
|
});
|
|
20
20
|
|
|
21
|
-
const component = createTestRenderer(store, widget);
|
|
21
|
+
const component = await createTestRenderer(store, widget);
|
|
22
22
|
|
|
23
23
|
let tree = component.toJSON();
|
|
24
24
|
assert(tree && !Array.isArray(tree), "Expected single element");
|
|
@@ -26,14 +26,14 @@ describe("HtmlElement", () => {
|
|
|
26
26
|
assert.deepEqual(tree.children, ["Test"]);
|
|
27
27
|
});
|
|
28
28
|
|
|
29
|
-
it("allows spread bindings", () => {
|
|
29
|
+
it("allows spread bindings", async () => {
|
|
30
30
|
let store = new Store({
|
|
31
31
|
data: {
|
|
32
32
|
title: "title",
|
|
33
33
|
},
|
|
34
34
|
});
|
|
35
35
|
|
|
36
|
-
const component = createTestRenderer(
|
|
36
|
+
const component = await createTestRenderer(
|
|
37
37
|
store,
|
|
38
38
|
<cx>
|
|
39
39
|
<a href="#" {...{ title: { bind: "title" } }}>
|
|
@@ -54,10 +54,10 @@ describe("HtmlElement", () => {
|
|
|
54
54
|
});
|
|
55
55
|
});
|
|
56
56
|
|
|
57
|
-
it("supports SVG elements with camelCase attributes", () => {
|
|
57
|
+
it("supports SVG elements with camelCase attributes", async () => {
|
|
58
58
|
let store = new Store();
|
|
59
59
|
|
|
60
|
-
const component = createTestRenderer(
|
|
60
|
+
const component = await createTestRenderer(
|
|
61
61
|
store,
|
|
62
62
|
<cx>
|
|
63
63
|
<svg>
|