@vertexvis/viewer-toolkit-react 0.0.2-canary.0 → 0.0.2-canary.10
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/dist/bundle.cjs.js +6 -2571
- package/dist/bundle.cjs.js.map +1 -1
- package/dist/bundle.esm.js +6 -2524
- package/dist/bundle.esm.js.map +1 -1
- package/dist/components/appearance/__tests__/scene-item-material-color-picker.spec.d.ts +1 -0
- package/dist/components/appearance/__tests__/scene-item-material-opacity-slider.spec.d.ts +1 -0
- package/dist/components/appearance/material-controls.d.ts +7 -0
- package/dist/components/appearance/material-panel-section.d.ts +9 -0
- package/dist/components/appearance/scene-item-material-apply-all-confirmation-dialog.d.ts +1 -0
- package/dist/components/appearance/scene-item-material-apply-all.d.ts +5 -0
- package/dist/components/appearance/scene-item-material-clear.d.ts +6 -0
- package/dist/components/appearance/scene-item-material-color-picker.d.ts +5 -0
- package/dist/components/appearance/scene-item-material-opacity-slider.d.ts +4 -0
- package/dist/components/box-selection/box-selection-tool.d.ts +1 -1
- package/dist/components/common/reset-button.d.ts +7 -0
- package/dist/components/common/resizable-content.d.ts +14 -0
- package/dist/components/context-menu/context-menu.d.ts +2 -2
- package/dist/components/context-menu/fly-out-context-menu.d.ts +17 -0
- package/dist/components/context-menu/menu-items/__tests__/ghost-selected-menu-item.spec.d.ts +1 -0
- package/dist/components/context-menu/menu-items/__tests__/unghost-selected-menu-item.spec.d.ts +1 -0
- package/dist/components/context-menu/menu-items/ghost-selected-menu-item.d.ts +1 -0
- package/dist/components/context-menu/menu-items/unghost-selected-menu-item.d.ts +1 -0
- package/dist/components/context-menu/scene-tree-context-menu.d.ts +1 -1
- package/dist/components/scene-tree/vertex-scene-tree-header.d.ts +5 -0
- package/dist/components/sidebar/panel-section.d.ts +7 -0
- package/dist/components/sidebar/sidebar-icon.d.ts +15 -0
- package/dist/components/sidebar/sidebar.d.ts +6 -0
- package/dist/components/sidebar/viewer-right-sidebar/__tests__/viewer-right-open-panel.spec.d.ts +1 -0
- package/dist/components/sidebar/viewer-right-sidebar/appearance-panel.d.ts +1 -0
- package/dist/components/sidebar/viewer-right-sidebar/viewer-right-open-panel.d.ts +1 -0
- package/dist/components/sidebar/viewer-right-sidebar/viewer-right-panel-header.d.ts +2 -0
- package/dist/components/sidebar/viewer-right-sidebar/viewer-right-sidebar.d.ts +1 -0
- package/dist/components/viewer/__tests__/camera-type-menu.spec.d.ts +1 -0
- package/dist/components/viewer/camera-type-menu.d.ts +9 -0
- package/dist/components/viewer/vertex-viewer.d.ts +1 -1
- package/dist/index.css +2 -2
- package/dist/index.d.ts +6 -1
- package/dist/root.d.ts +5 -4
- package/dist/state/appearance/__tests__/actions.spec.d.ts +1 -0
- package/dist/state/appearance/actions.d.ts +17 -0
- package/dist/state/appearance/index.d.ts +2 -0
- package/dist/state/appearance/material.d.ts +18 -0
- package/dist/state/context-menu/actions.d.ts +3 -3
- package/dist/state/context-menu/context-menu.d.ts +1 -1
- package/dist/state/keybinding/default-keybindings.d.ts +1 -0
- package/dist/state/keybinding/index.d.ts +1 -0
- package/dist/state/keybinding/keybinding.d.ts +1 -1
- package/dist/state/panel/__tests__/actions.spec.d.ts +1 -0
- package/dist/state/panel/actions.d.ts +7 -0
- package/dist/state/panel/index.d.ts +2 -0
- package/dist/state/panel/panel.d.ts +3 -0
- package/dist/state/selection/selection.d.ts +1 -0
- package/dist/state/viewer/camera/actions.d.ts +2 -0
- package/dist/state/viewer/camera/camera.d.ts +2 -0
- package/dist/state/viewer/camera/index.d.ts +1 -0
- package/dist/state/viewer/scene/item-operations.d.ts +3 -4
- package/dist/util/appearance/color.d.ts +6 -0
- package/dist/util/dom/boolean-attributes.d.ts +6 -0
- package/dist/util/refs/debounce.d.ts +2 -0
- package/package.json +21 -14
package/dist/bundle.cjs.js
CHANGED
|
@@ -1,2572 +1,7 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
var utils = require('@vertexvis/utils');
|
|
7
|
-
var recoil = require('recoil');
|
|
8
|
-
var geometry = require('@vertexvis/geometry');
|
|
9
|
-
var Pino = require('pino');
|
|
10
|
-
var viewerReact = require('@vertexvis/viewer-react');
|
|
11
|
-
var classNames = require('classnames');
|
|
12
|
-
var loader = require('@vertexvis/viewer/loader');
|
|
13
|
-
|
|
14
|
-
function _interopNamespaceDefault(e) {
|
|
15
|
-
var n = Object.create(null);
|
|
16
|
-
if (e) {
|
|
17
|
-
Object.keys(e).forEach(function (k) {
|
|
18
|
-
if (k !== 'default') {
|
|
19
|
-
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
20
|
-
Object.defineProperty(n, k, d.get ? d : {
|
|
21
|
-
enumerable: true,
|
|
22
|
-
get: function () { return e[k]; }
|
|
23
|
-
});
|
|
24
|
-
}
|
|
25
|
-
});
|
|
26
|
-
}
|
|
27
|
-
n.default = e;
|
|
28
|
-
return Object.freeze(n);
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
var React__namespace = /*#__PURE__*/_interopNamespaceDefault(React);
|
|
32
|
-
|
|
33
|
-
// DEPRECATED - avoid if possible
|
|
34
|
-
const useRecoilReducer = ({ reducer, atom, }) => {
|
|
35
|
-
const state = recoil.useRecoilValue(atom);
|
|
36
|
-
const dispatch = useRecoilReducerDispatch({
|
|
37
|
-
reducer,
|
|
38
|
-
atom,
|
|
39
|
-
});
|
|
40
|
-
return [state, dispatch];
|
|
41
|
-
};
|
|
42
|
-
// DEPRECATED - avoid if possible
|
|
43
|
-
const useRecoilReducerDispatch = ({ reducer, atom, }) => {
|
|
44
|
-
const dispatch = recoil.useRecoilCallback(({ set }) => async (action) => {
|
|
45
|
-
set(atom, (previousValue) => reducer(previousValue, action));
|
|
46
|
-
}, []);
|
|
47
|
-
return dispatch;
|
|
48
|
-
};
|
|
49
|
-
|
|
50
|
-
const isInputElement = (target) => {
|
|
51
|
-
const isAutoResizeTextarea = target instanceof HTMLElement &&
|
|
52
|
-
target.tagName === 'VERTEX-AUTO-RESIZE-TEXTAREA';
|
|
53
|
-
const isTextField = target instanceof HTMLElement && target.tagName === 'VERTEX-TEXTFIELD';
|
|
54
|
-
const isContentEditable = target instanceof HTMLElement && target.contentEditable === 'true';
|
|
55
|
-
const isSceneTreeSearch = target instanceof HTMLElement &&
|
|
56
|
-
target.tagName === 'VERTEX-SCENE-TREE-SEARCH';
|
|
57
|
-
const isInput = target instanceof HTMLInputElement || target instanceof HTMLTextAreaElement;
|
|
58
|
-
const isVertexViewerPinTool = target instanceof HTMLElement &&
|
|
59
|
-
target.tagName === 'VERTEX-VIEWER-PIN-TOOL';
|
|
60
|
-
const isVertexViewerTransformWidget = target instanceof HTMLElement &&
|
|
61
|
-
target.tagName === 'VERTEX-VIEWER-TRANSFORM-WIDGET';
|
|
62
|
-
return (isAutoResizeTextarea ||
|
|
63
|
-
isTextField ||
|
|
64
|
-
isContentEditable ||
|
|
65
|
-
isSceneTreeSearch ||
|
|
66
|
-
isInput ||
|
|
67
|
-
isVertexViewerPinTool ||
|
|
68
|
-
isVertexViewerTransformWidget);
|
|
69
|
-
};
|
|
70
|
-
|
|
71
|
-
const keyBindings = recoil.atom({
|
|
72
|
-
key: 'keyBindings',
|
|
73
|
-
default: {
|
|
74
|
-
applyBindings: [],
|
|
75
|
-
bindings: {},
|
|
76
|
-
pressed: {},
|
|
77
|
-
},
|
|
78
|
-
});
|
|
79
|
-
function reducer(state, action) {
|
|
80
|
-
var _a, _b, _c, _d;
|
|
81
|
-
switch (action.type) {
|
|
82
|
-
case 'push-key-binding':
|
|
83
|
-
const toAdd = (_a = state.bindings[action.binding.keyBind]) === null || _a === void 0 ? void 0 : _a.find((b) => b.id === action.binding.id);
|
|
84
|
-
return toAdd != null
|
|
85
|
-
? state
|
|
86
|
-
: Object.assign(Object.assign({}, state), { bindings: Object.assign(Object.assign({}, state.bindings), { [action.binding.keyBind]: [
|
|
87
|
-
...((_b = state.bindings[action.binding.keyBind]) !== null && _b !== void 0 ? _b : []),
|
|
88
|
-
action.binding,
|
|
89
|
-
] }) });
|
|
90
|
-
case 'remove-key-binding':
|
|
91
|
-
const toRemove = (_c = state.bindings[action.binding.keyBind]) === null || _c === void 0 ? void 0 : _c.find((b) => b.id === action.binding.id);
|
|
92
|
-
return toRemove == null
|
|
93
|
-
? state
|
|
94
|
-
: Object.assign(Object.assign({}, state), { bindings: Object.assign(Object.assign({}, state.bindings), { [action.binding.keyBind]: ((_d = state.bindings[action.binding.keyBind]) !== null && _d !== void 0 ? _d : []).filter((b) => b.id !== action.binding.id) }) });
|
|
95
|
-
case 'add-apply-key-binding':
|
|
96
|
-
return Object.assign(Object.assign({}, state), { applyBindings: [...state.applyBindings, action.binding] });
|
|
97
|
-
case 'remove-apply-key-binding':
|
|
98
|
-
return Object.assign(Object.assign({}, state), { applyBindings: state.applyBindings.filter((binding) => binding.id !== action.id) });
|
|
99
|
-
case 'set-key-pressed':
|
|
100
|
-
return Object.assign(Object.assign({}, state), { applyBindings: state.applyBindings.map((binding) => (Object.assign(Object.assign({}, binding), { active: binding.keyBind != null &&
|
|
101
|
-
allPressed(binding.keyBind, state.pressed) }))), pressed: Object.assign(Object.assign({}, state.pressed), { [action.key]: action.pressed }), lastPressed: action.pressed ? action.key : undefined });
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
const useKeyBindingState = () => {
|
|
105
|
-
return useRecoilReducer({
|
|
106
|
-
reducer,
|
|
107
|
-
atom: keyBindings,
|
|
108
|
-
});
|
|
109
|
-
};
|
|
110
|
-
function pressedValue(keyBind, pressed) {
|
|
111
|
-
return keyBind.includes('!')
|
|
112
|
-
? !pressed[keyBind.replace('!', '')] &&
|
|
113
|
-
!pressed[keyBind.replace('!', '').toLowerCase()]
|
|
114
|
-
: pressed[keyBind] || pressed[keyBind.toLowerCase()];
|
|
115
|
-
}
|
|
116
|
-
function isPressed(keyBind, pressed) {
|
|
117
|
-
const keys = keyBind.split('||');
|
|
118
|
-
return keys.length > 1
|
|
119
|
-
? keys.some((key) => pressedValue(key, pressed))
|
|
120
|
-
: pressedValue(keys[0], pressed);
|
|
121
|
-
}
|
|
122
|
-
function allPressed(keyBind, pressed) {
|
|
123
|
-
const keys = keyBind.split('+');
|
|
124
|
-
return keys.every((key) => isPressed(key, pressed));
|
|
125
|
-
}
|
|
126
|
-
function matchingSingleFnBindings(applyBindings, pressed, lastPressed) {
|
|
127
|
-
return applyBindings
|
|
128
|
-
.filter((binding) => !binding.repeat)
|
|
129
|
-
.filter((binding) => {
|
|
130
|
-
var _a;
|
|
131
|
-
return binding.keyBind != null &&
|
|
132
|
-
lastPressed != null &&
|
|
133
|
-
((_a = binding.keyBind) === null || _a === void 0 ? void 0 : _a.includes(lastPressed)) &&
|
|
134
|
-
allPressed(binding.keyBind, pressed);
|
|
135
|
-
})
|
|
136
|
-
.map((binding) => binding.fn);
|
|
137
|
-
}
|
|
138
|
-
function matchingOffBindings(applyBindings, pressed, lastPressed) {
|
|
139
|
-
return applyBindings
|
|
140
|
-
.filter((binding) => binding.off &&
|
|
141
|
-
binding.active &&
|
|
142
|
-
binding.keyBind != null &&
|
|
143
|
-
lastPressed == null &&
|
|
144
|
-
!allPressed(binding.keyBind, pressed))
|
|
145
|
-
.map((binding) => binding.off);
|
|
146
|
-
}
|
|
147
|
-
/**
|
|
148
|
-
* Depends on `useKeyBindings`.
|
|
149
|
-
*
|
|
150
|
-
* Adds a global key binding. Any key binding
|
|
151
|
-
* added this way will listen to global state for pressed
|
|
152
|
-
* keys, and executed whenever the key state matches the
|
|
153
|
-
* provided `keyBind`.
|
|
154
|
-
*
|
|
155
|
-
* @param binding - The `ApplyKeyBinding` to add.
|
|
156
|
-
*/
|
|
157
|
-
const useApplyKeyBinding = (binding) => {
|
|
158
|
-
const [state, dispatch] = useKeyBindingState();
|
|
159
|
-
React.useEffect(() => {
|
|
160
|
-
const id = utils.UUID.create();
|
|
161
|
-
dispatch({
|
|
162
|
-
type: 'add-apply-key-binding',
|
|
163
|
-
binding: Object.assign(Object.assign({}, binding), { id, active: binding.keyBind != null && allPressed(binding.keyBind, state.pressed) }),
|
|
164
|
-
});
|
|
165
|
-
return () => {
|
|
166
|
-
dispatch({
|
|
167
|
-
type: 'remove-apply-key-binding',
|
|
168
|
-
id,
|
|
169
|
-
});
|
|
170
|
-
};
|
|
171
|
-
}, [binding.fn, binding.off, binding.keyBind, binding.repeat]);
|
|
172
|
-
};
|
|
173
|
-
/**
|
|
174
|
-
* Depends on `useKeyBindings`.
|
|
175
|
-
*
|
|
176
|
-
* Adds a stack-based key binding. Any key binding
|
|
177
|
-
* added this way will be added to an existing (or new)
|
|
178
|
-
* stack for the specified `keyBind`.
|
|
179
|
-
*
|
|
180
|
-
* Provided `binding`s will be added and cancelled based
|
|
181
|
-
* on the specified `addPredicate` and `cancelPredicate`
|
|
182
|
-
* respectively. These predicates are evaluated any time
|
|
183
|
-
* that the `deps` array changes.
|
|
184
|
-
*
|
|
185
|
-
* @param binding - The `StackKeyBinding` to add.
|
|
186
|
-
* @param deps (optional) - The React dependency list.
|
|
187
|
-
*/
|
|
188
|
-
const useStackKeyBinding = (binding, deps = []) => {
|
|
189
|
-
const [, dispatch] = useKeyBindingState();
|
|
190
|
-
React.useEffect(() => {
|
|
191
|
-
const addPredicatePassing = binding.addPredicate == null || binding.addPredicate();
|
|
192
|
-
const cancelPredicatePassing = binding.cancelPredicate != null && binding.cancelPredicate();
|
|
193
|
-
if (addPredicatePassing) {
|
|
194
|
-
dispatch({
|
|
195
|
-
type: 'push-key-binding',
|
|
196
|
-
binding,
|
|
197
|
-
});
|
|
198
|
-
}
|
|
199
|
-
if (cancelPredicatePassing) {
|
|
200
|
-
dispatch({
|
|
201
|
-
type: 'remove-key-binding',
|
|
202
|
-
binding,
|
|
203
|
-
});
|
|
204
|
-
}
|
|
205
|
-
}, deps);
|
|
206
|
-
};
|
|
207
|
-
/**
|
|
208
|
-
* Enables key binding usage.
|
|
209
|
-
*
|
|
210
|
-
* This hook must appear in the tree for `useStackKeyBinding`
|
|
211
|
-
* or `useApplyKeyBinding` to work.
|
|
212
|
-
*/
|
|
213
|
-
const useKeyBindings = ({ keydownRepeatInterval = 25, keydownIgnorePredicate = isInputElement, } = {}) => {
|
|
214
|
-
const [state, dispatch] = useKeyBindingState();
|
|
215
|
-
const applyStackKeyBindings = React.useCallback((key) => {
|
|
216
|
-
Object.keys(state.bindings)
|
|
217
|
-
.filter((k) => k.includes(key) && allPressed(k, Object.assign(Object.assign({}, state.pressed), { [key]: true })))
|
|
218
|
-
.forEach((k) => {
|
|
219
|
-
const bindings = state.bindings[k];
|
|
220
|
-
const poppedBinding = bindings.length > 0 ? bindings[bindings.length - 1] : undefined;
|
|
221
|
-
if (poppedBinding != null) {
|
|
222
|
-
poppedBinding.fn();
|
|
223
|
-
dispatch({
|
|
224
|
-
type: 'remove-key-binding',
|
|
225
|
-
binding: poppedBinding,
|
|
226
|
-
});
|
|
227
|
-
}
|
|
228
|
-
});
|
|
229
|
-
}, [state]);
|
|
230
|
-
React.useEffect(() => {
|
|
231
|
-
const handleKeyDown = (event) => {
|
|
232
|
-
if (!event.repeat && !keydownIgnorePredicate(event.target)) {
|
|
233
|
-
dispatch({
|
|
234
|
-
type: 'set-key-pressed',
|
|
235
|
-
key: event.key,
|
|
236
|
-
pressed: true,
|
|
237
|
-
});
|
|
238
|
-
applyStackKeyBindings(event.key);
|
|
239
|
-
// If the key is associated with a keybinding, then prevent default behavior
|
|
240
|
-
const currentPressed = Object.assign(Object.assign({}, state.pressed), { [event.key]: true });
|
|
241
|
-
const activeMatchesSingleFnBindings = matchingSingleFnBindings(state.applyBindings, currentPressed, event.key);
|
|
242
|
-
const activeMatchesOffBindings = matchingOffBindings(state.applyBindings, currentPressed, event.key);
|
|
243
|
-
if (activeMatchesSingleFnBindings.length > 0 ||
|
|
244
|
-
activeMatchesOffBindings.length > 0) {
|
|
245
|
-
event.preventDefault();
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
};
|
|
249
|
-
const handleKeyUp = (event) => {
|
|
250
|
-
dispatch({
|
|
251
|
-
type: 'set-key-pressed',
|
|
252
|
-
key: event.key,
|
|
253
|
-
pressed: false,
|
|
254
|
-
});
|
|
255
|
-
};
|
|
256
|
-
window.addEventListener('keydown', handleKeyDown);
|
|
257
|
-
window.addEventListener('keyup', handleKeyUp);
|
|
258
|
-
return () => {
|
|
259
|
-
window.removeEventListener('keydown', handleKeyDown);
|
|
260
|
-
window.removeEventListener('keyup', handleKeyUp);
|
|
261
|
-
};
|
|
262
|
-
}, [applyStackKeyBindings, state.applyBindings, state.pressed]);
|
|
263
|
-
React.useEffect(() => {
|
|
264
|
-
const activeMatchesSingleFnBindings = matchingSingleFnBindings(state.applyBindings, state.pressed, state.lastPressed);
|
|
265
|
-
const activeMatchesOffBindings = matchingOffBindings(state.applyBindings, state.pressed, state.lastPressed);
|
|
266
|
-
activeMatchesSingleFnBindings.forEach((fn) => fn());
|
|
267
|
-
activeMatchesOffBindings.forEach((fn) => fn());
|
|
268
|
-
}, [state.pressed, state.lastPressed]);
|
|
269
|
-
React.useEffect(() => {
|
|
270
|
-
const matchingRepeatBindings = state.applyBindings
|
|
271
|
-
.filter((binding) => binding.repeat &&
|
|
272
|
-
binding.keyBind != null &&
|
|
273
|
-
allPressed(binding.keyBind, state.pressed))
|
|
274
|
-
.map((binding) => binding.fn);
|
|
275
|
-
if (matchingRepeatBindings.length > 0) {
|
|
276
|
-
const interval = setInterval(() => {
|
|
277
|
-
matchingRepeatBindings.forEach((fn) => fn());
|
|
278
|
-
}, keydownRepeatInterval);
|
|
279
|
-
return () => {
|
|
280
|
-
clearInterval(interval);
|
|
281
|
-
};
|
|
282
|
-
}
|
|
283
|
-
else {
|
|
284
|
-
return () => {
|
|
285
|
-
return undefined;
|
|
286
|
-
};
|
|
287
|
-
}
|
|
288
|
-
}, [state.applyBindings, state.lastPressed]);
|
|
289
|
-
};
|
|
290
|
-
|
|
291
|
-
function useLongPress({ target, callback, delay = 500, onMovement, }) {
|
|
292
|
-
const [longPressTimeout, setLongPressTimeout] = React__namespace.useState();
|
|
293
|
-
const [touchStartPosition, setTouchStartPosition] = React__namespace.useState();
|
|
294
|
-
React__namespace.useEffect(() => {
|
|
295
|
-
const handleTouchStart = (e) => {
|
|
296
|
-
const event = e;
|
|
297
|
-
if (event.touches != null && event.touches.length === 1) {
|
|
298
|
-
if (longPressTimeout != null) {
|
|
299
|
-
clearTimeout(longPressTimeout);
|
|
300
|
-
}
|
|
301
|
-
setTouchStartPosition(geometry.Point.create(event.touches[0].clientX, event.touches[0].clientY));
|
|
302
|
-
setLongPressTimeout(setTimeout(() => callback === null || callback === void 0 ? void 0 : callback(event), delay));
|
|
303
|
-
}
|
|
304
|
-
};
|
|
305
|
-
const handleTouchMove = (e) => {
|
|
306
|
-
const event = e;
|
|
307
|
-
if (event.touches != null &&
|
|
308
|
-
event.touches.length > 0 &&
|
|
309
|
-
longPressTimeout != null &&
|
|
310
|
-
touchStartPosition != null &&
|
|
311
|
-
geometry.Point.distance(touchStartPosition, geometry.Point.create(event.touches[0].clientX, event.touches[0].clientY)) >= 2) {
|
|
312
|
-
clearTimeout(longPressTimeout);
|
|
313
|
-
onMovement === null || onMovement === void 0 ? void 0 : onMovement();
|
|
314
|
-
}
|
|
315
|
-
};
|
|
316
|
-
const handleTouchEnd = () => {
|
|
317
|
-
if (longPressTimeout != null) {
|
|
318
|
-
clearTimeout(longPressTimeout);
|
|
319
|
-
}
|
|
320
|
-
};
|
|
321
|
-
target === null || target === void 0 ? void 0 : target.addEventListener('touchstart', handleTouchStart);
|
|
322
|
-
target === null || target === void 0 ? void 0 : target.addEventListener('touchmove', handleTouchMove);
|
|
323
|
-
target === null || target === void 0 ? void 0 : target.addEventListener('touchend', handleTouchEnd);
|
|
324
|
-
return () => {
|
|
325
|
-
target === null || target === void 0 ? void 0 : target.removeEventListener('touchstart', handleTouchStart);
|
|
326
|
-
target === null || target === void 0 ? void 0 : target.removeEventListener('touchmove', handleTouchMove);
|
|
327
|
-
target === null || target === void 0 ? void 0 : target.removeEventListener('touchend', handleTouchEnd);
|
|
328
|
-
};
|
|
329
|
-
}, [target, longPressTimeout, touchStartPosition]);
|
|
330
|
-
}
|
|
331
|
-
|
|
332
|
-
function contextMenuItemIsRow(item) {
|
|
333
|
-
var _a;
|
|
334
|
-
return item != null && ((_a = item === null || item === void 0 ? void 0 : item.node) === null || _a === void 0 ? void 0 : _a.id) != null;
|
|
335
|
-
}
|
|
336
|
-
const contextMenuActive = recoil.atom({
|
|
337
|
-
key: 'contextMenuActive',
|
|
338
|
-
default: undefined,
|
|
339
|
-
});
|
|
340
|
-
const contextMenuPosition = recoil.atom({
|
|
341
|
-
key: 'contextMenuPosition',
|
|
342
|
-
default: undefined,
|
|
343
|
-
});
|
|
344
|
-
const contextMenuTarget = recoil.atom({
|
|
345
|
-
key: 'contextMenuTarget',
|
|
346
|
-
default: undefined,
|
|
347
|
-
});
|
|
348
|
-
const contextMenuItem = recoil.atom({
|
|
349
|
-
key: 'contextMenuItem',
|
|
350
|
-
default: undefined,
|
|
351
|
-
});
|
|
352
|
-
const contextMenuActions = recoil.atom({
|
|
353
|
-
key: 'contextMenuActions',
|
|
354
|
-
default: [],
|
|
355
|
-
});
|
|
356
|
-
const contextMenuActivePosition = recoil.selector({
|
|
357
|
-
key: 'contextMenuActivePosition',
|
|
358
|
-
get: ({ get }) => get(contextMenuActive) != null ? get(contextMenuPosition) : undefined,
|
|
359
|
-
});
|
|
360
|
-
|
|
361
|
-
/******************************************************************************
|
|
362
|
-
Copyright (c) Microsoft Corporation.
|
|
363
|
-
|
|
364
|
-
Permission to use, copy, modify, and/or distribute this software for any
|
|
365
|
-
purpose with or without fee is hereby granted.
|
|
366
|
-
|
|
367
|
-
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
|
368
|
-
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
369
|
-
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
|
370
|
-
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
|
371
|
-
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
372
|
-
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
373
|
-
PERFORMANCE OF THIS SOFTWARE.
|
|
374
|
-
***************************************************************************** */
|
|
375
|
-
/* global Reflect, Promise, SuppressedError, Symbol, Iterator */
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
function __rest(s, e) {
|
|
379
|
-
var t = {};
|
|
380
|
-
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
381
|
-
t[p] = s[p];
|
|
382
|
-
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
383
|
-
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
384
|
-
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
385
|
-
t[p[i]] = s[p[i]];
|
|
386
|
-
}
|
|
387
|
-
return t;
|
|
388
|
-
}
|
|
389
|
-
|
|
390
|
-
typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
|
|
391
|
-
var e = new Error(message);
|
|
392
|
-
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
|
|
393
|
-
};
|
|
394
|
-
|
|
395
|
-
// Create a new logger instance
|
|
396
|
-
const pinoLogger = Pino({
|
|
397
|
-
formatters: {
|
|
398
|
-
level(level) {
|
|
399
|
-
return { level };
|
|
400
|
-
},
|
|
401
|
-
},
|
|
402
|
-
});
|
|
403
|
-
const logger = {
|
|
404
|
-
error: (message, error) => {
|
|
405
|
-
if (error != null) {
|
|
406
|
-
pinoLogger.error(error, message);
|
|
407
|
-
}
|
|
408
|
-
else {
|
|
409
|
-
pinoLogger.error(message);
|
|
410
|
-
}
|
|
411
|
-
},
|
|
412
|
-
info: (message, obj) => {
|
|
413
|
-
if (obj != null) {
|
|
414
|
-
pinoLogger.info(obj, message);
|
|
415
|
-
}
|
|
416
|
-
else {
|
|
417
|
-
pinoLogger.info(message);
|
|
418
|
-
}
|
|
419
|
-
},
|
|
420
|
-
warn: (message, err) => {
|
|
421
|
-
if (err != null) {
|
|
422
|
-
pinoLogger.warn(err, message);
|
|
423
|
-
}
|
|
424
|
-
else {
|
|
425
|
-
pinoLogger.warn(message);
|
|
426
|
-
}
|
|
427
|
-
},
|
|
428
|
-
debug: (message, obj) => {
|
|
429
|
-
if (obj != null) {
|
|
430
|
-
pinoLogger.debug(obj, message);
|
|
431
|
-
}
|
|
432
|
-
else {
|
|
433
|
-
pinoLogger.debug(message);
|
|
434
|
-
}
|
|
435
|
-
},
|
|
436
|
-
};
|
|
437
|
-
/* eslint-enable @typescript-eslint/no-explicit-any */
|
|
438
|
-
|
|
439
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
440
|
-
class DefaultRecoilDeps {
|
|
441
|
-
}
|
|
442
|
-
/**
|
|
443
|
-
* Returns a Recoil callback that can be used for action hooks.
|
|
444
|
-
*
|
|
445
|
-
* This uses `useRecoilCallback` but the deps implementation differs from
|
|
446
|
-
* Recoil. If no deps are provided, then it will always return the same function
|
|
447
|
-
* vs returning a new function.
|
|
448
|
-
*
|
|
449
|
-
* If you want to use the original Recoil callback behavior, pass
|
|
450
|
-
* `DefaultRecoilCallbackDepsBehavior`.
|
|
451
|
-
*
|
|
452
|
-
* @param fn The callback.
|
|
453
|
-
* @param deps The deps to memoize over. Defaults to `[]`.
|
|
454
|
-
* @returns A callback function
|
|
455
|
-
* @see https://recoiljs.org/docs/api-reference/core/useRecoilCallback
|
|
456
|
-
*/
|
|
457
|
-
function useActionCallback(fn, deps = []) {
|
|
458
|
-
const d = deps instanceof DefaultRecoilDeps ? undefined : deps;
|
|
459
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
460
|
-
return recoil.useRecoilCallback((cbInterface) => fn(Object.assign(Object.assign({}, cbInterface), { snapshot: Object.defineProperties(cbInterface.snapshot, {
|
|
461
|
-
getPromiseRequired: {
|
|
462
|
-
configurable: true,
|
|
463
|
-
value: createGetPromiseRequiredWrapper(cbInterface.snapshot),
|
|
464
|
-
},
|
|
465
|
-
tryGetPromise: {
|
|
466
|
-
configurable: true,
|
|
467
|
-
value: createTryGetPromiseWrapper(cbInterface.snapshot),
|
|
468
|
-
},
|
|
469
|
-
}) })), d);
|
|
470
|
-
}
|
|
471
|
-
/**
|
|
472
|
-
* Returns a callback that can be used with `useActionCallback` or `useRecoilCallback`,
|
|
473
|
-
* and automatically handles retention of the `snapshot` object for use with asynchronous
|
|
474
|
-
* selectors.
|
|
475
|
-
*
|
|
476
|
-
* This function expects a callback that would ordinarily be passed to `useActionCallback`
|
|
477
|
-
* or `useRecoilCallback`, but that returns an asynchronous action where the `snapshot` is
|
|
478
|
-
* used.
|
|
479
|
-
*
|
|
480
|
-
* @example
|
|
481
|
-
*
|
|
482
|
-
* const asyncSelector = selector({
|
|
483
|
-
* key: 'asyncSelector',
|
|
484
|
-
* get: async ({ get }) => {
|
|
485
|
-
* return await fetch('/api/item');
|
|
486
|
-
* }
|
|
487
|
-
* })
|
|
488
|
-
*
|
|
489
|
-
* useActionCallback(
|
|
490
|
-
* retainSnapshot(
|
|
491
|
-
* ({ snapshot }) => async () => {
|
|
492
|
-
* const asyncValue = await snapshot.getPromise(asyncSelector);
|
|
493
|
-
* }
|
|
494
|
-
* )
|
|
495
|
-
* )
|
|
496
|
-
*
|
|
497
|
-
* @param fn The callback.
|
|
498
|
-
* @returns The callback wrapped with a retain/release of the underlying snapshot.
|
|
499
|
-
*/
|
|
500
|
-
function retainSnapshot(fn) {
|
|
501
|
-
return (_a) => {
|
|
502
|
-
var { snapshot } = _a, cb = __rest(_a, ["snapshot"]);
|
|
503
|
-
return async (...args) => {
|
|
504
|
-
const release = snapshot.retain();
|
|
505
|
-
try {
|
|
506
|
-
const returnValue = await fn(Object.assign(Object.assign({}, cb), { snapshot }))(...args);
|
|
507
|
-
return returnValue;
|
|
508
|
-
}
|
|
509
|
-
finally {
|
|
510
|
-
release();
|
|
511
|
-
}
|
|
512
|
-
};
|
|
513
|
-
};
|
|
514
|
-
}
|
|
515
|
-
function createGetPromiseRequiredWrapper(snapshot) {
|
|
516
|
-
return async (recoilValue, error) => {
|
|
517
|
-
const value = await snapshot.getPromise(recoilValue);
|
|
518
|
-
if (value == null) {
|
|
519
|
-
throw (error !== null && error !== void 0 ? error : new Error(`No value present for required value ${recoilValue.key}`));
|
|
520
|
-
}
|
|
521
|
-
return value;
|
|
522
|
-
};
|
|
523
|
-
}
|
|
524
|
-
function createTryGetPromiseWrapper(snapshot) {
|
|
525
|
-
return async (value) => {
|
|
526
|
-
try {
|
|
527
|
-
return { value: await snapshot.getPromise(value) };
|
|
528
|
-
}
|
|
529
|
-
catch (e) {
|
|
530
|
-
logger.debug(`Error encountered retrieving Recoil value. [key={${value.key}}]`, e);
|
|
531
|
-
return {
|
|
532
|
-
error: e,
|
|
533
|
-
};
|
|
534
|
-
}
|
|
535
|
-
};
|
|
536
|
-
}
|
|
537
|
-
|
|
538
|
-
const viewerElement = recoil.atom({
|
|
539
|
-
key: 'viewerToolkitViewerElement',
|
|
540
|
-
default: undefined,
|
|
541
|
-
dangerouslyAllowMutability: true,
|
|
542
|
-
});
|
|
543
|
-
const viewerInitialSceneReady = recoil.atom({
|
|
544
|
-
key: 'viewerInitialSceneReady',
|
|
545
|
-
default: false,
|
|
546
|
-
});
|
|
547
|
-
const viewerBaseInteractionHandlerProvider = recoil.atom({
|
|
548
|
-
key: 'viewerBaseInteractionHandlerProvider',
|
|
549
|
-
default: Promise.resolve(undefined),
|
|
550
|
-
dangerouslyAllowMutability: true,
|
|
551
|
-
});
|
|
552
|
-
const viewerPrimaryInteractionType = recoil.atom({
|
|
553
|
-
key: 'viewerPrimaryInteractionType',
|
|
554
|
-
default: 'rotate',
|
|
555
|
-
});
|
|
556
|
-
|
|
557
|
-
const viewerSceneProvider = recoil.selector({
|
|
558
|
-
key: 'viewerScene',
|
|
559
|
-
get: ({ get }) => async () => { var _a; return (_a = get(viewerElement)) === null || _a === void 0 ? void 0 : _a.scene(); },
|
|
560
|
-
dangerouslyAllowMutability: true,
|
|
561
|
-
});
|
|
562
|
-
const viewerFrameScene = recoil.atom({
|
|
563
|
-
key: 'viewerFrameScene',
|
|
564
|
-
default: undefined,
|
|
565
|
-
dangerouslyAllowMutability: true,
|
|
566
|
-
});
|
|
567
|
-
const viewerSceneVisibleBoundingBox = recoil.selector({
|
|
568
|
-
key: 'viewerSceneVisibleBoundingBox',
|
|
569
|
-
get: ({ get }) => { var _a; return (_a = get(viewerFrameScene)) === null || _a === void 0 ? void 0 : _a.boundingBox; },
|
|
570
|
-
});
|
|
571
|
-
|
|
572
|
-
function useViewerSceneActions() {
|
|
573
|
-
const executeWithCorrelationId = useActionCallback(({ snapshot }) => async (alterationType, correlationId, ...transforms) => {
|
|
574
|
-
const sceneProvider = await snapshot.getPromise(viewerSceneProvider);
|
|
575
|
-
const scene = await sceneProvider();
|
|
576
|
-
if (transforms.length > 0) {
|
|
577
|
-
// TODO: track performance
|
|
578
|
-
await (scene === null || scene === void 0 ? void 0 : scene.items((op) => transforms.map((t) => t(op))).execute({
|
|
579
|
-
suppliedCorrelationId: correlationId,
|
|
580
|
-
}));
|
|
581
|
-
}
|
|
582
|
-
});
|
|
583
|
-
const selectItemsTransform = React.useCallback((...ids) => (op) => op.where((q) => q.withItemIds(ids)).select(), []);
|
|
584
|
-
const deselectItemsTransform = React.useCallback((...ids) => (op) => op.where((q) => q.withItemIds(ids)).deselect(), []);
|
|
585
|
-
const clearSelectionTransform = React.useCallback((op) => op.where((q) => q.all()).deselect(), []);
|
|
586
|
-
return {
|
|
587
|
-
executeWithCorrelationId,
|
|
588
|
-
execute: useActionCallback(() => async (alterationType, ...transforms) => {
|
|
589
|
-
const correlationId = utils.UUID.create();
|
|
590
|
-
await executeWithCorrelationId(alterationType, correlationId, ...transforms);
|
|
591
|
-
}),
|
|
592
|
-
selectItemsTransform,
|
|
593
|
-
deselectItemsTransform,
|
|
594
|
-
clearSelectionTransform,
|
|
595
|
-
reset: useActionCallback(({ snapshot }) => async (correlationId) => {
|
|
596
|
-
const sceneProvider = await snapshot.getPromiseRequired(viewerSceneProvider);
|
|
597
|
-
const scene = await sceneProvider();
|
|
598
|
-
scene === null || scene === void 0 ? void 0 : scene.reset({
|
|
599
|
-
includeCamera: true,
|
|
600
|
-
suppliedCorrelationId: correlationId,
|
|
601
|
-
});
|
|
602
|
-
}),
|
|
603
|
-
};
|
|
604
|
-
}
|
|
605
|
-
|
|
606
|
-
const DEFAULT_CAMERA_ANIMATION_DURATION = 500;
|
|
607
|
-
function useViewerCameraActions() {
|
|
608
|
-
return {
|
|
609
|
-
flyToById: useActionCallback(({ snapshot }) => async (id, animationMs) => {
|
|
610
|
-
const sceneProvider = await snapshot.getPromise(viewerSceneProvider);
|
|
611
|
-
const scene = await sceneProvider();
|
|
612
|
-
await (scene === null || scene === void 0 ? void 0 : scene.camera().flyTo({
|
|
613
|
-
itemId: id,
|
|
614
|
-
}).render({
|
|
615
|
-
animation: {
|
|
616
|
-
milliseconds: animationMs !== null && animationMs !== void 0 ? animationMs : DEFAULT_CAMERA_ANIMATION_DURATION,
|
|
617
|
-
},
|
|
618
|
-
}));
|
|
619
|
-
}),
|
|
620
|
-
flyToByBoundingBox: useActionCallback(({ snapshot }) => async (boundingBox, animationMs) => {
|
|
621
|
-
const sceneProvider = await snapshot.getPromise(viewerSceneProvider);
|
|
622
|
-
const scene = await sceneProvider();
|
|
623
|
-
await (scene === null || scene === void 0 ? void 0 : scene.camera().flyTo({
|
|
624
|
-
boundingBox,
|
|
625
|
-
}).render({
|
|
626
|
-
animation: {
|
|
627
|
-
milliseconds: animationMs !== null && animationMs !== void 0 ? animationMs : DEFAULT_CAMERA_ANIMATION_DURATION,
|
|
628
|
-
},
|
|
629
|
-
}));
|
|
630
|
-
}),
|
|
631
|
-
};
|
|
632
|
-
}
|
|
633
|
-
|
|
634
|
-
class CrossSectionInteractionHandler {
|
|
635
|
-
constructor() {
|
|
636
|
-
this.interactionStarted = false;
|
|
637
|
-
}
|
|
638
|
-
initialize(element, api) {
|
|
639
|
-
this.api = api;
|
|
640
|
-
}
|
|
641
|
-
dispose() {
|
|
642
|
-
this.endInteraction();
|
|
643
|
-
}
|
|
644
|
-
async beginInteraction() {
|
|
645
|
-
var _a;
|
|
646
|
-
if (!this.interactionStarted) {
|
|
647
|
-
await ((_a = this.api) === null || _a === void 0 ? void 0 : _a.beginInteraction());
|
|
648
|
-
this.interactionStarted = true;
|
|
649
|
-
}
|
|
650
|
-
}
|
|
651
|
-
async endInteraction() {
|
|
652
|
-
var _a;
|
|
653
|
-
await ((_a = this.api) === null || _a === void 0 ? void 0 : _a.endInteraction());
|
|
654
|
-
this.interactionStarted = false;
|
|
655
|
-
}
|
|
656
|
-
}
|
|
657
|
-
|
|
658
|
-
const create = (normal, offset = 0) => ({
|
|
659
|
-
normal,
|
|
660
|
-
offset,
|
|
661
|
-
});
|
|
662
|
-
const forAxis = (axis, offset) => {
|
|
663
|
-
switch (axis) {
|
|
664
|
-
case 'x':
|
|
665
|
-
return x(offset);
|
|
666
|
-
case 'y':
|
|
667
|
-
return y(offset);
|
|
668
|
-
case 'z':
|
|
669
|
-
return z(offset);
|
|
670
|
-
}
|
|
671
|
-
};
|
|
672
|
-
const x = (offset) => create(geometry.Vector3.left(), -offset);
|
|
673
|
-
const y = (offset) => create(geometry.Vector3.down(), -offset);
|
|
674
|
-
const z = (offset) => create(geometry.Vector3.forward(), -offset);
|
|
675
|
-
const getAxis = (axis, axes) => {
|
|
676
|
-
switch (axis) {
|
|
677
|
-
case 'x':
|
|
678
|
-
return xAxis(axes);
|
|
679
|
-
case 'y':
|
|
680
|
-
return yAxis(axes);
|
|
681
|
-
case 'z':
|
|
682
|
-
return zAxis(axes);
|
|
683
|
-
}
|
|
684
|
-
};
|
|
685
|
-
const defaultAxes = {
|
|
686
|
-
x: geometry.Vector3.left(),
|
|
687
|
-
y: geometry.Vector3.down(),
|
|
688
|
-
z: geometry.Vector3.forward(),
|
|
689
|
-
};
|
|
690
|
-
const xAxis = (axes) => axes.x;
|
|
691
|
-
const yAxis = (axes) => axes.y || geometry.Vector3.create(axes.x.z, axes.x.x, axes.x.y);
|
|
692
|
-
const zAxis = (axes) => axes.z || geometry.Vector3.create(axes.x.y, axes.x.z, axes.x.x);
|
|
693
|
-
/**
|
|
694
|
-
* Returns the active axis of a plane based on the normal values
|
|
695
|
-
*/
|
|
696
|
-
const axis = (plane, xAxis, yAxis, zAxis) => plane &&
|
|
697
|
-
plane.normal &&
|
|
698
|
-
[
|
|
699
|
-
['x', xAxis],
|
|
700
|
-
['y', yAxis],
|
|
701
|
-
['z', zAxis],
|
|
702
|
-
]
|
|
703
|
-
.filter((a) => geometry.Vector3.magnitude(geometry.Vector3.cross(plane.normal, a[1])) === 0)
|
|
704
|
-
.map((a) => a[0])
|
|
705
|
-
.pop();
|
|
706
|
-
const isNegativeNormal = (plane) => geometry.Vector3.dot(geometry.Vector3.create(-1, -1, -1), plane.normal) > 0;
|
|
707
|
-
/**
|
|
708
|
-
* Returns an updated section plane where the normal of the section plane is
|
|
709
|
-
* faced towards the given vector. The effect is the internal of the cross
|
|
710
|
-
* section is visible from the given vector.
|
|
711
|
-
*/
|
|
712
|
-
const towardsVector = (vector, plane) => {
|
|
713
|
-
const dot = geometry.Vector3.dot(vector, plane.normal);
|
|
714
|
-
if (dot < 0) {
|
|
715
|
-
return invert(plane);
|
|
716
|
-
}
|
|
717
|
-
else {
|
|
718
|
-
return plane;
|
|
719
|
-
}
|
|
720
|
-
};
|
|
721
|
-
/**
|
|
722
|
-
* Returns an updated section plane where the normal of the section plane is
|
|
723
|
-
* faced towards given camera's view vector. The effect is the user sees the
|
|
724
|
-
* internal of the cross section.
|
|
725
|
-
*/
|
|
726
|
-
const towardsCamera = (camera, plane) => {
|
|
727
|
-
return towardsVector(camera.viewVector, plane);
|
|
728
|
-
};
|
|
729
|
-
/**
|
|
730
|
-
* Reverses the direction of the section plane's normal to point in the opposite
|
|
731
|
-
* direction.
|
|
732
|
-
*/
|
|
733
|
-
const invert = (plane) => {
|
|
734
|
-
return Object.assign(Object.assign({}, plane), { normal: geometry.Vector3.multiply(plane.normal, geometry.Vector3.create(-1, -1, -1)), offset: -plane.offset });
|
|
735
|
-
};
|
|
736
|
-
const fromHit = (hit, camera) => {
|
|
737
|
-
const sectionNormal = geometry.Vector3.normalize(hit.normal);
|
|
738
|
-
const sectionOffset = geometry.Vector3.dot(sectionNormal, hit.position);
|
|
739
|
-
return towardsCamera(camera, create(sectionNormal, sectionOffset));
|
|
740
|
-
};
|
|
741
|
-
const toAxis = (axis, axes, camera, boundingBox, position) => {
|
|
742
|
-
const fitAllCamera = camera.viewAll();
|
|
743
|
-
const sectionAxis = getAxis(axis, axes);
|
|
744
|
-
const plane = boundingBox != null && sectionAxis != null
|
|
745
|
-
? create(sectionAxis, geometry.Vector3.dot(sectionAxis, position || geometry.BoundingBox.center(boundingBox)))
|
|
746
|
-
: forAxis(axis, fitAllCamera.lookAt[axis]);
|
|
747
|
-
return towardsCamera(camera, plane);
|
|
748
|
-
};
|
|
749
|
-
|
|
750
|
-
function corners(box) {
|
|
751
|
-
return [
|
|
752
|
-
// xMin, yMin, zMin
|
|
753
|
-
geometry.Vector3.create(box.min.x, box.min.y, box.min.z),
|
|
754
|
-
// xMin, yMin, zMax
|
|
755
|
-
geometry.Vector3.create(box.min.x, box.min.y, box.max.z),
|
|
756
|
-
// xMin, yMax, zMin
|
|
757
|
-
geometry.Vector3.create(box.min.x, box.max.y, box.min.z),
|
|
758
|
-
// xMin, yMax, zMax
|
|
759
|
-
geometry.Vector3.create(box.min.x, box.max.y, box.max.z),
|
|
760
|
-
// xMax, yMax, zMax
|
|
761
|
-
geometry.Vector3.create(box.max.x, box.max.y, box.max.z),
|
|
762
|
-
// xMax, yMax, zMin
|
|
763
|
-
geometry.Vector3.create(box.max.x, box.max.y, box.min.z),
|
|
764
|
-
// xMax, yMin, zMax
|
|
765
|
-
geometry.Vector3.create(box.max.x, box.min.y, box.max.z),
|
|
766
|
-
// xMax, yMin, zMin
|
|
767
|
-
geometry.Vector3.create(box.max.x, box.min.y, box.min.z),
|
|
768
|
-
];
|
|
769
|
-
}
|
|
770
|
-
|
|
771
|
-
const DEFAULT_SLIDER_RANGE = {
|
|
772
|
-
default: 5,
|
|
773
|
-
min: 0,
|
|
774
|
-
max: 10,
|
|
775
|
-
};
|
|
776
|
-
const crossSectioningEnabled = recoil.atom({
|
|
777
|
-
key: 'crossSectioningEnabled',
|
|
778
|
-
default: false,
|
|
779
|
-
});
|
|
780
|
-
const crossSectioningHighlightColor = recoil.atom({
|
|
781
|
-
key: 'crossSectioningHighlightColor',
|
|
782
|
-
default: undefined,
|
|
783
|
-
});
|
|
784
|
-
const crossSectioningBorderWidth = recoil.atom({
|
|
785
|
-
key: 'crossSectioningBorderWidth',
|
|
786
|
-
default: undefined,
|
|
787
|
-
});
|
|
788
|
-
const crossSectioningPlanes = recoil.atom({
|
|
789
|
-
key: 'crossSectioningPlanes',
|
|
790
|
-
default: [],
|
|
791
|
-
});
|
|
792
|
-
const crossSectioningAlignment = recoil.atom({
|
|
793
|
-
key: 'crossSectioningAlignment',
|
|
794
|
-
default: {
|
|
795
|
-
mode: 'global',
|
|
796
|
-
hitPending: false,
|
|
797
|
-
},
|
|
798
|
-
});
|
|
799
|
-
const crossSectioningTargetBoundingBox = recoil.selector({
|
|
800
|
-
key: 'crossSectioningTargetBoundingBox',
|
|
801
|
-
get: async ({ get }) => {
|
|
802
|
-
const visibleBounds = get(viewerSceneVisibleBoundingBox);
|
|
803
|
-
return visibleBounds;
|
|
804
|
-
},
|
|
805
|
-
});
|
|
806
|
-
const crossSectioningIsInteractive = recoil.atom({
|
|
807
|
-
key: 'crossSectioningIsInteractive',
|
|
808
|
-
default: false,
|
|
809
|
-
});
|
|
810
|
-
const crossSectioningActiveAxis = recoil.atom({
|
|
811
|
-
key: 'crossSectioningActiveAxis',
|
|
812
|
-
default: 'x',
|
|
813
|
-
});
|
|
814
|
-
const crossSectioningAvailableAxes = recoil.atom({
|
|
815
|
-
key: 'crossSectioningAvailableAxes',
|
|
816
|
-
default: defaultAxes,
|
|
817
|
-
});
|
|
818
|
-
const crossSectioningOffsetScalar = recoil.selector({
|
|
819
|
-
key: 'crossSectioningOffsetScalar',
|
|
820
|
-
get: ({ get }) => {
|
|
821
|
-
const planes = get(crossSectioningPlanes);
|
|
822
|
-
if (planes.length > 0) {
|
|
823
|
-
return isNegativeNormal(planes[0]) ? -1 : 1;
|
|
824
|
-
}
|
|
825
|
-
return 1;
|
|
826
|
-
},
|
|
827
|
-
});
|
|
828
|
-
const crossSectioningSliderRange = recoil.selector({
|
|
829
|
-
key: 'crossSectioningSliderRange',
|
|
830
|
-
get: ({ get }) => {
|
|
831
|
-
const planes = get(crossSectioningPlanes);
|
|
832
|
-
const bounds = get(crossSectioningTargetBoundingBox);
|
|
833
|
-
const boundsCorners = bounds != null ? corners(bounds) : [];
|
|
834
|
-
if (planes.length > 0) {
|
|
835
|
-
const projectedCorners = boundsCorners.map((c) => geometry.Vector3.dot(c, isNegativeNormal(planes[0])
|
|
836
|
-
? geometry.Vector3.multiply(planes[0].normal, geometry.Vector3.create(-1, -1, -1))
|
|
837
|
-
: planes[0].normal));
|
|
838
|
-
return {
|
|
839
|
-
default: planes[0].offset,
|
|
840
|
-
min: Math.min(...projectedCorners) - 2,
|
|
841
|
-
max: Math.max(...projectedCorners) + 2,
|
|
842
|
-
};
|
|
843
|
-
}
|
|
844
|
-
return DEFAULT_SLIDER_RANGE;
|
|
845
|
-
},
|
|
846
|
-
});
|
|
847
|
-
const crossSectioningPlaneDisplayOffset = recoil.selector({
|
|
848
|
-
key: 'crossSectioningPlaneDisplayOffset',
|
|
849
|
-
get: ({ get }) => {
|
|
850
|
-
const planes = get(crossSectioningPlanes);
|
|
851
|
-
const offsetScalar = get(crossSectioningOffsetScalar);
|
|
852
|
-
const sliderRange = get(crossSectioningSliderRange);
|
|
853
|
-
if (planes.length > 0) {
|
|
854
|
-
return planes[0].offset * offsetScalar;
|
|
855
|
-
}
|
|
856
|
-
else {
|
|
857
|
-
return sliderRange.default;
|
|
858
|
-
}
|
|
859
|
-
},
|
|
860
|
-
});
|
|
861
|
-
const crossSectioningAdditionalToolsOpen = recoil.atom({
|
|
862
|
-
key: 'crossSectioningAdditionalToolsOpen',
|
|
863
|
-
default: false,
|
|
864
|
-
});
|
|
865
|
-
const crossSectioningAlignmentToolsOpen = recoil.atom({
|
|
866
|
-
key: 'crossSectioningAlignmentToolsOpen',
|
|
867
|
-
default: false,
|
|
868
|
-
});
|
|
869
|
-
const crossSectioningAxisToolsOpen = recoil.atom({
|
|
870
|
-
key: 'crossSectioningAxisToolsOpen',
|
|
871
|
-
default: false,
|
|
872
|
-
});
|
|
873
|
-
const crossSectioningInteractionHandler = recoil.atom({
|
|
874
|
-
key: 'crossSectioningInteractionHandler',
|
|
875
|
-
default: new CrossSectionInteractionHandler(),
|
|
876
|
-
dangerouslyAllowMutability: true,
|
|
877
|
-
});
|
|
878
|
-
function useCrossSectioning(viewerElement, initialized) {
|
|
879
|
-
const interactionHandler = recoil.useRecoilValue(crossSectioningInteractionHandler);
|
|
880
|
-
React.useEffect(() => {
|
|
881
|
-
if (initialized) {
|
|
882
|
-
viewerElement === null || viewerElement === void 0 ? void 0 : viewerElement.registerInteractionHandler(interactionHandler);
|
|
883
|
-
}
|
|
884
|
-
}, [viewerElement, initialized, interactionHandler]);
|
|
885
|
-
}
|
|
886
|
-
|
|
887
|
-
const hitResultsTapDetails = recoil.atom({
|
|
888
|
-
key: 'hitResultsTapDetails',
|
|
889
|
-
default: undefined,
|
|
890
|
-
});
|
|
891
|
-
const hitResultsLongPressDetails = recoil.atom({
|
|
892
|
-
key: 'hitResultsLongPressDetails',
|
|
893
|
-
default: undefined,
|
|
894
|
-
});
|
|
895
|
-
const previousHitResult = recoil.atom({
|
|
896
|
-
key: 'previousHitResult',
|
|
897
|
-
default: undefined,
|
|
898
|
-
});
|
|
899
|
-
const currentHitResult = recoil.atom({
|
|
900
|
-
key: 'currentHitResult',
|
|
901
|
-
default: undefined,
|
|
902
|
-
});
|
|
903
|
-
const hitResult = recoil.selector({
|
|
904
|
-
key: 'hitResult',
|
|
905
|
-
get: async ({ get }) => {
|
|
906
|
-
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
907
|
-
const tapDetails = get(hitResultsTapDetails);
|
|
908
|
-
const longPressDetails = get(hitResultsLongPressDetails);
|
|
909
|
-
const details = tapDetails !== null && tapDetails !== void 0 ? tapDetails : longPressDetails;
|
|
910
|
-
const sceneProvider = get(viewerSceneProvider);
|
|
911
|
-
const scene = await sceneProvider();
|
|
912
|
-
const viewId = scene === null || scene === void 0 ? void 0 : scene.sceneViewId;
|
|
913
|
-
const raycaster = scene === null || scene === void 0 ? void 0 : scene.raycaster();
|
|
914
|
-
if (details != null && raycaster != null && viewId != null) {
|
|
915
|
-
const res = await raycaster.hitItems(details.position);
|
|
916
|
-
const sdkHit = ((res === null || res === void 0 ? void 0 : res.hits) || [])[0];
|
|
917
|
-
if (sdkHit != null) {
|
|
918
|
-
return {
|
|
919
|
-
id: (_a = sdkHit.itemId) === null || _a === void 0 ? void 0 : _a.hex,
|
|
920
|
-
normal: geometry.Vector3.create(((_b = sdkHit === null || sdkHit === void 0 ? void 0 : sdkHit.hitNormal) === null || _b === void 0 ? void 0 : _b.x) || 0, ((_c = sdkHit === null || sdkHit === void 0 ? void 0 : sdkHit.hitNormal) === null || _c === void 0 ? void 0 : _c.y) || 0, ((_d = sdkHit === null || sdkHit === void 0 ? void 0 : sdkHit.hitNormal) === null || _d === void 0 ? void 0 : _d.z) || 0),
|
|
921
|
-
position: geometry.Vector3.create(((_e = sdkHit === null || sdkHit === void 0 ? void 0 : sdkHit.hitPoint) === null || _e === void 0 ? void 0 : _e.x) || 0, ((_f = sdkHit === null || sdkHit === void 0 ? void 0 : sdkHit.hitPoint) === null || _f === void 0 ? void 0 : _f.y) || 0, ((_g = sdkHit === null || sdkHit === void 0 ? void 0 : sdkHit.hitPoint) === null || _g === void 0 ? void 0 : _g.z) || 0),
|
|
922
|
-
meta: details.metaKey || details.ctrlKey || false,
|
|
923
|
-
metadata: [], // TODO: Include metadata types
|
|
924
|
-
ancestors: ((_h = sdkHit === null || sdkHit === void 0 ? void 0 : sdkHit.ancestors) === null || _h === void 0 ? void 0 : _h.filter((a) => { var _a; return ((_a = a.itemId) === null || _a === void 0 ? void 0 : _a.hex) != null; }).map((a) => { var _a; return (_a = a.itemId) === null || _a === void 0 ? void 0 : _a.hex; })) || [],
|
|
925
|
-
};
|
|
926
|
-
}
|
|
927
|
-
}
|
|
928
|
-
return undefined;
|
|
929
|
-
},
|
|
930
|
-
});
|
|
931
|
-
// Whether to skip the next `tap` event's behavior. This is typically the
|
|
932
|
-
// case when the `pointerdown` is associated to some other action.
|
|
933
|
-
// E.g. a context menu without a backdrop being dismissed.
|
|
934
|
-
const hitResultsSkipNextTap = recoil.atom({
|
|
935
|
-
key: 'hitResultsSkipNextTap',
|
|
936
|
-
default: false,
|
|
937
|
-
});
|
|
938
|
-
|
|
939
|
-
const alignToNormal = (camera, normal, boundingBox) => {
|
|
940
|
-
if (camera.toFrameCamera().isPerspective()) {
|
|
941
|
-
// when cos theta of the camera up vector and plane normal approaches |1|
|
|
942
|
-
// we will have unexpected results and need to find a better value for
|
|
943
|
-
// the new up vector.
|
|
944
|
-
// using negative value of cos0 in calculation for that up vector
|
|
945
|
-
// prevents flipping the model around the up vector
|
|
946
|
-
const cos0 = geometry.Vector3.dot(geometry.Vector3.normalize(camera.up), normal);
|
|
947
|
-
const up = Math.abs(cos0) > 0.98
|
|
948
|
-
? geometry.Vector3.normalize(geometry.Vector3.scale(-cos0, camera.viewVector))
|
|
949
|
-
: camera.up;
|
|
950
|
-
const position = geometry.Vector3.add(geometry.Vector3.scale(geometry.Vector3.distance(camera.position, camera.lookAt), geometry.Vector3.multiply(normal, geometry.Vector3.create(-1, -1, -1))), camera.lookAt);
|
|
951
|
-
return camera.update({
|
|
952
|
-
up,
|
|
953
|
-
position,
|
|
954
|
-
});
|
|
955
|
-
}
|
|
956
|
-
else {
|
|
957
|
-
const angle = geometry.Vector3.angleTo(geometry.Vector3.normalize(camera.viewVector), normal);
|
|
958
|
-
const rotationPoint = boundingBox != null ? geometry.BoundingBox.center(boundingBox) : camera.lookAt;
|
|
959
|
-
const rotationAxis = geometry.Vector3.normalize(geometry.Vector3.cross(geometry.Vector3.normalize(camera.viewVector), normal));
|
|
960
|
-
return camera.rotateAroundAxisAtPoint(angle, rotationPoint, rotationAxis);
|
|
961
|
-
}
|
|
962
|
-
};
|
|
963
|
-
|
|
964
|
-
function isParallelTo(a, b) {
|
|
965
|
-
const angle = geometry.Angle.toDegrees(geometry.Vector3.angleTo(a, b));
|
|
966
|
-
return angle === 0 || angle === 180;
|
|
967
|
-
}
|
|
968
|
-
|
|
969
|
-
const DEFAULT_ALIGN_TO_PLANE_ANIMATION_DURATION_MS = 500;
|
|
970
|
-
function useCrossSectioningActions() {
|
|
971
|
-
const applyCrossSection = useActionCallback(({ snapshot }) => async () => {
|
|
972
|
-
const borderWidth = await snapshot.getPromise(crossSectioningBorderWidth);
|
|
973
|
-
const highlightColor = await snapshot.getPromise(crossSectioningHighlightColor);
|
|
974
|
-
const planes = await snapshot.getPromise(crossSectioningPlanes);
|
|
975
|
-
const sceneProvider = await snapshot.getPromise(viewerSceneProvider);
|
|
976
|
-
const scene = await sceneProvider();
|
|
977
|
-
await (scene === null || scene === void 0 ? void 0 : scene.crossSectioning().update({
|
|
978
|
-
sectionPlanes: planes,
|
|
979
|
-
highlightColor: highlightColor
|
|
980
|
-
? utils.Color.fromHexString(highlightColor)
|
|
981
|
-
: undefined,
|
|
982
|
-
lineWidth: borderWidth,
|
|
983
|
-
}));
|
|
984
|
-
});
|
|
985
|
-
const applyCrossSectionGlobalDefault = useActionCallback(({ set, reset, snapshot }) => async () => {
|
|
986
|
-
const sceneProvider = await snapshot.getPromise(viewerSceneProvider);
|
|
987
|
-
const scene = await sceneProvider();
|
|
988
|
-
if (scene != null) {
|
|
989
|
-
const fitAllCamera = scene.camera().viewAll();
|
|
990
|
-
reset(crossSectioningAvailableAxes);
|
|
991
|
-
set(crossSectioningPlanes, [
|
|
992
|
-
towardsCamera(scene.camera(), x(fitAllCamera.lookAt.x)),
|
|
993
|
-
]);
|
|
994
|
-
applyCrossSection();
|
|
995
|
-
}
|
|
996
|
-
});
|
|
997
|
-
const applyCrossSectionFromSceneHitItem = useActionCallback(retainSnapshot(({ snapshot, set }) => async () => {
|
|
998
|
-
const item = await snapshot.tryGetPromise(hitResult).then((r) => r.value);
|
|
999
|
-
const sceneProvider = await snapshot.getPromise(viewerSceneProvider);
|
|
1000
|
-
const scene = await sceneProvider();
|
|
1001
|
-
if (item != null && scene != null) {
|
|
1002
|
-
const plane = fromHit(item, scene.camera());
|
|
1003
|
-
set(crossSectioningPlanes, plane != null ? [plane] : []);
|
|
1004
|
-
set(crossSectioningAvailableAxes, plane != null ? { x: plane.normal } : defaultAxes);
|
|
1005
|
-
applyCrossSection();
|
|
1006
|
-
}
|
|
1007
|
-
}));
|
|
1008
|
-
const enable = useActionCallback(({ set, snapshot }) => async () => {
|
|
1009
|
-
const planes = await snapshot.getPromise(crossSectioningPlanes);
|
|
1010
|
-
const isEnabled = await snapshot.getPromise(crossSectioningEnabled);
|
|
1011
|
-
if (!isEnabled) {
|
|
1012
|
-
set(crossSectioningEnabled, true);
|
|
1013
|
-
if (planes.length === 0) {
|
|
1014
|
-
await applyCrossSectionGlobalDefault();
|
|
1015
|
-
}
|
|
1016
|
-
}
|
|
1017
|
-
});
|
|
1018
|
-
const disable = useActionCallback(({ reset, snapshot }) => async () => {
|
|
1019
|
-
const isEnabled = await snapshot.getPromise(crossSectioningEnabled);
|
|
1020
|
-
if (isEnabled) {
|
|
1021
|
-
reset(crossSectioningEnabled);
|
|
1022
|
-
reset(crossSectioningAdditionalToolsOpen);
|
|
1023
|
-
reset(crossSectioningAlignmentToolsOpen);
|
|
1024
|
-
reset(crossSectioningAxisToolsOpen);
|
|
1025
|
-
reset(crossSectioningPlanes);
|
|
1026
|
-
reset(crossSectioningAlignment);
|
|
1027
|
-
reset(crossSectioningActiveAxis);
|
|
1028
|
-
await applyCrossSection();
|
|
1029
|
-
}
|
|
1030
|
-
});
|
|
1031
|
-
return {
|
|
1032
|
-
enable,
|
|
1033
|
-
disable,
|
|
1034
|
-
openAdditionalTools: useActionCallback(({ set, snapshot }) => async () => {
|
|
1035
|
-
const isEnabled = await snapshot.getPromise(crossSectioningEnabled);
|
|
1036
|
-
if (!isEnabled) {
|
|
1037
|
-
enable();
|
|
1038
|
-
}
|
|
1039
|
-
set(crossSectioningAdditionalToolsOpen, true);
|
|
1040
|
-
}),
|
|
1041
|
-
closeAdditionalTools: useActionCallback(({ reset }) => async () => {
|
|
1042
|
-
reset(crossSectioningAdditionalToolsOpen);
|
|
1043
|
-
}),
|
|
1044
|
-
openAlignmentTools: useActionCallback(({ set, reset }) => async () => {
|
|
1045
|
-
reset(crossSectioningAxisToolsOpen);
|
|
1046
|
-
set(crossSectioningAlignmentToolsOpen, true);
|
|
1047
|
-
}),
|
|
1048
|
-
closeAlignmentTools: useActionCallback(({ reset }) => async () => {
|
|
1049
|
-
reset(crossSectioningAlignmentToolsOpen);
|
|
1050
|
-
}),
|
|
1051
|
-
openAxisTools: useActionCallback(({ set, reset }) => async () => {
|
|
1052
|
-
reset(crossSectioningAlignmentToolsOpen);
|
|
1053
|
-
set(crossSectioningAxisToolsOpen, true);
|
|
1054
|
-
}),
|
|
1055
|
-
closeAxisTools: useActionCallback(({ reset }) => async () => {
|
|
1056
|
-
reset(crossSectioningAxisToolsOpen);
|
|
1057
|
-
}),
|
|
1058
|
-
beginInteraction: useActionCallback(({ set, snapshot }) => async () => {
|
|
1059
|
-
const interactionHandler = await snapshot.getPromise(crossSectioningInteractionHandler);
|
|
1060
|
-
set(crossSectioningIsInteractive, true);
|
|
1061
|
-
await interactionHandler.beginInteraction();
|
|
1062
|
-
}),
|
|
1063
|
-
endInteraction: useActionCallback(({ reset, snapshot }) => async () => {
|
|
1064
|
-
const interactionHandler = await snapshot.getPromise(crossSectioningInteractionHandler);
|
|
1065
|
-
reset(crossSectioningIsInteractive);
|
|
1066
|
-
await interactionHandler.endInteraction();
|
|
1067
|
-
}),
|
|
1068
|
-
updatePlanes: useActionCallback(retainSnapshot(({ set, snapshot }) => async (offset) => {
|
|
1069
|
-
const existingPlanes = await snapshot.getPromise(crossSectioningPlanes);
|
|
1070
|
-
if (existingPlanes.length > 0) {
|
|
1071
|
-
const offsetScalar = await snapshot.getPromise(crossSectioningOffsetScalar);
|
|
1072
|
-
const range = await snapshot.getPromise(crossSectioningSliderRange);
|
|
1073
|
-
const minimum = offsetScalar < 0 ? range.max * -1 : range.min;
|
|
1074
|
-
const maximum = offsetScalar < 0 ? range.min * -1 : range.max;
|
|
1075
|
-
const updated = existingPlanes.map((plane) => (Object.assign(Object.assign({}, plane), { offset: Math.min(Math.max(offset * offsetScalar, minimum), maximum) })));
|
|
1076
|
-
set(crossSectioningPlanes, updated);
|
|
1077
|
-
applyCrossSection();
|
|
1078
|
-
}
|
|
1079
|
-
})),
|
|
1080
|
-
flipPlanes: useActionCallback(({ set, snapshot }) => async () => {
|
|
1081
|
-
const existingPlanes = await snapshot.getPromise(crossSectioningPlanes);
|
|
1082
|
-
set(crossSectioningPlanes, existingPlanes.map((plane) => invert(plane)));
|
|
1083
|
-
applyCrossSection();
|
|
1084
|
-
}),
|
|
1085
|
-
alignViewToPlane: useActionCallback(({ snapshot }) => async () => {
|
|
1086
|
-
const existingPlanes = await snapshot.getPromise(crossSectioningPlanes);
|
|
1087
|
-
const el = await snapshot.getPromise(viewerElement);
|
|
1088
|
-
const scene = await (el === null || el === void 0 ? void 0 : el.scene());
|
|
1089
|
-
if (existingPlanes.length > 0 && scene != null) {
|
|
1090
|
-
await alignToNormal(scene.camera(), existingPlanes[0].normal, scene.boundingBox()).render({
|
|
1091
|
-
animation: {
|
|
1092
|
-
milliseconds: DEFAULT_ALIGN_TO_PLANE_ANIMATION_DURATION_MS,
|
|
1093
|
-
},
|
|
1094
|
-
});
|
|
1095
|
-
}
|
|
1096
|
-
}),
|
|
1097
|
-
updateAxis: useActionCallback(retainSnapshot(({ set, reset, snapshot }) => async (axis) => {
|
|
1098
|
-
const existingPlanes = await snapshot.getPromise(crossSectioningPlanes);
|
|
1099
|
-
const availableAxes = await snapshot.getPromise(crossSectioningAvailableAxes);
|
|
1100
|
-
const targetBounds = await snapshot.getPromise(crossSectioningTargetBoundingBox);
|
|
1101
|
-
const alignment = await snapshot.getPromise(crossSectioningAlignment);
|
|
1102
|
-
const el = await snapshot.getPromise(viewerElement);
|
|
1103
|
-
const scene = await (el === null || el === void 0 ? void 0 : el.scene());
|
|
1104
|
-
const chosenAxis = availableAxes[axis];
|
|
1105
|
-
const angleIsParallelOrNaN = chosenAxis != null &&
|
|
1106
|
-
existingPlanes.length > 0 &&
|
|
1107
|
-
isParallelTo(existingPlanes[0].normal, chosenAxis) &&
|
|
1108
|
-
!isNaN(geometry.Vector3.angleTo(existingPlanes[0].normal, chosenAxis));
|
|
1109
|
-
if (scene != null && !angleIsParallelOrNaN) {
|
|
1110
|
-
const currentHitResult = await snapshot
|
|
1111
|
-
.tryGetPromise(hitResult)
|
|
1112
|
-
.then((r) => r.value);
|
|
1113
|
-
set(crossSectioningActiveAxis, axis);
|
|
1114
|
-
set(crossSectioningPlanes, [
|
|
1115
|
-
toAxis(axis, availableAxes, scene.camera(), targetBounds, alignment.mode !== 'global'
|
|
1116
|
-
? currentHitResult === null || currentHitResult === void 0 ? void 0 : currentHitResult.position
|
|
1117
|
-
: undefined),
|
|
1118
|
-
]);
|
|
1119
|
-
}
|
|
1120
|
-
reset(crossSectioningAxisToolsOpen);
|
|
1121
|
-
applyCrossSection();
|
|
1122
|
-
})),
|
|
1123
|
-
updateAlignment: useActionCallback(({ set, reset }) => async (alignment, hit) => {
|
|
1124
|
-
reset(crossSectioningAlignmentToolsOpen);
|
|
1125
|
-
set(crossSectioningAlignment, {
|
|
1126
|
-
mode: alignment,
|
|
1127
|
-
hitPending: alignment !== 'global' && hit == null,
|
|
1128
|
-
});
|
|
1129
|
-
if (alignment === 'global') {
|
|
1130
|
-
reset(crossSectioningActiveAxis);
|
|
1131
|
-
reset(crossSectioningAvailableAxes);
|
|
1132
|
-
applyCrossSectionGlobalDefault();
|
|
1133
|
-
}
|
|
1134
|
-
else if (alignment === 'surface' && hit != null) {
|
|
1135
|
-
await enable();
|
|
1136
|
-
applyCrossSectionFromSceneHitItem();
|
|
1137
|
-
}
|
|
1138
|
-
}),
|
|
1139
|
-
cancelCurrentHit: useActionCallback(({ set, snapshot }) => async () => {
|
|
1140
|
-
const alignment = await snapshot.getPromise(crossSectioningAlignment);
|
|
1141
|
-
if (alignment.hitPending) {
|
|
1142
|
-
set(crossSectioningAlignment, Object.assign(Object.assign({}, alignment), { hitPending: false }));
|
|
1143
|
-
}
|
|
1144
|
-
}),
|
|
1145
|
-
sectionCurrentHit: useActionCallback(({ set, snapshot }) => async () => {
|
|
1146
|
-
const alignment = await snapshot.getPromise(crossSectioningAlignment);
|
|
1147
|
-
if (alignment.hitPending) {
|
|
1148
|
-
set(crossSectioningAlignment, Object.assign(Object.assign({}, alignment), { hitPending: false }));
|
|
1149
|
-
if (alignment.mode === 'surface') {
|
|
1150
|
-
applyCrossSectionFromSceneHitItem();
|
|
1151
|
-
}
|
|
1152
|
-
}
|
|
1153
|
-
}),
|
|
1154
|
-
};
|
|
1155
|
-
}
|
|
1156
|
-
|
|
1157
|
-
var index$3 = /*#__PURE__*/Object.freeze({
|
|
1158
|
-
__proto__: null,
|
|
1159
|
-
DEFAULT_ALIGN_TO_PLANE_ANIMATION_DURATION_MS: DEFAULT_ALIGN_TO_PLANE_ANIMATION_DURATION_MS,
|
|
1160
|
-
DEFAULT_SLIDER_RANGE: DEFAULT_SLIDER_RANGE,
|
|
1161
|
-
crossSectioningActiveAxis: crossSectioningActiveAxis,
|
|
1162
|
-
crossSectioningAdditionalToolsOpen: crossSectioningAdditionalToolsOpen,
|
|
1163
|
-
crossSectioningAlignment: crossSectioningAlignment,
|
|
1164
|
-
crossSectioningAlignmentToolsOpen: crossSectioningAlignmentToolsOpen,
|
|
1165
|
-
crossSectioningAvailableAxes: crossSectioningAvailableAxes,
|
|
1166
|
-
crossSectioningAxisToolsOpen: crossSectioningAxisToolsOpen,
|
|
1167
|
-
crossSectioningBorderWidth: crossSectioningBorderWidth,
|
|
1168
|
-
crossSectioningEnabled: crossSectioningEnabled,
|
|
1169
|
-
crossSectioningHighlightColor: crossSectioningHighlightColor,
|
|
1170
|
-
crossSectioningInteractionHandler: crossSectioningInteractionHandler,
|
|
1171
|
-
crossSectioningIsInteractive: crossSectioningIsInteractive,
|
|
1172
|
-
crossSectioningOffsetScalar: crossSectioningOffsetScalar,
|
|
1173
|
-
crossSectioningPlaneDisplayOffset: crossSectioningPlaneDisplayOffset,
|
|
1174
|
-
crossSectioningPlanes: crossSectioningPlanes,
|
|
1175
|
-
crossSectioningSliderRange: crossSectioningSliderRange,
|
|
1176
|
-
crossSectioningTargetBoundingBox: crossSectioningTargetBoundingBox,
|
|
1177
|
-
useCrossSectioning: useCrossSectioning,
|
|
1178
|
-
useCrossSectioningActions: useCrossSectioningActions
|
|
1179
|
-
});
|
|
1180
|
-
|
|
1181
|
-
const useHitActions = () => {
|
|
1182
|
-
const crossSectioningActions = useCrossSectioningActions();
|
|
1183
|
-
const clearMeasurement = useActionCallback(retainSnapshot(({ snapshot }) => async () => {
|
|
1184
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
1185
|
-
await snapshot
|
|
1186
|
-
.tryGetPromise(hitResult)
|
|
1187
|
-
.then((r) => r.value);
|
|
1188
|
-
// TODO: clear measurement
|
|
1189
|
-
}));
|
|
1190
|
-
const updateTransformWidgetPosition = useActionCallback(retainSnapshot(({ snapshot }) => async () => {
|
|
1191
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
1192
|
-
await snapshot
|
|
1193
|
-
.tryGetPromise(hitResult)
|
|
1194
|
-
.then((r) => r.value);
|
|
1195
|
-
// TODO: update widget position
|
|
1196
|
-
}));
|
|
1197
|
-
const setContextMenuItem = useActionCallback(retainSnapshot(({ set, snapshot }) => async () => {
|
|
1198
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
1199
|
-
const currentHitResult = await snapshot
|
|
1200
|
-
.tryGetPromise(hitResult)
|
|
1201
|
-
.then((r) => r.value);
|
|
1202
|
-
set(contextMenuItem, currentHitResult);
|
|
1203
|
-
}));
|
|
1204
|
-
const setCurrentHitResult = useActionCallback(retainSnapshot(({ snapshot, set }) => async () => {
|
|
1205
|
-
set(currentHitResult, await snapshot.tryGetPromise(hitResult).then((r) => r.value));
|
|
1206
|
-
}));
|
|
1207
|
-
return {
|
|
1208
|
-
tap: useActionCallback(retainSnapshot(({ snapshot, set }) => async ({ detail }, ...standardTapActions) => {
|
|
1209
|
-
const currentCrossSectioningAlignment = await snapshot.getPromise(crossSectioningAlignment);
|
|
1210
|
-
const isStandardTap = (detail === null || detail === void 0 ? void 0 : detail.buttons) !== 2 && !(detail === null || detail === void 0 ? void 0 : detail.altKey);
|
|
1211
|
-
detail.altKey ||
|
|
1212
|
-
detail.ctrlKey ||
|
|
1213
|
-
detail.metaKey ||
|
|
1214
|
-
detail.shiftKey;
|
|
1215
|
-
const isValidSelectionTap = isStandardTap && !currentCrossSectioningAlignment.hitPending;
|
|
1216
|
-
const currentHitResult = await snapshot
|
|
1217
|
-
.tryGetPromise(hitResult)
|
|
1218
|
-
.then((r) => r.value);
|
|
1219
|
-
set(previousHitResult, currentHitResult);
|
|
1220
|
-
set(hitResultsTapDetails, detail);
|
|
1221
|
-
clearMeasurement();
|
|
1222
|
-
if (isValidSelectionTap) {
|
|
1223
|
-
standardTapActions.forEach((action) => action());
|
|
1224
|
-
{
|
|
1225
|
-
updateTransformWidgetPosition();
|
|
1226
|
-
}
|
|
1227
|
-
}
|
|
1228
|
-
setContextMenuItem();
|
|
1229
|
-
crossSectioningActions.sectionCurrentHit();
|
|
1230
|
-
setCurrentHitResult();
|
|
1231
|
-
})),
|
|
1232
|
-
longPress: useActionCallback(retainSnapshot(({ snapshot, set, reset }) => async (event) => {
|
|
1233
|
-
reset(hitResultsTapDetails);
|
|
1234
|
-
set(hitResultsLongPressDetails, event.detail);
|
|
1235
|
-
await snapshot.tryGetPromise(hitResult);
|
|
1236
|
-
setContextMenuItem();
|
|
1237
|
-
setCurrentHitResult();
|
|
1238
|
-
})),
|
|
1239
|
-
};
|
|
1240
|
-
};
|
|
1241
|
-
|
|
1242
|
-
const hitState = recoil.selector({
|
|
1243
|
-
key: 'viewerToolkitHitState',
|
|
1244
|
-
get: ({ get }) => {
|
|
1245
|
-
const tapDetails = get(hitResultsTapDetails);
|
|
1246
|
-
const longPressDetails = get(hitResultsLongPressDetails);
|
|
1247
|
-
const previous = get(previousHitResult);
|
|
1248
|
-
const current = get(currentHitResult);
|
|
1249
|
-
const state = {
|
|
1250
|
-
tapDetails,
|
|
1251
|
-
longPressDetails,
|
|
1252
|
-
previousHitResult: previous,
|
|
1253
|
-
currentHitResult: current,
|
|
1254
|
-
};
|
|
1255
|
-
return state;
|
|
1256
|
-
},
|
|
1257
|
-
});
|
|
1258
|
-
|
|
1259
|
-
var index$2 = /*#__PURE__*/Object.freeze({
|
|
1260
|
-
__proto__: null,
|
|
1261
|
-
currentHitResult: currentHitResult,
|
|
1262
|
-
hitResult: hitResult,
|
|
1263
|
-
hitResultsLongPressDetails: hitResultsLongPressDetails,
|
|
1264
|
-
hitResultsSkipNextTap: hitResultsSkipNextTap,
|
|
1265
|
-
hitResultsTapDetails: hitResultsTapDetails,
|
|
1266
|
-
hitState: hitState,
|
|
1267
|
-
previousHitResult: previousHitResult,
|
|
1268
|
-
useHitActions: useHitActions
|
|
1269
|
-
});
|
|
1270
|
-
|
|
1271
|
-
function useContextMenuActions() {
|
|
1272
|
-
return {
|
|
1273
|
-
pointerDown: useActionCallback(({ set }) => async (event, pointOverride) => {
|
|
1274
|
-
var _a, _b;
|
|
1275
|
-
if (event.button === 2) {
|
|
1276
|
-
const xCoordinate = (_a = pointOverride === null || pointOverride === void 0 ? void 0 : pointOverride.x) !== null && _a !== void 0 ? _a : event.clientX;
|
|
1277
|
-
const yCoordinate = (_b = pointOverride === null || pointOverride === void 0 ? void 0 : pointOverride.y) !== null && _b !== void 0 ? _b : event === null || event === void 0 ? void 0 : event.clientY;
|
|
1278
|
-
set(contextMenuPosition, geometry.Point.create(xCoordinate, yCoordinate));
|
|
1279
|
-
set(contextMenuTarget, event.target);
|
|
1280
|
-
}
|
|
1281
|
-
}),
|
|
1282
|
-
pointerUp: useActionCallback(({ snapshot, set }) => async (event, type, predicate, onOpen, pointOverride) => {
|
|
1283
|
-
var _a, _b;
|
|
1284
|
-
const downPosition = await snapshot.getPromise(contextMenuPosition);
|
|
1285
|
-
const active = await snapshot.getPromise(contextMenuActive);
|
|
1286
|
-
if (downPosition != null && active == null) {
|
|
1287
|
-
const xCoordinate = (_a = pointOverride === null || pointOverride === void 0 ? void 0 : pointOverride.x) !== null && _a !== void 0 ? _a : event.clientX;
|
|
1288
|
-
const yCoordinate = (_b = pointOverride === null || pointOverride === void 0 ? void 0 : pointOverride.y) !== null && _b !== void 0 ? _b : event === null || event === void 0 ? void 0 : event.clientY;
|
|
1289
|
-
const point = geometry.Point.create(xCoordinate, yCoordinate);
|
|
1290
|
-
const pointDistance = downPosition != null ? geometry.Point.distance(downPosition, point) : 0;
|
|
1291
|
-
const predicateResult = predicate == null || predicate(event);
|
|
1292
|
-
if (pointDistance < 2 && predicateResult) {
|
|
1293
|
-
onOpen === null || onOpen === void 0 ? void 0 : onOpen(event, downPosition !== null && downPosition !== void 0 ? downPosition : point);
|
|
1294
|
-
set(contextMenuActive, type);
|
|
1295
|
-
}
|
|
1296
|
-
}
|
|
1297
|
-
}),
|
|
1298
|
-
contextMenu: useActionCallback(() => (event, predicate) => {
|
|
1299
|
-
if (predicate == null || predicate(event)) {
|
|
1300
|
-
event.preventDefault();
|
|
1301
|
-
}
|
|
1302
|
-
}),
|
|
1303
|
-
longPress: useActionCallback(({ set }) => (event, type, predicate, onOpen) => {
|
|
1304
|
-
if (predicate == null || predicate(event)) {
|
|
1305
|
-
const point = geometry.Point.create(event.touches[0].clientX, event.touches[0].clientY);
|
|
1306
|
-
set(contextMenuPosition, point);
|
|
1307
|
-
set(contextMenuTarget, event.target);
|
|
1308
|
-
set(contextMenuActive, type);
|
|
1309
|
-
onOpen === null || onOpen === void 0 ? void 0 : onOpen(event, point);
|
|
1310
|
-
}
|
|
1311
|
-
}),
|
|
1312
|
-
clearActiveContextMenu: useActionCallback(({ reset, set }) => (dismissedFromWindowPointerEvent) => {
|
|
1313
|
-
set(hitResultsSkipNextTap, !!dismissedFromWindowPointerEvent);
|
|
1314
|
-
reset(contextMenuActive);
|
|
1315
|
-
reset(contextMenuActions);
|
|
1316
|
-
reset(contextMenuPosition);
|
|
1317
|
-
}),
|
|
1318
|
-
clearDismissedState: useActionCallback(({ reset }) => () => reset(hitResultsSkipNextTap)),
|
|
1319
|
-
};
|
|
1320
|
-
}
|
|
1321
|
-
|
|
1322
|
-
function targetWithinMenu(event) {
|
|
1323
|
-
return (event.target instanceof Element && isChildOf('vertex-menu', event.target));
|
|
1324
|
-
}
|
|
1325
|
-
function targetShouldSkipNextHit(event) {
|
|
1326
|
-
return (event.target instanceof Element && isChildOf('vertex-viewer', event.target));
|
|
1327
|
-
}
|
|
1328
|
-
function isChildOf(elementType, target) {
|
|
1329
|
-
return target.closest(elementType) != null;
|
|
1330
|
-
}
|
|
1331
|
-
|
|
1332
|
-
const VertexContextMenu = ({ targetElement, menuType, disableBackdrop, openPredicate, onOpen, onClose, children, }) => {
|
|
1333
|
-
const contextMenuActions = useContextMenuActions();
|
|
1334
|
-
const activeContextMenu = recoil.useRecoilValue(contextMenuActive);
|
|
1335
|
-
const activePosition = recoil.useRecoilValue(contextMenuActivePosition);
|
|
1336
|
-
const fallbackPlacements = React.useMemo(() => ['bottom-end', 'top-start', 'top-end', 'right', 'left'], []);
|
|
1337
|
-
useStackKeyBinding({
|
|
1338
|
-
id: 'ContextMenu',
|
|
1339
|
-
keyBind: 'Escape',
|
|
1340
|
-
fn: contextMenuActions.clearActiveContextMenu,
|
|
1341
|
-
addPredicate: () => activeContextMenu != null && activeContextMenu === menuType,
|
|
1342
|
-
cancelPredicate: () => activeContextMenu == null,
|
|
1343
|
-
}, [activeContextMenu]);
|
|
1344
|
-
const target = React.useMemo(() => {
|
|
1345
|
-
if (targetElement != null) {
|
|
1346
|
-
return targetElement;
|
|
1347
|
-
}
|
|
1348
|
-
else if (openPredicate != null) {
|
|
1349
|
-
return window;
|
|
1350
|
-
}
|
|
1351
|
-
return undefined;
|
|
1352
|
-
}, [targetElement, openPredicate]);
|
|
1353
|
-
useLongPress({
|
|
1354
|
-
target,
|
|
1355
|
-
callback: (e) => contextMenuActions.longPress(e, menuType, openPredicate, onOpen),
|
|
1356
|
-
onMovement: () => contextMenuActions.clearActiveContextMenu(),
|
|
1357
|
-
});
|
|
1358
|
-
React.useEffect(() => {
|
|
1359
|
-
const handleWindowPointerDown = (event) => {
|
|
1360
|
-
const withinMenu = targetWithinMenu(event);
|
|
1361
|
-
if (!withinMenu &&
|
|
1362
|
-
event.buttons !== 2 &&
|
|
1363
|
-
activeContextMenu === menuType) {
|
|
1364
|
-
const skipNextHit = targetShouldSkipNextHit(event);
|
|
1365
|
-
contextMenuActions.clearActiveContextMenu(skipNextHit);
|
|
1366
|
-
}
|
|
1367
|
-
};
|
|
1368
|
-
if (disableBackdrop) {
|
|
1369
|
-
window.addEventListener('pointerdown', handleWindowPointerDown);
|
|
1370
|
-
return () => {
|
|
1371
|
-
window.removeEventListener('pointerdown', handleWindowPointerDown);
|
|
1372
|
-
};
|
|
1373
|
-
}
|
|
1374
|
-
return undefined;
|
|
1375
|
-
}, [disableBackdrop, menuType, activeContextMenu]);
|
|
1376
|
-
React.useEffect(() => {
|
|
1377
|
-
const handlePointerDown = (event) => {
|
|
1378
|
-
var _a, _b;
|
|
1379
|
-
const pointerEvent = event;
|
|
1380
|
-
const targetElement = target;
|
|
1381
|
-
const boundingBox = targetElement != null ? targetElement.getBoundingClientRect() : undefined;
|
|
1382
|
-
const xCoordinate = pointerEvent.clientX - ((_a = boundingBox === null || boundingBox === void 0 ? void 0 : boundingBox.x) !== null && _a !== void 0 ? _a : 0);
|
|
1383
|
-
const yCoordinate = pointerEvent.clientY - ((_b = boundingBox === null || boundingBox === void 0 ? void 0 : boundingBox.y) !== null && _b !== void 0 ? _b : 0);
|
|
1384
|
-
contextMenuActions.pointerDown(pointerEvent, geometry.Point.create(xCoordinate, yCoordinate));
|
|
1385
|
-
};
|
|
1386
|
-
const handlePointerUp = (event) => {
|
|
1387
|
-
var _a, _b;
|
|
1388
|
-
const pointerEvent = event;
|
|
1389
|
-
const targetElement = target;
|
|
1390
|
-
const boundingBox = targetElement != null ? targetElement.getBoundingClientRect() : undefined;
|
|
1391
|
-
const xCoordinate = pointerEvent.clientX - ((_a = boundingBox === null || boundingBox === void 0 ? void 0 : boundingBox.x) !== null && _a !== void 0 ? _a : 0);
|
|
1392
|
-
const yCoordinate = pointerEvent.clientY - ((_b = boundingBox === null || boundingBox === void 0 ? void 0 : boundingBox.y) !== null && _b !== void 0 ? _b : 0);
|
|
1393
|
-
contextMenuActions.pointerUp(event, menuType, openPredicate, onOpen, geometry.Point.create(xCoordinate, yCoordinate));
|
|
1394
|
-
};
|
|
1395
|
-
const handleContextMenu = (event) => contextMenuActions.contextMenu(event, openPredicate);
|
|
1396
|
-
target === null || target === void 0 ? void 0 : target.addEventListener('pointerdown', handlePointerDown);
|
|
1397
|
-
target === null || target === void 0 ? void 0 : target.addEventListener('pointerup', handlePointerUp);
|
|
1398
|
-
target === null || target === void 0 ? void 0 : target.addEventListener('contextmenu', handleContextMenu);
|
|
1399
|
-
return () => {
|
|
1400
|
-
target === null || target === void 0 ? void 0 : target.removeEventListener('pointerdown', handlePointerDown);
|
|
1401
|
-
target === null || target === void 0 ? void 0 : target.removeEventListener('pointerup', handlePointerUp);
|
|
1402
|
-
target === null || target === void 0 ? void 0 : target.removeEventListener('contextmenu', handleContextMenu);
|
|
1403
|
-
};
|
|
1404
|
-
}, [targetElement, menuType, openPredicate]);
|
|
1405
|
-
return (jsxRuntime.jsx(uiReact.VertexMenu, { "data-testid": `${menuType}-context-menu`, open: activeContextMenu === menuType, position: activePosition, fallbackPlacements: fallbackPlacements, backdrop: !disableBackdrop, onMenuClosed: () => {
|
|
1406
|
-
contextMenuActions.clearActiveContextMenu();
|
|
1407
|
-
onClose === null || onClose === void 0 ? void 0 : onClose();
|
|
1408
|
-
}, children: jsxRuntime.jsx("div", { className: "pt-1", children: children }) }));
|
|
1409
|
-
};
|
|
1410
|
-
|
|
1411
|
-
var SceneAlterationPerformanceType;
|
|
1412
|
-
(function (SceneAlterationPerformanceType) {
|
|
1413
|
-
SceneAlterationPerformanceType["HIDE_ITEM"] = "Hide Item";
|
|
1414
|
-
SceneAlterationPerformanceType["SHOW_ONLY_SELECTED"] = "Show Only Selected";
|
|
1415
|
-
SceneAlterationPerformanceType["HIDE_SELECTED"] = "Hide Selected";
|
|
1416
|
-
SceneAlterationPerformanceType["SHOW_ONLY_ITEM"] = "Show Only Item";
|
|
1417
|
-
SceneAlterationPerformanceType["SHOW_ALL"] = "Show All";
|
|
1418
|
-
SceneAlterationPerformanceType["HIDE_ALL"] = "Hide All";
|
|
1419
|
-
SceneAlterationPerformanceType["SELECT_FILTERED_ITEMS"] = "Select Filtered Items";
|
|
1420
|
-
SceneAlterationPerformanceType["INVERT_SELECTION"] = "Invert Selection";
|
|
1421
|
-
SceneAlterationPerformanceType["CLEAR_ALL_TRANSFORMS"] = "Clear All Transforms";
|
|
1422
|
-
SceneAlterationPerformanceType["CLEAR_SELECTED_TRANSFORMS"] = "Clear Selected Transforms";
|
|
1423
|
-
SceneAlterationPerformanceType["CLEAR_SELECTION"] = "Clear Selection";
|
|
1424
|
-
SceneAlterationPerformanceType["DESELECTING_ITEMS"] = "Deselecting Items";
|
|
1425
|
-
SceneAlterationPerformanceType["SELECTING_ITEMS"] = "Selecting Items";
|
|
1426
|
-
SceneAlterationPerformanceType["SELECTING_ONLY_ITEM"] = "Selecting Only Item";
|
|
1427
|
-
SceneAlterationPerformanceType["SELECTING_ANCESTOR"] = "Selecting Ancestor";
|
|
1428
|
-
SceneAlterationPerformanceType["APPLY_MATERIAL_OVERRIDE_TO_ALL"] = "Apply Material Override To All";
|
|
1429
|
-
SceneAlterationPerformanceType["APPLY_MATERIAL_OVERRIDE_TO_SELECTION"] = "Apply Material Override To Selection";
|
|
1430
|
-
SceneAlterationPerformanceType["CLEAR_ALL_MATERIAL_OVERRIDES"] = "Clear All Material Overrides";
|
|
1431
|
-
SceneAlterationPerformanceType["CLEAR_SELECTED_MATERIAL_OVERRIDES"] = "Clear Selected Material Overrides";
|
|
1432
|
-
// Phantom operations
|
|
1433
|
-
SceneAlterationPerformanceType["SET_PHANTOM_ALL"] = "Set Phantom All";
|
|
1434
|
-
SceneAlterationPerformanceType["SET_PHANTOM_SELECTED_ITEMS"] = "Set Phantom Selected Items";
|
|
1435
|
-
SceneAlterationPerformanceType["CLEAR_PHANTOM_ALL"] = "Clear Phantom All";
|
|
1436
|
-
SceneAlterationPerformanceType["CLEAR_PHANTOM_SELECTED_ITEMS"] = "Clear Phantom Selected Items";
|
|
1437
|
-
SceneAlterationPerformanceType["SET_PHANTOM_NON_SELECTED_ITEMS"] = "Set Phantom Non Selected Items";
|
|
1438
|
-
SceneAlterationPerformanceType["RESTORE_PHANTOM_OVERRIDES"] = "Restore Phantom Overrides";
|
|
1439
|
-
// End item operations
|
|
1440
|
-
SceneAlterationPerformanceType["SET_ITEM_AS_END_ITEM"] = "Set Item as End Item";
|
|
1441
|
-
SceneAlterationPerformanceType["UNSET_ITEM_AS_END_ITEM"] = "Unset Item as End Item";
|
|
1442
|
-
// PMI annotation operations
|
|
1443
|
-
SceneAlterationPerformanceType["SHOW_ANNOTATION"] = "Show Annotation";
|
|
1444
|
-
SceneAlterationPerformanceType["HIDE_ANNOTATION"] = "Hide Annotation";
|
|
1445
|
-
})(SceneAlterationPerformanceType || (SceneAlterationPerformanceType = {}));
|
|
1446
|
-
|
|
1447
|
-
const selectionSelectedItems = recoil.atomFamily({
|
|
1448
|
-
key: 'selectionSelectedItems',
|
|
1449
|
-
default: undefined,
|
|
1450
|
-
});
|
|
1451
|
-
const selectionSelectedItemIds = recoil.atom({
|
|
1452
|
-
key: 'selectionSelectedItemIds',
|
|
1453
|
-
default: [],
|
|
1454
|
-
});
|
|
1455
|
-
const selectionLastSelected = recoil.atom({
|
|
1456
|
-
key: 'selectionLastSelected',
|
|
1457
|
-
default: undefined,
|
|
1458
|
-
});
|
|
1459
|
-
const selectionLastSelectionFromViewer = recoil.atom({
|
|
1460
|
-
key: 'selectionLastSelectionFromViewer',
|
|
1461
|
-
default: false,
|
|
1462
|
-
});
|
|
1463
|
-
const selectionLastSelectWasMultiSelect = recoil.atom({
|
|
1464
|
-
key: 'selectionLastSelectWasMultiSelect',
|
|
1465
|
-
default: false,
|
|
1466
|
-
});
|
|
1467
|
-
const selectionHighestSelectedAncestor = recoil.selector({
|
|
1468
|
-
key: 'selectionHighestSelectedAncestor',
|
|
1469
|
-
get: ({ get }) => {
|
|
1470
|
-
var _a, _b;
|
|
1471
|
-
const lastSelected = get(selectionLastSelected);
|
|
1472
|
-
const selectedIds = get(selectionSelectedItemIds);
|
|
1473
|
-
return ((_b = (_a = lastSelected === null || lastSelected === void 0 ? void 0 : lastSelected.ancestors) === null || _a === void 0 ? void 0 : _a.find((ancestorId) => selectedIds.includes(ancestorId))) !== null && _b !== void 0 ? _b : lastSelected === null || lastSelected === void 0 ? void 0 : lastSelected.id);
|
|
1474
|
-
},
|
|
1475
|
-
});
|
|
1476
|
-
const selectionPreviousVisibleSummary = recoil.atom({
|
|
1477
|
-
key: 'selectionPreviousVisibleSummary',
|
|
1478
|
-
default: undefined,
|
|
1479
|
-
});
|
|
1480
|
-
const selectionVisibleSummary = recoil.atom({
|
|
1481
|
-
key: 'selectionVisibleSummary',
|
|
1482
|
-
default: undefined,
|
|
1483
|
-
});
|
|
1484
|
-
const selectionVisibleCount = recoil.selector({
|
|
1485
|
-
key: 'selectionVisibleCount',
|
|
1486
|
-
get: ({ get }) => { var _a, _b; return (_b = (_a = get(selectionVisibleSummary)) === null || _a === void 0 ? void 0 : _a.count) !== null && _b !== void 0 ? _b : 0; },
|
|
1487
|
-
});
|
|
1488
|
-
|
|
1489
|
-
function useSelectionActions() {
|
|
1490
|
-
const viewerActions = useViewerSceneActions();
|
|
1491
|
-
const clearSelectedIds = useActionCallback(({ snapshot, reset }) => async () => {
|
|
1492
|
-
const selectedIds = await snapshot.getPromise(selectionSelectedItemIds);
|
|
1493
|
-
selectedIds.forEach((id) => reset(selectionSelectedItems(id)));
|
|
1494
|
-
});
|
|
1495
|
-
const select = useActionCallback(({ snapshot, reset, set }) => async (item, options) => {
|
|
1496
|
-
var _a, _b;
|
|
1497
|
-
const existing = await snapshot.getPromise(selectionSelectedItems(item.id));
|
|
1498
|
-
const selectedIds = await snapshot.getPromise(selectionSelectedItemIds);
|
|
1499
|
-
const nextAncestorId = (_b = [...((_a = item.ancestors) !== null && _a !== void 0 ? _a : [])]) === null || _b === void 0 ? void 0 : _b.reverse().find((id) => !selectedIds.includes(id));
|
|
1500
|
-
if (existing != null && nextAncestorId != null) {
|
|
1501
|
-
// If already selected and has a parent, select the parent
|
|
1502
|
-
set(selectionSelectedItems(nextAncestorId), { id: nextAncestorId });
|
|
1503
|
-
set(selectionSelectedItemIds, (previous) => [
|
|
1504
|
-
...previous,
|
|
1505
|
-
nextAncestorId,
|
|
1506
|
-
]);
|
|
1507
|
-
viewerActions.execute(SceneAlterationPerformanceType.SELECTING_ANCESTOR, viewerActions.selectItemsTransform(nextAncestorId));
|
|
1508
|
-
}
|
|
1509
|
-
else if (options === null || options === void 0 ? void 0 : options.clear) {
|
|
1510
|
-
// Select only the current item since options.clear is true
|
|
1511
|
-
set(selectionSelectedItems(item.id), item);
|
|
1512
|
-
set(selectionSelectedItemIds, [item.id]);
|
|
1513
|
-
viewerActions.execute(SceneAlterationPerformanceType.SELECTING_ONLY_ITEM, viewerActions.clearSelectionTransform, viewerActions.selectItemsTransform(item.id));
|
|
1514
|
-
}
|
|
1515
|
-
else {
|
|
1516
|
-
// Add item to current selection without clearing previous selection
|
|
1517
|
-
set(selectionSelectedItems(item.id), item);
|
|
1518
|
-
set(selectionSelectedItemIds, (previous) => [...previous, item.id]);
|
|
1519
|
-
viewerActions.execute(SceneAlterationPerformanceType.SELECTING_ITEMS, viewerActions.selectItemsTransform(item.id));
|
|
1520
|
-
}
|
|
1521
|
-
selectForModelViewsPanel(item);
|
|
1522
|
-
set(selectionLastSelected, item);
|
|
1523
|
-
set(selectionLastSelectionFromViewer, true);
|
|
1524
|
-
reset(selectionLastSelectWasMultiSelect);
|
|
1525
|
-
});
|
|
1526
|
-
const deselect = useActionCallback(({ reset, set }) => async (deselectingId) => {
|
|
1527
|
-
reset(selectionSelectedItems(deselectingId));
|
|
1528
|
-
reset(selectionLastSelectWasMultiSelect);
|
|
1529
|
-
set(selectionSelectedItemIds, (previous) => previous.filter((id) => id !== deselectingId));
|
|
1530
|
-
viewerActions.execute(SceneAlterationPerformanceType.DESELECTING_ITEMS, viewerActions.deselectItemsTransform(deselectingId));
|
|
1531
|
-
});
|
|
1532
|
-
const toggleSelection = useActionCallback(({ snapshot }) => async (item) => {
|
|
1533
|
-
const existing = await snapshot.getPromise(selectionSelectedItems(item.id));
|
|
1534
|
-
if (existing != null) {
|
|
1535
|
-
await deselect(existing.id);
|
|
1536
|
-
}
|
|
1537
|
-
else {
|
|
1538
|
-
await select(item);
|
|
1539
|
-
}
|
|
1540
|
-
});
|
|
1541
|
-
const clearAndSelect = useActionCallback(({ snapshot, reset, set }) => async (item, options = {}) => {
|
|
1542
|
-
const existing = await snapshot.getPromise(selectionSelectedItems(item.id));
|
|
1543
|
-
const selectedIds = await snapshot.getPromise(selectionSelectedItemIds);
|
|
1544
|
-
selectedIds
|
|
1545
|
-
.filter((id) => { var _a; return id !== item.id && !((_a = item.ancestors) === null || _a === void 0 ? void 0 : _a.includes(id)); })
|
|
1546
|
-
.forEach((id) => reset(selectionSelectedItems(id)));
|
|
1547
|
-
reset(selectionLastSelectWasMultiSelect);
|
|
1548
|
-
if (!existing) {
|
|
1549
|
-
reset(selectionSelectedItemIds);
|
|
1550
|
-
}
|
|
1551
|
-
else if (options.ignoreAncestorSelection) {
|
|
1552
|
-
reset(selectionSelectedItemIds);
|
|
1553
|
-
reset(selectionSelectedItems(existing.id));
|
|
1554
|
-
}
|
|
1555
|
-
else {
|
|
1556
|
-
const selectedItemAndAncestors = selectedIds.filter((id) => { var _a; return id === item.id || ((_a = item.ancestors) === null || _a === void 0 ? void 0 : _a.includes(id)); });
|
|
1557
|
-
set(selectionSelectedItemIds, selectedItemAndAncestors);
|
|
1558
|
-
}
|
|
1559
|
-
// TODO: clear PMI + transform manipulator orientation
|
|
1560
|
-
await select(item, { clear: true });
|
|
1561
|
-
});
|
|
1562
|
-
const resetSelectionState = useActionCallback(({ reset }) => async () => {
|
|
1563
|
-
await clearSelectedIds();
|
|
1564
|
-
reset(selectionSelectedItemIds);
|
|
1565
|
-
reset(selectionLastSelected);
|
|
1566
|
-
reset(selectionLastSelectionFromViewer);
|
|
1567
|
-
reset(selectionLastSelectWasMultiSelect);
|
|
1568
|
-
// TODO: clear transform manipulator state
|
|
1569
|
-
});
|
|
1570
|
-
const clearSelection = useActionCallback(() => async () => {
|
|
1571
|
-
await resetSelectionState();
|
|
1572
|
-
viewerActions.execute(SceneAlterationPerformanceType.CLEAR_SELECTION, viewerActions.clearSelectionTransform);
|
|
1573
|
-
});
|
|
1574
|
-
const toggleLastSelectWasMultiSelect = useActionCallback(({ set }) => async (multiSelection) => {
|
|
1575
|
-
set(selectionLastSelectWasMultiSelect, multiSelection);
|
|
1576
|
-
});
|
|
1577
|
-
const selectForModelViewsPanel = useActionCallback(({ reset, set }) => (item) => {
|
|
1578
|
-
// TODO: clear loaded PMI
|
|
1579
|
-
});
|
|
1580
|
-
return {
|
|
1581
|
-
select,
|
|
1582
|
-
toggleSelection,
|
|
1583
|
-
clearAndSelect,
|
|
1584
|
-
selectCurrentHit: useActionCallback(retainSnapshot(({ snapshot }) => async () => {
|
|
1585
|
-
const currentHitResult = await snapshot
|
|
1586
|
-
.tryGetPromise(hitResult)
|
|
1587
|
-
.then((r) => r.value);
|
|
1588
|
-
const currentTapDetails = await snapshot.getPromise(hitResultsTapDetails);
|
|
1589
|
-
const appendModifierPressed = (currentTapDetails === null || currentTapDetails === void 0 ? void 0 : currentTapDetails.metaKey) ||
|
|
1590
|
-
(currentTapDetails === null || currentTapDetails === void 0 ? void 0 : currentTapDetails.ctrlKey) ||
|
|
1591
|
-
(currentTapDetails === null || currentTapDetails === void 0 ? void 0 : currentTapDetails.shiftKey);
|
|
1592
|
-
if (currentHitResult != null && !appendModifierPressed) {
|
|
1593
|
-
clearAndSelect(currentHitResult);
|
|
1594
|
-
}
|
|
1595
|
-
else if (currentHitResult != null && appendModifierPressed) {
|
|
1596
|
-
toggleSelection(currentHitResult);
|
|
1597
|
-
}
|
|
1598
|
-
else {
|
|
1599
|
-
clearSelection();
|
|
1600
|
-
}
|
|
1601
|
-
})),
|
|
1602
|
-
syncSelection: useActionCallback(({ set, reset }) => async (item, options) => {
|
|
1603
|
-
if (options.selected) {
|
|
1604
|
-
await clearSelectedIds();
|
|
1605
|
-
set(selectionSelectedItems(item.id), item);
|
|
1606
|
-
if (options.multiSelect) {
|
|
1607
|
-
set(selectionSelectedItemIds, (previous) => [
|
|
1608
|
-
...previous.filter((id) => id !== item.id),
|
|
1609
|
-
item.id,
|
|
1610
|
-
]);
|
|
1611
|
-
}
|
|
1612
|
-
else {
|
|
1613
|
-
set(selectionSelectedItemIds, [item.id]);
|
|
1614
|
-
}
|
|
1615
|
-
selectForModelViewsPanel(item);
|
|
1616
|
-
set(selectionLastSelected, item);
|
|
1617
|
-
set(selectionLastSelectionFromViewer, false);
|
|
1618
|
-
set(selectionLastSelectWasMultiSelect, !!options.multiSelect);
|
|
1619
|
-
}
|
|
1620
|
-
else {
|
|
1621
|
-
reset(selectionSelectedItems(item.id));
|
|
1622
|
-
reset(selectionLastSelectWasMultiSelect);
|
|
1623
|
-
set(selectionSelectedItemIds, (previous) => previous.filter((id) => id !== item.id));
|
|
1624
|
-
}
|
|
1625
|
-
}),
|
|
1626
|
-
deselect,
|
|
1627
|
-
clearSelection,
|
|
1628
|
-
resetSelectionState,
|
|
1629
|
-
toggleLastSelectWasMultiSelect,
|
|
1630
|
-
selectForModelViewsPanel,
|
|
1631
|
-
};
|
|
1632
|
-
}
|
|
1633
|
-
|
|
1634
|
-
const selectionState = recoil.selector({
|
|
1635
|
-
key: 'viewerToolkitSelectionState',
|
|
1636
|
-
get: ({ get }) => {
|
|
1637
|
-
const selectedItemIds = get(selectionSelectedItemIds);
|
|
1638
|
-
const lastSelected = get(selectionLastSelected);
|
|
1639
|
-
const highestSelectedAncestorId = get(selectionHighestSelectedAncestor);
|
|
1640
|
-
const state = {
|
|
1641
|
-
selectedItemIds,
|
|
1642
|
-
lastSelected,
|
|
1643
|
-
highestSelectedAncestorId,
|
|
1644
|
-
};
|
|
1645
|
-
return state;
|
|
1646
|
-
},
|
|
1647
|
-
});
|
|
1648
|
-
|
|
1649
|
-
var index$1 = /*#__PURE__*/Object.freeze({
|
|
1650
|
-
__proto__: null,
|
|
1651
|
-
selectionHighestSelectedAncestor: selectionHighestSelectedAncestor,
|
|
1652
|
-
selectionLastSelectWasMultiSelect: selectionLastSelectWasMultiSelect,
|
|
1653
|
-
selectionLastSelected: selectionLastSelected,
|
|
1654
|
-
selectionLastSelectionFromViewer: selectionLastSelectionFromViewer,
|
|
1655
|
-
selectionPreviousVisibleSummary: selectionPreviousVisibleSummary,
|
|
1656
|
-
selectionSelectedItemIds: selectionSelectedItemIds,
|
|
1657
|
-
selectionSelectedItems: selectionSelectedItems,
|
|
1658
|
-
selectionState: selectionState,
|
|
1659
|
-
selectionVisibleCount: selectionVisibleCount,
|
|
1660
|
-
selectionVisibleSummary: selectionVisibleSummary,
|
|
1661
|
-
useSelectionActions: useSelectionActions
|
|
1662
|
-
});
|
|
1663
|
-
|
|
1664
|
-
const VertexFitSelectedMenuItem = () => {
|
|
1665
|
-
const selectedItems = recoil.useRecoilValue(selectionSelectedItemIds);
|
|
1666
|
-
const selectedSummary = recoil.useRecoilValue(selectionVisibleSummary);
|
|
1667
|
-
const cameraActions = useViewerCameraActions();
|
|
1668
|
-
return (jsxRuntime.jsxs(uiReact.VertexMenuItem, { "data-testid": "fit-selected-menu-option", onClick: () => {
|
|
1669
|
-
if ((selectedSummary === null || selectedSummary === void 0 ? void 0 : selectedSummary.boundingBox) != null) {
|
|
1670
|
-
cameraActions.flyToByBoundingBox(selectedSummary.boundingBox);
|
|
1671
|
-
}
|
|
1672
|
-
}, disabled: selectedItems.length === 0, children: [jsxRuntime.jsx(uiReact.VertexIcon, { slot: "icon", name: "fit-selected", size: "sm" }), jsxRuntime.jsx("div", { className: "pl-2", children: "Fit Selected" })] }));
|
|
1673
|
-
};
|
|
1674
|
-
|
|
1675
|
-
const VertexFlyToMenuItem = () => {
|
|
1676
|
-
const cameraActions = useViewerCameraActions();
|
|
1677
|
-
const currentItem = recoil.useRecoilValue(contextMenuItem);
|
|
1678
|
-
return (jsxRuntime.jsxs(uiReact.VertexMenuItem, { "data-testid": "fly-to-part-menu-option", onClick: () => {
|
|
1679
|
-
var _a;
|
|
1680
|
-
const isRow = contextMenuItemIsRow(currentItem);
|
|
1681
|
-
const itemId = isRow
|
|
1682
|
-
? (_a = currentItem === null || currentItem === void 0 ? void 0 : currentItem.node.id) === null || _a === void 0 ? void 0 : _a.hex
|
|
1683
|
-
: currentItem === null || currentItem === void 0 ? void 0 : currentItem.id;
|
|
1684
|
-
if (itemId != null) {
|
|
1685
|
-
cameraActions.flyToById(itemId);
|
|
1686
|
-
}
|
|
1687
|
-
}, disabled: currentItem == null, children: [jsxRuntime.jsx(uiReact.VertexIcon, { slot: "icon", name: "paper-airplane", size: "sm" }), jsxRuntime.jsx("div", { className: "pl-2", children: "Fly To" })] }));
|
|
1688
|
-
};
|
|
1689
|
-
|
|
1690
|
-
function useSceneItemsOperations({ viewerElement }) {
|
|
1691
|
-
const sceneItemsOperation = React.useCallback(async (f, ids) => {
|
|
1692
|
-
const scene = await (viewerElement === null || viewerElement === void 0 ? void 0 : viewerElement.scene());
|
|
1693
|
-
if (ids == null) {
|
|
1694
|
-
await (scene === null || scene === void 0 ? void 0 : scene.items((op) => f(op.where((q) => q.all()))).execute());
|
|
1695
|
-
}
|
|
1696
|
-
else if (ids.length > 0) {
|
|
1697
|
-
await (scene === null || scene === void 0 ? void 0 : scene.items((op) => f(op.where((q) => q.withItemIds(ids)))).execute());
|
|
1698
|
-
}
|
|
1699
|
-
}, [viewerElement]);
|
|
1700
|
-
useApplyKeyBinding({
|
|
1701
|
-
fn: React.useCallback(async () => {
|
|
1702
|
-
const animation = { milliseconds: 500 };
|
|
1703
|
-
const scene = await (viewerElement === null || viewerElement === void 0 ? void 0 : viewerElement.scene());
|
|
1704
|
-
await (scene === null || scene === void 0 ? void 0 : scene.camera().viewAll().render({ animation }));
|
|
1705
|
-
}, [viewerElement]),
|
|
1706
|
-
keyBind: 'f',
|
|
1707
|
-
});
|
|
1708
|
-
const showOnlySelected = React.useCallback(async () => {
|
|
1709
|
-
const scene = await (viewerElement === null || viewerElement === void 0 ? void 0 : viewerElement.scene());
|
|
1710
|
-
scene === null || scene === void 0 ? void 0 : scene.items((op) => [
|
|
1711
|
-
op.where((q) => q.all()).hide(),
|
|
1712
|
-
op.where((q) => q.withSelected()).show(),
|
|
1713
|
-
]).execute();
|
|
1714
|
-
}, [viewerElement]);
|
|
1715
|
-
const hideSelected = React.useCallback(async () => {
|
|
1716
|
-
const scene = await (viewerElement === null || viewerElement === void 0 ? void 0 : viewerElement.scene());
|
|
1717
|
-
scene === null || scene === void 0 ? void 0 : scene.items((op) => [op.where((q) => q.withSelected()).hide()]).execute();
|
|
1718
|
-
}, [viewerElement]);
|
|
1719
|
-
const showOnlyItem = React.useCallback(async (id) => {
|
|
1720
|
-
const scene = await (viewerElement === null || viewerElement === void 0 ? void 0 : viewerElement.scene());
|
|
1721
|
-
scene === null || scene === void 0 ? void 0 : scene.items((op) => [
|
|
1722
|
-
op.where((q) => q.all()).hide(),
|
|
1723
|
-
op.where((q) => q.withItemIds([id])).show(),
|
|
1724
|
-
]).execute();
|
|
1725
|
-
}, [viewerElement]);
|
|
1726
|
-
return {
|
|
1727
|
-
sceneItemsOperation,
|
|
1728
|
-
showOnlySelected,
|
|
1729
|
-
hideSelected,
|
|
1730
|
-
showOnlyItem,
|
|
1731
|
-
};
|
|
1732
|
-
}
|
|
1733
|
-
|
|
1734
|
-
const VertexHideAllMenuItem = () => {
|
|
1735
|
-
const viewerHTMLElement = recoil.useRecoilValue(viewerElement);
|
|
1736
|
-
const sceneItemOperations = useSceneItemsOperations({ viewerElement: viewerHTMLElement !== null && viewerHTMLElement !== void 0 ? viewerHTMLElement : null });
|
|
1737
|
-
return (jsxRuntime.jsxs(uiReact.VertexMenuItem, { "data-testid": "hide-all-menu-option", onClick: () => {
|
|
1738
|
-
sceneItemOperations.sceneItemsOperation((builder) => builder.hide());
|
|
1739
|
-
}, children: [jsxRuntime.jsx(uiReact.VertexIcon, { slot: "icon", name: "visibility-hidden", size: "sm" }), jsxRuntime.jsx("div", { className: "pl-2", children: "Hide All Parts" })] }));
|
|
1740
|
-
};
|
|
1741
|
-
|
|
1742
|
-
const VertexHidePartMenuItem = () => {
|
|
1743
|
-
const viewerHTMLElement = recoil.useRecoilValue(viewerElement);
|
|
1744
|
-
const currentItem = recoil.useRecoilValue(contextMenuItem);
|
|
1745
|
-
const sceneItemOperations = useSceneItemsOperations({ viewerElement: viewerHTMLElement !== null && viewerHTMLElement !== void 0 ? viewerHTMLElement : null });
|
|
1746
|
-
return (jsxRuntime.jsxs(uiReact.VertexMenuItem, { "data-testid": "hide-menu-option", onClick: () => {
|
|
1747
|
-
var _a;
|
|
1748
|
-
const isRow = contextMenuItemIsRow(currentItem);
|
|
1749
|
-
const itemId = isRow
|
|
1750
|
-
? (_a = currentItem === null || currentItem === void 0 ? void 0 : currentItem.node.id) === null || _a === void 0 ? void 0 : _a.hex
|
|
1751
|
-
: currentItem.id;
|
|
1752
|
-
if (itemId != null) {
|
|
1753
|
-
sceneItemOperations.sceneItemsOperation((builder) => builder.hide(), [itemId]);
|
|
1754
|
-
}
|
|
1755
|
-
}, disabled: currentItem == null, children: [jsxRuntime.jsx(uiReact.VertexIcon, { slot: "icon", name: "visibility-hidden", size: "sm" }), jsxRuntime.jsx("div", { className: "pl-2", children: "Hide Part" })] }));
|
|
1756
|
-
};
|
|
1757
|
-
|
|
1758
|
-
const VertexHideSelectedMenuItem = () => {
|
|
1759
|
-
const viewerHTMLElement = recoil.useRecoilValue(viewerElement);
|
|
1760
|
-
const selectedItems = recoil.useRecoilValue(selectionSelectedItemIds);
|
|
1761
|
-
const sceneItemOperations = useSceneItemsOperations({ viewerElement: viewerHTMLElement !== null && viewerHTMLElement !== void 0 ? viewerHTMLElement : null });
|
|
1762
|
-
return (jsxRuntime.jsxs(uiReact.VertexMenuItem, { "data-testid": "hide-selected-menu-option", onClick: () => sceneItemOperations.hideSelected(), disabled: selectedItems.length === 0, children: [jsxRuntime.jsx(uiReact.VertexIcon, { slot: "icon", name: "visibility-hidden", size: "sm" }), jsxRuntime.jsx("div", { className: "pl-2", children: "Hide Selected" })] }));
|
|
1763
|
-
};
|
|
1764
|
-
|
|
1765
|
-
const VertexShowAllMenuItem = () => {
|
|
1766
|
-
const viewerHTMLElement = recoil.useRecoilValue(viewerElement);
|
|
1767
|
-
const sceneItemOperations = useSceneItemsOperations({ viewerElement: viewerHTMLElement !== null && viewerHTMLElement !== void 0 ? viewerHTMLElement : null });
|
|
1768
|
-
return (jsxRuntime.jsxs(uiReact.VertexMenuItem, { "data-testid": "show-all-menu-option", onClick: () => {
|
|
1769
|
-
sceneItemOperations.sceneItemsOperation((builder) => builder.show());
|
|
1770
|
-
}, children: [jsxRuntime.jsx(uiReact.VertexIcon, { slot: "icon", name: "visibility-visible", size: "sm" }), jsxRuntime.jsx("div", { className: "pl-2", children: "Show All Parts" })] }));
|
|
1771
|
-
};
|
|
1772
|
-
|
|
1773
|
-
const VertexShowOnlyMenuItem = () => {
|
|
1774
|
-
const viewerHTMLElement = recoil.useRecoilValue(viewerElement);
|
|
1775
|
-
const currentItem = recoil.useRecoilValue(contextMenuItem);
|
|
1776
|
-
const sceneItemOperations = useSceneItemsOperations({ viewerElement: viewerHTMLElement !== null && viewerHTMLElement !== void 0 ? viewerHTMLElement : null });
|
|
1777
|
-
return (jsxRuntime.jsxs(uiReact.VertexMenuItem, { "data-testid": "show-only-menu-option", onClick: () => {
|
|
1778
|
-
var _a;
|
|
1779
|
-
const isRow = contextMenuItemIsRow(currentItem);
|
|
1780
|
-
const itemId = isRow
|
|
1781
|
-
? (_a = currentItem === null || currentItem === void 0 ? void 0 : currentItem.node.id) === null || _a === void 0 ? void 0 : _a.hex
|
|
1782
|
-
: currentItem === null || currentItem === void 0 ? void 0 : currentItem.id;
|
|
1783
|
-
if (itemId != null) {
|
|
1784
|
-
sceneItemOperations.showOnlyItem(itemId);
|
|
1785
|
-
}
|
|
1786
|
-
}, disabled: currentItem == null, children: [jsxRuntime.jsx(uiReact.VertexIcon, { slot: "icon", name: "visibility-visible", size: "sm" }), jsxRuntime.jsx("div", { className: "pl-2", children: "Show Only Part" })] }));
|
|
1787
|
-
};
|
|
1788
|
-
|
|
1789
|
-
const VertexShowOnlySelectedMenuItem = () => {
|
|
1790
|
-
const viewerHTMLElement = recoil.useRecoilValue(viewerElement);
|
|
1791
|
-
const selectedItems = recoil.useRecoilValue(selectionSelectedItemIds);
|
|
1792
|
-
const sceneItemOperations = useSceneItemsOperations({ viewerElement: viewerHTMLElement !== null && viewerHTMLElement !== void 0 ? viewerHTMLElement : null });
|
|
1793
|
-
return (jsxRuntime.jsxs(uiReact.VertexMenuItem, { "data-testid": "show-only-selected-menu-option", onClick: () => sceneItemOperations.showOnlySelected(), disabled: selectedItems.length === 0, children: [jsxRuntime.jsx(uiReact.VertexIcon, { slot: "icon", name: "visibility-visible", size: "sm" }), jsxRuntime.jsx("div", { className: "pl-2", children: "Show Only Selected" })] }));
|
|
1794
|
-
};
|
|
1795
|
-
|
|
1796
|
-
recoil.atom({
|
|
1797
|
-
key: 'sceneTreeLoaderVisible',
|
|
1798
|
-
default: false,
|
|
1799
|
-
});
|
|
1800
|
-
const sceneTreeElement = recoil.atom({
|
|
1801
|
-
key: 'sceneTreeElement',
|
|
1802
|
-
default: undefined,
|
|
1803
|
-
});
|
|
1804
|
-
const sceneTreeWidth = recoil.atom({
|
|
1805
|
-
key: 'sceneTreeWidth',
|
|
1806
|
-
default: undefined,
|
|
1807
|
-
});
|
|
1808
|
-
recoil.selector({
|
|
1809
|
-
key: 'sceneTreeController',
|
|
1810
|
-
get: ({ get }) => { var _a; return (_a = get(sceneTreeElement)) === null || _a === void 0 ? void 0 : _a.controller; },
|
|
1811
|
-
dangerouslyAllowMutability: true,
|
|
1812
|
-
});
|
|
1813
|
-
|
|
1814
|
-
function useSceneTreeActions() {
|
|
1815
|
-
const selectionActions = useSelectionActions();
|
|
1816
|
-
const viewerCameraActions = useViewerCameraActions();
|
|
1817
|
-
return {
|
|
1818
|
-
toggleSelection: useActionCallback(({ snapshot }) => async (event, node, tree) => {
|
|
1819
|
-
var _a, _b;
|
|
1820
|
-
if (event.defaultPrevented || event.button !== 0) {
|
|
1821
|
-
return;
|
|
1822
|
-
}
|
|
1823
|
-
if (!event.altKey) {
|
|
1824
|
-
if ((event.ctrlKey || event.metaKey) && node.selected) {
|
|
1825
|
-
tree.deselectItem(node);
|
|
1826
|
-
}
|
|
1827
|
-
else if (node.selected) {
|
|
1828
|
-
tree.selectItem(node, {
|
|
1829
|
-
recurseParent: true,
|
|
1830
|
-
});
|
|
1831
|
-
}
|
|
1832
|
-
else if (!node.selected) {
|
|
1833
|
-
tree.selectItem(node, {
|
|
1834
|
-
append: event.ctrlKey || event.metaKey,
|
|
1835
|
-
range: event.shiftKey,
|
|
1836
|
-
});
|
|
1837
|
-
}
|
|
1838
|
-
}
|
|
1839
|
-
if (node.id != null) {
|
|
1840
|
-
const lastSelected = await snapshot.getPromise(selectionLastSelected);
|
|
1841
|
-
selectionActions.syncSelection({
|
|
1842
|
-
id: (_a = node.id) === null || _a === void 0 ? void 0 : _a.hex,
|
|
1843
|
-
ancestors: (_b = lastSelected === null || lastSelected === void 0 ? void 0 : lastSelected.ancestors) !== null && _b !== void 0 ? _b : [],
|
|
1844
|
-
}, {
|
|
1845
|
-
selected: event.metaKey || event.ctrlKey ? !node.selected : true,
|
|
1846
|
-
multiSelect: event.shiftKey || event.metaKey || event.ctrlKey,
|
|
1847
|
-
});
|
|
1848
|
-
// TODO: transform widget interaction
|
|
1849
|
-
}
|
|
1850
|
-
}),
|
|
1851
|
-
toggleExpansion: useActionCallback(() => (event, node, tree) => {
|
|
1852
|
-
tree.toggleExpandItem(node);
|
|
1853
|
-
}),
|
|
1854
|
-
toggleVisibility: useActionCallback(() => (event, node, tree) => {
|
|
1855
|
-
tree.toggleItemVisibility(node);
|
|
1856
|
-
}),
|
|
1857
|
-
flyToRow: useActionCallback(({ snapshot }) => async (rowClientY) => {
|
|
1858
|
-
var _a;
|
|
1859
|
-
const element = await snapshot.getPromise(sceneTreeElement);
|
|
1860
|
-
const row = await (element === null || element === void 0 ? void 0 : element.getRowAtClientY(rowClientY));
|
|
1861
|
-
if (((_a = row === null || row === void 0 ? void 0 : row.node.id) === null || _a === void 0 ? void 0 : _a.hex) != null) {
|
|
1862
|
-
await viewerCameraActions.flyToById(row.node.id.hex);
|
|
1863
|
-
}
|
|
1864
|
-
}),
|
|
1865
|
-
setContextMenuItem: useActionCallback(({ set, snapshot }) => async (rowClientY) => {
|
|
1866
|
-
const element = await snapshot.getPromise(sceneTreeElement);
|
|
1867
|
-
const row = await (element === null || element === void 0 ? void 0 : element.getRowAtClientY(rowClientY));
|
|
1868
|
-
set(contextMenuItem, row);
|
|
1869
|
-
}),
|
|
1870
|
-
};
|
|
1871
|
-
}
|
|
1872
|
-
|
|
1873
|
-
const DefaultSceneTreeContextMenu = () => {
|
|
1874
|
-
return (jsxRuntime.jsxs("div", { className: "w-56", children: [jsxRuntime.jsx(VertexHideSelectedMenuItem, {}), jsxRuntime.jsx(VertexHideAllMenuItem, {}), jsxRuntime.jsx(VertexShowOnlyMenuItem, {}), jsxRuntime.jsx(VertexShowOnlySelectedMenuItem, {}), jsxRuntime.jsx(VertexShowAllMenuItem, {}), jsxRuntime.jsx(uiReact.VertexMenuDivider, { className: "md:contents hidden short:hidden" }), jsxRuntime.jsx(VertexFitSelectedMenuItem, {}), jsxRuntime.jsx(VertexFlyToMenuItem, {})] }));
|
|
1875
|
-
};
|
|
1876
|
-
|
|
1877
|
-
const VertexSceneTreeContextMenu = ({ children }) => {
|
|
1878
|
-
const sceneTreeActions = useSceneTreeActions();
|
|
1879
|
-
const sceneTreeHTMLElement = recoil.useRecoilValue(sceneTreeElement);
|
|
1880
|
-
const hasDefinedChildren = children != null && children !== false;
|
|
1881
|
-
return (jsxRuntime.jsx(VertexContextMenu, { menuType: "scene-tree", targetElement: sceneTreeHTMLElement, onOpen: async (event, _pt) => {
|
|
1882
|
-
const pointerEvent = event;
|
|
1883
|
-
await sceneTreeActions.setContextMenuItem(pointerEvent.clientY);
|
|
1884
|
-
}, disableBackdrop: true, children: hasDefinedChildren
|
|
1885
|
-
? (children)
|
|
1886
|
-
: (jsxRuntime.jsx(DefaultSceneTreeContextMenu, {})) }));
|
|
1887
|
-
};
|
|
1888
|
-
|
|
1889
|
-
const DefaultViewerContextMenu = () => {
|
|
1890
|
-
return (jsxRuntime.jsxs("div", { className: "w-56", children: [jsxRuntime.jsx(VertexHidePartMenuItem, {}), jsxRuntime.jsx(VertexHideSelectedMenuItem, {}), jsxRuntime.jsx(VertexHideAllMenuItem, {}), jsxRuntime.jsx(VertexShowOnlyMenuItem, {}), jsxRuntime.jsx(VertexShowOnlySelectedMenuItem, {}), jsxRuntime.jsx(VertexShowAllMenuItem, {}), jsxRuntime.jsx(uiReact.VertexMenuDivider, { className: "md:contents hidden short:hidden" }), jsxRuntime.jsx(VertexFitSelectedMenuItem, {}), jsxRuntime.jsx(VertexFlyToMenuItem, {})] }));
|
|
1891
|
-
};
|
|
1892
|
-
|
|
1893
|
-
const VertexViewerContextMenu = ({ children }) => {
|
|
1894
|
-
const viewerHTMLElement = recoil.useRecoilValue(viewerElement);
|
|
1895
|
-
const hasDefinedChildren = children != null && children !== false;
|
|
1896
|
-
return (jsxRuntime.jsx(VertexContextMenu, { menuType: "viewer", targetElement: viewerHTMLElement, disableBackdrop: true, children: hasDefinedChildren
|
|
1897
|
-
? (children)
|
|
1898
|
-
: (jsxRuntime.jsx(DefaultViewerContextMenu, {})) }));
|
|
1899
|
-
};
|
|
1900
|
-
|
|
1901
|
-
const sdkConfig = recoil.atom({
|
|
1902
|
-
key: 'viewerToolkitSdkConfig',
|
|
1903
|
-
default: undefined,
|
|
1904
|
-
});
|
|
1905
|
-
|
|
1906
|
-
const targetIsElement = (target, tagName) => {
|
|
1907
|
-
return target instanceof Element && target.tagName === tagName;
|
|
1908
|
-
};
|
|
1909
|
-
|
|
1910
|
-
function useRecoilRef({ state, }) {
|
|
1911
|
-
const callback = recoil.useRecoilCallback(({ set }) => (node) => {
|
|
1912
|
-
set(state, node);
|
|
1913
|
-
}, []);
|
|
1914
|
-
return callback;
|
|
1915
|
-
}
|
|
1916
|
-
|
|
1917
|
-
var AssemblyFontFace;
|
|
1918
|
-
(function (AssemblyFontFace) {
|
|
1919
|
-
AssemblyFontFace["ROBOTO"] = "ROBOTO";
|
|
1920
|
-
AssemblyFontFace["ROBOTO_MONO"] = "ROBOTO_MONO";
|
|
1921
|
-
})(AssemblyFontFace || (AssemblyFontFace = {}));
|
|
1922
|
-
|
|
1923
|
-
function styleFromOptionalFont(font) {
|
|
1924
|
-
return font != null
|
|
1925
|
-
? {
|
|
1926
|
-
'--scene-tree-default-font-family': styleFromFontFace(font.fontFace),
|
|
1927
|
-
'--scene-tree-default-font-color': font.color,
|
|
1928
|
-
}
|
|
1929
|
-
: {};
|
|
1930
|
-
}
|
|
1931
|
-
function styleFromOptionalBackgroundColors(backgroundColors) {
|
|
1932
|
-
const depthColors = backgroundColors === null || backgroundColors === void 0 ? void 0 : backgroundColors.depthColors;
|
|
1933
|
-
const depthColorStyles = depthColors != null
|
|
1934
|
-
? Object.keys(depthColors).reduce((res, key) => (Object.assign(Object.assign({}, res), { [`--scene-tree-row-background-color-depth-${key}`]: depthColors[parseInt(key)] })), {})
|
|
1935
|
-
: {};
|
|
1936
|
-
return backgroundColors != null
|
|
1937
|
-
? Object.assign(Object.assign({}, depthColorStyles), { '--scene-tree-hovered-row-background-color': backgroundColors.hovered, '--scene-tree-selected-row-background-color': backgroundColors.selected, '--scene-tree-row-background-color': backgroundColors.defaultColor }) : {};
|
|
1938
|
-
}
|
|
1939
|
-
function styleFromFontFace(fontFace) {
|
|
1940
|
-
switch (fontFace) {
|
|
1941
|
-
case AssemblyFontFace.ROBOTO_MONO:
|
|
1942
|
-
return 'var(--vertex-ui-font-family-monospace)';
|
|
1943
|
-
default:
|
|
1944
|
-
return 'var(--vertex-ui-font-family)';
|
|
1945
|
-
}
|
|
1946
|
-
}
|
|
1947
|
-
|
|
1948
|
-
const DEFAULT_NAME_COLUMN = {
|
|
1949
|
-
binding: '{{row.node.name}}',
|
|
1950
|
-
label: 'Name',
|
|
1951
|
-
metadataKeyName: 'VERTEX_SCENE_ITEM_NAME',
|
|
1952
|
-
};
|
|
1953
|
-
const sceneTreeColumnsActiveColumns = recoil.selector({
|
|
1954
|
-
key: 'sceneTreeColumnsActiveColumns',
|
|
1955
|
-
get: ({ get }) => {
|
|
1956
|
-
const labels = []; // TODO: map to configured column list
|
|
1957
|
-
const treeWidth = get(sceneTreeWidth);
|
|
1958
|
-
if (treeWidth != null && treeWidth > 0) {
|
|
1959
|
-
const nameWidth = (1 / (labels.length + 1)) * treeWidth;
|
|
1960
|
-
const availableWidth = (treeWidth - nameWidth) / labels.length;
|
|
1961
|
-
return {
|
|
1962
|
-
Name: Object.assign(Object.assign({}, DEFAULT_NAME_COLUMN), { initialWidth: nameWidth, minWidth: availableWidth }),
|
|
1963
|
-
};
|
|
1964
|
-
}
|
|
1965
|
-
return { Name: DEFAULT_NAME_COLUMN };
|
|
1966
|
-
},
|
|
1967
|
-
});
|
|
1968
|
-
const sceneTreeColumnsActiveColumnNames = recoil.selector({
|
|
1969
|
-
key: 'sceneTreeColumnsActiveColumnNames',
|
|
1970
|
-
get: ({ get }) => Object.keys(get(sceneTreeColumnsActiveColumns)),
|
|
1971
|
-
});
|
|
1972
|
-
|
|
1973
|
-
const VertexSceneTreeTableLayout = (sdkProps) => {
|
|
1974
|
-
const activeColumns = recoil.useRecoilValue(sceneTreeColumnsActiveColumns);
|
|
1975
|
-
const activeColumnNames = recoil.useRecoilValue(sceneTreeColumnsActiveColumnNames);
|
|
1976
|
-
const columnWidths = []; // TODO: map to configured column sizes
|
|
1977
|
-
return (jsxRuntime.jsx(viewerReact.VertexSceneTreeTableLayout, Object.assign({ "data-testid": "scene-tree-table-layout" }, sdkProps, { children: activeColumnNames.map((k, i) => {
|
|
1978
|
-
var _a;
|
|
1979
|
-
const column = activeColumns[k];
|
|
1980
|
-
const initialWidth = (_a = columnWidths[i]) !== null && _a !== void 0 ? _a : column.initialWidth;
|
|
1981
|
-
return (jsxRuntime.jsxs(viewerReact.VertexSceneTreeTableColumn, { "data-testid": `scene-tree-table-column-${i}`, initialWidth: initialWidth, minWidth: column.minWidth, children: [jsxRuntime.jsx("template", { slot: "header", dangerouslySetInnerHTML: {
|
|
1982
|
-
__html: `
|
|
1983
|
-
<div class="text-sm text-neutral-800 my-2">
|
|
1984
|
-
<div class="${classNames('truncate', {
|
|
1985
|
-
'pl-2': i === 0,
|
|
1986
|
-
'pr-2': i === activeColumnNames.length - 1,
|
|
1987
|
-
})}">
|
|
1988
|
-
${column.label}
|
|
1989
|
-
</div>
|
|
1990
|
-
</div>
|
|
1991
|
-
`,
|
|
1992
|
-
} }), jsxRuntime.jsx("template", { dangerouslySetInnerHTML: {
|
|
1993
|
-
__html: `
|
|
1994
|
-
<vertex-scene-tree-table-cell
|
|
1995
|
-
prop:value="${column.binding}"
|
|
1996
|
-
prop:selection-handler="{{row.data.handleSelection}}"
|
|
1997
|
-
prop:expansion-handler="{{row.data.handleExpansion}}"
|
|
1998
|
-
prop:visibility-handler="{{row.data.handleVisibility}}"
|
|
1999
|
-
${i === 0 ? 'expand-toggle' : ''}
|
|
2000
|
-
${i === activeColumnNames.length - 1
|
|
2001
|
-
? 'isolate-button visibility-toggle'
|
|
2002
|
-
: ''}>
|
|
2003
|
-
<div class="flex items-center gap-2">
|
|
2004
|
-
<vertex-tooltip
|
|
2005
|
-
class="truncate"
|
|
2006
|
-
prop:content="${column.binding != null ? column.binding : '--'}"
|
|
2007
|
-
placement="${i !== activeColumnNames.length - 1
|
|
2008
|
-
? 'right'
|
|
2009
|
-
: 'top'}">
|
|
2010
|
-
<div class="flex items-center w-full">
|
|
2011
|
-
<div class="truncate">${column.binding}</div>
|
|
2012
|
-
</div>
|
|
2013
|
-
</vertex-tooltip>
|
|
2014
|
-
</div>
|
|
2015
|
-
|
|
2016
|
-
|
|
2017
|
-
<div slot="placeholder" class="flex items-center w-full truncate">
|
|
2018
|
-
<div> -- </div>
|
|
2019
|
-
</div>
|
|
2020
|
-
</vertex-scene-tree-table-cell>
|
|
2021
|
-
`,
|
|
2022
|
-
} })] }, column.label));
|
|
2023
|
-
}) })));
|
|
2024
|
-
};
|
|
2025
|
-
|
|
2026
|
-
const VertexSceneTreeExpandAll = () => {
|
|
2027
|
-
const sceneTreeHTMLElement = recoil.useRecoilValue(sceneTreeElement);
|
|
2028
|
-
return (jsxRuntime.jsx(uiReact.VertexTooltip, { className: "w-auto", content: "Expand All", placement: "top", children: jsxRuntime.jsx(uiReact.VertexIcon, { size: "sm", "data-testid": "expand-all-icon", className: "h-6 w-6 hover:bg-neutral-300 rounded cursor-pointer", name: "expand-all", onClick: () => {
|
|
2029
|
-
sceneTreeHTMLElement === null || sceneTreeHTMLElement === void 0 ? void 0 : sceneTreeHTMLElement.expandAll();
|
|
2030
|
-
} }) }));
|
|
2031
|
-
};
|
|
2032
|
-
|
|
2033
|
-
const VertexSceneTreeCollapseAll = () => {
|
|
2034
|
-
const sceneTreeHTMLElement = recoil.useRecoilValue(sceneTreeElement);
|
|
2035
|
-
return (jsxRuntime.jsx(uiReact.VertexTooltip, { className: "w-auto", content: "Collapse All", placement: "top", children: jsxRuntime.jsx(uiReact.VertexIcon, { size: "sm", className: "h-6 w-6 hover:bg-neutral-300 rounded cursor-pointer", "data-testid": "collapse-all-icon", name: "collapse-all", onClick: () => {
|
|
2036
|
-
sceneTreeHTMLElement === null || sceneTreeHTMLElement === void 0 ? void 0 : sceneTreeHTMLElement.collapseAll();
|
|
2037
|
-
} }) }));
|
|
2038
|
-
};
|
|
2039
|
-
|
|
2040
|
-
function VertexSceneTreeToolbar() {
|
|
2041
|
-
return (jsxRuntime.jsx(viewerReact.VertexSceneTreeToolbar, { className: "h-10 border-b border-neutral-300 box-border", children: jsxRuntime.jsxs("div", { className: "flex flex-shrink-0 w-full text-neutral-700 items-center gap mx-2", children: [jsxRuntime.jsx(VertexSceneTreeExpandAll, {}), jsxRuntime.jsx(VertexSceneTreeCollapseAll, {})] }) }));
|
|
2042
|
-
}
|
|
2043
|
-
|
|
2044
|
-
const VertexSceneTree = (_a) => {
|
|
2045
|
-
var { id, font, backgroundColors, children, style, onPointerDown, onClick, onToggleSelection, onToggleExpansion, onToggleVisibility, className, rowData } = _a, sdkProps = __rest(_a, ["id", "font", "backgroundColors", "children", "style", "onPointerDown", "onClick", "onToggleSelection", "onToggleExpansion", "onToggleVisibility", "className", "rowData"]);
|
|
2046
|
-
const config = recoil.useRecoilValue(sdkConfig);
|
|
2047
|
-
const selectionActions = useSelectionActions();
|
|
2048
|
-
const sceneTreeActions = useSceneTreeActions();
|
|
2049
|
-
const viewer = recoil.useRecoilValue(viewerElement);
|
|
2050
|
-
const callbackRef = useRecoilRef({
|
|
2051
|
-
state: sceneTreeElement,
|
|
2052
|
-
});
|
|
2053
|
-
const wrappedExpansionHandler = (event, node, tree) => {
|
|
2054
|
-
sceneTreeActions.toggleExpansion(event, node, tree);
|
|
2055
|
-
onToggleExpansion === null || onToggleExpansion === void 0 ? void 0 : onToggleExpansion(event, node, tree);
|
|
2056
|
-
};
|
|
2057
|
-
const wrappedSelectionHandler = (event, node, tree) => {
|
|
2058
|
-
sceneTreeActions.toggleSelection(event, node, tree);
|
|
2059
|
-
onToggleSelection === null || onToggleSelection === void 0 ? void 0 : onToggleSelection(event, node, tree);
|
|
2060
|
-
};
|
|
2061
|
-
const wrappedVisibilityHandler = (event, node, tree) => {
|
|
2062
|
-
sceneTreeActions.toggleVisibility(event, node, tree);
|
|
2063
|
-
onToggleVisibility === null || onToggleVisibility === void 0 ? void 0 : onToggleVisibility(event, node, tree);
|
|
2064
|
-
};
|
|
2065
|
-
const handleClick = (event) => {
|
|
2066
|
-
if (event.altKey) {
|
|
2067
|
-
sceneTreeActions.flyToRow(event.clientY);
|
|
2068
|
-
}
|
|
2069
|
-
onClick === null || onClick === void 0 ? void 0 : onClick(event);
|
|
2070
|
-
};
|
|
2071
|
-
const handlePointerDown = (event) => {
|
|
2072
|
-
if (targetIsElement(event.target, 'VERTEX-SCENE-TREE-TABLE-COLUMN')) {
|
|
2073
|
-
selectionActions.clearSelection();
|
|
2074
|
-
}
|
|
2075
|
-
onPointerDown === null || onPointerDown === void 0 ? void 0 : onPointerDown(event);
|
|
2076
|
-
};
|
|
2077
|
-
return (jsxRuntime.jsxs(viewerReact.VertexSceneTree, Object.assign({ id: id !== null && id !== void 0 ? id : 'vertex-scene-tree', "data-testid": "vertex-scene-tree", config: config, ref: callbackRef, className: classNames('shrink-0', className), style: Object.assign(Object.assign(Object.assign({}, styleFromOptionalFont(font)), styleFromOptionalBackgroundColors(backgroundColors)), style), onConnectionError: (e) => {
|
|
2078
|
-
logger.error('Scene Tree Connection Error: ', e.detail);
|
|
2079
|
-
}, viewer: viewer, onPointerDown: handlePointerDown, onClick: handleClick, rowData: (row) => {
|
|
2080
|
-
var _a;
|
|
2081
|
-
const providedRowData = (_a = rowData === null || rowData === void 0 ? void 0 : rowData(row)) !== null && _a !== void 0 ? _a : {};
|
|
2082
|
-
return Object.assign({ handleExpansion: wrappedExpansionHandler, handleSelection: wrappedSelectionHandler, handleVisibility: wrappedVisibilityHandler }, providedRowData);
|
|
2083
|
-
} }, sdkProps, { children: [jsxRuntime.jsx(VertexSceneTreeToolbar, {}), jsxRuntime.jsx(VertexSceneTreeTableLayout, {}), children] })));
|
|
2084
|
-
};
|
|
2085
|
-
|
|
2086
|
-
const useSynchronizedProp = (state, value) => {
|
|
2087
|
-
const setState = recoil.useSetRecoilState(state);
|
|
2088
|
-
React.useEffect(() => {
|
|
2089
|
-
setState(value);
|
|
2090
|
-
}, [setState, value]);
|
|
2091
|
-
};
|
|
2092
|
-
|
|
2093
|
-
const VertexPopupButton = (_a) => {
|
|
2094
|
-
var { open, children } = _a, uiProps = __rest(_a, ["open", "children"]);
|
|
2095
|
-
const anchor = children.find((c) => c.type === Anchor);
|
|
2096
|
-
const others = children.filter((c) => c.type !== Anchor);
|
|
2097
|
-
if (anchor == null) {
|
|
2098
|
-
return jsxRuntime.jsx(jsxRuntime.Fragment, {});
|
|
2099
|
-
}
|
|
2100
|
-
return (jsxRuntime.jsxs(uiReact.VertexPopover, Object.assign({ className: "flex", placement: "top", backdrop: false, open: open }, uiProps, { children: [anchor, jsxRuntime.jsx("div", { className: classNames('flex mb-1.5', {
|
|
2101
|
-
hidden: !open,
|
|
2102
|
-
}), "data-testid": "align-plane-popover-menu", children: others })] })));
|
|
2103
|
-
};
|
|
2104
|
-
const Anchor = ({ tooltipContent, children }) => {
|
|
2105
|
-
return (jsxRuntime.jsx("div", { slot: "anchor", children: jsxRuntime.jsx(uiReact.VertexTooltip, { className: "cursor-pointer", content: tooltipContent, children: children }) }));
|
|
2106
|
-
};
|
|
2107
|
-
VertexPopupButton.Anchor = Anchor;
|
|
2108
|
-
|
|
2109
|
-
const VertexSlider = (_a) => {
|
|
2110
|
-
var { value, defaultValue, onChange, onValueChange, onValueInput } = _a, uiProps = __rest(_a, ["value", "defaultValue", "onChange", "onValueChange", "onValueInput"]);
|
|
2111
|
-
const [displayedValue, setDisplayedValue] = React.useState(defaultValue);
|
|
2112
|
-
return (jsxRuntime.jsx(uiReact.VertexSlider, Object.assign({ className: "w-52 mx-2 items-center", value: value !== null && value !== void 0 ? value : displayedValue, onValueChange: (e) => {
|
|
2113
|
-
setDisplayedValue(e.detail.value);
|
|
2114
|
-
onChange === null || onChange === void 0 ? void 0 : onChange(e.detail.value);
|
|
2115
|
-
onValueChange === null || onValueChange === void 0 ? void 0 : onValueChange(e);
|
|
2116
|
-
}, onValueInput: (e) => {
|
|
2117
|
-
setDisplayedValue(e.detail.value);
|
|
2118
|
-
onChange === null || onChange === void 0 ? void 0 : onChange(e.detail.value);
|
|
2119
|
-
onValueInput === null || onValueInput === void 0 ? void 0 : onValueInput(e);
|
|
2120
|
-
} }, uiProps)));
|
|
2121
|
-
};
|
|
2122
|
-
|
|
2123
|
-
function VertexViewerToolbarDivider() {
|
|
2124
|
-
return (jsxRuntime.jsx("div", { "data-testid": "toolbar-divider", className: "h-6 w-px bg-neutral-300 mx-1 items-center mt-1" }));
|
|
2125
|
-
}
|
|
2126
|
-
|
|
2127
|
-
function VertexViewerCrossSectionAlignmentPopoverMenu() {
|
|
2128
|
-
const crossSectioningActions = useCrossSectioningActions();
|
|
2129
|
-
const open = recoil.useRecoilValue(crossSectioningAlignmentToolsOpen);
|
|
2130
|
-
const alignment = recoil.useRecoilValue(crossSectioningAlignment);
|
|
2131
|
-
const getBaseIcon = () => {
|
|
2132
|
-
return `align-to-${alignment === null || alignment === void 0 ? void 0 : alignment.mode}`;
|
|
2133
|
-
};
|
|
2134
|
-
useStackKeyBinding({
|
|
2135
|
-
id: 'CrossSectionAlignment',
|
|
2136
|
-
keyBind: 'Escape',
|
|
2137
|
-
fn: crossSectioningActions.cancelCurrentHit,
|
|
2138
|
-
addPredicate: () => { var _a; return (_a = alignment === null || alignment === void 0 ? void 0 : alignment.hitPending) !== null && _a !== void 0 ? _a : false; },
|
|
2139
|
-
cancelPredicate: () => !(alignment === null || alignment === void 0 ? void 0 : alignment.hitPending),
|
|
2140
|
-
}, [alignment === null || alignment === void 0 ? void 0 : alignment.hitPending]);
|
|
2141
|
-
return (jsxRuntime.jsxs(VertexPopupButton, { "data-testid": "section-alignment-popover", placement: "top", backdrop: false, open: open, onDismissed: crossSectioningActions.closeAlignmentTools, children: [jsxRuntime.jsx(VertexPopupButton.Anchor, { tooltipContent: "Section Alignment", children: jsxRuntime.jsx(uiReact.VertexIconButton, { "data-testid": "section-alignment-icon-button", iconName: getBaseIcon(), iconColor: "secondary", onClick: open
|
|
2142
|
-
? crossSectioningActions.closeAlignmentTools
|
|
2143
|
-
: crossSectioningActions.openAlignmentTools, children: jsxRuntime.jsx(uiReact.VertexIcon, { "data-testid": "section-alignment-icon-chevron", name: "chevron-up", size: "sm" }) }) }), jsxRuntime.jsxs(viewerReact.VertexViewerToolbarGroup, { direction: "vertical", className: "flex justify-evenly items-center py-1 my-1 ring-1 ring-neutral-200 rounded bg-neutral-100 opacity-95", children: [jsxRuntime.jsx(uiReact.VertexIconButton, { iconColor: "secondary", onClick: () => crossSectioningActions.updateAlignment('global'), className: "w-full text-neutral-800 hover:bg-neutral-300 rounded cursor-pointer mx-0.5 py-1 px-2", "data-testid": "section-alignment-align-global", iconName: "align-to-global", variant: "plain", children: jsxRuntime.jsx("div", { className: "text-base ml-2", children: "Align to Global" }) }), jsxRuntime.jsx(uiReact.VertexIconButton, { iconColor: "secondary", onClick: () => crossSectioningActions.updateAlignment('surface'), className: "w-full text-neutral-800 hover:bg-neutral-300 rounded cursor-pointer mx-0.5 py-1 px-2", "data-testid": "section-alignment-align-surface", iconName: "align-to-surface", variant: "plain", children: jsxRuntime.jsx("div", { className: "text-base ml-2", children: "Align to Surface" }) })] })] }));
|
|
2144
|
-
}
|
|
2145
|
-
|
|
2146
|
-
function VertexViewerCrossSectionAxisPopoverMenu() {
|
|
2147
|
-
const crossSectioningActions = useCrossSectioningActions();
|
|
2148
|
-
const open = recoil.useRecoilValue(crossSectioningAxisToolsOpen);
|
|
2149
|
-
const planes = recoil.useRecoilValue(crossSectioningPlanes);
|
|
2150
|
-
const availableAxes = recoil.useRecoilValueLoadable(crossSectioningAvailableAxes);
|
|
2151
|
-
const baseIcon = React.useMemo(() => {
|
|
2152
|
-
const axis$1 = planes.length > 0 && availableAxes.state === 'hasValue'
|
|
2153
|
-
? axis(planes[0], xAxis(availableAxes.contents), yAxis(availableAxes.contents), zAxis(availableAxes.contents))
|
|
2154
|
-
: 'x';
|
|
2155
|
-
return axis$1 != null ? `axis-${axis$1}` : 'axis-x';
|
|
2156
|
-
}, [availableAxes.state, availableAxes.contents, planes]);
|
|
2157
|
-
return (jsxRuntime.jsxs(VertexPopupButton, { "data-testid": "align-plane-popover", placement: "top", backdrop: false, open: open, onDismissed: crossSectioningActions.closeAxisTools, children: [jsxRuntime.jsx(VertexPopupButton.Anchor, { tooltipContent: "Align Plane", children: jsxRuntime.jsx(uiReact.VertexIconButton, { onClick: open
|
|
2158
|
-
? crossSectioningActions.closeAxisTools
|
|
2159
|
-
: crossSectioningActions.openAxisTools, iconName: baseIcon, "data-testid": "align-plane-icon", iconColor: "secondary", children: jsxRuntime.jsx(uiReact.VertexIcon, { "data-testid": "align-plane-icon-chevron", name: "chevron-up", size: "sm" }) }) }), jsxRuntime.jsxs(viewerReact.VertexViewerToolbarGroup, { direction: "vertical", className: "flex justify-evenly items-center py-1 my-1 ring-1 ring-neutral-200 rounded bg-neutral-100 opacity-95", children: [jsxRuntime.jsx(uiReact.VertexIconButton, { "data-testid": "align-plane-x-axis-button", className: "w-full text-neutral-800 hover:bg-neutral-300 rounded cursor-pointer mx-0.5 py-1 px-2", onClick: () => crossSectioningActions.updateAxis('x'), variant: "plain", iconColor: "secondary", iconName: "axis-x", children: jsxRuntime.jsx("div", { className: "text-base ml-2", children: "X-axis Plane" }) }), jsxRuntime.jsx(uiReact.VertexIconButton, { className: "w-full text-neutral-800 hover:bg-neutral-300 rounded cursor-pointer mx-0.5 py-1 px-2", variant: "plain", iconColor: "secondary", iconName: "axis-y", "data-testid": "align-plane-y-axis-button", onClick: () => crossSectioningActions.updateAxis('y'), children: jsxRuntime.jsx("div", { className: "text-base ml-2", children: "Y-axis Plane" }) }), jsxRuntime.jsx(uiReact.VertexIconButton, { "data-testid": "align-plane-z-axis-button", className: "w-full text-neutral-800 hover:bg-neutral-300 rounded cursor-pointer mx-0.5 py-1 px-2", onClick: () => crossSectioningActions.updateAxis('z'), variant: "plain", iconColor: "secondary", iconName: "axis-z", children: jsxRuntime.jsx("div", { className: "text-base ml-2", children: "Z-axis Plane" }) })] })] }));
|
|
2160
|
-
}
|
|
2161
|
-
|
|
2162
|
-
/**
|
|
2163
|
-
* Types of distance units
|
|
2164
|
-
*/
|
|
2165
|
-
var DistanceUnit;
|
|
2166
|
-
(function (DistanceUnit) {
|
|
2167
|
-
DistanceUnit["mm"] = "millimeters";
|
|
2168
|
-
DistanceUnit["cm"] = "centimeters";
|
|
2169
|
-
DistanceUnit["m"] = "meters";
|
|
2170
|
-
DistanceUnit["in"] = "inches";
|
|
2171
|
-
DistanceUnit["ft"] = "feet";
|
|
2172
|
-
})(DistanceUnit || (DistanceUnit = {}));
|
|
2173
|
-
/**
|
|
2174
|
-
* Conversion factors (based on mm)
|
|
2175
|
-
*/
|
|
2176
|
-
var DistanceUnitConversion;
|
|
2177
|
-
(function (DistanceUnitConversion) {
|
|
2178
|
-
DistanceUnitConversion[DistanceUnitConversion["mm"] = 1] = "mm";
|
|
2179
|
-
DistanceUnitConversion[DistanceUnitConversion["cm"] = 0.1] = "cm";
|
|
2180
|
-
DistanceUnitConversion[DistanceUnitConversion["m"] = 0.001] = "m";
|
|
2181
|
-
DistanceUnitConversion[DistanceUnitConversion["in"] = 0.03937007874015748] = "in";
|
|
2182
|
-
DistanceUnitConversion[DistanceUnitConversion["ft"] = 0.0032808398950131233] = "ft";
|
|
2183
|
-
})(DistanceUnitConversion || (DistanceUnitConversion = {}));
|
|
2184
|
-
/**
|
|
2185
|
-
* Converts a value from non-system units (in) to base system units (mm) using supplied conversion factor.
|
|
2186
|
-
*
|
|
2187
|
-
* @param value Value to convert.
|
|
2188
|
-
* @param fromUnit Unit converting from (to base system units)
|
|
2189
|
-
*/
|
|
2190
|
-
const convertFrom = (value, fromUnit) => {
|
|
2191
|
-
const conversionFactor = DistanceUnitConversion[fromUnit];
|
|
2192
|
-
return value / conversionFactor;
|
|
2193
|
-
};
|
|
2194
|
-
/**
|
|
2195
|
-
* Converts a value from base system units (mm) to another unit based on supplied conversion factor.
|
|
2196
|
-
*
|
|
2197
|
-
* @param value Value to convert.
|
|
2198
|
-
* @param toUnit Unit to convert to (from base system units)
|
|
2199
|
-
*/
|
|
2200
|
-
const convertTo = (value, toUnit) => {
|
|
2201
|
-
const conversionFactor = DistanceUnitConversion[toUnit];
|
|
2202
|
-
return value * conversionFactor;
|
|
2203
|
-
};
|
|
2204
|
-
/**
|
|
2205
|
-
* Formats a numeric value as a string with supplied unit and decimal places.
|
|
2206
|
-
*
|
|
2207
|
-
* @param value
|
|
2208
|
-
* @param unit
|
|
2209
|
-
* @param decimalPlaces
|
|
2210
|
-
*/
|
|
2211
|
-
const formatWithUnit = (value, unit, decimalPlaces) => {
|
|
2212
|
-
return `${value.toFixed(decimalPlaces)} ${unit}`;
|
|
2213
|
-
};
|
|
2214
|
-
/**
|
|
2215
|
-
* Formats a (millimeter based) numeric distance value
|
|
2216
|
-
* for display, as converted to specificied units.
|
|
2217
|
-
*
|
|
2218
|
-
* @param value
|
|
2219
|
-
* @param unit
|
|
2220
|
-
* @param decimalPlaces
|
|
2221
|
-
*/
|
|
2222
|
-
const formatDistance = (value, unit, decimalPlaces) => {
|
|
2223
|
-
return formatWithUnit(convertTo(value, unit), unit, decimalPlaces);
|
|
2224
|
-
};
|
|
2225
|
-
/**
|
|
2226
|
-
* Returns a distance formatter function for a given pair of unit and decimal place params.
|
|
2227
|
-
*
|
|
2228
|
-
* @param unit
|
|
2229
|
-
* @param decimalPlaces
|
|
2230
|
-
*/
|
|
2231
|
-
const createDistanceFormatter = (unit, decimalPlaces) => {
|
|
2232
|
-
return (value) => formatDistance(value, unit, decimalPlaces);
|
|
2233
|
-
};
|
|
2234
|
-
|
|
2235
|
-
function VertexViewerCrossSectionOffsetStepper({ offset, measurementUnit, decimalPlaces, onOffsetChange, }) {
|
|
2236
|
-
const [value, setValue] = React.useState(convertTo(offset, measurementUnit));
|
|
2237
|
-
React.useEffect(() => {
|
|
2238
|
-
setValue(convertTo(offset, measurementUnit));
|
|
2239
|
-
}, [measurementUnit, offset]);
|
|
2240
|
-
const formatter = createDistanceFormatter(measurementUnit, decimalPlaces);
|
|
2241
|
-
const handleIncrementalUpdate = (increment) => {
|
|
2242
|
-
const updated = convertFrom(value + increment, measurementUnit);
|
|
2243
|
-
onOffsetChange(updated);
|
|
2244
|
-
};
|
|
2245
|
-
const handleSubmit = (event) => {
|
|
2246
|
-
event.preventDefault();
|
|
2247
|
-
onOffsetChange(convertFrom(value, measurementUnit));
|
|
2248
|
-
};
|
|
2249
|
-
const handleBlur = () => {
|
|
2250
|
-
onOffsetChange(convertFrom(value, measurementUnit));
|
|
2251
|
-
};
|
|
2252
|
-
return (jsxRuntime.jsx(uiReact.VertexTooltip, { content: "Plane Offset", children: jsxRuntime.jsx("form", { "data-testid": "cross-section-stepper-form", onSubmit: handleSubmit, children: jsxRuntime.jsxs(uiReact.VertexTextfield, { "data-testid": "cross-section-stepper-input", className: "viewer-toolbar-input w-32 border-none ring-0 bg-white", type: "text", value: formatter(parseFloat(offset.toFixed(3))), onInputInput: (event) => {
|
|
2253
|
-
setValue(event.detail.value != null
|
|
2254
|
-
? parseFloat(event.detail.value)
|
|
2255
|
-
: offset);
|
|
2256
|
-
}, onBlur: handleBlur, children: [jsxRuntime.jsx("div", { "data-testid": "cross-section-stepper-decrement", className: "py-1 cursor-pointer", slot: "left", onClick: () => handleIncrementalUpdate(-1), children: jsxRuntime.jsx(uiReact.VertexIcon, { name: "chevron-left", size: "sm" }) }), jsxRuntime.jsx("div", { "data-testid": "cross-section-stepper-increment", className: "py-1 cursor-pointer", slot: "right", onClick: () => handleIncrementalUpdate(1), children: jsxRuntime.jsx(uiReact.VertexIcon, { name: "chevron-right", size: "sm" }) })] }) }) }));
|
|
2257
|
-
}
|
|
2258
|
-
|
|
2259
|
-
const INTERACTIVITY_TIMEOUT_DEBOUNCE_THRESHOLD = 400;
|
|
2260
|
-
function VertexViewerCrossSectionPopupMenu({ decimalPlaces, measurementUnit, }) {
|
|
2261
|
-
const crossSectioningActions = useCrossSectioningActions();
|
|
2262
|
-
const open = recoil.useRecoilValue(crossSectioningAdditionalToolsOpen);
|
|
2263
|
-
const sliderRange = recoil.useRecoilValueLoadable(crossSectioningSliderRange);
|
|
2264
|
-
const displayOffset = recoil.useRecoilValueLoadable(crossSectioningPlaneDisplayOffset);
|
|
2265
|
-
const interactiveTimeout = React.useRef();
|
|
2266
|
-
const displayedRange = React.useMemo(() => sliderRange.state === 'hasValue'
|
|
2267
|
-
? sliderRange.contents
|
|
2268
|
-
: DEFAULT_SLIDER_RANGE, [sliderRange.state, sliderRange.contents]);
|
|
2269
|
-
const displayedOffset = React.useMemo(() => (displayOffset.state === 'hasValue' ? displayOffset.contents : 0), [displayOffset.state, displayOffset.contents]);
|
|
2270
|
-
const handleCrossSectionValueChange = (value) => {
|
|
2271
|
-
clearTimeout(interactiveTimeout.current);
|
|
2272
|
-
interactiveTimeout.current = window.setTimeout(() => {
|
|
2273
|
-
crossSectioningActions.endInteraction();
|
|
2274
|
-
}, INTERACTIVITY_TIMEOUT_DEBOUNCE_THRESHOLD);
|
|
2275
|
-
crossSectioningActions.beginInteraction();
|
|
2276
|
-
crossSectioningActions.updatePlanes(value);
|
|
2277
|
-
};
|
|
2278
|
-
return (jsxRuntime.jsxs(VertexPopupButton, { "data-testid": "cross-section-popover", placement: "top", backdrop: false, open: open, onDismissed: crossSectioningActions.closeAdditionalTools, children: [jsxRuntime.jsx(VertexPopupButton.Anchor, { tooltipContent: "Section Tools", children: jsxRuntime.jsx("div", { className: "-ml-px py-1.5", children: jsxRuntime.jsx(uiReact.VertexIcon, { "data-testid": "cross-section-popover-icon", name: "chevron-up", size: "sm", onClick: open
|
|
2279
|
-
? crossSectioningActions.closeAdditionalTools
|
|
2280
|
-
: crossSectioningActions.openAdditionalTools }) }) }), jsxRuntime.jsxs(viewerReact.VertexViewerToolbarGroup, { className: "relative bottom-3 flex justify-evenly items-center p-1 ring-1 ring-neutral-200 rounded bg-neutral-100 opacity-95", children: [jsxRuntime.jsx(VertexViewerCrossSectionAlignmentPopoverMenu, {}), jsxRuntime.jsx(uiReact.VertexTooltip, { className: "w-auto", content: "Reverse", children: jsxRuntime.jsx(uiReact.VertexIconButton, { iconName: "flip", "data-testid": "viewer-toolbar-flip-button", onClick: crossSectioningActions.flipPlanes, iconColor: "secondary" }) }), jsxRuntime.jsx(uiReact.VertexTooltip, { className: "w-auto", content: "Align View to Plane", children: jsxRuntime.jsx(uiReact.VertexIconButton, { "data-testid": "viewer-toolbar-align-view-to-plane-button", iconName: "align-view-to-plane", onClick: crossSectioningActions.alignViewToPlane, iconColor: "secondary" }) }), jsxRuntime.jsx(VertexViewerToolbarDivider, {}), jsxRuntime.jsx(VertexViewerCrossSectionAxisPopoverMenu, {}), jsxRuntime.jsx(VertexSlider, { value: displayedOffset, defaultValue: displayedRange.default, disabled: sliderRange.state !== 'hasValue', min: displayedRange.min, max: displayedRange.max, step: 0.01, onChange: handleCrossSectionValueChange }), jsxRuntime.jsx("div", { className: "px-4", children: jsxRuntime.jsx(VertexViewerCrossSectionOffsetStepper, { decimalPlaces: decimalPlaces, measurementUnit: measurementUnit, offset: displayOffset.state === 'hasValue' ? displayOffset.contents : 0, onOffsetChange: handleCrossSectionValueChange }) })] })] }));
|
|
2281
|
-
}
|
|
2282
|
-
|
|
2283
|
-
const VertexViewerCrossSectionButton = ({ decimalPlaces, measurementUnit, sectionLineWidth, sectionColor, }) => {
|
|
2284
|
-
const crossSectioningActions = useCrossSectioningActions();
|
|
2285
|
-
const isEnabled = recoil.useRecoilValue(crossSectioningEnabled);
|
|
2286
|
-
useSynchronizedProp(crossSectioningBorderWidth, sectionLineWidth);
|
|
2287
|
-
useSynchronizedProp(crossSectioningHighlightColor, sectionColor);
|
|
2288
|
-
return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(uiReact.VertexTooltip, { content: isEnabled ? 'Hide Section' : 'Show Section', children: jsxRuntime.jsx(uiReact.VertexIconButton, { "data-testid": "viewer-toolbar-cross-section-button", iconName: "cross-section", iconColor: isEnabled ? 'primary' : 'secondary', onClick: () => isEnabled
|
|
2289
|
-
? crossSectioningActions.disable()
|
|
2290
|
-
: crossSectioningActions.enable() }) }), jsxRuntime.jsx(VertexViewerCrossSectionPopupMenu, { decimalPlaces: decimalPlaces !== null && decimalPlaces !== void 0 ? decimalPlaces : 2, measurementUnit: measurementUnit !== null && measurementUnit !== void 0 ? measurementUnit : 'mm' })] }));
|
|
2291
|
-
};
|
|
2292
|
-
|
|
2293
|
-
const VertexFitAllButton = () => {
|
|
2294
|
-
const viewerHTMLElement = recoil.useRecoilValue(viewerElement);
|
|
2295
|
-
return (jsxRuntime.jsx(uiReact.VertexTooltip, { content: "Fit All", children: jsxRuntime.jsx(uiReact.VertexIconButton, { iconName: "fit-all", iconColor: "secondary", "data-testid": "viewer-toolbar-fit-all-button", onClick: async () => {
|
|
2296
|
-
const scene = await (viewerHTMLElement === null || viewerHTMLElement === void 0 ? void 0 : viewerHTMLElement.scene());
|
|
2297
|
-
await (scene === null || scene === void 0 ? void 0 : scene.camera().viewAll().render({ animation: { milliseconds: 500 } }));
|
|
2298
|
-
} }) }));
|
|
2299
|
-
};
|
|
2300
|
-
|
|
2301
|
-
const VertexPanButton = () => {
|
|
2302
|
-
const viewerHTMLElement = recoil.useRecoilValue(viewerElement);
|
|
2303
|
-
const sceneReady = recoil.useRecoilValue(viewerInitialSceneReady);
|
|
2304
|
-
const [activeTool, setActiveTool] = recoil.useRecoilState(viewerPrimaryInteractionType);
|
|
2305
|
-
const [interactionHandler, setInteractionHandler] = recoil.useRecoilState(viewerBaseInteractionHandlerProvider);
|
|
2306
|
-
React.useEffect(() => {
|
|
2307
|
-
if (viewerHTMLElement != null && sceneReady) {
|
|
2308
|
-
setInteractionHandler(viewerHTMLElement.getBaseInteractionHandler());
|
|
2309
|
-
}
|
|
2310
|
-
}, [viewerHTMLElement, sceneReady, setInteractionHandler]);
|
|
2311
|
-
return (jsxRuntime.jsx(uiReact.VertexTooltip, { content: "Pan", children: jsxRuntime.jsx(uiReact.VertexIconButton, { iconName: "pan", iconColor: activeTool === 'pan' ? 'primary' : 'secondary', "data-testid": "viewer-toolbar-pan-button", onClick: async () => {
|
|
2312
|
-
setActiveTool('pan');
|
|
2313
|
-
if (interactionHandler != null) {
|
|
2314
|
-
const handler = await interactionHandler;
|
|
2315
|
-
handler === null || handler === void 0 ? void 0 : handler.setPrimaryInteractionType('pan');
|
|
2316
|
-
}
|
|
2317
|
-
} }) }));
|
|
2318
|
-
};
|
|
2319
|
-
|
|
2320
|
-
const VertexRotateButton = () => {
|
|
2321
|
-
const viewerHTMLElement = recoil.useRecoilValue(viewerElement);
|
|
2322
|
-
const sceneReady = recoil.useRecoilValue(viewerInitialSceneReady);
|
|
2323
|
-
const [activeTool, setActiveTool] = recoil.useRecoilState(viewerPrimaryInteractionType);
|
|
2324
|
-
const [interactionHandler, setInteractionHandler] = recoil.useRecoilState(viewerBaseInteractionHandlerProvider);
|
|
2325
|
-
React.useEffect(() => {
|
|
2326
|
-
if (viewerHTMLElement != null && sceneReady) {
|
|
2327
|
-
setInteractionHandler(viewerHTMLElement.getBaseInteractionHandler());
|
|
2328
|
-
}
|
|
2329
|
-
}, [viewerHTMLElement, sceneReady, setInteractionHandler]);
|
|
2330
|
-
return (jsxRuntime.jsx(uiReact.VertexTooltip, { content: "Rotate", children: jsxRuntime.jsx(uiReact.VertexIconButton, { iconName: "rotate", iconColor: activeTool === 'rotate' ? 'primary' : 'secondary', "data-testid": "viewer-toolbar-rotate-button", onClick: async () => {
|
|
2331
|
-
setActiveTool('rotate');
|
|
2332
|
-
if (interactionHandler != null) {
|
|
2333
|
-
const handler = await interactionHandler;
|
|
2334
|
-
handler === null || handler === void 0 ? void 0 : handler.setPrimaryInteractionType('rotate');
|
|
2335
|
-
}
|
|
2336
|
-
} }) }));
|
|
2337
|
-
};
|
|
2338
|
-
|
|
2339
|
-
const boxSelectionEnabled = recoil.atom({
|
|
2340
|
-
key: 'boxSelectionEnabled',
|
|
2341
|
-
default: false,
|
|
2342
|
-
});
|
|
2343
|
-
const boxSelectionOperationType = recoil.atom({
|
|
2344
|
-
key: 'boxSelectionOperationType',
|
|
2345
|
-
default: 'clearAndSelect',
|
|
2346
|
-
});
|
|
2347
|
-
|
|
2348
|
-
const useBoxSelectionActions = () => {
|
|
2349
|
-
return {
|
|
2350
|
-
enable: useActionCallback(({ set }) => () => {
|
|
2351
|
-
set(boxSelectionEnabled, true);
|
|
2352
|
-
}),
|
|
2353
|
-
disable: useActionCallback(({ reset }) => async () => {
|
|
2354
|
-
reset(boxSelectionEnabled);
|
|
2355
|
-
reset(boxSelectionOperationType);
|
|
2356
|
-
}),
|
|
2357
|
-
setOperationType: useActionCallback(({ set }) => (operationType) => {
|
|
2358
|
-
set(boxSelectionOperationType, operationType);
|
|
2359
|
-
}),
|
|
2360
|
-
};
|
|
2361
|
-
};
|
|
2362
|
-
|
|
2363
|
-
const VertexBoxSelectionButton = () => {
|
|
2364
|
-
const boxSelectionActions = useBoxSelectionActions();
|
|
2365
|
-
const enabled = recoil.useRecoilValue(boxSelectionEnabled);
|
|
2366
|
-
useStackKeyBinding({
|
|
2367
|
-
id: 'ExitBoxSelection',
|
|
2368
|
-
keyBind: 'Escape',
|
|
2369
|
-
fn: boxSelectionActions.disable,
|
|
2370
|
-
addPredicate: () => enabled,
|
|
2371
|
-
cancelPredicate: () => !enabled,
|
|
2372
|
-
}, [enabled]);
|
|
2373
|
-
return (jsxRuntime.jsx(uiReact.VertexTooltip, { content: "Box Selection", children: jsxRuntime.jsx(uiReact.VertexIconButton, { iconName: "box-cursor", iconColor: enabled ? 'primary' : 'secondary', "data-testid": "viewer-toolbar-enable-box-selection-button", onClick: enabled ? boxSelectionActions.disable : boxSelectionActions.enable }) }));
|
|
2374
|
-
};
|
|
2375
|
-
|
|
2376
|
-
const VertexZoomButton = () => {
|
|
2377
|
-
const viewerHTMLElement = recoil.useRecoilValue(viewerElement);
|
|
2378
|
-
const sceneReady = recoil.useRecoilValue(viewerInitialSceneReady);
|
|
2379
|
-
const [activeTool, setActiveTool] = recoil.useRecoilState(viewerPrimaryInteractionType);
|
|
2380
|
-
const [interactionHandler, setInteractionHandler] = recoil.useRecoilState(viewerBaseInteractionHandlerProvider);
|
|
2381
|
-
React.useEffect(() => {
|
|
2382
|
-
if (viewerHTMLElement != null && sceneReady) {
|
|
2383
|
-
setInteractionHandler(viewerHTMLElement.getBaseInteractionHandler());
|
|
2384
|
-
}
|
|
2385
|
-
}, [viewerHTMLElement, sceneReady, setInteractionHandler]);
|
|
2386
|
-
return (jsxRuntime.jsx(uiReact.VertexTooltip, { content: "Zoom", children: jsxRuntime.jsx(uiReact.VertexIconButton, { iconName: "zoom", iconColor: activeTool === 'zoom' ? 'primary' : 'secondary', "data-testid": "viewer-toolbar-zoom-button", onClick: async () => {
|
|
2387
|
-
setActiveTool('zoom');
|
|
2388
|
-
if (interactionHandler != null) {
|
|
2389
|
-
const handler = await interactionHandler;
|
|
2390
|
-
handler === null || handler === void 0 ? void 0 : handler.setPrimaryInteractionType('zoom');
|
|
2391
|
-
}
|
|
2392
|
-
} }) }));
|
|
2393
|
-
};
|
|
2394
|
-
|
|
2395
|
-
const DefaultToolbar = () => {
|
|
2396
|
-
return (jsxRuntime.jsx(viewerReact.VertexViewerToolbar, { placement: 'bottom-center', children: jsxRuntime.jsxs(viewerReact.VertexViewerToolbarGroup, { className: "p-1 border border-neutral-200 rounded bg-neutral-100 opacity-95", children: [jsxRuntime.jsx(VertexRotateButton, {}), jsxRuntime.jsx(VertexPanButton, {}), jsxRuntime.jsx(VertexZoomButton, {}), jsxRuntime.jsx(VertexFitAllButton, {}), jsxRuntime.jsx(VertexViewerToolbarDivider, {}), jsxRuntime.jsx(VertexBoxSelectionButton, {}), jsxRuntime.jsx(VertexViewerToolbarDivider, {}), jsxRuntime.jsx(VertexViewerCrossSectionButton, {})] }) }));
|
|
2397
|
-
};
|
|
2398
|
-
|
|
2399
|
-
const VertexToolbar = ({ children }) => {
|
|
2400
|
-
const hasDefinedChildren = children != null && children !== false;
|
|
2401
|
-
return (jsxRuntime.jsx(viewerReact.VertexViewerToolbar, { placement: 'bottom-center', children: hasDefinedChildren ? (jsxRuntime.jsx(viewerReact.VertexViewerToolbarGroup, { className: "p-1 border border-neutral-200 rounded bg-neutral-100 opacity-95", children: children })) : (jsxRuntime.jsx(DefaultToolbar, {})) }));
|
|
2402
|
-
};
|
|
2403
|
-
|
|
2404
|
-
const VertexViewerSceneReset = ({ onReset }) => {
|
|
2405
|
-
const crossSectioningActions = useCrossSectioningActions();
|
|
2406
|
-
const selectionActions = useSelectionActions();
|
|
2407
|
-
const viewerSceneActions = useViewerSceneActions();
|
|
2408
|
-
const handleReset = async () => {
|
|
2409
|
-
await crossSectioningActions.disable();
|
|
2410
|
-
selectionActions.resetSelectionState();
|
|
2411
|
-
onReset === null || onReset === void 0 ? void 0 : onReset();
|
|
2412
|
-
await viewerSceneActions.reset();
|
|
2413
|
-
};
|
|
2414
|
-
return (jsxRuntime.jsx(uiReact.VertexTooltip, { content: "Reset View", children: jsxRuntime.jsx(uiReact.VertexIconButton, { iconName: "reset", className: "flex bg-white opacity-70 hover:opacity-100 text-neutral-900 hover:text-neutral-700 hover:bg-neutral-200 rounded p-1 cursor-pointer", "data-testid": "viewer-reset-tool-button", onClick: handleReset, variant: "plain" }) }));
|
|
2415
|
-
};
|
|
2416
|
-
|
|
2417
|
-
function useViewerFrameActions() {
|
|
2418
|
-
return {
|
|
2419
|
-
frameDrawn: useActionCallback(({ set, reset, snapshot }) => async (event) => {
|
|
2420
|
-
const currentSummary = await snapshot.getPromise(selectionVisibleSummary);
|
|
2421
|
-
set(viewerFrameScene, event.detail.scene);
|
|
2422
|
-
set(selectionVisibleSummary, event.detail.scene.sceneViewSummary.selectedVisibleSummary);
|
|
2423
|
-
set(selectionPreviousVisibleSummary, currentSummary);
|
|
2424
|
-
}),
|
|
2425
|
-
};
|
|
2426
|
-
}
|
|
2427
|
-
|
|
2428
|
-
function useCallbackRef(props) {
|
|
2429
|
-
var _a;
|
|
2430
|
-
const [element, setElement] = React.useState((_a = void 0 ) !== null && _a !== void 0 ? _a : null);
|
|
2431
|
-
const callback = React.useCallback((node) => setElement(node), []);
|
|
2432
|
-
return {
|
|
2433
|
-
element,
|
|
2434
|
-
callback,
|
|
2435
|
-
};
|
|
2436
|
-
}
|
|
2437
|
-
|
|
2438
|
-
const BoxSelectionTool = () => {
|
|
2439
|
-
const { callback } = useCallbackRef();
|
|
2440
|
-
const boxSelectionActions = useBoxSelectionActions();
|
|
2441
|
-
const operationType = recoil.useRecoilValue(boxSelectionOperationType);
|
|
2442
|
-
useApplyKeyBinding({
|
|
2443
|
-
keyBind: 'Shift',
|
|
2444
|
-
fn: React__namespace.useCallback(() => boxSelectionActions.setOperationType('select'), []),
|
|
2445
|
-
off: React__namespace.useCallback(() => boxSelectionActions.setOperationType('clearAndSelect'), []),
|
|
2446
|
-
});
|
|
2447
|
-
return (jsxRuntime.jsx(viewerReact.VertexViewerBoxQueryTool, { ref: callback, "data-testid": "viewer-box-query-tool", operationType: operationType }));
|
|
2448
|
-
};
|
|
2449
|
-
|
|
2450
|
-
const VertexViewerViewCube = (_a) => {
|
|
2451
|
-
var { placement, children } = _a, sdkProps = __rest(_a, ["placement", "children"]);
|
|
2452
|
-
const childrenAsArray = Array.isArray(children)
|
|
2453
|
-
? children
|
|
2454
|
-
: [children];
|
|
2455
|
-
const definedChildrenWithoutViewCube = childrenAsArray
|
|
2456
|
-
.filter((c) => !React.isValidElement(c) || c.type !== viewerReact.VertexViewerViewCube)
|
|
2457
|
-
.filter((c) => c != null && c !== false);
|
|
2458
|
-
const viewCube = childrenAsArray.find((c) => React.isValidElement(c) && c.type === viewerReact.VertexViewerViewCube);
|
|
2459
|
-
return (jsxRuntime.jsxs(viewerReact.VertexViewerToolbar, { direction: "vertical", "data-testid": "view-cube-toolbar", placement: placement !== null && placement !== void 0 ? placement : 'top-right', children: [viewCube !== null && viewCube !== void 0 ? viewCube : jsxRuntime.jsx(viewerReact.VertexViewerViewCube, Object.assign({ className: "m-7" }, sdkProps)), definedChildrenWithoutViewCube.length === 0 ? (jsxRuntime.jsx("div", { className: "flex items-center justify-center mt-3", children: jsxRuntime.jsx(VertexViewerSceneReset, {}) })) : (jsxRuntime.jsx("div", { className: "mt-3", children: definedChildrenWithoutViewCube }))] }));
|
|
2460
|
-
};
|
|
2461
|
-
|
|
2462
|
-
const VertexViewer = (_a) => {
|
|
2463
|
-
var { id, disableSelection, onTap, onLongpress, onFrameDrawn, viewerRefCallback, children } = _a, sdkProps = __rest(_a, ["id", "disableSelection", "onTap", "onLongpress", "onFrameDrawn", "viewerRefCallback", "children"]);
|
|
2464
|
-
const config = recoil.useRecoilValue(sdkConfig);
|
|
2465
|
-
const callbackRef = useRecoilRef({
|
|
2466
|
-
state: viewerElement,
|
|
2467
|
-
});
|
|
2468
|
-
const currentCrossSectionAlignment = recoil.useRecoilValue(crossSectioningAlignment);
|
|
2469
|
-
const [sceneReady, setSceneReady] = recoil.useRecoilState(viewerInitialSceneReady);
|
|
2470
|
-
const isBoxSelectionEnabled = recoil.useRecoilValue(boxSelectionEnabled);
|
|
2471
|
-
const viewerFrameActions = useViewerFrameActions();
|
|
2472
|
-
const hitActions = useHitActions();
|
|
2473
|
-
const selectionActions = useSelectionActions();
|
|
2474
|
-
const hasDefinedChildren = children != null && children !== false;
|
|
2475
|
-
useKeyBindings();
|
|
2476
|
-
return (jsxRuntime.jsxs(viewerReact.VertexViewer, Object.assign({ id: id !== null && id !== void 0 ? id : 'vertex-viewer', "data-testid": "vertex-viewer", ref: viewerRefCallback !== null && viewerRefCallback !== void 0 ? viewerRefCallback : callbackRef, className: classNames('flex w-full h-full', {
|
|
2477
|
-
'cursor-crosshair': currentCrossSectionAlignment.hitPending,
|
|
2478
|
-
}), config: config, onTap: (e) => {
|
|
2479
|
-
const actions = [
|
|
2480
|
-
...(disableSelection ? [] : [selectionActions.selectCurrentHit]),
|
|
2481
|
-
];
|
|
2482
|
-
hitActions.tap(e, ...actions);
|
|
2483
|
-
onTap === null || onTap === void 0 ? void 0 : onTap(e);
|
|
2484
|
-
}, onLongpress: (e) => {
|
|
2485
|
-
hitActions.longPress(e);
|
|
2486
|
-
onLongpress === null || onLongpress === void 0 ? void 0 : onLongpress(e);
|
|
2487
|
-
}, onFrameDrawn: (e) => {
|
|
2488
|
-
viewerFrameActions.frameDrawn(e);
|
|
2489
|
-
onFrameDrawn === null || onFrameDrawn === void 0 ? void 0 : onFrameDrawn(e);
|
|
2490
|
-
} }, sdkProps, { onSceneReady: () => {
|
|
2491
|
-
if (!sceneReady) {
|
|
2492
|
-
setSceneReady(true);
|
|
2493
|
-
}
|
|
2494
|
-
}, children: [isBoxSelectionEnabled && jsxRuntime.jsx(BoxSelectionTool, {}), hasDefinedChildren ? (children) : (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(VertexViewerViewCube, {}), jsxRuntime.jsx(VertexToolbar, {})] }))] })));
|
|
2495
|
-
};
|
|
2496
|
-
|
|
2497
|
-
function toSdkConfig(config) {
|
|
2498
|
-
if (isOnlyNetworkConfig(config)) {
|
|
2499
|
-
return { network: config };
|
|
2500
|
-
}
|
|
2501
|
-
return config;
|
|
2502
|
-
}
|
|
2503
|
-
function isOnlyNetworkConfig(config) {
|
|
2504
|
-
const asNetworkConfig = config;
|
|
2505
|
-
if (asNetworkConfig.renderingHost != null) {
|
|
2506
|
-
return true;
|
|
2507
|
-
}
|
|
2508
|
-
return false;
|
|
2509
|
-
}
|
|
2510
|
-
|
|
2511
|
-
const VertexViewerToolkitEventListener = ({ onHitStateChange, onSelectionStateChange, }) => {
|
|
2512
|
-
const hitState$1 = recoil.useRecoilValue(hitState);
|
|
2513
|
-
const selectionState$1 = recoil.useRecoilValue(selectionState);
|
|
2514
|
-
React.useEffect(() => {
|
|
2515
|
-
onHitStateChange === null || onHitStateChange === void 0 ? void 0 : onHitStateChange(hitState$1);
|
|
2516
|
-
}, [hitState$1, onHitStateChange]);
|
|
2517
|
-
React.useEffect(() => {
|
|
2518
|
-
onSelectionStateChange === null || onSelectionStateChange === void 0 ? void 0 : onSelectionStateChange(selectionState$1);
|
|
2519
|
-
}, [selectionState$1, onSelectionStateChange]);
|
|
2520
|
-
return jsxRuntime.jsx(jsxRuntime.Fragment, {});
|
|
2521
|
-
};
|
|
2522
|
-
|
|
2523
|
-
const VertexViewerToolkitRoot = (_a) => {
|
|
2524
|
-
var { override, children, config } = _a, eventWrapperProps = __rest(_a, ["override", "children", "config"]);
|
|
2525
|
-
React.useEffect(() => {
|
|
2526
|
-
loader.defineCustomElements();
|
|
2527
|
-
}, []);
|
|
2528
|
-
return (jsxRuntime.jsx(recoil.RecoilRoot, { override: override, children: jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(VertexViewerToolkitEventListener, Object.assign({}, eventWrapperProps)), jsxRuntime.jsx(VertexViewerToolkitRootConfig, { config: config, children: children })] }) }));
|
|
2529
|
-
};
|
|
2530
|
-
const VertexViewerToolkitRootConfig = ({ config, children, }) => {
|
|
2531
|
-
const setSdkConfig = recoil.useSetRecoilState(sdkConfig);
|
|
2532
|
-
React.useEffect(() => {
|
|
2533
|
-
const parsedConfig = config != null ? toSdkConfig(config) : undefined;
|
|
2534
|
-
setSdkConfig(parsedConfig);
|
|
2535
|
-
}, [config, setSdkConfig]);
|
|
2536
|
-
return jsxRuntime.jsx(jsxRuntime.Fragment, { children: children });
|
|
2537
|
-
};
|
|
2538
|
-
|
|
2539
|
-
var index = /*#__PURE__*/Object.freeze({
|
|
2540
|
-
__proto__: null,
|
|
2541
|
-
get AssemblyFontFace () { return AssemblyFontFace; }
|
|
2542
|
-
});
|
|
2543
|
-
|
|
2544
|
-
exports.CrossSection = index$3;
|
|
2545
|
-
exports.Hits = index$2;
|
|
2546
|
-
exports.SceneTree = index;
|
|
2547
|
-
exports.Selection = index$1;
|
|
2548
|
-
exports.VertexContextMenu = VertexContextMenu;
|
|
2549
|
-
exports.VertexFitAllButton = VertexFitAllButton;
|
|
2550
|
-
exports.VertexFitSelectedMenuItem = VertexFitSelectedMenuItem;
|
|
2551
|
-
exports.VertexFlyToMenuItem = VertexFlyToMenuItem;
|
|
2552
|
-
exports.VertexHideAllMenuItem = VertexHideAllMenuItem;
|
|
2553
|
-
exports.VertexHidePartMenuItem = VertexHidePartMenuItem;
|
|
2554
|
-
exports.VertexHideSelectedMenuItem = VertexHideSelectedMenuItem;
|
|
2555
|
-
exports.VertexPanButton = VertexPanButton;
|
|
2556
|
-
exports.VertexRotateButton = VertexRotateButton;
|
|
2557
|
-
exports.VertexSceneTree = VertexSceneTree;
|
|
2558
|
-
exports.VertexSceneTreeContextMenu = VertexSceneTreeContextMenu;
|
|
2559
|
-
exports.VertexSceneTreeTableLayout = VertexSceneTreeTableLayout;
|
|
2560
|
-
exports.VertexShowAllMenuItem = VertexShowAllMenuItem;
|
|
2561
|
-
exports.VertexShowOnlyMenuItem = VertexShowOnlyMenuItem;
|
|
2562
|
-
exports.VertexShowOnlySelectedMenuItem = VertexShowOnlySelectedMenuItem;
|
|
2563
|
-
exports.VertexToolbar = VertexToolbar;
|
|
2564
|
-
exports.VertexViewer = VertexViewer;
|
|
2565
|
-
exports.VertexViewerContextMenu = VertexViewerContextMenu;
|
|
2566
|
-
exports.VertexViewerCrossSectionButton = VertexViewerCrossSectionButton;
|
|
2567
|
-
exports.VertexViewerSceneReset = VertexViewerSceneReset;
|
|
2568
|
-
exports.VertexViewerToolbarDivider = VertexViewerToolbarDivider;
|
|
2569
|
-
exports.VertexViewerToolkitRoot = VertexViewerToolkitRoot;
|
|
2570
|
-
exports.VertexViewerViewCube = VertexViewerViewCube;
|
|
2571
|
-
exports.VertexZoomButton = VertexZoomButton;
|
|
1
|
+
"use strict";var e=require("react/jsx-runtime"),t=require("tslib"),n=require("quick-format-unescaped"),o=require("react"),r=require("react-dom"),i=require("@vertexvis/ui-react"),a=require("@vertexvis/geometry"),s=require("@vertexvis/viewer-react"),l=require("@vertexvis/viewer"),c=require("@vertexvis/ui/loader"),u=require("@vertexvis/viewer/loader");function _interopNamespaceDefault(e){var t=Object.create(null);return e&&Object.keys(e).forEach((function(n){if("default"!==n){var o=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(t,n,o.get?o:{enumerable:!0,get:function(){return e[n]}})}})),t.default=e,Object.freeze(t)}var d=_interopNamespaceDefault(o),p={exports:{}};const f=n;p.exports=pino;const h=pfGlobalThisOrFallback().console||{},m={mapHttpRequest:mock,mapHttpResponse:mock,wrapRequestSerializer:passthrough,wrapResponseSerializer:passthrough,wrapErrorSerializer:passthrough,req:mock,res:mock,err:asErrValue,errWithCause:asErrValue};function levelToValue(e,t){return"silent"===e?1/0:t.levels.values[e]}const v=Symbol("pino.logFuncs"),g=Symbol("pino.hierarchy"),b={error:"log",fatal:"error",warn:"error",info:"log",debug:"log",trace:"log"};function appendChildLogger(e,t){const n={logger:t,parent:e[g]};t[g]=n}function setupBaseLogFunctions(e,t,n){const o={};t.forEach((e=>{o[e]=n[e]?n[e]:h[e]||h[b[e]||"log"]||noop})),e[v]=o}function shouldSerialize(e,t){if(Array.isArray(e)){const t=undefined;return e.filter((function(e){return"!stdSerializers.err"!==e}))}return!0===e&&Object.keys(t)}function pino(e){(e=e||{}).browser=e.browser||{};const t=e.browser.transmit;if(t&&"function"!=typeof t.send)throw Error("pino: transmit option must have a send function");const n=e.browser.write||h;e.browser.write&&(e.browser.asObject=!0);const o=e.serializers||{},r=shouldSerialize(e.browser.serialize,o);let i=e.browser.serialize;Array.isArray(e.browser.serialize)&&e.browser.serialize.indexOf("!stdSerializers.err")>-1&&(i=!1);const a=Object.keys(e.customLevels||{}),s=["error","fatal","warn","info","debug","trace"].concat(a);"function"==typeof n&&s.forEach((function(e){n[e]=n})),(!1===e.enabled||e.browser.disabled)&&(e.level="silent");const l=e.level||"info",c=Object.create(n);c.log||(c.log=noop),setupBaseLogFunctions(c,s,n),appendChildLogger({},c),Object.defineProperty(c,"levelVal",{get:getLevelVal}),Object.defineProperty(c,"level",{get:getLevel,set:setLevel});const u={transmit:t,serialize:r,asObject:e.browser.asObject,formatters:e.browser.formatters,levels:s,timestamp:getTimeFunction(e),messageKey:e.messageKey||"msg",onChild:e.onChild||noop};function getLevelVal(){return levelToValue(this.level,this)}function getLevel(){return this._level}function setLevel(e){if("silent"!==e&&!this.levels.values[e])throw Error("unknown level "+e);this._level=e,set(this,u,c,"error"),set(this,u,c,"fatal"),set(this,u,c,"warn"),set(this,u,c,"info"),set(this,u,c,"debug"),set(this,u,c,"trace"),a.forEach((e=>{set(this,u,c,e)}))}function child(n,i,a){if(!i)throw new Error("missing bindings for child Pino");a=a||{},r&&i.serializers&&(a.serializers=i.serializers);const s=a.serializers;if(r&&s){var l=Object.assign({},o,s),c=!0===e.browser.serialize?Object.keys(l):r;delete i.serializers,applySerializers([i],c,l,this._stdErrSerialize)}function Child(e){this._childLevel=1+(0|e._childLevel),this.bindings=i,l&&(this.serializers=l,this._serialize=c),t&&(this._logEvent=createLogEventShape([].concat(e._logEvent.bindings,i)))}Child.prototype=this;const u=new Child(this);return appendChildLogger(this,u),u.child=function(...e){return child.call(this,n,...e)},u.level=a.level||this.level,n.onChild(u),u}return c.levels=getLevels(e),c.level=l,c.setMaxListeners=c.getMaxListeners=c.emit=c.addListener=c.on=c.prependListener=c.once=c.prependOnceListener=c.removeListener=c.removeAllListeners=c.listeners=c.listenerCount=c.eventNames=c.write=c.flush=noop,c.serializers=o,c._serialize=r,c._stdErrSerialize=i,c.child=function(...e){return child.call(this,u,...e)},t&&(c._logEvent=createLogEventShape()),c}function getLevels(e){const t=e.customLevels||{},n=undefined,o=undefined;return{values:Object.assign({},pino.levels.values,t),labels:Object.assign({},pino.levels.labels,invertObject(t))}}function invertObject(e){const t={};return Object.keys(e).forEach((function(n){t[e[n]]=n})),t}function getBindingChain(e){const t=[];e.bindings&&t.push(e.bindings);let n=e[g];for(;n.parent;)n=n.parent,n.logger.bindings&&t.push(n.logger.bindings);return t.reverse()}function set(e,t,n,o){if(Object.defineProperty(e,o,{value:levelToValue(e.level,n)>levelToValue(o,n)?noop:n[v][o],writable:!0,enumerable:!0,configurable:!0}),e[o]===noop){if(!t.transmit)return;const r=undefined,i=levelToValue(t.transmit.level||e.level,n),a=undefined;if(levelToValue(o,n)<i)return}e[o]=createWrap(e,t,n,o);const r=getBindingChain(e);0!==r.length&&(e[o]=prependBindingsInArguments(r,e[o]))}function prependBindingsInArguments(e,t){return function(){return t.apply(this,[...e,...arguments])}}function createWrap(e,t,n,o){return r=e[v][o],function LOG(){const i=t.timestamp(),a=new Array(arguments.length),s=Object.getPrototypeOf&&Object.getPrototypeOf(this)===h?h:this;for(var l=0;l<a.length;l++)a[l]=arguments[l];var c=!1;if(t.serialize&&(applySerializers(a,this._serialize,this.serializers,this._stdErrSerialize),c=!0),t.asObject||t.formatters?r.call(s,asObject(this,o,a,i,t)):r.apply(s,a),t.transmit){const r=void 0,s=levelToValue(t.transmit.level||e._level,n),l=levelToValue(o,n);if(l<s)return;transmit(this,{ts:i,methodLevel:o,methodValue:l,transmitValue:n.levels.values[t.transmit.level||e._level],send:t.transmit.send,val:levelToValue(e._level,n)},a,c)}};var r}function asObject(e,t,n,o,r){const{level:i,log:a=e=>e}=r.formatters||{},s=n.slice();let l=s[0];const c={};if(o&&(c.time=o),i){const n=i(t,e.levels.values[t]);Object.assign(c,n)}else c.level=e.levels.values[t];let u=1+(0|e._childLevel);if(u<1&&(u=1),null!==l&&"object"==typeof l){for(;u--&&"object"==typeof s[0];)Object.assign(c,s.shift());l=s.length?f(s.shift(),s):void 0}else"string"==typeof l&&(l=f(s.shift(),s));void 0!==l&&(c[r.messageKey]=l);const d=undefined;return a(c)}function applySerializers(e,t,n,o){for(const r in e)if(o&&e[r]instanceof Error)e[r]=pino.stdSerializers.err(e[r]);else if("object"==typeof e[r]&&!Array.isArray(e[r])&&t)for(const o in e[r])t.indexOf(o)>-1&&o in n&&(e[r][o]=n[o](e[r][o]))}function transmit(e,t,n,o=!1){const r=t.send,i=t.ts,a=t.methodLevel,s=t.methodValue,l=t.val,c=e._logEvent.bindings;o||applySerializers(n,e._serialize||Object.keys(e.serializers),e.serializers,void 0===e._stdErrSerialize||e._stdErrSerialize),e._logEvent.ts=i,e._logEvent.messages=n.filter((function(e){return-1===c.indexOf(e)})),e._logEvent.level.label=a,e._logEvent.level.value=s,r(a,e._logEvent,l),e._logEvent=createLogEventShape(c)}function createLogEventShape(e){return{ts:0,messages:[],bindings:e||[],level:{label:"",value:0}}}function asErrValue(e){const t={type:e.constructor.name,msg:e.message,stack:e.stack};for(const n in e)void 0===t[n]&&(t[n]=e[n]);return t}function getTimeFunction(e){return"function"==typeof e.timestamp?e.timestamp:!1===e.timestamp?nullTime:epochTime}function mock(){return{}}function passthrough(e){return e}function noop(){}function nullTime(){return!1}function epochTime(){return Date.now()}function unixTime(){return Math.round(Date.now()/1e3)}function isoTime(){return new Date(Date.now()).toISOString()}function pfGlobalThisOrFallback(){function defd(e){return void 0!==e&&e}try{return"undefined"!=typeof globalThis||Object.defineProperty(Object.prototype,"globalThis",{get:function(){return delete Object.prototype.globalThis,this.globalThis=this},configurable:!0}),globalThis}catch(e){return defd(self)||defd(window)||defd(this)||{}}}var S;pino.levels={values:{fatal:60,error:50,warn:40,info:30,debug:20,trace:10},labels:{10:"trace",20:"debug",30:"info",40:"warn",50:"error",60:"fatal"}},pino.stdSerializers=m,pino.stdTimeFunctions=Object.assign({},{nullTime:nullTime,epochTime:epochTime,unixTime:unixTime,isoTime:isoTime}),p.exports.default=pino,p.exports.pino=pino;const w=(0,p.exports)({formatters:{level:e=>({level:e})}}),logger_error=(e,t)=>{null!=t?w.error(t,e):w.error(e)},logger_info=(e,t)=>{null!=t?w.info(t,e):w.info(e)},logger_warn=(e,t)=>{null!=t?w.warn(t,e):w.warn(e)},logger_debug=(e,t)=>{null!=t?w.debug(t,e):w.debug(e)};function err(e){const t=new Error(e);if(void 0===t.stack)try{throw t}catch(e){}return t}var _,A=err;function isPromise(e){return!!e&&"function"==typeof e.then}var E=isPromise;function nullthrows(e,t){if(null!=e)return e;throw A(null!=t?t:"Got unexpected null or undefined")}var T=nullthrows;function _defineProperty(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}class V{getValue(){throw A("BaseLoadable")}toPromise(){throw A("BaseLoadable")}valueMaybe(){throw A("BaseLoadable")}valueOrThrow(){throw A(`Loadable expected value, but in "${this.state}" state`)}promiseMaybe(){throw A("BaseLoadable")}promiseOrThrow(){throw A(`Loadable expected promise, but in "${this.state}" state`)}errorMaybe(){throw A("BaseLoadable")}errorOrThrow(){throw A(`Loadable expected error, but in "${this.state}" state`)}is(e){return e.state===this.state&&e.contents===this.contents}map(e){throw A("BaseLoadable")}}class C extends V{constructor(e){super(),_defineProperty(this,"state","hasValue"),_defineProperty(this,"contents",void 0),this.contents=e}getValue(){return this.contents}toPromise(){return Promise.resolve(this.contents)}valueMaybe(){return this.contents}valueOrThrow(){return this.contents}promiseMaybe(){}errorMaybe(){}map(e){try{const t=e(this.contents);return E(t)?loadableWithPromise(t):isLoadable(t)?t:loadableWithValue(t)}catch(t){return E(t)?loadableWithPromise(t.next((()=>this.map(e)))):loadableWithError(t)}}}class k extends V{constructor(e){super(),_defineProperty(this,"state","hasError"),_defineProperty(this,"contents",void 0),this.contents=e}getValue(){throw this.contents}toPromise(){return Promise.reject(this.contents)}valueMaybe(){}promiseMaybe(){}errorMaybe(){return this.contents}errorOrThrow(){return this.contents}map(e){return this}}class N extends V{constructor(e){super(),_defineProperty(this,"state","loading"),_defineProperty(this,"contents",void 0),this.contents=e}getValue(){throw this.contents}toPromise(){return this.contents}valueMaybe(){}promiseMaybe(){return this.contents}promiseOrThrow(){return this.contents}errorMaybe(){}map(e){return loadableWithPromise(this.contents.then((t=>{const n=e(t);if(isLoadable(n)){const e=n;switch(e.state){case"hasValue":case"loading":return e.contents;case"hasError":throw e.contents}}return n})).catch((t=>{if(E(t))return t.then((()=>this.map(e).contents));throw t})))}}function loadableWithValue(e){return Object.freeze(new C(e))}function loadableWithError(e){return Object.freeze(new k(e))}function loadableWithPromise(e){return Object.freeze(new N(e))}function loadableLoading(){return Object.freeze(new N(new Promise((()=>{}))))}function loadableAllArray(e){return e.every((e=>"hasValue"===e.state))?loadableWithValue(e.map((e=>e.contents))):e.some((e=>"hasError"===e.state))?loadableWithError(T(e.find((e=>"hasError"===e.state)),"Invalid loadable passed to loadableAll").contents):loadableWithPromise(Promise.all(e.map((e=>e.contents))))}function loadableAll(e){const t=undefined,n=(Array.isArray(e)?e:Object.getOwnPropertyNames(e).map((t=>e[t]))).map((e=>isLoadable(e)?e:E(e)?loadableWithPromise(e):loadableWithValue(e))),o=loadableAllArray(n);return Array.isArray(e)?o:o.map((t=>Object.getOwnPropertyNames(e).reduce(((e,n,o)=>({...e,[n]:t[o]})),{})))}function isLoadable(e){return e instanceof V}const R={of:e=>E(e)?loadableWithPromise(e):isLoadable(e)?e:loadableWithValue(e),error:e=>loadableWithError(e),loading:()=>loadableLoading(),all:loadableAll,isLoadable:isLoadable};var I={loadableWithValue:loadableWithValue,loadableWithError:loadableWithError,loadableWithPromise:loadableWithPromise,loadableLoading:loadableLoading,loadableAll:loadableAll,isLoadable:isLoadable,RecoilLoadable:R},O=I.loadableWithValue,L=I.loadableWithError,P=I.loadableWithPromise,j=I.loadableLoading,M=I.loadableAll,D=I.isLoadable,B=I.RecoilLoadable,U=Object.freeze({__proto__:null,loadableWithValue:O,loadableWithError:L,loadableWithPromise:P,loadableLoading:j,loadableAll:M,isLoadable:D,RecoilLoadable:B});const F={RECOIL_DUPLICATE_ATOM_KEY_CHECKING_ENABLED:!0,RECOIL_GKS_ENABLED:new Set(["recoil_hamt_2020","recoil_sync_external_store","recoil_suppress_rerender_in_callback","recoil_memory_managament_2020"])};function readProcessEnvBooleanFlag(e,t){var n,o;const r=null===(n=process.env[e])||void 0===n||null===(o=n.toLowerCase())||void 0===o?void 0:o.trim();if(null==r||""===r)return;const i=undefined;if(!["true","false"].includes(r))throw A(`process.env.${e} value must be 'true', 'false', or empty: ${r}`);t("true"===r)}function readProcessEnvStringArrayFlag(e,t){var n;const o=null===(n=process.env[e])||void 0===n?void 0:n.trim();null!=o&&""!==o&&t(o.split(/\s*,\s*|\s+/))}function applyProcessEnvFlagOverrides(){var e;"undefined"!=typeof process&&null!=(null===(e=process)||void 0===e?void 0:e.env)&&(readProcessEnvBooleanFlag("RECOIL_DUPLICATE_ATOM_KEY_CHECKING_ENABLED",(e=>{F.RECOIL_DUPLICATE_ATOM_KEY_CHECKING_ENABLED=e})),readProcessEnvStringArrayFlag("RECOIL_GKS_ENABLED",(e=>{e.forEach((e=>{F.RECOIL_GKS_ENABLED.add(e)}))})))}applyProcessEnvFlagOverrides();var H=F;function Recoil_gkx_OSS(e){return H.RECOIL_GKS_ENABLED.has(e)}Recoil_gkx_OSS.setPass=e=>{H.RECOIL_GKS_ENABLED.add(e)},Recoil_gkx_OSS.setFail=e=>{H.RECOIL_GKS_ENABLED.delete(e)},Recoil_gkx_OSS.clear=()=>{H.RECOIL_GKS_ENABLED.clear()};var W=Recoil_gkx_OSS;function recoverableViolation(e,t,{error:n}={}){return"production"!==process.env.NODE_ENV&&console.error(e,n),null}var $,G=recoverableViolation,K,q,Y;const Z=null!==(K=o.createMutableSource)&&void 0!==K?K:o.unstable_createMutableSource,X=null!==(q=o.useMutableSource)&&void 0!==q?q:o.unstable_useMutableSource,J=null!==(Y=o.useSyncExternalStore)&&void 0!==Y?Y:o.unstable_useSyncExternalStore;let Q=!1;function currentRendererSupportsUseSyncExternalStore(){var e;const{ReactCurrentDispatcher:t,ReactCurrentOwner:n}=o.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,r=undefined,i=null!=(null!==(e=null==t?void 0:t.current)&&void 0!==e?e:n.currentDispatcher).useSyncExternalStore;return!J||i||Q||(Q=!0,G("A React renderer without React 18+ API support is being used with React 18+.")),i}function reactMode(){return W("recoil_transition_support")?{mode:"TRANSITION_SUPPORT",early:!0,concurrent:!0}:W("recoil_sync_external_store")&&null!=J?{mode:"SYNC_EXTERNAL_STORE",early:!0,concurrent:!1}:W("recoil_mutable_source")&&null!=X&&"undefined"!=typeof window&&!window.$disableRecoilValueMutableSource_TEMP_HACK_DO_NOT_USE?W("recoil_suppress_rerender_in_callback")?{mode:"MUTABLE_SOURCE",early:!0,concurrent:!0}:{mode:"MUTABLE_SOURCE",early:!1,concurrent:!1}:W("recoil_suppress_rerender_in_callback")?{mode:"LEGACY",early:!0,concurrent:!1}:{mode:"LEGACY",early:!1,concurrent:!1}}var ee={createMutableSource:Z,useMutableSource:X,useSyncExternalStore:J,currentRendererSupportsUseSyncExternalStore:currentRendererSupportsUseSyncExternalStore,reactMode:reactMode};class te{constructor(e){_defineProperty(this,"key",void 0),this.key=e}toJSON(){return{key:this.key}}}class ne extends te{}class oe extends te{}function isRecoilValue(e){return e instanceof ne||e instanceof oe}var re={AbstractRecoilValue:te,RecoilState:ne,RecoilValueReadOnly:oe,isRecoilValue:isRecoilValue},ie=re.AbstractRecoilValue,ae=re.RecoilState,se=re.RecoilValueReadOnly,le=re.isRecoilValue,ce=Object.freeze({__proto__:null,AbstractRecoilValue:ie,RecoilState:ae,RecoilValueReadOnly:se,isRecoilValue:le});function sprintf(e,...t){let n=0;return e.replace(/%s/g,(()=>String(t[n++])))}var ue=sprintf;function expectationViolation(e,...t){if("production"!==process.env.NODE_ENV){const n=ue.call(null,e,...t),o=new Error(n);o.name="Expectation Violation",console.error(o)}}var de,pe=expectationViolation;function mapIterable(e,t){return function*(){let n=0;for(const o of e)yield t(o,n++)}()}var fe=mapIterable;class he{}const me=new he,ve=new Map,ge=new Map;function recoilValuesForKeys(e){return fe(e,(e=>T(ge.get(e))))}function checkForDuplicateAtomKey(e){if(ve.has(e)){const t=`Duplicate atom key "${e}". This is a FATAL ERROR in\n production. But it is safe to ignore this warning if it occurred because of\n hot module replacement.`;"production"!==process.env.NODE_ENV?pe(t,"recoil"):console.warn(t)}}function registerNode(e){H.RECOIL_DUPLICATE_ATOM_KEY_CHECKING_ENABLED&&checkForDuplicateAtomKey(e.key),ve.set(e.key,e);const t=null==e.set?new ce.RecoilValueReadOnly(e.key):new ce.RecoilState(e.key);return ge.set(e.key,t),t}class ye extends Error{}function getNode(e){const t=ve.get(e);if(null==t)throw new ye(`Missing definition for RecoilValue: "${e}""`);return t}function getNodeMaybe(e){return ve.get(e)}const be=new Map;function deleteNodeConfigIfPossible(e){var t;if(!W("recoil_memory_managament_2020"))return;const n=ve.get(e);var o;null!=n&&null!==(t=n.shouldDeleteConfigOnRelease)&&void 0!==t&&t.call(n)&&(ve.delete(e),null===(o=getConfigDeletionHandler(e))||void 0===o||o(),be.delete(e))}function setConfigDeletionHandler(e,t){W("recoil_memory_managament_2020")&&(void 0===t?be.delete(e):be.set(e,t))}function getConfigDeletionHandler(e){return be.get(e)}var Se={recoilValues:ge,registerNode:registerNode,getNode:getNode,getNodeMaybe:getNodeMaybe,deleteNodeConfigIfPossible:deleteNodeConfigIfPossible,setConfigDeletionHandler:setConfigDeletionHandler,getConfigDeletionHandler:getConfigDeletionHandler,recoilValuesForKeys:recoilValuesForKeys,DefaultValue:he,DEFAULT_VALUE:me};function enqueueExecution(e,t){t()}var xe={enqueueExecution:enqueueExecution};function createCommonjsModule(e,t){return e(t={exports:{}},t.exports),t.exports}var we=createCommonjsModule((function(e){var t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},n={},o=5,r=Math.pow(2,5),i=r-1,a=r/2,s=r/4,l={},c=function constant(e){return function(){return e}},u=n.hash=function(e){var n=void 0===e?"undefined":t(e);if("number"===n)return e;"string"!==n&&(e+="");for(var o=0,r=0,i=e.length;r<i;++r){var a;o=(o<<5)-o+e.charCodeAt(r)|0}return o},d=function popcount(e){return e=(e=(858993459&(e-=e>>1&1431655765))+(e>>2&858993459))+(e>>4)&252645135,e+=e>>8,127&(e+=e>>16)},p=function hashFragment(e,t){return t>>>e&i},f=function toBitmap(e){return 1<<e},h=function fromBitmap(e,t){return d(e&t-1)},m=function arrayUpdate(e,t,n,o){var r=o;if(!e){var i=o.length;r=new Array(i);for(var a=0;a<i;++a)r[a]=o[a]}return r[t]=n,r},v=function arraySpliceOut(e,t,n){var o=n.length-1,r=0,i=0,a=n;if(e)r=i=t;else for(a=new Array(o);r<t;)a[i++]=n[r++];for(++r;r<=o;)a[i++]=n[r++];return e&&(a.length=o),a},g=function arraySpliceIn(e,t,n,o){var r=o.length;if(e){for(var i=r;i>=t;)o[i--]=o[i];return o[t]=n,o}for(var a=0,s=0,l=new Array(r+1);a<t;)l[s++]=o[a++];for(l[t]=n;a<r;)l[++s]=o[a++];return l},b=1,S=2,w=3,_=4,A={__hamt_isEmpty:!0},E=function isEmptyNode(e){return e===A||e&&e.__hamt_isEmpty},T=function Leaf(e,t,n,o){return{type:1,edit:e,hash:t,key:n,value:o,_modify:j}},V=function Collision(e,t,n){return{type:2,edit:e,hash:t,children:n,_modify:M}},C=function IndexedNode(e,t,n){return{type:3,edit:e,mask:t,children:n,_modify:D}},k=function ArrayNode(e,t,n){return{type:4,edit:e,size:t,children:n,_modify:B}},N=function isLeaf(e){return e===A||1===e.type||2===e.type},R=function expand(e,t,n,o,r){for(var i=[],a=o,s=0,l=0;a;++l)1&a&&(i[l]=r[s++]),a>>>=1;return i[t]=n,k(e,s+1,i)},I=function pack(e,t,n,o){for(var r=new Array(t-1),i=0,a=0,s=0,l=o.length;s<l;++s)if(s!==n){var c=o[s];c&&!E(c)&&(r[i++]=c,a|=1<<s)}return C(e,a,r)},O=function mergeLeaves(e,t,n,o,r,i){if(n===r)return V(e,n,[i,o]);var a=p(t,n),s=p(t,r);return C(e,f(a)|f(s),a===s?[mergeLeaves(e,t+5,n,o,r,i)]:a<s?[o,i]:[i,o])},L=function updateCollisionList(e,t,n,o,r,i,a,s){for(var c=r.length,u=0;u<c;++u){var d=r[u];if(n(a,d.key)){var p=d.value,f=i(p);return f===p?r:f===l?(--s.value,v(e,u,r)):m(e,u,T(t,o,a,f),r)}}var h=i();return h===l?r:(++s.value,m(e,c,T(t,o,a,h),r))},P=function canEditNode(e,t){return e===t.edit},j=function Leaf__modify(e,t,n,o,r,i,a){if(t(i,this.key)){var s=o(this.value);return s===this.value?this:s===l?(--a.value,A):P(e,this)?(this.value=s,this):T(e,r,i,s)}var c=o();return c===l?this:(++a.value,O(e,n,this.hash,this,r,T(e,r,i,c)))},M=function Collision__modify(e,t,n,o,r,i,a){if(r===this.hash){var s=P(e,this),c=L(s,e,t,this.hash,this.children,o,i,a);return c===this.children?this:c.length>1?V(e,this.hash,c):c[0]}var u=o();return u===l?this:(++a.value,O(e,n,this.hash,this,r,T(e,r,i,u)))},D=function IndexedNode__modify(e,t,n,o,r,i,s){var l=this.mask,c=this.children,u=p(n,r),d=f(u),b=h(l,d),S=l&d,w=S?c[b]:A,_=w._modify(e,t,n+5,o,r,i,s);if(w===_)return this;var T=P(e,this),V=l,k=void 0;if(S&&E(_)){if(!(V&=~d))return A;if(c.length<=2&&N(c[1^b]))return c[1^b];k=v(T,b,c)}else if(S||E(_))k=m(T,b,_,c);else{if(c.length>=a)return R(e,u,_,l,c);V|=d,k=g(T,b,_,c)}return T?(this.mask=V,this.children=k,this):C(e,V,k)},B=function ArrayNode__modify(e,t,n,o,r,i,a){var l=this.size,c=this.children,u=p(n,r),d=c[u],f=(d||A)._modify(e,t,n+5,o,r,i,a);if(d===f)return this;var h=P(e,this),v=void 0;if(E(d)&&!E(f))++l,v=m(h,u,f,c);else if(!E(d)&&E(f)){if(--l<=s)return I(e,l,u,c);v=m(h,u,A,c)}else v=m(h,u,f,c);return h?(this.size=l,this.children=v,this):k(e,l,v)};function Map(e,t,n,o,r){this._editable=e,this._edit=t,this._config=n,this._root=o,this._size=r}A._modify=function(e,t,n,o,r,i,a){var s=o();return s===l?A:(++a.value,T(e,r,i,s))},Map.prototype.setTree=function(e,t){return this._editable?(this._root=e,this._size=t,this):e===this._root?this:new Map(this._editable,this._edit,this._config,e,t)};var U=n.tryGetHash=function(e,t,n,o){for(var r=o._root,i=0,a=o._config.keyEq;;)switch(r.type){case 1:return a(n,r.key)?r.value:e;case 2:if(t===r.hash)for(var s=r.children,l=0,c=s.length;l<c;++l){var u=s[l];if(a(n,u.key))return u.value}return e;case 3:var d=p(i,t),m=f(d);if(r.mask&m){r=r.children[h(r.mask,m)],i+=5;break}return e;case 4:if(r=r.children[p(i,t)]){i+=5;break}return e;default:return e}};Map.prototype.tryGetHash=function(e,t,n){return U(e,t,n,this)};var F=n.tryGet=function(e,t,n){return U(e,n._config.hash(t),t,n)};Map.prototype.tryGet=function(e,t){return F(e,t,this)};var H=n.getHash=function(e,t,n){return U(void 0,e,t,n)};Map.prototype.getHash=function(e,t){return H(e,t,this)},n.get=function(e,t){return U(void 0,t._config.hash(e),e,t)},Map.prototype.get=function(e,t){return F(t,e,this)};var W=n.has=function(e,t,n){return U(l,e,t,n)!==l};Map.prototype.hasHash=function(e,t){return W(e,t,this)};var $=n.has=function(e,t){return W(t._config.hash(e),e,t)};Map.prototype.has=function(e){return $(e,this)};var G=function defKeyCompare(e,t){return e===t};n.make=function(e){return new Map(0,0,{keyEq:e&&e.keyEq||G,hash:e&&e.hash||u},A,0)},n.empty=n.make();var K=n.isEmpty=function(e){return e&&!!E(e._root)};Map.prototype.isEmpty=function(){return K(this)};var q=n.modifyHash=function(e,t,n,o){var r={value:o._size},i=o._root._modify(o._editable?o._edit:NaN,o._config.keyEq,0,e,t,n,r);return o.setTree(i,r.value)};Map.prototype.modifyHash=function(e,t,n){return q(n,e,t,this)};var Y=n.modify=function(e,t,n){return q(e,n._config.hash(t),t,n)};Map.prototype.modify=function(e,t){return Y(t,e,this)};var Z=n.setHash=function(e,t,n,o){return q(c(n),e,t,o)};Map.prototype.setHash=function(e,t,n){return Z(e,t,n,this)};var X=n.set=function(e,t,n){return Z(n._config.hash(e),e,t,n)};Map.prototype.set=function(e,t){return X(e,t,this)};var J=c(l),Q=n.removeHash=function(e,t,n){return q(J,e,t,n)};Map.prototype.removeHash=Map.prototype.deleteHash=function(e,t){return Q(e,t,this)};var ee=n.remove=function(e,t){return Q(t._config.hash(e),e,t)};Map.prototype.remove=Map.prototype.delete=function(e){return ee(e,this)};var te=n.beginMutation=function(e){return new Map(e._editable+1,e._edit+1,e._config,e._root,e._size)};Map.prototype.beginMutation=function(){return te(this)};var ne=n.endMutation=function(e){return e._editable=e._editable&&e._editable-1,e};Map.prototype.endMutation=function(){return ne(this)};var oe=n.mutate=function(e,t){var n=te(t);return e(n),ne(n)};Map.prototype.mutate=function(e){return oe(e,this)};var re=function appk(e){return e&&ie(e[0],e[1],e[2],e[3],e[4])},ie=function lazyVisitChildren(e,t,n,o,r){for(;n<e;){var i=t[n++];if(i&&!E(i))return ae(i,o,[e,t,n,o,r])}return re(r)},ae=function lazyVisit(e,t,n){switch(e.type){case 1:return{value:t(e),rest:n};case 2:case 4:case 3:var o=e.children;return ie(o.length,o,0,t,n);default:return re(n)}},se={done:!0};function MapIterator(e){this.v=e}MapIterator.prototype.next=function(){if(!this.v)return se;var e=this.v;return this.v=re(e.rest),e},MapIterator.prototype[Symbol.iterator]=function(){return this};var le=function visit(e,t){return new MapIterator(ae(e._root,t))},ce=function buildPairs(e){return[e.key,e.value]},ue=n.entries=function(e){return le(e,ce)};Map.prototype.entries=Map.prototype[Symbol.iterator]=function(){return ue(this)};var de=function buildKeys(e){return e.key},pe=n.keys=function(e){return le(e,de)};Map.prototype.keys=function(){return pe(this)};var fe=function buildValues(e){return e.value},he=n.values=Map.prototype.values=function(e){return le(e,fe)};Map.prototype.values=function(){return he(this)};var me=n.fold=function(e,t,n){var o=n._root;if(1===o.type)return e(t,o.value,o.key);for(var r=[o.children],i=void 0;i=r.pop();)for(var a=0,s=i.length;a<s;){var l=i[a++];l&&l.type&&(1===l.type?t=e(t,l.value,l.key):r.push(l.children))}return t};Map.prototype.fold=function(e,t){return me(e,t,this)};var ve=n.forEach=function(e,t){return me((function(n,o,r){return e(o,r,t)}),null,t)};Map.prototype.forEach=function(e){return ve(e,this)};var ge=n.count=function(e){return e._size};Map.prototype.count=function(){return ge(this)},Object.defineProperty(Map.prototype,"size",{get:Map.prototype.count}),e.exports?e.exports=n:(void 0).hamt=n}));class _e{constructor(e){_defineProperty(this,"_map",void 0),this._map=new Map(null==e?void 0:e.entries())}keys(){return this._map.keys()}entries(){return this._map.entries()}get(e){return this._map.get(e)}has(e){return this._map.has(e)}set(e,t){return this._map.set(e,t),this}delete(e){return this._map.delete(e),this}clone(){return persistentMap(this)}toMap(){return new Map(this._map)}}class Ae{constructor(e){if(_defineProperty(this,"_hamt",we.empty.beginMutation()),e instanceof Ae){const t=e._hamt.endMutation();e._hamt=t.beginMutation(),this._hamt=t.beginMutation()}else if(e)for(const[t,n]of e.entries())this._hamt.set(t,n)}keys(){return this._hamt.keys()}entries(){return this._hamt.entries()}get(e){return this._hamt.get(e)}has(e){return this._hamt.has(e)}set(e,t){return this._hamt.set(e,t),this}delete(e){return this._hamt.delete(e),this}clone(){return persistentMap(this)}toMap(){return new Map(this._hamt)}}function persistentMap(e){return W("recoil_hamt_2020")?new Ae(e):new _e(e)}var Ee,Te=persistentMap,Ve=Object.freeze({__proto__:null,persistentMap:Te});function differenceSets(e,...t){const n=new Set;e:for(const o of e){for(const e of t)if(e.has(o))continue e;n.add(o)}return n}var Ce=differenceSets;function mapMap(e,t){const n=new Map;return e.forEach(((e,o)=>{n.set(o,t(e,o))})),n}var ke=mapMap;function makeGraph(){return{nodeDeps:new Map,nodeToNodeSubscriptions:new Map}}function cloneGraph(e){return{nodeDeps:ke(e.nodeDeps,(e=>new Set(e))),nodeToNodeSubscriptions:ke(e.nodeToNodeSubscriptions,(e=>new Set(e)))}}function mergeDepsIntoGraph(e,t,n,o){const{nodeDeps:r,nodeToNodeSubscriptions:i}=n,a=r.get(e);if(a&&o&&a!==o.nodeDeps.get(e))return;r.set(e,t);const s=null==a?t:Ce(t,a);for(const t of s){i.has(t)||i.set(t,new Set);const n=undefined;T(i.get(t)).add(e)}if(a){const n=Ce(a,t);for(const t of n){if(!i.has(t))return;const n=T(i.get(t));n.delete(e),0===n.size&&i.delete(t)}}}function saveDepsToStore(e,t,n,o){var r,i,a,s;const l=n.getState();o!==l.currentTree.version&&o!==(null===(r=l.nextTree)||void 0===r?void 0:r.version)&&o!==(null===(i=l.previousTree)||void 0===i?void 0:i.version)&&G("Tried to save dependencies to a discarded tree");const c=n.getGraph(o);if(mergeDepsIntoGraph(e,t,c),o===(null===(a=l.previousTree)||void 0===a?void 0:a.version)){const o=undefined;mergeDepsIntoGraph(e,t,n.getGraph(l.currentTree.version),c)}if(o===(null===(s=l.previousTree)||void 0===s?void 0:s.version)||o===l.currentTree.version){var u;const o=null===(u=l.nextTree)||void 0===u?void 0:u.version;if(void 0!==o){const r=undefined;mergeDepsIntoGraph(e,t,n.getGraph(o),c)}}}var Ne={cloneGraph:cloneGraph,graph:makeGraph,saveDepsToStore:saveDepsToStore};let Re=0;const Ie=undefined;let Oe=0;const Le=undefined;let Pe=0;const je=undefined;var Me={getNextTreeStateVersion:()=>Re++,getNextStoreID:()=>Oe++,getNextComponentID:()=>Pe++};const{persistentMap:De}=Ve,{graph:Be}=Ne,{getNextTreeStateVersion:ze}=Me;function makeEmptyTreeState(){const e=ze();return{version:e,stateID:e,transactionMetadata:{},dirtyAtoms:new Set,atomValues:De(),nonvalidatedAtoms:De()}}function makeEmptyStoreState(){const e=makeEmptyTreeState();return{currentTree:e,nextTree:null,previousTree:null,commitDepth:0,knownAtoms:new Set,knownSelectors:new Set,transactionSubscriptions:new Map,nodeTransactionSubscriptions:new Map,nodeToComponentSubscriptions:new Map,queuedComponentCallbacks_DEPRECATED:[],suspendedComponentResolvers:new Set,graphsByVersion:(new Map).set(e.version,Be()),retention:{referenceCounts:new Map,nodesRetainedByZone:new Map,retainablesToCheckForRelease:new Set},nodeCleanupFunctions:new Map}}var Ue={makeEmptyStoreState:makeEmptyStoreState,getNextTreeStateVersion:ze};class Fe{}var He={RetentionZone:Fe};function setByAddingToSet(e,t){const n=new Set(e);return n.add(t),n}var We={setByAddingToSet:setByAddingToSet};function*filterIterable(e,t){let n=0;for(const o of e)t(o,n++)&&(yield o)}var $e=filterIterable;function lazyProxy(e,t){const n=undefined;return new Proxy(e,{get:(e,n)=>(!(n in e)&&n in t&&(e[n]=t[n]()),e[n]),ownKeys:e=>Object.keys(e)})}var Ge=lazyProxy;const{getNode:Ke,getNodeMaybe:qe,recoilValuesForKeys:Ye}=Se,{RetentionZone:Ze}=He,{setByAddingToSet:Xe}=We,Je=Object.freeze(new Set);class Qe extends Error{}function initializeRetentionForNode(e,t,n){if(!W("recoil_memory_managament_2020"))return()=>{};const{nodesRetainedByZone:o}=e.getState().retention;function addToZone(e){let n=o.get(e);n||o.set(e,n=new Set),n.add(t)}if(n instanceof Ze)addToZone(n);else if(Array.isArray(n))for(const e of n)addToZone(e);return()=>{if(!W("recoil_memory_managament_2020"))return;const{retention:o}=e.getState();function deleteFromZone(e){const n=o.nodesRetainedByZone.get(e);null==n||n.delete(t),n&&0===n.size&&o.nodesRetainedByZone.delete(e)}if(n instanceof Ze)deleteFromZone(n);else if(Array.isArray(n))for(const e of n)deleteFromZone(e)}}function initializeNodeIfNewToStore(e,t,n,o){const r=e.getState();if(r.nodeCleanupFunctions.has(n))return;const i=Ke(n),a=initializeRetentionForNode(e,n,i.retainedBy),s=i.init(e,t,o);r.nodeCleanupFunctions.set(n,(()=>{s(),a()}))}function initializeNode(e,t,n){initializeNodeIfNewToStore(e,e.getState().currentTree,t,n)}function cleanUpNode(e,t){var n;const o=e.getState();null===(n=o.nodeCleanupFunctions.get(t))||void 0===n||n(),o.nodeCleanupFunctions.delete(t)}function getNodeLoadable(e,t,n){return initializeNodeIfNewToStore(e,t,n,"get"),Ke(n).get(e,t)}function peekNodeLoadable(e,t,n){return Ke(n).peek(e,t)}function setUnvalidatedAtomValue_DEPRECATED(e,t,n){var o;const r=qe(t);return null==r||null===(o=r.invalidate)||void 0===o||o.call(r,e),{...e,atomValues:e.atomValues.clone().delete(t),nonvalidatedAtoms:e.nonvalidatedAtoms.clone().set(t,n),dirtyAtoms:Xe(e.dirtyAtoms,t)}}function setNodeValue(e,t,n,o){const r=Ke(n);if(null==r.set)throw new Qe(`Attempt to set read-only RecoilValue: ${n}`);const i=r.set;return initializeNodeIfNewToStore(e,t,n,"set"),i(e,t,o)}function peekNodeInfo(e,t,n){const o=e.getState(),r=e.getGraph(t.version),i=Ke(n).nodeType;return Ge({type:i},{loadable:()=>peekNodeLoadable(e,t,n),isActive:()=>o.knownAtoms.has(n)||o.knownSelectors.has(n),isSet:()=>"selector"!==i&&t.atomValues.has(n),isModified:()=>t.dirtyAtoms.has(n),deps:()=>{var e;return Ye(null!==(e=r.nodeDeps.get(n))&&void 0!==e?e:[])},subscribers:()=>{var r,i;return{nodes:Ye($e(getDownstreamNodes(e,t,new Set([n])),(e=>e!==n))),components:fe(null!==(r=null===(i=o.nodeToComponentSubscriptions.get(n))||void 0===i?void 0:i.values())&&void 0!==r?r:[],(([e])=>({name:e})))}}})}function getDownstreamNodes(e,t,n){const o=new Set,r=Array.from(n),i=e.getGraph(t.version);for(let e=r.pop();e;e=r.pop()){var a;o.add(e);const t=null!==(a=i.nodeToNodeSubscriptions.get(e))&&void 0!==a?a:Je;for(const e of t)o.has(e)||r.push(e)}return o}var et={getNodeLoadable:getNodeLoadable,peekNodeLoadable:peekNodeLoadable,setNodeValue:setNodeValue,initializeNode:initializeNode,cleanUpNode:cleanUpNode,setUnvalidatedAtomValue_DEPRECATED:setUnvalidatedAtomValue_DEPRECATED,peekNodeInfo:peekNodeInfo,getDownstreamNodes:getDownstreamNodes};let tt=null;function setInvalidateMemoizedSnapshot(e){tt=e}function invalidateMemoizedSnapshot(){var e;null===(e=tt)||void 0===e||e()}var nt={setInvalidateMemoizedSnapshot:setInvalidateMemoizedSnapshot,invalidateMemoizedSnapshot:invalidateMemoizedSnapshot};const{getDownstreamNodes:ot,getNodeLoadable:rt,setNodeValue:it}=et,{getNextComponentID:at}=Me,{getNode:st,getNodeMaybe:lt}=Se,{DefaultValue:ct}=Se,{reactMode:ut}=ee,{AbstractRecoilValue:dt,RecoilState:pt,RecoilValueReadOnly:ft,isRecoilValue:ht}=ce,{invalidateMemoizedSnapshot:mt}=nt;function getRecoilValueAsLoadable(e,{key:t},n=e.getState().currentTree){var o,r;const i=e.getState();n.version!==i.currentTree.version&&n.version!==(null===(o=i.nextTree)||void 0===o?void 0:o.version)&&n.version!==(null===(r=i.previousTree)||void 0===r?void 0:r.version)&&G("Tried to read from a discarded tree");const a=rt(e,n,t);return"loading"===a.state&&a.contents.catch((()=>{})),a}function applyAtomValueWrites(e,t){const n=e.clone();return t.forEach(((e,t)=>{"hasValue"===e.state&&e.contents instanceof ct?n.delete(t):n.set(t,e)})),n}function valueFromValueOrUpdater(e,t,{key:n},o){if("function"==typeof o){const r=rt(e,t,n);if("loading"===r.state){const e=`Tried to set atom or selector "${n}" using an updater function while the current state is pending, this is not currently supported.`;throw G(e),A(e)}if("hasError"===r.state)throw r.contents;return o(r.contents)}return o}function applyAction(e,t,n){if("set"===n.type){const{recoilValue:o,valueOrUpdater:r}=n,i=valueFromValueOrUpdater(e,t,o,r),a=it(e,t,o.key,i);for(const[e,n]of a.entries())writeLoadableToTreeState(t,e,n)}else if("setLoadable"===n.type){const{recoilValue:{key:e},loadable:o}=n;writeLoadableToTreeState(t,e,o)}else if("markModified"===n.type){const{recoilValue:{key:e}}=n;t.dirtyAtoms.add(e)}else if("setUnvalidated"===n.type){var o;const{recoilValue:{key:e},unvalidatedValue:r}=n,i=lt(e);null==i||null===(o=i.invalidate)||void 0===o||o.call(i,t),t.atomValues.delete(e),t.nonvalidatedAtoms.set(e,r),t.dirtyAtoms.add(e)}else G(`Unknown action ${n.type}`)}function writeLoadableToTreeState(e,t,n){"hasValue"===n.state&&n.contents instanceof ct?e.atomValues.delete(t):e.atomValues.set(t,n),e.dirtyAtoms.add(t),e.nonvalidatedAtoms.delete(t)}function applyActionsToStore(e,t){e.replaceState((n=>{const o=copyTreeState(n);for(const n of t)applyAction(e,o,n);return invalidateDownstreams(e,o),mt(),o}))}function queueOrPerformStateUpdate(e,t){if(vt.length){const n=vt[vt.length-1];let o=n.get(e);o||n.set(e,o=[]),o.push(t)}else applyActionsToStore(e,[t])}const vt=[];function batchStart(){const e=new Map;return vt.push(e),()=>{for(const[t,n]of e)applyActionsToStore(t,n);const t=undefined;vt.pop()!==e&&G("Incorrect order of batch popping")}}function copyTreeState(e){return{...e,atomValues:e.atomValues.clone(),nonvalidatedAtoms:e.nonvalidatedAtoms.clone(),dirtyAtoms:new Set(e.dirtyAtoms)}}function invalidateDownstreams(e,t){const n=ot(e,t,t.dirtyAtoms);for(const e of n){var o,r;null===(o=lt(e))||void 0===o||null===(r=o.invalidate)||void 0===r||r.call(o,t)}}function setRecoilValue(e,t,n){queueOrPerformStateUpdate(e,{type:"set",recoilValue:t,valueOrUpdater:n})}function setRecoilValueLoadable(e,t,n){if(n instanceof ct)return setRecoilValue(e,t,n);queueOrPerformStateUpdate(e,{type:"setLoadable",recoilValue:t,loadable:n})}function markRecoilValueModified(e,t){queueOrPerformStateUpdate(e,{type:"markModified",recoilValue:t})}function setUnvalidatedRecoilValue(e,t,n){queueOrPerformStateUpdate(e,{type:"setUnvalidated",recoilValue:t,unvalidatedValue:n})}function subscribeToRecoilValue(e,{key:t},n,o=null){const r=at(),i=e.getState();i.nodeToComponentSubscriptions.has(t)||i.nodeToComponentSubscriptions.set(t,new Map),T(i.nodeToComponentSubscriptions.get(t)).set(r,[null!=o?o:"<not captured>",n]);const a=ut();if(a.early&&("LEGACY"===a.mode||"MUTABLE_SOURCE"===a.mode)){const o=e.getState().nextTree;o&&o.dirtyAtoms.has(t)&&n(o)}return{release:()=>{const n=e.getState(),o=n.nodeToComponentSubscriptions.get(t);void 0!==o&&o.has(r)?(o.delete(r),0===o.size&&n.nodeToComponentSubscriptions.delete(t)):G(`Subscription missing at release time for atom ${t}. This is a bug in Recoil.`)}}}function refreshRecoilValue(e,t){var n;const{currentTree:o}=e.getState(),r=st(t.key);null===(n=r.clearCache)||void 0===n||n.call(r,e,o)}var gt={AbstractRecoilValue:dt,getRecoilValueAsLoadable:getRecoilValueAsLoadable,setRecoilValue:setRecoilValue,setRecoilValueLoadable:setRecoilValueLoadable,markRecoilValueModified:markRecoilValueModified,setUnvalidatedRecoilValue:setUnvalidatedRecoilValue,subscribeToRecoilValue:subscribeToRecoilValue,applyAtomValueWrites:applyAtomValueWrites,batchStart:batchStart,writeLoadableToTreeState:writeLoadableToTreeState,invalidateDownstreams:invalidateDownstreams,copyTreeState:copyTreeState,refreshRecoilValue:refreshRecoilValue};function someSet(e,t,n){const o=e.entries();let r=o.next();for(;!r.done;){const i=r.value;if(t.call(n,i[1],i[0],e))return!0;r=o.next()}return!1}var yt=someSet;const{cleanUpNode:bt}=et,{deleteNodeConfigIfPossible:St,getNode:xt}=Se,{RetentionZone:wt}=He,_t=12e4,At=new Set;function releaseRetainablesNowOnCurrentTree(e,t){const n=e.getState(),o=n.currentTree;if(n.nextTree)return void G("releaseNodesNowOnCurrentTree should only be called at the end of a batch");const r=new Set;for(const e of t)if(e instanceof wt)for(const t of nodesRetainedByZone(n,e))r.add(t);else r.add(e);const i=findReleasableNodes(e,r);for(const t of i)releaseNode(e,o,t)}function findReleasableNodes(e,t){const n=e.getState(),o=n.currentTree,r=e.getGraph(o.version),i=new Set,a=new Set;return findReleasableNodesInner(t),i;function findReleasableNodesInner(t){const s=new Set,l=getDownstreamNodesInTopologicalOrder(e,o,t,i,a);for(const e of l){var c;if("recoilRoot"===xt(e).retainedBy){a.add(e);continue}if((null!==(c=n.retention.referenceCounts.get(e))&&void 0!==c?c:0)>0){a.add(e);continue}if(zonesThatCouldRetainNode(e).some((e=>n.retention.referenceCounts.get(e)))){a.add(e);continue}const t=r.nodeToNodeSubscriptions.get(e);t&&yt(t,(e=>a.has(e)))?a.add(e):(i.add(e),s.add(e))}const u=new Set;for(const e of s)for(const t of null!==(d=r.nodeDeps.get(e))&&void 0!==d?d:At){var d;i.has(t)||u.add(t)}u.size&&findReleasableNodesInner(u)}}function getDownstreamNodesInTopologicalOrder(e,t,n,o,r){const i=e.getGraph(t.version),a=[],s=new Set;for(;n.size>0;)visit(T(n.values().next().value));return a;function visit(e){if(o.has(e)||r.has(e))return void n.delete(e);if(s.has(e))return;const t=i.nodeToNodeSubscriptions.get(e);if(t)for(const e of t)visit(e);s.add(e),n.delete(e),a.push(e)}}function releaseNode(e,t,n){if(!W("recoil_memory_managament_2020"))return;bt(e,n);const o=e.getState();o.knownAtoms.delete(n),o.knownSelectors.delete(n),o.nodeTransactionSubscriptions.delete(n),o.retention.referenceCounts.delete(n);const r=zonesThatCouldRetainNode(n);for(const e of r){var i;null===(i=o.retention.nodesRetainedByZone.get(e))||void 0===i||i.delete(n)}t.atomValues.delete(n),t.dirtyAtoms.delete(n),t.nonvalidatedAtoms.delete(n);const a=o.graphsByVersion.get(t.version);if(a){const e=a.nodeDeps.get(n);if(void 0!==e){a.nodeDeps.delete(n);for(const t of e){var s;null===(s=a.nodeToNodeSubscriptions.get(t))||void 0===s||s.delete(n)}}a.nodeToNodeSubscriptions.delete(n)}St(n)}function nodesRetainedByZone(e,t){var n;return null!==(n=e.retention.nodesRetainedByZone.get(t))&&void 0!==n?n:At}function zonesThatCouldRetainNode(e){const t=xt(e).retainedBy;return void 0===t||"components"===t||"recoilRoot"===t?[]:t instanceof wt?[t]:t}function scheduleOrPerformPossibleReleaseOfRetainable(e,t){const n=e.getState();n.nextTree?n.retention.retainablesToCheckForRelease.add(t):releaseRetainablesNowOnCurrentTree(e,new Set([t]))}function updateRetainCount(e,t,n){var o;if(!W("recoil_memory_managament_2020"))return;const r=e.getState().retention.referenceCounts,i=(null!==(o=r.get(t))&&void 0!==o?o:0)+n;0===i?updateRetainCountToZero(e,t):r.set(t,i)}function updateRetainCountToZero(e,t){if(!W("recoil_memory_managament_2020"))return;const n=undefined;e.getState().retention.referenceCounts.delete(t),scheduleOrPerformPossibleReleaseOfRetainable(e,t)}function releaseScheduledRetainablesNow(e){if(!W("recoil_memory_managament_2020"))return;const t=e.getState();releaseRetainablesNowOnCurrentTree(e,t.retention.retainablesToCheckForRelease),t.retention.retainablesToCheckForRelease.clear()}function retainedByOptionWithDefault(e){return void 0===e?"recoilRoot":e}var Et={SUSPENSE_TIMEOUT_MS:_t,updateRetainCount:updateRetainCount,releaseScheduledRetainablesNow:releaseScheduledRetainablesNow,retainedByOptionWithDefault:retainedByOptionWithDefault};const{unstable_batchedUpdates:Tt}=r;var Vt={unstable_batchedUpdates:Tt};const{unstable_batchedUpdates:Ct}=Vt;var kt={unstable_batchedUpdates:Ct};const{batchStart:Nt}=gt,{unstable_batchedUpdates:Rt}=kt;let It=Rt||(e=>e());const Ot=undefined;var Lt={batchUpdates:e=>{It((()=>{let batchEnd=()=>{};try{batchEnd=Nt(),e()}finally{batchEnd()}}))}};function*concatIterables(e){for(const t of e)for(const e of t)yield e}var Pt=concatIterables;const jt="undefined"==typeof Window||"undefined"==typeof window,isWindow=e=>!jt&&(e===window||e instanceof Window),Mt="undefined"!=typeof navigator&&"ReactNative"===navigator.product;var Dt={isSSR:jt,isReactNative:Mt,isWindow:isWindow};function memoizeOneWithArgsHashAndInvalidation(e,t){let n,o;const r=undefined,i=undefined;return[(...r)=>{const i=t(...r);return n===i||(n=i,o=e(...r)),o},()=>{n=null}]}var Bt={memoizeOneWithArgsHashAndInvalidation:memoizeOneWithArgsHashAndInvalidation};const{batchUpdates:zt}=Lt,{initializeNode:Ut,peekNodeInfo:Ft}=et,{graph:Ht}=Ne,{getNextStoreID:Wt}=Me,{DEFAULT_VALUE:$t,recoilValues:Gt,recoilValuesForKeys:Kt}=Se,{AbstractRecoilValue:qt,getRecoilValueAsLoadable:Yt,setRecoilValue:Zt,setUnvalidatedRecoilValue:Xt}=gt,{updateRetainCount:Jt}=Et,{setInvalidateMemoizedSnapshot:Qt}=nt,{getNextTreeStateVersion:en,makeEmptyStoreState:tn}=Ue,{isSSR:nn}=Dt,{memoizeOneWithArgsHashAndInvalidation:on}=Bt,rn="\nRecoil Snapshots only last for the duration of the callback they are provided to. To keep a Snapshot longer, do this:\n\n const release = snapshot.retain();\n try {\n await doSomethingWithSnapshot(snapshot);\n } finally {\n release();\n }\n\nThis is currently a DEV-only warning but will become a thrown exception in the next release of Recoil.\n";class an{constructor(e,t){_defineProperty(this,"_store",void 0),_defineProperty(this,"_refCount",1),_defineProperty(this,"getLoadable",(e=>(this.checkRefCount_INTERNAL(),Yt(this._store,e)))),_defineProperty(this,"getPromise",(e=>(this.checkRefCount_INTERNAL(),this.getLoadable(e).toPromise()))),_defineProperty(this,"getNodes_UNSTABLE",(e=>{if(this.checkRefCount_INTERNAL(),!0===(null==e?void 0:e.isModified)){if(!1===(null==e?void 0:e.isInitialized))return[];const t=this._store.getState().currentTree;return Kt(t.dirtyAtoms)}const t=this._store.getState().knownAtoms,n=this._store.getState().knownSelectors;return null==(null==e?void 0:e.isInitialized)?Gt.values():!0===e.isInitialized?Kt(Pt([t,n])):$e(Gt.values(),(({key:e})=>!t.has(e)&&!n.has(e)))})),_defineProperty(this,"getInfo_UNSTABLE",(({key:e})=>(this.checkRefCount_INTERNAL(),Ft(this._store,this._store.getState().currentTree,e)))),_defineProperty(this,"map",(e=>{this.checkRefCount_INTERNAL();const t=new cn(this,zt);return e(t),t})),_defineProperty(this,"asyncMap",(async e=>{this.checkRefCount_INTERNAL();const t=new cn(this,zt);return t.retain(),await e(t),t.autoRelease_INTERNAL(),t})),this._store={storeID:Wt(),parentStoreID:t,getState:()=>e,replaceState:t=>{e.currentTree=t(e.currentTree)},getGraph:t=>{const n=e.graphsByVersion;if(n.has(t))return T(n.get(t));const o=Ht();return n.set(t,o),o},subscribeToTransactions:()=>({release:()=>{}}),addTransactionMetadata:()=>{throw A("Cannot subscribe to Snapshots")}};for(const e of this._store.getState().knownAtoms)Ut(this._store,e,"get"),Jt(this._store,e,1);this.autoRelease_INTERNAL()}retain(){if(this._refCount<=0){if("production"!==process.env.NODE_ENV)throw A("Snapshot has already been released.");G("Attempt to retain() Snapshot that was already released.")}this._refCount++;let e=!1;return()=>{e||(e=!0,this._release())}}autoRelease_INTERNAL(){nn||window.setTimeout((()=>this._release()),10)}_release(){if(this._refCount--,0===this._refCount){if(this._store.getState().nodeCleanupFunctions.forEach((e=>e())),this._store.getState().nodeCleanupFunctions.clear(),!W("recoil_memory_managament_2020"))return}else this._refCount<0&&"production"!==process.env.NODE_ENV&&G("Snapshot released an extra time.")}isRetained(){return this._refCount>0}checkRefCount_INTERNAL(){W("recoil_memory_managament_2020")&&this._refCount<=0&&"production"!==process.env.NODE_ENV&&G(rn)}getStore_INTERNAL(){return this.checkRefCount_INTERNAL(),this._store}getID(){return this.checkRefCount_INTERNAL(),this._store.getState().currentTree.stateID}getStoreID(){return this.checkRefCount_INTERNAL(),this._store.storeID}}function cloneStoreState(e,t,n=!1){const o=e.getState(),r=n?en():t.version;return{currentTree:{version:n?r:t.version,stateID:n?r:t.stateID,transactionMetadata:{...t.transactionMetadata},dirtyAtoms:new Set(t.dirtyAtoms),atomValues:t.atomValues.clone(),nonvalidatedAtoms:t.nonvalidatedAtoms.clone()},commitDepth:0,nextTree:null,previousTree:null,knownAtoms:new Set(o.knownAtoms),knownSelectors:new Set(o.knownSelectors),transactionSubscriptions:new Map,nodeTransactionSubscriptions:new Map,nodeToComponentSubscriptions:new Map,queuedComponentCallbacks_DEPRECATED:[],suspendedComponentResolvers:new Set,graphsByVersion:(new Map).set(r,e.getGraph(t.version)),retention:{referenceCounts:new Map,nodesRetainedByZone:new Map,retainablesToCheckForRelease:new Set},nodeCleanupFunctions:new Map(fe(o.nodeCleanupFunctions.entries(),(([e])=>[e,()=>{}])))}}function freshSnapshot(e){const t=new an(tn());return null!=e?t.map(e):t}const[sn,ln]=on(((e,t)=>{var n;const o=e.getState(),r="latest"===t?null!==(n=o.nextTree)&&void 0!==n?n:o.currentTree:T(o.previousTree);return new an(cloneStoreState(e,r),e.storeID)}),((e,t)=>{var n,o;return String(t)+String(e.storeID)+String(null===(n=e.getState().nextTree)||void 0===n?void 0:n.version)+String(e.getState().currentTree.version)+String(null===(o=e.getState().previousTree)||void 0===o?void 0:o.version)}));function cloneSnapshot(e,t="latest"){const n=sn(e,t);return n.isRetained()?n:(ln(),sn(e,t))}Qt(ln);class cn extends an{constructor(e,t){super(cloneStoreState(e.getStore_INTERNAL(),e.getStore_INTERNAL().getState().currentTree,!0),e.getStoreID()),_defineProperty(this,"_batch",void 0),_defineProperty(this,"set",((e,t)=>{this.checkRefCount_INTERNAL();const n=this.getStore_INTERNAL();this._batch((()=>{Jt(n,e.key,1),Zt(this.getStore_INTERNAL(),e,t)}))})),_defineProperty(this,"reset",(e=>{this.checkRefCount_INTERNAL();const t=this.getStore_INTERNAL();this._batch((()=>{Jt(t,e.key,1),Zt(this.getStore_INTERNAL(),e,$t)}))})),_defineProperty(this,"setUnvalidatedAtomValues_DEPRECATED",(e=>{this.checkRefCount_INTERNAL();const t=this.getStore_INTERNAL();zt((()=>{for(const[n,o]of e.entries())Jt(t,n,1),Xt(t,new qt(n),o)}))})),this._batch=t}}var un={Snapshot:an,MutableSnapshot:cn,freshSnapshot:freshSnapshot,cloneSnapshot:cloneSnapshot},dn=un.Snapshot,pn=un.MutableSnapshot,fn=un.freshSnapshot,hn=un.cloneSnapshot,mn=Object.freeze({__proto__:null,Snapshot:dn,MutableSnapshot:pn,freshSnapshot:fn,cloneSnapshot:hn});function unionSets(...e){const t=new Set;for(const n of e)for(const e of n)t.add(e);return t}var vn=unionSets;const{useRef:gn}=o;function useRefInitOnce(e){const t=gn(e);return t.current===e&&"function"==typeof e&&(t.current=e()),t}var yn=useRefInitOnce;const{getNextTreeStateVersion:bn,makeEmptyStoreState:Sn}=Ue,{cleanUpNode:xn,getDownstreamNodes:wn,initializeNode:_n,setNodeValue:An,setUnvalidatedAtomValue_DEPRECATED:En}=et,{graph:Tn}=Ne,{cloneGraph:Vn}=Ne,{getNextStoreID:Cn}=Me,{createMutableSource:kn,reactMode:Nn}=ee,{applyAtomValueWrites:Rn}=gt,{releaseScheduledRetainablesNow:In}=Et,{freshSnapshot:On}=mn,{useCallback:Ln,useContext:Pn,useEffect:jn,useMemo:Mn,useRef:Dn,useState:Bn}=o;function notInAContext(){throw A("This component must be used inside a <RecoilRoot> component.")}const zn=Object.freeze({storeID:Cn(),getState:notInAContext,replaceState:notInAContext,getGraph:notInAContext,subscribeToTransactions:notInAContext,addTransactionMetadata:notInAContext});let Un=!1;function startNextTreeIfNeeded(e){if(Un)throw A("An atom update was triggered within the execution of a state updater function. State updater functions provided to Recoil must be pure functions.");const t=e.getState();if(null===t.nextTree){W("recoil_memory_managament_2020")&&W("recoil_release_on_cascading_update_killswitch_2021")&&t.commitDepth>0&&In(e);const n=t.currentTree.version,o=bn();t.nextTree={...t.currentTree,version:o,stateID:o,dirtyAtoms:new Set,transactionMetadata:{}},t.graphsByVersion.set(o,Vn(T(t.graphsByVersion.get(n))))}}const Fn=o.createContext({current:zn}),useStoreRef=()=>Pn(Fn),Hn=o.createContext(null);function useRecoilMutableSource(){const e=Pn(Hn);return null==e&&pe("Attempted to use a Recoil hook outside of a <RecoilRoot>. <RecoilRoot> must be an ancestor of any component that uses Recoil hooks."),e}function notifyComponents(e,t,n){const o=wn(e,n,n.dirtyAtoms);for(const e of o){const o=t.nodeToComponentSubscriptions.get(e);if(o)for(const[e,[t,r]]of o)r(n)}}function sendEndOfBatchNotifications(e){const t=e.getState(),n=t.currentTree,o=n.dirtyAtoms;if(o.size){for(const[n,r]of t.nodeTransactionSubscriptions)if(o.has(n))for(const[t,n]of r)n(e);for(const[n,o]of t.transactionSubscriptions)o(e);(!Nn().early||t.suspendedComponentResolvers.size>0)&&(notifyComponents(e,t,n),t.suspendedComponentResolvers.forEach((e=>e())),t.suspendedComponentResolvers.clear())}t.queuedComponentCallbacks_DEPRECATED.forEach((e=>e(n))),t.queuedComponentCallbacks_DEPRECATED.splice(0,t.queuedComponentCallbacks_DEPRECATED.length)}function endBatch(e){const t=e.getState();t.commitDepth++;try{const{nextTree:n}=t;if(null==n)return;t.previousTree=t.currentTree,t.currentTree=n,t.nextTree=null,sendEndOfBatchNotifications(e),null!=t.previousTree?t.graphsByVersion.delete(t.previousTree.version):G("Ended batch with no previous state, which is unexpected","recoil"),t.previousTree=null,W("recoil_memory_managament_2020")&&null==n&&In(e)}finally{t.commitDepth--}}function Batcher({setNotifyBatcherOfChange:e}){const t=useStoreRef(),[,n]=Bn([]);return e((()=>n({}))),jn((()=>(e((()=>n({}))),()=>{e((()=>{}))})),[e]),jn((()=>{xe.enqueueExecution("Batcher",(()=>{endBatch(t.current)}))})),null}function initialStoreState_DEPRECATED(e,t){const n=Sn();return t({set:(t,o)=>{const r=n.currentTree,i=An(e,r,t.key,o),a=new Set(i.keys()),s=r.nonvalidatedAtoms.clone();for(const e of a)s.delete(e);n.currentTree={...r,dirtyAtoms:vn(r.dirtyAtoms,a),atomValues:Rn(r.atomValues,i),nonvalidatedAtoms:s}},setUnvalidatedAtomValues:e=>{e.forEach(((e,t)=>{n.currentTree=En(n.currentTree,t,e)}))}}),n}function initialStoreState(e){const t=On(e),n=t.getStore_INTERNAL().getState();return t.retain(),n.nodeCleanupFunctions.forEach((e=>e())),n.nodeCleanupFunctions.clear(),n}"production"!==process.env.NODE_ENV&&("undefined"==typeof window||window.$recoilDebugStates||(window.$recoilDebugStates=[]));let Wn=0;function RecoilRoot_INTERNAL({initializeState_DEPRECATED:e,initializeState:t,store_INTERNAL:n,children:r}){let i;const getGraph=e=>{const t=i.current.graphsByVersion;if(t.has(e))return T(t.get(e));const n=Tn();return t.set(e,n),n},subscribeToTransactions=(e,t)=>{if(null==t){const{transactionSubscriptions:t}=l.current.getState(),n=Wn++;return t.set(n,e),{release:()=>{t.delete(n)}}}{const{nodeTransactionSubscriptions:n}=l.current.getState();n.has(t)||n.set(t,new Map);const o=Wn++;return T(n.get(t)).set(o,e),{release:()=>{const e=n.get(t);e&&(e.delete(o),0===e.size&&n.delete(t))}}}},addTransactionMetadata=e=>{startNextTreeIfNeeded(l.current);for(const t of Object.keys(e))T(l.current.getState().nextTree).transactionMetadata[t]=e[t]},replaceState=e=>{startNextTreeIfNeeded(l.current);const t=T(i.current.nextTree);let n;try{Un=!0,n=e(t)}finally{Un=!1}n!==t&&("production"!==process.env.NODE_ENV&&"undefined"!=typeof window&&window.$recoilDebugStates.push(n),i.current.nextTree=n,Nn().early&¬ifyComponents(l.current,i.current,n),T(a.current)())},a=Dn(null),s=Ln((e=>{a.current=e}),[a]),l=yn((()=>null!=n?n:{storeID:Cn(),getState:()=>i.current,replaceState:replaceState,getGraph:getGraph,subscribeToTransactions:subscribeToTransactions,addTransactionMetadata:addTransactionMetadata}));null!=n&&(l.current=n),i=yn((()=>null!=e?initialStoreState_DEPRECATED(l.current,e):null!=t?initialStoreState(t):Sn()));const c=Mn((()=>null==kn?void 0:kn(i,(()=>i.current.currentTree.version))),[i]);return jn((()=>{const e=l.current;for(const t of new Set(e.getState().knownAtoms))_n(e,t,"get");return()=>{for(const t of e.getState().knownAtoms)xn(e,t)}}),[l]),o.createElement(Fn.Provider,{value:l},o.createElement(Hn.Provider,{value:c},o.createElement(Batcher,{setNotifyBatcherOfChange:s}),r))}function RecoilRoot(e){const{override:t,...n}=e,r=useStoreRef();return!1===t&&r.current!==zn?e.children:o.createElement(RecoilRoot_INTERNAL,n)}var $n={RecoilRoot:RecoilRoot,useStoreRef:useStoreRef,useRecoilMutableSource:useRecoilMutableSource};function shallowArrayEqual(e,t){if(e===t)return!0;if(e.length!==t.length)return!1;for(let n=0,o=e.length;n<o;n++)if(e[n]!==t[n])return!1;return!0}var Gn=shallowArrayEqual;const{useEffect:Kn,useRef:qn}=o;function usePrevious(e){const t=qn();return Kn((()=>{t.current=e})),t.current}var Yn=usePrevious;const{useStoreRef:Zn}=$n,{SUSPENSE_TIMEOUT_MS:Xn}=Et,{updateRetainCount:Jn}=Et,{RetentionZone:Qn}=He,{useEffect:eo,useRef:to}=o,{isSSR:no}=Dt;function useRetain(e){if(W("recoil_memory_managament_2020"))return useRetain_ACTUAL(e)}function useRetain_ACTUAL(e){const t=undefined,n=(Array.isArray(e)?e:[e]).map((e=>e instanceof Qn?e:e.key)),o=Zn();eo((()=>{if(!W("recoil_memory_managament_2020"))return;const e=o.current;if(r.current&&!no)window.clearTimeout(r.current),r.current=null;else for(const t of n)Jn(e,t,1);return()=>{for(const t of n)Jn(e,t,-1)}}),[o,...n]);const r=to(),i=Yn(n);if(!(no||void 0!==i&&Gn(i,n))){const e=o.current;for(const t of n)Jn(e,t,1);if(i)for(const t of i)Jn(e,t,-1);r.current&&window.clearTimeout(r.current),r.current=window.setTimeout((()=>{r.current=null;for(const t of n)Jn(e,t,-1)}),Xn)}}var oo=useRetain;function useComponentName(){return"<component name not available>"}var ro=useComponentName;const{currentRendererSupportsUseSyncExternalStore:io,reactMode:ao,useMutableSource:so,useSyncExternalStore:lo}=ee,{useRecoilMutableSource:co,useStoreRef:uo}=$n,{isRecoilValue:po}=ce,{getRecoilValueAsLoadable:fo,setRecoilValue:ho,subscribeToRecoilValue:mo}=gt,{useCallback:vo,useEffect:go,useMemo:yo,useRef:bo,useState:So}=o,{isSSR:xo}=Dt;function handleLoadable(e,t,n){if("hasValue"===e.state)return e.contents;if("loading"===e.state){const t=undefined;throw new Promise((t=>{const o=n.current.getState().suspendedComponentResolvers;o.add(t),xo&&E(e.contents)&&e.contents.finally((()=>{o.delete(t)}))}))}throw"hasError"===e.state?e.contents:A(`Invalid value of loadable atom "${t.key}"`)}function validateRecoilValue(e,t){if(!po(e))throw A(`Invalid argument to ${t}: expected an atom or selector but got ${String(e)}`)}function useRecoilValueLoadable_SYNC_EXTERNAL_STORE(e){const t=uo(),n=ro(),o=vo((()=>{var n;process.env.NODE_ENV;const o=t.current,r=o.getState(),i=ao().early&&null!==(n=r.nextTree)&&void 0!==n?n:r.currentTree,a=undefined;return{loadable:fo(o,e,i),key:e.key}}),[t,e]),r=vo((e=>{let t;return()=>{var n,o;const r=e();return null!==(n=t)&&void 0!==n&&n.loadable.is(r.loadable)&&(null===(o=t)||void 0===o?void 0:o.key)===r.key?t:(t=r,r)}}),[]),i=yo((()=>r(o)),[o,r]),a=vo((o=>{const r=t.current,i=undefined;return mo(r,e,o,n).release}),[t,e,n]);return lo(a,i,i).loadable}function useRecoilValueLoadable_MUTABLE_SOURCE(e){const t=uo(),n=vo((()=>{var n;const o=t.current,r=o.getState(),i=ao().early&&null!==(n=r.nextTree)&&void 0!==n?n:r.currentTree;return fo(o,e,i)}),[t,e]),o=vo((()=>(process.env.NODE_ENV,n())),[n]),r=ro(),i=vo(((o,i)=>{const a=t.current,s=undefined;return mo(a,e,(()=>{if(!W("recoil_suppress_rerender_in_callback"))return i();const e=n();l.current.is(e)||i(),l.current=e}),r).release}),[t,e,r,n]),a=co();if(null==a)throw A("Recoil hooks must be used in components contained within a <RecoilRoot> component.");const s=so(a,o,i),l=bo(s);return go((()=>{l.current=s})),s}function useRecoilValueLoadable_TRANSITION_SUPPORT(e){const t=uo(),n=ro(),o=vo((()=>{var n;process.env.NODE_ENV;const o=t.current,r=o.getState(),i=ao().early&&null!==(n=r.nextTree)&&void 0!==n?n:r.currentTree;return fo(o,e,i)}),[t,e]),r=vo((()=>({loadable:o(),key:e.key})),[o,e.key]),i=vo((e=>{const t=r();return e.loadable.is(t.loadable)&&e.key===t.key?e:t}),[r]);go((()=>{const o=mo(t.current,e,(e=>{s(i)}),n);return s(i),o.release}),[n,e,t,i]);const[a,s]=So(r);return a.key!==e.key?r().loadable:a.loadable}function useRecoilValueLoadable_LEGACY(e){const t=uo(),[,n]=So([]),o=ro(),r=vo((()=>{var n;process.env.NODE_ENV;const o=t.current,r=o.getState(),i=ao().early&&null!==(n=r.nextTree)&&void 0!==n?n:r.currentTree;return fo(o,e,i)}),[t,e]),i=r(),a=bo(i);return go((()=>{a.current=i})),go((()=>{const i=t.current,s=i.getState(),l=mo(i,e,(e=>{var t;if(!W("recoil_suppress_rerender_in_callback"))return n([]);const o=r();null!==(t=a.current)&&void 0!==t&&t.is(o)||n(o),a.current=o}),o);if(s.nextTree)i.getState().queuedComponentCallbacks_DEPRECATED.push((()=>{a.current=null,n([])}));else{var c;if(!W("recoil_suppress_rerender_in_callback"))return n([]);const e=r();null!==(c=a.current)&&void 0!==c&&c.is(e)||n(e),a.current=e}return l.release}),[o,r,e,t]),i}function useRecoilValueLoadable(e){return"production"!==process.env.NODE_ENV&&validateRecoilValue(e,"useRecoilValueLoadable"),W("recoil_memory_managament_2020")&&oo(e),{TRANSITION_SUPPORT:useRecoilValueLoadable_TRANSITION_SUPPORT,SYNC_EXTERNAL_STORE:io()?useRecoilValueLoadable_SYNC_EXTERNAL_STORE:useRecoilValueLoadable_TRANSITION_SUPPORT,MUTABLE_SOURCE:useRecoilValueLoadable_MUTABLE_SOURCE,LEGACY:useRecoilValueLoadable_LEGACY}[ao().mode](e)}function useRecoilValue(e){"production"!==process.env.NODE_ENV&&validateRecoilValue(e,"useRecoilValue");const t=uo(),n=undefined;return handleLoadable(useRecoilValueLoadable(e),e,t)}function useSetRecoilState(e){"production"!==process.env.NODE_ENV&&validateRecoilValue(e,"useSetRecoilState");const t=uo();return vo((n=>{ho(t.current,e,n)}),[t,e])}function useRecoilState(e){return"production"!==process.env.NODE_ENV&&validateRecoilValue(e,"useRecoilState"),[useRecoilValue(e),useSetRecoilState(e)]}var wo={useRecoilState:useRecoilState,useRecoilValue:useRecoilValue,useRecoilValueLoadable:useRecoilValueLoadable,useSetRecoilState:useSetRecoilState};const{batchUpdates:_o}=Lt,{DEFAULT_VALUE:Ao,getNode:Eo}=Se,{AbstractRecoilValue:To,setRecoilValueLoadable:Vo}=gt,{cloneSnapshot:Co}=mn,{useCallback:ko,useEffect:No,useRef:Ro,useState:Io}=o;function gotoSnapshot(e,t){var n;const o=e.getState(),r=null!==(n=o.nextTree)&&void 0!==n?n:o.currentTree,i=t.getStore_INTERNAL().getState().currentTree;_o((()=>{const n=new Set;for(const e of[r.atomValues.keys(),i.atomValues.keys()])for(const t of e){var o,a;(null===(o=r.atomValues.get(t))||void 0===o?void 0:o.contents)!==(null===(a=i.atomValues.get(t))||void 0===a?void 0:a.contents)&&Eo(t).shouldRestoreFromSnapshots&&n.add(t)}n.forEach((t=>{Vo(e,new To(t),i.atomValues.has(t)?T(i.atomValues.get(t)):Ao)})),e.replaceState((e=>({...e,stateID:t.getID()})))}))}var Oo={gotoSnapshot:gotoSnapshot};const{useMemo:Lo}=o,{loadableWithValue:Po}=U,{initializeNode:jo}=et,{DEFAULT_VALUE:Mo,getNode:Do}=Se,{copyTreeState:Bo,getRecoilValueAsLoadable:zo,invalidateDownstreams:Uo,writeLoadableToTreeState:Fo}=gt;function isAtom(e){return"atom"===Do(e.key).nodeType}class Ho{constructor(e,t){_defineProperty(this,"_store",void 0),_defineProperty(this,"_treeState",void 0),_defineProperty(this,"_changes",void 0),_defineProperty(this,"get",(e=>{if(this._changes.has(e.key))return this._changes.get(e.key);if(!isAtom(e))throw A("Reading selectors within atomicUpdate is not supported");const t=zo(this._store,e,this._treeState);if("hasValue"===t.state)return t.contents;throw"hasError"===t.state?t.contents:A(`Expected Recoil atom ${e.key} to have a value, but it is in a loading state.`)})),_defineProperty(this,"set",((e,t)=>{if(!isAtom(e))throw A("Setting selectors within atomicUpdate is not supported");if("function"==typeof t){const n=this.get(e);this._changes.set(e.key,t(n))}else jo(this._store,e.key,"set"),this._changes.set(e.key,t)})),_defineProperty(this,"reset",(e=>{this.set(e,Mo)})),this._store=e,this._treeState=t,this._changes=new Map}newTreeState_INTERNAL(){if(0===this._changes.size)return this._treeState;const e=Bo(this._treeState);for(const[t,n]of this._changes)Fo(e,t,Po(n));return Uo(this._store,e),e}}function atomicUpdater(e){return t=>{e.replaceState((n=>{const o=new Ho(e,n);return t(o),o.newTreeState_INTERNAL()}))}}var Wo,$o=atomicUpdater,Go=Object.freeze({__proto__:null,atomicUpdater:$o});function invariant(e,t){if(!e)throw new Error(t)}var Ko,qo=invariant;const{atomicUpdater:Yo}=Go,{batchUpdates:Zo}=Lt,{DEFAULT_VALUE:Xo}=Se,{useStoreRef:Jo}=$n,{refreshRecoilValue:Qo,setRecoilValue:er}=gt,{cloneSnapshot:tr}=mn,{gotoSnapshot:nr}=Oo,{useCallback:or}=o;class rr{}const ir=new rr;function recoilCallback(e,t,n,o){let r=ir,i;var a;(Zo((()=>{const a="useRecoilCallback() expects a function that returns a function: it accepts a function of the type (RecoilInterface) => (Args) => ReturnType and returns a callback function (Args) => ReturnType, where RecoilInterface is an object {snapshot, set, ...} and Args and ReturnType are the argument and return types of the callback you want to create. Please see the docs at recoiljs.org for details.";if("function"!=typeof t)throw A(a);const s=Ge({...null!=o?o:{},set:(t,n)=>er(e,t,n),reset:t=>er(e,t,Xo),refresh:t=>Qo(e,t),gotoSnapshot:t=>nr(e,t),transact_UNSTABLE:t=>Yo(e)(t)},{snapshot:()=>{const t=tr(e);return i=t.retain(),t}}),l=t(s);if("function"!=typeof l)throw A(a);r=l(...n)})),r instanceof rr&&("production"!==process.env.NODE_ENV?qo(!1,"batchUpdates should return immediately"):qo(!1)),E(r))?r=r.finally((()=>{var e;null===(e=i)||void 0===e||e()})):null===(a=i)||void 0===a||a();return r}function useRecoilCallback(e,t){const n=Jo();return or(((...t)=>recoilCallback(n.current,e,t)),null!=t?[...t,n]:void 0)}var ar={recoilCallback:recoilCallback,useRecoilCallback:useRecoilCallback};const{useCallback:sr}=o,{atomicUpdater:lr}=Go,{useMemo:cr}=o;class ur{constructor(e){_defineProperty(this,"value",void 0),this.value=e}}var dr,pr=ur,fr=Object.freeze({__proto__:null,WrappedValue:pr});class hr extends Error{}class mr{constructor(e){var t,n,o;_defineProperty(this,"_name",void 0),_defineProperty(this,"_numLeafs",void 0),_defineProperty(this,"_root",void 0),_defineProperty(this,"_onHit",void 0),_defineProperty(this,"_onSet",void 0),_defineProperty(this,"_mapNodeValue",void 0),this._name=null==e?void 0:e.name,this._numLeafs=0,this._root=null,this._onHit=null!==(t=null==e?void 0:e.onHit)&&void 0!==t?t:()=>{},this._onSet=null!==(n=null==e?void 0:e.onSet)&&void 0!==n?n:()=>{},this._mapNodeValue=null!==(o=null==e?void 0:e.mapNodeValue)&&void 0!==o?o:e=>e}size(){return this._numLeafs}root(){return this._root}get(e,t){var n;return null===(n=this.getLeafNode(e,t))||void 0===n?void 0:n.value}getLeafNode(e,t){if(null==this._root)return;let n=this._root;for(;n;){if(null==t||t.onNodeVisit(n),"leaf"===n.type)return this._onHit(n),n;const o=this._mapNodeValue(e(n.nodeKey));n=n.branches.get(o)}}set(e,t,n){const addLeaf=()=>{var o,r,i,a;let s,l;for(const[t,o]of e){var c,u,d;const e=this._root;if("leaf"===(null==e?void 0:e.type))throw this.invalidCacheError();const r=s;if(s=r?r.branches.get(l):e,s=null!==(c=s)&&void 0!==c?c:{type:"branch",nodeKey:t,parent:r,branches:new Map,branchKey:l},"branch"!==s.type||s.nodeKey!==t)throw this.invalidCacheError();null==r||r.branches.set(l,s),null==n||null===(u=n.onNodeVisit)||void 0===u||u.call(n,s),l=this._mapNodeValue(o),this._root=null!==(d=this._root)&&void 0!==d?d:s}const p=s?null===(o=s)||void 0===o?void 0:o.branches.get(l):this._root;if(null!=p&&("leaf"!==p.type||p.branchKey!==l))throw this.invalidCacheError();const f={type:"leaf",value:t,parent:s,branchKey:l};null===(r=s)||void 0===r||r.branches.set(l,f),this._root=null!==(i=this._root)&&void 0!==i?i:f,this._numLeafs++,this._onSet(f),null==n||null===(a=n.onNodeVisit)||void 0===a||a.call(n,f)};try{addLeaf()}catch(e){if(!(e instanceof hr))throw e;this.clear(),addLeaf()}}delete(e){const t=this.root();if(!t)return!1;if(e===t)return this._root=null,this._numLeafs=0,!0;let n=e.parent,o=e.branchKey;for(;n;){var r;if(n.branches.delete(o),n===t)return 0===n.branches.size?(this._root=null,this._numLeafs=0):this._numLeafs--,!0;if(n.branches.size>0)break;o=null===(r=n)||void 0===r?void 0:r.branchKey,n=n.parent}for(;n!==t;n=n.parent)if(null==n)return!1;return this._numLeafs--,!0}clear(){this._numLeafs=0,this._root=null}invalidCacheError(){const e=undefined;throw G("Invalid cache values. This happens when selectors do not return consistent values for the same input dependency values. That may also be caused when using Fast Refresh to change a selector implementation. Resetting cache."+(null!=this._name?` - ${this._name}`:"")),new hr}}var vr,gr=mr,yr=Object.freeze({__proto__:null,TreeCache:gr});class br{constructor(e){var t;_defineProperty(this,"_maxSize",void 0),_defineProperty(this,"_size",void 0),_defineProperty(this,"_head",void 0),_defineProperty(this,"_tail",void 0),_defineProperty(this,"_map",void 0),_defineProperty(this,"_keyMapper",void 0),this._maxSize=e.maxSize,this._size=0,this._head=null,this._tail=null,this._map=new Map,this._keyMapper=null!==(t=e.mapKey)&&void 0!==t?t:e=>e}head(){return this._head}tail(){return this._tail}size(){return this._size}maxSize(){return this._maxSize}has(e){return this._map.has(this._keyMapper(e))}get(e){const t=this._keyMapper(e),n=this._map.get(t);if(n)return this.set(e,n.value),n.value}set(e,t){const n=this._keyMapper(e),o=undefined;this._map.get(n)&&this.delete(e);const r=this.head(),i={key:e,right:r,left:null,value:t};r?r.left=i:this._tail=i,this._map.set(n,i),this._head=i,this._size++,this._maybeDeleteLRU()}_maybeDeleteLRU(){this.size()>this.maxSize()&&this.deleteLru()}deleteLru(){const e=this.tail();e&&this.delete(e.key)}delete(e){const t=this._keyMapper(e);if(!this._size||!this._map.has(t))return;const n=T(this._map.get(t)),o=n.right,r=n.left;o&&(o.left=n.left),r&&(r.right=n.right),n===this.head()&&(this._head=o),n===this.tail()&&(this._tail=r),this._map.delete(t),this._size--}clear(){this._size=0,this._head=null,this._tail=null,this._map=new Map}}var Sr,xr=br,wr=Object.freeze({__proto__:null,LRUCache:xr});const{LRUCache:_r}=wr,{TreeCache:Ar}=yr;function treeCacheLRU({name:e,maxSize:t,mapNodeValue:n=e=>e}){const o=new _r({maxSize:t}),r=new Ar({name:e,mapNodeValue:n,onHit:e=>{o.set(e,!0)},onSet:e=>{const n=o.tail();o.set(e,!0),n&&r.size()>t&&r.delete(n.key)}});return r}var Er=treeCacheLRU;const Tr=15;function stringify$1(e,t,n){if("string"==typeof e&&!e.includes('"')&&!e.includes("\\"))return`"${e}"`;switch(typeof e){case"undefined":return"";case"boolean":return e?"true":"false";case"number":case"symbol":return String(e);case"string":return JSON.stringify(e);case"function":if(!0!==(null==t?void 0:t.allowFunctions))throw A("Attempt to serialize function in a Recoil cache key");return`__FUNCTION(${e.name})__`}if(null===e)return"null";var o;if("object"!=typeof e)return null!==(o=JSON.stringify(e))&&void 0!==o?o:"";if(E(e))return"__PROMISE__";if(Array.isArray(e))return`[${e.map(((e,n)=>stringify$1(e,t,n.toString())))}]`;if("function"==typeof e.toJSON)return stringify$1(e.toJSON(n),t,n);if(e instanceof Map){const o={};for(const[n,r]of e)o["string"==typeof n?n:stringify$1(n,t)]=r;return stringify$1(o,t,n)}return e instanceof Set?stringify$1(Array.from(e).sort(((e,n)=>stringify$1(e,t).localeCompare(stringify$1(n,t)))),t,n):void 0!==Symbol&&null!=e[Symbol.iterator]&&"function"==typeof e[Symbol.iterator]?stringify$1(Array.from(e),t,n):`{${Object.keys(e).filter((t=>void 0!==e[t])).sort().map((n=>`${stringify$1(n,t)}:${stringify$1(e[n],t,n)}`)).join(",")}}`}function stableStringify(e,t={allowFunctions:!1}){if("production"!==process.env.NODE_ENV&&"undefined"!=typeof window){const n=window.performance?window.performance.now():0,o=stringify$1(e,t),r=window.performance?window.performance.now():0;return r-n>Tr&&(console.groupCollapsed(`Recoil: Spent ${r-n}ms computing a cache key`),console.warn(e,o),console.groupEnd()),o}return stringify$1(e,t)}var Vr=stableStringify;const{TreeCache:Cr}=yr,kr={equality:"reference",eviction:"keep-all",maxSize:1/0};function treeCacheFromPolicy({equality:e=kr.equality,eviction:t=kr.eviction,maxSize:n=kr.maxSize}=kr,o){const r=undefined;return getTreeCache(t,n,getValueMapper(e),o)}function getValueMapper(e){switch(e){case"reference":return e=>e;case"value":return e=>Vr(e)}throw A(`Unrecognized equality policy ${e}`)}function getTreeCache(e,t,n,o){switch(e){case"keep-all":return new Cr({name:o,mapNodeValue:n});case"lru":return Er({name:o,maxSize:T(t),mapNodeValue:n});case"most-recent":return Er({name:o,maxSize:1,mapNodeValue:n})}throw A(`Unrecognized eviction policy ${e}`)}var Nr=treeCacheFromPolicy;function isNode(e){var t,n;if("undefined"==typeof window)return!1;const o=undefined,r=null!==(n=(null!=e?null!==(t=e.ownerDocument)&&void 0!==t?t:e:document).defaultView)&&void 0!==n?n:window;return!(null==e||!("function"==typeof r.Node?e instanceof r.Node:"object"==typeof e&&"number"==typeof e.nodeType&&"string"==typeof e.nodeName))}var Rr=isNode;const{isReactNative:Ir,isWindow:Or}=Dt;function shouldNotBeFrozen(e){if(null===e||"object"!=typeof e)return!0;switch(typeof e.$$typeof){case"symbol":case"number":return!0}return null!=e["@@__IMMUTABLE_ITERABLE__@@"]||null!=e["@@__IMMUTABLE_KEYED__@@"]||null!=e["@@__IMMUTABLE_INDEXED__@@"]||null!=e["@@__IMMUTABLE_ORDERED__@@"]||null!=e["@@__IMMUTABLE_RECORD__@@"]||(!!Rr(e)||(!!E(e)||(e instanceof Error||(!!ArrayBuffer.isView(e)||!(Ir||!Or(e))))))}function deepFreezeValue(e){if("object"==typeof e&&!shouldNotBeFrozen(e)){Object.freeze(e);for(const t in e)if(Object.prototype.hasOwnProperty.call(e,t)){const n=e[t];"object"!=typeof n||null==n||Object.isFrozen(n)||deepFreezeValue(n)}Object.seal(e)}}var Lr=deepFreezeValue;const{isLoadable:Pr,loadableWithError:jr,loadableWithPromise:Mr,loadableWithValue:Dr}=U,{WrappedValue:Br}=fr,{getNodeLoadable:zr,peekNodeLoadable:Ur,setNodeValue:Fr}=et,{saveDepsToStore:Hr}=Ne,{DEFAULT_VALUE:Wr,getConfigDeletionHandler:$r,getNode:Gr,registerNode:Kr}=Se,{isRecoilValue:qr}=ce,{markRecoilValueModified:Yr}=gt,{retainedByOptionWithDefault:Zr}=Et,{recoilCallback:Xr}=ar;class Jr{}const Qr=new Jr,ei=[],ti=new Map,ni=(()=>{let e=0;return()=>e++})();function selector(e){let t=null;const{key:n,get:o,cachePolicy_UNSTABLE:r}=e,i=null!=e.set?e.set:void 0;if("production"!==process.env.NODE_ENV){if("string"!=typeof n)throw A("A key option with a unique string value must be provided when creating a selector.");if("function"!=typeof o)throw A("Selectors must specify a get callback option to get the selector value.")}const a=new Set,s=Nr(null!=r?r:{equality:"reference",eviction:"keep-all"},n),l=Zr(e.retainedBy_UNSTABLE),c=new Map;let u=0;function selectorIsLive(){return!W("recoil_memory_managament_2020")||u>0}function selectorInit(e){return e.getState().knownSelectors.add(n),u++,()=>{u--}}function selectorShouldDeleteConfigOnRelease(){return void 0!==$r(n)&&!selectorIsLive()}function resolveAsync(e,t,n,o,r){setCache(t,o,r),notifyStoresOfResolvedAsync(e,n)}function notifyStoresOfResolvedAsync(e,t){isLatestExecution(e,t)&&clearExecutionInfo(e),notifyWaitingStores(t,!0)}function notifyStoresOfNewAsyncDep(e,t){if(isLatestExecution(e,t)){const n=undefined;T(getExecutionInfo(e)).stateVersions.clear(),notifyWaitingStores(t,!1)}}function notifyWaitingStores(e,n){const o=ti.get(e);if(null!=o){for(const e of o)Yr(e,T(t));n&&ti.delete(e)}}function markStoreWaitingForResolvedAsync(e,t){let n=ti.get(t);null==n&&ti.set(t,n=new Set),n.add(e)}function wrapResultPromise(e,t,n,o,r,i){return t.then((t=>{if(!selectorIsLive())throw clearExecutionInfo(e),Qr;const i=Dr(t);return resolveAsync(e,n,r,i,o),t})).catch((t=>{if(!selectorIsLive())throw clearExecutionInfo(e),Qr;if(E(t))return wrapPendingDependencyPromise(e,t,n,o,r,i);const a=jr(t);throw resolveAsync(e,n,r,a,o),t}))}function wrapPendingDependencyPromise(e,t,n,o,r,i){return t.then((o=>{if(!selectorIsLive())throw clearExecutionInfo(e),Qr;null!=i.loadingDepKey&&i.loadingDepPromise===t?n.atomValues.set(i.loadingDepKey,Dr(o)):e.getState().knownSelectors.forEach((e=>{n.atomValues.delete(e)}));const a=getLoadableFromCacheAndUpdateDeps(e,n);if(a&&"loading"!==a.state){if((isLatestExecution(e,r)||null==getExecutionInfo(e))&¬ifyStoresOfResolvedAsync(e,r),"hasValue"===a.state)return a.contents;throw a.contents}if(!isLatestExecution(e,r)){const t=getInProgressExecutionInfo(e,n);if(null!=t)return t.loadingLoadable.contents}const[s,l]=evaluateSelectorGetter(e,n,r);if("loading"!==s.state&&resolveAsync(e,n,r,s,l),"hasError"===s.state)throw s.contents;return s.contents})).catch((t=>{if(t instanceof Jr)throw Qr;if(!selectorIsLive())throw clearExecutionInfo(e),Qr;const i=jr(t);throw resolveAsync(e,n,r,i,o),t}))}function updateDeps(e,t,o,r){var i,s,l,c,u,d,p;(isLatestExecution(e,r)||t.version===(null===(i=e.getState())||void 0===i||null===(s=i.currentTree)||void 0===s?void 0:s.version)||t.version===(null===(l=e.getState())||void 0===l||null===(c=l.nextTree)||void 0===c?void 0:c.version))&&Hr(n,o,e,null!==(u=null===(d=e.getState())||void 0===d||null===(p=d.nextTree)||void 0===p?void 0:p.version)&&void 0!==u?u:e.getState().currentTree.version);for(const e of o)a.add(e)}function evaluateSelectorGetter(e,n,r){let i=!0,a=!0;const finishEvaluation=()=>{a=!1};let s,l=!1,c;const u={loadingDepKey:null,loadingDepPromise:null},d=new Map;function getRecoilValue({key:t}){const o=zr(e,n,t);switch(d.set(t,o),i||(updateDeps(e,n,new Set(d.keys()),r),notifyStoresOfNewAsyncDep(e,r)),o.state){case"hasValue":return o.contents;case"hasError":throw o.contents;case"loading":throw u.loadingDepKey=t,u.loadingDepPromise=o.contents,o.contents}throw A("Invalid Loadable state")}const getCallback=n=>(...o)=>{if(a)throw A("Callbacks from getCallback() should only be called asynchronously after the selector is evalutated. It can be used for selectors to return objects with callbacks that can work with Recoil state without a subscription.");return null==t&&("production"!==process.env.NODE_ENV?qo(!1,"Recoil Value can never be null"):qo(!1)),Xr(e,n,o,{node:t})};try{s=o({get:getRecoilValue,getCallback:getCallback}),s=qr(s)?getRecoilValue(s):s,Pr(s)&&("hasError"===s.state&&(l=!0),s=s.contents),E(s)?s=wrapResultPromise(e,s,n,d,r,u).finally(finishEvaluation):finishEvaluation(),s=s instanceof Br?s.value:s}catch(t){s=t,E(s)?s=wrapPendingDependencyPromise(e,s,n,d,r,u).finally(finishEvaluation):(l=!0,finishEvaluation())}return c=l?jr(s):E(s)?Mr(s):Dr(s),i=!1,updateExecutionInfoDepValues(e,r,d),updateDeps(e,n,new Set(d.keys()),r),[c,d]}function getLoadableFromCacheAndUpdateDeps(e,t){let o=t.atomValues.get(n);if(null!=o)return o;const r=new Set;try{o=s.get((n=>("string"!=typeof n&&("production"!==process.env.NODE_ENV?qo(!1,"Cache nodeKey is type string"):qo(!1)),zr(e,t,n).contents)),{onNodeVisit:e=>{"branch"===e.type&&e.nodeKey!==n&&r.add(e.nodeKey)}})}catch(e){throw A(`Problem with cache lookup for selector "${n}": ${e.message}`)}var i;o&&(t.atomValues.set(n,o),updateDeps(e,t,r,null===(i=getExecutionInfo(e))||void 0===i?void 0:i.executionID));return o}function getSelectorLoadableAndUpdateDeps(e,t){const n=getLoadableFromCacheAndUpdateDeps(e,t);if(null!=n)return clearExecutionInfo(e),n;const o=getInProgressExecutionInfo(e,t);var r;if(null!=o)return"loading"===(null===(r=o.loadingLoadable)||void 0===r?void 0:r.state)&&markStoreWaitingForResolvedAsync(e,o.executionID),o.loadingLoadable;const i=ni(),[a,s]=evaluateSelectorGetter(e,t,i);return"loading"===a.state?(setExecutionInfo(e,i,a,s,t),markStoreWaitingForResolvedAsync(e,i)):(clearExecutionInfo(e),setCache(t,a,s)),a}function getInProgressExecutionInfo(e,t){const n=Pt([c.has(e)?[T(c.get(e))]:[],fe($e(c,(([t])=>t!==e)),(([,e])=>e))]);function anyDepChanged(n){for(const[o,r]of n)if(!zr(e,t,o).is(r))return!0;return!1}for(const e of n){if(e.stateVersions.get(t.version)||!anyDepChanged(e.depValuesDiscoveredSoFarDuringAsyncWork))return e.stateVersions.set(t.version,!0),e;e.stateVersions.set(t.version,!1)}}function getExecutionInfo(e){return c.get(e)}function setExecutionInfo(e,t,n,o,r){c.set(e,{depValuesDiscoveredSoFarDuringAsyncWork:o,executionID:t,loadingLoadable:n,stateVersions:new Map([[r.version,!0]])})}function updateExecutionInfoDepValues(e,t,n){if(isLatestExecution(e,t)){const t=getExecutionInfo(e);null!=t&&(t.depValuesDiscoveredSoFarDuringAsyncWork=n)}}function clearExecutionInfo(e){c.delete(e)}function isLatestExecution(e,t){var n;return t===(null===(n=getExecutionInfo(e))||void 0===n?void 0:n.executionID)}function depValuesToDepRoute(e){return Array.from(e.entries()).map((([e,t])=>[e,t.contents]))}function setCache(t,o,r){"production"!==process.env.NODE_ENV&&"loading"!==o.state&&!1===Boolean(e.dangerouslyAllowMutability)&&Lr(o.contents),t.atomValues.set(n,o);try{s.set(depValuesToDepRoute(r),o)}catch(e){throw A(`Problem with setting cache for selector "${n}": ${e.message}`)}}function detectCircularDependencies(e){if(ei.includes(n)){const e=`Recoil selector has circular dependencies: ${ei.slice(ei.indexOf(n)).join(" → ")}`;return jr(A(e))}ei.push(n);try{return e()}finally{ei.pop()}}function selectorPeek(e,t){const o=t.atomValues.get(n);return null!=o?o:s.get((n=>{var o;return"string"!=typeof n&&("production"!==process.env.NODE_ENV?qo(!1,"Cache nodeKey is type string"):qo(!1)),null===(o=Ur(e,t,n))||void 0===o?void 0:o.contents}))}function selectorGet(e,t){return detectCircularDependencies((()=>getSelectorLoadableAndUpdateDeps(e,t)))}function invalidateSelector(e){e.atomValues.delete(n)}function clearSelectorCache(e,n){null==t&&("production"!==process.env.NODE_ENV?qo(!1,"Recoil Value can never be null"):qo(!1));for(const t of a){var o;const r=Gr(t);null===(o=r.clearCache)||void 0===o||o.call(r,e,n)}a.clear(),invalidateSelector(n),s.clear(),Yr(e,t)}if(null!=i){const o=undefined;return t=Kr({key:n,nodeType:"selector",peek:selectorPeek,get:selectorGet,set:(e,t,o)=>{let r=!1;const a=new Map;function getRecoilValue({key:o}){if(r)throw A("Recoil: Async selector sets are not currently supported.");const i=zr(e,t,o);if("hasValue"===i.state)return i.contents;if("loading"===i.state){const e=`Getting value of asynchronous atom or selector "${o}" in a pending state while setting selector "${n}" is not yet supported.`;throw G(e),A(e)}throw i.contents}function setRecoilState(n,o){if(r){const e="Recoil: Async selector sets are not currently supported.";throw G(e),A(e)}const i="function"==typeof o?o(getRecoilValue(n)):o,s=undefined;Fr(e,t,n.key,i).forEach(((e,t)=>a.set(t,e)))}function resetRecoilState(e){setRecoilState(e,Wr)}const s=i({set:setRecoilState,get:getRecoilValue,reset:resetRecoilState},o);if(void 0!==s)throw E(s)?A("Recoil: Async selector sets are not currently supported."):A("Recoil: selector set should be a void function.");return r=!0,a},init:selectorInit,invalidate:invalidateSelector,clearCache:clearSelectorCache,shouldDeleteConfigOnRelease:selectorShouldDeleteConfigOnRelease,dangerouslyAllowMutability:e.dangerouslyAllowMutability,shouldRestoreFromSnapshots:!1,retainedBy:l})}return t=Kr({key:n,nodeType:"selector",peek:selectorPeek,get:selectorGet,init:selectorInit,invalidate:invalidateSelector,clearCache:clearSelectorCache,shouldDeleteConfigOnRelease:selectorShouldDeleteConfigOnRelease,dangerouslyAllowMutability:e.dangerouslyAllowMutability,shouldRestoreFromSnapshots:!1,retainedBy:l})}selector.value=e=>new Br(e);var oi=selector;const{isLoadable:ri,loadableWithError:ii,loadableWithPromise:ai,loadableWithValue:si}=U,{WrappedValue:li}=fr,{peekNodeInfo:ci}=et,{DEFAULT_VALUE:ui,DefaultValue:di,getConfigDeletionHandler:pi,registerNode:fi,setConfigDeletionHandler:hi}=Se,{isRecoilValue:mi}=ce,{getRecoilValueAsLoadable:vi,markRecoilValueModified:gi,setRecoilValue:yi,setRecoilValueLoadable:bi}=gt,{retainedByOptionWithDefault:Si}=Et,unwrap=e=>e instanceof li?e.value:e;function baseAtom(e){const{key:t,persistence_UNSTABLE:n}=e,o=Si(e.retainedBy_UNSTABLE);let r=0;function unwrapPromise(e){return ai(e.then((e=>(i=si(e),e))).catch((e=>{throw i=ii(e),e})))}let i=E(e.default)?unwrapPromise(e.default):ri(e.default)?"loading"===e.default.state?unwrapPromise(e.default.contents):e.default:si(unwrap(e.default)),a;maybeFreezeValueOrPromise(i.contents);const s=new Map;function maybeFreezeValueOrPromise(t){return"production"!==process.env.NODE_ENV&&!0!==e.dangerouslyAllowMutability?E(t)?t.then((e=>(Lr(e),e))):(Lr(t),t):t}function wrapPendingPromise(e,n){const o=n.then((n=>{var r,i;const a=undefined;return(null===(i=(null!==(r=e.getState().nextTree)&&void 0!==r?r:e.getState().currentTree).atomValues.get(t))||void 0===i?void 0:i.contents)===o&&yi(e,l,n),n})).catch((n=>{var r,i;const a=undefined;throw(null===(i=(null!==(r=e.getState().nextTree)&&void 0!==r?r:e.getState().currentTree).atomValues.get(t))||void 0===i?void 0:i.contents)===o&&bi(e,l,ii(n)),n}));return o}function initAtom(n,o,a){var c;r++;const cleanupAtom=()=>{var e;r--,null===(e=s.get(n))||void 0===e||e.forEach((e=>e())),s.delete(n)};if(n.getState().knownAtoms.add(t),"loading"===i.state){const notifyDefaultSubscribers=()=>{var e;const o=undefined;(null!==(e=n.getState().nextTree)&&void 0!==e?e:n.getState().currentTree).atomValues.has(t)||gi(n,l)};i.contents.finally(notifyDefaultSubscribers)}const u=null!==(c=e.effects)&&void 0!==c?c:e.effects_UNSTABLE;if(null!=u){let f=ui,h=!0,m=!1,v=null;function getLoadable(e){if(h&&e.key===t){const e=f;return e instanceof di?peekAtom(n,o):E(e)?ai(e.then((e=>e instanceof di?i.toPromise():e))):si(e)}return vi(n,e)}function getPromise(e){return getLoadable(e).toPromise()}function getInfo_UNSTABLE(e){var o;const r=ci(n,null!==(o=n.getState().nextTree)&&void 0!==o?o:n.getState().currentTree,e.key);return!h||e.key!==t||f instanceof di?r:{...r,isSet:!0,loadable:getLoadable(e)}}const setSelf=e=>t=>{if(h){const n=getLoadable(l),o="hasValue"===n.state?n.contents:ui;f="function"==typeof t?t(o):t,E(f)&&(f=f.then((t=>(v={effect:e,value:t},t))))}else{if(E(t))throw A("Setting atoms to async values is not implemented.");"function"!=typeof t&&(v={effect:e,value:unwrap(t)}),yi(n,l,"function"==typeof t?n=>{const o=unwrap(t(n));return v={effect:e,value:o},o}:unwrap(t))}},resetSelf=e=>()=>setSelf(e)(ui),onSet=e=>o=>{var r;const{release:a}=n.subscribeToTransactions((n=>{var r;let{currentTree:a,previousTree:s}=n.getState();s||(G("Transaction subscribers notified without a next tree being present -- this is a bug in Recoil"),s=a);const l=null!==(r=a.atomValues.get(t))&&void 0!==r?r:i;if("hasValue"===l.state){var c,u,d,p;const n=l.contents,r=null!==(c=s.atomValues.get(t))&&void 0!==c?c:i,f="hasValue"===r.state?r.contents:ui;(null===(u=v)||void 0===u?void 0:u.effect)!==e||(null===(d=v)||void 0===d?void 0:d.value)!==n?o(n,f,!a.atomValues.has(t)):(null===(p=v)||void 0===p?void 0:p.effect)===e&&(v=null)}}),t);s.set(n,[...null!==(r=s.get(n))&&void 0!==r?r:[],a])};for(const g of u)try{const b=g({node:l,storeID:n.storeID,parentStoreID_UNSTABLE:n.parentStoreID,trigger:a,setSelf:setSelf(g),resetSelf:resetSelf(g),onSet:onSet(g),getPromise:getPromise,getLoadable:getLoadable,getInfo_UNSTABLE:getInfo_UNSTABLE});var d;if(null!=b)s.set(n,[...null!==(d=s.get(n))&&void 0!==d?d:[],b])}catch(S){f=S,m=!0}if(h=!1,!(f instanceof di)){var p;const w=m?ii(f):E(f)?ai(wrapPendingPromise(n,f)):si(unwrap(f));maybeFreezeValueOrPromise(w.contents),o.atomValues.set(t,w),null===(p=n.getState().nextTree)||void 0===p||p.atomValues.set(t,w)}}return cleanupAtom}function peekAtom(e,n){var o,r;return null!==(o=null!==(r=n.atomValues.get(t))&&void 0!==r?r:a)&&void 0!==o?o:i}function getAtom(e,o){if(o.atomValues.has(t))return T(o.atomValues.get(t));if(o.nonvalidatedAtoms.has(t)){if(null!=a)return a;if(null==n)return pe(`Tried to restore a persisted value for atom ${t} but it has no persistence settings.`),i;const e=o.nonvalidatedAtoms.get(t),r=n.validator(e,ui),s=r instanceof di?i:si(r);return a=s,a}return i}function invalidateAtom(){a=void 0}function setAtom(e,n,o){if(n.atomValues.has(t)){const e=T(n.atomValues.get(t));if("hasValue"===e.state&&o===e.contents)return new Map}else if(!n.nonvalidatedAtoms.has(t)&&o instanceof di)return new Map;return maybeFreezeValueOrPromise(o),a=void 0,(new Map).set(t,si(o))}function shouldDeleteConfigOnReleaseAtom(){return void 0!==pi(t)&&r<=0}const l=fi({key:t,nodeType:"atom",peek:peekAtom,get:getAtom,set:setAtom,init:initAtom,invalidate:invalidateAtom,shouldDeleteConfigOnRelease:shouldDeleteConfigOnReleaseAtom,dangerouslyAllowMutability:e.dangerouslyAllowMutability,persistence_UNSTABLE:e.persistence_UNSTABLE?{type:e.persistence_UNSTABLE.type,backButton:e.persistence_UNSTABLE.backButton}:void 0,shouldRestoreFromSnapshots:!0,retainedBy:o});return l}function atom(e){if("production"!==process.env.NODE_ENV&&"string"!=typeof e.key)throw A("A key option with a unique string value must be provided when creating an atom.");const{...t}=e,n="default"in e?e.default:new Promise((()=>{}));return mi(n)?atomWithFallback({...t,default:n}):baseAtom({...t,default:n})}function atomWithFallback(e){const t=atom({...e,default:ui,persistence_UNSTABLE:void 0===e.persistence_UNSTABLE?void 0:{...e.persistence_UNSTABLE,validator:t=>t instanceof di?t:T(e.persistence_UNSTABLE).validator(t,ui)},effects:e.effects,effects_UNSTABLE:e.effects_UNSTABLE}),n=oi({key:`${e.key}__withFallback`,get:({get:n})=>{const o=n(t);return o instanceof di?e.default:o},set:({set:e},n)=>e(t,n),cachePolicy_UNSTABLE:{eviction:"most-recent"},dangerouslyAllowMutability:e.dangerouslyAllowMutability});return hi(n.key,pi(e.key)),n}atom.value=e=>new li(e);var xi=atom;class wi{constructor(e){var t;_defineProperty(this,"_map",void 0),_defineProperty(this,"_keyMapper",void 0),this._map=new Map,this._keyMapper=null!==(t=null==e?void 0:e.mapKey)&&void 0!==t?t:e=>e}size(){return this._map.size}has(e){return this._map.has(this._keyMapper(e))}get(e){return this._map.get(this._keyMapper(e))}set(e,t){this._map.set(this._keyMapper(e),t)}delete(e){this._map.delete(this._keyMapper(e))}clear(){this._map.clear()}}var _i,Ai=wi,Ei=Object.freeze({__proto__:null,MapCache:Ai});const{LRUCache:Ti}=wr,{MapCache:Vi}=Ei,Ci={equality:"reference",eviction:"none",maxSize:1/0};function cacheFromPolicy({equality:e=Ci.equality,eviction:t=Ci.eviction,maxSize:n=Ci.maxSize}=Ci){const o=undefined,r=undefined;return getCache(t,n,getValueMapper$1(e))}function getValueMapper$1(e){switch(e){case"reference":return e=>e;case"value":return e=>Vr(e)}throw A(`Unrecognized equality policy ${e}`)}function getCache(e,t,n){switch(e){case"keep-all":return new Vi({mapKey:n});case"lru":return new Ti({mapKey:n,maxSize:T(t)});case"most-recent":return new Ti({mapKey:n,maxSize:1})}throw A(`Unrecognized eviction policy ${e}`)}var ki=cacheFromPolicy;const{setConfigDeletionHandler:Ni}=Se;function atomFamily(e){var t,n;const o=ki({equality:null!==(t=null===(n=e.cachePolicyForParams_UNSTABLE)||void 0===n?void 0:n.equality)&&void 0!==t?t:"value",eviction:"keep-all"});return t=>{var n,r;const i=o.get(t);if(null!=i)return i;const{cachePolicyForParams_UNSTABLE:a,...s}=e,l="default"in e?e.default:new Promise((()=>{})),c=xi({...s,key:`${e.key}__${null!==(n=Vr(t))&&void 0!==n?n:"void"}`,default:"function"==typeof l?l(t):l,retainedBy_UNSTABLE:"function"==typeof e.retainedBy_UNSTABLE?e.retainedBy_UNSTABLE(t):e.retainedBy_UNSTABLE,effects:"function"==typeof e.effects?e.effects(t):"function"==typeof e.effects_UNSTABLE?e.effects_UNSTABLE(t):null!==(r=e.effects)&&void 0!==r?r:e.effects_UNSTABLE});return o.set(t,c),Ni(c.key,(()=>{o.delete(t)})),c}}var Ri=atomFamily;const{setConfigDeletionHandler:Ii}=Se;let Oi=0;function selectorFamily(e){var t,n;const o=ki({equality:null!==(t=null===(n=e.cachePolicyForParams_UNSTABLE)||void 0===n?void 0:n.equality)&&void 0!==t?t:"value",eviction:"keep-all"});return t=>{var n;let r;try{r=o.get(t)}catch(t){throw A(`Problem with cache lookup for selector ${e.key}: ${t.message}`)}if(null!=r)return r;const i=`${e.key}__selectorFamily/${null!==(n=Vr(t,{allowFunctions:!0}))&&void 0!==n?n:"void"}/${Oi++}`,myGet=n=>e.get(t)(n),a=e.cachePolicy_UNSTABLE,s="function"==typeof e.retainedBy_UNSTABLE?e.retainedBy_UNSTABLE(t):e.retainedBy_UNSTABLE;let l;if(null!=e.set){const n=e.set,o=undefined;l=oi({key:i,get:myGet,set:(e,o)=>n(t)(e,o),cachePolicy_UNSTABLE:a,dangerouslyAllowMutability:e.dangerouslyAllowMutability,retainedBy_UNSTABLE:s})}else l=oi({key:i,get:myGet,cachePolicy_UNSTABLE:a,dangerouslyAllowMutability:e.dangerouslyAllowMutability,retainedBy_UNSTABLE:s});return o.set(t,l),Ii(l.key,(()=>{o.delete(t)})),l}}var Li=selectorFamily;Li({key:"__constant",get:e=>()=>e,cachePolicyForParams_UNSTABLE:{equality:"reference"}}),Li({key:"__error",get:e=>()=>{throw A(e)},cachePolicyForParams_UNSTABLE:{equality:"reference"}});const{loadableWithError:Pi,loadableWithPromise:ji,loadableWithValue:Mi}=U;function concurrentRequests(e,t){const n=Array(t.length).fill(void 0),o=Array(t.length).fill(void 0);for(const[r,i]of t.entries())try{n[r]=e(i)}catch(e){o[r]=e}return[n,o]}function isError(e){return null!=e&&!E(e)}function unwrapDependencies(e){return Array.isArray(e)?e:Object.getOwnPropertyNames(e).map((t=>e[t]))}function wrapResults(e,t){return Array.isArray(e)?t:Object.getOwnPropertyNames(e).reduce(((e,n,o)=>({...e,[n]:t[o]})),{})}function wrapLoadables(e,t,n){const o=undefined;return wrapResults(e,n.map(((e,n)=>null==e?Mi(t[n]):E(e)?ji(e):Pi(e))))}function combineAsyncResultsWithSyncResults(e,t){return t.map(((t,n)=>void 0===t?e[n]:t))}Li({key:"__waitForNone",get:e=>({get:t})=>{const n=unwrapDependencies(e),[o,r]=concurrentRequests(t,n);return wrapLoadables(e,o,r)},dangerouslyAllowMutability:!0}),Li({key:"__waitForAny",get:e=>({get:t})=>{const n=unwrapDependencies(e),[o,r]=concurrentRequests(t,n);return r.some((e=>!E(e)))?wrapLoadables(e,o,r):new Promise((t=>{for(const[n,i]of r.entries())E(i)&&i.then((i=>{o[n]=i,r[n]=void 0,t(wrapLoadables(e,o,r))})).catch((i=>{r[n]=i,t(wrapLoadables(e,o,r))}))}))},dangerouslyAllowMutability:!0}),Li({key:"__waitForAll",get:e=>({get:t})=>{const n=unwrapDependencies(e),[o,r]=concurrentRequests(t,n);if(r.every((e=>null==e)))return wrapResults(e,o);const i=r.find(isError);if(null!=i)throw i;return Promise.all(r).then((t=>wrapResults(e,combineAsyncResultsWithSyncResults(o,t))))},dangerouslyAllowMutability:!0}),Li({key:"__waitForAllSettled",get:e=>({get:t})=>{const n=unwrapDependencies(e),[o,r]=concurrentRequests(t,n);return r.every((e=>!E(e)))?wrapLoadables(e,o,r):Promise.all(r.map(((e,t)=>E(e)?e.then((e=>{o[t]=e,r[t]=void 0})).catch((e=>{o[t]=void 0,r[t]=e})):null))).then((()=>wrapLoadables(e,o,r)))},dangerouslyAllowMutability:!0}),Li({key:"__noWait",get:e=>({get:t})=>{try{return oi.value(Mi(t(e)))}catch(e){return oi.value(E(e)?ji(e):Pi(e))}},dangerouslyAllowMutability:!0});const{RecoilLoadable:Di}=U,{RecoilRoot:Bi}=$n,{isRecoilValue:zi}=ce,{freshSnapshot:Ui}=mn,{useRecoilState:Fi,useRecoilValue:Hi,useRecoilValueLoadable:Wi,useSetRecoilState:$i}=wo,{useRecoilCallback:Gi}=ar;var Ki={RecoilRoot:Bi,atom:xi,selector:oi,atomFamily:Ri,useRecoilValue:Hi,useRecoilValueLoadable:Wi,useRecoilState:Fi,useSetRecoilState:$i,useRecoilCallback:Gi},qi=Ki.RecoilRoot,Yi=Ki.atom,Zi=Ki.selector,Xi=Ki.atomFamily,Ji=Ki.useRecoilValue,Qi=Ki.useRecoilValueLoadable,ea=Ki.useRecoilState,ta=Ki.useSetRecoilState,na=Ki.useRecoilCallback;class oa{}function useActionCallback(e,t=[]){const n=undefined;return na((t=>e(Object.assign(Object.assign({},t),{snapshot:Object.defineProperties(t.snapshot,{getPromiseRequired:{configurable:!0,value:createGetPromiseRequiredWrapper(t.snapshot)},tryGetPromise:{configurable:!0,value:createTryGetPromiseWrapper(t.snapshot)}})}))),t instanceof oa?void 0:t)}function retainSnapshot(e){return n=>{var{snapshot:o}=n,r=t.__rest(n,["snapshot"]);return async(...t)=>{const n=o.retain();try{const n=undefined;return await e(Object.assign(Object.assign({},r),{snapshot:o}))(...t)}finally{n()}}}}function createGetPromiseRequiredWrapper(e){return async(t,n)=>{const o=await e.getPromise(t);if(null==o)throw null!=n?n:new Error(`No value present for required value ${t.key}`);return o}}function createTryGetPromiseWrapper(e){return async t=>{try{return{value:await e.getPromise(t)}}catch(e){return logger_debug(`Error encountered retrieving Recoil value. [key={${t.key}}]`,e),{error:e}}}}const ra=Yi({key:"boxSelectionEnabled",default:!1}),ia=Yi({key:"boxSelectionOperationType",default:"clearAndSelect"}),useBoxSelectionActions=()=>({enable:useActionCallback((({set:e})=>()=>{e(ra,!0)})),disable:useActionCallback((({reset:e})=>async()=>{e(ra),e(ia)})),setOperationType:useActionCallback((({set:e})=>t=>{e(ia,t)}))}),isInputElement=e=>{const t=e instanceof HTMLElement&&"VERTEX-AUTO-RESIZE-TEXTAREA"===e.tagName,n=e instanceof HTMLElement&&"VERTEX-TEXTFIELD"===e.tagName,o=e instanceof HTMLElement&&"true"===e.contentEditable,r=e instanceof HTMLElement&&"VERTEX-SCENE-TREE-SEARCH"===e.tagName,i=e instanceof HTMLInputElement||e instanceof HTMLTextAreaElement,a=e instanceof HTMLElement&&"VERTEX-VIEWER-PIN-TOOL"===e.tagName,s=e instanceof HTMLElement&&"VERTEX-VIEWER-TRANSFORM-WIDGET"===e.tagName;return t||n||o||r||i||a||s},useRecoilReducer=({reducer:e,atom:t})=>{const n=undefined,o=undefined;return[Ji(t),useRecoilReducerDispatch({reducer:e,atom:t})]},useRecoilReducerDispatch=({reducer:e,atom:t})=>{const n=na((({set:n})=>async o=>{n(t,(t=>e(t,o)))}),[]);return n};var aa=/rgb\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/,sa=/rgba\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(.+)\s*\)/,la=/^(#|0x)?([A-Fa-f0-9]{6})$/,create$2=function(e,t,n,o){return void 0===o&&(o=255),{r:e,g:t,b:n,a:o}},fromNumber=function(e){var t=16777215&e;return create$2(t>>16&255,t>>8&255,255&t)},fromHexString=function(e){var t=la.exec(e);if(null!=t)return fromNumber(parseInt(t[2],16))},fromCss=function(e){var t=aa.exec(e);if(null!=t)return create$2(parseInt(t[1]),parseInt(t[2]),parseInt(t[3]));var n=sa.exec(e);return null!=n?create$2(parseInt(n[1]),parseInt(n[2]),parseInt(n[3]),Math.floor(255*parseFloat(n[4]))):la.test(e)?fromHexString(e):void 0},fromArray=function(e){return create$2(e[0],e[1],e[2],e[3])},isInvisible=function(e){return 0===e.a},isOpaque=function(e){return 255===e.a},toHexString=function(e){return"#".concat(componentToHex(e.r)).concat(componentToHex(e.g)).concat(componentToHex(e.b))},componentToHex=function(e){var t=e.toString(16);return 1===t.length?"0"+t:t},ca=Object.freeze({__proto__:null,create:create$2,fromNumber:fromNumber,fromHexString:fromHexString,fromCss:fromCss,fromArray:fromArray,isInvisible:isInvisible,isOpaque:isOpaque,toHexString:toHexString}),ua;!function(e){function MapperValidationError(t){var n=e.call(this,"Validation error mapping object.")||this;return n.errors=t,Object.setPrototypeOf(n,MapperValidationError.prototype),n}t.__extends(MapperValidationError,e)}(Error);var da=new Uint8Array(16);function rng(){if(!ua&&!(ua="undefined"!=typeof crypto&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto)||"undefined"!=typeof msCrypto&&"function"==typeof msCrypto.getRandomValues&&msCrypto.getRandomValues.bind(msCrypto)))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return ua(da)}var pa=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;function validate(e){return"string"==typeof e&&pa.test(e)}for(var fa=[],ha=0;ha<256;++ha)fa.push((ha+256).toString(16).substr(1));function stringify(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=(fa[e[t+0]]+fa[e[t+1]]+fa[e[t+2]]+fa[e[t+3]]+"-"+fa[e[t+4]]+fa[e[t+5]]+"-"+fa[e[t+6]]+fa[e[t+7]]+"-"+fa[e[t+8]]+fa[e[t+9]]+"-"+fa[e[t+10]]+fa[e[t+11]]+fa[e[t+12]]+fa[e[t+13]]+fa[e[t+14]]+fa[e[t+15]]).toLowerCase();if(!validate(n))throw TypeError("Stringified UUID is invalid");return n}function v4(e,t,n){var o=(e=e||{}).random||(e.rng||rng)();return o[6]=15&o[6]|64,o[8]=63&o[8]|128,stringify(o)}function create$1(){return v4()}function fromMsbLsb(e,t){function digits(e,t){var n=BigInt(1)<<t*BigInt(4);return(n|e&n-BigInt(1)).toString(16).substring(1)}var n="string"==typeof e?BigInt(e):e,o="string"==typeof t?BigInt(t):t,r=digits(n>>BigInt(32),BigInt(8)),i=digits(n>>BigInt(16),BigInt(4)),a=digits(n,BigInt(4)),s=digits(o>>BigInt(48),BigInt(4)),l=digits(o,BigInt(12));return"".concat(r,"-").concat(i,"-").concat(a,"-").concat(s,"-").concat(l)}function toMsbLsb(e){var n=t.__read(e.split("-"),5),o=n[0],r=n[1],i=n[2],a=n[3],s=n[4];if(null==o||null==r||null==i||null==a||null==s)throw new Error("Invalid UUID string ".concat(e));var l=BigInt.asIntN(64,BigInt("0x".concat(o+r+i))),c=BigInt.asIntN(64,BigInt("0x".concat(a+s)));return{msb:l.toString(),lsb:c.toString()}}var ma=Object.freeze({__proto__:null,create:create$1,fromMsbLsb:fromMsbLsb,toMsbLsb:toMsbLsb});const va=Yi({key:"keyBindings",default:{applyBindings:[],bindings:{},pressed:{}}});function reducer(e,t){var n,o,r,i;switch(t.type){case"push-key-binding":const a=undefined;return null!=(null===(n=e.bindings[t.binding.keyBind])||void 0===n?void 0:n.find((e=>e.id===t.binding.id)))?e:Object.assign(Object.assign({},e),{bindings:Object.assign(Object.assign({},e.bindings),{[t.binding.keyBind]:[...null!==(o=e.bindings[t.binding.keyBind])&&void 0!==o?o:[],t.binding]})});case"remove-key-binding":const s=undefined;return null==(null===(r=e.bindings[t.binding.keyBind])||void 0===r?void 0:r.find((e=>e.id===t.binding.id)))?e:Object.assign(Object.assign({},e),{bindings:Object.assign(Object.assign({},e.bindings),{[t.binding.keyBind]:(null!==(i=e.bindings[t.binding.keyBind])&&void 0!==i?i:[]).filter((e=>e.id!==t.binding.id))})});case"add-apply-key-binding":return Object.assign(Object.assign({},e),{applyBindings:[...e.applyBindings,t.binding]});case"remove-apply-key-binding":return Object.assign(Object.assign({},e),{applyBindings:e.applyBindings.filter((e=>e.id!==t.id))});case"set-key-pressed":return Object.assign(Object.assign({},e),{applyBindings:e.applyBindings.map((t=>Object.assign(Object.assign({},t),{active:null!=t.keyBind&&allPressed(t.keyBind,e.pressed)}))),pressed:Object.assign(Object.assign({},e.pressed),{[t.key]:t.pressed}),lastPressed:t.pressed?t.key:void 0})}}const useKeyBindingState=()=>useRecoilReducer({reducer:reducer,atom:va});function pressedValue(e,t){return e.includes("!")?!t[e.replace("!","")]&&!t[e.replace("!","").toLowerCase()]:t[e]||t[e.toLowerCase()]}function isPressed(e,t){const n=e.split("||");return n.length>1?n.some((e=>pressedValue(e,t))):pressedValue(n[0],t)}function allPressed(e,t){const n=undefined;return e.split("+").every((e=>isPressed(e,t)))}function matchingSingleFnBindings(e,t,n){return e.filter((e=>!e.repeat)).filter((e=>{var o;return null!=e.keyBind&&null!=n&&(null===(o=e.keyBind)||void 0===o?void 0:o.includes(n))&&allPressed(e.keyBind,t)})).map((e=>e.fn))}function matchingOffBindings(e,t,n){return e.filter((e=>e.off&&e.active&&null!=e.keyBind&&null==n&&!allPressed(e.keyBind,t))).map((e=>e.off))}const useApplyKeyBinding=e=>{const[t,n]=useKeyBindingState();o.useEffect((()=>{const o=ma.create();return n({type:"add-apply-key-binding",binding:Object.assign(Object.assign({},e),{id:o,active:null!=e.keyBind&&allPressed(e.keyBind,t.pressed)})}),()=>{n({type:"remove-apply-key-binding",id:o})}}),[e.fn,e.off,e.keyBind,e.repeat])},useStackKeyBinding=(e,t=[])=>{const[,n]=useKeyBindingState();o.useEffect((()=>{const t=null==e.addPredicate||e.addPredicate(),o=null!=e.cancelPredicate&&e.cancelPredicate();t&&n({type:"push-key-binding",binding:e}),o&&n({type:"remove-key-binding",binding:e})}),t)},useKeyBindings=({keydownRepeatInterval:e=25,keydownIgnorePredicate:t=isInputElement}={})=>{const[n,r]=useKeyBindingState(),i=o.useCallback((e=>{Object.keys(n.bindings).filter((t=>t.includes(e)&&allPressed(t,Object.assign(Object.assign({},n.pressed),{[e]:!0})))).forEach((e=>{const t=n.bindings[e],o=t.length>0?t[t.length-1]:void 0;null!=o&&(o.fn(),r({type:"remove-key-binding",binding:o}))}))}),[n]);o.useEffect((()=>{const handleKeyDown=e=>{if(!e.repeat&&!t(e.target)){r({type:"set-key-pressed",key:e.key,pressed:!0}),i(e.key);const t=Object.assign(Object.assign({},n.pressed),{[e.key]:!0}),o=matchingSingleFnBindings(n.applyBindings,t,e.key),a=matchingOffBindings(n.applyBindings,t,e.key);(o.length>0||a.length>0)&&e.preventDefault()}},handleKeyUp=e=>{r({type:"set-key-pressed",key:e.key,pressed:!1})};return window.addEventListener("keydown",handleKeyDown),window.addEventListener("keyup",handleKeyUp),()=>{window.removeEventListener("keydown",handleKeyDown),window.removeEventListener("keyup",handleKeyUp)}}),[i,n.applyBindings,n.pressed]),o.useEffect((()=>{const e=matchingSingleFnBindings(n.applyBindings,n.pressed,n.lastPressed),t=matchingOffBindings(n.applyBindings,n.pressed,n.lastPressed);e.forEach((e=>e())),t.forEach((e=>e()))}),[n.pressed,n.lastPressed]),o.useEffect((()=>{const t=n.applyBindings.filter((e=>e.repeat&&null!=e.keyBind&&allPressed(e.keyBind,n.pressed))).map((e=>e.fn));if(t.length>0){const n=setInterval((()=>{t.forEach((e=>e()))}),e);return()=>{clearInterval(n)}}return()=>{}}),[n.applyBindings,n.lastPressed])},VertexBoxSelectionButton=()=>{const t=useBoxSelectionActions(),n=Ji(ra);return useStackKeyBinding({id:"ExitBoxSelection",keyBind:"Escape",fn:t.disable,addPredicate:()=>n,cancelPredicate:()=>!n},[n]),e.jsx(i.VertexTooltip,{content:"Box Selection",children:e.jsx(i.VertexIconButton,{iconName:"box-cursor",iconColor:n?"primary":"secondary","data-testid":"viewer-toolbar-enable-box-selection-button",onClick:n?t.disable:t.enable})})};var ga={exports:{}},ya;
|
|
2
|
+
/*!
|
|
3
|
+
Copyright (c) 2018 Jed Watson.
|
|
4
|
+
Licensed under the MIT License (MIT), see
|
|
5
|
+
http://jedwatson.github.io/classnames
|
|
6
|
+
*/ya=ga,function(){var e={}.hasOwnProperty;function classNames(){for(var e="",t=0;t<arguments.length;t++){var n=arguments[t];n&&(e=appendClass(e,parseValue(n)))}return e}function parseValue(t){if("string"==typeof t||"number"==typeof t)return t;if("object"!=typeof t)return"";if(Array.isArray(t))return classNames.apply(null,t);if(t.toString!==Object.prototype.toString&&!t.toString.toString().includes("[native code]"))return t.toString();var n="";for(var o in t)e.call(t,o)&&t[o]&&(n=appendClass(n,o));return n}function appendClass(e,t){return t?e?e+" "+t:e+t:e}ya.exports?(classNames.default=classNames,ya.exports=classNames):window.classNames=classNames}();var ba=ga.exports;const Sa=1,VertexResizableContent=n=>{var{className:o,style:r,displayShadow:a,heading:s,id:l,initialScale:c,placement:u="left",children:d,onResize:p}=n,f=t.__rest(n,["className","style","displayShadow","heading","id","initialScale","placement","children","onResize"]);const h="left"===u||"right"===u,m="top"===u;function getHorizontalResizeDirection(){switch(u){case"left":return"right";case"right":return"left";default:return"none"}}function getVerticalResizeDirection(){return"top"===u?"top":"none"}const v=null!=c?c:1;return e.jsx(i.VertexResizable,Object.assign({id:l,"data-testid":`resizable-content-position-${u}`,className:ba(o,"pointer-events-auto z-popover md:z-overlay bg-white bg-opacity-95 flex-grow-0 flex-shrink-0 border-neutral-300",{"border-r min-w-75 max-w-half":"left"===u,"sidebar-shadow-right":"left"===u&&a,"border-l min-w-75 max-w-half":"right"===u,"sidebar-shadow-left":"right"===u&&a,"border-t bottom-0 fixed":"top"===u,"min-h-12 sheet":m}),style:Object.assign({maxHeight:"top"===u?window.innerHeight:void 0},r),initialHorizontalScale:h?c:void 0,initialVerticalScale:m?v:void 0,horizontalDirection:getHorizontalResizeDirection(),verticalDirection:getVerticalResizeDirection(),position:"right"===u||"top"===u?"absolute":"relative",onResizeEnd:()=>null==p?void 0:p()},f,{children:e.jsxs("div",{className:"flex flex-col h-full w-full",children:["top"===u&&e.jsx("div",{className:"flex justify-center w-full",children:e.jsx("div",{className:"block md:hidden w-20 h-0.5 mt-0.5 bg-neutral-600 rounded"})}),s,e.jsx("div",{className:ba("w-full flex flex-col h-0 flex-grow",{"right-0":"right"===u}),children:d})]})}))};function contextMenuItemIsRow(e){var t;return null!=e&&null!=(null===(t=null==e?void 0:e.node)||void 0===t?void 0:t.id)}const xa=Yi({key:"contextMenuActive",default:void 0}),wa=Yi({key:"contextMenuPosition",default:void 0}),_a=Yi({key:"contextMenuTarget",default:void 0}),Aa=Yi({key:"contextMenuItem",default:void 0}),Ea=Yi({key:"contextMenuActions",default:[]}),Ta=Zi({key:"contextMenuActivePosition",get:({get:e})=>null!=e(xa)?e(wa):void 0}),Va=Yi({key:"viewerToolkitViewerElement",default:void 0,dangerouslyAllowMutability:!0}),Ca=Yi({key:"viewerInitialSceneReady",default:!1}),ka=Yi({key:"viewerBaseInteractionHandlerProvider",default:Promise.resolve(void 0),dangerouslyAllowMutability:!0}),Na=Yi({key:"viewerPrimaryInteractionType",default:"rotate"}),Ra=Zi({key:"viewerScene",get:({get:e})=>async()=>{var t;return null===(t=e(Va))||void 0===t?void 0:t.scene()},dangerouslyAllowMutability:!0}),Ia=Yi({key:"viewerFrameScene",default:void 0,dangerouslyAllowMutability:!0}),Oa=Zi({key:"viewerSceneVisibleBoundingBox",get:({get:e})=>{var t;return null===(t=e(Ia))||void 0===t?void 0:t.boundingBox}});function useViewerSceneActions(){const e=useActionCallback((({snapshot:e})=>async(t,n,...o)=>{const r=await e.getPromise(Ra),i=await r();o.length>0&&await(null==i?void 0:i.items((e=>o.map((t=>t(e))))).execute({suppliedCorrelationId:n}))})),t=o.useCallback(((...e)=>t=>t.where((t=>t.withItemIds(e))).select()),[]),n=o.useCallback(((...e)=>t=>t.where((t=>t.withItemIds(e))).deselect()),[]),r=o.useCallback((e=>e.where((e=>e.all())).deselect()),[]);return{executeWithCorrelationId:e,execute:useActionCallback((()=>async(t,...n)=>{const o=ma.create();await e(t,o,...n)})),selectItemsTransform:t,deselectItemsTransform:n,clearSelectionTransform:r,reset:useActionCallback((({snapshot:e})=>async t=>{const n=await e.getPromiseRequired(Ra),o=await n(),r=await e.getPromiseRequired(Pa);null==o||o.reset({includeCamera:!0,suppliedCorrelationId:t,cameraTypeOverride:r})}))}}const La=500;function useViewerCameraActions(){return{flyToById:useActionCallback((({snapshot:e})=>async(t,n)=>{const o=await e.getPromise(Ra),r=await o();await(null==r?void 0:r.camera().flyTo({itemId:t}).render({animation:{milliseconds:null!=n?n:La}}))})),flyToByBoundingBox:useActionCallback((({snapshot:e})=>async(t,n)=>{const o=await e.getPromise(Ra),r=await o();await(null==r?void 0:r.camera().flyTo({boundingBox:t}).render({animation:{milliseconds:null!=n?n:La}}))})),updateCameraType:useActionCallback((({set:e})=>t=>{e(Pa,t)}))}}const Pa=Yi({key:"viewerCameraType",default:"perspective"});class ja{constructor(){this.interactionStarted=!1}initialize(e,t){this.api=t}dispose(){this.endInteraction()}async beginInteraction(){var e;this.interactionStarted||(await(null===(e=this.api)||void 0===e?void 0:e.beginInteraction()),this.interactionStarted=!0)}async endInteraction(){var e;await(null===(e=this.api)||void 0===e?void 0:e.endInteraction()),this.interactionStarted=!1}}const create=(e,t=0)=>({normal:e,offset:t}),forAxis=(e,t)=>{switch(e){case"x":return x(t);case"y":return y(t);case"z":return z(t)}},x=e=>create(a.Vector3.left(),-e),y=e=>create(a.Vector3.down(),-e),z=e=>create(a.Vector3.forward(),-e),getAxis=(e,t)=>{switch(e){case"x":return xAxis(t);case"y":return yAxis(t);case"z":return zAxis(t)}},Ma={x:a.Vector3.left(),y:a.Vector3.down(),z:a.Vector3.forward()},xAxis=e=>e.x,yAxis=e=>e.y||a.Vector3.create(e.x.z,e.x.x,e.x.y),zAxis=e=>e.z||a.Vector3.create(e.x.y,e.x.z,e.x.x),axis=(e,t,n,o)=>e&&e.normal&&[["x",t],["y",n],["z",o]].filter((t=>0===a.Vector3.magnitude(a.Vector3.cross(e.normal,t[1])))).map((e=>e[0])).pop(),isNegativeNormal=e=>a.Vector3.dot(a.Vector3.create(-1,-1,-1),e.normal)>0,towardsVector=(e,t)=>{const n=undefined;return a.Vector3.dot(e,t.normal)<0?invert(t):t},towardsCamera=(e,t)=>towardsVector(e.viewVector,t),invert=e=>Object.assign(Object.assign({},e),{normal:a.Vector3.multiply(e.normal,a.Vector3.create(-1,-1,-1)),offset:-e.offset}),fromHit=(e,t)=>{const n=a.Vector3.normalize(e.normal),o=a.Vector3.dot(n,e.position);return towardsCamera(t,create(n,o))},toAxis=(e,t,n,o,r)=>{const i=n.viewAll(),s=getAxis(e,t),l=null!=o&&null!=s?create(s,a.Vector3.dot(s,r||a.BoundingBox.center(o))):forAxis(e,i.lookAt[e]);return towardsCamera(n,l)};function corners(e){return[a.Vector3.create(e.min.x,e.min.y,e.min.z),a.Vector3.create(e.min.x,e.min.y,e.max.z),a.Vector3.create(e.min.x,e.max.y,e.min.z),a.Vector3.create(e.min.x,e.max.y,e.max.z),a.Vector3.create(e.max.x,e.max.y,e.max.z),a.Vector3.create(e.max.x,e.max.y,e.min.z),a.Vector3.create(e.max.x,e.min.y,e.max.z),a.Vector3.create(e.max.x,e.min.y,e.min.z)]}const Da={default:5,min:0,max:10},Ba=Yi({key:"crossSectioningEnabled",default:!1}),za=Yi({key:"crossSectioningHighlightColor",default:void 0}),Ua=Yi({key:"crossSectioningBorderWidth",default:void 0}),Fa=Yi({key:"crossSectioningPlanes",default:[]}),Ha=Yi({key:"crossSectioningAlignment",default:{mode:"global",hitPending:!1}}),Wa=Zi({key:"crossSectioningTargetBoundingBox",get:async({get:e})=>{const t=undefined;return e(Oa)}}),$a=Yi({key:"crossSectioningIsInteractive",default:!1}),Ga=Yi({key:"crossSectioningActiveAxis",default:"x"}),Ka=Yi({key:"crossSectioningAvailableAxes",default:Ma}),qa=Zi({key:"crossSectioningOffsetScalar",get:({get:e})=>{const t=e(Fa);return t.length>0&&isNegativeNormal(t[0])?-1:1}}),Ya=Zi({key:"crossSectioningSliderRange",get:({get:e})=>{const t=e(Fa),n=e(Wa),o=null!=n?corners(n):[];if(t.length>0){const e=o.map((e=>a.Vector3.dot(e,isNegativeNormal(t[0])?a.Vector3.multiply(t[0].normal,a.Vector3.create(-1,-1,-1)):t[0].normal)));return{default:t[0].offset,min:Math.min(...e)-2,max:Math.max(...e)+2}}return Da}}),Za=Zi({key:"crossSectioningPlaneDisplayOffset",get:({get:e})=>{const t=e(Fa),n=e(qa),o=e(Ya);return t.length>0?t[0].offset*n:o.default}}),Xa=Yi({key:"crossSectioningAdditionalToolsOpen",default:!1}),Ja=Yi({key:"crossSectioningAlignmentToolsOpen",default:!1}),Qa=Yi({key:"crossSectioningAxisToolsOpen",default:!1}),es=Yi({key:"crossSectioningInteractionHandler",default:new ja,dangerouslyAllowMutability:!0});function useCrossSectioning(e,t){const n=Ji(es);o.useEffect((()=>{t&&(null==e||e.registerInteractionHandler(n))}),[e,t,n])}const ts=Yi({key:"hitResultsTapDetails",default:void 0}),ns=Yi({key:"hitResultsLongPressDetails",default:void 0}),os=Yi({key:"previousHitResult",default:void 0}),rs=Yi({key:"currentHitResult",default:void 0}),is=Zi({key:"hitResult",get:async({get:e})=>{var t,n,o,r,i,s,l,c;const u=e(ts),d=e(ns),p=null!=u?u:d,f=e(Ra),h=await f(),m=null==h?void 0:h.sceneViewId,v=null==h?void 0:h.raycaster();if(null!=p&&null!=v&&null!=m){const e=await v.hitItems(p.position),u=((null==e?void 0:e.hits)||[])[0];if(null!=u)return{id:null===(t=u.itemId)||void 0===t?void 0:t.hex,normal:a.Vector3.create((null===(n=null==u?void 0:u.hitNormal)||void 0===n?void 0:n.x)||0,(null===(o=null==u?void 0:u.hitNormal)||void 0===o?void 0:o.y)||0,(null===(r=null==u?void 0:u.hitNormal)||void 0===r?void 0:r.z)||0),position:a.Vector3.create((null===(i=null==u?void 0:u.hitPoint)||void 0===i?void 0:i.x)||0,(null===(s=null==u?void 0:u.hitPoint)||void 0===s?void 0:s.y)||0,(null===(l=null==u?void 0:u.hitPoint)||void 0===l?void 0:l.z)||0),meta:p.metaKey||p.ctrlKey||!1,metadata:[],ancestors:(null===(c=null==u?void 0:u.ancestors)||void 0===c?void 0:c.filter((e=>{var t;return null!=(null===(t=e.itemId)||void 0===t?void 0:t.hex)})).map((e=>{var t;return null===(t=e.itemId)||void 0===t?void 0:t.hex})))||[]}}}}),as=Yi({key:"hitResultsSkipNextTap",default:!1}),alignToNormal=(e,t,n)=>{if(e.toFrameCamera().isPerspective()){const n=a.Vector3.dot(a.Vector3.normalize(e.up),t),o=Math.abs(n)>.98?a.Vector3.normalize(a.Vector3.scale(-n,e.viewVector)):e.up,r=a.Vector3.add(a.Vector3.scale(a.Vector3.distance(e.position,e.lookAt),a.Vector3.multiply(t,a.Vector3.create(-1,-1,-1))),e.lookAt);return e.update({up:o,position:r})}{const o=a.Vector3.angleTo(a.Vector3.normalize(e.viewVector),t),r=null!=n?a.BoundingBox.center(n):e.lookAt,i=a.Vector3.normalize(a.Vector3.cross(a.Vector3.normalize(e.viewVector),t));return e.rotateAroundAxisAtPoint(o,r,i)}};function isParallelTo(e,t){const n=a.Angle.toDegrees(a.Vector3.angleTo(e,t));return 0===n||180===n}const ss=500;function useCrossSectioningActions(){const e=useActionCallback((({snapshot:e})=>async()=>{const t=await e.getPromise(Ua),n=await e.getPromise(za),o=await e.getPromise(Fa),r=await e.getPromise(Ra),i=await r();await(null==i?void 0:i.crossSectioning().update({sectionPlanes:o,highlightColor:n?ca.fromHexString(n):void 0,lineWidth:t}))})),t=useActionCallback((({set:t,reset:n,snapshot:o})=>async()=>{const r=await o.getPromise(Ra),i=await r();if(null!=i){const o=i.camera().viewAll();n(Ka),t(Fa,[towardsCamera(i.camera(),x(o.lookAt.x))]),e()}})),n=useActionCallback(retainSnapshot((({snapshot:t,set:n})=>async()=>{const o=await t.tryGetPromise(is).then((e=>e.value)),r=await t.getPromise(Ra),i=await r();if(null!=o&&null!=i){const t=fromHit(o,i.camera());n(Fa,null!=t?[t]:[]),n(Ka,null!=t?{x:t.normal}:Ma),e()}}))),o=useActionCallback((({set:e,snapshot:n})=>async()=>{const o=await n.getPromise(Fa),r=undefined;await n.getPromise(Ba)||(e(Ba,!0),0===o.length&&await t())})),r=useActionCallback((({reset:t,snapshot:n})=>async()=>{const o=undefined;await n.getPromise(Ba)&&(t(Ba),t(Xa),t(Ja),t(Qa),t(Fa),t(Ha),t(Ga),await e())}));return{enable:o,disable:r,openAdditionalTools:useActionCallback((({set:e,snapshot:t})=>async()=>{const n=undefined;await t.getPromise(Ba)||o(),e(Xa,!0)})),closeAdditionalTools:useActionCallback((({reset:e})=>async()=>{e(Xa)})),openAlignmentTools:useActionCallback((({set:e,reset:t})=>async()=>{t(Qa),e(Ja,!0)})),closeAlignmentTools:useActionCallback((({reset:e})=>async()=>{e(Ja)})),openAxisTools:useActionCallback((({set:e,reset:t})=>async()=>{t(Ja),e(Qa,!0)})),closeAxisTools:useActionCallback((({reset:e})=>async()=>{e(Qa)})),beginInteraction:useActionCallback((({set:e,snapshot:t})=>async()=>{const n=await t.getPromise(es);e($a,!0),await n.beginInteraction()})),endInteraction:useActionCallback((({reset:e,snapshot:t})=>async()=>{const n=await t.getPromise(es);e($a),await n.endInteraction()})),updatePlanes:useActionCallback(retainSnapshot((({set:t,snapshot:n})=>async o=>{const r=await n.getPromise(Fa);if(r.length>0){const i=await n.getPromise(qa),a=await n.getPromise(Ya),s=i<0?-1*a.max:a.min,l=i<0?-1*a.min:a.max,c=r.map((e=>Object.assign(Object.assign({},e),{offset:Math.min(Math.max(o*i,s),l)})));t(Fa,c),e()}}))),flipPlanes:useActionCallback((({set:t,snapshot:n})=>async()=>{const o=await n.getPromise(Fa);t(Fa,o.map((e=>invert(e)))),e()})),alignViewToPlane:useActionCallback((({snapshot:e})=>async()=>{const t=await e.getPromise(Fa),n=await e.getPromise(Va),o=await(null==n?void 0:n.scene());t.length>0&&null!=o&&await alignToNormal(o.camera(),t[0].normal,o.boundingBox()).render({animation:{milliseconds:ss}})})),updateAxis:useActionCallback(retainSnapshot((({set:t,reset:n,snapshot:o})=>async r=>{const i=await o.getPromise(Fa),s=await o.getPromise(Ka),l=await o.getPromise(Wa),c=await o.getPromise(Ha),u=await o.getPromise(Va),d=await(null==u?void 0:u.scene()),p=s[r],f=null!=p&&i.length>0&&isParallelTo(i[0].normal,p)&&!isNaN(a.Vector3.angleTo(i[0].normal,p));if(null!=d&&!f){const e=await o.tryGetPromise(is).then((e=>e.value));t(Ga,r),t(Fa,[toAxis(r,s,d.camera(),l,"global"!==c.mode?null==e?void 0:e.position:void 0)])}n(Qa),e()}))),updateAlignment:useActionCallback((({set:e,reset:r})=>async(i,a)=>{r(Ja),e(Ha,{mode:i,hitPending:"global"!==i&&null==a}),"global"===i?(r(Ga),r(Ka),t()):"surface"===i&&null!=a&&(await o(),n())})),cancelCurrentHit:useActionCallback((({set:e,snapshot:t})=>async()=>{const n=await t.getPromise(Ha);n.hitPending&&e(Ha,Object.assign(Object.assign({},n),{hitPending:!1}))})),sectionCurrentHit:useActionCallback((({set:e,snapshot:t})=>async()=>{const o=await t.getPromise(Ha);o.hitPending&&(e(Ha,Object.assign(Object.assign({},o),{hitPending:!1})),"surface"===o.mode&&n())}))}}var ls=Object.freeze({__proto__:null,DEFAULT_ALIGN_TO_PLANE_ANIMATION_DURATION_MS:ss,DEFAULT_SLIDER_RANGE:Da,crossSectioningActiveAxis:Ga,crossSectioningAdditionalToolsOpen:Xa,crossSectioningAlignment:Ha,crossSectioningAlignmentToolsOpen:Ja,crossSectioningAvailableAxes:Ka,crossSectioningAxisToolsOpen:Qa,crossSectioningBorderWidth:Ua,crossSectioningEnabled:Ba,crossSectioningHighlightColor:za,crossSectioningInteractionHandler:es,crossSectioningIsInteractive:$a,crossSectioningOffsetScalar:qa,crossSectioningPlaneDisplayOffset:Za,crossSectioningPlanes:Fa,crossSectioningSliderRange:Ya,crossSectioningTargetBoundingBox:Wa,useCrossSectioning:useCrossSectioning,useCrossSectioningActions:useCrossSectioningActions});const useHitActions=()=>{const e=useCrossSectioningActions(),t=useActionCallback(retainSnapshot((({snapshot:e})=>async()=>{await e.tryGetPromise(is).then((e=>e.value))}))),n=useActionCallback(retainSnapshot((({snapshot:e})=>async()=>{await e.tryGetPromise(is).then((e=>e.value))}))),o=useActionCallback(retainSnapshot((({set:e,snapshot:t})=>async()=>{const n=await t.tryGetPromise(is).then((e=>e.value));e(Aa,n)}))),r=useActionCallback(retainSnapshot((({snapshot:e,set:t})=>async()=>{t(rs,await e.tryGetPromise(is).then((e=>e.value)))})));return{tap:useActionCallback(retainSnapshot((({snapshot:i,set:a})=>async({detail:s},...l)=>{const c=await i.getPromise(Ha),u=2!==(null==s?void 0:s.buttons)&&!(null==s?void 0:s.altKey);s.altKey||s.ctrlKey||s.metaKey||s.shiftKey;const d=u&&!c.hitPending,p=await i.tryGetPromise(is).then((e=>e.value));a(os,p),a(ts,s),t(),d&&(l.forEach((e=>e())),n()),o(),e.sectionCurrentHit(),r()}))),longPress:useActionCallback(retainSnapshot((({snapshot:e,set:t,reset:n})=>async i=>{n(ts),t(ns,i.detail),await e.tryGetPromise(is),o(),r()})))}},cs=Zi({key:"viewerToolkitHitState",get:({get:e})=>{const t=undefined,n=undefined,o=undefined,r=undefined,i=undefined;return{tapDetails:e(ts),longPressDetails:e(ns),previousHitResult:e(os),currentHitResult:e(rs)}}});var us=Object.freeze({__proto__:null,currentHitResult:rs,hitResult:is,hitResultsLongPressDetails:ns,hitResultsSkipNextTap:as,hitResultsTapDetails:ts,hitState:cs,previousHitResult:os,useHitActions:useHitActions});function useContextMenuActions(){return{pointerDown:useActionCallback((({set:e})=>async t=>{if(2===t.button){const n=t.clientX,o=null==t?void 0:t.clientY;e(wa,a.Point.create(n,o)),e(_a,t.target)}})),pointerUp:useActionCallback((({snapshot:e,set:t})=>async(n,o,r,i)=>{const s=await e.getPromise(wa),l=await e.getPromise(xa);if(null!=s&&null==l){const e=n.clientX,l=null==n?void 0:n.clientY,c=a.Point.create(e,l),u=null!=s?a.Point.distance(s,c):0,d=null==r||r(n);u<2&&d&&(null==i||i(n,null!=s?s:c),t(xa,o))}})),contextMenu:useActionCallback((()=>(e,t)=>{(null==t||t(e))&&e.preventDefault()})),longPress:useActionCallback((({set:e})=>(t,n,o,r)=>{if(null==o||o(t)){const o=a.Point.create(t.touches[0].clientX,t.touches[0].clientY);e(wa,o),e(_a,t.target),e(xa,n),null==r||r(t,o)}})),clearActiveContextMenu:useActionCallback((({reset:e,set:t})=>n=>{t(as,!!n),e(xa),e(Ea),e(wa)})),clearDismissedState:useActionCallback((({reset:e})=>()=>e(as)))}}function targetWithinMenu(e){return e.target instanceof Element&&isChildOf("vertex-menu",e.target)}function targetShouldSkipNextHit(e){return e.target instanceof Element&&isChildOf("vertex-viewer",e.target)}function isChildOf(e,t){return null!=t.closest(e)}function useDefaultKeybindings(){useApplyKeyBinding({fn:useActionCallback((({snapshot:e})=>async()=>{const t=await e.getPromiseRequired(Ra),n={milliseconds:500},o=await t();await(null==o?void 0:o.camera().viewAll().render({animation:n}))})),keyBind:"f"})}function useLongPress({target:e,callback:t,delay:n=500,onMovement:o}){const[r,i]=d.useState(),[s,l]=d.useState();d.useEffect((()=>{const handleTouchStart=e=>{const o=e;null!=o.touches&&1===o.touches.length&&(null!=r&&clearTimeout(r),l(a.Point.create(o.touches[0].clientX,o.touches[0].clientY)),i(setTimeout((()=>null==t?void 0:t(o)),n)))},handleTouchMove=e=>{const t=e;null!=t.touches&&t.touches.length>0&&null!=r&&null!=s&&a.Point.distance(s,a.Point.create(t.touches[0].clientX,t.touches[0].clientY))>=2&&(clearTimeout(r),null==o||o())},handleTouchEnd=()=>{null!=r&&clearTimeout(r)};return null==e||e.addEventListener("touchstart",handleTouchStart),null==e||e.addEventListener("touchmove",handleTouchMove),null==e||e.addEventListener("touchend",handleTouchEnd),()=>{null==e||e.removeEventListener("touchstart",handleTouchStart),null==e||e.removeEventListener("touchmove",handleTouchMove),null==e||e.removeEventListener("touchend",handleTouchEnd)}}),[e,r,s])}function asBooleanAttribute(e){return!!e||void 0}const VertexContextMenu=({targetElement:t,menuType:n,disableBackdrop:r,openPredicate:a,onOpen:s,onClose:l,children:c})=>{const u=useContextMenuActions(),d=Ji(xa),p=Ji(Ta),f=o.useMemo((()=>["bottom-end","top-start","top-end","right","left"]),[]),h=d===n;useStackKeyBinding({id:"ContextMenu",keyBind:"Escape",fn:u.clearActiveContextMenu,addPredicate:()=>null!=d&&d===n,cancelPredicate:()=>null==d},[d]);const m=o.useMemo((()=>null!=t?t:null!=a?window:void 0),[t,a]);return useLongPress({target:m,callback:e=>u.longPress(e,n,a,s),onMovement:()=>u.clearActiveContextMenu()}),o.useEffect((()=>{const handleWindowPointerDown=e=>{const t=undefined;if(!targetWithinMenu(e)&&2!==e.buttons&&d===n){const t=targetShouldSkipNextHit(e);u.clearActiveContextMenu(t)}};if(r)return window.addEventListener("pointerdown",handleWindowPointerDown),()=>{window.removeEventListener("pointerdown",handleWindowPointerDown)}}),[r,n,d]),o.useEffect((()=>{const handlePointerDown=e=>{u.pointerDown(e)},handlePointerUp=e=>{u.pointerUp(e,n,a,s)},handleContextMenu=e=>u.contextMenu(e,a);return null==m||m.addEventListener("pointerdown",handlePointerDown),null==m||m.addEventListener("pointerup",handlePointerUp),null==m||m.addEventListener("contextmenu",handleContextMenu),()=>{null==m||m.removeEventListener("pointerdown",handlePointerDown),null==m||m.removeEventListener("pointerup",handlePointerUp),null==m||m.removeEventListener("contextmenu",handleContextMenu)}}),[t,n,a]),e.jsx("div",{className:ba({hidden:!h}),children:e.jsx(i.VertexMenu,{"data-testid":`${n}-context-menu`,open:asBooleanAttribute(h),position:p,fallbackPlacements:f,backdrop:!r,onMenuClosed:()=>{u.clearActiveContextMenu(),null==l||l()},children:e.jsx("div",{className:"pt-1",children:c})})})};var ds;!function(e){e.HIDE_ITEM="Hide Item",e.SHOW_ONLY_SELECTED="Show Only Selected",e.HIDE_SELECTED="Hide Selected",e.SHOW_ONLY_ITEM="Show Only Item",e.SHOW_ALL="Show All",e.HIDE_ALL="Hide All",e.SELECT_FILTERED_ITEMS="Select Filtered Items",e.INVERT_SELECTION="Invert Selection",e.CLEAR_ALL_TRANSFORMS="Clear All Transforms",e.CLEAR_SELECTED_TRANSFORMS="Clear Selected Transforms",e.CLEAR_SELECTION="Clear Selection",e.DESELECTING_ITEMS="Deselecting Items",e.SELECTING_ITEMS="Selecting Items",e.SELECTING_ONLY_ITEM="Selecting Only Item",e.SELECTING_ANCESTOR="Selecting Ancestor",e.APPLY_MATERIAL_OVERRIDE_TO_ALL="Apply Material Override To All",e.APPLY_MATERIAL_OVERRIDE_TO_SELECTION="Apply Material Override To Selection",e.CLEAR_ALL_MATERIAL_OVERRIDES="Clear All Material Overrides",e.CLEAR_SELECTED_MATERIAL_OVERRIDES="Clear Selected Material Overrides",e.SET_PHANTOM_ALL="Set Phantom All",e.SET_PHANTOM_SELECTED_ITEMS="Set Phantom Selected Items",e.CLEAR_PHANTOM_ALL="Clear Phantom All",e.CLEAR_PHANTOM_SELECTED_ITEMS="Clear Phantom Selected Items",e.SET_PHANTOM_NON_SELECTED_ITEMS="Set Phantom Non Selected Items",e.RESTORE_PHANTOM_OVERRIDES="Restore Phantom Overrides",e.SET_ITEM_AS_END_ITEM="Set Item as End Item",e.UNSET_ITEM_AS_END_ITEM="Unset Item as End Item",e.SHOW_ANNOTATION="Show Annotation",e.HIDE_ANNOTATION="Hide Annotation"}(ds||(ds={}));const ps=Xi({key:"selectionSelectedItems",default:void 0}),fs=Yi({key:"selectionSelectedItemIds",default:[]}),hs=Yi({key:"selectionLastSelected",default:void 0}),ms=Yi({key:"selectionLastSelectionFromViewer",default:!1}),vs=Yi({key:"selectionLastSelectWasMultiSelect",default:!1}),gs=Zi({key:"selectionHighestSelectedAncestor",get:({get:e})=>{var t,n;const o=e(hs),r=e(fs);return null!==(n=null===(t=null==o?void 0:o.ancestors)||void 0===t?void 0:t.find((e=>r.includes(e))))&&void 0!==n?n:null==o?void 0:o.id}}),ys=Yi({key:"selectionPreviousVisibleSummary",default:void 0}),bs=Yi({key:"selectionVisibleSummary",default:void 0}),Ss=Zi({key:"selectionVisibleCount",get:({get:e})=>{var t,n;return null!==(n=null===(t=e(bs))||void 0===t?void 0:t.count)&&void 0!==n?n:0}}),xs=Zi({key:"selectionIsActive",get:({get:e})=>{const t=e(fs),n=undefined;return e(Ss)>0||t.length>0}});function useSelectionActions(){const e=useViewerSceneActions(),t=useActionCallback((({snapshot:e,reset:t})=>async()=>{const n=undefined;(await e.getPromise(fs)).forEach((e=>t(ps(e))))})),n=useActionCallback((({snapshot:t,reset:n,set:o})=>async(r,i)=>{var a,s;const l=await t.getPromise(ps(r.id)),u=await t.getPromise(fs),d=null===(s=[...null!==(a=r.ancestors)&&void 0!==a?a:[]])||void 0===s?void 0:s.reverse().find((e=>!u.includes(e)));null!=l&&null!=d?(o(ps(d),{id:d}),o(fs,(e=>[...e,d])),e.execute(ds.SELECTING_ANCESTOR,e.selectItemsTransform(d))):(null==i?void 0:i.clear)?(o(ps(r.id),r),o(fs,[r.id]),e.execute(ds.SELECTING_ONLY_ITEM,e.clearSelectionTransform,e.selectItemsTransform(r.id))):(o(ps(r.id),r),o(fs,(e=>[...e,r.id])),e.execute(ds.SELECTING_ITEMS,e.selectItemsTransform(r.id))),c(r),o(hs,r),o(ms,!0),n(vs)})),o=useActionCallback((({reset:t,set:n})=>async o=>{t(ps(o)),t(vs),n(fs,(e=>e.filter((e=>e!==o)))),e.execute(ds.DESELECTING_ITEMS,e.deselectItemsTransform(o))})),r=useActionCallback((({snapshot:e})=>async t=>{const r=await e.getPromise(ps(t.id));null!=r?await o(r.id):await n(t)})),i=useActionCallback((({snapshot:e,reset:t,set:o})=>async(r,i={})=>{const a=await e.getPromise(ps(r.id)),s=await e.getPromise(fs);if(s.filter((e=>{var t;return e!==r.id&&!(null===(t=r.ancestors)||void 0===t?void 0:t.includes(e))})).forEach((e=>t(ps(e)))),t(vs),a)if(i.ignoreAncestorSelection)t(fs),t(ps(a.id));else{const e=s.filter((e=>{var t;return e===r.id||(null===(t=r.ancestors)||void 0===t?void 0:t.includes(e))}));o(fs,e)}else t(fs);await n(r,{clear:!0})})),a=useActionCallback((({reset:e})=>async()=>{await t(),e(fs),e(hs),e(ms),e(vs)})),s=useActionCallback((()=>async()=>{await a(),e.execute(ds.CLEAR_SELECTION,e.clearSelectionTransform)})),l=useActionCallback((({set:e})=>async t=>{e(vs,t)})),c=useActionCallback((({reset:e,set:t})=>e=>{}));return{select:n,toggleSelection:r,clearAndSelect:i,selectCurrentHit:useActionCallback(retainSnapshot((({snapshot:e})=>async()=>{const t=await e.tryGetPromise(is).then((e=>e.value)),n=await e.getPromise(ts),o=(null==n?void 0:n.metaKey)||(null==n?void 0:n.ctrlKey)||(null==n?void 0:n.shiftKey);null==t||o?null!=t&&o?r(t):s():i(t)}))),syncSelection:useActionCallback((({set:e,reset:n})=>async(o,r)=>{r.selected?(await t(),e(ps(o.id),o),r.multiSelect?e(fs,(e=>[...e.filter((e=>e!==o.id)),o.id])):e(fs,[o.id]),c(o),e(hs,o),e(ms,!1),e(vs,!!r.multiSelect)):(n(ps(o.id)),n(vs),e(fs,(e=>e.filter((e=>e!==o.id)))))})),deselect:o,clearSelection:s,resetSelectionState:a,toggleLastSelectWasMultiSelect:l,selectForModelViewsPanel:c}}const ws=Zi({key:"viewerToolkitSelectionState",get:({get:e})=>{const t=undefined,n=undefined,o=undefined,r=undefined;return{selectedItemIds:e(fs),lastSelected:e(hs),highestSelectedAncestorId:e(gs)}}});var _s=Object.freeze({__proto__:null,selectionHighestSelectedAncestor:gs,selectionIsActive:xs,selectionLastSelectWasMultiSelect:vs,selectionLastSelected:hs,selectionLastSelectionFromViewer:ms,selectionPreviousVisibleSummary:ys,selectionSelectedItemIds:fs,selectionSelectedItems:ps,selectionState:ws,selectionVisibleCount:Ss,selectionVisibleSummary:bs,useSelectionActions:useSelectionActions});const VertexFitSelectedMenuItem=()=>{const t=Ji(fs),n=Ji(bs),o=useViewerCameraActions();return e.jsxs(i.VertexMenuItem,{"data-testid":"fit-selected-menu-option",onClick:()=>{null!=(null==n?void 0:n.boundingBox)&&o.flyToByBoundingBox(n.boundingBox)},disabled:asBooleanAttribute(0===t.length),children:[e.jsx(i.VertexIcon,{slot:"icon",name:"fit-selected",size:"sm"}),e.jsx("div",{className:"pl-2",children:"Fit Selected"})]})},VertexFlyToMenuItem=()=>{const t=useViewerCameraActions(),n=Ji(Aa);return e.jsxs(i.VertexMenuItem,{"data-testid":"fly-to-part-menu-option",onClick:()=>{var e;const o=undefined,r=contextMenuItemIsRow(n)?null===(e=null==n?void 0:n.node.id)||void 0===e?void 0:e.hex:null==n?void 0:n.id;null!=r&&t.flyToById(r)},disabled:asBooleanAttribute(null==n),children:[e.jsx(i.VertexIcon,{slot:"icon",name:"paper-airplane",size:"sm"}),e.jsx("div",{className:"pl-2",children:"Fly To"})]})};function useSceneItemsOperations(){const e=Ji(Va),t=undefined,n=undefined,r=undefined,i=undefined,a=undefined,s=undefined;return{sceneItemsOperation:o.useCallback((async(t,n)=>{const o=await(null==e?void 0:e.scene());null==n?await(null==o?void 0:o.items((e=>t(e.where((e=>e.all()))))).execute()):n.length>0&&await(null==o?void 0:o.items((e=>t(e.where((e=>e.withItemIds(n)))))).execute())}),[e]),showOnlySelected:o.useCallback((async()=>{const t=await(null==e?void 0:e.scene());null==t||t.items((e=>[e.where((e=>e.all())).hide(),e.where((e=>e.withSelected())).show()])).execute()}),[e]),hideSelected:o.useCallback((async()=>{const t=await(null==e?void 0:e.scene());null==t||t.items((e=>[e.where((e=>e.withSelected())).hide()])).execute()}),[e]),showOnlyItem:o.useCallback((async t=>{const n=await(null==e?void 0:e.scene());null==n||n.items((e=>[e.where((e=>e.all())).hide(),e.where((e=>e.withItemIds([t]))).show()])).execute()}),[e]),ghostSelected:o.useCallback((async()=>{const t=await(null==e?void 0:e.scene());null==t||t.items((e=>[e.where((e=>e.withSelected())).setPhantom(!0)])).execute()}),[e]),unGhostSelected:o.useCallback((async()=>{const t=await(null==e?void 0:e.scene());null==t||t.items((e=>[e.where((e=>e.withSelected())).setPhantom(!1)])).execute()}),[e])}}const VertexHideAllMenuItem=()=>{const t=useSceneItemsOperations();return e.jsxs(i.VertexMenuItem,{"data-testid":"hide-all-menu-option",onClick:()=>{t.sceneItemsOperation((e=>e.hide()))},children:[e.jsx(i.VertexIcon,{slot:"icon",name:"visibility-hidden",size:"sm"}),e.jsx("div",{className:"pl-2",children:"Hide All Parts"})]})},VertexHidePartMenuItem=()=>{const t=Ji(Aa),n=useSceneItemsOperations();return e.jsxs(i.VertexMenuItem,{"data-testid":"hide-menu-option",onClick:()=>{var e;const o=undefined,r=contextMenuItemIsRow(t)?null===(e=null==t?void 0:t.node.id)||void 0===e?void 0:e.hex:t.id;null!=r&&n.sceneItemsOperation((e=>e.hide()),[r])},disabled:asBooleanAttribute(null==t),children:[e.jsx(i.VertexIcon,{slot:"icon",name:"visibility-hidden",size:"sm"}),e.jsx("div",{className:"pl-2",children:"Hide Part"})]})},VertexHideSelectedMenuItem=()=>{const t=Ji(fs),n=useSceneItemsOperations();return e.jsxs(i.VertexMenuItem,{"data-testid":"hide-selected-menu-option",onClick:()=>n.hideSelected(),disabled:asBooleanAttribute(0===t.length),children:[e.jsx(i.VertexIcon,{slot:"icon",name:"visibility-hidden",size:"sm"}),e.jsx("div",{className:"pl-2",children:"Hide Selected"})]})},VertexShowAllMenuItem=()=>{const t=useSceneItemsOperations();return e.jsxs(i.VertexMenuItem,{"data-testid":"show-all-menu-option",onClick:()=>{t.sceneItemsOperation((e=>e.show()))},children:[e.jsx(i.VertexIcon,{slot:"icon",name:"visibility-visible",size:"sm"}),e.jsx("div",{className:"pl-2",children:"Show All Parts"})]})},VertexShowOnlyMenuItem=()=>{const t=Ji(Aa),n=useSceneItemsOperations();return e.jsxs(i.VertexMenuItem,{"data-testid":"show-only-menu-option",onClick:()=>{var e;const o=undefined,r=contextMenuItemIsRow(t)?null===(e=null==t?void 0:t.node.id)||void 0===e?void 0:e.hex:null==t?void 0:t.id;null!=r&&n.showOnlyItem(r)},disabled:asBooleanAttribute(null==t),children:[e.jsx(i.VertexIcon,{slot:"icon",name:"visibility-visible",size:"sm"}),e.jsx("div",{className:"pl-2",children:"Show Only Part"})]})},VertexShowOnlySelectedMenuItem=()=>{const t=Ji(fs),n=useSceneItemsOperations();return e.jsxs(i.VertexMenuItem,{"data-testid":"show-only-selected-menu-option",onClick:()=>n.showOnlySelected(),disabled:asBooleanAttribute(0===t.length),children:[e.jsx(i.VertexIcon,{slot:"icon",name:"visibility-visible",size:"sm"}),e.jsx("div",{className:"pl-2",children:"Show Only Selected"})]})};Yi({key:"sceneTreeLoaderVisible",default:!1});const As=Yi({key:"sceneTreeElement",default:void 0}),Es=Yi({key:"sceneTreeWidth",default:void 0});function useSceneTreeActions(){const e=useSelectionActions(),t=useViewerCameraActions();return{toggleSelection:useActionCallback((({snapshot:t})=>async(n,o,r)=>{var i,a;if(!n.defaultPrevented&&0===n.button&&(n.altKey||((n.ctrlKey||n.metaKey)&&o.selected?r.deselectItem(o):o.selected?r.selectItem(o,{recurseParent:!0}):o.selected||r.selectItem(o,{append:n.ctrlKey||n.metaKey,range:n.shiftKey})),null!=o.id)){const r=await t.getPromise(hs);e.syncSelection({id:null===(i=o.id)||void 0===i?void 0:i.hex,ancestors:null!==(a=null==r?void 0:r.ancestors)&&void 0!==a?a:[]},{selected:!n.metaKey&&!n.ctrlKey||!o.selected,multiSelect:n.shiftKey||n.metaKey||n.ctrlKey})}})),toggleExpansion:useActionCallback((()=>(e,t,n)=>{n.toggleExpandItem(t)})),toggleVisibility:useActionCallback((()=>(e,t,n)=>{n.toggleItemVisibility(t)})),flyToRow:useActionCallback((({snapshot:e})=>async n=>{var o;const r=await e.getPromise(As),i=await(null==r?void 0:r.getRowAtClientY(n));null!=(null===(o=null==i?void 0:i.node.id)||void 0===o?void 0:o.hex)&&await t.flyToById(i.node.id.hex)})),setContextMenuItem:useActionCallback((({set:e,snapshot:t})=>async n=>{const o=await t.getPromise(As),r=await(null==o?void 0:o.getRowAtClientY(n));e(Aa,r)}))}}Zi({key:"sceneTreeController",get:({get:e})=>{var t;return null===(t=e(As))||void 0===t?void 0:t.controller},dangerouslyAllowMutability:!0});const VertexGhostSelectedMenuItem=()=>{const t=Ji(fs),n=useSceneItemsOperations();return e.jsxs(i.VertexMenuItem,{"data-testid":"ghost-selected-menu-option",onClick:()=>n.ghostSelected(),disabled:asBooleanAttribute(0===t.length),children:[e.jsx(i.VertexIcon,{slot:"icon",name:"visibility-partial",size:"sm"}),e.jsx("div",{className:"pl-2",children:"Ghost Selected"})]})},VertexUnghostSelectedMenuItem=()=>{const t=Ji(fs),n=useSceneItemsOperations();return e.jsxs(i.VertexMenuItem,{"data-testid":"unghost-selected-menu-option",onClick:()=>n.unGhostSelected(),disabled:asBooleanAttribute(0===t.length),children:[e.jsx(i.VertexIcon,{slot:"icon",name:"visibility-visible",size:"sm"}),e.jsx("div",{className:"pl-2",children:"Unghost Selected"})]})},DefaultSceneTreeContextMenu=()=>e.jsxs("div",{className:"w-56",children:[e.jsx(VertexHideSelectedMenuItem,{}),e.jsx(VertexHideAllMenuItem,{}),e.jsx(VertexShowOnlyMenuItem,{}),e.jsx(VertexShowOnlySelectedMenuItem,{}),e.jsx(VertexShowAllMenuItem,{}),e.jsx(VertexGhostSelectedMenuItem,{}),e.jsx(VertexUnghostSelectedMenuItem,{}),e.jsx(i.VertexMenuDivider,{}),e.jsx(VertexFitSelectedMenuItem,{}),e.jsx(VertexFlyToMenuItem,{})]}),VertexSceneTreeContextMenu=({children:t})=>{const n=useSceneTreeActions(),o=Ji(As),r=null!=t&&!1!==t;return e.jsx(VertexContextMenu,{menuType:"scene-tree",targetElement:o,onOpen:async(e,t)=>{const o=e;await n.setContextMenuItem(o.clientY)},disableBackdrop:!0,children:r?t:e.jsx(DefaultSceneTreeContextMenu,{})})},DefaultViewerContextMenu=()=>e.jsxs("div",{className:"w-56",children:[e.jsx(VertexHidePartMenuItem,{}),e.jsx(VertexHideSelectedMenuItem,{}),e.jsx(VertexHideAllMenuItem,{}),e.jsx(VertexShowOnlyMenuItem,{}),e.jsx(VertexShowOnlySelectedMenuItem,{}),e.jsx(VertexShowAllMenuItem,{}),e.jsx(VertexGhostSelectedMenuItem,{}),e.jsx(VertexUnghostSelectedMenuItem,{}),e.jsx(i.VertexMenuDivider,{}),e.jsx(VertexFitSelectedMenuItem,{}),e.jsx(VertexFlyToMenuItem,{})]}),VertexViewerContextMenu=({children:t})=>{const n=Ji(Va),o=null!=t&&!1!==t;return e.jsx(VertexContextMenu,{menuType:"viewer",targetElement:n,disableBackdrop:!0,children:o?t:e.jsx(DefaultViewerContextMenu,{})})},Ts=Yi({key:"viewerToolkitSdkConfig",default:void 0}),targetIsElement=(e,t)=>e instanceof Element&&e.tagName===t;function useRecoilRef({state:e}){const t=na((({set:t})=>n=>{t(e,n)}),[]);return t}var Vs;function styleFromOptionalFont(e){return null!=e?{"--scene-tree-default-font-family":styleFromFontFace(e.fontFace),"--scene-tree-default-font-color":e.color}:{}}function styleFromOptionalBackgroundColors(e){const t=null==e?void 0:e.depthColors,n=null!=t?Object.keys(t).reduce(((e,n)=>Object.assign(Object.assign({},e),{[`--scene-tree-row-background-color-depth-${n}`]:t[parseInt(n)]})),{}):{};return null!=e?Object.assign(Object.assign({},n),{"--scene-tree-hovered-row-background-color":e.hovered,"--scene-tree-selected-row-background-color":e.selected,"--scene-tree-row-background-color":e.defaultColor}):{}}function styleFromFontFace(e){return e===Vs.ROBOTO_MONO?"var(--vertex-ui-font-family-monospace)":"var(--vertex-ui-font-family)"}!function(e){e.ROBOTO="ROBOTO",e.ROBOTO_MONO="ROBOTO_MONO"}(Vs||(Vs={}));const VertexSceneTreeCollapseAll=()=>{const t=Ji(As);return e.jsx(i.VertexTooltip,{className:"w-auto",content:"Collapse All",placement:"top",children:e.jsx(i.VertexIcon,{size:"sm",className:"h-6 w-6 hover:bg-neutral-300 rounded cursor-pointer","data-testid":"collapse-all-icon",name:"collapse-all",onClick:()=>{null==t||t.collapseAll()}})})},VertexSceneTreeExpandAll=()=>{const t=Ji(As);return e.jsx(i.VertexTooltip,{className:"w-auto",content:"Expand All",placement:"top",children:e.jsx(i.VertexIcon,{size:"sm","data-testid":"expand-all-icon",className:"h-6 w-6 hover:bg-neutral-300 rounded cursor-pointer",name:"expand-all",onClick:()=>{null==t||t.expandAll()}})})};function VertexSceneTreeToolbar(){return e.jsx(s.VertexSceneTreeToolbar,{className:"h-10 border-b border-neutral-300 box-border",children:e.jsxs("div",{className:"flex flex-shrink-0 w-full text-neutral-700 items-center gap mx-2",children:[e.jsx(VertexSceneTreeExpandAll,{}),e.jsx(VertexSceneTreeCollapseAll,{})]})})}const VertexSceneTreeHeader=({children:t})=>{const n=null!=t&&!1!==t;return e.jsx("div",{slot:"header",className:"flex flex-col",children:n?t:e.jsxs(e.Fragment,{children:[e.jsx(s.VertexSceneTreeSearch,{className:"border-b border-neutral-300"}),e.jsx(VertexSceneTreeToolbar,{})]})})},Cs={binding:"{{row.node.name}}",label:"Name",metadataKeyName:"VERTEX_SCENE_ITEM_NAME"},ks=Zi({key:"sceneTreeColumnsActiveColumns",get:({get:e})=>{const t=[],n=e(Es);if(null!=n&&n>0){const e=1/(t.length+1)*n,o=(n-e)/t.length;return{Name:Object.assign(Object.assign({},Cs),{initialWidth:e,minWidth:o})}}return{Name:Cs}}}),Ns=Zi({key:"sceneTreeColumnsActiveColumnNames",get:({get:e})=>Object.keys(e(ks))}),VertexSceneTreeTableLayout=t=>{const n=Ji(ks),o=Ji(Ns),r=[];return e.jsx(s.VertexSceneTreeTableLayout,Object.assign({"data-testid":"scene-tree-table-layout"},t,{children:o.map(((t,i)=>{var a;const l=n[t],c=null!==(a=r[i])&&void 0!==a?a:l.initialWidth;return e.jsxs(s.VertexSceneTreeTableColumn,{"data-testid":`scene-tree-table-column-${i}`,initialWidth:c,minWidth:l.minWidth,children:[e.jsx("template",{slot:"header",dangerouslySetInnerHTML:{__html:`\n <div class="text-sm text-neutral-800 my-2">\n <div class="${ba("truncate",{"pl-2":0===i,"pr-2":i===o.length-1})}">\n ${l.label}\n </div>\n </div>\n `}}),e.jsx("template",{dangerouslySetInnerHTML:{__html:`\n <vertex-scene-tree-table-cell\n prop:value="${l.binding}"\n prop:selection-handler="{{row.data.handleSelection}}"\n prop:expansion-handler="{{row.data.handleExpansion}}"\n prop:visibility-handler="{{row.data.handleVisibility}}"\n ${0===i?"expand-toggle":""}\n ${i===o.length-1?"isolate-button visibility-toggle":""}>\n <div class="flex items-center gap-2">\n <vertex-tooltip \n class="truncate" \n prop:content="${null!=l.binding?l.binding:"--"}" \n placement="${i!==o.length-1?"right":"top"}">\n <div class="flex items-center w-full">\n <div class="truncate">${l.binding}</div>\n </div>\n </vertex-tooltip>\n </div>\n \n\n <div slot="placeholder" class="flex items-center w-full truncate">\n <div> -- </div>\n </div>\n </vertex-scene-tree-table-cell>\n `}})]},l.label)}))}))},VertexSceneTree=n=>{var{id:o,font:r,backgroundColors:i,children:a,style:l,onPointerDown:c,onClick:u,onToggleSelection:d,onToggleExpansion:p,onToggleVisibility:f,className:h,rowData:m}=n,v=t.__rest(n,["id","font","backgroundColors","children","style","onPointerDown","onClick","onToggleSelection","onToggleExpansion","onToggleVisibility","className","rowData"]);const g=Ji(Ts),b=useSelectionActions(),S=useSceneTreeActions(),w=Ji(Va),_=useRecoilRef({state:As}),A=null!=a&&!1!==a,wrappedExpansionHandler=(e,t,n)=>{S.toggleExpansion(e,t,n),null==p||p(e,t,n)},wrappedSelectionHandler=(e,t,n)=>{S.toggleSelection(e,t,n),null==d||d(e,t,n)},wrappedVisibilityHandler=(e,t,n)=>{S.toggleVisibility(e,t,n),null==f||f(e,t,n)},handleClick=e=>{e.altKey&&S.flyToRow(e.clientY),null==u||u(e)},handlePointerDown=e=>{targetIsElement(e.target,"VERTEX-SCENE-TREE-TABLE-COLUMN")&&b.clearSelection(),null==c||c(e)};return e.jsx("div",{className:ba("flex flex-col w-full h-full",h),children:e.jsx("div",{className:"flex group h-full",children:e.jsx(s.VertexSceneTree,Object.assign({id:null!=o?o:"vertex-scene-tree","data-testid":"vertex-scene-tree",config:g,ref:_,className:"flex-1",style:Object.assign(Object.assign(Object.assign({},styleFromOptionalFont(r)),styleFromOptionalBackgroundColors(i)),l),onConnectionError:e=>{logger_error("Scene Tree Connection Error: ",e.detail)},viewer:w,onPointerDown:handlePointerDown,onClick:handleClick,rowData:e=>{var t;const n=null!==(t=null==m?void 0:m(e))&&void 0!==t?t:{};return Object.assign({handleExpansion:wrappedExpansionHandler,handleSelection:wrappedSelectionHandler,handleVisibility:wrappedVisibilityHandler},n)}},v,{children:A?a:e.jsxs(e.Fragment,{children:[e.jsx(VertexSceneTreeHeader,{}),e.jsx(VertexSceneTreeTableLayout,{}),e.jsx(VertexSceneTreeContextMenu,{})]})}))})})},Rs=Yi({key:"openedPanelActivePrimaryLeft",default:void 0}),Is=Yi({key:"openedPanelActivePrimaryRight",default:void 0});function usePanelActions(){return{openPrimary:useActionCallback((({set:e})=>(t,n)=>{e("left"===n?Rs:Is,t)})),closePrimary:useActionCallback((({set:e})=>t=>{e("left"===t?Rs:Is,void 0)}))}}const Os=255,Ls=Yi({key:"sceneItemAdjustmentsSelectedColor",default:void 0}),Ps=Yi({key:"sceneItemAdjustmentsSelectedOpacity",default:void 0}),js=Xi({key:"appliedItemMaterialOverride",default:void 0}),Ms=Yi({key:"appliedItemMaterialOverrideIds",default:[]}),Ds=Zi({key:"sceneItemAdjustmentsLastSelectedOverride",get:({get:e})=>{const t=e(hs);if(null!=t)return e(js(t.id))}}),Bs=Yi({key:"applyMaterialToAllUserAction",default:void 0}),zs=Yi({key:"showConfirmDialogWhenApplyingMaterialToAll",default:!0}),Us=Yi({key:"confirmApplyMaterialToAllDialogOpen",default:!1}),useSceneItemMaterialActions=()=>{const e=useViewerSceneActions(),t=useActionCallback((({snapshot:e,reset:t})=>async()=>{const n=await e.getPromise(Ms);t(Ls),n.forEach((e=>t(js(e)))),t(Ms)}));return{updateColor:useActionCallback((({set:e})=>t=>{e(Ls,t)})),clearCurrentColor:useActionCallback((({reset:e})=>()=>{e(Ls)})),clearCurrentOpacity:useActionCallback((({reset:e})=>()=>{e(Ps)})),clear:useActionCallback((({snapshot:t,set:n,reset:o})=>async()=>{const r=await t.getPromise(fs);o(Ls),r.forEach((e=>o(js(e)))),n(Ms,(e=>e.filter((e=>!r.includes(e))))),await e.execute(ds.CLEAR_SELECTED_MATERIAL_OVERRIDES,(e=>e.where((e=>e.withSelected())).clearMaterialOverrides().select()))})),clearAll:useActionCallback((()=>async()=>{await t(),await e.execute(ds.CLEAR_ALL_MATERIAL_OVERRIDES,(e=>e.where((e=>e.all())).clearMaterialOverrides()),(e=>e.where((e=>e.withSelected())).select()))})),clearState:t,updateOpacity:useActionCallback((({set:e})=>t=>{e(Ps,t)})),apply:useActionCallback((({snapshot:t,set:n})=>async()=>{const o=await t.getPromise(Ls),r=await t.getPromise(Ps),i=await t.getPromise(fs),a=await t.getPromise(Ds),s=null!=o?o:a,l=null!=r?r:null==a?void 0:a.opacity;if(null!=s){const t=Object.assign(Object.assign({},s),{opacity:null!=l?l:s.opacity});await e.execute(ds.APPLY_MATERIAL_OVERRIDE_TO_SELECTION,(e=>e.where((e=>e.withSelected())).materialOverride(t))),i.forEach((e=>n(js(e),t))),n(Ms,(e=>[...e,...i]))}})),confirmApplyAll:useActionCallback((({set:e})=>t=>{e(Us,!0),e(Bs,(()=>t))})),cancelApplyAll:useActionCallback((({reset:e})=>()=>{e(Us),e(Bs)})),applyAll:useActionCallback((({snapshot:t,reset:n})=>async()=>{const o=await t.getPromise(Ls),r=await t.getPromise(Ps);if(null!=o){const i=await t.getPromise(Ms),a=Object.assign(Object.assign({},o),{opacity:null!=r?r:o.opacity});await e.execute(ds.APPLY_MATERIAL_OVERRIDE_TO_ALL,(e=>e.where((e=>e.all())).materialOverride(a))),i.forEach((e=>n(js(e))));const s=await t.getPromise(Bs);null==s||s(a),n(Us),n(Bs)}})),hideConfirmApplyAllDialog:useActionCallback((({set:e})=>()=>{e(zs,!1)}))}};function PanelSection({header:t,children:n}){return e.jsxs("div",{className:"py-3 px-4 border-neutral-300 border-b",children:[e.jsx("div",{className:"my-2 text-base text-neutral-700",children:t}),n]})}const VertexSceneItemMaterialApplyAll=({onApplyAll:t})=>{const n=useSceneItemMaterialActions(),o=Qi(Ds),r=Ji(Ls),a=Ji(zs),s=d.useMemo((()=>"hasValue"===o.state?null!=r?r:o.contents:r),[o,r]);return e.jsx(i.VertexTooltip,{content:"Apply to All",children:e.jsx(i.VertexIconButton,{iconName:"square-dot-outline",iconSize:"sm",color:"secondary",disabled:null==s,onClick:async()=>{a?n.confirmApplyAll(t):(await n.applyAll(),null==t||t(s))}})})};function SceneItemMaterialApplyAllConfirmationDialog(){const t=useSceneItemMaterialActions(),n=Ji(Us),[r,a]=o.useState(!1),onCloseDialog=()=>{t.cancelApplyAll(),a(!1)};return n?e.jsxs(i.VertexDialog,{open:!0,className:"text-sm",onClosed:onCloseDialog,onBackdropClick:onCloseDialog,children:[e.jsx("div",{slot:"heading",children:"Apply to All Parts"}),e.jsx("div",{className:"max-w-lg break-words pr-2",children:"This will apply the same material to all parts in the model. Any previous material changes will be lost."}),e.jsxs("div",{className:"flex mt-8 gap-2 items-center",children:[e.jsxs("div",{className:"flex gap-2",children:[e.jsx(i.VertexToggle,{"data-testid":"hide-confirmation-dialog-in-future-checkbox",variant:"check",className:"pt-1",checked:r,onValueChanged:e=>{a(e.detail)}}),"Don't show again this session"]}),e.jsxs("div",{className:"flex ml-auto gap-2",children:[e.jsx(i.VertexButton,{"data-testid":"cancel-apply-material-to-all",onClick:onCloseDialog,children:"Cancel"}),e.jsx(i.VertexButton,{color:"primary","data-testid":"confirm-apply-material-to-all",onClick:async()=>{await t.applyAll(),r&&t.hideConfirmApplyAllDialog()},children:"Apply"})]})]})]}):e.jsx(e.Fragment,{})}function createColorMaterialWithId(e,t=ma.create()){return Object.assign({id:t},l.ColorMaterial.fromHex(e))}function useDebouncedCallback(e,t){const[n,r]=o.useState();return o.useEffect((()=>()=>{null!=n&&clearTimeout(n)}),[e,t,n]),o.useCallback((o=>{const handler=()=>{e(o)};null!=n&&clearTimeout(n),r(setTimeout(handler,t))}),[e,t,n])}const VertexSceneItemMaterialColorPicker=({onApply:t})=>{const n=useSceneItemMaterialActions(),o=Qi(Ds),r=Ji(Ls),a=d.useMemo((()=>"hasValue"===o.state?null!=r?r:o.contents:r),[o,r]),s=useDebouncedCallback((()=>{n.apply()}),500),l=d.useCallback((e=>{const t=e.target;n.updateColor(createColorMaterialWithId(t.value)),s(t.value)}),[s,n]);return e.jsx(i.VertexColorPicker,{"data-testid":"selected-item-color-picker",value:null!=a?ca.toHexString(a.diffuse):void 0,onValueChanged:()=>{n.apply(),null==t||t(a)},onInput:l})},VertexSceneItemMaterialOpacitySlider=({onApply:t})=>{const n=useSceneItemMaterialActions(),o=Ji(Ps),r=Qi(Ds),a=d.useMemo((()=>{var e,t;return"hasValue"===r.state?null!==(t=null!=o?o:null===(e=r.contents)||void 0===e?void 0:e.opacity)&&void 0!==t?t:Os:null!=o?o:Os}),[o,r]),s=useDebouncedCallback((()=>{n.apply()}),500),l=d.useCallback((e=>{n.updateOpacity(e.detail.value),s(e.detail.value)}),[s,n]),c=d.useMemo((()=>"hasValue"!==r.state||null==r.contents),[r]);return e.jsx(i.VertexTooltip,{className:"flex w-full",content:c?"Select a part and apply a color to enable opacity":`${Math.floor(a/Os*100)}%`,placement:"top",children:e.jsxs("div",{className:"flex items-center w-full gap-2",children:[e.jsx("div",{className:"text-xs pr-2 text-center",children:"0%"}),e.jsx(i.VertexSlider,{className:"flex-grow mt-2","data-testid":"scene-item-adjustments-opacity-slider",disabled:c,value:null!=a?a:Os,step:5,min:0,max:Os,onValueChange:e=>{n.updateOpacity(e.detail.value),n.apply(),null==t||t(e.detail.value)},onValueInput:l}),e.jsx("div",{className:"text-xs pr-2 text-right cursor-default",children:"100%"})]})})};function VertexMaterialControls({onApplyMaterial:t,onApplyMaterialToAll:n,onApplyOpacity:r}){const i=useSceneItemMaterialActions(),a=Ji(hs);return o.useEffect((()=>{i.clearCurrentColor(),i.clearCurrentOpacity()}),[null==a?void 0:a.id]),e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"flex flex-col",children:[e.jsx("div",{className:"pt-1 pb-2 text-sm text-neutral-700",children:"Color"}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(VertexSceneItemMaterialColorPicker,{onApply:t}),e.jsx(VertexSceneItemMaterialApplyAll,{onApplyAll:n})]})]}),e.jsxs("div",{className:"flex flex-col",children:[e.jsx("div",{className:"pt-4 pb-2 text-sm text-neutral-700",children:"Opacity"}),e.jsx("div",{className:"flex items-center",children:e.jsx(VertexSceneItemMaterialOpacitySlider,{onApply:r})})]}),e.jsx(SceneItemMaterialApplyAllConfirmationDialog,{})]})}const ResetButton=({id:t,tooltip:n,children:r})=>{const[a,s]=o.useState(!1);return e.jsx("div",{className:"ml-auto",children:e.jsxs(i.VertexDropdownMenu,{className:"flex items-stretch h-full","data-testid":`reset-button-dropdown-menu-${t}`,placement:"bottom-end",onMenuOpened:()=>s(!0),onMenuClosed:()=>s(!1),children:[e.jsx("div",{slot:"anchor",className:"flex items-center h-full",children:e.jsx(i.VertexTooltip,{content:n,disabled:a,placement:"bottom",children:e.jsxs(i.VertexButton,{className:ba("p-1.5 rounded-md select-none hover:bg-neutral-300 active:bg-neutral-400 cursor-pointer",{"bg-neutral-300":a}),"data-testid":`reset-button-${t}`,variant:"plaintext",children:[e.jsx(i.VertexIcon,{className:"px-0.5",name:"reset",size:"sm"}),e.jsx(i.VertexIcon,{name:"chevron-down",size:"sm"})]})})}),e.jsx("div",{className:"whitespace-nowrap",children:r})]})})},VertexSceneItemMaterialClear=({canClearSelected:t,onClear:n,onClearAll:o})=>{const r=useSceneItemMaterialActions();return e.jsx("div",{className:"ml-auto",children:e.jsxs(ResetButton,{id:"materials",tooltip:"Clear Materials",children:[e.jsx("div",{className:"pt-1"}),e.jsx(i.VertexMenuItem,{"data-testid":"clear-selected-materials",onClick:()=>{r.clear(),null==n||n()},disabled:!t,children:"Clear selected materials"}),e.jsx(i.VertexMenuItem,{"data-testid":"clear-all-materials",onClick:()=>{r.clearAll(),null==o||o()},children:"Clear all materials"})]})})};function VertexMaterialPanelSection({onClearMaterial:t,onClearAllMaterials:n,onApplyMaterial:r,onApplyMaterialToAll:i,onApplyOpacity:a}){const s=useSceneItemMaterialActions(),l=Ji(xs),c=Ji(hs);return o.useEffect((()=>{s.clearCurrentColor(),s.clearCurrentOpacity()}),[null==c?void 0:c.id]),e.jsx(PanelSection,{header:e.jsxs("div",{className:"flex items-center text-base",children:["Material",e.jsx(VertexSceneItemMaterialClear,{canClearSelected:l,onClear:t,onClearAll:n})]}),children:e.jsx(VertexMaterialControls,{onApplyMaterial:r,onApplyMaterialToAll:i,onApplyOpacity:a})})}function DefaultAppearancePanel(){return e.jsx("div",{className:"flex flex-col text-neutral-700 h-full overflow-y-auto",children:e.jsx(VertexMaterialPanelSection,{})})}const Fs="Appearance",ViewerRightPanelHeader=()=>{const t=undefined,n=getHeading(Ji(Is));return e.jsx("div",{className:"flex flex-col w-full items-center z-overlay pointer-events-none md:pointer-events-auto py-3 px-4 border-b border-neutral-300",children:e.jsx("div",{className:"items-center w-full leading-6 text-md align-center font-medium text-neutral-800",children:n})})};function getHeading(e){return"appearance"===e?Fs:"None"}function VertexViewerRightOpenedPanel(){const t=Ji(Is),n=o.useMemo((()=>["appearance"]),[]);return e.jsx(e.Fragment,{children:null!=t&&n.includes(t)&&e.jsx(VertexResizableContent,{displayShadow:!0,heading:e.jsx(ViewerRightPanelHeader,{}),placement:"right",children:"appearance"===t&&e.jsx(DefaultAppearancePanel,{})})})}function Sidebar({children:t}){return e.jsx("div",{className:"pointer-events-auto flex flex-col items-center w-full border-neutral-300 py-2",children:t})}function SidebarIcon({name:t,iconName:n,active:r,responsive:a,disabled:s,content:l,tooltipPlacement:c,children:u,onSelect:d,onDeselect:p}){return e.jsx("div",{className:ba({"text-[var(--vertex-ui-blue-700)]":r===t&&!s,"text-neutral-700 hover:text-neutral-800":r!==t&&!s,"cursor-pointer hover:bg-neutral-200":!s,"text-neutral-400":s,"rounded-full md:p-3":a,"p-3":!a&&null==u,"px-3 py-1":null!=u}),"data-testid":`${t}-sidebar-panel`,onClick:()=>{s||(r===t?p():d())},children:e.jsxs(i.VertexTooltip,{placement:null!=c?c:void 0,content:o.isValidElement(l)?void 0:l,children:[e.jsx("div",{slot:"content",children:l}),e.jsxs("div",{className:"flex flex-col",children:[e.jsx(i.VertexIcon,{name:n}),u]})]})})}function VertexViewerRightSidebar(){const t=usePanelActions(),n=Ji(Is);return e.jsx("div",{className:"flex flex-col flex-shrink-0 items-center relative border-neutral-300 border-l bg-white h-full top-0 min-w-12 w-12",children:e.jsx(Sidebar,{children:e.jsx(SidebarIcon,{name:"appearance",active:n,iconName:"adjustments",tooltipPlacement:"right",content:"Appearance",onSelect:()=>{t.openPrimary("appearance","right")},onDeselect:()=>t.closePrimary("right")})})})}const useSynchronizedProp=(e,t)=>{const n=ta(e);o.useEffect((()=>{n(t)}),[n,t])},VertexPopupButton=n=>{var{open:o,children:r}=n,a=t.__rest(n,["open","children"]);const s=r.find((e=>e.type===Anchor)),l=r.filter((e=>e.type!==Anchor));return null==s?e.jsx(e.Fragment,{}):e.jsxs(i.VertexPopover,Object.assign({className:"flex",placement:"top",backdrop:!1,open:asBooleanAttribute(o)},a,{children:[s,e.jsx("div",{className:ba("flex mb-1.5",{hidden:!o}),"data-testid":"align-plane-popover-menu",children:l})]}))},Anchor=({tooltipContent:t,children:n})=>e.jsx("div",{slot:"anchor",children:e.jsx(i.VertexTooltip,{className:"cursor-pointer",content:t,children:n})});VertexPopupButton.Anchor=Anchor;const VertexSlider=n=>{var{value:r,defaultValue:a,onChange:s,onValueChange:l,onValueInput:c}=n,u=t.__rest(n,["value","defaultValue","onChange","onValueChange","onValueInput"]);const[d,p]=o.useState(a);return e.jsx(i.VertexSlider,Object.assign({className:"w-52 mx-2 items-center",value:null!=r?r:d,onValueChange:e=>{p(e.detail.value),null==s||s(e.detail.value),null==l||l(e)},onValueInput:e=>{p(e.detail.value),null==s||s(e.detail.value),null==c||c(e)}},u))};function VertexViewerToolbarDivider(){return e.jsx("div",{"data-testid":"toolbar-divider",className:"h-6 w-px bg-neutral-300 mx-1 items-center mt-1"})}function VertexViewerCrossSectionAlignmentPopoverMenu(){const t=useCrossSectioningActions(),n=Ji(Ja),o=Ji(Ha),getBaseIcon=()=>`align-to-${null==o?void 0:o.mode}`;return useStackKeyBinding({id:"CrossSectionAlignment",keyBind:"Escape",fn:t.cancelCurrentHit,addPredicate:()=>{var e;return null!==(e=null==o?void 0:o.hitPending)&&void 0!==e&&e},cancelPredicate:()=>!(null==o?void 0:o.hitPending)},[null==o?void 0:o.hitPending]),e.jsxs(VertexPopupButton,{"data-testid":"section-alignment-popover",placement:"top",backdrop:!1,open:asBooleanAttribute(n),onDismissed:t.closeAlignmentTools,children:[e.jsx(VertexPopupButton.Anchor,{tooltipContent:"Section Alignment",children:e.jsx(i.VertexIconButton,{"data-testid":"section-alignment-icon-button",iconName:getBaseIcon(),iconColor:"secondary",onClick:n?t.closeAlignmentTools:t.openAlignmentTools,children:e.jsx(i.VertexIcon,{"data-testid":"section-alignment-icon-chevron",name:"chevron-up",size:"sm"})})}),e.jsxs(s.VertexViewerToolbarGroup,{direction:"vertical",className:"flex justify-evenly items-center py-1 my-1 ring-1 ring-neutral-200 rounded bg-neutral-100 opacity-95",children:[e.jsx(i.VertexIconButton,{iconColor:"secondary",onClick:()=>t.updateAlignment("global"),className:"w-full text-neutral-800 hover:bg-neutral-300 rounded cursor-pointer mx-0.5 py-1 px-2","data-testid":"section-alignment-align-global",iconName:"align-to-global",variant:"plain",children:e.jsx("div",{className:"text-base ml-2",children:"Align to Global"})}),e.jsx(i.VertexIconButton,{iconColor:"secondary",onClick:()=>t.updateAlignment("surface"),className:"w-full text-neutral-800 hover:bg-neutral-300 rounded cursor-pointer mx-0.5 py-1 px-2","data-testid":"section-alignment-align-surface",iconName:"align-to-surface",variant:"plain",children:e.jsx("div",{className:"text-base ml-2",children:"Align to Surface"})})]})]})}function VertexViewerCrossSectionAxisPopoverMenu(){const t=useCrossSectioningActions(),n=Ji(Qa),r=Ji(Fa),a=Qi(Ka),l=o.useMemo((()=>{const e=r.length>0&&"hasValue"===a.state?axis(r[0],xAxis(a.contents),yAxis(a.contents),zAxis(a.contents)):"x";return null!=e?`axis-${e}`:"axis-x"}),[a.state,a.contents,r]);return e.jsxs(VertexPopupButton,{"data-testid":"align-plane-popover",placement:"top",backdrop:!1,open:asBooleanAttribute(n),onDismissed:t.closeAxisTools,children:[e.jsx(VertexPopupButton.Anchor,{tooltipContent:"Align Plane",children:e.jsx(i.VertexIconButton,{onClick:n?t.closeAxisTools:t.openAxisTools,iconName:l,"data-testid":"align-plane-icon",iconColor:"secondary",children:e.jsx(i.VertexIcon,{"data-testid":"align-plane-icon-chevron",name:"chevron-up",size:"sm"})})}),e.jsxs(s.VertexViewerToolbarGroup,{direction:"vertical",className:"flex justify-evenly items-center py-1 my-1 ring-1 ring-neutral-200 rounded bg-neutral-100 opacity-95",children:[e.jsx(i.VertexIconButton,{"data-testid":"align-plane-x-axis-button",className:"w-full text-neutral-800 hover:bg-neutral-300 rounded cursor-pointer mx-0.5 py-1 px-2",onClick:()=>t.updateAxis("x"),variant:"plain",iconColor:"secondary",iconName:"axis-x",children:e.jsx("div",{className:"text-base ml-2",children:"X-axis Plane"})}),e.jsx(i.VertexIconButton,{className:"w-full text-neutral-800 hover:bg-neutral-300 rounded cursor-pointer mx-0.5 py-1 px-2",variant:"plain",iconColor:"secondary",iconName:"axis-y","data-testid":"align-plane-y-axis-button",onClick:()=>t.updateAxis("y"),children:e.jsx("div",{className:"text-base ml-2",children:"Y-axis Plane"})}),e.jsx(i.VertexIconButton,{"data-testid":"align-plane-z-axis-button",className:"w-full text-neutral-800 hover:bg-neutral-300 rounded cursor-pointer mx-0.5 py-1 px-2",onClick:()=>t.updateAxis("z"),variant:"plain",iconColor:"secondary",iconName:"axis-z",children:e.jsx("div",{className:"text-base ml-2",children:"Z-axis Plane"})})]})]})}var Hs,Ws;!function(e){e.mm="millimeters",e.cm="centimeters",e.m="meters",e.in="inches",e.ft="feet"}(Hs||(Hs={})),function(e){e[e.mm=1]="mm",e[e.cm=.1]="cm",e[e.m=.001]="m",e[e.in=.03937007874015748]="in",e[e.ft=.0032808398950131233]="ft"}(Ws||(Ws={}));const convertFrom=(e,t)=>{const n=undefined;return e/Ws[t]},convertTo=(e,t)=>{const n=undefined;return e*Ws[t]},formatWithUnit=(e,t,n)=>`${e.toFixed(n)} ${t}`,formatDistance=(e,t,n)=>formatWithUnit(convertTo(e,t),t,n),createDistanceFormatter=(e,t)=>n=>formatDistance(n,e,t);function VertexViewerCrossSectionOffsetStepper({offset:t,measurementUnit:n,decimalPlaces:r,onOffsetChange:a}){const[s,l]=o.useState(convertTo(t,n));o.useEffect((()=>{l(convertTo(t,n))}),[n,t]);const c=createDistanceFormatter(n,r),handleIncrementalUpdate=e=>{const t=convertFrom(s+e,n);a(t)},handleSubmit=e=>{e.preventDefault(),a(convertFrom(s,n))},handleBlur=()=>{a(convertFrom(s,n))};return e.jsx(i.VertexTooltip,{content:"Plane Offset",children:e.jsx("form",{"data-testid":"cross-section-stepper-form",onSubmit:handleSubmit,children:e.jsxs(i.VertexTextfield,{"data-testid":"cross-section-stepper-input",className:"viewer-toolbar-input w-32 border-none ring-0 bg-white",type:"text",value:c(parseFloat(t.toFixed(3))),onInputInput:e=>{l(null!=e.detail.value?parseFloat(e.detail.value):t)},onBlur:handleBlur,children:[e.jsx("div",{"data-testid":"cross-section-stepper-decrement",className:"py-1 cursor-pointer",slot:"left",onClick:()=>handleIncrementalUpdate(-1),children:e.jsx(i.VertexIcon,{name:"chevron-left",size:"sm"})}),e.jsx("div",{"data-testid":"cross-section-stepper-increment",className:"py-1 cursor-pointer",slot:"right",onClick:()=>handleIncrementalUpdate(1),children:e.jsx(i.VertexIcon,{name:"chevron-right",size:"sm"})})]})})})}const $s=400;function VertexViewerCrossSectionPopupMenu({decimalPlaces:t,measurementUnit:n}){const r=useCrossSectioningActions(),a=Ji(Xa),l=Qi(Ya),c=Qi(Za),u=o.useRef(),d=o.useMemo((()=>"hasValue"===l.state?l.contents:Da),[l.state,l.contents]),p=o.useMemo((()=>"hasValue"===c.state?c.contents:0),[c.state,c.contents]),handleCrossSectionValueChange=e=>{clearTimeout(u.current),u.current=window.setTimeout((()=>{r.endInteraction()}),$s),r.beginInteraction(),r.updatePlanes(e)};return e.jsxs(VertexPopupButton,{"data-testid":"cross-section-popover",placement:"top",backdrop:!1,open:asBooleanAttribute(a),onDismissed:r.closeAdditionalTools,children:[e.jsx(VertexPopupButton.Anchor,{tooltipContent:"Section Tools",children:e.jsx("div",{className:"-ml-px py-1.5",children:e.jsx(i.VertexIcon,{"data-testid":"cross-section-popover-icon",name:"chevron-up",size:"sm",onClick:a?r.closeAdditionalTools:r.openAdditionalTools})})}),e.jsxs(s.VertexViewerToolbarGroup,{className:"relative bottom-3 flex justify-evenly items-center p-1 ring-1 ring-neutral-200 rounded bg-neutral-100 opacity-95",children:[e.jsx(VertexViewerCrossSectionAlignmentPopoverMenu,{}),e.jsx(i.VertexTooltip,{className:"w-auto",content:"Reverse",children:e.jsx(i.VertexIconButton,{iconName:"flip","data-testid":"viewer-toolbar-flip-button",onClick:r.flipPlanes,iconColor:"secondary"})}),e.jsx(i.VertexTooltip,{className:"w-auto",content:"Align View to Plane",children:e.jsx(i.VertexIconButton,{"data-testid":"viewer-toolbar-align-view-to-plane-button",iconName:"align-view-to-plane",onClick:r.alignViewToPlane,iconColor:"secondary"})}),e.jsx(VertexViewerToolbarDivider,{}),e.jsx(VertexViewerCrossSectionAxisPopoverMenu,{}),e.jsx(VertexSlider,{value:p,defaultValue:d.default,disabled:asBooleanAttribute("hasValue"!==l.state),min:d.min,max:d.max,step:.01,onChange:handleCrossSectionValueChange}),e.jsx("div",{className:"px-4",children:e.jsx(VertexViewerCrossSectionOffsetStepper,{decimalPlaces:t,measurementUnit:n,offset:"hasValue"===c.state?c.contents:0,onOffsetChange:handleCrossSectionValueChange})})]})]})}const VertexViewerCrossSectionButton=({decimalPlaces:t,measurementUnit:n,sectionLineWidth:o,sectionColor:r})=>{const a=useCrossSectioningActions(),s=Ji(Ba);return useSynchronizedProp(Ua,o),useSynchronizedProp(za,r),e.jsxs(e.Fragment,{children:[e.jsx(i.VertexTooltip,{content:s?"Hide Section":"Show Section",children:e.jsx(i.VertexIconButton,{"data-testid":"viewer-toolbar-cross-section-button",iconName:"cross-section",iconColor:s?"primary":"secondary",onClick:()=>s?a.disable():a.enable()})}),e.jsx(VertexViewerCrossSectionPopupMenu,{decimalPlaces:null!=t?t:2,measurementUnit:null!=n?n:"mm"})]})},VertexFitAllButton=()=>{const t=Ji(Va);return e.jsx(i.VertexTooltip,{content:"Fit All",children:e.jsx(i.VertexIconButton,{iconName:"fit-all",iconColor:"secondary","data-testid":"viewer-toolbar-fit-all-button",onClick:async()=>{const e=await(null==t?void 0:t.scene());await(null==e?void 0:e.camera().viewAll().render({animation:{milliseconds:500}}))}})})},VertexPanButton=()=>{const t=Ji(Va),n=Ji(Ca),[r,a]=ea(Na),[s,l]=ea(ka);return o.useEffect((()=>{null!=t&&n&&l(t.getBaseInteractionHandler())}),[t,n,l]),e.jsx(i.VertexTooltip,{content:"Pan",children:e.jsx(i.VertexIconButton,{iconName:"pan",iconColor:"pan"===r?"primary":"secondary","data-testid":"viewer-toolbar-pan-button",onClick:async()=>{if(a("pan"),null!=s){const e=await s;null==e||e.setPrimaryInteractionType("pan")}}})})},VertexRotateButton=()=>{const t=Ji(Va),n=Ji(Ca),[r,a]=ea(Na),[s,l]=ea(ka);return o.useEffect((()=>{null!=t&&n&&l(t.getBaseInteractionHandler())}),[t,n,l]),e.jsx(i.VertexTooltip,{content:"Rotate",children:e.jsx(i.VertexIconButton,{iconName:"rotate",iconColor:"rotate"===r?"primary":"secondary","data-testid":"viewer-toolbar-rotate-button",onClick:async()=>{if(a("rotate"),null!=s){const e=await s;null==e||e.setPrimaryInteractionType("rotate")}}})})},VertexZoomButton=()=>{const t=Ji(Va),n=Ji(Ca),[r,a]=ea(Na),[s,l]=ea(ka);return o.useEffect((()=>{null!=t&&n&&l(t.getBaseInteractionHandler())}),[t,n,l]),e.jsx(i.VertexTooltip,{content:"Zoom",children:e.jsx(i.VertexIconButton,{iconName:"zoom",iconColor:"zoom"===r?"primary":"secondary","data-testid":"viewer-toolbar-zoom-button",onClick:async()=>{if(a("zoom"),null!=s){const e=await s;null==e||e.setPrimaryInteractionType("zoom")}}})})},DefaultToolbar=()=>e.jsx(s.VertexViewerToolbar,{placement:"bottom-center",children:e.jsxs(s.VertexViewerToolbarGroup,{className:"p-1 border border-neutral-200 rounded bg-neutral-100 opacity-95",children:[e.jsx(VertexRotateButton,{}),e.jsx(VertexPanButton,{}),e.jsx(VertexZoomButton,{}),e.jsx(VertexFitAllButton,{}),e.jsx(VertexViewerToolbarDivider,{}),e.jsx(VertexBoxSelectionButton,{}),e.jsx(VertexViewerToolbarDivider,{}),e.jsx(VertexViewerCrossSectionButton,{})]})}),VertexToolbar=({children:t})=>{const n=null!=t&&!1!==t;return e.jsx(s.VertexViewerToolbar,{placement:"bottom-center",children:n?e.jsx(s.VertexViewerToolbarGroup,{className:"p-1 border border-neutral-200 rounded bg-neutral-100 opacity-95",children:t}):e.jsx(DefaultToolbar,{})})},VertexViewerSceneReset=({onReset:t})=>{const n=useCrossSectioningActions(),o=useSelectionActions(),r=useViewerSceneActions(),handleReset=async()=>{await n.disable(),await o.resetSelectionState(),null==t||t(),await r.reset()};return e.jsx(i.VertexTooltip,{content:"Reset View",children:e.jsx(i.VertexIconButton,{iconName:"reset",className:"flex bg-white opacity-70 hover:opacity-100 text-neutral-900 hover:text-neutral-700 hover:bg-neutral-200 rounded p-1 cursor-pointer","data-testid":"viewer-reset-tool-button",onClick:handleReset,variant:"plain"})})};function useViewerFrameActions(){return{frameDrawn:useActionCallback((({set:e,reset:t,snapshot:n})=>async t=>{const o=await n.getPromise(bs);e(Ia,t.detail.scene),e(bs,t.detail.scene.sceneViewSummary.selectedVisibleSummary),e(ys,o)}))}}function useCallbackRef(e){var t;const[n,r]=o.useState((t=void 0,null)),i=undefined;return{element:n,callback:o.useCallback((e=>r(e)),[])}}const VertexBoxSelectionTool=()=>{const{callback:t}=useCallbackRef(),n=useBoxSelectionActions(),o=Ji(ia);return useApplyKeyBinding({keyBind:"Shift",fn:d.useCallback((()=>n.setOperationType("select")),[]),off:d.useCallback((()=>n.setOperationType("clearAndSelect")),[])}),e.jsx(s.VertexViewerBoxQueryTool,{ref:t,"data-testid":"viewer-box-query-tool",operationType:o})};function VertexViewerCameraTypeMenu({open:t,onOpen:n,onDismiss:o,onCameraTypeChange:r}){const a=useViewerCameraActions(),s=Ji(Pa);return e.jsxs(i.VertexMenu,{"data-testid":"camera-types-popover",className:"flex",placement:"bottom-end",open:asBooleanAttribute(t),onMenuClosed:o,children:[e.jsx("div",{slot:"anchor",children:e.jsx("div",{className:ba("flex bg-white hover:opacity-100 hover:text-neutral-700 hover:bg-neutral-200 rounded",{"opacity-70 text-neutral-900":!t,"opacity-100 text-neutral-700 bg-neutral-200":t}),children:e.jsx(i.VertexTooltip,{content:"Change View",children:e.jsx(i.VertexIconButton,{"data-testid":"set-camera-mode-option",className:"p-1 cursor-pointer",variant:"plain",onClick:n,iconName:"orthographic"===s?"cube-orthographic":"cube-perspective",children:e.jsx(i.VertexIcon,{"data-testid":"change-camera-type-icon-button",name:"chevron-down",size:"sm"})})})})}),e.jsxs("div",{className:"w-36",children:[e.jsx("div",{className:"pt-1"}),e.jsxs(i.VertexMenuItem,{"data-testid":"set-perspective-view",onClick:()=>{a.updateCameraType("perspective"),null==r||r("perspective")},children:[e.jsx(i.VertexIcon,{slot:"icon","data-testid":"set-perspective-view-icon",name:"cube-perspective",size:"sm",className:ba({"text-[var(--vertex-ui-blue-700)]":"perspective"===s})}),e.jsx("div",{className:ba("ml-2 items-center",{"text-[var(--vertex-ui-blue-700)]":"perspective"===s}),children:"Perspective"})]}),e.jsxs(i.VertexMenuItem,{"data-testid":"set-orthographic-view",onClick:()=>{a.updateCameraType("orthographic"),null==r||r("orthographic")},children:[e.jsx(i.VertexIcon,{slot:"icon","data-testid":"set-orthographic-view-icon",name:"cube-orthographic",size:"sm",className:ba({"text-[var(--vertex-ui-blue-700)]":"orthographic"===s})}),e.jsx("div",{className:ba("ml-2 items-center",{"text-[var(--vertex-ui-blue-700)]":"orthographic"===s}),children:"Orthographic"})]})]})]})}const VertexViewerViewCube=n=>{var{placement:r,children:i}=n,a=t.__rest(n,["placement","children"]);const l=Array.isArray(i)?i:[i],c=l.filter((e=>!o.isValidElement(e)||e.type!==s.VertexViewerViewCube)).filter((e=>null!=e&&!1!==e)),u=l.find((e=>o.isValidElement(e)&&e.type===s.VertexViewerViewCube)),[d,p]=o.useState(!1);return e.jsxs(s.VertexViewerToolbar,{direction:"vertical","data-testid":"view-cube-toolbar",placement:null!=r?r:"top-right",children:[null!=u?u:e.jsx(s.VertexViewerViewCube,Object.assign({className:"m-7"},a)),0===c.length?e.jsxs("div",{className:"flex items-center justify-center mt-3 gap-1",children:[e.jsx(VertexViewerSceneReset,{}),e.jsx(VertexViewerCameraTypeMenu,{open:d,onDismiss:()=>p(!1),onOpen:()=>p(!0)})]}):e.jsx("div",{className:"mt-3",children:c})]})},VertexViewer=n=>{var{id:o,className:r,disableSelection:i,onTap:a,onLongpress:l,onFrameDrawn:c,onSceneReady:u,viewerRefCallback:d,children:p}=n,f=t.__rest(n,["id","className","disableSelection","onTap","onLongpress","onFrameDrawn","onSceneReady","viewerRefCallback","children"]);const h=Ji(Ts),m=useRecoilRef({state:Va}),v=useViewerCameraActions(),g=useHitActions(),b=useSelectionActions(),S=useViewerFrameActions(),[w,_]=ea(Ca),A=Ji(Pa),E=Ji(Ha),T=Ji(ra),V=null!=p&&!1!==p;return useKeyBindings(),useDefaultKeybindings(),e.jsxs(s.VertexViewer,Object.assign({id:null!=o?o:"vertex-viewer","data-testid":"vertex-viewer",ref:null!=d?d:m,className:ba("flex w-full h-full",r,{"cursor-crosshair":E.hitPending}),config:h,cameraType:w?A:void 0,onCameraTypeChanged:e=>{w&&v.updateCameraType(e.detail)},onTap:e=>{const t=[...i?[]:[b.selectCurrentHit]];g.tap(e,...t),null==a||a(e)},onLongpress:e=>{g.longPress(e),null==l||l(e)},onFrameDrawn:e=>{S.frameDrawn(e),null==c||c(e)},onSceneReady:e=>{w||_(!0),null==u||u(e)}},f,{children:[T&&e.jsx(VertexBoxSelectionTool,{}),V?p:e.jsxs(e.Fragment,{children:[e.jsx(VertexViewerViewCube,{}),e.jsx(VertexToolbar,{}),e.jsx(VertexViewerContextMenu,{})]})]}))};function toSdkConfig(e){return isOnlyNetworkConfig(e)?{network:e}:e}function isOnlyNetworkConfig(e){const t=undefined;return null!=e.renderingHost}const VertexViewerToolkitEventListener=({onHitStateChange:t,onSelectionStateChange:n})=>{const r=Ji(cs),i=Ji(ws);return o.useEffect((()=>{null==t||t(r)}),[r,t]),o.useEffect((()=>{null==n||n(i)}),[i,n]),e.jsx(e.Fragment,{})},VertexViewerToolkitRoot=n=>{var{override:r,autoDefineCustomElements:i,children:a,config:s}=n,l=t.__rest(n,["override","autoDefineCustomElements","children","config"]);return o.useEffect((()=>{(null==i||i)&&(u.defineCustomElements(),c.defineCustomElements())}),[i]),e.jsx(qi,{override:r,children:e.jsxs(e.Fragment,{children:[e.jsx(VertexViewerToolkitEventListener,Object.assign({},l)),e.jsx(VertexViewerToolkitRootConfig,{config:s,children:a})]})})},VertexViewerToolkitRootConfig=({config:t,children:n})=>{const r=ta(Ts);return o.useEffect((()=>{const e=null!=t?toSdkConfig(t):void 0;r(e)}),[t,r]),e.jsx(e.Fragment,{children:n})};var Gs=Object.freeze({__proto__:null,get AssemblyFontFace(){return Vs}});exports.CrossSection=ls,exports.Hits=us,exports.SceneTree=Gs,exports.Selection=_s,exports.VertexBoxSelectionButton=VertexBoxSelectionButton,exports.VertexContextMenu=VertexContextMenu,exports.VertexFitAllButton=VertexFitAllButton,exports.VertexFitSelectedMenuItem=VertexFitSelectedMenuItem,exports.VertexFlyToMenuItem=VertexFlyToMenuItem,exports.VertexHideAllMenuItem=VertexHideAllMenuItem,exports.VertexHidePartMenuItem=VertexHidePartMenuItem,exports.VertexHideSelectedMenuItem=VertexHideSelectedMenuItem,exports.VertexPanButton=VertexPanButton,exports.VertexResizableContent=VertexResizableContent,exports.VertexRotateButton=VertexRotateButton,exports.VertexSceneTree=VertexSceneTree,exports.VertexSceneTreeContextMenu=VertexSceneTreeContextMenu,exports.VertexSceneTreeHeader=VertexSceneTreeHeader,exports.VertexSceneTreeTableLayout=VertexSceneTreeTableLayout,exports.VertexShowAllMenuItem=VertexShowAllMenuItem,exports.VertexShowOnlyMenuItem=VertexShowOnlyMenuItem,exports.VertexShowOnlySelectedMenuItem=VertexShowOnlySelectedMenuItem,exports.VertexToolbar=VertexToolbar,exports.VertexViewer=VertexViewer,exports.VertexViewerContextMenu=VertexViewerContextMenu,exports.VertexViewerCrossSectionButton=VertexViewerCrossSectionButton,exports.VertexViewerRightOpenedPanel=VertexViewerRightOpenedPanel,exports.VertexViewerRightSidebar=VertexViewerRightSidebar,exports.VertexViewerSceneReset=VertexViewerSceneReset,exports.VertexViewerToolbarDivider=VertexViewerToolbarDivider,exports.VertexViewerToolkitRoot=VertexViewerToolkitRoot,exports.VertexViewerViewCube=VertexViewerViewCube,exports.VertexZoomButton=VertexZoomButton;
|
|
2572
7
|
//# sourceMappingURL=bundle.cjs.js.map
|