@nice2dev/ui-3d 1.3.15 → 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 +9 -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,32 +1,361 @@
1
- import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
2
- import { NiceSelect, NiceButton, NiceIcon, clickOnActivationKey, NiceCheckbox, NiceColorPicker } from '@nice2dev/ui';
3
- import React from 'react';
4
- import { useNiceTranslation } from '../core/i18n.js';
5
- import styles from './ModelEditor.module.css.js';
6
-
1
+ import { jsxs, jsx, Fragment } from "react/jsx-runtime";
2
+ import { NiceSelect, NiceButton, NiceIcon, clickOnActivationKey, NiceCheckbox, NiceColorPicker } from "@nice2dev/ui";
3
+ import React from "react";
4
+ import { useNiceTranslation } from "../core/i18n.js";
5
+ import styles from "./ModelEditor.module.css.js";
7
6
  const ModelEditorMenuBar = /* @__PURE__ */ Object.assign(
8
- /* @__PURE__ */ React.memo(({ api, hasOnSaveToLibrary }) => {
7
+ /* @__PURE__ */ React.memo(({ api, hasOnSaveToLibrary }) => {
9
8
  const { t } = useNiceTranslation();
10
- const { editorMode, setEditorMode, fileInputRef, mergeInputRef, addMenuOpen, setAddMenuOpen, addPrimitive, addSceneLight, addCameraObject, addEmpty, selectedNode, duplicateSelected, deleteSelected, exportGLTF, exportOBJ, exportSTL, exportPLY, exportUSDZ, saveToLibrary, clearScene, showGrid, setShowGrid, showAxes, setShowAxes, wireframe, setWireframe, showSkeleton, setShowSkeleton, showLightHelpers, setShowLightHelpers, bgColor, setBgColor, } = api;
11
- return (jsxs("div", { className: styles.menuBar, children: [jsx(NiceSelect, { className: styles.modeSelect, value: editorMode, onChange: (val) => setEditorMode(val), options: [
12
- { value: 'object', label: t('modelEditorMenuBar.objectMode', 'Object Mode') },
13
- { value: 'edit', label: t('modelEditorMenuBar.editMode', 'Edit Mode') },
14
- { value: 'pose', label: t('modelEditorMenuBar.poseMode', 'Pose Mode') },
15
- ] }), jsx("div", { className: styles.menuSep }), jsxs(NiceButton, { className: styles.menuBtn, variant: "ghost", size: "sm", onClick: () => { var _a; return (_a = fileInputRef.current) === null || _a === void 0 ? void 0 : _a.click(); }, children: [jsx(NiceIcon, { name: "folder", size: 14 }), " ", t('modelEditorMenuBar.open', 'Open')] }), jsxs(NiceButton, { className: styles.menuBtn, variant: "ghost", size: "sm", onClick: () => { var _a; return (_a = mergeInputRef.current) === null || _a === void 0 ? void 0 : _a.click(); }, title: t('modelEditorMenuBar.mergeAnimationsFromFbxGltf', 'Merge animations from FBX/GLTF onto current model'), children: [jsx(NiceIcon, { name: "plus", size: 14 }), " ", t('modelEditorMenuBar.mergeAnim', 'Merge Anim')] }), jsx("div", { className: styles.menuSep }), jsxs("div", { className: styles.menuDropdownWrap, children: [jsxs(NiceButton, { className: styles.menuBtn, variant: "ghost", size: "sm", onClick: () => setAddMenuOpen(addMenuOpen ? null : 'mesh'), children: [jsx(NiceIcon, { name: "plus", size: 14 }), " ", t('modelEditorMenuBar.add', 'Add'), ' ', jsx(NiceIcon, { name: "chevron-down", size: 14 })] }), addMenuOpen && (jsxs("div", { className: styles.dropdownMenu, children: [jsx("div", { className: styles.dropdownTitle, children: t('modelEditorMenuBar.mesh', 'Mesh') }), [
16
- 'cube',
17
- 'sphere',
18
- 'cylinder',
19
- 'cone',
20
- 'torus',
21
- 'plane',
22
- 'circle',
23
- 'ring',
24
- 'dodecahedron',
25
- 'icosahedron',
26
- 'octahedron',
27
- 'tetrahedron',
28
- 'torusKnot',
29
- ].map((t) => (jsx("div", { role: "button", tabIndex: 0, onKeyDown: clickOnActivationKey, className: styles.dropdownItem, onClick: () => addPrimitive(t), children: t.charAt(0).toUpperCase() + t.slice(1) }, t))), jsx("div", { className: styles.dropdownSep }), jsx("div", { className: styles.dropdownTitle, children: t('modelEditorMenuBar.light', 'Light') }), ['point', 'spot', 'directional', 'hemisphere'].map((t) => (jsxs("div", { role: "button", tabIndex: 0, onKeyDown: clickOnActivationKey, className: styles.dropdownItem, onClick: () => addSceneLight(t), children: [jsx(NiceIcon, { name: "lightbulb", size: 14 }), " ", t.charAt(0).toUpperCase() + t.slice(1)] }, t))), jsx("div", { className: styles.dropdownSep }), jsx("div", { className: styles.dropdownTitle, children: t('modelEditorMenuBar.other', 'Other') }), jsxs("div", { role: "button", tabIndex: 0, onKeyDown: clickOnActivationKey, className: styles.dropdownItem, onClick: addCameraObject, children: [jsx(NiceIcon, { name: "camera", size: 14 }), " ", t('modelEditorMenuBar.camera', 'Camera')] }), jsxs("div", { role: "button", tabIndex: 0, onKeyDown: clickOnActivationKey, className: styles.dropdownItem, onClick: () => addEmpty('arrows'), children: [jsx(NiceIcon, { name: "move", size: 14 }), ' ', t('modelEditorMenuBar.emptyArrows', 'Empty (Arrows)')] })] }))] }), jsxs(NiceButton, { className: styles.menuBtn, variant: "ghost", size: "sm", onClick: duplicateSelected, disabled: !selectedNode, title: t('modelEditorMenuBar.duplicateSelectedShiftD', 'Duplicate selected (Shift+D)'), children: [jsx(NiceIcon, { name: "clipboard", size: 14 }), " ", t('modelEditorMenuBar.duplicate', 'Duplicate')] }), jsxs(NiceButton, { className: styles.menuBtn, variant: "ghost", size: "sm", onClick: deleteSelected, disabled: !selectedNode, title: t('modelEditorMenuBar.deleteSelectedDelete', 'Delete selected (Delete)'), children: [jsx(NiceIcon, { name: "close", size: 14 }), " ", t('modelEditorMenuBar.delete', 'Delete')] }), jsx("div", { className: styles.menuSep }), jsxs(NiceButton, { className: styles.menuBtn, variant: "ghost", size: "sm", onClick: () => exportGLTF(true), children: [jsx(NiceIcon, { name: "save", size: 14 }), " ", t('modelEditorMenuBar.exportGlb', 'Export GLB')] }), jsxs(NiceButton, { className: styles.menuBtn, variant: "ghost", size: "sm", onClick: () => exportGLTF(false), children: [jsx(NiceIcon, { name: "file", size: 14 }), " ", t('modelEditorMenuBar.exportGltf', 'Export GLTF')] }), jsxs(NiceButton, { className: styles.menuBtn, variant: "ghost", size: "sm", onClick: exportOBJ, children: [jsx(NiceIcon, { name: "file", size: 14 }), " ", t('modelEditorMenuBar.exportObj', 'Export OBJ')] }), jsxs(NiceButton, { className: styles.menuBtn, variant: "ghost", size: "sm", onClick: () => exportSTL(true), children: [jsx(NiceIcon, { name: "file", size: 14 }), " ", t('modelEditorMenuBar.exportStl', 'Export STL')] }), jsxs(NiceButton, { className: styles.menuBtn, variant: "ghost", size: "sm", onClick: () => exportPLY(true), children: [jsx(NiceIcon, { name: "file", size: 14 }), " ", t('modelEditorMenuBar.exportPly', 'Export PLY')] }), jsxs(NiceButton, { className: styles.menuBtn, variant: "ghost", size: "sm", onClick: exportUSDZ, children: [jsx(NiceIcon, { name: "file", size: 14 }), " ", t('modelEditorMenuBar.exportUsdz', 'Export USDZ')] }), hasOnSaveToLibrary && (jsxs(Fragment, { children: [jsx("div", { className: styles.menuSep }), jsxs(NiceButton, { className: styles.menuBtn, variant: "ghost", size: "sm", onClick: saveToLibrary, children: [jsx(NiceIcon, { name: "box", size: 14 }), ' ', t('modelEditorMenuBar.saveToLibrary', 'Save to Library')] })] })), jsx("div", { className: styles.menuSep }), jsxs(NiceButton, { className: styles.menuBtn, variant: "ghost", size: "sm", onClick: clearScene, children: [jsx(NiceIcon, { name: "trash", size: 14 }), " ", t('modelEditorMenuBar.clear', 'Clear')] }), jsx("div", { className: styles.menuSep }), jsx(NiceCheckbox, { checked: showGrid, onChange: () => setShowGrid((v) => !v), label: t('modelEditorMenuBar.grid', 'Grid') }), jsx(NiceCheckbox, { checked: showAxes, onChange: () => setShowAxes((v) => !v), label: t('modelEditorMenuBar.axes', 'Axes') }), jsx(NiceCheckbox, { checked: wireframe, onChange: () => setWireframe((v) => !v), label: t('modelEditorMenuBar.wire', 'Wire') }), jsx(NiceCheckbox, { checked: showSkeleton, onChange: () => setShowSkeleton((v) => !v), label: t('modelEditorMenuBar.skel', 'Skel') }), jsx(NiceCheckbox, { checked: showLightHelpers, onChange: () => setShowLightHelpers((v) => !v), label: t('modelEditorMenuBar.helpers', 'Helpers') }), jsxs("div", { className: styles.menuRight, children: [jsx("label", { className: styles.menuLabel, children: t('modelEditorMenuBar.bg', 'BG') }), jsx(NiceColorPicker, { value: bgColor, onChange: (c) => setBgColor(c) })] })] }));
30
- }), { displayName: 'ModelEditorMenuBar' });
31
-
32
- export { ModelEditorMenuBar as default };
9
+ const {
10
+ editorMode,
11
+ setEditorMode,
12
+ fileInputRef,
13
+ mergeInputRef,
14
+ addMenuOpen,
15
+ setAddMenuOpen,
16
+ addPrimitive,
17
+ addSceneLight,
18
+ addCameraObject,
19
+ addEmpty,
20
+ selectedNode,
21
+ duplicateSelected,
22
+ deleteSelected,
23
+ exportGLTF,
24
+ exportOBJ,
25
+ exportSTL,
26
+ exportPLY,
27
+ exportUSDZ,
28
+ saveToLibrary,
29
+ clearScene,
30
+ showGrid,
31
+ setShowGrid,
32
+ showAxes,
33
+ setShowAxes,
34
+ wireframe,
35
+ setWireframe,
36
+ showSkeleton,
37
+ setShowSkeleton,
38
+ showLightHelpers,
39
+ setShowLightHelpers,
40
+ bgColor,
41
+ setBgColor
42
+ } = api;
43
+ return /* @__PURE__ */ jsxs("div", { className: styles.menuBar, children: [
44
+ /* @__PURE__ */ jsx(
45
+ NiceSelect,
46
+ {
47
+ className: styles.modeSelect,
48
+ value: editorMode,
49
+ onChange: (val) => setEditorMode(val),
50
+ options: [
51
+ { value: "object", label: t("modelEditorMenuBar.objectMode", "Object Mode") },
52
+ { value: "edit", label: t("modelEditorMenuBar.editMode", "Edit Mode") },
53
+ { value: "pose", label: t("modelEditorMenuBar.poseMode", "Pose Mode") }
54
+ ]
55
+ }
56
+ ),
57
+ /* @__PURE__ */ jsx("div", { className: styles.menuSep }),
58
+ /* @__PURE__ */ jsxs(
59
+ NiceButton,
60
+ {
61
+ className: styles.menuBtn,
62
+ variant: "ghost",
63
+ size: "sm",
64
+ onClick: () => fileInputRef.current?.click(),
65
+ children: [
66
+ /* @__PURE__ */ jsx(NiceIcon, { name: "folder", size: 14 }),
67
+ " ",
68
+ t("modelEditorMenuBar.open", "Open")
69
+ ]
70
+ }
71
+ ),
72
+ /* @__PURE__ */ jsxs(
73
+ NiceButton,
74
+ {
75
+ className: styles.menuBtn,
76
+ variant: "ghost",
77
+ size: "sm",
78
+ onClick: () => mergeInputRef.current?.click(),
79
+ title: t(
80
+ "modelEditorMenuBar.mergeAnimationsFromFbxGltf",
81
+ "Merge animations from FBX/GLTF onto current model"
82
+ ),
83
+ children: [
84
+ /* @__PURE__ */ jsx(NiceIcon, { name: "plus", size: 14 }),
85
+ " ",
86
+ t("modelEditorMenuBar.mergeAnim", "Merge Anim")
87
+ ]
88
+ }
89
+ ),
90
+ /* @__PURE__ */ jsx("div", { className: styles.menuSep }),
91
+ /* @__PURE__ */ jsxs("div", { className: styles.menuDropdownWrap, children: [
92
+ /* @__PURE__ */ jsxs(
93
+ NiceButton,
94
+ {
95
+ className: styles.menuBtn,
96
+ variant: "ghost",
97
+ size: "sm",
98
+ onClick: () => setAddMenuOpen(addMenuOpen ? null : "mesh"),
99
+ children: [
100
+ /* @__PURE__ */ jsx(NiceIcon, { name: "plus", size: 14 }),
101
+ " ",
102
+ t("modelEditorMenuBar.add", "Add"),
103
+ " ",
104
+ /* @__PURE__ */ jsx(NiceIcon, { name: "chevron-down", size: 14 })
105
+ ]
106
+ }
107
+ ),
108
+ addMenuOpen && /* @__PURE__ */ jsxs("div", { className: styles.dropdownMenu, children: [
109
+ /* @__PURE__ */ jsx("div", { className: styles.dropdownTitle, children: t("modelEditorMenuBar.mesh", "Mesh") }),
110
+ [
111
+ "cube",
112
+ "sphere",
113
+ "cylinder",
114
+ "cone",
115
+ "torus",
116
+ "plane",
117
+ "circle",
118
+ "ring",
119
+ "dodecahedron",
120
+ "icosahedron",
121
+ "octahedron",
122
+ "tetrahedron",
123
+ "torusKnot"
124
+ ].map((t2) => /* @__PURE__ */ jsx(
125
+ "div",
126
+ {
127
+ role: "button",
128
+ tabIndex: 0,
129
+ onKeyDown: clickOnActivationKey,
130
+ className: styles.dropdownItem,
131
+ onClick: () => addPrimitive(t2),
132
+ children: t2.charAt(0).toUpperCase() + t2.slice(1)
133
+ },
134
+ t2
135
+ )),
136
+ /* @__PURE__ */ jsx("div", { className: styles.dropdownSep }),
137
+ /* @__PURE__ */ jsx("div", { className: styles.dropdownTitle, children: t("modelEditorMenuBar.light", "Light") }),
138
+ ["point", "spot", "directional", "hemisphere"].map((t2) => /* @__PURE__ */ jsxs(
139
+ "div",
140
+ {
141
+ role: "button",
142
+ tabIndex: 0,
143
+ onKeyDown: clickOnActivationKey,
144
+ className: styles.dropdownItem,
145
+ onClick: () => addSceneLight(t2),
146
+ children: [
147
+ /* @__PURE__ */ jsx(NiceIcon, { name: "lightbulb", size: 14 }),
148
+ " ",
149
+ t2.charAt(0).toUpperCase() + t2.slice(1)
150
+ ]
151
+ },
152
+ t2
153
+ )),
154
+ /* @__PURE__ */ jsx("div", { className: styles.dropdownSep }),
155
+ /* @__PURE__ */ jsx("div", { className: styles.dropdownTitle, children: t("modelEditorMenuBar.other", "Other") }),
156
+ /* @__PURE__ */ jsxs(
157
+ "div",
158
+ {
159
+ role: "button",
160
+ tabIndex: 0,
161
+ onKeyDown: clickOnActivationKey,
162
+ className: styles.dropdownItem,
163
+ onClick: addCameraObject,
164
+ children: [
165
+ /* @__PURE__ */ jsx(NiceIcon, { name: "camera", size: 14 }),
166
+ " ",
167
+ t("modelEditorMenuBar.camera", "Camera")
168
+ ]
169
+ }
170
+ ),
171
+ /* @__PURE__ */ jsxs(
172
+ "div",
173
+ {
174
+ role: "button",
175
+ tabIndex: 0,
176
+ onKeyDown: clickOnActivationKey,
177
+ className: styles.dropdownItem,
178
+ onClick: () => addEmpty("arrows"),
179
+ children: [
180
+ /* @__PURE__ */ jsx(NiceIcon, { name: "move", size: 14 }),
181
+ " ",
182
+ t("modelEditorMenuBar.emptyArrows", "Empty (Arrows)")
183
+ ]
184
+ }
185
+ )
186
+ ] })
187
+ ] }),
188
+ /* @__PURE__ */ jsxs(
189
+ NiceButton,
190
+ {
191
+ className: styles.menuBtn,
192
+ variant: "ghost",
193
+ size: "sm",
194
+ onClick: duplicateSelected,
195
+ disabled: !selectedNode,
196
+ title: t("modelEditorMenuBar.duplicateSelectedShiftD", "Duplicate selected (Shift+D)"),
197
+ children: [
198
+ /* @__PURE__ */ jsx(NiceIcon, { name: "clipboard", size: 14 }),
199
+ " ",
200
+ t("modelEditorMenuBar.duplicate", "Duplicate")
201
+ ]
202
+ }
203
+ ),
204
+ /* @__PURE__ */ jsxs(
205
+ NiceButton,
206
+ {
207
+ className: styles.menuBtn,
208
+ variant: "ghost",
209
+ size: "sm",
210
+ onClick: deleteSelected,
211
+ disabled: !selectedNode,
212
+ title: t("modelEditorMenuBar.deleteSelectedDelete", "Delete selected (Delete)"),
213
+ children: [
214
+ /* @__PURE__ */ jsx(NiceIcon, { name: "close", size: 14 }),
215
+ " ",
216
+ t("modelEditorMenuBar.delete", "Delete")
217
+ ]
218
+ }
219
+ ),
220
+ /* @__PURE__ */ jsx("div", { className: styles.menuSep }),
221
+ /* @__PURE__ */ jsxs(
222
+ NiceButton,
223
+ {
224
+ className: styles.menuBtn,
225
+ variant: "ghost",
226
+ size: "sm",
227
+ onClick: () => exportGLTF(true),
228
+ children: [
229
+ /* @__PURE__ */ jsx(NiceIcon, { name: "save", size: 14 }),
230
+ " ",
231
+ t("modelEditorMenuBar.exportGlb", "Export GLB")
232
+ ]
233
+ }
234
+ ),
235
+ /* @__PURE__ */ jsxs(
236
+ NiceButton,
237
+ {
238
+ className: styles.menuBtn,
239
+ variant: "ghost",
240
+ size: "sm",
241
+ onClick: () => exportGLTF(false),
242
+ children: [
243
+ /* @__PURE__ */ jsx(NiceIcon, { name: "file", size: 14 }),
244
+ " ",
245
+ t("modelEditorMenuBar.exportGltf", "Export GLTF")
246
+ ]
247
+ }
248
+ ),
249
+ /* @__PURE__ */ jsxs(NiceButton, { className: styles.menuBtn, variant: "ghost", size: "sm", onClick: exportOBJ, children: [
250
+ /* @__PURE__ */ jsx(NiceIcon, { name: "file", size: 14 }),
251
+ " ",
252
+ t("modelEditorMenuBar.exportObj", "Export OBJ")
253
+ ] }),
254
+ /* @__PURE__ */ jsxs(
255
+ NiceButton,
256
+ {
257
+ className: styles.menuBtn,
258
+ variant: "ghost",
259
+ size: "sm",
260
+ onClick: () => exportSTL(true),
261
+ children: [
262
+ /* @__PURE__ */ jsx(NiceIcon, { name: "file", size: 14 }),
263
+ " ",
264
+ t("modelEditorMenuBar.exportStl", "Export STL")
265
+ ]
266
+ }
267
+ ),
268
+ /* @__PURE__ */ jsxs(
269
+ NiceButton,
270
+ {
271
+ className: styles.menuBtn,
272
+ variant: "ghost",
273
+ size: "sm",
274
+ onClick: () => exportPLY(true),
275
+ children: [
276
+ /* @__PURE__ */ jsx(NiceIcon, { name: "file", size: 14 }),
277
+ " ",
278
+ t("modelEditorMenuBar.exportPly", "Export PLY")
279
+ ]
280
+ }
281
+ ),
282
+ /* @__PURE__ */ jsxs(NiceButton, { className: styles.menuBtn, variant: "ghost", size: "sm", onClick: exportUSDZ, children: [
283
+ /* @__PURE__ */ jsx(NiceIcon, { name: "file", size: 14 }),
284
+ " ",
285
+ t("modelEditorMenuBar.exportUsdz", "Export USDZ")
286
+ ] }),
287
+ hasOnSaveToLibrary && /* @__PURE__ */ jsxs(Fragment, { children: [
288
+ /* @__PURE__ */ jsx("div", { className: styles.menuSep }),
289
+ /* @__PURE__ */ jsxs(
290
+ NiceButton,
291
+ {
292
+ className: styles.menuBtn,
293
+ variant: "ghost",
294
+ size: "sm",
295
+ onClick: saveToLibrary,
296
+ children: [
297
+ /* @__PURE__ */ jsx(NiceIcon, { name: "box", size: 14 }),
298
+ " ",
299
+ t("modelEditorMenuBar.saveToLibrary", "Save to Library")
300
+ ]
301
+ }
302
+ )
303
+ ] }),
304
+ /* @__PURE__ */ jsx("div", { className: styles.menuSep }),
305
+ /* @__PURE__ */ jsxs(NiceButton, { className: styles.menuBtn, variant: "ghost", size: "sm", onClick: clearScene, children: [
306
+ /* @__PURE__ */ jsx(NiceIcon, { name: "trash", size: 14 }),
307
+ " ",
308
+ t("modelEditorMenuBar.clear", "Clear")
309
+ ] }),
310
+ /* @__PURE__ */ jsx("div", { className: styles.menuSep }),
311
+ /* @__PURE__ */ jsx(
312
+ NiceCheckbox,
313
+ {
314
+ checked: showGrid,
315
+ onChange: () => setShowGrid((v) => !v),
316
+ label: t("modelEditorMenuBar.grid", "Grid")
317
+ }
318
+ ),
319
+ /* @__PURE__ */ jsx(
320
+ NiceCheckbox,
321
+ {
322
+ checked: showAxes,
323
+ onChange: () => setShowAxes((v) => !v),
324
+ label: t("modelEditorMenuBar.axes", "Axes")
325
+ }
326
+ ),
327
+ /* @__PURE__ */ jsx(
328
+ NiceCheckbox,
329
+ {
330
+ checked: wireframe,
331
+ onChange: () => setWireframe((v) => !v),
332
+ label: t("modelEditorMenuBar.wire", "Wire")
333
+ }
334
+ ),
335
+ /* @__PURE__ */ jsx(
336
+ NiceCheckbox,
337
+ {
338
+ checked: showSkeleton,
339
+ onChange: () => setShowSkeleton((v) => !v),
340
+ label: t("modelEditorMenuBar.skel", "Skel")
341
+ }
342
+ ),
343
+ /* @__PURE__ */ jsx(
344
+ NiceCheckbox,
345
+ {
346
+ checked: showLightHelpers,
347
+ onChange: () => setShowLightHelpers((v) => !v),
348
+ label: t("modelEditorMenuBar.helpers", "Helpers")
349
+ }
350
+ ),
351
+ /* @__PURE__ */ jsxs("div", { className: styles.menuRight, children: [
352
+ /* @__PURE__ */ jsx("label", { className: styles.menuLabel, children: t("modelEditorMenuBar.bg", "BG") }),
353
+ /* @__PURE__ */ jsx(NiceColorPicker, { value: bgColor, onChange: (c) => setBgColor(c) })
354
+ ] })
355
+ ] });
356
+ }),
357
+ { displayName: "ModelEditorMenuBar" }
358
+ );
359
+ export {
360
+ ModelEditorMenuBar as default
361
+ };