@nice2dev/ui-3d 1.3.14 → 1.3.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (108) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/cjs/collaborative/collaborativeScene.js +160 -206
  3. package/dist/cjs/core/editorAsk.js +51 -41
  4. package/dist/cjs/core/i18n.js +13 -14
  5. package/dist/cjs/core/threeCompat.js +29 -42
  6. package/dist/cjs/dance/DanceBridge.js +148 -177
  7. package/dist/cjs/dance/DanceScoreEngine.js +209 -221
  8. package/dist/cjs/dance/PoseDetector.js +302 -275
  9. package/dist/cjs/index.js +110 -113
  10. package/dist/cjs/material/MaterialEditor.module.css.js +242 -5
  11. package/dist/cjs/material/NiceMaterialEditor.js +1213 -757
  12. package/dist/cjs/material/materialEditorTypes.js +35 -49
  13. package/dist/cjs/material/materialEditorUtils.js +684 -747
  14. package/dist/cjs/material/materialNodeDefinitions.js +1411 -1459
  15. package/dist/cjs/model/ModelEditor.js +90 -40
  16. package/dist/cjs/model/ModelEditor.module.css.js +257 -5
  17. package/dist/cjs/model/ModelEditorLeftPanel.js +126 -47
  18. package/dist/cjs/model/ModelEditorMenuBar.js +359 -32
  19. package/dist/cjs/model/ModelEditorRightPanel.js +647 -131
  20. package/dist/cjs/model/ModelEditorSubComponents.js +277 -112
  21. package/dist/cjs/model/ModelEditorTimeline.js +232 -34
  22. package/dist/cjs/model/ModelEditorToolbar.js +170 -14
  23. package/dist/cjs/model/ModelEditorViewport.js +231 -39
  24. package/dist/cjs/model/ModelViewer.js +388 -63
  25. package/dist/cjs/model/ModelViewer.module.css.js +77 -5
  26. package/dist/cjs/model/NiceArmatureEditor.js +473 -274
  27. package/dist/cjs/model/NiceMorphTargetEditor.js +333 -227
  28. package/dist/cjs/model/NiceOctree.js +372 -320
  29. package/dist/cjs/model/NicePhysicsSimulation.js +528 -298
  30. package/dist/cjs/model/NiceProceduralGeometry.js +673 -300
  31. package/dist/cjs/model/NiceTerrainEditor.js +595 -385
  32. package/dist/cjs/model/NiceWeightPainter.js +384 -261
  33. package/dist/cjs/model/NiceXRPreview.js +385 -308
  34. package/dist/cjs/model/cadModeUtils.js +103 -106
  35. package/dist/cjs/model/editorShortcuts.js +171 -194
  36. package/dist/cjs/model/modelEditorTypes.js +100 -118
  37. package/dist/cjs/model/modelEditorUtils.js +1061 -1146
  38. package/dist/cjs/model/simsModeUtils.js +1023 -1053
  39. package/dist/cjs/model/useModelEditor.js +1977 -1933
  40. package/dist/cjs/model/useModelViewer.js +633 -665
  41. package/dist/cjs/nice2dev-ui-3d.css +1 -1
  42. package/dist/cjs/particle/NiceParticleEditor.js +1186 -571
  43. package/dist/cjs/particle/ParticleEditor.module.css.js +122 -5
  44. package/dist/cjs/particle/particleEditorTypes.js +62 -70
  45. package/dist/cjs/particle/particleEditorUtils.js +998 -1013
  46. package/dist/cjs/rendering/NiceCascadedShadows.js +381 -259
  47. package/dist/cjs/rendering/NiceRenderExport.js +424 -337
  48. package/dist/cjs/rendering/NiceSSAO.js +454 -337
  49. package/dist/cjs/rendering/NiceSSR.js +387 -261
  50. package/dist/cjs/rendering/NiceWebGPURenderer.js +359 -230
  51. package/dist/cjs/uv/NiceUVEditor.js +787 -550
  52. package/dist/cjs/uv/UVEditor.module.css.js +53 -5
  53. package/dist/cjs/uv/uvEditorTypes.js +59 -76
  54. package/dist/cjs/uv/uvEditorUtils.js +501 -575
  55. package/dist/esm/collaborative/collaborativeScene.js +163 -205
  56. package/dist/esm/core/editorAsk.js +53 -40
  57. package/dist/esm/core/i18n.js +15 -13
  58. package/dist/esm/core/threeCompat.js +18 -26
  59. package/dist/esm/dance/DanceBridge.js +151 -176
  60. package/dist/esm/dance/DanceScoreEngine.js +211 -220
  61. package/dist/esm/dance/PoseDetector.js +304 -274
  62. package/dist/esm/index.js +258 -36
  63. package/dist/esm/material/MaterialEditor.module.css.js +242 -3
  64. package/dist/esm/material/NiceMaterialEditor.js +1215 -756
  65. package/dist/esm/material/materialEditorTypes.js +45 -48
  66. package/dist/esm/material/materialEditorUtils.js +713 -746
  67. package/dist/esm/material/materialNodeDefinitions.js +1415 -1458
  68. package/dist/esm/model/ModelEditor.js +91 -39
  69. package/dist/esm/model/ModelEditor.module.css.js +257 -3
  70. package/dist/esm/model/ModelEditorLeftPanel.js +126 -45
  71. package/dist/esm/model/ModelEditorMenuBar.js +359 -30
  72. package/dist/esm/model/ModelEditorRightPanel.js +634 -114
  73. package/dist/esm/model/ModelEditorSubComponents.js +265 -94
  74. package/dist/esm/model/ModelEditorTimeline.js +232 -32
  75. package/dist/esm/model/ModelEditorToolbar.js +170 -12
  76. package/dist/esm/model/ModelEditorViewport.js +231 -37
  77. package/dist/esm/model/ModelViewer.js +389 -62
  78. package/dist/esm/model/ModelViewer.module.css.js +77 -3
  79. package/dist/esm/model/NiceArmatureEditor.js +462 -258
  80. package/dist/esm/model/NiceMorphTargetEditor.js +322 -211
  81. package/dist/esm/model/NiceOctree.js +361 -304
  82. package/dist/esm/model/NicePhysicsSimulation.js +517 -282
  83. package/dist/esm/model/NiceProceduralGeometry.js +667 -284
  84. package/dist/esm/model/NiceTerrainEditor.js +584 -369
  85. package/dist/esm/model/NiceWeightPainter.js +373 -245
  86. package/dist/esm/model/NiceXRPreview.js +374 -292
  87. package/dist/esm/model/cadModeUtils.js +95 -88
  88. package/dist/esm/model/editorShortcuts.js +172 -193
  89. package/dist/esm/model/modelEditorTypes.js +90 -100
  90. package/dist/esm/model/modelEditorUtils.js +1056 -1128
  91. package/dist/esm/model/simsModeUtils.js +1021 -1035
  92. package/dist/esm/model/useModelEditor.js +1946 -1920
  93. package/dist/esm/model/useModelViewer.js +619 -647
  94. package/dist/esm/nice2dev-ui-3d.css +1 -1
  95. package/dist/esm/particle/NiceParticleEditor.js +1188 -570
  96. package/dist/esm/particle/ParticleEditor.module.css.js +122 -3
  97. package/dist/esm/particle/particleEditorTypes.js +69 -69
  98. package/dist/esm/particle/particleEditorUtils.js +1027 -1012
  99. package/dist/esm/rendering/NiceCascadedShadows.js +370 -243
  100. package/dist/esm/rendering/NiceRenderExport.js +413 -321
  101. package/dist/esm/rendering/NiceSSAO.js +450 -328
  102. package/dist/esm/rendering/NiceSSR.js +383 -252
  103. package/dist/esm/rendering/NiceWebGPURenderer.js +326 -214
  104. package/dist/esm/uv/NiceUVEditor.js +788 -549
  105. package/dist/esm/uv/UVEditor.module.css.js +53 -3
  106. package/dist/esm/uv/uvEditorTypes.js +68 -75
  107. package/dist/esm/uv/uvEditorUtils.js +515 -557
  108. package/package.json +7 -12
