@nice2dev/ui-3d 1.2.2 → 1.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +380 -0
- package/dist/cjs/model/ModelEditorLeftPanel.js +2 -2
- package/dist/cjs/model/ModelEditorMenuBar.js +1 -1
- package/dist/cjs/model/ModelEditorSubComponents.js +1 -1
- package/dist/cjs/model/ModelEditorTimeline.js +3 -3
- package/dist/cjs/model/ModelEditorViewport.js +3 -3
- package/dist/cjs/model/useModelEditor.js +39 -6
- package/dist/cjs/model/useModelViewer.js +6 -6
- package/dist/cjs/nice2dev-ui-3d.css +1 -1
- package/dist/cjs/particle/NiceParticleEditor.js +2 -2
- package/dist/esm/model/ModelEditorLeftPanel.js +3 -3
- package/dist/esm/model/ModelEditorMenuBar.js +2 -2
- package/dist/esm/model/ModelEditorSubComponents.js +2 -2
- package/dist/esm/model/ModelEditorTimeline.js +4 -4
- package/dist/esm/model/ModelEditorViewport.js +4 -4
- package/dist/esm/model/useModelEditor.js +39 -6
- package/dist/esm/model/useModelViewer.js +7 -7
- package/dist/esm/nice2dev-ui-3d.css +1 -1
- package/dist/esm/particle/NiceParticleEditor.js +3 -3
- package/package.json +3 -3
|
@@ -968,12 +968,34 @@ function useModelEditor({ onSaveToLibrary, onAIPoseVideo, }) {
|
|
|
968
968
|
Keyboard shortcuts
|
|
969
969
|
───────────────────────────────────────── */
|
|
970
970
|
React.useEffect(() => {
|
|
971
|
+
// Escape, then Tab, leaves the viewport, where Tab cycles the mode (WCAG 2.1.2)
|
|
972
|
+
let tabEscape = false;
|
|
971
973
|
const handleKey = (e) => {
|
|
972
|
-
var _a, _b, _c;
|
|
973
|
-
|
|
974
|
-
|
|
974
|
+
var _a, _b, _c, _d;
|
|
975
|
+
// a key sent to the window itself counts as the body's
|
|
976
|
+
const target = e.target instanceof HTMLElement ? e.target : null;
|
|
977
|
+
const tag = target === null || target === void 0 ? void 0 : target.tagName;
|
|
978
|
+
if (tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT' || (target === null || target === void 0 ? void 0 : target.isContentEditable)) {
|
|
975
979
|
return;
|
|
976
980
|
}
|
|
981
|
+
// The shortcuts are this editor's: keys elsewhere on the page are not, and Tab / Space on
|
|
982
|
+
// one of its controls move focus and press it. They listened on the whole page — Tab moved
|
|
983
|
+
// focus nowhere on a page with the editor and Space pressed no button (TODO_1.3.0 I4).
|
|
984
|
+
const root = (_b = (_a = mountRef.current) === null || _a === void 0 ? void 0 : _a.closest('.nice-app-shell')) !== null && _b !== void 0 ? _b : mountRef.current;
|
|
985
|
+
if (target && target !== document.body && !(root === null || root === void 0 ? void 0 : root.contains(target))) {
|
|
986
|
+
return;
|
|
987
|
+
}
|
|
988
|
+
if ((e.key === 'Tab' || e.key === ' ') &&
|
|
989
|
+
(target === null || target === void 0 ? void 0 : target.closest('button, a[href], [role="button"], [role="combobox"], [role="menuitem"], [role="tab"], [role="option"], [role="checkbox"], [role="switch"], [role="slider"], [role="treeitem"]'))) {
|
|
990
|
+
return;
|
|
991
|
+
}
|
|
992
|
+
if (e.key === 'Tab' && tabEscape) {
|
|
993
|
+
tabEscape = false;
|
|
994
|
+
return;
|
|
995
|
+
}
|
|
996
|
+
if (!['Shift', 'Control', 'Alt', 'Meta'].includes(e.key)) {
|
|
997
|
+
tabEscape = e.key === 'Escape';
|
|
998
|
+
}
|
|
977
999
|
switch (e.key.toLowerCase()) {
|
|
978
1000
|
case 'g':
|
|
979
1001
|
setTransformMode('translate');
|
|
@@ -1000,7 +1022,7 @@ function useModelEditor({ onSaveToLibrary, onAIPoseVideo, }) {
|
|
|
1000
1022
|
const sel = findNodeById(sceneTree, selectedId);
|
|
1001
1023
|
if (sel) {
|
|
1002
1024
|
sel.object.removeFromParent();
|
|
1003
|
-
(
|
|
1025
|
+
(_c = transformRef.current) === null || _c === void 0 ? void 0 : _c.detach();
|
|
1004
1026
|
setSelectedId(null);
|
|
1005
1027
|
rebuildTree();
|
|
1006
1028
|
}
|
|
@@ -1011,7 +1033,7 @@ function useModelEditor({ onSaveToLibrary, onAIPoseVideo, }) {
|
|
|
1011
1033
|
const sel = findNodeById(sceneTree, selectedId);
|
|
1012
1034
|
if (sel) {
|
|
1013
1035
|
sel.object.removeFromParent();
|
|
1014
|
-
(
|
|
1036
|
+
(_d = transformRef.current) === null || _d === void 0 ? void 0 : _d.detach();
|
|
1015
1037
|
setSelectedId(null);
|
|
1016
1038
|
rebuildTree();
|
|
1017
1039
|
}
|
|
@@ -1624,9 +1646,20 @@ function useModelEditor({ onSaveToLibrary, onAIPoseVideo, }) {
|
|
|
1624
1646
|
const canRedo = undoRedoRef.current.canRedo();
|
|
1625
1647
|
const undoLabel = undoRedoRef.current.undoLabel;
|
|
1626
1648
|
const redoLabel = undoRedoRef.current.redoLabel;
|
|
1627
|
-
// Keyboard shortcuts for undo/redo
|
|
1649
|
+
// Keyboard shortcuts for undo/redo — in this editor only, and not in a text field, whose own
|
|
1650
|
+
// undo they took (on the whole page before)
|
|
1628
1651
|
React.useEffect(() => {
|
|
1629
1652
|
const handleKeyDown = (e) => {
|
|
1653
|
+
var _a, _b;
|
|
1654
|
+
const target = e.target instanceof HTMLElement ? e.target : null;
|
|
1655
|
+
const tag = target === null || target === void 0 ? void 0 : target.tagName;
|
|
1656
|
+
const root = (_b = (_a = mountRef.current) === null || _a === void 0 ? void 0 : _a.closest('.nice-app-shell')) !== null && _b !== void 0 ? _b : mountRef.current;
|
|
1657
|
+
if (tag === 'INPUT' ||
|
|
1658
|
+
tag === 'TEXTAREA' ||
|
|
1659
|
+
(target === null || target === void 0 ? void 0 : target.isContentEditable) ||
|
|
1660
|
+
(target && target !== document.body && !(root === null || root === void 0 ? void 0 : root.contains(target)))) {
|
|
1661
|
+
return;
|
|
1662
|
+
}
|
|
1630
1663
|
if ((e.ctrlKey || e.metaKey) && e.key === 'z' && !e.shiftKey) {
|
|
1631
1664
|
e.preventDefault();
|
|
1632
1665
|
undo();
|
|
@@ -183,7 +183,7 @@ function useModelViewer(props = {}) {
|
|
|
183
183
|
ro.observe(mount);
|
|
184
184
|
// Animation loop
|
|
185
185
|
const animate = () => {
|
|
186
|
-
var _a, _b, _c, _d, _e, _f
|
|
186
|
+
var _a, _b, _c, _d, _e, _f;
|
|
187
187
|
if (disposeRef.current) {
|
|
188
188
|
return;
|
|
189
189
|
}
|
|
@@ -191,12 +191,12 @@ function useModelViewer(props = {}) {
|
|
|
191
191
|
const dt = (_b = (_a = clockRef.current) === null || _a === void 0 ? void 0 : _a.getDelta()) !== null && _b !== void 0 ? _b : 0;
|
|
192
192
|
// Gamepad FPS-style nav
|
|
193
193
|
if (gamepad && navMode === 'fps') {
|
|
194
|
-
|
|
195
|
-
const gp = (
|
|
194
|
+
// The pads the input engine read this frame (1.3.0: the engine is the only pad reader).
|
|
195
|
+
const gp = (_c = ui.getInputEngine().gamepadSnapshot[0]) !== null && _c !== void 0 ? _c : null;
|
|
196
196
|
if (gp) {
|
|
197
|
-
const lx = (
|
|
198
|
-
const ly = (
|
|
199
|
-
const rx = (
|
|
197
|
+
const lx = (_d = gp.axes[0]) !== null && _d !== void 0 ? _d : 0;
|
|
198
|
+
const ly = (_e = gp.axes[1]) !== null && _e !== void 0 ? _e : 0;
|
|
199
|
+
const rx = (_f = gp.axes[2]) !== null && _f !== void 0 ? _f : 0;
|
|
200
200
|
const fwd = new THREE__namespace.Vector3();
|
|
201
201
|
camera.getWorldDirection(fwd);
|
|
202
202
|
fwd.y = 0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
.ModelEditor-module_root__Aiqom{background:var(--nice-bg-primary);color:var(--nice-text-primary);display:flex;flex-direction:column;font-family:Segoe UI,Consolas,monospace;font-size:12px;height:100%;overflow:hidden;user-select:none}.ModelEditor-module_menuBar__5P6Wi{align-items:center;background:var(--nice-bg-canvas);border-bottom:1px solid var(--nice-border-color);display:flex;flex-shrink:0;gap:0;height:28px;padding:0 var(--nice-space-1,4px)}.ModelEditor-module_menuBtn__f1u-N{background:none;border:none;border-radius:var(--nice-radius-sm,3px);color:var(--nice-text-secondary);cursor:pointer;font-size:11px;padding:var(--nice-space-1,4px) var(--nice-space-2-5,10px);white-space:nowrap}.ModelEditor-module_menuBtn__f1u-N:hover{background:var(--nice-bg-secondary);color:var(--nice-color-white)}.ModelEditor-module_menuBtn__f1u-N:disabled{cursor:default;opacity:.4}.ModelEditor-module_menuSep__Jilgu{background:var(--nice-bg-secondary);height:16px;margin:0 var(--nice-space-1,4px);width:1px}.ModelEditor-module_menuLabel__gn6yQ{color:var(--nice-text-secondary);font-size:10px;margin:0 var(--nice-space-1-5,6px);white-space:nowrap}.ModelEditor-module_menuRight__YQWk7{align-items:center;display:flex;gap:var(--nice-space-1,4px);margin-left:auto}.ModelEditor-module_leftPanel__sVsxG{background:var(--nice-bg-primary);overflow:hidden;width:240px}.ModelEditor-module_leftPanel__sVsxG,.ModelEditor-module_toolbar__l8uKC{border-right:1px solid var(--nice-border-color);display:flex;flex-direction:column;flex-shrink:0}.ModelEditor-module_toolbar__l8uKC{background:var(--nice-bg-elevated);gap:var(--nice-space-0-5,2px);padding:var(--nice-space-1,4px) var(--nice-space-0-5,2px);width:38px}.ModelEditor-module_toolBtn__8DzAf{align-items:center;background:none;border:1px solid transparent;border-radius:var(--nice-radius-sm,4px);color:var(--nice-text-muted);cursor:pointer;display:flex;font-size:16px;height:32px;justify-content:center;transition:all .1s;width:32px}.ModelEditor-module_toolBtn__8DzAf:hover{background:var(--nice-bg-secondary);color:var(--nice-text-secondary)}.ModelEditor-module_toolBtnActive__ek-nN{background:var(--nice-bg-tertiary)!important;border-color:var(--nice-color-primary)!important;color:var(--nice-color-white)!important}.ModelEditor-module_toolSep__5I72j{background:var(--nice-bg-secondary);height:1px;margin:var(--nice-space-1,4px) var(--nice-space-0-5,2px)}.ModelEditor-module_viewportContainer__O-e-6{background:var(--nice-bg-inset);flex:1;height:100%;min-height:0;overflow:hidden;position:relative}.ModelEditor-module_viewportContainer__O-e-6 canvas{display:block;height:100%;width:100%}.ModelEditor-module_viewportOverlay__LXDnT{display:flex;gap:var(--nice-space-1,4px);left:8px;position:absolute;top:8px;z-index:10}.ModelEditor-module_viewportBadge__-5C9w{background:var(--nice-overlay-80,rgba(20,20,40,.8));border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-sm,4px);color:var(--nice-text-muted);font-size:10px;padding:var(--nice-space-0-5,2px) var(--nice-space-2,8px)}.ModelEditor-module_viewportDropZone__PBrTo{align-items:center;background:rgba(85,102,204,.15);border:2px dashed var(--nice-color-primary);display:flex;inset:0;justify-content:center;pointer-events:none;position:absolute;z-index:20}.ModelEditor-module_viewportDropZone__PBrTo span{background:rgba(20,20,40,.9);border-radius:var(--nice-radius-lg,8px);color:var(--nice-text-muted,#aab);font-size:14px;padding:var(--nice-space-3,12px) var(--nice-space-6,24px)}.ModelEditor-module_rightPanel__oJf3N{background:var(--nice-bg-primary);border-left:1px solid var(--nice-border-color);display:flex;flex-direction:column;flex-shrink:0;overflow-y:auto;width:280px}.ModelEditor-module_panelSection__yb-jc{border-bottom:1px solid var(--nice-border-color);padding:var(--nice-space-1-5,6px) var(--nice-space-2,8px)}.ModelEditor-module_panelTitle__rp8tH{align-items:center;color:var(--nice-text-secondary);cursor:pointer;display:flex;font-size:10px;justify-content:space-between;letter-spacing:.5px;margin-bottom:var(--nice-space-1,4px);text-transform:uppercase}.ModelEditor-module_panelTitle__rp8tH button{background:none;border:none;color:var(--nice-text-secondary);cursor:pointer;font-size:14px;line-height:1;padding:0 var(--nice-space-0-5,2px)}.ModelEditor-module_panelTitle__rp8tH button:hover{color:var(--nice-text-muted)}.ModelEditor-module_panelCollapsed__xBsUg .ModelEditor-module_panelContent__IMNnR{display:none}.ModelEditor-module_panelContent__IMNnR{padding-top:var(--nice-space-1,4px)}.ModelEditor-module_treeItem__MiVWT{align-items:center;border-radius:var(--nice-radius-sm,3px);cursor:pointer;display:flex;font-size:11px;gap:var(--nice-space-1,4px);overflow:hidden;padding:var(--nice-space-0-75,3px) var(--nice-space-1,4px) var(--nice-space-0-75,3px) 0;text-overflow:ellipsis;white-space:nowrap}.ModelEditor-module_treeItem__MiVWT:hover{background:var(--nice-overlay-light-4,hsla(0,0%,100%,.04))}.ModelEditor-module_treeItemActive__4ntXK{background:var(--nice-surface)!important;outline:1px solid var(--nice-color-primary-hover)}.ModelEditor-module_treeIcon__PzniU{flex-shrink:0;font-size:12px;opacity:.6;text-align:center;width:16px}.ModelEditor-module_treeIndent__ISBk-{display:inline-block;flex-shrink:0;width:16px}.ModelEditor-module_treeToggle__Ge5PW{color:var(--nice-text-muted);cursor:pointer;flex-shrink:0;font-size:8px;text-align:center;width:12px}.ModelEditor-module_treeVisibility__BjKaL{cursor:pointer;flex-shrink:0;font-size:10px;opacity:.5;padding:0 var(--nice-space-0-5,2px)}.ModelEditor-module_treeVisibility__BjKaL:hover{opacity:1}.ModelEditor-module_propRow__AONtp{align-items:center;display:flex;gap:var(--nice-space-1-5,6px);margin-bottom:var(--nice-space-0-75,3px)}.ModelEditor-module_propLabel__bwkAK{color:var(--nice-text-muted);flex-shrink:0;font-size:10px;min-width:50px}.ModelEditor-module_propInput__aFI4Q{background:var(--nice-bg-canvas);border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-sm,3px);color:var(--nice-text-primary);flex:1;font-size:11px;min-width:0;padding:var(--nice-space-0-5,2px) var(--nice-space-1,4px)}.ModelEditor-module_propInput__aFI4Q:focus{border-color:var(--nice-color-primary);outline:none}.ModelEditor-module_propVec3__2FcMf{display:flex;flex:1;gap:var(--nice-space-0-5,2px)}.ModelEditor-module_propVec3__2FcMf input{background:var(--nice-bg-canvas);border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-sm,3px);color:var(--nice-text-primary);flex:1;font-size:10px;min-width:0;padding:var(--nice-space-0-5,2px) var(--nice-space-0-75,3px);text-align:center}.ModelEditor-module_propVec3__2FcMf input:focus{border-color:var(--nice-color-primary);outline:none}.ModelEditor-module_propVec3X__lfQtN{border-left:2px solid #c44!important}.ModelEditor-module_propVec3Y__PmF5p{border-left:2px solid #4c4!important}.ModelEditor-module_propVec3Z__swB76{border-left:2px solid #48c!important}.ModelEditor-module_propColorSwatch__SMg9F{border:1px solid var(--nice-overlay-light-15,hsla(0,0%,100%,.15));border-radius:var(--nice-radius-sm,3px);cursor:pointer;flex-shrink:0;height:24px;position:relative;width:24px}.ModelEditor-module_propColorSwatch__SMg9F input{cursor:pointer;height:100%;inset:0;opacity:0;position:absolute;width:100%}.ModelEditor-module_propCheckbox__-eSHl{accent-color:var(--nice-color-primary)}.ModelEditor-module_propSelect__1YXcX{background:var(--nice-bg-canvas);border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-sm,3px);color:var(--nice-text-primary);flex:1;font-size:11px;min-width:0;padding:var(--nice-space-0-5,2px) var(--nice-space-1,4px)}.ModelEditor-module_bottomPanel__ojUaN{background:var(--nice-bg-canvas);border-top:1px solid var(--nice-border-color);display:flex;flex-direction:column;flex-shrink:0;height:200px;overflow:hidden}.ModelEditor-module_bottomPanelCollapsed__P2I6E{height:28px}.ModelEditor-module_bottomPanelHeader__z9D6b{align-items:center;border-bottom:1px solid var(--nice-border-color);display:flex;flex-shrink:0;gap:var(--nice-space-1,4px);height:28px;padding:0 var(--nice-space-2,8px)}.ModelEditor-module_bottomPanelTitle__0P32m{color:var(--nice-text-secondary);cursor:pointer;font-size:10px;letter-spacing:.5px;text-transform:uppercase}.ModelEditor-module_bottomToggle__fsUEB{color:var(--nice-text-muted);cursor:pointer;font-size:8px;margin-right:var(--nice-space-1,4px)}.ModelEditor-module_transportBar__bh6Sb{align-items:center;display:flex;gap:var(--nice-space-0-5,2px)}.ModelEditor-module_transportBtn__egXSB{background:none;border:none;border-radius:var(--nice-radius-sm,3px);color:var(--nice-text-secondary);cursor:pointer;font-size:14px;padding:var(--nice-space-0-5,2px) var(--nice-space-1-5,6px)}.ModelEditor-module_transportBtn__egXSB:hover{background:var(--nice-bg-secondary);color:var(--nice-color-white)}.ModelEditor-module_transportBtnActive__j6Y94{color:var(--nice-color-primary)!important}.ModelEditor-module_transportTime__7RzUh{color:var(--nice-text-muted);font-size:10px;font-variant-numeric:tabular-nums;margin:0 var(--nice-space-2,8px)}.ModelEditor-module_animListArea__rzc1e{display:flex;flex:1;min-height:0;overflow:hidden}.ModelEditor-module_animList__lGNt5{border-right:1px solid var(--nice-border-color);flex-shrink:0;overflow-y:auto;width:200px}.ModelEditor-module_animItem__lZGOY{align-items:center;border-left:2px solid transparent;cursor:pointer;display:flex;font-size:11px;gap:var(--nice-space-1,4px);padding:var(--nice-space-0-75,3px) var(--nice-space-2,8px)}.ModelEditor-module_animItem__lZGOY:hover{background:var(--nice-overlay-light-4,hsla(0,0%,100%,.04))}.ModelEditor-module_animItemActive__8pKLd{background:var(--nice-surface)!important;border-left-color:var(--nice-color-primary)}.ModelEditor-module_animDuration__CAwuG{color:var(--nice-text-muted);font-size:9px;margin-left:auto}.ModelEditor-module_timelineArea__WFBHa{flex:1;overflow-x:auto;overflow-y:hidden;position:relative}.ModelEditor-module_timelineRuler__jlW8F{background:var(--nice-bg-canvas);border-bottom:1px solid var(--nice-border-color);height:20px;position:relative}.ModelEditor-module_rulerTick__VhJRA{background:var(--nice-bg-secondary);height:100%;position:absolute;top:0;width:1px}.ModelEditor-module_rulerLabel__Pwl9a{color:var(--nice-text-muted);font-size:8px;position:absolute;top:2px;transform:translateX(-50%)}.ModelEditor-module_playhead__Rd4rh{background:var(--nice-color-primary);pointer-events:none;position:absolute;top:0;width:2px;z-index:3}.ModelEditor-module_playheadHandle__rIBHA{background:var(--nice-color-primary);clip-path:polygon(0 0,100% 0,50% 100%);height:8px;position:absolute;top:0;transform:translateX(-3px);width:8px}.ModelEditor-module_timelineTracks__joMHo{position:relative}.ModelEditor-module_keyframeDiamond__kffdC{background:#e8a030;cursor:pointer;height:8px;position:absolute;transform:rotate(45deg);width:8px;z-index:2}.ModelEditor-module_keyframeDiamond__kffdC:hover{background:#f0c060}.ModelEditor-module_keyframeDiamondSelected__xURk4{background:var(--nice-color-white)!important}.ModelEditor-module_statusBar__AJMzx{align-items:center;background:var(--nice-bg-canvas);border-top:1px solid var(--nice-border-color);color:var(--nice-text-muted);display:flex;flex-shrink:0;font-size:10px;gap:var(--nice-space-3,12px);height:20px;padding:var(--nice-space-0-5,2px) var(--nice-space-2,8px)}.ModelEditor-module_materialCard__1IGe7{background:var(--nice-bg-canvas);border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-sm,4px);margin-bottom:var(--nice-space-1-5,6px);padding:var(--nice-space-1-5,6px)}.ModelEditor-module_materialCardActive__VEnBX{border-color:var(--nice-color-primary)}.ModelEditor-module_materialHeader__WtTh3{align-items:center;display:flex;gap:var(--nice-space-1-5,6px);margin-bottom:var(--nice-space-1,4px)}.ModelEditor-module_materialPreview__IF7qd{border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-sm,4px);flex-shrink:0;height:32px;overflow:hidden;width:32px}.ModelEditor-module_materialPreview__IF7qd canvas{height:100%;width:100%}.ModelEditor-module_materialName__TvRhs{flex:1;font-size:11px;font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ModelEditor-module_textureSlot__PLqef{align-items:center;display:flex;gap:var(--nice-space-1-5,6px);margin-bottom:var(--nice-space-1,4px)}.ModelEditor-module_textureThumb__PdCTD{background:#0a0a15;border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-sm,3px);flex-shrink:0;height:28px;overflow:hidden;width:28px}.ModelEditor-module_textureThumb__PdCTD img{height:100%;object-fit:cover;width:100%}.ModelEditor-module_textureInfo__XOzZI{flex:1;min-width:0}.ModelEditor-module_textureName__H-2d3{font-size:10px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ModelEditor-module_textureBtn__zUt3m{background:none;border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-sm,3px);color:var(--nice-text-muted);cursor:pointer;font-size:10px;padding:var(--nice-space-px,1px) var(--nice-space-1-5,6px)}.ModelEditor-module_textureBtn__zUt3m:hover{background:var(--nice-bg-secondary);color:var(--nice-text-secondary)}.ModelEditor-module_btnPrimary__IAz0U{background:var(--nice-color-primary);border:none;border-radius:var(--nice-radius-sm,4px);color:var(--nice-color-white);cursor:pointer;font-size:11px;padding:var(--nice-space-1,4px) var(--nice-space-3,12px);white-space:nowrap}.ModelEditor-module_btnPrimary__IAz0U:hover{background:var(--nice-primary,#67d)}.ModelEditor-module_btnPrimary__IAz0U:disabled{cursor:default;opacity:.4}.ModelEditor-module_btnSecondary__nJpgi{background:var(--nice-bg-secondary);border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-sm,4px);color:var(--nice-text-muted);cursor:pointer;font-size:11px;padding:var(--nice-space-1,4px) var(--nice-space-3,12px);white-space:nowrap}.ModelEditor-module_btnSecondary__nJpgi:hover{background:#3a3a5a;color:var(--nice-text-primary)}.ModelEditor-module_btnIcon__Qq9nz{background:none;border:none;color:var(--nice-text-muted);cursor:pointer;font-size:14px;line-height:1;padding:var(--nice-space-0-5,2px)}.ModelEditor-module_btnIcon__Qq9nz:hover{color:var(--nice-text-secondary)}.ModelEditor-module_aiPanel__-U1jO{background:linear-gradient(135deg,var(--nice-bg,#1a1a3e),#1e1a2e);border:1px solid var(--nice-bg-secondary,#4a3a6a);border-radius:var(--nice-radius-md,6px);margin:var(--nice-space-1,4px) 0;padding:var(--nice-space-2,8px)}.ModelEditor-module_aiHeader__WMZF5{align-items:center;color:#b88adf;display:flex;font-size:11px;gap:var(--nice-space-1,4px);margin-bottom:var(--nice-space-1-5,6px)}.ModelEditor-module_aiInput__-23jT{background:var(--nice-bg-canvas);border:1px solid var(--nice-bg-secondary,#4a3a6a);border-radius:var(--nice-radius-sm,4px);color:var(--nice-text-primary);font-size:11px;margin-bottom:var(--nice-space-1,4px);min-height:28px;padding:var(--nice-space-1,4px) var(--nice-space-2,8px);resize:vertical;width:100%}.ModelEditor-module_aiInput__-23jT:focus{border-color:#86c;outline:none}.ModelEditor-module_aiBtnRow__F-S-Z{display:flex;gap:var(--nice-space-1,4px)}.ModelEditor-module_aiBtn__8dcrE{background:linear-gradient(135deg,#54a,#64c);border:none;border-radius:var(--nice-radius-sm,4px);color:var(--nice-color-white);cursor:pointer;font-size:10px;padding:var(--nice-space-0-75,3px) var(--nice-space-2-5,10px)}.ModelEditor-module_aiBtn__8dcrE:hover{background:linear-gradient(135deg,#65b,#75d)}.ModelEditor-module_aiBtn__8dcrE:disabled{opacity:.4}.ModelEditor-module_aiStatus__Y5g59{color:#86a;font-size:10px;margin-top:var(--nice-space-1,4px)}.ModelEditor-module_dragOver__2VGIz{outline:2px dashed var(--nice-color-primary);outline-offset:-2px}.ModelEditor-module_contextMenu__sEb9s{background:var(--nice-bg-elevated);border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-md,6px);box-shadow:0 4px 16px var(--nice-overlay-50,rgba(0,0,0,.5));min-width:180px;padding:var(--nice-space-1,4px) 0;position:fixed;z-index:999}.ModelEditor-module_contextItem__W90fc{align-items:center;color:var(--nice-text-secondary);cursor:pointer;display:flex;font-size:11px;gap:var(--nice-space-2,8px);padding:var(--nice-space-1-25,5px) var(--nice-space-3,12px)}.ModelEditor-module_contextItem__W90fc:hover{background:var(--nice-surface)}.ModelEditor-module_contextSep__QCWTX{background:var(--nice-bg-secondary);height:1px;margin:var(--nice-space-0-5,2px) 0}.ModelEditor-module_contextKey__HxGV6{color:var(--nice-text-muted);font-size:10px;margin-left:auto}.ModelEditor-module_animList__lGNt5::-webkit-scrollbar,.ModelEditor-module_leftPanel__sVsxG::-webkit-scrollbar,.ModelEditor-module_rightPanel__oJf3N::-webkit-scrollbar,.ModelEditor-module_timelineArea__WFBHa::-webkit-scrollbar{height:6px;width:6px}.ModelEditor-module_animList__lGNt5::-webkit-scrollbar-track,.ModelEditor-module_leftPanel__sVsxG::-webkit-scrollbar-track,.ModelEditor-module_rightPanel__oJf3N::-webkit-scrollbar-track,.ModelEditor-module_timelineArea__WFBHa::-webkit-scrollbar-track{background:transparent}.ModelEditor-module_animList__lGNt5::-webkit-scrollbar-thumb,.ModelEditor-module_leftPanel__sVsxG::-webkit-scrollbar-thumb,.ModelEditor-module_rightPanel__oJf3N::-webkit-scrollbar-thumb,.ModelEditor-module_timelineArea__WFBHa::-webkit-scrollbar-thumb{background:var(--nice-bg-secondary);border-radius:var(--nice-radius-sm,3px)}.ModelEditor-module_animList__lGNt5::-webkit-scrollbar-thumb:hover,.ModelEditor-module_leftPanel__sVsxG::-webkit-scrollbar-thumb:hover,.ModelEditor-module_rightPanel__oJf3N::-webkit-scrollbar-thumb:hover,.ModelEditor-module_timelineArea__WFBHa::-webkit-scrollbar-thumb:hover{background:var(--nice-bg-tertiary)}.ModelEditor-module_resizeHandle__CyDw4{background:transparent;cursor:ns-resize;height:4px;transition:background .1s}.ModelEditor-module_resizeHandle__CyDw4:hover{background:var(--nice-color-primary)}.ModelEditor-module_modeSelect__KroPg{background:var(--nice-bg,#224);border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-sm,4px);color:#b0b0d0;cursor:pointer;font-size:11px;font-weight:600;outline:none;padding:var(--nice-space-0-5,2px) var(--nice-space-2,8px)}.ModelEditor-module_modeSelect__KroPg:focus{border-color:var(--nice-color-primary)}.ModelEditor-module_modeSelect__KroPg option{background:var(--nice-bg-primary)}.ModelEditor-module_menuDropdownWrap__6dicW{position:relative}.ModelEditor-module_dropdownMenu__ixJxD{background:var(--nice-bg-elevated);border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-md,6px);box-shadow:0 6px 24px var(--nice-overlay-60,rgba(0,0,0,.6));left:0;max-height:420px;min-width:200px;overflow-y:auto;padding:var(--nice-space-1,4px) 0;position:absolute;top:100%;z-index:999}.ModelEditor-module_dropdownTitle__zzdA6{color:var(--nice-color-primary);font-size:9px;font-weight:700;letter-spacing:1px;padding:var(--nice-space-1-5,6px) var(--nice-space-3,12px) var(--nice-space-0-5,2px);text-transform:uppercase}.ModelEditor-module_dropdownItem__4dllG{align-items:center;color:var(--nice-text-secondary);cursor:pointer;display:flex;font-size:11px;gap:var(--nice-space-1-5,6px);padding:var(--nice-space-1-25,5px) var(--nice-space-4,16px);transition:background .08s}.ModelEditor-module_dropdownItem__4dllG:hover{background:var(--nice-surface);color:var(--nice-color-white)}.ModelEditor-module_dropdownSep__oFx30{background:var(--nice-bg-secondary);height:1px;margin:var(--nice-space-1,4px) 0}.ModelEditor-module_dropdownMenu__ixJxD::-webkit-scrollbar{width:6px}.ModelEditor-module_dropdownMenu__ixJxD::-webkit-scrollbar-track{background:transparent}.ModelEditor-module_dropdownMenu__ixJxD::-webkit-scrollbar-thumb{background:var(--nice-bg-tertiary);border-radius:var(--nice-radius-sm,3px)}.ModelEditor-module_viewportShadingBar__NOK0h{background:var(--nice-overlay-80,rgba(20,20,40,.8));border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-md,6px);display:flex;gap:var(--nice-space-0-5,2px);padding:var(--nice-space-0-5,2px) var(--nice-space-1,4px);position:absolute;right:8px;top:8px;z-index:10}.ModelEditor-module_shadingBtn__SAIR9{background:none;border:1px solid transparent;border-radius:var(--nice-radius-sm,4px);color:var(--nice-text-muted);cursor:pointer;font-size:12px;padding:var(--nice-space-0-75,3px) var(--nice-space-2,8px);transition:all .1s;white-space:nowrap}.ModelEditor-module_shadingBtn__SAIR9:hover{background:var(--nice-bg-secondary);color:var(--nice-text-secondary)}.ModelEditor-module_shadingBtnActive__ST5YT{background:var(--nice-bg-tertiary)!important;border-color:var(--nice-color-primary)!important;color:var(--nice-color-white)!important}.ModelEditor-module_viewportGizmoInfo__k0ily{position:absolute;right:8px;top:44px;z-index:10}.ModelEditor-module_propTabs__Vw0-u{background:var(--nice-bg-canvas);border-bottom:1px solid var(--nice-border-color);display:flex;flex-shrink:0}.ModelEditor-module_propTabBtn__s8xDE{background:none;border:none;border-bottom:2px solid transparent;color:var(--nice-text-secondary);cursor:pointer;flex:1;font-size:14px;padding:var(--nice-space-1-5,6px) var(--nice-space-1,4px);transition:all .15s}.ModelEditor-module_propTabBtn__s8xDE:hover{background:var(--nice-bg-elevated);color:var(--nice-text-muted)}.ModelEditor-module_propTabBtnActive__-woXw{background:var(--nice-bg-elevated)!important;border-bottom-color:var(--nice-color-primary)!important;color:var(--nice-color-white)!important}.ModelEditor-module_outlinerSearch__p5L46{padding:var(--nice-space-1,4px) var(--nice-space-2,8px) 0}.ModelEditor-module_outlinerSearch__p5L46 input{background:var(--nice-bg-canvas);border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-sm,4px);color:var(--nice-text-secondary);font-size:11px;padding:var(--nice-space-0-75,3px) var(--nice-space-2,8px)}.ModelEditor-module_outlinerSearch__p5L46 input:focus{border-color:var(--nice-color-primary);outline:none}.ModelEditor-module_outlinerSearch__p5L46 input::placeholder{color:var(--nice-text-muted)}.ModelViewer-module_root__6Fbj3{background:var(--nice-bg-primary,#1a1a2e);color:var(--nice-text-primary,#e0e0e0);display:flex;flex-direction:column;font-family:Segoe UI,Consolas,monospace;font-size:12px;height:100%;overflow:hidden;position:relative;user-select:none}.ModelViewer-module_toolbar__EQJRN{align-items:center;background:var(--nice-bg-canvas,#12122a);border-bottom:1px solid var(--nice-border-color,#252545);display:flex;flex-shrink:0;gap:var(--nice-space-0-5,2px);height:32px;padding:0 var(--nice-space-1-5,6px);z-index:2}.ModelViewer-module_toolBtn__f9833{align-items:center;background:none;border:none;border-radius:var(--nice-radius-sm,3px);color:var(--nice-text-secondary,#ccc);cursor:pointer;display:flex;font-size:11px;gap:var(--nice-space-1,4px);padding:var(--nice-space-1,4px) var(--nice-space-2,8px);white-space:nowrap}.ModelViewer-module_toolBtn__f9833:hover{background:var(--nice-bg-secondary,#252545);color:var(--nice-text-primary,#fff)}.ModelViewer-module_toolBtn__f9833.ModelViewer-module_active__MgURC{background:var(--nice-color-primary,#57f);color:var(--nice-text-on-primary,#fff)}.ModelViewer-module_toolBtn__f9833:disabled{cursor:default;opacity:.4}.ModelViewer-module_toolSep__5zuAK{background:var(--nice-bg-secondary,#333);height:16px;margin:0 var(--nice-space-1,4px);width:1px}.ModelViewer-module_toolLabel__PcpJC{color:var(--nice-text-secondary,#888);font-size:10px;margin:0 var(--nice-space-1,4px);white-space:nowrap}.ModelViewer-module_toolRight__VSuzD{align-items:center;display:flex;gap:var(--nice-space-0-5,2px);margin-left:auto}.ModelViewer-module_viewport__-1llx{flex:1;outline:none;overflow:hidden;position:relative}.ModelViewer-module_viewport__-1llx canvas{display:block;height:100%!important;width:100%!important}.ModelViewer-module_loadingOverlay__Ayyci{align-items:center;background:var(--nice-overlay-85,rgba(20,20,40,.85));display:flex;flex-direction:column;inset:0;justify-content:center;position:absolute;z-index:10}.ModelViewer-module_loadingBar__RDqVv{background:var(--nice-bg-tertiary,#444);border-radius:var(--nice-radius-sm,2px);height:4px;margin-top:var(--nice-space-3,12px);overflow:hidden;width:200px}.ModelViewer-module_loadingBarFill__zvIoP{background:var(--nice-color-primary,#57f);height:100%;transition:width .2s}.ModelViewer-module_loadingText__6OGeA{color:var(--nice-text-secondary,#ccc);font-size:13px;margin-bottom:var(--nice-space-2,8px)}.ModelViewer-module_errorOverlay__ASUqN{align-items:center;background:var(--nice-overlay-85,rgba(20,20,40,.85));color:var(--nice-danger,#ff6b6b);display:flex;flex-direction:column;inset:0;justify-content:center;position:absolute;z-index:10}.ModelViewer-module_sidePanel__-QFkd{background:var(--nice-bg-canvas,#12122a);border-left:1px solid var(--nice-border-color,#252545);bottom:24px;display:flex;flex-direction:column;font-size:11px;gap:var(--nice-space-3,12px);overflow-y:auto;padding:var(--nice-space-2,8px);position:absolute;right:0;top:32px;width:240px;z-index:5}.ModelViewer-module_sidePanel__-QFkd.ModelViewer-module_hidden__yoMuq{display:none}.ModelViewer-module_panelSection__bH-O3{display:flex;flex-direction:column;gap:var(--nice-space-1,4px)}.ModelViewer-module_panelTitle__xsn3e{color:var(--nice-text-secondary,#888);font-size:10px;letter-spacing:.5px;margin-bottom:var(--nice-space-1,4px);text-transform:uppercase}.ModelViewer-module_panelRow__3QxnD{align-items:center;display:flex;gap:var(--nice-space-1-5,6px)}.ModelViewer-module_panelRow__3QxnD label{color:var(--nice-text-secondary,#aaa);flex:0 0 70px;font-size:10px}.ModelViewer-module_panelRow__3QxnD span{color:var(--nice-text-primary,#e0e0e0);font-size:11px}.ModelViewer-module_animBar__qcYi5{align-items:center;background:var(--nice-bg-canvas,#12122a);border-top:1px solid var(--nice-border-color,#252545);display:flex;flex-shrink:0;gap:var(--nice-space-1,4px);height:28px;padding:0 var(--nice-space-2,8px)}.ModelViewer-module_animBar__qcYi5.ModelViewer-module_hidden__yoMuq{display:none}.ModelViewer-module_animSlider__9AQzN{appearance:none;background:var(--nice-bg-tertiary,#444);border-radius:var(--nice-radius-sm,2px);cursor:pointer;flex:1;height:4px}.ModelViewer-module_animSlider__9AQzN::-webkit-slider-thumb{appearance:none;background:var(--nice-color-primary,#57f);border-radius:var(--nice-radius-full,50%);cursor:pointer;height:10px;width:10px}.ModelViewer-module_animSelect__LhFWD{background:var(--nice-bg-secondary,#252545);border:1px solid var(--nice-border-color,#555);border-radius:var(--nice-radius-sm,3px);color:var(--nice-text-primary,#e0e0e0);font-size:10px;max-width:120px;padding:var(--nice-space-0-5,2px) var(--nice-space-1,4px)}.ModelViewer-module_statusBar__-3uuA{align-items:center;background:var(--nice-bg-canvas,#12122a);border-top:1px solid var(--nice-border-color,#252545);color:var(--nice-text-muted,#888);display:flex;flex-shrink:0;font-size:10px;gap:var(--nice-space-2,8px);height:22px;padding:0 var(--nice-space-2,8px)}.ModelViewer-module_statusRight__vI51s{display:flex;gap:var(--nice-space-3,12px);margin-left:auto}.ModelViewer-module_annotationLayer__-NzZF{inset:0;pointer-events:none;position:absolute;z-index:3}.ModelViewer-module_annotation__H6DgR{background:color-mix(in srgb,var(--nice-color-primary,#57f) 85%,transparent);border-radius:var(--nice-radius-sm,4px);color:var(--nice-text-on-primary,#fff);cursor:pointer;font-size:10px;padding:var(--nice-space-1,4px) var(--nice-space-2,8px);pointer-events:auto;position:absolute;transform:translate(-50%,-100%);white-space:nowrap}.ModelViewer-module_annotation__H6DgR:hover{background:var(--nice-color-primary,#57f)}.ModelViewer-module_dropZone__eNrPo{align-items:center;background:color-mix(in srgb,var(--nice-color-primary,#57f) 15%,transparent);border:2px dashed var(--nice-color-primary,#57f);color:var(--nice-color-primary,#57f);display:flex;font-size:16px;inset:0;justify-content:center;pointer-events:none;position:absolute;z-index:20}.UVEditor-module_uvEditor__9yahO{background:var(--nice-bg-secondary,#1e1e1e);border:1px solid var(--nice-border,#333);border-radius:var(--nice-radius-sm,4px);color:var(--nice-text,#e0e0e0);font-family:var(--nice-font-family,system-ui,sans-serif);font-size:12px;overflow:hidden}.UVEditor-module_toolbar__wPDkZ{align-items:center;background:var(--nice-bg-tertiary,#252526);border-bottom:1px solid var(--nice-border,#333);display:flex;flex-wrap:wrap;gap:var(--nice-space-2,8px);padding:var(--nice-space-1-5,6px) var(--nice-space-2,8px)}.UVEditor-module_toolGroup__hzVqv{border-right:1px solid var(--nice-border,#444);display:flex;gap:var(--nice-space-0-5,2px);padding:0 var(--nice-space-1,4px)}.UVEditor-module_toolGroup__hzVqv:last-child{border-right:none}.UVEditor-module_toolBtn__oIzVq{align-items:center;background:var(--nice-bg-secondary,#2d2d2d);border:1px solid transparent;border-radius:var(--nice-radius-sm,3px);color:var(--nice-text-secondary,#aaa);cursor:pointer;display:flex;font-size:11px;font-weight:500;height:24px;justify-content:center;min-width:28px;padding:0 var(--nice-space-1-5,6px);transition:all .15s ease}.UVEditor-module_toolBtn__oIzVq:hover:not(:disabled){background:var(--nice-bg-hover,#3c3c3c);color:var(--nice-text,#fff)}.UVEditor-module_toolBtn__oIzVq.UVEditor-module_active__gahDI{background:var(--nice-primary,#007acc);border-color:var(--nice-primary-hover,#0098ff);color:var(--nice-text-on-primary,#fff)}.UVEditor-module_toolBtn__oIzVq:disabled{cursor:not-allowed;opacity:.5}.UVEditor-module_select__cd9Xa{background:var(--nice-bg-secondary,#2d2d2d);border:1px solid var(--nice-border,#444);border-radius:var(--nice-radius-sm,3px);color:var(--nice-text,#e0e0e0);cursor:pointer;font-size:11px;height:24px;padding:0 var(--nice-space-1-5,6px)}.UVEditor-module_select__cd9Xa:focus{border-color:var(--nice-primary,#007acc);outline:none}.UVEditor-module_viewport__0S2EF{background:var(--nice-bg-secondary,#2a2a2a);cursor:crosshair;flex:1;overflow:hidden;position:relative}.UVEditor-module_canvas__L8eJJ{display:block;height:100%;width:100%}.UVEditor-module_noGeometry__J0MOa{align-items:center;color:var(--nice-text-muted,#666);display:flex;font-size:14px;inset:0;justify-content:center;pointer-events:none;position:absolute}.UVEditor-module_sidebar__zcI1d{background:var(--nice-bg-tertiary,#252526);border-left:1px solid var(--nice-border,#333);overflow-y:auto;width:200px}.UVEditor-module_panel__wRBD0{border-bottom:1px solid var(--nice-border,#333);padding:var(--nice-space-2-5,10px)}.UVEditor-module_panelTitle__5oDRo{color:var(--nice-text-muted,#888);font-size:11px;font-weight:600;letter-spacing:.5px;margin:0 0 var(--nice-space-2,8px) 0;text-transform:uppercase}.UVEditor-module_checkbox__P2anI{align-items:center;cursor:pointer;display:flex;font-size:11px;gap:var(--nice-space-1-5,6px);margin-bottom:var(--nice-space-1-5,6px)}.UVEditor-module_checkbox__P2anI input{accent-color:var(--nice-primary,#007acc);cursor:pointer;height:14px;margin:0;width:14px}.UVEditor-module_stat__j2lxJ{display:flex;font-size:11px;justify-content:space-between;padding:var(--nice-space-0-75,3px) 0}.UVEditor-module_stat__j2lxJ span:first-child{color:var(--nice-text-muted,#888)}.UVEditor-module_stat__j2lxJ span:last-child{color:var(--nice-text,#e0e0e0);font-weight:500}.UVEditor-module_rangeLabel__6OS0o{display:block;font-size:11px;margin-top:var(--nice-space-2,8px)}.UVEditor-module_rangeLabel__6OS0o input{accent-color:var(--nice-primary,#007acc);margin-top:var(--nice-space-1,4px);width:100%}.UVEditor-module_statusBar__KYYrx{background:var(--nice-bg-inset,#1a1a1a);border-top:1px solid var(--nice-border,#333);color:var(--nice-text-muted,#888);display:flex;font-size:11px;gap:var(--nice-space-4,16px);padding:var(--nice-space-1,4px) var(--nice-space-2,8px)}.UVEditor-module_statusBar__KYYrx span{white-space:nowrap}@media (max-width:768px){.UVEditor-module_sidebar__zcI1d{display:none}.UVEditor-module_toolbar__wPDkZ{overflow-x:auto}}.MaterialEditor-module_materialEditor__RjU0e{--bg-primary:var(--nice-bg,#1e1e1e);--bg-secondary:var(--nice-bg-secondary,#252526);--bg-tertiary:var(--nice-bg-secondary,#2d2d2d);--bg-hover:var(--nice-bg-secondary,#3a3a3a);--bg-active:var(--nice-bg-secondary,#4a4a4a);--text-primary:var(--nice-text-primary,#fff);--text-secondary:var(--nice-text-secondary,#ccc);--text-muted:var(--nice-text-secondary,#888);--border-color:var(--nice-bg-secondary,#3a3a3a);--border-light:var(--nice-bg-secondary,#4a4a4a);--accent-color:var(--nice-primary,#0078d4);--accent-hover:#1084d8;--error-color:var(--nice-danger,#f44336);--warning-color:var(--nice-warning,#ff9800);--success-color:var(--nice-success,#4caf50);--shadow-sm:0 1px 3px var(--nice-overlay-30,rgba(0,0,0,.3));--shadow-md:0 4px 6px var(--nice-overlay-40,rgba(0,0,0,.4));--shadow-lg:0 10px 20px var(--nice-overlay-50,rgba(0,0,0,.5));--node-shadow:0 4px 12px var(--nice-overlay-50,rgba(0,0,0,.5));--transition-fast:0.1s ease;--transition-normal:0.2s ease;--border-radius-sm:3px;--border-radius-md:6px;--border-radius-lg:10px}.MaterialEditor-module_materialEditor__RjU0e.MaterialEditor-module_light__zSnpW{--bg-primary:var(--nice-bg-secondary,#f5f5f5);--bg-secondary:var(--nice-bg,#fff);--bg-tertiary:var(--nice-border,#e0e0e0);--bg-hover:var(--nice-border,#d0d0d0);--bg-active:var(--nice-border,silver);--text-primary:var(--nice-text-primary,#1e1e1e);--text-secondary:var(--nice-text,#333);--text-muted:var(--nice-text-secondary,#666);--border-color:var(--nice-border,#d0d0d0);--border-light:var(--nice-border,#e0e0e0);--shadow-sm:0 1px 3px var(--nice-overlay-10,rgba(0,0,0,.1));--shadow-md:0 4px 6px var(--nice-overlay-15,rgba(0,0,0,.15));--shadow-lg:0 10px 20px var(--nice-overlay-20,rgba(0,0,0,.2));--node-shadow:0 4px 12px var(--nice-overlay-20,rgba(0,0,0,.2))}.MaterialEditor-module_materialEditor__RjU0e{background-color:var(--nice-bg-primary);border-radius:var(--nice-radius-lg);color:var(--nice-text-primary);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;font-size:13px;overflow:hidden;user-select:none}.MaterialEditor-module_toolbar__qqDbE{align-items:center;background-color:var(--nice-bg-secondary);border-bottom:1px solid var(--nice-border-color);display:flex;gap:var(--nice-space-1,4px);padding:var(--nice-space-1-5,6px) var(--nice-space-2-5,10px)}.MaterialEditor-module_toolbarGroup__fgE2r{align-items:center;display:flex;gap:var(--nice-space-0-5,2px)}.MaterialEditor-module_toolbarSeparator__Z9B1i{background-color:var(--nice-border-color);height:20px;margin:0 var(--nice-space-1-5,6px);width:1px}.MaterialEditor-module_toolbar__qqDbE button{align-items:center;background-color:transparent;border:none;border-radius:var(--nice-radius-sm);color:var(--nice-text-primary);cursor:pointer;display:flex;font-size:14px;height:28px;justify-content:center;padding:0;transition:background-color var(--transition-fast);width:28px}.MaterialEditor-module_toolbar__qqDbE button:active:not(:disabled),.MaterialEditor-module_toolbar__qqDbE button:hover:not(:disabled){background-color:var(--nice-hover-bg)}.MaterialEditor-module_toolbar__qqDbE button:disabled{cursor:not-allowed;opacity:.4}.MaterialEditor-module_toolbar__qqDbE button.MaterialEditor-module_active__DEZaw{background-color:var(--nice-color-accent);color:#fff}.MaterialEditor-module_palette__VNmnu{background-color:var(--nice-bg-secondary);border-right:1px solid var(--nice-border-color);display:flex;flex-direction:column;flex-shrink:0;width:220px}.MaterialEditor-module_paletteSearch__rE-c5{border-bottom:1px solid var(--nice-border-color);padding:var(--nice-space-2,8px)}.MaterialEditor-module_searchInput__H7FJt{background-color:var(--nice-bg-tertiary);border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-md);color:var(--nice-text-primary);font-size:12px;outline:none;padding:var(--nice-space-1-5,6px) var(--nice-space-2-5,10px);transition:border-color var(--transition-fast);width:100%}.MaterialEditor-module_searchInput__H7FJt:focus{border-color:var(--nice-color-accent)}.MaterialEditor-module_searchInput__H7FJt::placeholder{color:var(--nice-text-muted)}.MaterialEditor-module_paletteCategories__sbn9d{flex:1;overflow-y:auto;padding:var(--nice-space-1,4px) 0}.MaterialEditor-module_paletteCategory__LgsIy{margin-bottom:var(--nice-space-0-5,2px)}.MaterialEditor-module_categoryHeader__8M6DH{align-items:center;background-color:transparent;border:none;border-left:3px solid transparent;color:var(--nice-text-primary);cursor:pointer;display:flex;font-size:12px;font-weight:600;gap:var(--nice-space-1-5,6px);padding:var(--nice-space-2,8px) var(--nice-space-2-5,10px);text-align:left;transition:background-color var(--transition-fast);width:100%}.MaterialEditor-module_categoryHeader__8M6DH:hover{background-color:var(--nice-hover-bg)}.MaterialEditor-module_categoryIcon__coBim{color:var(--nice-text-muted);font-size:10px;width:14px}.MaterialEditor-module_categoryCount__rnYwK{background-color:var(--nice-bg-tertiary);border-radius:var(--nice-radius-lg,10px);color:var(--nice-text-muted);font-size:10px;font-weight:400;margin-left:auto;padding:var(--nice-space-0-5,2px) var(--nice-space-1-5,6px)}.MaterialEditor-module_categoryNodes__GMJz6{padding:var(--nice-space-0-5,2px) 0}.MaterialEditor-module_paletteNode__4-ncg{align-items:center;cursor:grab;display:flex;gap:var(--nice-space-2,8px);padding:var(--nice-space-1-5,6px) var(--nice-space-2-5,10px) var(--nice-space-1-5,6px) var(--nice-space-7,28px);transition:background-color var(--transition-fast)}.MaterialEditor-module_paletteNode__4-ncg:hover{background-color:var(--nice-hover-bg)}.MaterialEditor-module_paletteNode__4-ncg:active{cursor:grabbing}.MaterialEditor-module_nodeColor__ql5xb{border-radius:var(--nice-radius-sm,3px);flex-shrink:0;height:12px;width:12px}.MaterialEditor-module_nodeName__K0Rqi{color:var(--nice-text-secondary);flex:1;font-size:12px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.MaterialEditor-module_graphCanvas__guLj7{background-color:var(--nice-bg-primary);cursor:grab;flex:1;overflow:hidden;position:relative}.MaterialEditor-module_graphCanvas__guLj7:active{cursor:grabbing}.MaterialEditor-module_connectionsSvg__9SyYo{height:100%;left:0;pointer-events:none;position:absolute;top:0;width:100%}.MaterialEditor-module_connection__x9F9U{cursor:pointer;pointer-events:stroke;transition:stroke-width var(--transition-fast),stroke var(--transition-fast)}.MaterialEditor-module_connection__x9F9U:hover{stroke-width:4px}.MaterialEditor-module_pendingConnection__NCBtj{animation:MaterialEditor-module_dashAnimation__YLpH3 .5s linear infinite;pointer-events:none}@keyframes MaterialEditor-module_dashAnimation__YLpH3{to{stroke-dashoffset:-10}}.MaterialEditor-module_graphNode__pCqYA{background-color:var(--nice-bg-secondary);border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-md);box-shadow:var(--node-shadow);cursor:move;overflow:visible;position:absolute;transition:border-color var(--transition-fast),box-shadow var(--transition-fast)}.MaterialEditor-module_graphNode__pCqYA:hover{border-color:var(--nice-border-light)}.MaterialEditor-module_graphNode__pCqYA.MaterialEditor-module_selected__ozIqt{border-color:var(--nice-color-accent);box-shadow:0 0 0 2px var(--nice-color-accent),var(--node-shadow)}.MaterialEditor-module_graphNode__pCqYA.MaterialEditor-module_locked__8RRAH{cursor:not-allowed;opacity:.8}.MaterialEditor-module_nodeHeader__-PBFg{align-items:center;border-radius:var(--nice-radius-md) var(--nice-radius-md) 0 0;color:#fff;display:flex;font-size:11px;font-weight:600;justify-content:space-between;padding:var(--nice-space-1-5,6px) var(--nice-space-2-5,10px);text-shadow:0 1px 2px var(--nice-overlay-30,rgba(0,0,0,.3))}.MaterialEditor-module_nodeTitle__i2PcO{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.MaterialEditor-module_lockIcon__tPzIi{font-size:10px;margin-left:var(--nice-space-1-5,6px)}.MaterialEditor-module_nodePorts__APKPN{padding:var(--nice-space-1,4px) 0;position:relative}.MaterialEditor-module_inputPorts__7MVX4{left:0;position:absolute;top:0}.MaterialEditor-module_outputPorts__GUwXJ{position:absolute;right:0;top:0}.MaterialEditor-module_port__zc4vm{align-items:center;display:flex;font-size:10px;height:20px;position:absolute;white-space:nowrap}.MaterialEditor-module_inputPorts__7MVX4 .MaterialEditor-module_port__zc4vm{left:0;padding-left:var(--nice-space-3-5,14px)}.MaterialEditor-module_outputPorts__GUwXJ .MaterialEditor-module_port__zc4vm{justify-content:flex-end;padding-right:var(--nice-space-3-5,14px);right:0}.MaterialEditor-module_portHandle__oNh4P{border:2px solid var(--nice-bg-secondary);border-radius:var(--nice-radius-full,50%);box-sizing:border-box;cursor:crosshair;height:10px;position:absolute;transition:transform var(--transition-fast);width:10px}.MaterialEditor-module_portHandle__oNh4P:hover{transform:scale(1.3)}.MaterialEditor-module_inputHandle__6lz91{left:-5px}.MaterialEditor-module_outputHandle__8-r1i{right:-5px}.MaterialEditor-module_portHandle__oNh4P.MaterialEditor-module_connected__qo4za{border-color:transparent}.MaterialEditor-module_portLabel__T8daS{color:var(--nice-text-secondary)}.MaterialEditor-module_nodeComment__wkIoF{background-color:rgba(255,235,59,.15);border:1px solid rgba(255,235,59,.4);border-radius:var(--nice-radius-sm);bottom:-24px;color:var(--nice-warning,#ffeb3b);font-size:10px;left:0;overflow:hidden;padding:var(--nice-space-0-5,2px) var(--nice-space-1-5,6px);position:absolute;right:0;text-overflow:ellipsis;white-space:nowrap}.MaterialEditor-module_previewPanel__lqiI0{background-color:var(--nice-bg-secondary);border-left:1px solid var(--nice-border-color);display:flex;flex-direction:column;flex-shrink:0;width:220px}.MaterialEditor-module_previewHeader__vkqDk{align-items:center;border-bottom:1px solid var(--nice-border-color);display:flex;font-size:12px;font-weight:600;justify-content:space-between;padding:var(--nice-space-2-5,10px) var(--nice-space-3,12px)}.MaterialEditor-module_previewModeSelect__qbL8f{background-color:var(--nice-bg-tertiary);border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-sm);color:var(--nice-text-primary);cursor:pointer;font-size:11px;padding:var(--nice-space-0-75,3px) var(--nice-space-2,8px)}.MaterialEditor-module_previewCanvas__q91ue{align-items:center;aspect-ratio:1;background-color:var(--nice-bg-primary);border-bottom:1px solid var(--nice-border-color);display:flex;justify-content:center;position:relative}.MaterialEditor-module_previewCanvas__q91ue canvas{max-height:100%;max-width:100%}.MaterialEditor-module_previewCompiling__GVFRq{align-items:center;animation:MaterialEditor-module_pulse__6IS0P 1s ease infinite;background-color:var(--nice-overlay-60,rgba(0,0,0,.6));bottom:0;color:#fff;display:flex;font-size:12px;justify-content:center;left:0;position:absolute;right:0;top:0}@keyframes MaterialEditor-module_pulse__6IS0P{0%,to{opacity:1}50%{opacity:.6}}.MaterialEditor-module_previewErrors__6JZfZ{flex:1;overflow-y:auto;padding:var(--nice-space-2-5,10px)}.MaterialEditor-module_previewError__Rotpo{background-color:rgba(244,67,54,.15);border:1px solid rgba(244,67,54,.4);border-radius:var(--nice-radius-sm);color:var(--nice-color-error);font-size:11px;margin-bottom:var(--nice-space-1-5,6px);padding:var(--nice-space-1-5,6px) var(--nice-space-2,8px);word-break:break-word}.MaterialEditor-module_propertiesPanel__H3Lej{background-color:var(--nice-bg-secondary);border-left:1px solid var(--nice-border-color);display:flex;flex-direction:column;flex-shrink:0;width:280px}.MaterialEditor-module_propertiesHeader__ZLXL2{align-items:center;border-bottom:1px solid var(--nice-border-color);display:flex;font-size:12px;font-weight:600;padding:var(--nice-space-2-5,10px) var(--nice-space-3,12px)}.MaterialEditor-module_propertiesContent__3LWte{flex:1;overflow-y:auto;padding:var(--nice-space-3,12px)}.MaterialEditor-module_propertyGroup__3Rz-K{margin-bottom:var(--nice-space-4,16px)}.MaterialEditor-module_propertyGroupTitle__Wsswl{color:var(--nice-text-muted);font-size:11px;font-weight:600;letter-spacing:.5px;margin-bottom:var(--nice-space-2,8px);text-transform:uppercase}.MaterialEditor-module_propertyRow__eAshz{display:flex;flex-direction:column;margin-bottom:var(--nice-space-2-5,10px)}.MaterialEditor-module_propertyLabel__wwNGL{color:var(--nice-text-secondary);font-size:11px;margin-bottom:var(--nice-space-1,4px)}.MaterialEditor-module_propertyInput__oK2eE{background-color:var(--nice-bg-tertiary);border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-sm);color:var(--nice-text-primary);font-size:12px;outline:none;padding:var(--nice-space-1-5,6px) var(--nice-space-2,8px);transition:border-color var(--transition-fast)}.MaterialEditor-module_propertyInput__oK2eE:focus{border-color:var(--nice-color-accent)}.MaterialEditor-module_propertyColorPreview__1L-S5{align-items:center;display:flex;gap:var(--nice-space-2,8px)}.MaterialEditor-module_colorSwatch__rHMga{border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-sm);cursor:pointer;height:24px;width:24px}.MaterialEditor-module_propertySlider__NztWp{align-items:center;display:flex;gap:var(--nice-space-2,8px)}.MaterialEditor-module_propertySlider__NztWp input[type=range]{-webkit-appearance:none;background:var(--nice-bg-tertiary);border-radius:var(--nice-radius-sm,2px);flex:1;height:4px;outline:none}.MaterialEditor-module_propertySlider__NztWp input[type=range]::-webkit-slider-thumb{-webkit-appearance:none;background:var(--nice-color-accent);border-radius:var(--nice-radius-full,50%);cursor:pointer;height:14px;width:14px}.MaterialEditor-module_propertySlider__NztWp .MaterialEditor-module_sliderValue__HeKO-{color:var(--nice-text-secondary);font-size:11px;text-align:right;width:50px}.MaterialEditor-module_minimap__mPE-C{background-color:var(--nice-bg-secondary);border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-md);bottom:10px;box-shadow:var(--nice-shadow-md);height:100px;overflow:hidden;position:absolute;right:10px;width:150px}.MaterialEditor-module_minimapNodes__DCW6r{height:100%;position:relative;width:100%}.MaterialEditor-module_minimapNode__EoDhh{border-radius:var(--nice-radius-sm,2px);position:absolute}.MaterialEditor-module_minimapViewport__qUyIg{border:1px solid var(--nice-color-accent)}.MaterialEditor-module_minimapViewport__qUyIg,.MaterialEditor-module_selectionBox__5-dcw{background-color:var(--nice-primary-tint-10,rgba(0,120,212,.1));pointer-events:none;position:absolute}.MaterialEditor-module_selectionBox__5-dcw{border:1px dashed var(--nice-color-accent)}.MaterialEditor-module_contextMenu__jMJ2-{background-color:var(--nice-bg-secondary);border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-md);box-shadow:var(--nice-shadow-lg);min-width:160px;padding:var(--nice-space-1,4px) 0;position:fixed;z-index:1000}.MaterialEditor-module_contextMenuItem__NltnJ{align-items:center;cursor:pointer;display:flex;font-size:12px;justify-content:space-between;padding:var(--nice-space-1-5,6px) var(--nice-space-3,12px);transition:background-color var(--transition-fast)}.MaterialEditor-module_contextMenuItem__NltnJ:hover{background-color:var(--nice-hover-bg)}.MaterialEditor-module_contextMenuItem__NltnJ.MaterialEditor-module_disabled__NnXkq{color:var(--nice-text-muted);cursor:not-allowed}.MaterialEditor-module_contextMenuItem__NltnJ.MaterialEditor-module_disabled__NnXkq:hover{background-color:transparent}.MaterialEditor-module_contextMenuShortcut__2-fdl{color:var(--nice-text-muted);font-size:11px;margin-left:var(--nice-space-5,20px)}.MaterialEditor-module_contextMenuSeparator__yYjvC{background-color:var(--nice-border-color);height:1px;margin:var(--nice-space-1,4px) 0}.MaterialEditor-module_zoomControls__7PATW{align-items:center;background-color:var(--nice-bg-secondary);border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-md);bottom:10px;box-shadow:var(--nice-shadow-sm);display:flex;gap:var(--nice-space-1,4px);left:10px;padding:var(--nice-space-1,4px);position:absolute}.MaterialEditor-module_zoomControls__7PATW button{align-items:center;background-color:transparent;border:none;border-radius:var(--nice-radius-sm);color:var(--nice-text-primary);cursor:pointer;display:flex;font-size:14px;height:26px;justify-content:center;padding:0;transition:background-color var(--transition-fast);width:26px}.MaterialEditor-module_zoomControls__7PATW button:hover{background-color:var(--nice-hover-bg)}.MaterialEditor-module_zoomLevel__Rw6xW{color:var(--nice-text-secondary);font-size:11px;min-width:50px;text-align:center}.MaterialEditor-module_tooltip__lTpIH{word-wrap:break-word;background-color:var(--nice-text-primary,#333);border-radius:var(--nice-radius-sm);box-shadow:var(--nice-shadow-md);color:var(--nice-text-inverse,#fff);font-size:11px;max-width:250px;padding:var(--nice-space-1-5,6px) var(--nice-space-2-5,10px);pointer-events:none;position:fixed;white-space:pre-wrap;z-index:9999}.MaterialEditor-module_tooltip__lTpIH:before{border-color:var(--nice-border-color,#333) transparent transparent transparent;border-style:solid;border-width:5px;content:"";left:50%;position:absolute;top:100%;transform:translateX(-50%)}.MaterialEditor-module_emptyState__Kpa84{color:var(--nice-text-muted);left:50%;position:absolute;text-align:center;top:50%;transform:translate(-50%,-50%)}.MaterialEditor-module_emptyStateIcon__67zsA{font-size:48px;margin-bottom:var(--nice-space-4,16px);opacity:.5}.MaterialEditor-module_emptyStateTitle__0NQ65{color:var(--nice-text-secondary);font-size:16px;font-weight:600;margin-bottom:var(--nice-space-2,8px)}.MaterialEditor-module_emptyStateDescription__QgVz5{font-size:13px;line-height:1.5;max-width:300px}@media (max-width:900px){.MaterialEditor-module_palette__VNmnu{bottom:0;left:0;position:absolute;top:0;transform:translateX(-100%);transition:transform var(--transition-normal);z-index:100}.MaterialEditor-module_palette__VNmnu.MaterialEditor-module_open__DG5-R{transform:translateX(0)}.MaterialEditor-module_previewPanel__lqiI0{bottom:0;position:absolute;right:0;top:0;transform:translateX(100%);transition:transform var(--transition-normal);z-index:100}.MaterialEditor-module_previewPanel__lqiI0.MaterialEditor-module_open__DG5-R{transform:translateX(0)}}@media (max-width:600px){.MaterialEditor-module_toolbar__qqDbE{flex-wrap:wrap;padding:var(--nice-space-1,4px)}.MaterialEditor-module_toolbarGroup__fgE2r{flex-wrap:wrap}.MaterialEditor-module_toolbar__qqDbE button{font-size:16px;height:32px;width:32px}.MaterialEditor-module_palette__VNmnu,.MaterialEditor-module_previewPanel__lqiI0{max-width:280px;width:100%}}@keyframes MaterialEditor-module_nodeAppear__4vHEB{0%{opacity:0;transform:scale(.9)}to{opacity:1;transform:scale(1)}}.MaterialEditor-module_graphNode__pCqYA{animation:MaterialEditor-module_nodeAppear__4vHEB .2s ease}@keyframes MaterialEditor-module_connectionDraw__xvI66{0%{stroke-dashoffset:1000}to{stroke-dashoffset:0}}.MaterialEditor-module_connection__x9F9U{stroke-dasharray:1000;animation:MaterialEditor-module_connectionDraw__xvI66 .3s ease forwards}.MaterialEditor-module_materialEditor__RjU0e:focus-visible{outline:2px solid var(--nice-color-accent);outline-offset:-2px}.MaterialEditor-module_categoryHeader__8M6DH:focus-visible,.MaterialEditor-module_paletteNode__4-ncg:focus-visible,.MaterialEditor-module_toolbar__qqDbE button:focus-visible{outline:2px solid var(--nice-color-accent);outline-offset:-2px}@media (prefers-reduced-motion:reduce){.MaterialEditor-module_connection__x9F9U,.MaterialEditor-module_graphNode__pCqYA,.MaterialEditor-module_pendingConnection__NCBtj{animation:none}*,:after,:before{animation-duration:.01ms!important;transition-duration:.01ms!important}}@media print{.MaterialEditor-module_minimap__mPE-C,.MaterialEditor-module_palette__VNmnu,.MaterialEditor-module_previewPanel__lqiI0,.MaterialEditor-module_toolbar__qqDbE,.MaterialEditor-module_zoomControls__7PATW{display:none!important}.MaterialEditor-module_materialEditor__RjU0e{border:1px solid var(--nice-border,#ccc)}.MaterialEditor-module_graphCanvas__guLj7{background-color:#fff}.MaterialEditor-module_graphNode__pCqYA{border:1px solid var(--nice-border-color,#333);box-shadow:none}.MaterialEditor-module_connection__x9F9U{stroke:var(--nice-text,#333)!important}}.ParticleEditor-module_particleEditor__HiTCi{--pe-bg-primary:var(--nice-bg,#1a1a1a);--pe-bg-secondary:var(--nice-bg-secondary,#252525);--pe-bg-tertiary:var(--nice-bg-secondary,#2d2d2d);--pe-bg-hover:var(--nice-bg-secondary,#3a3a3a);--pe-bg-active:var(--nice-bg-secondary,#4a4a4a);--pe-border-color:var(--nice-border,#404040);--pe-text-primary:var(--nice-text-primary,#fff);--pe-text-secondary:var(--nice-text-muted,#b0b0b0);--pe-text-muted:#707070;--pe-accent:#4fc3f7;--pe-accent-hover:#29b6f6;--pe-success:#66bb6a;--pe-warning:var(--nice-warning,#ffa726);--pe-error:#ef5350;--pe-toolbar-height:40px;--pe-panel-width:260px;--pe-radius:4px;--pe-transition:150ms ease}.ParticleEditor-module_particleEditor__HiTCi.ParticleEditor-module_light__AiNYo{--pe-bg-primary:var(--nice-bg-secondary,#f5f5f5);--pe-bg-secondary:var(--nice-bg,#fff);--pe-bg-tertiary:var(--nice-bg-secondary,#fafafa);--pe-bg-hover:var(--nice-border,#eee);--pe-bg-active:var(--nice-border,#e0e0e0);--pe-border-color:var(--nice-border,#d0d0d0);--pe-text-primary:var(--nice-text,#212121);--pe-text-secondary:var(--nice-text-secondary,#616161);--pe-text-muted:var(--nice-text-secondary,#9e9e9e);--pe-accent:var(--nice-primary-hover,#1976d2);--pe-accent-hover:var(--nice-primary-dark,#1565c0)}.ParticleEditor-module_particleEditor__HiTCi{background-color:var(--pe-bg-primary);border-radius:var(--pe-radius);color:var(--pe-text-primary);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;font-size:13px;overflow:hidden;user-select:none}.ParticleEditor-module_toolbar__KptWe{align-items:center;background-color:var(--pe-bg-secondary);border-bottom:1px solid var(--pe-border-color);display:flex;gap:var(--nice-space-1,4px);height:var(--pe-toolbar-height);padding:0 var(--nice-space-2,8px)}.ParticleEditor-module_toolbarGroup__-N0jI{align-items:center;display:flex;gap:var(--nice-space-0-5,2px)}.ParticleEditor-module_toolbarSeparator__kIZmD{background-color:var(--pe-border-color);height:20px;margin:0 var(--nice-space-1-5,6px);width:1px}.ParticleEditor-module_toolbar__KptWe button{align-items:center;background:transparent;border:none;border-radius:var(--pe-radius);color:var(--pe-text-secondary);cursor:pointer;display:flex;font-size:14px;height:28px;justify-content:center;transition:all var(--pe-transition);width:28px}.ParticleEditor-module_toolbar__KptWe button:hover:not(:disabled){background-color:var(--pe-bg-hover);color:var(--pe-text-primary)}.ParticleEditor-module_toolbar__KptWe button:active:not(:disabled){background-color:var(--pe-bg-active)}.ParticleEditor-module_toolbar__KptWe button.ParticleEditor-module_active__81dHl{background-color:var(--pe-accent);color:#fff}.ParticleEditor-module_toolbar__KptWe button:disabled{cursor:not-allowed;opacity:.4}.ParticleEditor-module_speedSelect__vZO0v{background-color:var(--pe-bg-tertiary);border:1px solid var(--pe-border-color);border-radius:var(--pe-radius);color:var(--pe-text-primary);cursor:pointer;font-size:11px;height:24px;padding:0 var(--nice-space-1-5,6px)}.ParticleEditor-module_timeDisplay__tl1Qv{color:var(--pe-text-secondary);font-family:monospace;font-size:11px;min-width:50px;padding:0 var(--nice-space-2,8px);text-align:right}.ParticleEditor-module_systemList__Vaiea{background-color:var(--pe-bg-secondary);border-right:1px solid var(--pe-border-color);display:flex;flex-direction:column;min-width:var(--pe-panel-width);overflow:hidden;width:var(--pe-panel-width)}.ParticleEditor-module_systemListHeader__I9W61{align-items:center;border-bottom:1px solid var(--pe-border-color);color:var(--pe-text-secondary);display:flex;font-size:12px;font-weight:600;justify-content:space-between;letter-spacing:.5px;padding:var(--nice-space-2-5,10px) var(--nice-space-3,12px);text-transform:uppercase}.ParticleEditor-module_systemListActions__C289h{display:flex;gap:var(--nice-space-1,4px)}.ParticleEditor-module_systemListActions__C289h button{align-items:center;background:transparent;border:none;border-radius:var(--pe-radius);color:var(--pe-text-secondary);cursor:pointer;display:flex;font-size:12px;height:22px;justify-content:center;width:22px}.ParticleEditor-module_systemListActions__C289h button:hover{background-color:var(--pe-bg-hover);color:var(--pe-text-primary)}.ParticleEditor-module_presetMenu__FXV-m{background-color:var(--pe-bg-tertiary);border-bottom:1px solid var(--pe-border-color);display:flex;flex-wrap:wrap;gap:var(--nice-space-1,4px);padding:var(--nice-space-1-5,6px)}.ParticleEditor-module_presetItem__zt9wm{background-color:var(--pe-bg-secondary);border:1px solid var(--pe-border-color);border-radius:var(--pe-radius);color:var(--pe-text-secondary);cursor:pointer;font-size:11px;padding:var(--nice-space-1,4px) var(--nice-space-2-5,10px);transition:all var(--pe-transition)}.ParticleEditor-module_presetItem__zt9wm:hover{background-color:var(--pe-accent);border-color:var(--pe-accent);color:#fff}.ParticleEditor-module_systemItems__a4eQN{flex:1;overflow-y:auto;padding:var(--nice-space-1-5,6px)}.ParticleEditor-module_systemItem__y-cTZ{align-items:center;border-radius:var(--pe-radius);cursor:pointer;display:flex;justify-content:space-between;padding:var(--nice-space-2,8px) var(--nice-space-2-5,10px);transition:all var(--pe-transition)}.ParticleEditor-module_systemItem__y-cTZ:hover{background-color:var(--pe-bg-hover)}.ParticleEditor-module_systemItem__y-cTZ.ParticleEditor-module_selected__wzmRZ{background-color:var(--pe-accent);color:#fff}.ParticleEditor-module_systemItem__y-cTZ.ParticleEditor-module_selected__wzmRZ .ParticleEditor-module_systemItemActions__Dc1Bw button{color:var(--nice-overlay-light-70,hsla(0,0%,100%,.7))}.ParticleEditor-module_systemItem__y-cTZ.ParticleEditor-module_selected__wzmRZ .ParticleEditor-module_systemItemActions__Dc1Bw button:hover{color:#fff}.ParticleEditor-module_systemName__-EAlQ{flex:1;font-size:12px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ParticleEditor-module_systemItemActions__Dc1Bw{display:flex;gap:var(--nice-space-0-5,2px);opacity:0;transition:opacity var(--pe-transition)}.ParticleEditor-module_systemItem__y-cTZ:hover .ParticleEditor-module_systemItemActions__Dc1Bw{opacity:1}.ParticleEditor-module_systemItemActions__Dc1Bw button{align-items:center;background:transparent;border:none;color:var(--pe-text-muted);cursor:pointer;display:flex;font-size:11px;height:20px;justify-content:center;width:20px}.ParticleEditor-module_systemItemActions__Dc1Bw button:hover:not(:disabled){color:var(--pe-text-primary)}.ParticleEditor-module_systemItemActions__Dc1Bw button:disabled{cursor:not-allowed;opacity:.3}.ParticleEditor-module_renameInput__jUWw2{background-color:var(--pe-bg-primary);border:1px solid var(--pe-accent);border-radius:var(--pe-radius);color:var(--pe-text-primary);font-size:12px;outline:none;padding:var(--nice-space-0-5,2px) var(--nice-space-1-5,6px);width:100%}.ParticleEditor-module_inspector__qP8Gq{background-color:var(--pe-bg-secondary);border-left:1px solid var(--pe-border-color);display:flex;flex-direction:column;min-width:280px;overflow:hidden;width:320px}.ParticleEditor-module_inspectorHeader__l6Uxn{border-bottom:1px solid var(--pe-border-color);font-size:13px;font-weight:600;overflow:hidden;padding:var(--nice-space-2-5,10px) var(--nice-space-3,12px);text-overflow:ellipsis;white-space:nowrap}.ParticleEditor-module_inspectorModules__pTVRa{flex:1;overflow-y:auto}.ParticleEditor-module_emptyInspector__JYoth{align-items:center;color:var(--pe-text-muted);display:flex;font-style:italic;height:100%;justify-content:center}.ParticleEditor-module_moduleSection__dQhZv{border-bottom:1px solid var(--pe-border-color)}.ParticleEditor-module_moduleHeader__u-Jjw{align-items:center;cursor:pointer;display:flex;gap:var(--nice-space-1-5,6px);padding:var(--nice-space-2,8px) var(--nice-space-3,12px);transition:background-color var(--pe-transition)}.ParticleEditor-module_moduleHeader__u-Jjw:hover{background-color:var(--pe-bg-hover)}.ParticleEditor-module_moduleHeader__u-Jjw.ParticleEditor-module_selected__wzmRZ{background-color:var(--pe-bg-tertiary)}.ParticleEditor-module_moduleIcon__iVDB-{color:var(--pe-text-muted);font-size:10px;width:12px}.ParticleEditor-module_moduleCheckbox__0B4Md{accent-color:var(--pe-accent);cursor:pointer;height:14px;margin:0;width:14px}.ParticleEditor-module_moduleName__m8AJX{flex:1;font-size:12px;font-weight:500}.ParticleEditor-module_moduleContent__pE2Ux{background-color:var(--pe-bg-tertiary);border-top:1px solid var(--pe-border-color);padding:var(--nice-space-2,8px) var(--nice-space-3,12px)}.ParticleEditor-module_moduleNotImplemented__NZDCG{color:var(--pe-text-muted);font-size:11px;font-style:italic;padding:var(--nice-space-3,12px);text-align:center}.ParticleEditor-module_propertyRow__TzuYo{align-items:center;display:flex;gap:var(--nice-space-2,8px);margin-bottom:var(--nice-space-2,8px)}.ParticleEditor-module_propertyRow__TzuYo:last-child{margin-bottom:0}.ParticleEditor-module_propertyRow__TzuYo>label{color:var(--pe-text-secondary);flex:0 0 100px;font-size:11px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ParticleEditor-module_numberInput__cKItO{background-color:var(--pe-bg-primary);border:1px solid var(--pe-border-color);border-radius:var(--pe-radius);color:var(--pe-text-primary);flex:1;font-family:monospace;font-size:11px;height:24px;min-width:50px;padding:0 var(--nice-space-1-5,6px)}.ParticleEditor-module_numberInput__cKItO:focus{border-color:var(--pe-accent);outline:none}.ParticleEditor-module_selectInput__RhZly{background-color:var(--pe-bg-primary);border:1px solid var(--pe-border-color);border-radius:var(--pe-radius);color:var(--pe-text-primary);cursor:pointer;flex:1;font-size:11px;height:24px;padding:0 var(--nice-space-1-5,6px)}.ParticleEditor-module_selectInput__RhZly:focus{border-color:var(--pe-accent);outline:none}.ParticleEditor-module_toggleInput__seU4y{accent-color:var(--pe-accent);cursor:pointer;height:16px;width:16px}.ParticleEditor-module_distributionInput__M5ciH{align-items:center;display:flex;flex:1;gap:var(--nice-space-1,4px)}.ParticleEditor-module_distributionType__NTuwm{background-color:var(--pe-bg-primary);border:1px solid var(--pe-border-color);border-radius:var(--pe-radius);color:var(--pe-text-primary);cursor:pointer;font-size:11px;height:24px;padding:0 var(--nice-space-1,4px);width:80px}.ParticleEditor-module_addButton__nSODD{background-color:var(--pe-accent);border:none;border-radius:var(--pe-radius);color:#fff;cursor:pointer;font-size:11px;padding:var(--nice-space-1,4px) var(--nice-space-3,12px);transition:background-color var(--pe-transition)}.ParticleEditor-module_addButton__nSODD:hover{background-color:var(--pe-accent-hover)}.ParticleEditor-module_previewPanel__sCCsm{align-items:center;background-color:var(--pe-bg-primary);display:flex;flex:1;justify-content:center;min-width:200px}.ParticleEditor-module_previewCanvas__b8PcH{background-color:var(--nice-bg,#1a1a1a);border-radius:var(--pe-radius)}.ParticleEditor-module_particleEditor__HiTCi ::-webkit-scrollbar{height:8px;width:8px}.ParticleEditor-module_particleEditor__HiTCi ::-webkit-scrollbar-track{background:var(--pe-bg-tertiary)}.ParticleEditor-module_particleEditor__HiTCi ::-webkit-scrollbar-thumb{background:var(--pe-border-color);border-radius:var(--nice-radius-sm,4px)}.ParticleEditor-module_particleEditor__HiTCi ::-webkit-scrollbar-thumb:hover{background:var(--pe-text-muted)}@media (max-width:900px){.ParticleEditor-module_systemList__Vaiea{min-width:200px;width:200px}.ParticleEditor-module_inspector__qP8Gq{min-width:220px;width:260px}.ParticleEditor-module_propertyRow__TzuYo>label{flex:0 0 80px}}@media (max-width:700px){.ParticleEditor-module_systemList__Vaiea{border-bottom:1px solid var(--pe-border-color);border-right:none;max-height:150px;min-width:unset;width:100%}.ParticleEditor-module_inspector__qP8Gq{border-left:none;border-top:1px solid var(--pe-border-color);min-width:unset;width:100%}}
|
|
1
|
+
.ModelEditor-module_root__Aiqom{background:var(--nice-bg-primary);color:var(--nice-text-primary);display:flex;flex-direction:column;font-family:Segoe UI,Consolas,monospace;font-size:12px;height:100%;overflow:hidden;user-select:none}.ModelEditor-module_menuBar__5P6Wi{align-items:center;background:var(--nice-bg-canvas);border-bottom:1px solid var(--nice-border-color);display:flex;flex-shrink:0;gap:0;height:28px;padding:0 var(--nice-space-1,4px)}.ModelEditor-module_menuBtn__f1u-N{background:none;border:none;border-radius:var(--nice-radius-sm,3px);color:var(--nice-text-secondary);cursor:pointer;font-size:11px;padding:var(--nice-space-1,4px) var(--nice-space-2-5,10px);white-space:nowrap}.ModelEditor-module_menuBtn__f1u-N:hover{background:var(--nice-bg-secondary);color:var(--nice-color-white)}.ModelEditor-module_menuBtn__f1u-N:disabled{cursor:default;opacity:.4}.ModelEditor-module_menuSep__Jilgu{background:var(--nice-bg-secondary);height:16px;margin:0 var(--nice-space-1,4px);width:1px}.ModelEditor-module_menuLabel__gn6yQ{color:var(--nice-text-secondary);font-size:10px;margin:0 var(--nice-space-1-5,6px);white-space:nowrap}.ModelEditor-module_menuRight__YQWk7{align-items:center;display:flex;gap:var(--nice-space-1,4px);margin-left:auto}.ModelEditor-module_leftPanel__sVsxG{background:var(--nice-bg-primary);overflow:hidden;width:240px}.ModelEditor-module_leftPanel__sVsxG,.ModelEditor-module_toolbar__l8uKC{border-right:1px solid var(--nice-border-color);display:flex;flex-direction:column;flex-shrink:0}.ModelEditor-module_toolbar__l8uKC{background:var(--nice-bg-elevated);gap:var(--nice-space-0-5,2px);padding:var(--nice-space-1,4px) var(--nice-space-0-5,2px);width:38px}.ModelEditor-module_toolBtn__8DzAf{align-items:center;background:none;border:1px solid transparent;border-radius:var(--nice-radius-sm,4px);color:var(--nice-text-muted);cursor:pointer;display:flex;font-size:16px;height:32px;justify-content:center;transition:all .1s;width:32px}.ModelEditor-module_toolBtn__8DzAf:hover{background:var(--nice-bg-secondary);color:var(--nice-text-secondary)}.ModelEditor-module_toolBtnActive__ek-nN{background:var(--nice-bg-tertiary)!important;border-color:var(--nice-color-primary)!important;color:var(--nice-color-white)!important}.ModelEditor-module_toolSep__5I72j{background:var(--nice-bg-secondary);height:1px;margin:var(--nice-space-1,4px) var(--nice-space-0-5,2px)}.ModelEditor-module_viewportContainer__O-e-6{background:var(--nice-bg-inset);flex:1;height:100%;min-height:0;overflow:hidden;position:relative}.ModelEditor-module_viewportContainer__O-e-6 canvas{display:block;height:100%;width:100%}.ModelEditor-module_viewportOverlay__LXDnT{display:flex;gap:var(--nice-space-1,4px);left:8px;position:absolute;top:8px;z-index:10}.ModelEditor-module_viewportBadge__-5C9w{background:var(--nice-overlay-80,rgba(20,20,40,.8));border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-sm,4px);color:var(--nice-text-muted);font-size:10px;padding:var(--nice-space-0-5,2px) var(--nice-space-2,8px)}.ModelEditor-module_viewportDropZone__PBrTo{align-items:center;background:rgba(85,102,204,.15);border:2px dashed var(--nice-color-primary);display:flex;inset:0;justify-content:center;pointer-events:none;position:absolute;z-index:20}.ModelEditor-module_viewportDropZone__PBrTo span{background:rgba(20,20,40,.9);border-radius:var(--nice-radius-lg,8px);color:var(--nice-text-muted,#aab);font-size:14px;padding:var(--nice-space-3,12px) var(--nice-space-6,24px)}.ModelEditor-module_rightPanel__oJf3N{background:var(--nice-bg-primary);border-left:1px solid var(--nice-border-color);display:flex;flex-direction:column;flex-shrink:0;overflow-y:auto;width:280px}.ModelEditor-module_panelSection__yb-jc{border-bottom:1px solid var(--nice-border-color);padding:var(--nice-space-1-5,6px) var(--nice-space-2,8px)}.ModelEditor-module_panelTitle__rp8tH{align-items:center;color:var(--nice-text-secondary);cursor:pointer;display:flex;font-size:10px;justify-content:space-between;letter-spacing:.5px;margin-bottom:var(--nice-space-1,4px);text-transform:uppercase}.ModelEditor-module_panelTitle__rp8tH button{background:none;border:none;color:var(--nice-text-secondary);cursor:pointer;font-size:14px;line-height:1;padding:0 var(--nice-space-0-5,2px)}.ModelEditor-module_panelTitle__rp8tH button:hover{color:var(--nice-text-muted)}.ModelEditor-module_panelCollapsed__xBsUg .ModelEditor-module_panelContent__IMNnR{display:none}.ModelEditor-module_panelContent__IMNnR{padding-top:var(--nice-space-1,4px)}.ModelEditor-module_treeItem__MiVWT{align-items:center;border-radius:var(--nice-radius-sm,3px);cursor:pointer;display:flex;font-size:11px;gap:var(--nice-space-1,4px);overflow:hidden;padding:var(--nice-space-0-75,3px) var(--nice-space-1,4px) var(--nice-space-0-75,3px) 0;text-overflow:ellipsis;white-space:nowrap}.ModelEditor-module_treeItem__MiVWT:hover{background:var(--nice-overlay-light-4,hsla(0,0%,100%,.04))}.ModelEditor-module_treeItemActive__4ntXK{background:var(--nice-surface)!important;outline:1px solid var(--nice-color-primary-hover)}.ModelEditor-module_treeIcon__PzniU{flex-shrink:0;font-size:12px;opacity:.6;text-align:center;width:16px}.ModelEditor-module_treeIndent__ISBk-{display:inline-block;flex-shrink:0;width:16px}.ModelEditor-module_treeToggle__Ge5PW{color:var(--nice-text-muted);cursor:pointer;flex-shrink:0;font-size:8px;text-align:center;width:12px}.ModelEditor-module_treeVisibility__BjKaL{cursor:pointer;flex-shrink:0;font-size:10px;opacity:.5;padding:0 var(--nice-space-0-5,2px)}.ModelEditor-module_treeVisibility__BjKaL:hover{opacity:1}.ModelEditor-module_propRow__AONtp{align-items:center;display:flex;gap:var(--nice-space-1-5,6px);margin-bottom:var(--nice-space-0-75,3px)}.ModelEditor-module_propLabel__bwkAK{color:var(--nice-text-muted);flex-shrink:0;font-size:10px;min-width:50px}.ModelEditor-module_propInput__aFI4Q{background:var(--nice-bg-canvas);border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-sm,3px);color:var(--nice-text-primary);flex:1;font-size:11px;min-width:0;padding:var(--nice-space-0-5,2px) var(--nice-space-1,4px)}.ModelEditor-module_propInput__aFI4Q:focus{border-color:var(--nice-color-primary);outline:none}.ModelEditor-module_propVec3__2FcMf{display:flex;flex:1;gap:var(--nice-space-0-5,2px)}.ModelEditor-module_propVec3__2FcMf input{background:var(--nice-bg-canvas);border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-sm,3px);color:var(--nice-text-primary);flex:1;font-size:10px;min-width:0;padding:var(--nice-space-0-5,2px) var(--nice-space-0-75,3px);text-align:center}.ModelEditor-module_propVec3__2FcMf input:focus{border-color:var(--nice-color-primary);outline:none}.ModelEditor-module_propVec3X__lfQtN{border-left:2px solid #c44!important}.ModelEditor-module_propVec3Y__PmF5p{border-left:2px solid #4c4!important}.ModelEditor-module_propVec3Z__swB76{border-left:2px solid #48c!important}.ModelEditor-module_propColorSwatch__SMg9F{border:1px solid var(--nice-overlay-light-15,hsla(0,0%,100%,.15));border-radius:var(--nice-radius-sm,3px);cursor:pointer;flex-shrink:0;height:24px;position:relative;width:24px}.ModelEditor-module_propColorSwatch__SMg9F input{cursor:pointer;height:100%;inset:0;opacity:0;position:absolute;width:100%}.ModelEditor-module_propCheckbox__-eSHl{accent-color:var(--nice-color-primary)}.ModelEditor-module_propSelect__1YXcX{background:var(--nice-bg-canvas);border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-sm,3px);color:var(--nice-text-primary);flex:1;font-size:11px;min-width:0;padding:var(--nice-space-0-5,2px) var(--nice-space-1,4px)}.ModelEditor-module_bottomPanel__ojUaN{background:var(--nice-bg-canvas);border-top:1px solid var(--nice-border-color);display:flex;flex-direction:column;flex-shrink:0;height:200px;overflow:hidden}.ModelEditor-module_bottomPanelCollapsed__P2I6E{height:28px}.ModelEditor-module_bottomPanelHeader__z9D6b{align-items:center;border-bottom:1px solid var(--nice-border-color);display:flex;flex-shrink:0;gap:var(--nice-space-1,4px);height:28px;padding:0 var(--nice-space-2,8px)}.ModelEditor-module_bottomPanelTitle__0P32m{color:var(--nice-text-secondary);cursor:pointer;font-size:10px;letter-spacing:.5px;text-transform:uppercase}.ModelEditor-module_bottomToggle__fsUEB{color:var(--nice-text-muted);cursor:pointer;font-size:8px;margin-right:var(--nice-space-1,4px)}.ModelEditor-module_transportBar__bh6Sb{align-items:center;display:flex;gap:var(--nice-space-0-5,2px)}.ModelEditor-module_transportBtn__egXSB{background:none;border:none;border-radius:var(--nice-radius-sm,3px);color:var(--nice-text-secondary);cursor:pointer;font-size:14px;padding:var(--nice-space-0-5,2px) var(--nice-space-1-5,6px)}.ModelEditor-module_transportBtn__egXSB:hover{background:var(--nice-bg-secondary);color:var(--nice-color-white)}.ModelEditor-module_transportBtnActive__j6Y94{color:var(--nice-color-primary)!important}.ModelEditor-module_transportTime__7RzUh{color:var(--nice-text-muted);font-size:10px;font-variant-numeric:tabular-nums;margin:0 var(--nice-space-2,8px)}.ModelEditor-module_animListArea__rzc1e{display:flex;flex:1;min-height:0;overflow:hidden}.ModelEditor-module_animList__lGNt5{border-right:1px solid var(--nice-border-color);flex-shrink:0;overflow-y:auto;width:200px}.ModelEditor-module_animItem__lZGOY{align-items:center;border-left:2px solid transparent;cursor:pointer;display:flex;font-size:11px;gap:var(--nice-space-1,4px);padding:var(--nice-space-0-75,3px) var(--nice-space-2,8px)}.ModelEditor-module_animItem__lZGOY:hover{background:var(--nice-overlay-light-4,hsla(0,0%,100%,.04))}.ModelEditor-module_animItemActive__8pKLd{background:var(--nice-surface)!important;border-left-color:var(--nice-color-primary)}.ModelEditor-module_animDuration__CAwuG{color:var(--nice-text-muted);font-size:9px;margin-left:auto}.ModelEditor-module_timelineArea__WFBHa{flex:1;overflow-x:auto;overflow-y:hidden;position:relative}.ModelEditor-module_timelineRuler__jlW8F{background:var(--nice-bg-canvas);border-bottom:1px solid var(--nice-border-color);height:20px;position:relative}.ModelEditor-module_rulerTick__VhJRA{background:var(--nice-bg-secondary);height:100%;position:absolute;top:0;width:1px}.ModelEditor-module_rulerLabel__Pwl9a{color:var(--nice-text-muted);font-size:8px;position:absolute;top:2px;transform:translateX(-50%)}.ModelEditor-module_playhead__Rd4rh{background:var(--nice-color-primary);pointer-events:none;position:absolute;top:0;width:2px;z-index:3}.ModelEditor-module_playheadHandle__rIBHA{background:var(--nice-color-primary);clip-path:polygon(0 0,100% 0,50% 100%);height:8px;position:absolute;top:0;transform:translateX(-3px);width:8px}.ModelEditor-module_timelineTracks__joMHo{position:relative}.ModelEditor-module_keyframeDiamond__kffdC{background:#e8a030;cursor:pointer;height:8px;position:absolute;transform:rotate(45deg);width:8px;z-index:2}.ModelEditor-module_keyframeDiamond__kffdC:hover{background:#f0c060}.ModelEditor-module_keyframeDiamondSelected__xURk4{background:var(--nice-color-white)!important}.ModelEditor-module_statusBar__AJMzx{align-items:center;background:var(--nice-bg-canvas);border-top:1px solid var(--nice-border-color);color:var(--nice-text-muted);display:flex;flex-shrink:0;font-size:10px;gap:var(--nice-space-3,12px);height:20px;padding:var(--nice-space-0-5,2px) var(--nice-space-2,8px)}.ModelEditor-module_materialCard__1IGe7{background:var(--nice-bg-canvas);border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-sm,4px);margin-bottom:var(--nice-space-1-5,6px);padding:var(--nice-space-1-5,6px)}.ModelEditor-module_materialCardActive__VEnBX{border-color:var(--nice-color-primary)}.ModelEditor-module_materialHeader__WtTh3{align-items:center;display:flex;gap:var(--nice-space-1-5,6px);margin-bottom:var(--nice-space-1,4px)}.ModelEditor-module_materialPreview__IF7qd{border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-sm,4px);flex-shrink:0;height:32px;overflow:hidden;width:32px}.ModelEditor-module_materialPreview__IF7qd canvas{height:100%;width:100%}.ModelEditor-module_materialName__TvRhs{flex:1;font-size:11px;font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ModelEditor-module_textureSlot__PLqef{align-items:center;display:flex;gap:var(--nice-space-1-5,6px);margin-bottom:var(--nice-space-1,4px)}.ModelEditor-module_textureThumb__PdCTD{background:#0a0a15;border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-sm,3px);flex-shrink:0;height:28px;overflow:hidden;width:28px}.ModelEditor-module_textureThumb__PdCTD img{height:100%;object-fit:cover;width:100%}.ModelEditor-module_textureInfo__XOzZI{flex:1;min-width:0}.ModelEditor-module_textureName__H-2d3{font-size:10px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ModelEditor-module_textureBtn__zUt3m{background:none;border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-sm,3px);color:var(--nice-text-muted);cursor:pointer;font-size:10px;padding:var(--nice-space-px,1px) var(--nice-space-1-5,6px)}.ModelEditor-module_textureBtn__zUt3m:hover{background:var(--nice-bg-secondary);color:var(--nice-text-secondary)}.ModelEditor-module_btnPrimary__IAz0U{background:var(--nice-color-primary);border:none;border-radius:var(--nice-radius-sm,4px);color:var(--nice-color-white);cursor:pointer;font-size:11px;padding:var(--nice-space-1,4px) var(--nice-space-3,12px);white-space:nowrap}.ModelEditor-module_btnPrimary__IAz0U:hover{background:var(--nice-primary,#67d)}.ModelEditor-module_btnPrimary__IAz0U:disabled{cursor:default;opacity:.4}.ModelEditor-module_btnSecondary__nJpgi{background:var(--nice-bg-secondary);border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-sm,4px);color:var(--nice-text-muted);cursor:pointer;font-size:11px;padding:var(--nice-space-1,4px) var(--nice-space-3,12px);white-space:nowrap}.ModelEditor-module_btnSecondary__nJpgi:hover{background:#3a3a5a;color:var(--nice-text-primary)}.ModelEditor-module_btnIcon__Qq9nz{background:none;border:none;color:var(--nice-text-muted);cursor:pointer;font-size:14px;line-height:1;padding:var(--nice-space-0-5,2px)}.ModelEditor-module_btnIcon__Qq9nz:hover{color:var(--nice-text-secondary)}.ModelEditor-module_aiPanel__-U1jO{background:linear-gradient(135deg,var(--nice-bg,#1a1a3e),#1e1a2e);border:1px solid var(--nice-bg-secondary,#4a3a6a);border-radius:var(--nice-radius-md,6px);margin:var(--nice-space-1,4px) 0;padding:var(--nice-space-2,8px)}.ModelEditor-module_aiHeader__WMZF5{align-items:center;color:#b88adf;display:flex;font-size:11px;gap:var(--nice-space-1,4px);margin-bottom:var(--nice-space-1-5,6px)}.ModelEditor-module_aiInput__-23jT{background:var(--nice-bg-canvas);border:1px solid var(--nice-bg-secondary,#4a3a6a);border-radius:var(--nice-radius-sm,4px);color:var(--nice-text-primary);font-size:11px;margin-bottom:var(--nice-space-1,4px);min-height:28px;padding:var(--nice-space-1,4px) var(--nice-space-2,8px);resize:vertical;width:100%}.ModelEditor-module_aiInput__-23jT:focus{border-color:#86c;outline:none}.ModelEditor-module_aiBtnRow__F-S-Z{display:flex;gap:var(--nice-space-1,4px)}.ModelEditor-module_aiBtn__8dcrE{background:linear-gradient(135deg,#54a,#64c);border:none;border-radius:var(--nice-radius-sm,4px);color:var(--nice-color-white);cursor:pointer;font-size:10px;padding:var(--nice-space-0-75,3px) var(--nice-space-2-5,10px)}.ModelEditor-module_aiBtn__8dcrE:hover{background:linear-gradient(135deg,#65b,#75d)}.ModelEditor-module_aiBtn__8dcrE:disabled{opacity:.4}.ModelEditor-module_aiStatus__Y5g59{color:#86a;font-size:10px;margin-top:var(--nice-space-1,4px)}.ModelEditor-module_dragOver__2VGIz{outline:2px dashed var(--nice-color-primary);outline-offset:-2px}.ModelEditor-module_contextMenu__sEb9s{background:var(--nice-bg-elevated);border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-md,6px);box-shadow:0 4px 16px var(--nice-overlay-50,rgba(0,0,0,.5));min-width:180px;padding:var(--nice-space-1,4px) 0;position:fixed;z-index:999}.ModelEditor-module_contextItem__W90fc{align-items:center;color:var(--nice-text-secondary);cursor:pointer;display:flex;font-size:11px;gap:var(--nice-space-2,8px);padding:var(--nice-space-1-25,5px) var(--nice-space-3,12px)}.ModelEditor-module_contextItem__W90fc:hover{background:var(--nice-surface)}.ModelEditor-module_contextSep__QCWTX{background:var(--nice-bg-secondary);height:1px;margin:var(--nice-space-0-5,2px) 0}.ModelEditor-module_contextKey__HxGV6{color:var(--nice-text-muted);font-size:10px;margin-left:auto}.ModelEditor-module_animList__lGNt5::-webkit-scrollbar,.ModelEditor-module_leftPanel__sVsxG::-webkit-scrollbar,.ModelEditor-module_rightPanel__oJf3N::-webkit-scrollbar,.ModelEditor-module_timelineArea__WFBHa::-webkit-scrollbar{height:6px;width:6px}.ModelEditor-module_animList__lGNt5::-webkit-scrollbar-track,.ModelEditor-module_leftPanel__sVsxG::-webkit-scrollbar-track,.ModelEditor-module_rightPanel__oJf3N::-webkit-scrollbar-track,.ModelEditor-module_timelineArea__WFBHa::-webkit-scrollbar-track{background:transparent}.ModelEditor-module_animList__lGNt5::-webkit-scrollbar-thumb,.ModelEditor-module_leftPanel__sVsxG::-webkit-scrollbar-thumb,.ModelEditor-module_rightPanel__oJf3N::-webkit-scrollbar-thumb,.ModelEditor-module_timelineArea__WFBHa::-webkit-scrollbar-thumb{background:var(--nice-bg-secondary);border-radius:var(--nice-radius-sm,3px)}.ModelEditor-module_animList__lGNt5::-webkit-scrollbar-thumb:hover,.ModelEditor-module_leftPanel__sVsxG::-webkit-scrollbar-thumb:hover,.ModelEditor-module_rightPanel__oJf3N::-webkit-scrollbar-thumb:hover,.ModelEditor-module_timelineArea__WFBHa::-webkit-scrollbar-thumb:hover{background:var(--nice-bg-tertiary)}.ModelEditor-module_resizeHandle__CyDw4{background:transparent;cursor:ns-resize;height:4px;transition:background .1s}.ModelEditor-module_resizeHandle__CyDw4:hover{background:var(--nice-color-primary)}.ModelEditor-module_modeSelect__KroPg{background:var(--nice-bg,#224);border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-sm,4px);color:#b0b0d0;cursor:pointer;font-size:11px;font-weight:600;outline:none;padding:var(--nice-space-0-5,2px) var(--nice-space-2,8px)}.ModelEditor-module_modeSelect__KroPg:focus{border-color:var(--nice-color-primary)}.ModelEditor-module_modeSelect__KroPg option{background:var(--nice-bg-primary)}.ModelEditor-module_menuDropdownWrap__6dicW{position:relative}.ModelEditor-module_dropdownMenu__ixJxD{background:var(--nice-bg-elevated);border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-md,6px);box-shadow:0 6px 24px var(--nice-overlay-60,rgba(0,0,0,.6));left:0;max-height:420px;min-width:200px;overflow-y:auto;padding:var(--nice-space-1,4px) 0;position:absolute;top:100%;z-index:999}.ModelEditor-module_dropdownTitle__zzdA6{color:var(--nice-color-primary);font-size:9px;font-weight:700;letter-spacing:1px;padding:var(--nice-space-1-5,6px) var(--nice-space-3,12px) var(--nice-space-0-5,2px);text-transform:uppercase}.ModelEditor-module_dropdownItem__4dllG{align-items:center;color:var(--nice-text-secondary);cursor:pointer;display:flex;font-size:11px;gap:var(--nice-space-1-5,6px);padding:var(--nice-space-1-25,5px) var(--nice-space-4,16px);transition:background .08s}.ModelEditor-module_dropdownItem__4dllG:hover{background:var(--nice-surface);color:var(--nice-color-white)}.ModelEditor-module_dropdownSep__oFx30{background:var(--nice-bg-secondary);height:1px;margin:var(--nice-space-1,4px) 0}.ModelEditor-module_dropdownMenu__ixJxD::-webkit-scrollbar{width:6px}.ModelEditor-module_dropdownMenu__ixJxD::-webkit-scrollbar-track{background:transparent}.ModelEditor-module_dropdownMenu__ixJxD::-webkit-scrollbar-thumb{background:var(--nice-bg-tertiary);border-radius:var(--nice-radius-sm,3px)}.ModelEditor-module_viewportShadingBar__NOK0h{background:var(--nice-overlay-80,rgba(20,20,40,.8));border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-md,6px);display:flex;gap:var(--nice-space-0-5,2px);padding:var(--nice-space-0-5,2px) var(--nice-space-1,4px);position:absolute;right:8px;top:8px;z-index:10}.ModelEditor-module_shadingBtn__SAIR9{background:none;border:1px solid transparent;border-radius:var(--nice-radius-sm,4px);color:var(--nice-text-muted);cursor:pointer;font-size:12px;padding:var(--nice-space-0-75,3px) var(--nice-space-2,8px);transition:all .1s;white-space:nowrap}.ModelEditor-module_shadingBtn__SAIR9:hover{background:var(--nice-bg-secondary);color:var(--nice-text-secondary)}.ModelEditor-module_shadingBtnActive__ST5YT{background:var(--nice-bg-tertiary)!important;border-color:var(--nice-color-primary)!important;color:var(--nice-color-white)!important}.ModelEditor-module_viewportGizmoInfo__k0ily{position:absolute;right:8px;top:44px;z-index:10}.ModelEditor-module_propTabs__Vw0-u{background:var(--nice-bg-canvas);border-bottom:1px solid var(--nice-border-color);display:flex;flex-shrink:0}.ModelEditor-module_propTabBtn__s8xDE{background:none;border:none;border-bottom:2px solid transparent;color:var(--nice-text-secondary);cursor:pointer;flex:1;font-size:14px;padding:var(--nice-space-1-5,6px) var(--nice-space-1,4px);transition:all .15s}.ModelEditor-module_propTabBtn__s8xDE:hover{background:var(--nice-bg-elevated);color:var(--nice-text-muted)}.ModelEditor-module_propTabBtnActive__-woXw{background:var(--nice-bg-elevated)!important;border-bottom-color:var(--nice-color-primary)!important;color:var(--nice-color-white)!important}.ModelEditor-module_outlinerSearch__p5L46{padding:var(--nice-space-1,4px) var(--nice-space-2,8px) 0}.ModelEditor-module_outlinerSearch__p5L46 input{background:var(--nice-bg-canvas);border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-sm,4px);color:var(--nice-text-secondary);font-size:11px;padding:var(--nice-space-0-75,3px) var(--nice-space-2,8px)}.ModelEditor-module_outlinerSearch__p5L46 input:focus{border-color:var(--nice-color-primary);outline:none}.ModelEditor-module_outlinerSearch__p5L46 input::placeholder{color:var(--nice-text-muted)}.ModelViewer-module_root__6Fbj3{background:var(--nice-bg-primary,#1a1a2e);color:var(--nice-text-primary,#e0e0e0);display:flex;flex-direction:column;font-family:Segoe UI,Consolas,monospace;font-size:12px;height:100%;overflow:hidden;position:relative;user-select:none}.ModelViewer-module_toolbar__EQJRN{align-items:center;background:var(--nice-bg-canvas,#12122a);border-bottom:1px solid var(--nice-border-color,#252545);display:flex;flex-shrink:0;gap:var(--nice-space-0-5,2px);height:32px;padding:0 var(--nice-space-1-5,6px);z-index:2}.ModelViewer-module_toolBtn__f9833{align-items:center;background:none;border:none;border-radius:var(--nice-radius-sm,3px);color:var(--nice-text-secondary,#ccc);cursor:pointer;display:flex;font-size:11px;gap:var(--nice-space-1,4px);padding:var(--nice-space-1,4px) var(--nice-space-2,8px);white-space:nowrap}.ModelViewer-module_toolBtn__f9833:hover{background:var(--nice-bg-secondary,#252545);color:var(--nice-text-primary,#fff)}.ModelViewer-module_toolBtn__f9833.ModelViewer-module_active__MgURC{background:var(--nice-color-primary,#57f);color:var(--nice-text-on-primary,#fff)}.ModelViewer-module_toolBtn__f9833:disabled{cursor:default;opacity:.4}.ModelViewer-module_toolSep__5zuAK{background:var(--nice-bg-secondary,#333);height:16px;margin:0 var(--nice-space-1,4px);width:1px}.ModelViewer-module_toolLabel__PcpJC{color:var(--nice-text-secondary,#888);font-size:10px;margin:0 var(--nice-space-1,4px);white-space:nowrap}.ModelViewer-module_toolRight__VSuzD{align-items:center;display:flex;gap:var(--nice-space-0-5,2px);margin-left:auto}.ModelViewer-module_viewport__-1llx{flex:1;outline:none;overflow:hidden;position:relative}.ModelViewer-module_viewport__-1llx:focus-visible:after{box-shadow:inset 0 0 0 2px var(--nice-color-primary,#3b82f6);content:"";inset:0;pointer-events:none;position:absolute}.ModelViewer-module_viewport__-1llx canvas{display:block;height:100%!important;width:100%!important}.ModelViewer-module_loadingOverlay__Ayyci{align-items:center;background:var(--nice-overlay-85,rgba(20,20,40,.85));display:flex;flex-direction:column;inset:0;justify-content:center;position:absolute;z-index:10}.ModelViewer-module_loadingBar__RDqVv{background:var(--nice-bg-tertiary,#444);border-radius:var(--nice-radius-sm,2px);height:4px;margin-top:var(--nice-space-3,12px);overflow:hidden;width:200px}.ModelViewer-module_loadingBarFill__zvIoP{background:var(--nice-color-primary,#57f);height:100%;transition:width .2s}.ModelViewer-module_loadingText__6OGeA{color:var(--nice-text-secondary,#ccc);font-size:13px;margin-bottom:var(--nice-space-2,8px)}.ModelViewer-module_errorOverlay__ASUqN{align-items:center;background:var(--nice-overlay-85,rgba(20,20,40,.85));color:var(--nice-danger,#ff6b6b);display:flex;flex-direction:column;inset:0;justify-content:center;position:absolute;z-index:10}.ModelViewer-module_sidePanel__-QFkd{background:var(--nice-bg-canvas,#12122a);border-left:1px solid var(--nice-border-color,#252545);bottom:24px;display:flex;flex-direction:column;font-size:11px;gap:var(--nice-space-3,12px);overflow-y:auto;padding:var(--nice-space-2,8px);position:absolute;right:0;top:32px;width:240px;z-index:5}.ModelViewer-module_sidePanel__-QFkd.ModelViewer-module_hidden__yoMuq{display:none}.ModelViewer-module_panelSection__bH-O3{display:flex;flex-direction:column;gap:var(--nice-space-1,4px)}.ModelViewer-module_panelTitle__xsn3e{color:var(--nice-text-secondary,#888);font-size:10px;letter-spacing:.5px;margin-bottom:var(--nice-space-1,4px);text-transform:uppercase}.ModelViewer-module_panelRow__3QxnD{align-items:center;display:flex;gap:var(--nice-space-1-5,6px)}.ModelViewer-module_panelRow__3QxnD label{color:var(--nice-text-secondary,#aaa);flex:0 0 70px;font-size:10px}.ModelViewer-module_panelRow__3QxnD span{color:var(--nice-text-primary,#e0e0e0);font-size:11px}.ModelViewer-module_animBar__qcYi5{align-items:center;background:var(--nice-bg-canvas,#12122a);border-top:1px solid var(--nice-border-color,#252545);display:flex;flex-shrink:0;gap:var(--nice-space-1,4px);height:28px;padding:0 var(--nice-space-2,8px)}.ModelViewer-module_animBar__qcYi5.ModelViewer-module_hidden__yoMuq{display:none}.ModelViewer-module_animSlider__9AQzN{appearance:none;background:var(--nice-bg-tertiary,#444);border-radius:var(--nice-radius-sm,2px);cursor:pointer;flex:1;height:4px}.ModelViewer-module_animSlider__9AQzN::-webkit-slider-thumb{appearance:none;background:var(--nice-color-primary,#57f);border-radius:var(--nice-radius-full,50%);cursor:pointer;height:10px;width:10px}.ModelViewer-module_animSelect__LhFWD{background:var(--nice-bg-secondary,#252545);border:1px solid var(--nice-border-color,#555);border-radius:var(--nice-radius-sm,3px);color:var(--nice-text-primary,#e0e0e0);font-size:10px;max-width:120px;padding:var(--nice-space-0-5,2px) var(--nice-space-1,4px)}.ModelViewer-module_statusBar__-3uuA{align-items:center;background:var(--nice-bg-canvas,#12122a);border-top:1px solid var(--nice-border-color,#252545);color:var(--nice-text-muted,#888);display:flex;flex-shrink:0;font-size:10px;gap:var(--nice-space-2,8px);height:22px;padding:0 var(--nice-space-2,8px)}.ModelViewer-module_statusRight__vI51s{display:flex;gap:var(--nice-space-3,12px);margin-left:auto}.ModelViewer-module_annotationLayer__-NzZF{inset:0;pointer-events:none;position:absolute;z-index:3}.ModelViewer-module_annotation__H6DgR{background:color-mix(in srgb,var(--nice-color-primary,#57f) 85%,transparent);border-radius:var(--nice-radius-sm,4px);color:var(--nice-text-on-primary,#fff);cursor:pointer;font-size:10px;padding:var(--nice-space-1,4px) var(--nice-space-2,8px);pointer-events:auto;position:absolute;transform:translate(-50%,-100%);white-space:nowrap}.ModelViewer-module_annotation__H6DgR:hover{background:var(--nice-color-primary,#57f)}.ModelViewer-module_dropZone__eNrPo{align-items:center;background:color-mix(in srgb,var(--nice-color-primary,#57f) 15%,transparent);border:2px dashed var(--nice-color-primary,#57f);color:var(--nice-color-primary,#57f);display:flex;font-size:16px;inset:0;justify-content:center;pointer-events:none;position:absolute;z-index:20}.UVEditor-module_uvEditor__9yahO{background:var(--nice-bg-secondary,#1e1e1e);border:1px solid var(--nice-border,#333);border-radius:var(--nice-radius-sm,4px);color:var(--nice-text,#e0e0e0);font-family:var(--nice-font-family,system-ui,sans-serif);font-size:12px;overflow:hidden}.UVEditor-module_toolbar__wPDkZ{align-items:center;background:var(--nice-bg-tertiary,#252526);border-bottom:1px solid var(--nice-border,#333);display:flex;flex-wrap:wrap;gap:var(--nice-space-2,8px);padding:var(--nice-space-1-5,6px) var(--nice-space-2,8px)}.UVEditor-module_toolGroup__hzVqv{border-right:1px solid var(--nice-border,#444);display:flex;gap:var(--nice-space-0-5,2px);padding:0 var(--nice-space-1,4px)}.UVEditor-module_toolGroup__hzVqv:last-child{border-right:none}.UVEditor-module_toolBtn__oIzVq{align-items:center;background:var(--nice-bg-secondary,#2d2d2d);border:1px solid transparent;border-radius:var(--nice-radius-sm,3px);color:var(--nice-text-secondary,#aaa);cursor:pointer;display:flex;font-size:11px;font-weight:500;height:24px;justify-content:center;min-width:28px;padding:0 var(--nice-space-1-5,6px);transition:all .15s ease}.UVEditor-module_toolBtn__oIzVq:hover:not(:disabled){background:var(--nice-bg-hover,#3c3c3c);color:var(--nice-text,#fff)}.UVEditor-module_toolBtn__oIzVq.UVEditor-module_active__gahDI{background:var(--nice-primary,#007acc);border-color:var(--nice-primary-hover,#0098ff);color:var(--nice-text-on-primary,#fff)}.UVEditor-module_toolBtn__oIzVq:disabled{cursor:not-allowed;opacity:.5}.UVEditor-module_select__cd9Xa{background:var(--nice-bg-secondary,#2d2d2d);border:1px solid var(--nice-border,#444);border-radius:var(--nice-radius-sm,3px);color:var(--nice-text,#e0e0e0);cursor:pointer;font-size:11px;height:24px;padding:0 var(--nice-space-1-5,6px)}.UVEditor-module_select__cd9Xa:focus{border-color:var(--nice-primary,#007acc);outline:none}.UVEditor-module_viewport__0S2EF{background:var(--nice-bg-secondary,#2a2a2a);cursor:crosshair;flex:1;overflow:hidden;position:relative}.UVEditor-module_canvas__L8eJJ{display:block;height:100%;width:100%}.UVEditor-module_noGeometry__J0MOa{align-items:center;color:var(--nice-text-muted,#666);display:flex;font-size:14px;inset:0;justify-content:center;pointer-events:none;position:absolute}.UVEditor-module_sidebar__zcI1d{background:var(--nice-bg-tertiary,#252526);border-left:1px solid var(--nice-border,#333);overflow-y:auto;width:200px}.UVEditor-module_panel__wRBD0{border-bottom:1px solid var(--nice-border,#333);padding:var(--nice-space-2-5,10px)}.UVEditor-module_panelTitle__5oDRo{color:var(--nice-text-muted,#888);font-size:11px;font-weight:600;letter-spacing:.5px;margin:0 0 var(--nice-space-2,8px) 0;text-transform:uppercase}.UVEditor-module_checkbox__P2anI{align-items:center;cursor:pointer;display:flex;font-size:11px;gap:var(--nice-space-1-5,6px);margin-bottom:var(--nice-space-1-5,6px)}.UVEditor-module_checkbox__P2anI input{accent-color:var(--nice-primary,#007acc);cursor:pointer;height:14px;margin:0;width:14px}.UVEditor-module_stat__j2lxJ{display:flex;font-size:11px;justify-content:space-between;padding:var(--nice-space-0-75,3px) 0}.UVEditor-module_stat__j2lxJ span:first-child{color:var(--nice-text-muted,#888)}.UVEditor-module_stat__j2lxJ span:last-child{color:var(--nice-text,#e0e0e0);font-weight:500}.UVEditor-module_rangeLabel__6OS0o{display:block;font-size:11px;margin-top:var(--nice-space-2,8px)}.UVEditor-module_rangeLabel__6OS0o input{accent-color:var(--nice-primary,#007acc);margin-top:var(--nice-space-1,4px);width:100%}.UVEditor-module_statusBar__KYYrx{background:var(--nice-bg-inset,#1a1a1a);border-top:1px solid var(--nice-border,#333);color:var(--nice-text-muted,#888);display:flex;font-size:11px;gap:var(--nice-space-4,16px);padding:var(--nice-space-1,4px) var(--nice-space-2,8px)}.UVEditor-module_statusBar__KYYrx span{white-space:nowrap}@media (max-width:768px){.UVEditor-module_sidebar__zcI1d{display:none}.UVEditor-module_toolbar__wPDkZ{overflow-x:auto}}.MaterialEditor-module_materialEditor__RjU0e{--bg-primary:var(--nice-bg,#1e1e1e);--bg-secondary:var(--nice-bg-secondary,#252526);--bg-tertiary:var(--nice-bg-secondary,#2d2d2d);--bg-hover:var(--nice-bg-secondary,#3a3a3a);--bg-active:var(--nice-bg-secondary,#4a4a4a);--text-primary:var(--nice-text-primary,#fff);--text-secondary:var(--nice-text-secondary,#ccc);--text-muted:var(--nice-text-secondary,#888);--border-color:var(--nice-bg-secondary,#3a3a3a);--border-light:var(--nice-bg-secondary,#4a4a4a);--accent-color:var(--nice-primary,#0078d4);--accent-hover:#1084d8;--error-color:var(--nice-danger,#f44336);--warning-color:var(--nice-warning,#ff9800);--success-color:var(--nice-success,#4caf50);--shadow-sm:0 1px 3px var(--nice-overlay-30,rgba(0,0,0,.3));--shadow-md:0 4px 6px var(--nice-overlay-40,rgba(0,0,0,.4));--shadow-lg:0 10px 20px var(--nice-overlay-50,rgba(0,0,0,.5));--node-shadow:0 4px 12px var(--nice-overlay-50,rgba(0,0,0,.5));--transition-fast:0.1s ease;--transition-normal:0.2s ease;--border-radius-sm:3px;--border-radius-md:6px;--border-radius-lg:10px}.MaterialEditor-module_materialEditor__RjU0e.MaterialEditor-module_light__zSnpW{--bg-primary:var(--nice-bg-secondary,#f5f5f5);--bg-secondary:var(--nice-bg,#fff);--bg-tertiary:var(--nice-border,#e0e0e0);--bg-hover:var(--nice-border,#d0d0d0);--bg-active:var(--nice-border,silver);--text-primary:var(--nice-text-primary,#1e1e1e);--text-secondary:var(--nice-text,#333);--text-muted:var(--nice-text-secondary,#666);--border-color:var(--nice-border,#d0d0d0);--border-light:var(--nice-border,#e0e0e0);--shadow-sm:0 1px 3px var(--nice-overlay-10,rgba(0,0,0,.1));--shadow-md:0 4px 6px var(--nice-overlay-15,rgba(0,0,0,.15));--shadow-lg:0 10px 20px var(--nice-overlay-20,rgba(0,0,0,.2));--node-shadow:0 4px 12px var(--nice-overlay-20,rgba(0,0,0,.2))}.MaterialEditor-module_materialEditor__RjU0e{background-color:var(--nice-bg-primary);border-radius:var(--nice-radius-lg);color:var(--nice-text-primary);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;font-size:13px;overflow:hidden;user-select:none}.MaterialEditor-module_toolbar__qqDbE{align-items:center;background-color:var(--nice-bg-secondary);border-bottom:1px solid var(--nice-border-color);display:flex;gap:var(--nice-space-1,4px);padding:var(--nice-space-1-5,6px) var(--nice-space-2-5,10px)}.MaterialEditor-module_toolbarGroup__fgE2r{align-items:center;display:flex;gap:var(--nice-space-0-5,2px)}.MaterialEditor-module_toolbarSeparator__Z9B1i{background-color:var(--nice-border-color);height:20px;margin:0 var(--nice-space-1-5,6px);width:1px}.MaterialEditor-module_toolbar__qqDbE button{align-items:center;background-color:transparent;border:none;border-radius:var(--nice-radius-sm);color:var(--nice-text-primary);cursor:pointer;display:flex;font-size:14px;height:28px;justify-content:center;padding:0;transition:background-color var(--transition-fast);width:28px}.MaterialEditor-module_toolbar__qqDbE button:active:not(:disabled),.MaterialEditor-module_toolbar__qqDbE button:hover:not(:disabled){background-color:var(--nice-hover-bg)}.MaterialEditor-module_toolbar__qqDbE button:disabled{cursor:not-allowed;opacity:.4}.MaterialEditor-module_toolbar__qqDbE button.MaterialEditor-module_active__DEZaw{background-color:var(--nice-color-accent);color:#fff}.MaterialEditor-module_palette__VNmnu{background-color:var(--nice-bg-secondary);border-right:1px solid var(--nice-border-color);display:flex;flex-direction:column;flex-shrink:0;width:220px}.MaterialEditor-module_paletteSearch__rE-c5{border-bottom:1px solid var(--nice-border-color);padding:var(--nice-space-2,8px)}.MaterialEditor-module_searchInput__H7FJt{background-color:var(--nice-bg-tertiary);border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-md);color:var(--nice-text-primary);font-size:12px;outline:none;padding:var(--nice-space-1-5,6px) var(--nice-space-2-5,10px);transition:border-color var(--transition-fast);width:100%}.MaterialEditor-module_searchInput__H7FJt:focus{border-color:var(--nice-color-accent)}.MaterialEditor-module_searchInput__H7FJt::placeholder{color:var(--nice-text-muted)}.MaterialEditor-module_paletteCategories__sbn9d{flex:1;overflow-y:auto;padding:var(--nice-space-1,4px) 0}.MaterialEditor-module_paletteCategory__LgsIy{margin-bottom:var(--nice-space-0-5,2px)}.MaterialEditor-module_categoryHeader__8M6DH{align-items:center;background-color:transparent;border:none;border-left:3px solid transparent;color:var(--nice-text-primary);cursor:pointer;display:flex;font-size:12px;font-weight:600;gap:var(--nice-space-1-5,6px);padding:var(--nice-space-2,8px) var(--nice-space-2-5,10px);text-align:left;transition:background-color var(--transition-fast);width:100%}.MaterialEditor-module_categoryHeader__8M6DH:hover{background-color:var(--nice-hover-bg)}.MaterialEditor-module_categoryIcon__coBim{color:var(--nice-text-muted);font-size:10px;width:14px}.MaterialEditor-module_categoryCount__rnYwK{background-color:var(--nice-bg-tertiary);border-radius:var(--nice-radius-lg,10px);color:var(--nice-text-muted);font-size:10px;font-weight:400;margin-left:auto;padding:var(--nice-space-0-5,2px) var(--nice-space-1-5,6px)}.MaterialEditor-module_categoryNodes__GMJz6{padding:var(--nice-space-0-5,2px) 0}.MaterialEditor-module_paletteNode__4-ncg{align-items:center;cursor:grab;display:flex;gap:var(--nice-space-2,8px);padding:var(--nice-space-1-5,6px) var(--nice-space-2-5,10px) var(--nice-space-1-5,6px) var(--nice-space-7,28px);transition:background-color var(--transition-fast)}.MaterialEditor-module_paletteNode__4-ncg:hover{background-color:var(--nice-hover-bg)}.MaterialEditor-module_paletteNode__4-ncg:active{cursor:grabbing}.MaterialEditor-module_nodeColor__ql5xb{border-radius:var(--nice-radius-sm,3px);flex-shrink:0;height:12px;width:12px}.MaterialEditor-module_nodeName__K0Rqi{color:var(--nice-text-secondary);flex:1;font-size:12px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.MaterialEditor-module_graphCanvas__guLj7{background-color:var(--nice-bg-primary);cursor:grab;flex:1;overflow:hidden;position:relative}.MaterialEditor-module_graphCanvas__guLj7:active{cursor:grabbing}.MaterialEditor-module_connectionsSvg__9SyYo{height:100%;left:0;pointer-events:none;position:absolute;top:0;width:100%}.MaterialEditor-module_connection__x9F9U{cursor:pointer;pointer-events:stroke;transition:stroke-width var(--transition-fast),stroke var(--transition-fast)}.MaterialEditor-module_connection__x9F9U:hover{stroke-width:4px}.MaterialEditor-module_pendingConnection__NCBtj{animation:MaterialEditor-module_dashAnimation__YLpH3 .5s linear infinite;pointer-events:none}@keyframes MaterialEditor-module_dashAnimation__YLpH3{to{stroke-dashoffset:-10}}.MaterialEditor-module_graphNode__pCqYA{background-color:var(--nice-bg-secondary);border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-md);box-shadow:var(--node-shadow);cursor:move;overflow:visible;position:absolute;transition:border-color var(--transition-fast),box-shadow var(--transition-fast)}.MaterialEditor-module_graphNode__pCqYA:hover{border-color:var(--nice-border-light)}.MaterialEditor-module_graphNode__pCqYA.MaterialEditor-module_selected__ozIqt{border-color:var(--nice-color-accent);box-shadow:0 0 0 2px var(--nice-color-accent),var(--node-shadow)}.MaterialEditor-module_graphNode__pCqYA.MaterialEditor-module_locked__8RRAH{cursor:not-allowed;opacity:.8}.MaterialEditor-module_nodeHeader__-PBFg{align-items:center;border-radius:var(--nice-radius-md) var(--nice-radius-md) 0 0;color:#fff;display:flex;font-size:11px;font-weight:600;justify-content:space-between;padding:var(--nice-space-1-5,6px) var(--nice-space-2-5,10px);text-shadow:0 1px 2px var(--nice-overlay-30,rgba(0,0,0,.3))}.MaterialEditor-module_nodeTitle__i2PcO{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.MaterialEditor-module_lockIcon__tPzIi{font-size:10px;margin-left:var(--nice-space-1-5,6px)}.MaterialEditor-module_nodePorts__APKPN{padding:var(--nice-space-1,4px) 0;position:relative}.MaterialEditor-module_inputPorts__7MVX4{left:0;position:absolute;top:0}.MaterialEditor-module_outputPorts__GUwXJ{position:absolute;right:0;top:0}.MaterialEditor-module_port__zc4vm{align-items:center;display:flex;font-size:10px;height:20px;position:absolute;white-space:nowrap}.MaterialEditor-module_inputPorts__7MVX4 .MaterialEditor-module_port__zc4vm{left:0;padding-left:var(--nice-space-3-5,14px)}.MaterialEditor-module_outputPorts__GUwXJ .MaterialEditor-module_port__zc4vm{justify-content:flex-end;padding-right:var(--nice-space-3-5,14px);right:0}.MaterialEditor-module_portHandle__oNh4P{border:2px solid var(--nice-bg-secondary);border-radius:var(--nice-radius-full,50%);box-sizing:border-box;cursor:crosshair;height:10px;position:absolute;transition:transform var(--transition-fast);width:10px}.MaterialEditor-module_portHandle__oNh4P:hover{transform:scale(1.3)}.MaterialEditor-module_inputHandle__6lz91{left:-5px}.MaterialEditor-module_outputHandle__8-r1i{right:-5px}.MaterialEditor-module_portHandle__oNh4P.MaterialEditor-module_connected__qo4za{border-color:transparent}.MaterialEditor-module_portLabel__T8daS{color:var(--nice-text-secondary)}.MaterialEditor-module_nodeComment__wkIoF{background-color:rgba(255,235,59,.15);border:1px solid rgba(255,235,59,.4);border-radius:var(--nice-radius-sm);bottom:-24px;color:var(--nice-warning,#ffeb3b);font-size:10px;left:0;overflow:hidden;padding:var(--nice-space-0-5,2px) var(--nice-space-1-5,6px);position:absolute;right:0;text-overflow:ellipsis;white-space:nowrap}.MaterialEditor-module_previewPanel__lqiI0{background-color:var(--nice-bg-secondary);border-left:1px solid var(--nice-border-color);display:flex;flex-direction:column;flex-shrink:0;width:220px}.MaterialEditor-module_previewHeader__vkqDk{align-items:center;border-bottom:1px solid var(--nice-border-color);display:flex;font-size:12px;font-weight:600;justify-content:space-between;padding:var(--nice-space-2-5,10px) var(--nice-space-3,12px)}.MaterialEditor-module_previewModeSelect__qbL8f{background-color:var(--nice-bg-tertiary);border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-sm);color:var(--nice-text-primary);cursor:pointer;font-size:11px;padding:var(--nice-space-0-75,3px) var(--nice-space-2,8px)}.MaterialEditor-module_previewCanvas__q91ue{align-items:center;aspect-ratio:1;background-color:var(--nice-bg-primary);border-bottom:1px solid var(--nice-border-color);display:flex;justify-content:center;position:relative}.MaterialEditor-module_previewCanvas__q91ue canvas{max-height:100%;max-width:100%}.MaterialEditor-module_previewCompiling__GVFRq{align-items:center;animation:MaterialEditor-module_pulse__6IS0P 1s ease infinite;background-color:var(--nice-overlay-60,rgba(0,0,0,.6));bottom:0;color:#fff;display:flex;font-size:12px;justify-content:center;left:0;position:absolute;right:0;top:0}@keyframes MaterialEditor-module_pulse__6IS0P{0%,to{opacity:1}50%{opacity:.6}}.MaterialEditor-module_previewErrors__6JZfZ{flex:1;overflow-y:auto;padding:var(--nice-space-2-5,10px)}.MaterialEditor-module_previewError__Rotpo{background-color:rgba(244,67,54,.15);border:1px solid rgba(244,67,54,.4);border-radius:var(--nice-radius-sm);color:var(--nice-color-error);font-size:11px;margin-bottom:var(--nice-space-1-5,6px);padding:var(--nice-space-1-5,6px) var(--nice-space-2,8px);word-break:break-word}.MaterialEditor-module_propertiesPanel__H3Lej{background-color:var(--nice-bg-secondary);border-left:1px solid var(--nice-border-color);display:flex;flex-direction:column;flex-shrink:0;width:280px}.MaterialEditor-module_propertiesHeader__ZLXL2{align-items:center;border-bottom:1px solid var(--nice-border-color);display:flex;font-size:12px;font-weight:600;padding:var(--nice-space-2-5,10px) var(--nice-space-3,12px)}.MaterialEditor-module_propertiesContent__3LWte{flex:1;overflow-y:auto;padding:var(--nice-space-3,12px)}.MaterialEditor-module_propertyGroup__3Rz-K{margin-bottom:var(--nice-space-4,16px)}.MaterialEditor-module_propertyGroupTitle__Wsswl{color:var(--nice-text-muted);font-size:11px;font-weight:600;letter-spacing:.5px;margin-bottom:var(--nice-space-2,8px);text-transform:uppercase}.MaterialEditor-module_propertyRow__eAshz{display:flex;flex-direction:column;margin-bottom:var(--nice-space-2-5,10px)}.MaterialEditor-module_propertyLabel__wwNGL{color:var(--nice-text-secondary);font-size:11px;margin-bottom:var(--nice-space-1,4px)}.MaterialEditor-module_propertyInput__oK2eE{background-color:var(--nice-bg-tertiary);border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-sm);color:var(--nice-text-primary);font-size:12px;outline:none;padding:var(--nice-space-1-5,6px) var(--nice-space-2,8px);transition:border-color var(--transition-fast)}.MaterialEditor-module_propertyInput__oK2eE:focus{border-color:var(--nice-color-accent)}.MaterialEditor-module_propertyColorPreview__1L-S5{align-items:center;display:flex;gap:var(--nice-space-2,8px)}.MaterialEditor-module_colorSwatch__rHMga{border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-sm);cursor:pointer;height:24px;width:24px}.MaterialEditor-module_propertySlider__NztWp{align-items:center;display:flex;gap:var(--nice-space-2,8px)}.MaterialEditor-module_propertySlider__NztWp input[type=range]{-webkit-appearance:none;background:var(--nice-bg-tertiary);border-radius:var(--nice-radius-sm,2px);flex:1;height:4px;outline:none}.MaterialEditor-module_propertySlider__NztWp input[type=range]::-webkit-slider-thumb{-webkit-appearance:none;background:var(--nice-color-accent);border-radius:var(--nice-radius-full,50%);cursor:pointer;height:14px;width:14px}.MaterialEditor-module_propertySlider__NztWp .MaterialEditor-module_sliderValue__HeKO-{color:var(--nice-text-secondary);font-size:11px;text-align:right;width:50px}.MaterialEditor-module_minimap__mPE-C{background-color:var(--nice-bg-secondary);border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-md);bottom:10px;box-shadow:var(--nice-shadow-md);height:100px;overflow:hidden;position:absolute;right:10px;width:150px}.MaterialEditor-module_minimapNodes__DCW6r{height:100%;position:relative;width:100%}.MaterialEditor-module_minimapNode__EoDhh{border-radius:var(--nice-radius-sm,2px);position:absolute}.MaterialEditor-module_minimapViewport__qUyIg{border:1px solid var(--nice-color-accent)}.MaterialEditor-module_minimapViewport__qUyIg,.MaterialEditor-module_selectionBox__5-dcw{background-color:var(--nice-primary-tint-10,rgba(0,120,212,.1));pointer-events:none;position:absolute}.MaterialEditor-module_selectionBox__5-dcw{border:1px dashed var(--nice-color-accent)}.MaterialEditor-module_contextMenu__jMJ2-{background-color:var(--nice-bg-secondary);border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-md);box-shadow:var(--nice-shadow-lg);min-width:160px;padding:var(--nice-space-1,4px) 0;position:fixed;z-index:1000}.MaterialEditor-module_contextMenuItem__NltnJ{align-items:center;cursor:pointer;display:flex;font-size:12px;justify-content:space-between;padding:var(--nice-space-1-5,6px) var(--nice-space-3,12px);transition:background-color var(--transition-fast)}.MaterialEditor-module_contextMenuItem__NltnJ:hover{background-color:var(--nice-hover-bg)}.MaterialEditor-module_contextMenuItem__NltnJ.MaterialEditor-module_disabled__NnXkq{color:var(--nice-text-muted);cursor:not-allowed}.MaterialEditor-module_contextMenuItem__NltnJ.MaterialEditor-module_disabled__NnXkq:hover{background-color:transparent}.MaterialEditor-module_contextMenuShortcut__2-fdl{color:var(--nice-text-muted);font-size:11px;margin-left:var(--nice-space-5,20px)}.MaterialEditor-module_contextMenuSeparator__yYjvC{background-color:var(--nice-border-color);height:1px;margin:var(--nice-space-1,4px) 0}.MaterialEditor-module_zoomControls__7PATW{align-items:center;background-color:var(--nice-bg-secondary);border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-md);bottom:10px;box-shadow:var(--nice-shadow-sm);display:flex;gap:var(--nice-space-1,4px);left:10px;padding:var(--nice-space-1,4px);position:absolute}.MaterialEditor-module_zoomControls__7PATW button{align-items:center;background-color:transparent;border:none;border-radius:var(--nice-radius-sm);color:var(--nice-text-primary);cursor:pointer;display:flex;font-size:14px;height:26px;justify-content:center;padding:0;transition:background-color var(--transition-fast);width:26px}.MaterialEditor-module_zoomControls__7PATW button:hover{background-color:var(--nice-hover-bg)}.MaterialEditor-module_zoomLevel__Rw6xW{color:var(--nice-text-secondary);font-size:11px;min-width:50px;text-align:center}.MaterialEditor-module_tooltip__lTpIH{word-wrap:break-word;background-color:var(--nice-text-primary,#333);border-radius:var(--nice-radius-sm);box-shadow:var(--nice-shadow-md);color:var(--nice-text-inverse,#fff);font-size:11px;max-width:250px;padding:var(--nice-space-1-5,6px) var(--nice-space-2-5,10px);pointer-events:none;position:fixed;white-space:pre-wrap;z-index:9999}.MaterialEditor-module_tooltip__lTpIH:before{border-color:var(--nice-border-color,#333) transparent transparent transparent;border-style:solid;border-width:5px;content:"";left:50%;position:absolute;top:100%;transform:translateX(-50%)}.MaterialEditor-module_emptyState__Kpa84{color:var(--nice-text-muted);left:50%;position:absolute;text-align:center;top:50%;transform:translate(-50%,-50%)}.MaterialEditor-module_emptyStateIcon__67zsA{font-size:48px;margin-bottom:var(--nice-space-4,16px);opacity:.5}.MaterialEditor-module_emptyStateTitle__0NQ65{color:var(--nice-text-secondary);font-size:16px;font-weight:600;margin-bottom:var(--nice-space-2,8px)}.MaterialEditor-module_emptyStateDescription__QgVz5{font-size:13px;line-height:1.5;max-width:300px}@media (max-width:900px){.MaterialEditor-module_palette__VNmnu{bottom:0;left:0;position:absolute;top:0;transform:translateX(-100%);transition:transform var(--transition-normal);z-index:100}.MaterialEditor-module_palette__VNmnu.MaterialEditor-module_open__DG5-R{transform:translateX(0)}.MaterialEditor-module_previewPanel__lqiI0{bottom:0;position:absolute;right:0;top:0;transform:translateX(100%);transition:transform var(--transition-normal);z-index:100}.MaterialEditor-module_previewPanel__lqiI0.MaterialEditor-module_open__DG5-R{transform:translateX(0)}}@media (max-width:600px){.MaterialEditor-module_toolbar__qqDbE{flex-wrap:wrap;padding:var(--nice-space-1,4px)}.MaterialEditor-module_toolbarGroup__fgE2r{flex-wrap:wrap}.MaterialEditor-module_toolbar__qqDbE button{font-size:16px;height:32px;width:32px}.MaterialEditor-module_palette__VNmnu,.MaterialEditor-module_previewPanel__lqiI0{max-width:280px;width:100%}}@keyframes MaterialEditor-module_nodeAppear__4vHEB{0%{opacity:0;transform:scale(.9)}to{opacity:1;transform:scale(1)}}.MaterialEditor-module_graphNode__pCqYA{animation:MaterialEditor-module_nodeAppear__4vHEB .2s ease}@keyframes MaterialEditor-module_connectionDraw__xvI66{0%{stroke-dashoffset:1000}to{stroke-dashoffset:0}}.MaterialEditor-module_connection__x9F9U{stroke-dasharray:1000;animation:MaterialEditor-module_connectionDraw__xvI66 .3s ease forwards}.MaterialEditor-module_materialEditor__RjU0e:focus-visible{outline:2px solid var(--nice-color-accent);outline-offset:-2px}.MaterialEditor-module_categoryHeader__8M6DH:focus-visible,.MaterialEditor-module_paletteNode__4-ncg:focus-visible,.MaterialEditor-module_toolbar__qqDbE button:focus-visible{outline:2px solid var(--nice-color-accent);outline-offset:-2px}@media (prefers-reduced-motion:reduce){.MaterialEditor-module_connection__x9F9U,.MaterialEditor-module_graphNode__pCqYA,.MaterialEditor-module_pendingConnection__NCBtj{animation:none}*,:after,:before{animation-duration:.01ms!important;transition-duration:.01ms!important}}@media print{.MaterialEditor-module_minimap__mPE-C,.MaterialEditor-module_palette__VNmnu,.MaterialEditor-module_previewPanel__lqiI0,.MaterialEditor-module_toolbar__qqDbE,.MaterialEditor-module_zoomControls__7PATW{display:none!important}.MaterialEditor-module_materialEditor__RjU0e{border:1px solid var(--nice-border,#ccc)}.MaterialEditor-module_graphCanvas__guLj7{background-color:#fff}.MaterialEditor-module_graphNode__pCqYA{border:1px solid var(--nice-border-color,#333);box-shadow:none}.MaterialEditor-module_connection__x9F9U{stroke:var(--nice-text,#333)!important}}.ParticleEditor-module_particleEditor__HiTCi{--pe-bg-primary:var(--nice-bg,#1a1a1a);--pe-bg-secondary:var(--nice-bg-secondary,#252525);--pe-bg-tertiary:var(--nice-bg-secondary,#2d2d2d);--pe-bg-hover:var(--nice-bg-secondary,#3a3a3a);--pe-bg-active:var(--nice-bg-secondary,#4a4a4a);--pe-border-color:var(--nice-border,#404040);--pe-text-primary:var(--nice-text-primary,#fff);--pe-text-secondary:var(--nice-text-muted,#b0b0b0);--pe-text-muted:#707070;--pe-accent:#4fc3f7;--pe-accent-hover:#29b6f6;--pe-success:#66bb6a;--pe-warning:var(--nice-warning,#ffa726);--pe-error:#ef5350;--pe-toolbar-height:40px;--pe-panel-width:260px;--pe-radius:4px;--pe-transition:150ms ease}.ParticleEditor-module_particleEditor__HiTCi.ParticleEditor-module_light__AiNYo{--pe-bg-primary:var(--nice-bg-secondary,#f5f5f5);--pe-bg-secondary:var(--nice-bg,#fff);--pe-bg-tertiary:var(--nice-bg-secondary,#fafafa);--pe-bg-hover:var(--nice-border,#eee);--pe-bg-active:var(--nice-border,#e0e0e0);--pe-border-color:var(--nice-border,#d0d0d0);--pe-text-primary:var(--nice-text,#212121);--pe-text-secondary:var(--nice-text-secondary,#616161);--pe-text-muted:var(--nice-text-secondary,#9e9e9e);--pe-accent:var(--nice-primary-hover,#1976d2);--pe-accent-hover:var(--nice-primary-dark,#1565c0)}.ParticleEditor-module_particleEditor__HiTCi{background-color:var(--pe-bg-primary);border-radius:var(--pe-radius);color:var(--pe-text-primary);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;font-size:13px;overflow:hidden;user-select:none}.ParticleEditor-module_toolbar__KptWe{align-items:center;background-color:var(--pe-bg-secondary);border-bottom:1px solid var(--pe-border-color);display:flex;gap:var(--nice-space-1,4px);height:var(--pe-toolbar-height);padding:0 var(--nice-space-2,8px)}.ParticleEditor-module_toolbarGroup__-N0jI{align-items:center;display:flex;gap:var(--nice-space-0-5,2px)}.ParticleEditor-module_toolbarSeparator__kIZmD{background-color:var(--pe-border-color);height:20px;margin:0 var(--nice-space-1-5,6px);width:1px}.ParticleEditor-module_toolbar__KptWe button{align-items:center;background:transparent;border:none;border-radius:var(--pe-radius);color:var(--pe-text-secondary);cursor:pointer;display:flex;font-size:14px;height:28px;justify-content:center;transition:all var(--pe-transition);width:28px}.ParticleEditor-module_toolbar__KptWe button:hover:not(:disabled){background-color:var(--pe-bg-hover);color:var(--pe-text-primary)}.ParticleEditor-module_toolbar__KptWe button:active:not(:disabled){background-color:var(--pe-bg-active)}.ParticleEditor-module_toolbar__KptWe button.ParticleEditor-module_active__81dHl{background-color:var(--pe-accent);color:#fff}.ParticleEditor-module_toolbar__KptWe button:disabled{cursor:not-allowed;opacity:.4}.ParticleEditor-module_speedSelect__vZO0v{background-color:var(--pe-bg-tertiary);border:1px solid var(--pe-border-color);border-radius:var(--pe-radius);color:var(--pe-text-primary);cursor:pointer;font-size:11px;height:24px;padding:0 var(--nice-space-1-5,6px)}.ParticleEditor-module_timeDisplay__tl1Qv{color:var(--pe-text-secondary);font-family:monospace;font-size:11px;min-width:50px;padding:0 var(--nice-space-2,8px);text-align:right}.ParticleEditor-module_systemList__Vaiea{background-color:var(--pe-bg-secondary);border-right:1px solid var(--pe-border-color);display:flex;flex-direction:column;min-width:var(--pe-panel-width);overflow:hidden;width:var(--pe-panel-width)}.ParticleEditor-module_systemListHeader__I9W61{align-items:center;border-bottom:1px solid var(--pe-border-color);color:var(--pe-text-secondary);display:flex;font-size:12px;font-weight:600;justify-content:space-between;letter-spacing:.5px;padding:var(--nice-space-2-5,10px) var(--nice-space-3,12px);text-transform:uppercase}.ParticleEditor-module_systemListActions__C289h{display:flex;gap:var(--nice-space-1,4px)}.ParticleEditor-module_systemListActions__C289h button{align-items:center;background:transparent;border:none;border-radius:var(--pe-radius);color:var(--pe-text-secondary);cursor:pointer;display:flex;font-size:12px;height:22px;justify-content:center;width:22px}.ParticleEditor-module_systemListActions__C289h button:hover{background-color:var(--pe-bg-hover);color:var(--pe-text-primary)}.ParticleEditor-module_presetMenu__FXV-m{background-color:var(--pe-bg-tertiary);border-bottom:1px solid var(--pe-border-color);display:flex;flex-wrap:wrap;gap:var(--nice-space-1,4px);padding:var(--nice-space-1-5,6px)}.ParticleEditor-module_presetItem__zt9wm{background-color:var(--pe-bg-secondary);border:1px solid var(--pe-border-color);border-radius:var(--pe-radius);color:var(--pe-text-secondary);cursor:pointer;font-size:11px;padding:var(--nice-space-1,4px) var(--nice-space-2-5,10px);transition:all var(--pe-transition)}.ParticleEditor-module_presetItem__zt9wm:hover{background-color:var(--pe-accent);border-color:var(--pe-accent);color:#fff}.ParticleEditor-module_systemItems__a4eQN{flex:1;overflow-y:auto;padding:var(--nice-space-1-5,6px)}.ParticleEditor-module_systemItem__y-cTZ{align-items:center;border-radius:var(--pe-radius);cursor:pointer;display:flex;justify-content:space-between;padding:var(--nice-space-2,8px) var(--nice-space-2-5,10px);transition:all var(--pe-transition)}.ParticleEditor-module_systemItem__y-cTZ:hover{background-color:var(--pe-bg-hover)}.ParticleEditor-module_systemItem__y-cTZ.ParticleEditor-module_selected__wzmRZ{background-color:var(--pe-accent);color:#fff}.ParticleEditor-module_systemItem__y-cTZ.ParticleEditor-module_selected__wzmRZ .ParticleEditor-module_systemItemActions__Dc1Bw button{color:var(--nice-overlay-light-70,hsla(0,0%,100%,.7))}.ParticleEditor-module_systemItem__y-cTZ.ParticleEditor-module_selected__wzmRZ .ParticleEditor-module_systemItemActions__Dc1Bw button:hover{color:#fff}.ParticleEditor-module_systemName__-EAlQ{flex:1;font-size:12px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ParticleEditor-module_systemItemActions__Dc1Bw{display:flex;gap:var(--nice-space-0-5,2px);opacity:0;transition:opacity var(--pe-transition)}.ParticleEditor-module_systemItem__y-cTZ:hover .ParticleEditor-module_systemItemActions__Dc1Bw{opacity:1}.ParticleEditor-module_systemItemActions__Dc1Bw button{align-items:center;background:transparent;border:none;color:var(--pe-text-muted);cursor:pointer;display:flex;font-size:11px;height:20px;justify-content:center;width:20px}.ParticleEditor-module_systemItemActions__Dc1Bw button:hover:not(:disabled){color:var(--pe-text-primary)}.ParticleEditor-module_systemItemActions__Dc1Bw button:disabled{cursor:not-allowed;opacity:.3}.ParticleEditor-module_renameInput__jUWw2{background-color:var(--pe-bg-primary);border:1px solid var(--pe-accent);border-radius:var(--pe-radius);color:var(--pe-text-primary);font-size:12px;outline:none;padding:var(--nice-space-0-5,2px) var(--nice-space-1-5,6px);width:100%}.ParticleEditor-module_inspector__qP8Gq{background-color:var(--pe-bg-secondary);border-left:1px solid var(--pe-border-color);display:flex;flex-direction:column;min-width:280px;overflow:hidden;width:320px}.ParticleEditor-module_inspectorHeader__l6Uxn{border-bottom:1px solid var(--pe-border-color);font-size:13px;font-weight:600;overflow:hidden;padding:var(--nice-space-2-5,10px) var(--nice-space-3,12px);text-overflow:ellipsis;white-space:nowrap}.ParticleEditor-module_inspectorModules__pTVRa{flex:1;overflow-y:auto}.ParticleEditor-module_emptyInspector__JYoth{align-items:center;color:var(--pe-text-muted);display:flex;font-style:italic;height:100%;justify-content:center}.ParticleEditor-module_moduleSection__dQhZv{border-bottom:1px solid var(--pe-border-color)}.ParticleEditor-module_moduleHeader__u-Jjw{align-items:center;cursor:pointer;display:flex;gap:var(--nice-space-1-5,6px);padding:var(--nice-space-2,8px) var(--nice-space-3,12px);transition:background-color var(--pe-transition)}.ParticleEditor-module_moduleHeader__u-Jjw:hover{background-color:var(--pe-bg-hover)}.ParticleEditor-module_moduleHeader__u-Jjw.ParticleEditor-module_selected__wzmRZ{background-color:var(--pe-bg-tertiary)}.ParticleEditor-module_moduleIcon__iVDB-{color:var(--pe-text-muted);font-size:10px;width:12px}.ParticleEditor-module_moduleCheckbox__0B4Md{accent-color:var(--pe-accent);cursor:pointer;height:14px;margin:0;width:14px}.ParticleEditor-module_moduleName__m8AJX{flex:1;font-size:12px;font-weight:500}.ParticleEditor-module_moduleContent__pE2Ux{background-color:var(--pe-bg-tertiary);border-top:1px solid var(--pe-border-color);padding:var(--nice-space-2,8px) var(--nice-space-3,12px)}.ParticleEditor-module_moduleNotImplemented__NZDCG{color:var(--pe-text-muted);font-size:11px;font-style:italic;padding:var(--nice-space-3,12px);text-align:center}.ParticleEditor-module_propertyRow__TzuYo{align-items:center;display:flex;gap:var(--nice-space-2,8px);margin-bottom:var(--nice-space-2,8px)}.ParticleEditor-module_propertyRow__TzuYo:last-child{margin-bottom:0}.ParticleEditor-module_propertyRow__TzuYo>label{color:var(--pe-text-secondary);flex:0 0 100px;font-size:11px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ParticleEditor-module_numberInput__cKItO{background-color:var(--pe-bg-primary);border:1px solid var(--pe-border-color);border-radius:var(--pe-radius);color:var(--pe-text-primary);flex:1;font-family:monospace;font-size:11px;height:24px;min-width:50px;padding:0 var(--nice-space-1-5,6px)}.ParticleEditor-module_numberInput__cKItO:focus{border-color:var(--pe-accent);outline:none}.ParticleEditor-module_selectInput__RhZly{background-color:var(--pe-bg-primary);border:1px solid var(--pe-border-color);border-radius:var(--pe-radius);color:var(--pe-text-primary);cursor:pointer;flex:1;font-size:11px;height:24px;padding:0 var(--nice-space-1-5,6px)}.ParticleEditor-module_selectInput__RhZly:focus{border-color:var(--pe-accent);outline:none}.ParticleEditor-module_toggleInput__seU4y{accent-color:var(--pe-accent);cursor:pointer;height:16px;width:16px}.ParticleEditor-module_distributionInput__M5ciH{align-items:center;display:flex;flex:1;gap:var(--nice-space-1,4px)}.ParticleEditor-module_distributionType__NTuwm{background-color:var(--pe-bg-primary);border:1px solid var(--pe-border-color);border-radius:var(--pe-radius);color:var(--pe-text-primary);cursor:pointer;font-size:11px;height:24px;padding:0 var(--nice-space-1,4px);width:80px}.ParticleEditor-module_addButton__nSODD{background-color:var(--pe-accent);border:none;border-radius:var(--pe-radius);color:#fff;cursor:pointer;font-size:11px;padding:var(--nice-space-1,4px) var(--nice-space-3,12px);transition:background-color var(--pe-transition)}.ParticleEditor-module_addButton__nSODD:hover{background-color:var(--pe-accent-hover)}.ParticleEditor-module_previewPanel__sCCsm{align-items:center;background-color:var(--pe-bg-primary);display:flex;flex:1;justify-content:center;min-width:200px}.ParticleEditor-module_previewCanvas__b8PcH{background-color:var(--nice-bg,#1a1a1a);border-radius:var(--pe-radius)}.ParticleEditor-module_particleEditor__HiTCi ::-webkit-scrollbar{height:8px;width:8px}.ParticleEditor-module_particleEditor__HiTCi ::-webkit-scrollbar-track{background:var(--pe-bg-tertiary)}.ParticleEditor-module_particleEditor__HiTCi ::-webkit-scrollbar-thumb{background:var(--pe-border-color);border-radius:var(--nice-radius-sm,4px)}.ParticleEditor-module_particleEditor__HiTCi ::-webkit-scrollbar-thumb:hover{background:var(--pe-text-muted)}@media (max-width:900px){.ParticleEditor-module_systemList__Vaiea{min-width:200px;width:200px}.ParticleEditor-module_inspector__qP8Gq{min-width:220px;width:260px}.ParticleEditor-module_propertyRow__TzuYo>label{flex:0 0 80px}}@media (max-width:700px){.ParticleEditor-module_systemList__Vaiea{border-bottom:1px solid var(--pe-border-color);border-right:none;max-height:150px;min-width:unset;width:100%}.ParticleEditor-module_inspector__qP8Gq{border-left:none;border-top:1px solid var(--pe-border-color);min-width:unset;width:100%}}
|
|
@@ -300,7 +300,7 @@ function SystemListPanel({ systems, selectedId, onSelect, onAdd, onRemove, onDup
|
|
|
300
300
|
return (jsxRuntime.jsxs("div", { className: ParticleEditor_module.systemList, children: [jsxRuntime.jsxs("div", { className: ParticleEditor_module.systemListHeader, children: [jsxRuntime.jsx("span", { children: t('particleEditor.systems', 'Systems ({systems})').replace('{systems}', String(systems.length)) }), jsxRuntime.jsxs("div", { className: ParticleEditor_module.systemListActions, children: [jsxRuntime.jsx("button", { onClick: onAdd, title: t('particleEditor.newSystem', 'New System'), "aria-label": t('particleEditor.newSystem', 'New System'), children: jsxRuntime.jsx(ui.NiceIcon, { name: "plus", size: 14 }) }), jsxRuntime.jsx("button", { onClick: () => setShowPresets(!showPresets), title: t('particleEditor.addPreset', 'Add Preset'), "aria-label": t('particleEditor.addPreset', 'Add Preset'), children: jsxRuntime.jsx(ui.NiceIcon, { name: "clipboard", size: 14 }) })] })] }), showPresets && (jsxRuntime.jsx("div", { className: ParticleEditor_module.presetMenu, children: Object.keys(particleEditorUtils.PARTICLE_PRESETS).map((preset) => (jsxRuntime.jsx("button", { className: ParticleEditor_module.presetItem, onClick: () => {
|
|
301
301
|
onAddPreset(preset);
|
|
302
302
|
setShowPresets(false);
|
|
303
|
-
}, children: preset.charAt(0).toUpperCase() + preset.slice(1) }, preset))) })), jsxRuntime.jsx("div", { className: ParticleEditor_module.systemItems, children: systems.map((system) => (jsxRuntime.jsx("div", { className: `${ParticleEditor_module.systemItem} ${selectedId === system.id ? ParticleEditor_module.selected : ''}`, onClick: () => onSelect(system.id), children: editingId === system.id ? (jsxRuntime.jsx("input", { type: "text", value: editName, onChange: (e) => setEditName(e.target.value), onBlur: handleFinishRename, onKeyDown: (e) => e.key === 'Enter' && handleFinishRename(), autoFocus: true, className: ParticleEditor_module.renameInput })) : (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("span", { className: ParticleEditor_module.systemName, onDoubleClick: () => handleStartRename(system), children: system.name }), jsxRuntime.jsxs("div", { className: ParticleEditor_module.systemItemActions, children: [jsxRuntime.jsx("button", { onClick: (e) => {
|
|
303
|
+
}, children: preset.charAt(0).toUpperCase() + preset.slice(1) }, preset))) })), jsxRuntime.jsx("div", { className: ParticleEditor_module.systemItems, children: systems.map((system) => (jsxRuntime.jsx("div", { role: "button", tabIndex: 0, onKeyDown: ui.clickOnActivationKey, className: `${ParticleEditor_module.systemItem} ${selectedId === system.id ? ParticleEditor_module.selected : ''}`, onClick: () => onSelect(system.id), children: editingId === system.id ? (jsxRuntime.jsx("input", { type: "text", value: editName, onChange: (e) => setEditName(e.target.value), onBlur: handleFinishRename, onKeyDown: (e) => e.key === 'Enter' && handleFinishRename(), autoFocus: true, className: ParticleEditor_module.renameInput })) : (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("span", { className: ParticleEditor_module.systemName, onDoubleClick: () => handleStartRename(system), children: system.name }), jsxRuntime.jsxs("div", { className: ParticleEditor_module.systemItemActions, children: [jsxRuntime.jsx("button", { onClick: (e) => {
|
|
304
304
|
e.stopPropagation();
|
|
305
305
|
onDuplicate(system.id);
|
|
306
306
|
}, title: t('particleEditor.duplicate', 'Duplicate'), "aria-label": t('particleEditor.duplicate', 'Duplicate'), children: jsxRuntime.jsx(ui.NiceIcon, { name: "clipboard", size: 14 }) }), jsxRuntime.jsx("button", { onClick: (e) => {
|
|
@@ -350,7 +350,7 @@ function InspectorPanel({ system, expandedModules, selectedModule, onToggleModul
|
|
|
350
350
|
const current = system[key];
|
|
351
351
|
onUpdateSystem({ [key]: { ...current, enabled } });
|
|
352
352
|
};
|
|
353
|
-
return (jsxRuntime.jsxs("div", { className: ParticleEditor_module.inspector, children: [jsxRuntime.jsx("div", { className: ParticleEditor_module.inspectorHeader, children: jsxRuntime.jsx("span", { children: system.name }) }), jsxRuntime.jsx("div", { className: ParticleEditor_module.inspectorModules, children: modules.map((mod) => (jsxRuntime.jsxs("div", { className: ParticleEditor_module.moduleSection, children: [jsxRuntime.jsxs("div", { className: `${ParticleEditor_module.moduleHeader} ${selectedModule === mod.key ? ParticleEditor_module.selected : ''}`, onClick: () => onToggleModule(mod.key), children: [jsxRuntime.jsx("span", { className: ParticleEditor_module.moduleIcon, children: jsxRuntime.jsx(ui.NiceIcon, { name: expandedModules.includes(mod.key) ? 'chevron-down' : 'chevron-right', size: 14 }) }), mod.hasEnabled && (jsxRuntime.jsx("input", { type: "checkbox", checked: mod.enabled, onChange: (e) => {
|
|
353
|
+
return (jsxRuntime.jsxs("div", { className: ParticleEditor_module.inspector, children: [jsxRuntime.jsx("div", { className: ParticleEditor_module.inspectorHeader, children: jsxRuntime.jsx("span", { children: system.name }) }), jsxRuntime.jsx("div", { className: ParticleEditor_module.inspectorModules, children: modules.map((mod) => (jsxRuntime.jsxs("div", { className: ParticleEditor_module.moduleSection, children: [jsxRuntime.jsxs("div", { role: "button", tabIndex: 0, "aria-expanded": expandedModules.includes(mod.key), onKeyDown: ui.clickOnActivationKey, className: `${ParticleEditor_module.moduleHeader} ${selectedModule === mod.key ? ParticleEditor_module.selected : ''}`, onClick: () => onToggleModule(mod.key), children: [jsxRuntime.jsx("span", { className: ParticleEditor_module.moduleIcon, children: jsxRuntime.jsx(ui.NiceIcon, { name: expandedModules.includes(mod.key) ? 'chevron-down' : 'chevron-right', size: 14 }) }), mod.hasEnabled && (jsxRuntime.jsx("input", { type: "checkbox", checked: mod.enabled, onChange: (e) => {
|
|
354
354
|
e.stopPropagation();
|
|
355
355
|
handleModuleToggle(mod.key, e.target.checked);
|
|
356
356
|
}, className: ParticleEditor_module.moduleCheckbox })), jsxRuntime.jsx("span", { className: ParticleEditor_module.moduleName, children: particleEditorTypes.MODULE_NAMES[mod.key] || mod.key })] }), expandedModules.includes(mod.key) && (jsxRuntime.jsx("div", { className: ParticleEditor_module.moduleContent, children: jsxRuntime.jsx(ModuleEditor, { system: system, moduleKey: mod.key, onUpdate: onUpdateSystem }) }))] }, mod.key))) })] }));
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
|
-
import { NiceIcon, NiceButton, NiceTextInput } from '@nice2dev/ui';
|
|
2
|
+
import { NiceIcon, NiceButton, NiceTextInput, clickOnActivationKey } from '@nice2dev/ui';
|
|
3
3
|
import React from 'react';
|
|
4
4
|
import { useNiceTranslation } from '../core/i18n.js';
|
|
5
5
|
import styles from './ModelEditor.module.css.js';
|
|
@@ -32,10 +32,10 @@ const ModelEditorLeftPanel = /* @__PURE__ */ Object.assign(
|
|
|
32
32
|
: node.type === 'helper'
|
|
33
33
|
? 'hexagon'
|
|
34
34
|
: 'folder';
|
|
35
|
-
return (jsxs(React.Fragment, { children: [jsxs("div", { className: `${styles.treeItem} ${selectedId === node.id ? styles.treeItemActive : ''}`, style: { paddingLeft: depth * 16 + 4 }, onClick: () => selectObject(node), children: [hasChildren ? (jsx("span", { className: styles.treeToggle, onClick: (e) => {
|
|
35
|
+
return (jsxs(React.Fragment, { children: [jsxs("div", { role: "button", tabIndex: 0, onKeyDown: clickOnActivationKey, className: `${styles.treeItem} ${selectedId === node.id ? styles.treeItemActive : ''}`, style: { paddingLeft: depth * 16 + 4 }, onClick: () => selectObject(node), children: [hasChildren ? (jsx("span", { role: "button", tabIndex: 0, "aria-label": t(node.expanded ? 'controls.collapse' : 'controls.expand', node.expanded ? 'Collapse' : 'Expand'), onKeyDown: clickOnActivationKey, className: styles.treeToggle, onClick: (e) => {
|
|
36
36
|
e.stopPropagation();
|
|
37
37
|
toggleNodeExpanded(node);
|
|
38
|
-
}, children: jsx(NiceIcon, { name: node.expanded ? 'chevron-down' : 'chevron-right', size: 14 }) })) : (jsx("span", { className: styles.treeToggle })), jsx("span", { className: styles.treeIcon, children: jsx(NiceIcon, { name: icon, size: 14 }) }), jsx("span", { style: { flex: 1, overflow: 'hidden', textOverflow: 'ellipsis' }, children: node.name }), jsx("span", { className: styles.treeVisibility, onClick: (e) => {
|
|
38
|
+
}, children: jsx(NiceIcon, { name: node.expanded ? 'chevron-down' : 'chevron-right', size: 14 }) })) : (jsx("span", { className: styles.treeToggle })), jsx("span", { className: styles.treeIcon, children: jsx(NiceIcon, { name: icon, size: 14 }) }), jsx("span", { style: { flex: 1, overflow: 'hidden', textOverflow: 'ellipsis' }, children: node.name }), jsx("span", { role: "button", tabIndex: 0, "aria-label": t(node.visible ? 'hide' : 'show', node.visible ? 'Hide' : 'Show'), onKeyDown: clickOnActivationKey, className: styles.treeVisibility, onClick: (e) => {
|
|
39
39
|
e.stopPropagation();
|
|
40
40
|
toggleNodeVisibility(node);
|
|
41
41
|
}, children: jsx(NiceIcon, { name: node.visible ? 'eye' : 'eye-off', size: 14 }) })] }), node.expanded && node.children.map((c) => renderTreeNode(c, depth + 1))] }, node.id));
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
2
|
-
import { NiceSelect, NiceButton, NiceIcon, NiceCheckbox, NiceColorPicker } from '@nice2dev/ui';
|
|
2
|
+
import { NiceSelect, NiceButton, NiceIcon, clickOnActivationKey, NiceCheckbox, NiceColorPicker } from '@nice2dev/ui';
|
|
3
3
|
import React from 'react';
|
|
4
4
|
import { useNiceTranslation } from '../core/i18n.js';
|
|
5
5
|
import styles from './ModelEditor.module.css.js';
|
|
@@ -26,7 +26,7 @@ const ModelEditorMenuBar = /* @__PURE__ */ Object.assign(
|
|
|
26
26
|
'octahedron',
|
|
27
27
|
'tetrahedron',
|
|
28
28
|
'torusKnot',
|
|
29
|
-
].map((t) => (jsx("div", { 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", { 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", { className: styles.dropdownItem, onClick: addCameraObject, children: [jsx(NiceIcon, { name: "camera", size: 14 }), " ", t('modelEditorMenuBar.camera', 'Camera')] }), jsxs("div", { 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) })] })] }));
|
|
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
30
|
}), { displayName: 'ModelEditorMenuBar' });
|
|
31
31
|
|
|
32
32
|
export { ModelEditorMenuBar as default };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
-
import { NiceTextInput, NiceColorPicker, NiceSlider, NiceSelect } from '@nice2dev/ui';
|
|
2
|
+
import { NiceTextInput, clickOnActivationKey, NiceColorPicker, NiceSlider, NiceSelect } from '@nice2dev/ui';
|
|
3
3
|
import { useState } from 'react';
|
|
4
4
|
import * as THREE from 'three';
|
|
5
5
|
import { useNiceTranslation } from '../core/i18n.js';
|
|
@@ -58,7 +58,7 @@ const MaterialCard = ({ material, active, onClick, onUpdate }) => {
|
|
|
58
58
|
mat.needsUpdate = true;
|
|
59
59
|
onUpdate();
|
|
60
60
|
};
|
|
61
|
-
return (jsxs("div", { className: `${styles.materialCard} ${active ? styles.materialCardActive : ''}`, onClick: onClick, children: [jsx("div", { className: styles.materialHeader, children: jsx("span", { className: styles.materialName, children: mat.name || mat.type }) }), hasColor && (jsxs("div", { className: styles.propRow, children: [jsx("span", { className: styles.propLabel, children: t('modelEditorSubComponents.color', 'Color') }), jsx(NiceColorPicker, { value: `#${mat.color.getHexString()}`, onChange: (c) => setColor(c) }), jsxs("span", { style: { fontSize: 10, color: 'var(--nice-text-secondary, #888)' }, children: ["#", mat.color.getHexString()] })] })), hasMetalness && (jsxs("div", { className: styles.propRow, children: [jsx("span", { className: styles.propLabel, children: t('modelEditorSubComponents.metal', 'Metal') }), jsx(NiceSlider, { min: 0, max: 1, step: 0.01, value: mat.metalness, onChange: (val) => setNum('metalness', val), style: { flex: 1 } }), jsx("span", { style: {
|
|
61
|
+
return (jsxs("div", { role: "button", tabIndex: 0, onKeyDown: clickOnActivationKey, className: `${styles.materialCard} ${active ? styles.materialCardActive : ''}`, onClick: onClick, children: [jsx("div", { className: styles.materialHeader, children: jsx("span", { className: styles.materialName, children: mat.name || mat.type }) }), hasColor && (jsxs("div", { className: styles.propRow, children: [jsx("span", { className: styles.propLabel, children: t('modelEditorSubComponents.color', 'Color') }), jsx(NiceColorPicker, { value: `#${mat.color.getHexString()}`, onChange: (c) => setColor(c) }), jsxs("span", { style: { fontSize: 10, color: 'var(--nice-text-secondary, #888)' }, children: ["#", mat.color.getHexString()] })] })), hasMetalness && (jsxs("div", { className: styles.propRow, children: [jsx("span", { className: styles.propLabel, children: t('modelEditorSubComponents.metal', 'Metal') }), jsx(NiceSlider, { min: 0, max: 1, step: 0.01, value: mat.metalness, onChange: (val) => setNum('metalness', val), style: { flex: 1 } }), jsx("span", { style: {
|
|
62
62
|
fontSize: 9,
|
|
63
63
|
color: 'var(--nice-text-secondary, #888)',
|
|
64
64
|
width: 28,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
-
import { NiceIcon, NiceButton, NiceSlider } from '@nice2dev/ui';
|
|
2
|
+
import { NiceIcon, clickOnActivationKey, NiceButton, NiceSlider } from '@nice2dev/ui';
|
|
3
3
|
import React from 'react';
|
|
4
4
|
import { useNiceTranslation } from '../core/i18n.js';
|
|
5
5
|
import styles from './ModelEditor.module.css.js';
|
|
@@ -9,16 +9,16 @@ const ModelEditorTimeline = /* @__PURE__ */ Object.assign(
|
|
|
9
9
|
/* @__PURE__ */ React.memo(({ api }) => {
|
|
10
10
|
const { t } = useNiceTranslation();
|
|
11
11
|
const { bottomCollapsed, setBottomCollapsed, animations, activeAnimIdx, isPlaying, animTime, animDuration, animSpeed, setAnimSpeed, loopAnim, setLoopAnim, seekAnim, togglePlay, stopAnim, playClip, mergeInputRef, } = api;
|
|
12
|
-
return (jsxs("div", { className: `${styles.bottomPanel} ${bottomCollapsed ? styles.bottomPanelCollapsed : ''}`, children: [jsxs("div", { className: styles.bottomPanelHeader, children: [jsx("span", { className: styles.bottomToggle, onClick: () => setBottomCollapsed((c) => !c), children: jsx(NiceIcon, { name: bottomCollapsed ? 'chevron-right' : 'chevron-down', size: 14 }) }), jsx("span", { className: styles.bottomPanelTitle, onClick: () => setBottomCollapsed((c) => !c), children: animations.length !== 1
|
|
12
|
+
return (jsxs("div", { className: `${styles.bottomPanel} ${bottomCollapsed ? styles.bottomPanelCollapsed : ''}`, children: [jsxs("div", { className: styles.bottomPanelHeader, children: [jsx("span", { role: "presentation", className: styles.bottomToggle, onClick: () => setBottomCollapsed((c) => !c), children: jsx(NiceIcon, { name: bottomCollapsed ? 'chevron-right' : 'chevron-down', size: 14 }) }), jsx("span", { role: "button", tabIndex: 0, "aria-expanded": !bottomCollapsed, onKeyDown: clickOnActivationKey, className: styles.bottomPanelTitle, onClick: () => setBottomCollapsed((c) => !c), children: animations.length !== 1
|
|
13
13
|
? t('modelEditorTimeline.animationClipsMany', 'Animation ({animations} clips)').replace('{animations}', String(animations.length))
|
|
14
|
-
: t('modelEditorTimeline.animationClipsOne', 'Animation ({animations} clip)').replace('{animations}', String(animations.length)) }), jsx("div", { className: styles.menuSep }), jsxs("div", { className: styles.transportBar, children: [jsx(NiceButton, { className: styles.transportBtn, variant: "ghost", size: "sm", onClick: () => seekAnim(0), title: t('modelEditorTimeline.goToStart', 'Go to start'), "aria-label": t('modelEditorTimeline.goToStart', 'Go to start'), children: jsx(NiceIcon, { name: "chevron-left", size: 16 }) }), jsx(NiceButton, { className: styles.transportBtn, variant: isPlaying ? 'primary' : 'ghost', size: "sm", onClick: togglePlay, title: t('modelEditorTimeline.playPauseSpace', 'Play/Pause (Space)'), "aria-label": t('modelEditorTimeline.playPauseSpace', 'Play/Pause (Space)'), children: jsx(NiceIcon, { name: isPlaying ? 'pause' : 'play', size: 16 }) }), jsx(NiceButton, { className: styles.transportBtn, variant: "ghost", size: "sm", onClick: stopAnim, title: t('modelEditorTimeline.stop', 'Stop'), "aria-label": t('modelEditorTimeline.stop', 'Stop'), children: jsx(NiceIcon, { name: "stop", size: 16 }) }), jsx(NiceButton, { className: styles.transportBtn, variant: loopAnim ? 'primary' : 'ghost', size: "sm", onClick: () => setLoopAnim((v) => !v), title: t('modelEditorTimeline.loop', 'Loop'), "aria-label": t('modelEditorTimeline.loop', 'Loop'), children: jsx(NiceIcon, { name: "refresh", size: 16 }) })] }), jsxs("span", { className: styles.transportTime, children: [fmtTime(animTime), " / ", fmtTime(animDuration)] }), jsx("div", { className: styles.menuSep }), jsx("label", { className: styles.menuLabel, children: t('modelEditorTimeline.speed', 'Speed') }), jsx(NiceSlider, { min: 0.1, max: 3, step: 0.1, value: animSpeed, onChange: (val) => setAnimSpeed(val), style: { width: 60 } }), jsxs("span", { className: styles.menuLabel, children: [animSpeed.toFixed(1), "\u00D7"] })] }), !bottomCollapsed && (jsxs("div", { className: styles.animListArea, children: [jsxs("div", { className: styles.animList, children: [animations.length === 0 && (jsx("div", { style: { color: 'var(--nice-text-secondary, #666)', fontSize: 10, padding: 8 }, children: t('modelEditorTimeline.noAnimationsLoaded', 'No animations loaded') })), animations.map((anim, i) => (jsxs("div", { className: `${styles.animItem} ${i === activeAnimIdx ? styles.animItemActive : ''}`, onClick: () => playClip(i), children: [jsx("span", { children: anim.name }), jsxs("span", { className: styles.animDuration, children: [anim.duration.toFixed(1), "s"] })] }, `${anim.name}-${i}`))), jsx("div", { style: { padding: '4px 8px' }, children: jsx(NiceButton, { className: styles.btnSecondary, variant: "ghost", size: "sm", style: { width: '100%', fontSize: 10 }, onClick: () => { var _a; return (_a = mergeInputRef.current) === null || _a === void 0 ? void 0 : _a.click(); }, children: t('modelEditorTimeline.addAnimationFile', '+ Add Animation File') }) })] }), jsxs("div", { className: styles.timelineArea, children: [jsxs("div", { className: styles.timelineRuler, children: [animDuration > 0 &&
|
|
14
|
+
: t('modelEditorTimeline.animationClipsOne', 'Animation ({animations} clip)').replace('{animations}', String(animations.length)) }), jsx("div", { className: styles.menuSep }), jsxs("div", { className: styles.transportBar, children: [jsx(NiceButton, { className: styles.transportBtn, variant: "ghost", size: "sm", onClick: () => seekAnim(0), title: t('modelEditorTimeline.goToStart', 'Go to start'), "aria-label": t('modelEditorTimeline.goToStart', 'Go to start'), children: jsx(NiceIcon, { name: "chevron-left", size: 16 }) }), jsx(NiceButton, { className: styles.transportBtn, variant: isPlaying ? 'primary' : 'ghost', size: "sm", onClick: togglePlay, title: t('modelEditorTimeline.playPauseSpace', 'Play/Pause (Space)'), "aria-label": t('modelEditorTimeline.playPauseSpace', 'Play/Pause (Space)'), children: jsx(NiceIcon, { name: isPlaying ? 'pause' : 'play', size: 16 }) }), jsx(NiceButton, { className: styles.transportBtn, variant: "ghost", size: "sm", onClick: stopAnim, title: t('modelEditorTimeline.stop', 'Stop'), "aria-label": t('modelEditorTimeline.stop', 'Stop'), children: jsx(NiceIcon, { name: "stop", size: 16 }) }), jsx(NiceButton, { className: styles.transportBtn, variant: loopAnim ? 'primary' : 'ghost', size: "sm", onClick: () => setLoopAnim((v) => !v), title: t('modelEditorTimeline.loop', 'Loop'), "aria-label": t('modelEditorTimeline.loop', 'Loop'), children: jsx(NiceIcon, { name: "refresh", size: 16 }) })] }), jsxs("span", { className: styles.transportTime, children: [fmtTime(animTime), " / ", fmtTime(animDuration)] }), jsx("div", { className: styles.menuSep }), jsx("label", { className: styles.menuLabel, children: t('modelEditorTimeline.speed', 'Speed') }), jsx(NiceSlider, { min: 0.1, max: 3, step: 0.1, value: animSpeed, onChange: (val) => setAnimSpeed(val), style: { width: 60 } }), jsxs("span", { className: styles.menuLabel, children: [animSpeed.toFixed(1), "\u00D7"] })] }), !bottomCollapsed && (jsxs("div", { className: styles.animListArea, children: [jsxs("div", { className: styles.animList, children: [animations.length === 0 && (jsx("div", { style: { color: 'var(--nice-text-secondary, #666)', fontSize: 10, padding: 8 }, children: t('modelEditorTimeline.noAnimationsLoaded', 'No animations loaded') })), animations.map((anim, i) => (jsxs("div", { role: "button", tabIndex: 0, onKeyDown: clickOnActivationKey, className: `${styles.animItem} ${i === activeAnimIdx ? styles.animItemActive : ''}`, onClick: () => playClip(i), children: [jsx("span", { children: anim.name }), jsxs("span", { className: styles.animDuration, children: [anim.duration.toFixed(1), "s"] })] }, `${anim.name}-${i}`))), jsx("div", { style: { padding: '4px 8px' }, children: jsx(NiceButton, { className: styles.btnSecondary, variant: "ghost", size: "sm", style: { width: '100%', fontSize: 10 }, onClick: () => { var _a; return (_a = mergeInputRef.current) === null || _a === void 0 ? void 0 : _a.click(); }, children: t('modelEditorTimeline.addAnimationFile', '+ Add Animation File') }) })] }), jsxs("div", { className: styles.timelineArea, children: [jsxs("div", { className: styles.timelineRuler, children: [animDuration > 0 &&
|
|
15
15
|
Array.from({ length: Math.ceil(animDuration) + 1 }, (_, i) => {
|
|
16
16
|
const pct = (i / animDuration) * 100;
|
|
17
17
|
return (jsxs(React.Fragment, { children: [jsx("div", { className: styles.rulerTick, style: { left: `${pct}%` } }), jsxs("span", { className: styles.rulerLabel, style: { left: `${pct}%` }, children: [i, "s"] })] }, i));
|
|
18
18
|
}), animDuration > 0 && (jsx("div", { className: styles.playhead, style: {
|
|
19
19
|
left: `${(animTime / animDuration) * 100}%`,
|
|
20
20
|
height: '100%',
|
|
21
|
-
}, children: jsx("div", { className: styles.playheadHandle }) }))] }), jsx("div", { className: styles.timelineTracks, style: { height: 140, cursor: 'pointer' }, onClick: (e) => {
|
|
21
|
+
}, children: jsx("div", { className: styles.playheadHandle }) }))] }), jsx("div", { role: "presentation", className: styles.timelineTracks, style: { height: 140, cursor: 'pointer' }, onClick: (e) => {
|
|
22
22
|
if (animDuration <= 0) {
|
|
23
23
|
return;
|
|
24
24
|
}
|