@fluentui/react-tree 9.2.1 → 9.4.0
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/CHANGELOG.json +258 -1
- package/CHANGELOG.md +67 -2
- package/dist/index.d.ts +49 -20
- package/lib/components/FlatTree/FlatTree.types.js.map +1 -1
- package/lib/components/FlatTree/renderFlatTree.js.map +1 -1
- package/lib/components/FlatTree/useFlatTree.js +71 -2
- package/lib/components/FlatTree/useFlatTree.js.map +1 -1
- package/lib/components/FlatTree/useFlatTreeContextValues.js +20 -2
- package/lib/components/FlatTree/useFlatTreeContextValues.js.map +1 -1
- package/lib/components/FlatTree/useFlatTreeNavigation.js +28 -14
- package/lib/components/FlatTree/useFlatTreeNavigation.js.map +1 -1
- package/lib/components/FlatTree/useHeadlessFlatTree.js +16 -16
- package/lib/components/FlatTree/useHeadlessFlatTree.js.map +1 -1
- package/lib/components/Tree/Tree.types.js.map +1 -1
- package/lib/components/Tree/renderTree.js +1 -1
- package/lib/components/Tree/renderTree.js.map +1 -1
- package/lib/components/Tree/useTree.js +11 -14
- package/lib/components/Tree/useTree.js.map +1 -1
- package/lib/components/Tree/useTreeContextValues.js +29 -15
- package/lib/components/Tree/useTreeContextValues.js.map +1 -1
- package/lib/components/TreeItem/TreeItem.types.js.map +1 -1
- package/lib/components/TreeItem/useTreeItem.js +52 -26
- package/lib/components/TreeItem/useTreeItem.js.map +1 -1
- package/lib/components/TreeItemLayout/useTreeItemLayout.js +2 -3
- package/lib/components/TreeItemLayout/useTreeItemLayout.js.map +1 -1
- package/lib/components/TreeProvider.js +21 -0
- package/lib/components/TreeProvider.js.map +1 -0
- package/lib/contexts/index.js +1 -0
- package/lib/contexts/index.js.map +1 -1
- package/lib/contexts/subtreeContext.js +14 -0
- package/lib/contexts/subtreeContext.js.map +1 -0
- package/lib/contexts/treeContext.js +9 -5
- package/lib/contexts/treeContext.js.map +1 -1
- package/lib/hooks/useRootTree.js +25 -78
- package/lib/hooks/useRootTree.js.map +1 -1
- package/lib/hooks/useSubtree.js +2 -14
- package/lib/hooks/useSubtree.js.map +1 -1
- package/lib/index.js +2 -1
- package/lib/index.js.map +1 -1
- package/lib/utils/createHTMLElementWalker.js +2 -3
- package/lib/utils/createHTMLElementWalker.js.map +1 -1
- package/lib/utils/createHeadlessTree.js +5 -3
- package/lib/utils/createHeadlessTree.js.map +1 -1
- package/lib/utils/flattenTree.js +1 -2
- package/lib/utils/flattenTree.js.map +1 -1
- package/lib/utils/normalizeOpenItems.js +1 -2
- package/lib/utils/normalizeOpenItems.js.map +1 -1
- package/lib-commonjs/components/FlatTree/useFlatTree.js +71 -2
- package/lib-commonjs/components/FlatTree/useFlatTree.js.map +1 -1
- package/lib-commonjs/components/FlatTree/useFlatTreeContextValues.js +20 -2
- package/lib-commonjs/components/FlatTree/useFlatTreeContextValues.js.map +1 -1
- package/lib-commonjs/components/FlatTree/useFlatTreeNavigation.js +27 -13
- package/lib-commonjs/components/FlatTree/useFlatTreeNavigation.js.map +1 -1
- package/lib-commonjs/components/FlatTree/useHeadlessFlatTree.js +16 -16
- package/lib-commonjs/components/FlatTree/useHeadlessFlatTree.js.map +1 -1
- package/lib-commonjs/components/Tree/renderTree.js +2 -2
- package/lib-commonjs/components/Tree/renderTree.js.map +1 -1
- package/lib-commonjs/components/Tree/useTree.js +11 -14
- package/lib-commonjs/components/Tree/useTree.js.map +1 -1
- package/lib-commonjs/components/Tree/useTreeContextValues.js +30 -15
- package/lib-commonjs/components/Tree/useTreeContextValues.js.map +1 -1
- package/lib-commonjs/components/TreeItem/useTreeItem.js +55 -29
- package/lib-commonjs/components/TreeItem/useTreeItem.js.map +1 -1
- package/lib-commonjs/components/TreeItemLayout/useTreeItemLayout.js +2 -3
- package/lib-commonjs/components/TreeItemLayout/useTreeItemLayout.js.map +1 -1
- package/lib-commonjs/components/TreeProvider.js +32 -0
- package/lib-commonjs/components/TreeProvider.js.map +1 -0
- package/lib-commonjs/contexts/index.js +1 -0
- package/lib-commonjs/contexts/index.js.map +1 -1
- package/lib-commonjs/contexts/subtreeContext.js +31 -0
- package/lib-commonjs/contexts/subtreeContext.js.map +1 -0
- package/lib-commonjs/contexts/treeContext.js +6 -7
- package/lib-commonjs/contexts/treeContext.js.map +1 -1
- package/lib-commonjs/hooks/useRootTree.js +25 -78
- package/lib-commonjs/hooks/useRootTree.js.map +1 -1
- package/lib-commonjs/hooks/useSubtree.js +2 -14
- package/lib-commonjs/hooks/useSubtree.js.map +1 -1
- package/lib-commonjs/index.js +7 -3
- package/lib-commonjs/index.js.map +1 -1
- package/lib-commonjs/utils/createHTMLElementWalker.js +2 -3
- package/lib-commonjs/utils/createHTMLElementWalker.js.map +1 -1
- package/lib-commonjs/utils/createHeadlessTree.js +5 -3
- package/lib-commonjs/utils/createHeadlessTree.js.map +1 -1
- package/lib-commonjs/utils/flattenTree.js +1 -2
- package/lib-commonjs/utils/flattenTree.js.map +1 -1
- package/lib-commonjs/utils/normalizeOpenItems.js +1 -2
- package/lib-commonjs/utils/normalizeOpenItems.js.map +1 -1
- package/package.json +15 -15
|
@@ -4,7 +4,7 @@ import { getNativeElementProps, useId, useMergedRefs, useEventCallback, slot } f
|
|
|
4
4
|
import { elementContains } from '@fluentui/react-portal';
|
|
5
5
|
import { Space } from '@fluentui/keyboard-keys';
|
|
6
6
|
import { treeDataTypes } from '../../utils/tokens';
|
|
7
|
-
import { useTreeContext_unstable } from '../../contexts
|
|
7
|
+
import { useTreeContext_unstable, useSubtreeContext_unstable, useTreeItemContext_unstable } from '../../contexts';
|
|
8
8
|
import { dataTreeItemValueAttrName } from '../../utils/getTreeItemValueFromElement';
|
|
9
9
|
/**
|
|
10
10
|
* Create the state required to render TreeItem.
|
|
@@ -21,7 +21,11 @@ import { dataTreeItemValueAttrName } from '../../utils/getTreeItemValueFromEleme
|
|
|
21
21
|
warnIfNoProperPropsFlatTreeItem(props);
|
|
22
22
|
}
|
|
23
23
|
const requestTreeResponse = useTreeContext_unstable((ctx)=>ctx.requestTreeResponse);
|
|
24
|
-
const contextLevel =
|
|
24
|
+
const { level: contextLevel } = useSubtreeContext_unstable();
|
|
25
|
+
const parentValue = useTreeItemContext_unstable((ctx)=>{
|
|
26
|
+
var _props_parentValue;
|
|
27
|
+
return (_props_parentValue = props.parentValue) !== null && _props_parentValue !== void 0 ? _props_parentValue : ctx.value;
|
|
28
|
+
});
|
|
25
29
|
// note, if the value is not externally provided,
|
|
26
30
|
// then selection and expansion will not work properly
|
|
27
31
|
const value = useId('fuiTreeItemValue-', (_props_value = props.value) === null || _props_value === void 0 ? void 0 : _props_value.toString());
|
|
@@ -36,14 +40,17 @@ import { dataTreeItemValueAttrName } from '../../utils/getTreeItemValueFromEleme
|
|
|
36
40
|
const layoutRef = React.useRef(null);
|
|
37
41
|
const subtreeRef = React.useRef(null);
|
|
38
42
|
const selectionRef = React.useRef(null);
|
|
39
|
-
|
|
40
|
-
|
|
43
|
+
const open = useTreeContext_unstable((ctx)=>{
|
|
44
|
+
var _props_open;
|
|
45
|
+
return (_props_open = props.open) !== null && _props_open !== void 0 ? _props_open : ctx.openItems.has(value);
|
|
46
|
+
});
|
|
41
47
|
const selectionMode = useTreeContext_unstable((ctx)=>ctx.selectionMode);
|
|
42
|
-
|
|
43
|
-
|
|
48
|
+
const checked = useTreeContext_unstable((ctx)=>{
|
|
49
|
+
var _ctx_checkedItems_get;
|
|
50
|
+
return (_ctx_checkedItems_get = ctx.checkedItems.get(value)) !== null && _ctx_checkedItems_get !== void 0 ? _ctx_checkedItems_get : false;
|
|
51
|
+
});
|
|
44
52
|
const handleClick = useEventCallback((event)=>{
|
|
45
|
-
|
|
46
|
-
(_onClick = onClick) === null || _onClick === void 0 ? void 0 : _onClick(event);
|
|
53
|
+
onClick === null || onClick === void 0 ? void 0 : onClick(event);
|
|
47
54
|
if (event.isDefaultPrevented()) {
|
|
48
55
|
return;
|
|
49
56
|
}
|
|
@@ -61,7 +68,7 @@ import { dataTreeItemValueAttrName } from '../../utils/getTreeItemValueFromEleme
|
|
|
61
68
|
}
|
|
62
69
|
const isEventFromExpandIcon = expandIconRef.current && elementContains(expandIconRef.current, event.target);
|
|
63
70
|
ReactDOM.unstable_batchedUpdates(()=>{
|
|
64
|
-
var _props_onOpenChange
|
|
71
|
+
var _props_onOpenChange;
|
|
65
72
|
const data = {
|
|
66
73
|
event,
|
|
67
74
|
value,
|
|
@@ -69,16 +76,23 @@ import { dataTreeItemValueAttrName } from '../../utils/getTreeItemValueFromEleme
|
|
|
69
76
|
target: event.currentTarget,
|
|
70
77
|
type: isEventFromExpandIcon ? treeDataTypes.ExpandIconClick : treeDataTypes.Click
|
|
71
78
|
};
|
|
72
|
-
(_props_onOpenChange =
|
|
79
|
+
(_props_onOpenChange = props.onOpenChange) === null || _props_onOpenChange === void 0 ? void 0 : _props_onOpenChange.call(props, event, data);
|
|
73
80
|
requestTreeResponse({
|
|
74
81
|
...data,
|
|
75
|
-
itemType
|
|
82
|
+
itemType,
|
|
83
|
+
requestType: 'open'
|
|
84
|
+
});
|
|
85
|
+
requestTreeResponse({
|
|
86
|
+
...data,
|
|
87
|
+
itemType,
|
|
88
|
+
parentValue,
|
|
89
|
+
requestType: 'navigate',
|
|
90
|
+
type: treeDataTypes.Click
|
|
76
91
|
});
|
|
77
92
|
});
|
|
78
93
|
});
|
|
79
94
|
const handleKeyDown = useEventCallback((event)=>{
|
|
80
|
-
|
|
81
|
-
(_onKeyDown = onKeyDown) === null || _onKeyDown === void 0 ? void 0 : _onKeyDown(event);
|
|
95
|
+
onKeyDown === null || onKeyDown === void 0 ? void 0 : onKeyDown(event);
|
|
82
96
|
// Ignore keyboard events that do not originate from the current tree item.
|
|
83
97
|
if (event.isDefaultPrevented() || event.currentTarget !== event.target) {
|
|
84
98
|
return;
|
|
@@ -93,7 +107,7 @@ import { dataTreeItemValueAttrName } from '../../utils/getTreeItemValueFromEleme
|
|
|
93
107
|
return;
|
|
94
108
|
case treeDataTypes.Enter:
|
|
95
109
|
{
|
|
96
|
-
var _props_onOpenChange
|
|
110
|
+
var _props_onOpenChange;
|
|
97
111
|
const data = {
|
|
98
112
|
value,
|
|
99
113
|
event,
|
|
@@ -101,10 +115,11 @@ import { dataTreeItemValueAttrName } from '../../utils/getTreeItemValueFromEleme
|
|
|
101
115
|
type: event.key,
|
|
102
116
|
target: event.currentTarget
|
|
103
117
|
};
|
|
104
|
-
(_props_onOpenChange =
|
|
118
|
+
(_props_onOpenChange = props.onOpenChange) === null || _props_onOpenChange === void 0 ? void 0 : _props_onOpenChange.call(props, event, data);
|
|
105
119
|
return requestTreeResponse({
|
|
106
120
|
...data,
|
|
107
|
-
itemType
|
|
121
|
+
itemType,
|
|
122
|
+
requestType: 'open'
|
|
108
123
|
});
|
|
109
124
|
}
|
|
110
125
|
case treeDataTypes.End:
|
|
@@ -112,9 +127,11 @@ import { dataTreeItemValueAttrName } from '../../utils/getTreeItemValueFromEleme
|
|
|
112
127
|
case treeDataTypes.ArrowUp:
|
|
113
128
|
case treeDataTypes.ArrowDown:
|
|
114
129
|
return requestTreeResponse({
|
|
130
|
+
requestType: 'navigate',
|
|
115
131
|
event,
|
|
116
132
|
value,
|
|
117
133
|
itemType,
|
|
134
|
+
parentValue,
|
|
118
135
|
type: event.key,
|
|
119
136
|
target: event.currentTarget
|
|
120
137
|
});
|
|
@@ -132,12 +149,14 @@ import { dataTreeItemValueAttrName } from '../../utils/getTreeItemValueFromEleme
|
|
|
132
149
|
target: event.currentTarget
|
|
133
150
|
};
|
|
134
151
|
if (open) {
|
|
135
|
-
var _props_onOpenChange1
|
|
136
|
-
(_props_onOpenChange1 =
|
|
152
|
+
var _props_onOpenChange1;
|
|
153
|
+
(_props_onOpenChange1 = props.onOpenChange) === null || _props_onOpenChange1 === void 0 ? void 0 : _props_onOpenChange1.call(props, event, data);
|
|
137
154
|
}
|
|
138
155
|
return requestTreeResponse({
|
|
139
156
|
...data,
|
|
140
|
-
itemType
|
|
157
|
+
itemType,
|
|
158
|
+
parentValue,
|
|
159
|
+
requestType: open ? 'open' : 'navigate'
|
|
141
160
|
});
|
|
142
161
|
}
|
|
143
162
|
case treeDataTypes.ArrowRight:
|
|
@@ -153,22 +172,26 @@ import { dataTreeItemValueAttrName } from '../../utils/getTreeItemValueFromEleme
|
|
|
153
172
|
target: event.currentTarget
|
|
154
173
|
};
|
|
155
174
|
if (!open) {
|
|
156
|
-
var _props_onOpenChange2
|
|
157
|
-
(_props_onOpenChange2 =
|
|
175
|
+
var _props_onOpenChange2;
|
|
176
|
+
(_props_onOpenChange2 = props.onOpenChange) === null || _props_onOpenChange2 === void 0 ? void 0 : _props_onOpenChange2.call(props, event, data);
|
|
158
177
|
}
|
|
159
178
|
return requestTreeResponse({
|
|
160
179
|
...data,
|
|
161
|
-
itemType
|
|
180
|
+
itemType,
|
|
181
|
+
parentValue,
|
|
182
|
+
requestType: open ? 'navigate' : 'open'
|
|
162
183
|
});
|
|
163
184
|
}
|
|
164
185
|
const isTypeAheadCharacter = event.key.length === 1 && event.key.match(/\w/) && !event.altKey && !event.ctrlKey && !event.metaKey;
|
|
165
186
|
if (isTypeAheadCharacter) {
|
|
166
187
|
requestTreeResponse({
|
|
188
|
+
requestType: 'navigate',
|
|
167
189
|
event,
|
|
168
190
|
target: event.currentTarget,
|
|
169
191
|
value,
|
|
170
192
|
itemType,
|
|
171
|
-
type: treeDataTypes.TypeAhead
|
|
193
|
+
type: treeDataTypes.TypeAhead,
|
|
194
|
+
parentValue
|
|
172
195
|
});
|
|
173
196
|
}
|
|
174
197
|
});
|
|
@@ -197,6 +220,7 @@ import { dataTreeItemValueAttrName } from '../../utils/getTreeItemValueFromEleme
|
|
|
197
220
|
return;
|
|
198
221
|
}
|
|
199
222
|
requestTreeResponse({
|
|
223
|
+
requestType: 'selection',
|
|
200
224
|
event,
|
|
201
225
|
value,
|
|
202
226
|
itemType,
|
|
@@ -248,14 +272,16 @@ import { dataTreeItemValueAttrName } from '../../utils/getTreeItemValueFromEleme
|
|
|
248
272
|
}
|
|
249
273
|
function warnIfNoProperPropsFlatTreeItem(props) {
|
|
250
274
|
if (process.env.NODE_ENV !== 'production') {
|
|
251
|
-
if (props['aria-posinset'] === undefined || props['aria-setsize'] === undefined || props['aria-level'] === undefined) {
|
|
275
|
+
if (props['aria-posinset'] === undefined || props['aria-setsize'] === undefined || props['aria-level'] === undefined || props.parentValue === undefined && props['aria-level'] !== 1) {
|
|
252
276
|
// eslint-disable-next-line no-console
|
|
253
277
|
console.error(`@fluentui/react-tree [${useTreeItem_unstable.name}]:
|
|
254
|
-
A flat treeitem must have "aria-posinset", "aria-setsize", "aria-level"
|
|
278
|
+
A flat treeitem must have "aria-posinset", "aria-setsize", "aria-level"
|
|
279
|
+
and "parentValue" (if "aria-level" > 1) to ensure a11y and navigation.
|
|
255
280
|
|
|
256
281
|
- "aria-posinset": the position of this treeitem in the current level of the tree.
|
|
257
282
|
- "aria-setsize": the number of siblings in this level of the tree.
|
|
258
|
-
- "aria-level": the current level of the treeitem
|
|
283
|
+
- "aria-level": the current level of the treeitem.
|
|
284
|
+
- "parentValue": the "value" property of the parent item of this item.`);
|
|
259
285
|
}
|
|
260
286
|
}
|
|
261
287
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["useTreeItem.tsx"],"sourcesContent":["import * as React from 'react';\nimport * as ReactDOM from 'react-dom';\nimport { getNativeElementProps, useId, useMergedRefs, useEventCallback, slot } from '@fluentui/react-utilities';\nimport { elementContains } from '@fluentui/react-portal';\nimport type { TreeItemProps, TreeItemState } from './TreeItem.types';\nimport { Space } from '@fluentui/keyboard-keys';\nimport { treeDataTypes } from '../../utils/tokens';\nimport { useTreeContext_unstable } from '../../contexts/index';\nimport { dataTreeItemValueAttrName } from '../../utils/getTreeItemValueFromElement';\n\n/**\n * Create the state required to render TreeItem.\n *\n * The returned state can be modified with hooks such as useTreeItemStyles_unstable,\n * before being passed to renderTreeItem_unstable.\n *\n * @param props - props from this instance of TreeItem\n * @param ref - reference to root HTMLElement of TreeItem\n */\nexport function useTreeItem_unstable(props: TreeItemProps, ref: React.Ref<HTMLDivElement>): TreeItemState {\n const treeType = useTreeContext_unstable(ctx => ctx.treeType);\n if (treeType === 'flat') {\n warnIfNoProperPropsFlatTreeItem(props);\n }\n const requestTreeResponse = useTreeContext_unstable(ctx => ctx.requestTreeResponse);\n const contextLevel = useTreeContext_unstable(ctx => ctx.level);\n\n // note, if the value is not externally provided,\n // then selection and expansion will not work properly\n const value = useId('fuiTreeItemValue-', props.value?.toString());\n\n const { onClick, onKeyDown, as = 'div', itemType = 'leaf', 'aria-level': level = contextLevel, ...rest } = props;\n\n const [isActionsVisible, setActionsVisible] = React.useState(false);\n const [isAsideVisible, setAsideVisible] = React.useState(true);\n\n const handleActionsRef = React.useCallback((actionsElement: HTMLDivElement | null) => {\n setAsideVisible(actionsElement === null);\n }, []);\n\n const actionsRef = React.useRef<HTMLDivElement>(null);\n const expandIconRef = React.useRef<HTMLDivElement>(null);\n const layoutRef = React.useRef<HTMLDivElement>(null);\n const subtreeRef = React.useRef<HTMLDivElement>(null);\n const selectionRef = React.useRef<HTMLInputElement>(null);\n\n const open = useTreeContext_unstable(ctx => props.open ?? ctx.openItems.has(value));\n const selectionMode = useTreeContext_unstable(ctx => ctx.selectionMode);\n const checked = useTreeContext_unstable(ctx => ctx.checkedItems.get(value) ?? false);\n\n const handleClick = useEventCallback((event: React.MouseEvent<HTMLDivElement>) => {\n onClick?.(event);\n if (event.isDefaultPrevented()) {\n return;\n }\n const isEventFromActions = actionsRef.current && elementContains(actionsRef.current, event.target as Node);\n if (isEventFromActions) {\n return;\n }\n const isEventFromSubtree = subtreeRef.current && elementContains(subtreeRef.current, event.target as Node);\n if (isEventFromSubtree) {\n return;\n }\n const isEventFromSelection = selectionRef.current && elementContains(selectionRef.current, event.target as Node);\n if (isEventFromSelection) {\n return;\n }\n const isEventFromExpandIcon = expandIconRef.current && elementContains(expandIconRef.current, event.target as Node);\n\n ReactDOM.unstable_batchedUpdates(() => {\n const data = {\n event,\n value,\n open: !open,\n target: event.currentTarget,\n type: isEventFromExpandIcon ? treeDataTypes.ExpandIconClick : treeDataTypes.Click,\n } as const;\n props.onOpenChange?.(event, data);\n requestTreeResponse({\n ...data,\n itemType,\n });\n });\n });\n\n const handleKeyDown = useEventCallback((event: React.KeyboardEvent<HTMLDivElement>) => {\n onKeyDown?.(event);\n // Ignore keyboard events that do not originate from the current tree item.\n if (event.isDefaultPrevented() || event.currentTarget !== event.target) {\n return;\n }\n switch (event.key) {\n case Space:\n if (selectionMode !== 'none') {\n selectionRef.current?.click();\n event.preventDefault();\n }\n return;\n case treeDataTypes.Enter: {\n const data = {\n value,\n event,\n open: !open,\n type: event.key,\n target: event.currentTarget,\n } as const;\n props.onOpenChange?.(event, data);\n return requestTreeResponse({\n ...data,\n itemType,\n });\n }\n case treeDataTypes.End:\n case treeDataTypes.Home:\n case treeDataTypes.ArrowUp:\n case treeDataTypes.ArrowDown:\n return requestTreeResponse({\n event,\n value,\n itemType,\n type: event.key,\n target: event.currentTarget,\n });\n case treeDataTypes.ArrowLeft: {\n // do not navigate to parent if the item is on the top level\n if (level === 1 && !open) {\n return;\n }\n const data = {\n value,\n event,\n open: !open,\n type: event.key,\n target: event.currentTarget,\n } as const;\n if (open) {\n props.onOpenChange?.(event, data);\n }\n return requestTreeResponse({\n ...data,\n itemType,\n });\n }\n case treeDataTypes.ArrowRight:\n // do not navigate or open if the item is a leaf\n if (itemType === 'leaf') {\n return;\n }\n const data = {\n value,\n event,\n open: !open,\n type: event.key,\n target: event.currentTarget,\n } as const;\n if (!open) {\n props.onOpenChange?.(event, data);\n }\n return requestTreeResponse({\n ...data,\n itemType,\n });\n }\n const isTypeAheadCharacter =\n event.key.length === 1 && event.key.match(/\\w/) && !event.altKey && !event.ctrlKey && !event.metaKey;\n if (isTypeAheadCharacter) {\n requestTreeResponse({\n event,\n target: event.currentTarget,\n value,\n itemType,\n type: treeDataTypes.TypeAhead,\n });\n }\n });\n\n const handleActionsVisible = useEventCallback((event: React.FocusEvent | React.MouseEvent) => {\n const isTargetFromSubtree = Boolean(\n subtreeRef.current && elementContains(subtreeRef.current, event.target as Node),\n );\n if (!isTargetFromSubtree) {\n setActionsVisible(true);\n }\n });\n\n const handleActionsInvisible = useEventCallback((event: React.FocusEvent | React.MouseEvent) => {\n const isTargetFromSubtree = Boolean(\n subtreeRef.current && elementContains(subtreeRef.current, event.target as Node),\n );\n const isRelatedTargetFromActions = Boolean(\n actionsRef.current && elementContains(actionsRef.current, event.relatedTarget as Node),\n );\n if (isRelatedTargetFromActions) {\n return setActionsVisible(true);\n }\n if (!isTargetFromSubtree) {\n return setActionsVisible(false);\n }\n });\n\n const handleChange = useEventCallback((event: React.ChangeEvent<HTMLInputElement>) => {\n if (event.isDefaultPrevented()) {\n return;\n }\n const isEventFromSubtree = subtreeRef.current && elementContains(subtreeRef.current, event.target as Node);\n if (isEventFromSubtree) {\n return;\n }\n requestTreeResponse({\n event,\n value,\n itemType,\n type: 'Change',\n target: event.currentTarget,\n checked: checked === 'mixed' ? true : !checked,\n });\n });\n\n return {\n value,\n open,\n checked,\n subtreeRef,\n layoutRef,\n selectionRef,\n expandIconRef,\n actionsRef: useMergedRefs(handleActionsRef, actionsRef),\n itemType,\n level,\n components: {\n root: 'div',\n },\n isAsideVisible,\n isActionsVisible,\n root: slot.always(\n getNativeElementProps(as, {\n tabIndex: -1,\n [dataTreeItemValueAttrName]: value,\n ...rest,\n ref,\n role: 'treeitem',\n 'aria-level': level,\n 'aria-checked': selectionMode === 'multiselect' ? checked : undefined,\n // aria-selected is required according to WAI-ARIA spec\n // https://www.w3.org/TR/wai-aria-1.1/#treeitem\n // Casting: when selectionMode is 'single', checked is a boolean\n 'aria-selected': selectionMode === 'single' ? (checked as boolean) : 'false',\n 'aria-expanded': itemType === 'branch' ? open : undefined,\n onClick: handleClick,\n onKeyDown: handleKeyDown,\n onMouseOver: handleActionsVisible,\n onFocus: handleActionsVisible,\n onMouseOut: handleActionsInvisible,\n onBlur: handleActionsInvisible,\n onChange: handleChange,\n }),\n { elementType: 'div' },\n ),\n };\n}\n\nfunction warnIfNoProperPropsFlatTreeItem(props: Pick<TreeItemProps, 'aria-setsize' | 'aria-posinset' | 'aria-level'>) {\n if (process.env.NODE_ENV !== 'production') {\n if (\n props['aria-posinset'] === undefined ||\n props['aria-setsize'] === undefined ||\n props['aria-level'] === undefined\n ) {\n // eslint-disable-next-line no-console\n console.error(/** #__DE-INDENT__ */ `\n @fluentui/react-tree [${useTreeItem_unstable.name}]:\n A flat treeitem must have \"aria-posinset\", \"aria-setsize\", \"aria-level\" to ensure a11y and navigation.\n\n - \"aria-posinset\": the position of this treeitem in the current level of the tree.\n - \"aria-setsize\": the number of siblings in this level of the tree.\n - \"aria-level\": the current level of the treeitem.\n `);\n }\n }\n}\n"],"names":["React","ReactDOM","getNativeElementProps","useId","useMergedRefs","useEventCallback","slot","elementContains","Space","treeDataTypes","useTreeContext_unstable","dataTreeItemValueAttrName","useTreeItem_unstable","props","ref","treeType","ctx","warnIfNoProperPropsFlatTreeItem","requestTreeResponse","contextLevel","level","value","toString","onClick","onKeyDown","as","itemType","rest","isActionsVisible","setActionsVisible","useState","isAsideVisible","setAsideVisible","handleActionsRef","useCallback","actionsElement","actionsRef","useRef","expandIconRef","layoutRef","subtreeRef","selectionRef","open","openItems","has","selectionMode","checked","checkedItems","get","handleClick","event","isDefaultPrevented","isEventFromActions","current","target","isEventFromSubtree","isEventFromSelection","isEventFromExpandIcon","unstable_batchedUpdates","data","currentTarget","type","ExpandIconClick","Click","onOpenChange","handleKeyDown","key","click","preventDefault","Enter","End","Home","ArrowUp","ArrowDown","ArrowLeft","ArrowRight","isTypeAheadCharacter","length","match","altKey","ctrlKey","metaKey","TypeAhead","handleActionsVisible","isTargetFromSubtree","Boolean","handleActionsInvisible","isRelatedTargetFromActions","relatedTarget","handleChange","components","root","always","tabIndex","role","undefined","onMouseOver","onFocus","onMouseOut","onBlur","onChange","elementType","process","env","NODE_ENV","console","error","name"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["useTreeItem.tsx"],"sourcesContent":["import * as React from 'react';\nimport * as ReactDOM from 'react-dom';\nimport { getNativeElementProps, useId, useMergedRefs, useEventCallback, slot } from '@fluentui/react-utilities';\nimport { elementContains } from '@fluentui/react-portal';\nimport type { TreeItemProps, TreeItemState } from './TreeItem.types';\nimport { Space } from '@fluentui/keyboard-keys';\nimport { treeDataTypes } from '../../utils/tokens';\nimport { useTreeContext_unstable, useSubtreeContext_unstable, useTreeItemContext_unstable } from '../../contexts';\nimport { dataTreeItemValueAttrName } from '../../utils/getTreeItemValueFromElement';\n\n/**\n * Create the state required to render TreeItem.\n *\n * The returned state can be modified with hooks such as useTreeItemStyles_unstable,\n * before being passed to renderTreeItem_unstable.\n *\n * @param props - props from this instance of TreeItem\n * @param ref - reference to root HTMLElement of TreeItem\n */\nexport function useTreeItem_unstable(props: TreeItemProps, ref: React.Ref<HTMLDivElement>): TreeItemState {\n const treeType = useTreeContext_unstable(ctx => ctx.treeType);\n if (treeType === 'flat') {\n warnIfNoProperPropsFlatTreeItem(props);\n }\n const requestTreeResponse = useTreeContext_unstable(ctx => ctx.requestTreeResponse);\n const { level: contextLevel } = useSubtreeContext_unstable();\n const parentValue = useTreeItemContext_unstable(ctx => props.parentValue ?? ctx.value);\n\n // note, if the value is not externally provided,\n // then selection and expansion will not work properly\n const value = useId('fuiTreeItemValue-', props.value?.toString());\n\n const { onClick, onKeyDown, as = 'div', itemType = 'leaf', 'aria-level': level = contextLevel, ...rest } = props;\n\n const [isActionsVisible, setActionsVisible] = React.useState(false);\n const [isAsideVisible, setAsideVisible] = React.useState(true);\n\n const handleActionsRef = React.useCallback((actionsElement: HTMLDivElement | null) => {\n setAsideVisible(actionsElement === null);\n }, []);\n\n const actionsRef = React.useRef<HTMLDivElement>(null);\n const expandIconRef = React.useRef<HTMLDivElement>(null);\n const layoutRef = React.useRef<HTMLDivElement>(null);\n const subtreeRef = React.useRef<HTMLDivElement>(null);\n const selectionRef = React.useRef<HTMLInputElement>(null);\n\n const open = useTreeContext_unstable(ctx => props.open ?? ctx.openItems.has(value));\n const selectionMode = useTreeContext_unstable(ctx => ctx.selectionMode);\n const checked = useTreeContext_unstable(ctx => ctx.checkedItems.get(value) ?? false);\n\n const handleClick = useEventCallback((event: React.MouseEvent<HTMLDivElement>) => {\n onClick?.(event);\n if (event.isDefaultPrevented()) {\n return;\n }\n const isEventFromActions = actionsRef.current && elementContains(actionsRef.current, event.target as Node);\n if (isEventFromActions) {\n return;\n }\n const isEventFromSubtree = subtreeRef.current && elementContains(subtreeRef.current, event.target as Node);\n if (isEventFromSubtree) {\n return;\n }\n const isEventFromSelection = selectionRef.current && elementContains(selectionRef.current, event.target as Node);\n if (isEventFromSelection) {\n return;\n }\n const isEventFromExpandIcon = expandIconRef.current && elementContains(expandIconRef.current, event.target as Node);\n\n ReactDOM.unstable_batchedUpdates(() => {\n const data = {\n event,\n value,\n open: !open,\n target: event.currentTarget,\n type: isEventFromExpandIcon ? treeDataTypes.ExpandIconClick : treeDataTypes.Click,\n } as const;\n props.onOpenChange?.(event, data);\n requestTreeResponse({\n ...data,\n itemType,\n requestType: 'open',\n });\n requestTreeResponse({\n ...data,\n itemType,\n parentValue,\n requestType: 'navigate',\n type: treeDataTypes.Click,\n });\n });\n });\n\n const handleKeyDown = useEventCallback((event: React.KeyboardEvent<HTMLDivElement>) => {\n onKeyDown?.(event);\n // Ignore keyboard events that do not originate from the current tree item.\n if (event.isDefaultPrevented() || event.currentTarget !== event.target) {\n return;\n }\n switch (event.key) {\n case Space:\n if (selectionMode !== 'none') {\n selectionRef.current?.click();\n event.preventDefault();\n }\n return;\n case treeDataTypes.Enter: {\n const data = {\n value,\n event,\n open: !open,\n type: event.key,\n target: event.currentTarget,\n } as const;\n props.onOpenChange?.(event, data);\n return requestTreeResponse({\n ...data,\n itemType,\n requestType: 'open',\n });\n }\n case treeDataTypes.End:\n case treeDataTypes.Home:\n case treeDataTypes.ArrowUp:\n case treeDataTypes.ArrowDown:\n return requestTreeResponse({\n requestType: 'navigate',\n event,\n value,\n itemType,\n parentValue,\n type: event.key,\n target: event.currentTarget,\n });\n case treeDataTypes.ArrowLeft: {\n // do not navigate to parent if the item is on the top level\n if (level === 1 && !open) {\n return;\n }\n const data = {\n value,\n event,\n open: !open,\n type: event.key,\n target: event.currentTarget,\n } as const;\n if (open) {\n props.onOpenChange?.(event, data);\n }\n return requestTreeResponse({\n ...data,\n itemType,\n parentValue,\n requestType: open ? 'open' : 'navigate',\n });\n }\n case treeDataTypes.ArrowRight:\n // do not navigate or open if the item is a leaf\n if (itemType === 'leaf') {\n return;\n }\n const data = {\n value,\n event,\n open: !open,\n type: event.key,\n target: event.currentTarget,\n } as const;\n if (!open) {\n props.onOpenChange?.(event, data);\n }\n return requestTreeResponse({\n ...data,\n itemType,\n parentValue,\n requestType: open ? 'navigate' : 'open',\n });\n }\n const isTypeAheadCharacter =\n event.key.length === 1 && event.key.match(/\\w/) && !event.altKey && !event.ctrlKey && !event.metaKey;\n if (isTypeAheadCharacter) {\n requestTreeResponse({\n requestType: 'navigate',\n event,\n target: event.currentTarget,\n value,\n itemType,\n type: treeDataTypes.TypeAhead,\n parentValue,\n });\n }\n });\n\n const handleActionsVisible = useEventCallback((event: React.FocusEvent | React.MouseEvent) => {\n const isTargetFromSubtree = Boolean(\n subtreeRef.current && elementContains(subtreeRef.current, event.target as Node),\n );\n if (!isTargetFromSubtree) {\n setActionsVisible(true);\n }\n });\n\n const handleActionsInvisible = useEventCallback((event: React.FocusEvent | React.MouseEvent) => {\n const isTargetFromSubtree = Boolean(\n subtreeRef.current && elementContains(subtreeRef.current, event.target as Node),\n );\n const isRelatedTargetFromActions = Boolean(\n actionsRef.current && elementContains(actionsRef.current, event.relatedTarget as Node),\n );\n if (isRelatedTargetFromActions) {\n return setActionsVisible(true);\n }\n if (!isTargetFromSubtree) {\n return setActionsVisible(false);\n }\n });\n\n const handleChange = useEventCallback((event: React.ChangeEvent<HTMLInputElement>) => {\n if (event.isDefaultPrevented()) {\n return;\n }\n const isEventFromSubtree = subtreeRef.current && elementContains(subtreeRef.current, event.target as Node);\n if (isEventFromSubtree) {\n return;\n }\n requestTreeResponse({\n requestType: 'selection',\n event,\n value,\n itemType,\n type: 'Change',\n target: event.currentTarget,\n checked: checked === 'mixed' ? true : !checked,\n });\n });\n\n return {\n value,\n open,\n checked,\n subtreeRef,\n layoutRef,\n selectionRef,\n expandIconRef,\n actionsRef: useMergedRefs(handleActionsRef, actionsRef),\n itemType,\n level,\n components: {\n root: 'div',\n },\n isAsideVisible,\n isActionsVisible,\n root: slot.always(\n getNativeElementProps(as, {\n tabIndex: -1,\n [dataTreeItemValueAttrName]: value,\n ...rest,\n ref,\n role: 'treeitem',\n 'aria-level': level,\n 'aria-checked': selectionMode === 'multiselect' ? checked : undefined,\n // aria-selected is required according to WAI-ARIA spec\n // https://www.w3.org/TR/wai-aria-1.1/#treeitem\n // Casting: when selectionMode is 'single', checked is a boolean\n 'aria-selected': selectionMode === 'single' ? (checked as boolean) : 'false',\n 'aria-expanded': itemType === 'branch' ? open : undefined,\n onClick: handleClick,\n onKeyDown: handleKeyDown,\n onMouseOver: handleActionsVisible,\n onFocus: handleActionsVisible,\n onMouseOut: handleActionsInvisible,\n onBlur: handleActionsInvisible,\n onChange: handleChange,\n }),\n { elementType: 'div' },\n ),\n };\n}\n\nfunction warnIfNoProperPropsFlatTreeItem(\n props: Pick<TreeItemProps, 'aria-setsize' | 'aria-posinset' | 'aria-level' | 'parentValue'>,\n) {\n if (process.env.NODE_ENV !== 'production') {\n if (\n props['aria-posinset'] === undefined ||\n props['aria-setsize'] === undefined ||\n props['aria-level'] === undefined ||\n (props.parentValue === undefined && props['aria-level'] !== 1)\n ) {\n // eslint-disable-next-line no-console\n console.error(/** #__DE-INDENT__ */ `\n @fluentui/react-tree [${useTreeItem_unstable.name}]:\n A flat treeitem must have \"aria-posinset\", \"aria-setsize\", \"aria-level\"\n and \"parentValue\" (if \"aria-level\" > 1) to ensure a11y and navigation.\n\n - \"aria-posinset\": the position of this treeitem in the current level of the tree.\n - \"aria-setsize\": the number of siblings in this level of the tree.\n - \"aria-level\": the current level of the treeitem.\n - \"parentValue\": the \"value\" property of the parent item of this item.\n `);\n }\n }\n}\n"],"names":["React","ReactDOM","getNativeElementProps","useId","useMergedRefs","useEventCallback","slot","elementContains","Space","treeDataTypes","useTreeContext_unstable","useSubtreeContext_unstable","useTreeItemContext_unstable","dataTreeItemValueAttrName","useTreeItem_unstable","props","ref","treeType","ctx","warnIfNoProperPropsFlatTreeItem","requestTreeResponse","level","contextLevel","parentValue","value","toString","onClick","onKeyDown","as","itemType","rest","isActionsVisible","setActionsVisible","useState","isAsideVisible","setAsideVisible","handleActionsRef","useCallback","actionsElement","actionsRef","useRef","expandIconRef","layoutRef","subtreeRef","selectionRef","open","openItems","has","selectionMode","checked","checkedItems","get","handleClick","event","isDefaultPrevented","isEventFromActions","current","target","isEventFromSubtree","isEventFromSelection","isEventFromExpandIcon","unstable_batchedUpdates","data","currentTarget","type","ExpandIconClick","Click","onOpenChange","requestType","handleKeyDown","key","click","preventDefault","Enter","End","Home","ArrowUp","ArrowDown","ArrowLeft","ArrowRight","isTypeAheadCharacter","length","match","altKey","ctrlKey","metaKey","TypeAhead","handleActionsVisible","isTargetFromSubtree","Boolean","handleActionsInvisible","isRelatedTargetFromActions","relatedTarget","handleChange","components","root","always","tabIndex","role","undefined","onMouseOver","onFocus","onMouseOut","onBlur","onChange","elementType","process","env","NODE_ENV","console","error","name"],"mappings":"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"}
|
|
@@ -14,7 +14,6 @@ import { useArrowNavigationGroup } from '@fluentui/react-tabster';
|
|
|
14
14
|
* @param props - props from this instance of TreeItemLayout
|
|
15
15
|
* @param ref - reference to root HTMLElement of TreeItemLayout
|
|
16
16
|
*/ export const useTreeItemLayout_unstable = (props, ref)=>{
|
|
17
|
-
var _expandIcon, _actions;
|
|
18
17
|
const { main, iconAfter, iconBefore, as = 'span' } = props;
|
|
19
18
|
const layoutRef = useTreeItemContext_unstable((ctx)=>ctx.layoutRef);
|
|
20
19
|
const selectionMode = useTreeContext_unstable((ctx)=>ctx.selectionMode);
|
|
@@ -43,7 +42,7 @@ import { useArrowNavigationGroup } from '@fluentui/react-tabster';
|
|
|
43
42
|
},
|
|
44
43
|
elementType: 'div'
|
|
45
44
|
});
|
|
46
|
-
const expandIconRefs = useMergedRefs(
|
|
45
|
+
const expandIconRefs = useMergedRefs(expandIcon === null || expandIcon === void 0 ? void 0 : expandIcon.ref, expandIconRef);
|
|
47
46
|
if (expandIcon) {
|
|
48
47
|
expandIcon.ref = expandIconRefs;
|
|
49
48
|
}
|
|
@@ -58,7 +57,7 @@ import { useArrowNavigationGroup } from '@fluentui/react-tabster';
|
|
|
58
57
|
},
|
|
59
58
|
elementType: 'div'
|
|
60
59
|
}) : undefined;
|
|
61
|
-
const actionsRefs = useMergedRefs(
|
|
60
|
+
const actionsRefs = useMergedRefs(actions === null || actions === void 0 ? void 0 : actions.ref, actionsRef);
|
|
62
61
|
if (actions) {
|
|
63
62
|
actions.ref = actionsRefs;
|
|
64
63
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["useTreeItemLayout.tsx"],"sourcesContent":["import * as React from 'react';\nimport {\n ExtractSlotProps,\n getNativeElementProps,\n isResolvedShorthand,\n useMergedRefs,\n slot,\n} from '@fluentui/react-utilities';\nimport { useTreeItemContext_unstable, useTreeContext_unstable } from '../../contexts';\nimport type { TreeItemLayoutProps, TreeItemLayoutSlots, TreeItemLayoutState } from './TreeItemLayout.types';\nimport { Checkbox, CheckboxProps } from '@fluentui/react-checkbox';\nimport { Radio, RadioProps } from '@fluentui/react-radio';\nimport { TreeItemChevron } from '../TreeItemChevron';\nimport { useArrowNavigationGroup } from '@fluentui/react-tabster';\n\n/**\n * Create the state required to render TreeItemLayout.\n *\n * The returned state can be modified with hooks such as useTreeItemLayoutStyles_unstable,\n * before being passed to renderTreeItemLayout_unstable.\n *\n * @param props - props from this instance of TreeItemLayout\n * @param ref - reference to root HTMLElement of TreeItemLayout\n */\nexport const useTreeItemLayout_unstable = (\n props: TreeItemLayoutProps,\n ref: React.Ref<HTMLElement>,\n): TreeItemLayoutState => {\n const { main, iconAfter, iconBefore, as = 'span' } = props;\n\n const layoutRef = useTreeItemContext_unstable(ctx => ctx.layoutRef);\n const selectionMode = useTreeContext_unstable(ctx => ctx.selectionMode);\n\n const [isActionsVisibleExternal, actionsShorthand]: [boolean | undefined, TreeItemLayoutSlots['actions']] =\n isResolvedShorthand(props.actions)\n ? // .visible prop should not be propagated to the DOM\n [props.actions.visible, { ...props.actions, visible: undefined }]\n : [undefined, props.actions];\n\n const isActionsVisible = useTreeItemContext_unstable(ctx => ctx.isActionsVisible) || isActionsVisibleExternal;\n const isAsideVisible = useTreeItemContext_unstable(ctx => ctx.isAsideVisible);\n const selectionRef = useTreeItemContext_unstable(ctx => ctx.selectionRef);\n const expandIconRef = useTreeItemContext_unstable(ctx => ctx.expandIconRef);\n const actionsRef = useTreeItemContext_unstable(ctx => ctx.actionsRef);\n const checked = useTreeItemContext_unstable(ctx => ctx.checked);\n const isBranch = useTreeItemContext_unstable(ctx => ctx.itemType === 'branch');\n\n const expandIcon = slot.optional(props.expandIcon, {\n renderByDefault: isBranch,\n defaultProps: {\n children: <TreeItemChevron />,\n 'aria-hidden': true,\n },\n elementType: 'div',\n });\n const expandIconRefs = useMergedRefs(expandIcon?.ref, expandIconRef);\n if (expandIcon) {\n expandIcon.ref = expandIconRefs;\n }\n const arrowNavigationProps = useArrowNavigationGroup({ circular: true, axis: 'horizontal' });\n const actions = isActionsVisible\n ? slot.optional(actionsShorthand, {\n defaultProps: { ...arrowNavigationProps, role: 'toolbar' } as ExtractSlotProps<TreeItemLayoutSlots['actions']>,\n elementType: 'div',\n })\n : undefined;\n const actionsRefs = useMergedRefs(actions?.ref, actionsRef);\n if (actions) {\n actions.ref = actionsRefs;\n }\n return {\n components: {\n root: 'div',\n expandIcon: 'div',\n iconBefore: 'div',\n main: 'div',\n iconAfter: 'div',\n actions: 'div',\n aside: 'div',\n // Casting here to a union between checkbox and radio\n selector: (selectionMode === 'multiselect' ? Checkbox : Radio) as React.ElementType<CheckboxProps | RadioProps>,\n },\n buttonContextValue: { size: 'small' },\n root: slot.always(getNativeElementProps(as, { ...props, ref: useMergedRefs(ref, layoutRef) }), {\n elementType: 'div',\n }),\n iconBefore: slot.optional(iconBefore, { defaultProps: { 'aria-hidden': true }, elementType: 'div' }),\n main: slot.always(main, { elementType: 'div' }),\n iconAfter: slot.optional(iconAfter, { defaultProps: { 'aria-hidden': true }, elementType: 'div' }),\n aside: isAsideVisible\n ? slot.optional(props.aside, { defaultProps: { 'aria-hidden': true }, elementType: 'div' })\n : undefined,\n actions,\n expandIcon,\n selector: slot.optional(props.selector, {\n renderByDefault: selectionMode !== 'none',\n defaultProps: {\n checked,\n tabIndex: -1,\n 'aria-hidden': true,\n ref: selectionRef,\n // casting here to a union between checkbox and radio\n // since ref is not present on the selector signature\n // FIXME: look into Slot type to see if we can make this work\n } as CheckboxProps | RadioProps,\n elementType: (selectionMode === 'multiselect' ? Checkbox : Radio) as React.ElementType<\n CheckboxProps | RadioProps\n >,\n }),\n };\n};\n"],"names":["React","getNativeElementProps","isResolvedShorthand","useMergedRefs","slot","useTreeItemContext_unstable","useTreeContext_unstable","Checkbox","Radio","TreeItemChevron","useArrowNavigationGroup","useTreeItemLayout_unstable","props","ref","
|
|
1
|
+
{"version":3,"sources":["useTreeItemLayout.tsx"],"sourcesContent":["import * as React from 'react';\nimport {\n ExtractSlotProps,\n getNativeElementProps,\n isResolvedShorthand,\n useMergedRefs,\n slot,\n} from '@fluentui/react-utilities';\nimport { useTreeItemContext_unstable, useTreeContext_unstable } from '../../contexts';\nimport type { TreeItemLayoutProps, TreeItemLayoutSlots, TreeItemLayoutState } from './TreeItemLayout.types';\nimport { Checkbox, CheckboxProps } from '@fluentui/react-checkbox';\nimport { Radio, RadioProps } from '@fluentui/react-radio';\nimport { TreeItemChevron } from '../TreeItemChevron';\nimport { useArrowNavigationGroup } from '@fluentui/react-tabster';\n\n/**\n * Create the state required to render TreeItemLayout.\n *\n * The returned state can be modified with hooks such as useTreeItemLayoutStyles_unstable,\n * before being passed to renderTreeItemLayout_unstable.\n *\n * @param props - props from this instance of TreeItemLayout\n * @param ref - reference to root HTMLElement of TreeItemLayout\n */\nexport const useTreeItemLayout_unstable = (\n props: TreeItemLayoutProps,\n ref: React.Ref<HTMLElement>,\n): TreeItemLayoutState => {\n const { main, iconAfter, iconBefore, as = 'span' } = props;\n\n const layoutRef = useTreeItemContext_unstable(ctx => ctx.layoutRef);\n const selectionMode = useTreeContext_unstable(ctx => ctx.selectionMode);\n\n const [isActionsVisibleExternal, actionsShorthand]: [boolean | undefined, TreeItemLayoutSlots['actions']] =\n isResolvedShorthand(props.actions)\n ? // .visible prop should not be propagated to the DOM\n [props.actions.visible, { ...props.actions, visible: undefined }]\n : [undefined, props.actions];\n\n const isActionsVisible = useTreeItemContext_unstable(ctx => ctx.isActionsVisible) || isActionsVisibleExternal;\n const isAsideVisible = useTreeItemContext_unstable(ctx => ctx.isAsideVisible);\n const selectionRef = useTreeItemContext_unstable(ctx => ctx.selectionRef);\n const expandIconRef = useTreeItemContext_unstable(ctx => ctx.expandIconRef);\n const actionsRef = useTreeItemContext_unstable(ctx => ctx.actionsRef);\n const checked = useTreeItemContext_unstable(ctx => ctx.checked);\n const isBranch = useTreeItemContext_unstable(ctx => ctx.itemType === 'branch');\n\n const expandIcon = slot.optional(props.expandIcon, {\n renderByDefault: isBranch,\n defaultProps: {\n children: <TreeItemChevron />,\n 'aria-hidden': true,\n },\n elementType: 'div',\n });\n const expandIconRefs = useMergedRefs(expandIcon?.ref, expandIconRef);\n if (expandIcon) {\n expandIcon.ref = expandIconRefs;\n }\n const arrowNavigationProps = useArrowNavigationGroup({ circular: true, axis: 'horizontal' });\n const actions = isActionsVisible\n ? slot.optional(actionsShorthand, {\n defaultProps: { ...arrowNavigationProps, role: 'toolbar' } as ExtractSlotProps<TreeItemLayoutSlots['actions']>,\n elementType: 'div',\n })\n : undefined;\n const actionsRefs = useMergedRefs(actions?.ref, actionsRef);\n if (actions) {\n actions.ref = actionsRefs;\n }\n return {\n components: {\n root: 'div',\n expandIcon: 'div',\n iconBefore: 'div',\n main: 'div',\n iconAfter: 'div',\n actions: 'div',\n aside: 'div',\n // Casting here to a union between checkbox and radio\n selector: (selectionMode === 'multiselect' ? Checkbox : Radio) as React.ElementType<CheckboxProps | RadioProps>,\n },\n buttonContextValue: { size: 'small' },\n root: slot.always(getNativeElementProps(as, { ...props, ref: useMergedRefs(ref, layoutRef) }), {\n elementType: 'div',\n }),\n iconBefore: slot.optional(iconBefore, { defaultProps: { 'aria-hidden': true }, elementType: 'div' }),\n main: slot.always(main, { elementType: 'div' }),\n iconAfter: slot.optional(iconAfter, { defaultProps: { 'aria-hidden': true }, elementType: 'div' }),\n aside: isAsideVisible\n ? slot.optional(props.aside, { defaultProps: { 'aria-hidden': true }, elementType: 'div' })\n : undefined,\n actions,\n expandIcon,\n selector: slot.optional(props.selector, {\n renderByDefault: selectionMode !== 'none',\n defaultProps: {\n checked,\n tabIndex: -1,\n 'aria-hidden': true,\n ref: selectionRef,\n // casting here to a union between checkbox and radio\n // since ref is not present on the selector signature\n // FIXME: look into Slot type to see if we can make this work\n } as CheckboxProps | RadioProps,\n elementType: (selectionMode === 'multiselect' ? Checkbox : Radio) as React.ElementType<\n CheckboxProps | RadioProps\n >,\n }),\n };\n};\n"],"names":["React","getNativeElementProps","isResolvedShorthand","useMergedRefs","slot","useTreeItemContext_unstable","useTreeContext_unstable","Checkbox","Radio","TreeItemChevron","useArrowNavigationGroup","useTreeItemLayout_unstable","props","ref","main","iconAfter","iconBefore","as","layoutRef","ctx","selectionMode","isActionsVisibleExternal","actionsShorthand","actions","visible","undefined","isActionsVisible","isAsideVisible","selectionRef","expandIconRef","actionsRef","checked","isBranch","itemType","expandIcon","optional","renderByDefault","defaultProps","children","elementType","expandIconRefs","arrowNavigationProps","circular","axis","role","actionsRefs","components","root","aside","selector","buttonContextValue","size","always","tabIndex"],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { SubtreeContext, TreeContext } from '../contexts';
|
|
3
|
+
/**
|
|
4
|
+
* @internal
|
|
5
|
+
*/ const rootSubtreeContextValue = {
|
|
6
|
+
level: 1,
|
|
7
|
+
contextType: 'subtree'
|
|
8
|
+
};
|
|
9
|
+
export const TreeProvider = (props)=>{
|
|
10
|
+
if (props.value.contextType === 'subtree') {
|
|
11
|
+
return /*#__PURE__*/ React.createElement(SubtreeContext.Provider, {
|
|
12
|
+
value: props.value
|
|
13
|
+
}, props.children);
|
|
14
|
+
}
|
|
15
|
+
return /*#__PURE__*/ React.createElement(TreeContext.Provider, {
|
|
16
|
+
value: props.value
|
|
17
|
+
}, /*#__PURE__*/ React.createElement(SubtreeContext.Provider, {
|
|
18
|
+
value: rootSubtreeContextValue
|
|
19
|
+
}, props.children));
|
|
20
|
+
};
|
|
21
|
+
TreeProvider.displayName = 'TreeProvider';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["TreeProvider.tsx"],"sourcesContent":["import * as React from 'react';\nimport { SubtreeContext, SubtreeContextValue, TreeContextValue, TreeContext } from '../contexts';\n\n/**\n * @internal\n */\nconst rootSubtreeContextValue: SubtreeContextValue = {\n level: 1,\n contextType: 'subtree',\n};\n\nexport const TreeProvider = (props: React.ProviderProps<TreeContextValue | SubtreeContextValue>) => {\n if (props.value.contextType === 'subtree') {\n return <SubtreeContext.Provider value={props.value}>{props.children}</SubtreeContext.Provider>;\n }\n return (\n <TreeContext.Provider value={props.value}>\n <SubtreeContext.Provider value={rootSubtreeContextValue}>{props.children}</SubtreeContext.Provider>\n </TreeContext.Provider>\n );\n};\n\nTreeProvider.displayName = 'TreeProvider';\n"],"names":["React","SubtreeContext","TreeContext","rootSubtreeContextValue","level","contextType","TreeProvider","props","value","Provider","children","displayName"],"mappings":"AAAA,YAAYA,WAAW,QAAQ;AAC/B,SAASC,cAAc,EAAyCC,WAAW,QAAQ,cAAc;AAEjG;;CAEC,GACD,MAAMC,0BAA+C;IACnDC,OAAO;IACPC,aAAa;AACf;AAEA,OAAO,MAAMC,eAAe,CAACC;IAC3B,IAAIA,MAAMC,KAAK,CAACH,WAAW,KAAK,WAAW;QACzC,qBAAO,oBAACJ,eAAeQ,QAAQ;YAACD,OAAOD,MAAMC,KAAK;WAAGD,MAAMG,QAAQ;IACrE;IACA,qBACE,oBAACR,YAAYO,QAAQ;QAACD,OAAOD,MAAMC,KAAK;qBACtC,oBAACP,eAAeQ,QAAQ;QAACD,OAAOL;OAA0BI,MAAMG,QAAQ;AAG9E,EAAE;AAEFJ,aAAaK,WAAW,GAAG"}
|
package/lib/contexts/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["index.ts"],"sourcesContent":["export * from './treeContext';\nexport * from './treeItemContext';\n"],"names":[],"mappings":"AAAA,cAAc,gBAAgB;AAC9B,cAAc,oBAAoB"}
|
|
1
|
+
{"version":3,"sources":["index.ts"],"sourcesContent":["export * from './treeContext';\nexport * from './subtreeContext';\nexport * from './treeItemContext';\n"],"names":[],"mappings":"AAAA,cAAc,gBAAgB;AAC9B,cAAc,mBAAmB;AACjC,cAAc,oBAAoB"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* @internal
|
|
4
|
+
*/ const defaultSubTreeContextValue = {
|
|
5
|
+
level: 0,
|
|
6
|
+
contextType: 'subtree'
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* @internal
|
|
10
|
+
*/ export const SubtreeContext = React.createContext(undefined);
|
|
11
|
+
export const useSubtreeContext_unstable = ()=>{
|
|
12
|
+
var _React_useContext;
|
|
13
|
+
return (_React_useContext = React.useContext(SubtreeContext)) !== null && _React_useContext !== void 0 ? _React_useContext : defaultSubTreeContextValue;
|
|
14
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["subtreeContext.ts"],"sourcesContent":["import * as React from 'react';\n\nexport type SubtreeContextValue = {\n contextType: 'subtree';\n level: number;\n};\n\n/**\n * @internal\n */\nconst defaultSubTreeContextValue: SubtreeContextValue = {\n level: 0,\n contextType: 'subtree',\n};\n\n/**\n * @internal\n */\nexport const SubtreeContext: React.Context<SubtreeContextValue> = React.createContext<SubtreeContextValue | undefined>(\n undefined,\n) as React.Context<SubtreeContextValue>;\n\nexport const useSubtreeContext_unstable = () => {\n return React.useContext(SubtreeContext) ?? defaultSubTreeContextValue;\n};\n"],"names":["React","defaultSubTreeContextValue","level","contextType","SubtreeContext","createContext","undefined","useSubtreeContext_unstable","useContext"],"mappings":"AAAA,YAAYA,WAAW,QAAQ;AAO/B;;CAEC,GACD,MAAMC,6BAAkD;IACtDC,OAAO;IACPC,aAAa;AACf;AAEA;;CAEC,GACD,OAAO,MAAMC,iBAAqDJ,MAAMK,aAAa,CACnFC,WACsC;AAExC,OAAO,MAAMC,6BAA6B;QACjCP;IAAP,OAAOA,CAAAA,oBAAAA,MAAMQ,UAAU,CAACJ,6BAAjBJ,+BAAAA,oBAAoCC;AAC7C,EAAE"}
|
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
import { createContext, useContextSelector } from '@fluentui/react-context-selector';
|
|
2
2
|
import { ImmutableSet } from '../utils/ImmutableSet';
|
|
3
3
|
import { ImmutableMap } from '../utils/ImmutableMap';
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
/**
|
|
5
|
+
* @internal
|
|
6
|
+
*/ const defaultTreeContextValue = {
|
|
6
7
|
level: 0,
|
|
8
|
+
contextType: 'root',
|
|
9
|
+
treeType: 'nested',
|
|
7
10
|
selectionMode: 'none',
|
|
8
11
|
openItems: ImmutableSet.empty,
|
|
9
12
|
checkedItems: ImmutableMap.empty,
|
|
@@ -13,6 +16,7 @@ const defaultContextValue = {
|
|
|
13
16
|
};
|
|
14
17
|
function noop() {
|
|
15
18
|
/* noop */ }
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
export const
|
|
19
|
+
/**
|
|
20
|
+
* @internal
|
|
21
|
+
*/ export const TreeContext = createContext(undefined);
|
|
22
|
+
export const useTreeContext_unstable = (selector)=>useContextSelector(TreeContext, (ctx = defaultTreeContextValue)=>selector(ctx));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["treeContext.ts"],"sourcesContent":["import { Context, ContextSelector, createContext, useContextSelector } from '@fluentui/react-context-selector';\nimport { TreeItemType, TreeItemValue } from '../TreeItem';\nimport { SelectionMode } from '@fluentui/react-utilities';\nimport { ImmutableSet } from '../utils/ImmutableSet';\nimport { ImmutableMap } from '../utils/ImmutableMap';\nimport { TreeCheckedChangeData, TreeNavigationData_unstable, TreeOpenChangeData } from '../Tree';\n\nexport type TreeContextValue = {\n treeType: 'nested' | 'flat';\n
|
|
1
|
+
{"version":3,"sources":["treeContext.ts"],"sourcesContent":["import { Context, ContextSelector, createContext, useContextSelector } from '@fluentui/react-context-selector';\nimport { TreeItemType, TreeItemValue } from '../TreeItem';\nimport { SelectionMode } from '@fluentui/react-utilities';\nimport { ImmutableSet } from '../utils/ImmutableSet';\nimport { ImmutableMap } from '../utils/ImmutableMap';\nimport { TreeCheckedChangeData, TreeNavigationData_unstable, TreeOpenChangeData } from '../Tree';\n\nexport type TreeContextValue = {\n contextType?: 'root';\n level: number;\n treeType: 'nested' | 'flat';\n selectionMode: 'none' | SelectionMode;\n appearance: 'subtle' | 'subtle-alpha' | 'transparent';\n size: 'small' | 'medium';\n openItems: ImmutableSet<TreeItemValue>;\n checkedItems: ImmutableMap<TreeItemValue, 'mixed' | boolean>;\n /**\n * requests root Tree component to respond to some tree item event,\n */\n requestTreeResponse(request: TreeItemRequest): void;\n};\n\nexport type TreeItemRequest = { itemType: TreeItemType } & (\n | (OmitWithoutExpanding<TreeOpenChangeData, 'open' | 'openItems'> & { requestType: 'open' })\n | (TreeNavigationData_unstable & { requestType: 'navigate' })\n | (OmitWithoutExpanding<TreeCheckedChangeData, 'selectionMode' | 'checkedItems'> & { requestType: 'selection' })\n);\n\n/**\n * helper type that avoids the expansion of unions while inferring it,\n * should work exactly the same as Omit\n */\ntype OmitWithoutExpanding<P, K extends string | number | symbol> = P extends unknown ? Omit<P, K> : P;\n\n/**\n * @internal\n */\nconst defaultTreeContextValue: TreeContextValue = {\n level: 0,\n contextType: 'root',\n treeType: 'nested',\n selectionMode: 'none',\n openItems: ImmutableSet.empty,\n checkedItems: ImmutableMap.empty,\n requestTreeResponse: noop,\n appearance: 'subtle',\n size: 'medium',\n};\n\nfunction noop() {\n /* noop */\n}\n\n/**\n * @internal\n */\nexport const TreeContext: Context<TreeContextValue> = createContext<TreeContextValue | undefined>(\n undefined,\n) as Context<TreeContextValue>;\n\nexport const useTreeContext_unstable = <T>(selector: ContextSelector<TreeContextValue, T>): T =>\n useContextSelector(TreeContext, (ctx = defaultTreeContextValue) => selector(ctx));\n"],"names":["createContext","useContextSelector","ImmutableSet","ImmutableMap","defaultTreeContextValue","level","contextType","treeType","selectionMode","openItems","empty","checkedItems","requestTreeResponse","noop","appearance","size","TreeContext","undefined","useTreeContext_unstable","selector","ctx"],"mappings":"AAAA,SAAmCA,aAAa,EAAEC,kBAAkB,QAAQ,mCAAmC;AAG/G,SAASC,YAAY,QAAQ,wBAAwB;AACrD,SAASC,YAAY,QAAQ,wBAAwB;AA8BrD;;CAEC,GACD,MAAMC,0BAA4C;IAChDC,OAAO;IACPC,aAAa;IACbC,UAAU;IACVC,eAAe;IACfC,WAAWP,aAAaQ,KAAK;IAC7BC,cAAcR,aAAaO,KAAK;IAChCE,qBAAqBC;IACrBC,YAAY;IACZC,MAAM;AACR;AAEA,SAASF;AACP,QAAQ,GACV;AAEA;;CAEC,GACD,OAAO,MAAMG,cAAyChB,cACpDiB,WAC6B;AAE/B,OAAO,MAAMC,0BAA0B,CAAIC,WACzClB,mBAAmBe,aAAa,CAACI,MAAMhB,uBAAuB,GAAKe,SAASC,MAAM"}
|
package/lib/hooks/useRootTree.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { getNativeElementProps, useEventCallback, slot } from '@fluentui/react-utilities';
|
|
2
2
|
import * as React from 'react';
|
|
3
|
-
import * as ReactDOM from 'react-dom';
|
|
4
3
|
import { createOpenItems } from '../utils/createOpenItems';
|
|
5
4
|
import { createCheckedItems } from '../utils/createCheckedItems';
|
|
6
5
|
import { treeDataTypes } from '../utils/tokens';
|
|
6
|
+
import { createNextOpenItems } from './useControllableOpenItems';
|
|
7
7
|
/**
|
|
8
8
|
* Create the state required to render the root level tree.
|
|
9
9
|
*
|
|
@@ -19,16 +19,20 @@ import { treeDataTypes } from '../utils/tokens';
|
|
|
19
19
|
props.checkedItems
|
|
20
20
|
]);
|
|
21
21
|
const requestOpenChange = (data)=>{
|
|
22
|
-
var _props_onOpenChange
|
|
23
|
-
|
|
22
|
+
var _props_onOpenChange;
|
|
23
|
+
const nextOpenItems = createNextOpenItems(data, openItems);
|
|
24
|
+
(_props_onOpenChange = props.onOpenChange) === null || _props_onOpenChange === void 0 ? void 0 : _props_onOpenChange.call(props, data.event, {
|
|
25
|
+
...data,
|
|
26
|
+
openItems: nextOpenItems.dangerouslyGetInternalSet_unstable()
|
|
27
|
+
});
|
|
24
28
|
};
|
|
25
29
|
const requestCheckedChange = (data)=>{
|
|
26
|
-
var _props_onCheckedChange
|
|
27
|
-
return (_props_onCheckedChange =
|
|
30
|
+
var _props_onCheckedChange;
|
|
31
|
+
return (_props_onCheckedChange = props.onCheckedChange) === null || _props_onCheckedChange === void 0 ? void 0 : _props_onCheckedChange.call(props, data.event, data);
|
|
28
32
|
};
|
|
29
33
|
const requestNavigation = (data)=>{
|
|
30
|
-
var _props_onNavigation
|
|
31
|
-
(_props_onNavigation =
|
|
34
|
+
var _props_onNavigation;
|
|
35
|
+
(_props_onNavigation = props.onNavigation) === null || _props_onNavigation === void 0 ? void 0 : _props_onNavigation.call(props, data.event, data);
|
|
32
36
|
switch(data.type){
|
|
33
37
|
case treeDataTypes.ArrowDown:
|
|
34
38
|
case treeDataTypes.ArrowUp:
|
|
@@ -40,85 +44,28 @@ import { treeDataTypes } from '../utils/tokens';
|
|
|
40
44
|
}
|
|
41
45
|
};
|
|
42
46
|
const requestTreeResponse = useEventCallback((request)=>{
|
|
43
|
-
switch(request.
|
|
44
|
-
case
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
...request,
|
|
55
|
-
type: treeDataTypes.Click
|
|
56
|
-
});
|
|
57
|
-
});
|
|
58
|
-
}
|
|
59
|
-
case treeDataTypes.ArrowRight:
|
|
60
|
-
{
|
|
61
|
-
if (request.itemType === 'leaf') {
|
|
62
|
-
return;
|
|
63
|
-
}
|
|
64
|
-
const open = openItems.has(request.value);
|
|
65
|
-
if (!open) {
|
|
66
|
-
return requestOpenChange({
|
|
67
|
-
...request,
|
|
68
|
-
open: true,
|
|
69
|
-
openItems: openItems.dangerouslyGetInternalSet_unstable()
|
|
70
|
-
});
|
|
71
|
-
}
|
|
72
|
-
return requestNavigation(request);
|
|
73
|
-
}
|
|
74
|
-
case treeDataTypes.Enter:
|
|
75
|
-
{
|
|
76
|
-
const open = openItems.has(request.value);
|
|
77
|
-
return requestOpenChange({
|
|
78
|
-
...request,
|
|
79
|
-
open: request.itemType === 'branch' && !open,
|
|
80
|
-
openItems: openItems.dangerouslyGetInternalSet_unstable()
|
|
81
|
-
});
|
|
82
|
-
}
|
|
83
|
-
case treeDataTypes.ArrowLeft:
|
|
84
|
-
{
|
|
85
|
-
const open = openItems.has(request.value);
|
|
86
|
-
if (open && request.itemType === 'branch') {
|
|
87
|
-
return requestOpenChange({
|
|
88
|
-
...request,
|
|
89
|
-
open: false,
|
|
90
|
-
type: treeDataTypes.ArrowLeft,
|
|
91
|
-
openItems: openItems.dangerouslyGetInternalSet_unstable()
|
|
92
|
-
});
|
|
93
|
-
}
|
|
94
|
-
return requestNavigation({
|
|
95
|
-
...request,
|
|
96
|
-
type: treeDataTypes.ArrowLeft
|
|
97
|
-
});
|
|
98
|
-
}
|
|
99
|
-
case treeDataTypes.End:
|
|
100
|
-
case treeDataTypes.Home:
|
|
101
|
-
case treeDataTypes.ArrowUp:
|
|
102
|
-
case treeDataTypes.ArrowDown:
|
|
103
|
-
case treeDataTypes.TypeAhead:
|
|
104
|
-
return requestNavigation({
|
|
47
|
+
switch(request.requestType){
|
|
48
|
+
case 'navigate':
|
|
49
|
+
return requestNavigation(request);
|
|
50
|
+
case 'open':
|
|
51
|
+
return requestOpenChange({
|
|
52
|
+
...request,
|
|
53
|
+
open: request.itemType === 'branch' && !openItems.has(request.value),
|
|
54
|
+
openItems: openItems.dangerouslyGetInternalSet_unstable()
|
|
55
|
+
});
|
|
56
|
+
case 'selection':
|
|
57
|
+
return requestCheckedChange({
|
|
105
58
|
...request,
|
|
106
|
-
|
|
59
|
+
selectionMode: selectionMode,
|
|
60
|
+
checkedItems: checkedItems.dangerouslyGetInternalMap_unstable()
|
|
107
61
|
});
|
|
108
|
-
case treeDataTypes.Change:
|
|
109
|
-
{
|
|
110
|
-
return requestCheckedChange({
|
|
111
|
-
...request,
|
|
112
|
-
selectionMode: selectionMode,
|
|
113
|
-
checkedItems: checkedItems.dangerouslyGetInternalMap_unstable()
|
|
114
|
-
});
|
|
115
|
-
}
|
|
116
62
|
}
|
|
117
63
|
});
|
|
118
64
|
return {
|
|
119
65
|
components: {
|
|
120
66
|
root: 'div'
|
|
121
67
|
},
|
|
68
|
+
contextType: 'root',
|
|
122
69
|
selectionMode,
|
|
123
70
|
open: true,
|
|
124
71
|
appearance,
|