@@ -1,43 +1,235 @@
1
- 'use strict';
2
-
3
- var jsxRuntime = require('react/jsx-runtime');
4
- var ui = require('@nice2dev/ui');
5
- var React = require('react');
6
- var i18n = require('../core/i18n.js');
7
- var ModelEditor_module = require('./ModelEditor.module.css.js');
8
-
9
- /** The viewport badge per editor mode: [key, English]. */
1
+ "use strict";
2
+ Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
3
+ const jsxRuntime = require("react/jsx-runtime");
4
+ const ui = require("@nice2dev/ui");
5
+ const React = require("react");
6
+ const i18n = require("../core/i18n.js");
7
+ const ModelEditor_module = require("./ModelEditor.module.css.js");
10
8
  const MODE_BADGE = {
11
- object: ['modelEditorViewport.objectMode', 'OBJECT MODE'],
12
- edit: ['modelEditorViewport.editMode', 'EDIT MODE'],
13
- pose: ['modelEditorViewport.poseMode', 'POSE MODE'],
14
- cad: ['modelEditorViewport.cadMode', 'CAD MODE'],
15
- sims: ['modelEditorViewport.simsMode', 'SIMS MODE'],
9
+ object: ["modelEditorViewport.objectMode", "OBJECT MODE"],
10
+ edit: ["modelEditorViewport.editMode", "EDIT MODE"],
11
+ pose: ["modelEditorViewport.poseMode", "POSE MODE"],
12
+ cad: ["modelEditorViewport.cadMode", "CAD MODE"],
13
+ sims: ["modelEditorViewport.simsMode", "SIMS MODE"]
16
14
  };
17
15
  const ModelEditorViewport = /* @__PURE__ */ Object.assign(
18
- /* @__PURE__ */ React.memo(({ api }) => {
16
+ /* @__PURE__ */ React.memo(({ api }) => {
19
17
  const { t } = i18n.useNiceTranslation();
20
- const { mountRef, dragOver, handleDragOver, handleDragLeave, handleDrop, handleViewportClick, handleContextMenu, editorMode, polyCount, meshCount, boneCount, shadingMode, setShadingMode, gizmoSpace, setGizmoSpace, contextMenu, closeContextMenu, addPrimitive, addSceneLight, duplicateSelected, deleteSelected, selectedNode, rootObjectRef, focusOnObject, snapEnabled, setSnapEnabled, } = api;
21
- return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsxs("div", { role: "presentation", ref: mountRef, className: `${ModelEditor_module.viewportContainer} ${dragOver ? ModelEditor_module.dragOver : ''}`, onDragOver: handleDragOver, onDragLeave: handleDragLeave, onDrop: handleDrop, onClick: handleViewportClick, onContextMenu: handleContextMenu, children: [jsxRuntime.jsxs("div", { className: ModelEditor_module.viewportOverlay, children: [jsxRuntime.jsx("span", { className: ModelEditor_module.viewportBadge, children: t(...MODE_BADGE[editorMode]) }), jsxRuntime.jsx("span", { className: ModelEditor_module.viewportBadge, children: t('modelEditorViewport.trisMeshesBones', '{polyCount} tris · {meshCount} meshes · {boneCount} bones')
22
- .replace('{polyCount}', String(polyCount.toLocaleString()))
23
- .replace('{meshCount}', String(meshCount))
24
- .replace('{boneCount}', String(boneCount)) })] }), jsxRuntime.jsx("div", { className: ModelEditor_module.viewportShadingBar, children: ['wireframe', 'solid', 'material', 'rendered'].map((m) => (jsxRuntime.jsx("button", { className: `${ModelEditor_module.shadingBtn} ${shadingMode === m ? ModelEditor_module.shadingBtnActive : ''}`, onClick: (e) => {
25
- e.stopPropagation();
26
- setShadingMode(m);
27
- }, title: m.charAt(0).toUpperCase() + m.slice(1), "aria-label": m.charAt(0).toUpperCase() + m.slice(1), children: jsxRuntime.jsx(ui.NiceIcon, { name: m === 'wireframe'
28
- ? 'hexagon'
29
- : m === 'solid'
30
- ? 'box'
31
- : m === 'material'
32
- ? 'palette'
33
- : 'lightbulb', size: 16 }) }, m))) }), jsxRuntime.jsx("div", { className: ModelEditor_module.viewportGizmoInfo, children: jsxRuntime.jsx("button", { className: ModelEditor_module.shadingBtn, onClick: (e) => {
34
- e.stopPropagation();
35
- setGizmoSpace((s) => (s === 'local' ? 'world' : 'local'));
36
- }, title: t('modelEditorViewport.orientation', 'Orientation: {gizmoSpace}').replace('{gizmoSpace}', String(gizmoSpace)), "aria-label": t('modelEditorViewport.orientation', 'Orientation: {gizmoSpace}').replace('{gizmoSpace}', String(gizmoSpace)), children: gizmoSpace === 'local' ? (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(ui.NiceIcon, { name: "target", size: 14 }), " ", t('modelEditorViewport.local', 'Local')] })) : (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(ui.NiceIcon, { name: "globe", size: 14 }), " ", t('modelEditorViewport.world', 'World')] })) }) }), dragOver && (jsxRuntime.jsx("div", { className: ModelEditor_module.viewportDropZone, children: jsxRuntime.jsx("span", { children: t('modelEditorViewport.drop3dFilesHere', 'Drop 3D files here') }) }))] }), contextMenu && (jsxRuntime.jsxs("div", { role: "presentation", className: ModelEditor_module.contextMenu, style: { top: contextMenu.y, left: contextMenu.x }, onClick: closeContextMenu, children: [jsxRuntime.jsxs("div", { role: "button", tabIndex: 0, onKeyDown: ui.clickOnActivationKey, className: ModelEditor_module.contextItem, onClick: () => addPrimitive('cube'), children: [jsxRuntime.jsx("span", { children: t('modelEditorViewport.addCube', 'Add Cube') }), jsxRuntime.jsx("span", { className: ModelEditor_module.contextKey, children: "Shift+A" })] }), jsxRuntime.jsx("div", { role: "button", tabIndex: 0, onKeyDown: ui.clickOnActivationKey, className: ModelEditor_module.contextItem, onClick: () => addPrimitive('sphere'), children: jsxRuntime.jsx("span", { children: t('modelEditorViewport.addSphere', 'Add Sphere') }) }), jsxRuntime.jsx("div", { role: "button", tabIndex: 0, onKeyDown: ui.clickOnActivationKey, className: ModelEditor_module.contextItem, onClick: () => addSceneLight('point'), children: jsxRuntime.jsx("span", { children: t('modelEditorViewport.addPointLight', 'Add Point Light') }) }), jsxRuntime.jsx("div", { className: ModelEditor_module.contextSep }), jsxRuntime.jsxs("div", { role: "button", tabIndex: 0, "aria-disabled": !selectedNode, onKeyDown: ui.clickOnActivationKey, className: ModelEditor_module.contextItem, onClick: duplicateSelected, style: !selectedNode ? { opacity: 0.4, pointerEvents: 'none' } : {}, children: [jsxRuntime.jsx("span", { children: t('modelEditorViewport.duplicate', 'Duplicate') }), jsxRuntime.jsx("span", { className: ModelEditor_module.contextKey, children: "Shift+D" })] }), jsxRuntime.jsxs("div", { role: "button", tabIndex: 0, "aria-disabled": !selectedNode, onKeyDown: ui.clickOnActivationKey, className: ModelEditor_module.contextItem, onClick: deleteSelected, style: !selectedNode ? { opacity: 0.4, pointerEvents: 'none' } : {}, children: [jsxRuntime.jsx("span", { children: t('modelEditorViewport.delete', 'Delete') }), jsxRuntime.jsx("span", { className: ModelEditor_module.contextKey, children: "Del" })] }), jsxRuntime.jsx("div", { className: ModelEditor_module.contextSep }), jsxRuntime.jsxs("div", { role: "button", tabIndex: 0, onKeyDown: ui.clickOnActivationKey, className: ModelEditor_module.contextItem, onClick: () => {
37
- if (rootObjectRef.current) {
38
- focusOnObject(rootObjectRef.current);
39
- }
40
- }, children: [jsxRuntime.jsx("span", { children: t('modelEditorViewport.focusCamera', 'Focus Camera') }), jsxRuntime.jsx("span", { className: ModelEditor_module.contextKey, children: "F" })] }), jsxRuntime.jsx("div", { role: "button", tabIndex: 0, onKeyDown: ui.clickOnActivationKey, className: ModelEditor_module.contextItem, onClick: () => setSnapEnabled((v) => !v), children: jsxRuntime.jsxs("span", { children: [snapEnabled && jsxRuntime.jsx(ui.NiceIcon, { name: "check", size: 14 }), ' ', t('modelEditorViewport.snapToGrid', 'Snap to Grid')] }) })] }))] }));
41
- }), { displayName: 'ModelEditorViewport' });
42
-
43
- module.exports = ModelEditorViewport;
18
+ const {
19
+ mountRef,
20
+ dragOver,
21
+ handleDragOver,
22
+ handleDragLeave,
23
+ handleDrop,
24
+ handleViewportClick,
25
+ handleContextMenu,
26
+ editorMode,
27
+ polyCount,
28
+ meshCount,
29
+ boneCount,
30
+ shadingMode,
31
+ setShadingMode,
32
+ gizmoSpace,
33
+ setGizmoSpace,
34
+ contextMenu,
35
+ closeContextMenu,
36
+ addPrimitive,
37
+ addSceneLight,
38
+ duplicateSelected,
39
+ deleteSelected,
40
+ selectedNode,
41
+ rootObjectRef,
42
+ focusOnObject,
43
+ snapEnabled,
44
+ setSnapEnabled
45
+ } = api;
46
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
47
+ /* @__PURE__ */ jsxRuntime.jsxs(
48
+ "div",
49
+ {
50
+ role: "presentation",
51
+ ref: mountRef,
52
+ className: `${ModelEditor_module.default.viewportContainer} ${dragOver ? ModelEditor_module.default.dragOver : ""}`,
53
+ onDragOver: handleDragOver,
54
+ onDragLeave: handleDragLeave,
55
+ onDrop: handleDrop,
56
+ onClick: handleViewportClick,
57
+ onContextMenu: handleContextMenu,
58
+ children: [
59
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: ModelEditor_module.default.viewportOverlay, children: [
60
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: ModelEditor_module.default.viewportBadge, children: t(...MODE_BADGE[editorMode]) }),
61
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: ModelEditor_module.default.viewportBadge, children: t(
62
+ "modelEditorViewport.trisMeshesBones",
63
+ "{polyCount} tris · {meshCount} meshes · {boneCount} bones"
64
+ ).replace("{polyCount}", String(polyCount.toLocaleString())).replace("{meshCount}", String(meshCount)).replace("{boneCount}", String(boneCount)) })
65
+ ] }),
66
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: ModelEditor_module.default.viewportShadingBar, children: ["wireframe", "solid", "material", "rendered"].map((m) => /* @__PURE__ */ jsxRuntime.jsx(
67
+ "button",
68
+ {
69
+ className: `${ModelEditor_module.default.shadingBtn} ${shadingMode === m ? ModelEditor_module.default.shadingBtnActive : ""}`,
70
+ onClick: (e) => {
71
+ e.stopPropagation();
72
+ setShadingMode(m);
73
+ },
74
+ title: m.charAt(0).toUpperCase() + m.slice(1),
75
+ "aria-label": m.charAt(0).toUpperCase() + m.slice(1),
76
+ children: /* @__PURE__ */ jsxRuntime.jsx(
77
+ ui.NiceIcon,
78
+ {
79
+ name: m === "wireframe" ? "hexagon" : m === "solid" ? "box" : m === "material" ? "palette" : "lightbulb",
80
+ size: 16
81
+ }
82
+ )
83
+ },
84
+ m
85
+ )) }),
86
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: ModelEditor_module.default.viewportGizmoInfo, children: /* @__PURE__ */ jsxRuntime.jsx(
87
+ "button",
88
+ {
89
+ className: ModelEditor_module.default.shadingBtn,
90
+ onClick: (e) => {
91
+ e.stopPropagation();
92
+ setGizmoSpace((s) => s === "local" ? "world" : "local");
93
+ },
94
+ title: t("modelEditorViewport.orientation", "Orientation: {gizmoSpace}").replace(
95
+ "{gizmoSpace}",
96
+ String(gizmoSpace)
97
+ ),
98
+ "aria-label": t("modelEditorViewport.orientation", "Orientation: {gizmoSpace}").replace(
99
+ "{gizmoSpace}",
100
+ String(gizmoSpace)
101
+ ),
102
+ children: gizmoSpace === "local" ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
103
+ /* @__PURE__ */ jsxRuntime.jsx(ui.NiceIcon, { name: "target", size: 14 }),
104
+ " ",
105
+ t("modelEditorViewport.local", "Local")
106
+ ] }) : /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
107
+ /* @__PURE__ */ jsxRuntime.jsx(ui.NiceIcon, { name: "globe", size: 14 }),
108
+ " ",
109
+ t("modelEditorViewport.world", "World")
110
+ ] })
111
+ }
112
+ ) }),
113
+ dragOver && /* @__PURE__ */ jsxRuntime.jsx("div", { className: ModelEditor_module.default.viewportDropZone, children: /* @__PURE__ */ jsxRuntime.jsx("span", { children: t("modelEditorViewport.drop3dFilesHere", "Drop 3D files here") }) })
114
+ ]
115
+ }
116
+ ),
117
+ contextMenu && /* @__PURE__ */ jsxRuntime.jsxs(
118
+ "div",
119
+ {
120
+ role: "presentation",
121
+ className: ModelEditor_module.default.contextMenu,
122
+ style: { top: contextMenu.y, left: contextMenu.x },
123
+ onClick: closeContextMenu,
124
+ children: [
125
+ /* @__PURE__ */ jsxRuntime.jsxs(
126
+ "div",
127
+ {
128
+ role: "button",
129
+ tabIndex: 0,
130
+ onKeyDown: ui.clickOnActivationKey,
131
+ className: ModelEditor_module.default.contextItem,
132
+ onClick: () => addPrimitive("cube"),
133
+ children: [
134
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: t("modelEditorViewport.addCube", "Add Cube") }),
135
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: ModelEditor_module.default.contextKey, children: "Shift+A" })
136
+ ]
137
+ }
138
+ ),
139
+ /* @__PURE__ */ jsxRuntime.jsx(
140
+ "div",
141
+ {
142
+ role: "button",
143
+ tabIndex: 0,
144
+ onKeyDown: ui.clickOnActivationKey,
145
+ className: ModelEditor_module.default.contextItem,
146
+ onClick: () => addPrimitive("sphere"),
147
+ children: /* @__PURE__ */ jsxRuntime.jsx("span", { children: t("modelEditorViewport.addSphere", "Add Sphere") })
148
+ }
149
+ ),
150
+ /* @__PURE__ */ jsxRuntime.jsx(
151
+ "div",
152
+ {
153
+ role: "button",
154
+ tabIndex: 0,
155
+ onKeyDown: ui.clickOnActivationKey,
156
+ className: ModelEditor_module.default.contextItem,
157
+ onClick: () => addSceneLight("point"),
158
+ children: /* @__PURE__ */ jsxRuntime.jsx("span", { children: t("modelEditorViewport.addPointLight", "Add Point Light") })
159
+ }
160
+ ),
161
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: ModelEditor_module.default.contextSep }),
162
+ /* @__PURE__ */ jsxRuntime.jsxs(
163
+ "div",
164
+ {
165
+ role: "button",
166
+ tabIndex: 0,
167
+ "aria-disabled": !selectedNode,
168
+ onKeyDown: ui.clickOnActivationKey,
169
+ className: ModelEditor_module.default.contextItem,
170
+ onClick: duplicateSelected,
171
+ style: !selectedNode ? { opacity: 0.4, pointerEvents: "none" } : {},
172
+ children: [
173
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: t("modelEditorViewport.duplicate", "Duplicate") }),
174
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: ModelEditor_module.default.contextKey, children: "Shift+D" })
175
+ ]
176
+ }
177
+ ),
178
+ /* @__PURE__ */ jsxRuntime.jsxs(
179
+ "div",
180
+ {
181
+ role: "button",
182
+ tabIndex: 0,
183
+ "aria-disabled": !selectedNode,
184
+ onKeyDown: ui.clickOnActivationKey,
185
+ className: ModelEditor_module.default.contextItem,
186
+ onClick: deleteSelected,
187
+ style: !selectedNode ? { opacity: 0.4, pointerEvents: "none" } : {},
188
+ children: [
189
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: t("modelEditorViewport.delete", "Delete") }),
190
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: ModelEditor_module.default.contextKey, children: "Del" })
191
+ ]
192
+ }
193
+ ),
194
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: ModelEditor_module.default.contextSep }),
195
+ /* @__PURE__ */ jsxRuntime.jsxs(
196
+ "div",
197
+ {
198
+ role: "button",
199
+ tabIndex: 0,
200
+ onKeyDown: ui.clickOnActivationKey,
201
+ className: ModelEditor_module.default.contextItem,
202
+ onClick: () => {
203
+ if (rootObjectRef.current) {
204
+ focusOnObject(rootObjectRef.current);
205
+ }
206
+ },
207
+ children: [
208
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children: t("modelEditorViewport.focusCamera", "Focus Camera") }),
209
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: ModelEditor_module.default.contextKey, children: "F" })
210
+ ]
211
+ }
212
+ ),
213
+ /* @__PURE__ */ jsxRuntime.jsx(
214
+ "div",
215
+ {
216
+ role: "button",
217
+ tabIndex: 0,
218
+ onKeyDown: ui.clickOnActivationKey,
219
+ className: ModelEditor_module.default.contextItem,
220
+ onClick: () => setSnapEnabled((v) => !v),
221
+ children: /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
222
+ snapEnabled && /* @__PURE__ */ jsxRuntime.jsx(ui.NiceIcon, { name: "check", size: 14 }),
223
+ " ",
224
+ t("modelEditorViewport.snapToGrid", "Snap to Grid")
225
+ ] })
226
+ }
227
+ )
228
+ ]
229
+ }
230
+ )
231
+ ] });
232
+ }),
233
+ { displayName: "ModelEditorViewport" }
234
+ );
235
+ exports.default = ModelEditorViewport;