@nice2dev/ui-3d 1.2.0 → 1.2.2
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 +142 -0
- package/dist/cjs/core/editorAsk.js +48 -0
- package/dist/cjs/core/i18n.js +7 -3
- package/dist/cjs/dance/DanceScoreEngine.js +7 -0
- package/dist/cjs/dance/PoseDetector.js +4 -2
- package/dist/cjs/material/NiceMaterialEditor.js +8 -3
- package/dist/cjs/material/materialEditorTypes.js +1 -1
- package/dist/cjs/material/materialNodeDefinitions.js +14 -11
- package/dist/cjs/model/ModelEditor.js +9 -2
- package/dist/cjs/model/ModelEditorLeftPanel.js +10 -4
- package/dist/cjs/model/ModelEditorMenuBar.js +10 -8
- package/dist/cjs/model/ModelEditorRightPanel.js +28 -22
- package/dist/cjs/model/ModelEditorSubComponents.js +17 -9
- package/dist/cjs/model/ModelEditorTimeline.js +8 -4
- package/dist/cjs/model/ModelEditorToolbar.js +6 -4
- package/dist/cjs/model/ModelEditorViewport.js +19 -6
- package/dist/cjs/model/ModelViewer.js +9 -7
- package/dist/cjs/model/NiceArmatureEditor.js +9 -7
- package/dist/cjs/model/NiceMorphTargetEditor.js +7 -3
- package/dist/cjs/model/NiceOctree.js +9 -4
- package/dist/cjs/model/NicePhysicsSimulation.js +7 -5
- package/dist/cjs/model/NiceProceduralGeometry.js +6 -4
- package/dist/cjs/model/NiceTerrainEditor.js +9 -7
- package/dist/cjs/model/NiceWeightPainter.js +6 -4
- package/dist/cjs/model/NiceXRPreview.js +9 -4
- package/dist/cjs/model/useModelEditor.js +113 -87
- package/dist/cjs/model/useModelViewer.js +13 -6
- package/dist/cjs/nice2dev-ui-3d.css +1 -1
- package/dist/cjs/particle/NiceParticleEditor.js +23 -11
- package/dist/cjs/rendering/NiceCascadedShadows.js +3 -1
- package/dist/cjs/rendering/NiceRenderExport.js +9 -3
- package/dist/cjs/rendering/NiceSSAO.js +4 -1
- package/dist/cjs/rendering/NiceSSR.js +4 -1
- package/dist/cjs/rendering/NiceWebGPURenderer.js +5 -2
- package/dist/cjs/uv/NiceUVEditor.js +16 -12
- package/dist/cjs/uv/uvEditorTypes.js +1 -0
- package/dist/esm/core/editorAsk.js +45 -0
- package/dist/esm/core/i18n.js +8 -4
- package/dist/esm/dance/DanceScoreEngine.js +7 -0
- package/dist/esm/dance/PoseDetector.js +4 -2
- package/dist/esm/material/NiceMaterialEditor.js +8 -3
- package/dist/esm/material/materialEditorTypes.js +1 -1
- package/dist/esm/material/materialNodeDefinitions.js +14 -11
- package/dist/esm/model/ModelEditor.js +9 -2
- package/dist/esm/model/ModelEditorLeftPanel.js +10 -4
- package/dist/esm/model/ModelEditorMenuBar.js +10 -8
- package/dist/esm/model/ModelEditorRightPanel.js +28 -22
- package/dist/esm/model/ModelEditorSubComponents.js +17 -9
- package/dist/esm/model/ModelEditorTimeline.js +8 -4
- package/dist/esm/model/ModelEditorToolbar.js +6 -4
- package/dist/esm/model/ModelEditorViewport.js +19 -6
- package/dist/esm/model/ModelViewer.js +9 -7
- package/dist/esm/model/NiceArmatureEditor.js +9 -7
- package/dist/esm/model/NiceMorphTargetEditor.js +7 -3
- package/dist/esm/model/NiceOctree.js +9 -4
- package/dist/esm/model/NicePhysicsSimulation.js +7 -5
- package/dist/esm/model/NiceProceduralGeometry.js +6 -4
- package/dist/esm/model/NiceTerrainEditor.js +9 -7
- package/dist/esm/model/NiceWeightPainter.js +6 -4
- package/dist/esm/model/NiceXRPreview.js +9 -4
- package/dist/esm/model/useModelEditor.js +113 -87
- package/dist/esm/model/useModelViewer.js +13 -6
- package/dist/esm/nice2dev-ui-3d.css +1 -1
- package/dist/esm/particle/NiceParticleEditor.js +23 -11
- package/dist/esm/rendering/NiceCascadedShadows.js +3 -1
- package/dist/esm/rendering/NiceRenderExport.js +9 -3
- package/dist/esm/rendering/NiceSSAO.js +4 -1
- package/dist/esm/rendering/NiceSSR.js +4 -1
- package/dist/esm/rendering/NiceWebGPURenderer.js +5 -2
- package/dist/esm/uv/NiceUVEditor.js +16 -12
- package/dist/esm/uv/uvEditorTypes.js +1 -0
- package/dist/types/core/editorAsk.d.ts +26 -0
- package/dist/types/core/i18n.d.ts +1 -17
- package/dist/types/dance/DanceScoreEngine.d.ts +0 -6
- package/dist/types/model/useModelEditor.d.ts +3 -0
- package/package.json +3 -3
|
@@ -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:rgba(85,119,255,.85);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:#57f}.ModelViewer-module_dropZone__eNrPo{align-items:center;background:rgba(85,119,255,.15);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 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,6 +1,7 @@
|
|
|
1
1
|
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
2
2
|
import { NiceTutorialButton, resolveTutorial, NiceAppShell, resolveCssColor, NiceIcon } from '@nice2dev/ui';
|
|
3
3
|
import { useRef, useMemo, useEffect, useReducer, useState } from 'react';
|
|
4
|
+
import { useNiceTranslation } from '../core/i18n.js';
|
|
4
5
|
import styles from './ParticleEditor.module.css.js';
|
|
5
6
|
import { MODULE_NAMES, BLEND_MODE_NAMES, RENDER_MODE_NAMES, EMITTER_SHAPE_NAMES } from './particleEditorTypes.js';
|
|
6
7
|
import { applyPreset, createDefaultSystem, PARTICLE_PRESETS, importSystemsFromJSON, exportSystemsToJSON, cloneSystem } from './particleEditorUtils.js';
|
|
@@ -280,6 +281,7 @@ function useParticleEditor(initialSystems) {
|
|
|
280
281
|
return { state, dispatch };
|
|
281
282
|
}
|
|
282
283
|
function SystemListPanel({ systems, selectedId, onSelect, onAdd, onRemove, onDuplicate, onRename, onAddPreset, }) {
|
|
284
|
+
const { t } = useNiceTranslation();
|
|
283
285
|
const [editingId, setEditingId] = useState(null);
|
|
284
286
|
const [editName, setEditName] = useState('');
|
|
285
287
|
const [showPresets, setShowPresets] = useState(false);
|
|
@@ -293,20 +295,21 @@ function SystemListPanel({ systems, selectedId, onSelect, onAdd, onRemove, onDup
|
|
|
293
295
|
}
|
|
294
296
|
setEditingId(null);
|
|
295
297
|
};
|
|
296
|
-
return (jsxs("div", { className: styles.systemList, children: [jsxs("div", { className: styles.systemListHeader, children: [
|
|
298
|
+
return (jsxs("div", { className: styles.systemList, children: [jsxs("div", { className: styles.systemListHeader, children: [jsx("span", { children: t('particleEditor.systems', 'Systems ({systems})').replace('{systems}', String(systems.length)) }), jsxs("div", { className: styles.systemListActions, children: [jsx("button", { onClick: onAdd, title: t('particleEditor.newSystem', 'New System'), "aria-label": t('particleEditor.newSystem', 'New System'), children: jsx(NiceIcon, { name: "plus", size: 14 }) }), jsx("button", { onClick: () => setShowPresets(!showPresets), title: t('particleEditor.addPreset', 'Add Preset'), "aria-label": t('particleEditor.addPreset', 'Add Preset'), children: jsx(NiceIcon, { name: "clipboard", size: 14 }) })] })] }), showPresets && (jsx("div", { className: styles.presetMenu, children: Object.keys(PARTICLE_PRESETS).map((preset) => (jsx("button", { className: styles.presetItem, onClick: () => {
|
|
297
299
|
onAddPreset(preset);
|
|
298
300
|
setShowPresets(false);
|
|
299
301
|
}, children: preset.charAt(0).toUpperCase() + preset.slice(1) }, preset))) })), jsx("div", { className: styles.systemItems, children: systems.map((system) => (jsx("div", { className: `${styles.systemItem} ${selectedId === system.id ? styles.selected : ''}`, onClick: () => onSelect(system.id), children: editingId === system.id ? (jsx("input", { type: "text", value: editName, onChange: (e) => setEditName(e.target.value), onBlur: handleFinishRename, onKeyDown: (e) => e.key === 'Enter' && handleFinishRename(), autoFocus: true, className: styles.renameInput })) : (jsxs(Fragment, { children: [jsx("span", { className: styles.systemName, onDoubleClick: () => handleStartRename(system), children: system.name }), jsxs("div", { className: styles.systemItemActions, children: [jsx("button", { onClick: (e) => {
|
|
300
302
|
e.stopPropagation();
|
|
301
303
|
onDuplicate(system.id);
|
|
302
|
-
}, title:
|
|
304
|
+
}, title: t('particleEditor.duplicate', 'Duplicate'), "aria-label": t('particleEditor.duplicate', 'Duplicate'), children: jsx(NiceIcon, { name: "clipboard", size: 14 }) }), jsx("button", { onClick: (e) => {
|
|
303
305
|
e.stopPropagation();
|
|
304
306
|
onRemove(system.id);
|
|
305
|
-
}, title:
|
|
307
|
+
}, title: t('particleEditor.remove', 'Remove'), "aria-label": t('particleEditor.remove', 'Remove'), disabled: systems.length <= 1, children: jsx(NiceIcon, { name: "trash", size: 14 }) })] })] })) }, system.id))) })] }));
|
|
306
308
|
}
|
|
307
309
|
function InspectorPanel({ system, expandedModules, selectedModule, onToggleModule, onSelectModule: _onSelectModule, onUpdateSystem, }) {
|
|
310
|
+
const { t } = useNiceTranslation();
|
|
308
311
|
if (!system) {
|
|
309
|
-
return (jsx("div", { className: styles.inspector, children: jsx("div", { className: styles.emptyInspector, children:
|
|
312
|
+
return (jsx("div", { className: styles.inspector, children: jsx("div", { className: styles.emptyInspector, children: t('particleEditor.noSystemSelected', 'No system selected') }) }));
|
|
310
313
|
}
|
|
311
314
|
const modules = [
|
|
312
315
|
{ key: 'main', hasEnabled: false },
|
|
@@ -351,6 +354,7 @@ function InspectorPanel({ system, expandedModules, selectedModule, onToggleModul
|
|
|
351
354
|
}, className: styles.moduleCheckbox })), jsx("span", { className: styles.moduleName, children: MODULE_NAMES[mod.key] || mod.key })] }), expandedModules.includes(mod.key) && (jsx("div", { className: styles.moduleContent, children: jsx(ModuleEditor, { system: system, moduleKey: mod.key, onUpdate: onUpdateSystem }) }))] }, mod.key))) })] }));
|
|
352
355
|
}
|
|
353
356
|
function ModuleEditor({ system, moduleKey, onUpdate }) {
|
|
357
|
+
const { t } = useNiceTranslation();
|
|
354
358
|
const renderDistributionInput = (label, value, onChange) => (jsxs("div", { className: styles.propertyRow, children: [jsx("label", { children: label }), jsxs("div", { className: styles.distributionInput, children: [jsxs("select", { value: value.type, onChange: (e) => {
|
|
355
359
|
const newType = e.target.value;
|
|
356
360
|
if (newType === 'constant') {
|
|
@@ -368,7 +372,7 @@ function ModuleEditor({ system, moduleKey, onUpdate }) {
|
|
|
368
372
|
],
|
|
369
373
|
});
|
|
370
374
|
}
|
|
371
|
-
}, className: styles.distributionType, children: [jsx("option", { value: "constant", children:
|
|
375
|
+
}, className: styles.distributionType, children: [jsx("option", { value: "constant", children: t('particleEditor.constant', 'Constant') }), jsx("option", { value: "random", children: t('particleEditor.random', 'Random') }), jsx("option", { value: "curve", children: t('particleEditor.curve', 'Curve') })] }), value.type === 'constant' && (jsx("input", { type: "number", value: value.value, onChange: (e) => onChange({ ...value, value: parseFloat(e.target.value) || 0 }), className: styles.numberInput })), value.type === 'random' && (jsxs(Fragment, { children: [jsx("input", { type: "number", value: value.min, onChange: (e) => onChange({ ...value, min: parseFloat(e.target.value) || 0 }), className: styles.numberInput, placeholder: t('particleEditor.min', 'Min') }), jsx("input", { type: "number", value: value.max, onChange: (e) => onChange({ ...value, max: parseFloat(e.target.value) || 0 }), className: styles.numberInput, placeholder: t('particleEditor.max', 'Max') })] }))] })] }));
|
|
372
376
|
const renderNumberInput = (label, value, onChange, props) => (jsxs("div", { className: styles.propertyRow, children: [jsx("label", { children: label }), jsx("input", { type: "number", value: value, onChange: (e) => onChange(parseFloat(e.target.value) || 0), className: styles.numberInput, ...props })] }));
|
|
373
377
|
const renderToggle = (label, value, onChange) => (jsxs("div", { className: styles.propertyRow, children: [jsx("label", { children: label }), jsx("input", { type: "checkbox", checked: value, onChange: (e) => onChange(e.target.checked), className: styles.toggleInput })] }));
|
|
374
378
|
const renderSelect = (label, value, options, onChange) => (jsxs("div", { className: styles.propertyRow, children: [jsx("label", { children: label }), jsx("select", { value: value, onChange: (e) => onChange(e.target.value), className: styles.selectInput, children: Object.entries(options).map(([key, name]) => (jsx("option", { value: key, children: name }, key))) })] }));
|
|
@@ -379,7 +383,7 @@ function ModuleEditor({ system, moduleKey, onUpdate }) {
|
|
|
379
383
|
step: 0.1,
|
|
380
384
|
}), renderToggle('Looping', system.looping, (v) => onUpdate({ looping: v })), renderToggle('Prewarm', system.prewarm, (v) => onUpdate({ prewarm: v })), renderDistributionInput('Start Delay', system.startDelay, (v) => onUpdate({ startDelay: v })), renderDistributionInput('Start Lifetime', system.startLifetime, (v) => onUpdate({ startLifetime: v })), renderDistributionInput('Start Speed', system.startSpeed, (v) => onUpdate({ startSpeed: v })), renderDistributionInput('Start Size', system.startSize, (v) => onUpdate({ startSize: v })), renderDistributionInput('Start Rotation', system.startRotation, (v) => onUpdate({ startRotation: v })), renderDistributionInput('Gravity Modifier', system.gravityModifier, (v) => onUpdate({ gravityModifier: v })), renderSelect('Simulation Space', system.simulationSpace, { local: 'Local', world: 'World', custom: 'Custom' }, (v) => onUpdate({ simulationSpace: v })), renderNumberInput('Simulation Speed', system.simulationSpeed, (v) => onUpdate({ simulationSpeed: v }), { min: 0, step: 0.1 }), renderNumberInput('Max Particles', system.maxParticles, (v) => onUpdate({ maxParticles: v }), { min: 1, step: 1 })] }));
|
|
381
385
|
case 'emission':
|
|
382
|
-
return (jsxs(Fragment, { children: [renderDistributionInput('Rate over Time', system.emission.rateOverTime, (v) => onUpdate({ emission: { ...system.emission, rateOverTime: v } })), renderDistributionInput('Rate over Distance', system.emission.rateOverDistance, (v) => onUpdate({ emission: { ...system.emission, rateOverDistance: v } })), jsxs("div", { className: styles.propertyRow, children: [
|
|
386
|
+
return (jsxs(Fragment, { children: [renderDistributionInput('Rate over Time', system.emission.rateOverTime, (v) => onUpdate({ emission: { ...system.emission, rateOverTime: v } })), renderDistributionInput('Rate over Distance', system.emission.rateOverDistance, (v) => onUpdate({ emission: { ...system.emission, rateOverDistance: v } })), jsxs("div", { className: styles.propertyRow, children: [jsx("label", { children: t('particleEditor.bursts', 'Bursts ({bursts})').replace('{bursts}', String(system.emission.bursts.length)) }), jsx("button", { className: styles.addButton, onClick: () => onUpdate({
|
|
383
387
|
emission: {
|
|
384
388
|
...system.emission,
|
|
385
389
|
bursts: [
|
|
@@ -393,7 +397,7 @@ function ModuleEditor({ system, moduleKey, onUpdate }) {
|
|
|
393
397
|
},
|
|
394
398
|
],
|
|
395
399
|
},
|
|
396
|
-
}), children:
|
|
400
|
+
}), children: t('particleEditor.addBurst', 'Add Burst') })] })] }));
|
|
397
401
|
case 'shape':
|
|
398
402
|
return (jsxs(Fragment, { children: [renderSelect('Shape', system.shape.type, EMITTER_SHAPE_NAMES, (v) =>
|
|
399
403
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- writing into discriminated-union variant; runtime narrowed by `type`
|
|
@@ -421,11 +425,12 @@ function ModuleEditor({ system, moduleKey, onUpdate }) {
|
|
|
421
425
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any -- BLEND_MODE_NAMES is keyed by ParticleBlendMode but renderSelect is generic
|
|
422
426
|
BLEND_MODE_NAMES, (v) => onUpdate({ material: { ...system.material, blendMode: v } }))] }));
|
|
423
427
|
default:
|
|
424
|
-
return jsx("div", { className: styles.moduleNotImplemented, children:
|
|
428
|
+
return (jsx("div", { className: styles.moduleNotImplemented, children: t('particleEditor.moduleEditorNotYetImplemented', 'Module editor not yet implemented') }));
|
|
425
429
|
}
|
|
426
430
|
}
|
|
427
431
|
function Toolbar({ isPlaying, isPaused, playbackSpeed, currentTime, canUndo, canRedo, showGrid, showBounds, showEmitterShape, viewMode, onPlay, onPause, onStop, onRestart, onSpeedChange, onUndo, onRedo, onToggleGrid, onToggleBounds, onToggleEmitterShape, onViewModeChange, onNew, onExport, onImport, }) {
|
|
428
|
-
|
|
432
|
+
const { t } = useNiceTranslation();
|
|
433
|
+
return (jsxs("div", { className: styles.toolbar, children: [jsxs("div", { className: styles.toolbarGroup, children: [jsx("button", { onClick: onNew, title: t('particleEditor.newProject', 'New Project'), "aria-label": t('particleEditor.newProject', 'New Project'), children: jsx(NiceIcon, { name: "file", size: 16 }) }), jsx("button", { onClick: onImport, title: t('particleEditor.import', 'Import'), "aria-label": t('particleEditor.import', 'Import'), children: jsx(NiceIcon, { name: "folder", size: 16 }) }), jsx("button", { onClick: onExport, title: t('particleEditor.export', 'Export'), "aria-label": t('particleEditor.export', 'Export'), children: jsx(NiceIcon, { name: "save", size: 16 }) })] }), jsx("div", { className: styles.toolbarSeparator }), jsxs("div", { className: styles.toolbarGroup, children: [jsx("button", { onClick: onUndo, disabled: !canUndo, title: t('particleEditor.undo', 'Undo'), "aria-label": t('particleEditor.undo', 'Undo'), children: jsx(NiceIcon, { name: "arrow-left", size: 16 }) }), jsx("button", { onClick: onRedo, disabled: !canRedo, title: t('particleEditor.redo', 'Redo'), "aria-label": t('particleEditor.redo', 'Redo'), children: jsx(NiceIcon, { name: "arrow-right", size: 16 }) })] }), jsx("div", { className: styles.toolbarSeparator }), jsxs("div", { className: styles.toolbarGroup, children: [isPlaying && !isPaused ? (jsx("button", { onClick: onPause, title: t('particleEditor.pause', 'Pause'), "aria-label": t('particleEditor.pause', 'Pause'), children: jsx(NiceIcon, { name: "pause", size: 16 }) })) : (jsx("button", { onClick: onPlay, title: t('particleEditor.play', 'Play'), "aria-label": t('particleEditor.play', 'Play'), children: jsx(NiceIcon, { name: "play", size: 16 }) })), jsx("button", { onClick: onStop, title: t('particleEditor.stop', 'Stop'), "aria-label": t('particleEditor.stop', 'Stop'), children: jsx(NiceIcon, { name: "stop", size: 16 }) }), jsx("button", { onClick: onRestart, title: t('particleEditor.restart', 'Restart'), "aria-label": t('particleEditor.restart', 'Restart'), children: jsx(NiceIcon, { name: "refresh", size: 16 }) }), jsxs("select", { value: playbackSpeed, onChange: (e) => onSpeedChange(parseFloat(e.target.value)), className: styles.speedSelect, title: t('particleEditor.playbackSpeed', 'Playback Speed'), children: [jsx("option", { value: 0.25, children: "0.25x" }), jsx("option", { value: 0.5, children: "0.5x" }), jsx("option", { value: 1, children: "1x" }), jsx("option", { value: 2, children: "2x" }), jsx("option", { value: 4, children: "4x" })] }), jsxs("span", { className: styles.timeDisplay, children: [currentTime.toFixed(2), "s"] })] }), jsx("div", { className: styles.toolbarSeparator }), jsxs("div", { className: styles.toolbarGroup, children: [jsx("button", { onClick: onToggleGrid, className: showGrid ? styles.active : '', title: t('particleEditor.toggleGrid', 'Toggle Grid'), "aria-label": t('particleEditor.toggleGrid', 'Toggle Grid'), children: jsx(NiceIcon, { name: "hash", size: 16 }) }), jsx("button", { onClick: onToggleBounds, className: showBounds ? styles.active : '', title: t('particleEditor.toggleBounds', 'Toggle Bounds'), "aria-label": t('particleEditor.toggleBounds', 'Toggle Bounds'), children: jsx(NiceIcon, { name: "square", size: 16 }) }), jsx("button", { onClick: onToggleEmitterShape, className: showEmitterShape ? styles.active : '', title: t('particleEditor.toggleEmitterShape', 'Toggle Emitter Shape'), "aria-label": t('particleEditor.toggleEmitterShape', 'Toggle Emitter Shape'), children: jsx(NiceIcon, { name: "target", size: 16 }) })] }), jsx("div", { className: styles.toolbarSeparator }), jsx("div", { className: styles.toolbarGroup, children: ['3d', 'top', 'side', 'front'].map((mode) => (jsx("button", { onClick: () => onViewModeChange(mode), className: viewMode === mode ? styles.active : '', title: mode.toUpperCase(), children: mode === '3d' ? jsx(NiceIcon, { name: "video", size: 16 }) : mode.charAt(0).toUpperCase() }, mode))) })] }));
|
|
429
434
|
}
|
|
430
435
|
function PreviewPanel({ systems, isPlaying, isPaused, currentTime, showGrid, showEmitterShape, }) {
|
|
431
436
|
const canvasRef = useRef(null);
|
|
@@ -466,7 +471,7 @@ function PreviewPanel({ systems, isPlaying, isPaused, currentTime, showGrid, sho
|
|
|
466
471
|
}
|
|
467
472
|
// Draw emitter shape indicator
|
|
468
473
|
if (showEmitterShape && systems.length > 0) {
|
|
469
|
-
ctx.strokeStyle = 'rgba(0,200,255,0.5)';
|
|
474
|
+
ctx.strokeStyle = resolveCssColor('var(--nice-primary-tint-60, rgba(0,200,255,0.5))', ctx.canvas);
|
|
470
475
|
ctx.lineWidth = 2;
|
|
471
476
|
ctx.setLineDash([5, 5]);
|
|
472
477
|
ctx.beginPath();
|
|
@@ -539,7 +544,14 @@ function NiceParticleEditor({ systems: initialSystems, onSystemsChange, onPlay,
|
|
|
539
544
|
cancelAnimationFrame(animationFrameRef.current);
|
|
540
545
|
}
|
|
541
546
|
};
|
|
542
|
-
}, [
|
|
547
|
+
}, [
|
|
548
|
+
state.isPlaying,
|
|
549
|
+
state.isPaused,
|
|
550
|
+
state.playbackSpeed,
|
|
551
|
+
state.currentTime,
|
|
552
|
+
selectedSystem,
|
|
553
|
+
dispatch,
|
|
554
|
+
]);
|
|
543
555
|
// Export/Import handlers
|
|
544
556
|
const handleExport = () => {
|
|
545
557
|
const json = exportSystemsToJSON(state.systems);
|
|
@@ -2,6 +2,7 @@ import { jsxs, jsx } from 'react/jsx-runtime';
|
|
|
2
2
|
import { NiceIcon } from '@nice2dev/ui';
|
|
3
3
|
import { useEffect, useState, useRef, useCallback } from 'react';
|
|
4
4
|
import * as THREE from 'three';
|
|
5
|
+
import { useNiceTranslation } from '../core/i18n.js';
|
|
5
6
|
|
|
6
7
|
/* ── Cascade split calculation ── */
|
|
7
8
|
function computeCascadeSplits(cascadeCount, near, far, splitMode, lambda) {
|
|
@@ -245,13 +246,14 @@ function useCSM(scene, camera, configOverride) {
|
|
|
245
246
|
}
|
|
246
247
|
/* ── Component ── */
|
|
247
248
|
const NiceCascadedShadows = ({ scene, camera, config: configProp, showDebug: initialDebug, className = '', }) => {
|
|
249
|
+
const { t } = useNiceTranslation();
|
|
248
250
|
const { config, setConfig, cascadeSplits, showDebug, setShowDebug } = useCSM(scene, camera, configProp);
|
|
249
251
|
useEffect(() => {
|
|
250
252
|
if (initialDebug !== undefined) {
|
|
251
253
|
setShowDebug(initialDebug);
|
|
252
254
|
}
|
|
253
255
|
}, [initialDebug, setShowDebug]);
|
|
254
|
-
return (jsxs("div", { className: `nice-cascaded-shadows ${className}`, style: { display: 'grid', gap: 8, fontSize: 13 }, children: [jsxs("strong", { children: [jsx(NiceIcon, { name: "lightbulb", size: 14 }),
|
|
256
|
+
return (jsxs("div", { className: `nice-cascaded-shadows ${className}`, style: { display: 'grid', gap: 8, fontSize: 13 }, children: [jsxs("strong", { children: [jsx(NiceIcon, { name: "lightbulb", size: 14 }), ' ', t('cascadedShadows.cascadedShadowMaps', 'Cascaded Shadow Maps')] }), jsxs("label", { children: [t('cascadedShadows.cascades', 'Cascades: {cascadeCount}').replace('{cascadeCount}', String(config.cascadeCount)), jsx("input", { type: "range", min: 1, max: 5, value: config.cascadeCount, onChange: (e) => setConfig({ cascadeCount: parseInt(e.target.value, 10) }), style: { width: '100%' } })] }), jsxs("label", { children: [t('cascadedShadows.maxDistance', 'Max Distance: {maxFar}').replace('{maxFar}', String(config.maxFar)), jsx("input", { type: "range", min: 50, max: 1000, step: 10, value: config.maxFar, onChange: (e) => setConfig({ maxFar: parseInt(e.target.value, 10) }), style: { width: '100%' } })] }), jsxs("label", { children: [t('cascadedShadows.splitMode', 'Split Mode:'), jsxs("select", { value: config.splitMode, onChange: (e) => setConfig({ splitMode: e.target.value }), style: { width: '100%', marginTop: 2 }, children: [jsx("option", { value: "practical", children: t('cascadedShadows.practical', 'Practical') }), jsx("option", { value: "logarithmic", children: t('cascadedShadows.logarithmic', 'Logarithmic') }), jsx("option", { value: "linear", children: t('cascadedShadows.linear', 'Linear') })] })] }), config.splitMode === 'practical' && (jsxs("label", { children: [t('cascadedShadows.lambda', 'Lambda: {practicalSplitLambda}').replace('{practicalSplitLambda}', String(config.practicalSplitLambda.toFixed(2))), jsx("input", { type: "range", min: 0, max: 1, step: 0.05, value: config.practicalSplitLambda, onChange: (e) => setConfig({ practicalSplitLambda: parseFloat(e.target.value) }), style: { width: '100%' } })] })), jsxs("label", { children: [t('cascadedShadows.shadowMapSize', 'Shadow Map Size: {shadowMapSize}').replace('{shadowMapSize}', String(config.shadowMapSize)), jsxs("select", { value: config.shadowMapSize, onChange: (e) => setConfig({ shadowMapSize: parseInt(e.target.value, 10) }), style: { width: '100%', marginTop: 2 }, children: [jsx("option", { value: 512, children: "512" }), jsx("option", { value: 1024, children: "1024" }), jsx("option", { value: 2048, children: "2048" }), jsx("option", { value: 4096, children: "4096" })] })] }), jsx("div", { style: { fontSize: 10, opacity: 0.7 }, children: t('cascadedShadows.cascadeSplits', 'Cascade splits: {cascadeSplits}').replace('{cascadeSplits}', String(cascadeSplits.map((s) => s.toFixed(1)).join(' | '))) }), jsxs("label", { style: { display: 'flex', alignItems: 'center', gap: 6 }, children: [jsx("input", { type: "checkbox", checked: showDebug, onChange: (e) => setShowDebug(e.target.checked) }), t('cascadedShadows.showCascadeFrustums', 'Show cascade frustums')] })] }));
|
|
255
257
|
};
|
|
256
258
|
|
|
257
259
|
export { NiceCascadedShadows, useCSM };
|
|
@@ -2,6 +2,7 @@ import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
|
2
2
|
import { NiceIcon } from '@nice2dev/ui';
|
|
3
3
|
import { useState, useCallback } from 'react';
|
|
4
4
|
import * as THREE from 'three';
|
|
5
|
+
import { useNiceTranslation } from '../core/i18n.js';
|
|
5
6
|
|
|
6
7
|
/* ── EXR writer (minimal, uncompressed) ── */
|
|
7
8
|
function writeEXR(width, height, floatData) {
|
|
@@ -182,6 +183,7 @@ const DEFAULT_CONFIG = {
|
|
|
182
183
|
// resolves to nothing, so the exported frame needs the literal (cf. 344d1b2).
|
|
183
184
|
backgroundColor: '#000000',
|
|
184
185
|
backgroundMode: 'transparent',
|
|
186
|
+
// audit-allow: literal-color +2 — the default sky gradient of the rendered image
|
|
185
187
|
gradientTop: '#87CEEB',
|
|
186
188
|
gradientBottom: '#2E4057',
|
|
187
189
|
samples: 1,
|
|
@@ -296,6 +298,7 @@ function useRenderExport(renderer, scene, camera) {
|
|
|
296
298
|
}
|
|
297
299
|
/* ── Component ── */
|
|
298
300
|
const NiceRenderExport = ({ renderer, scene, camera, className = '', }) => {
|
|
301
|
+
const { t } = useNiceTranslation();
|
|
299
302
|
const { config, setConfig, render, isRendering, presetSizes } = useRenderExport(renderer, scene, camera);
|
|
300
303
|
const handleRender = async () => {
|
|
301
304
|
const blob = await render();
|
|
@@ -310,7 +313,7 @@ const NiceRenderExport = ({ renderer, scene, camera, className = '', }) => {
|
|
|
310
313
|
link.click();
|
|
311
314
|
URL.revokeObjectURL(url);
|
|
312
315
|
};
|
|
313
|
-
return (jsxs("div", { className: `nice-render-export ${className}`, style: { display: 'grid', gap: 8, fontSize: 13 }, children: [jsxs("strong", { children: [jsx(NiceIcon, { name: "camera", size: 14 }), " Render Export
|
|
316
|
+
return (jsxs("div", { className: `nice-render-export ${className}`, style: { display: 'grid', gap: 8, fontSize: 13 }, children: [jsxs("strong", { children: [jsx(NiceIcon, { name: "camera", size: 14 }), " ", t('renderExport.renderExport', 'Render Export')] }), jsx("div", { style: { display: 'flex', flexWrap: 'wrap', gap: 2 }, children: presetSizes.map((p) => (jsx("button", { type: "button", onClick: () => setConfig({ width: p.width, height: p.height }), style: {
|
|
314
317
|
padding: '2px 6px',
|
|
315
318
|
fontSize: 10,
|
|
316
319
|
cursor: 'pointer',
|
|
@@ -322,7 +325,7 @@ const NiceRenderExport = ({ renderer, scene, camera, className = '', }) => {
|
|
|
322
325
|
color: config.width === p.width && config.height === p.height
|
|
323
326
|
? 'var(--nice-color-white, #fff)'
|
|
324
327
|
: 'inherit',
|
|
325
|
-
}, children: p.label }, p.label))) }), jsxs("div", { style: { display: 'flex', gap: 4, alignItems: 'center' }, children: [jsx("input", { type: "number", value: config.width, min: 1, max: 8192, onChange: (e) => setConfig({ width: parseInt(e.target.value, 10) || 1 }), style: { width: 70, padding: '3px 6px' } }), jsx("span", { children: "\u00D7" }), jsx("input", { type: "number", value: config.height, min: 1, max: 8192, onChange: (e) => setConfig({ height: parseInt(e.target.value, 10) || 1 }), style: { width: 70, padding: '3px 6px' } })] }), jsxs("label", { children: [
|
|
328
|
+
}, children: p.label }, p.label))) }), jsxs("div", { style: { display: 'flex', gap: 4, alignItems: 'center' }, children: [jsx("input", { type: "number", value: config.width, min: 1, max: 8192, onChange: (e) => setConfig({ width: parseInt(e.target.value, 10) || 1 }), style: { width: 70, padding: '3px 6px' } }), jsx("span", { children: "\u00D7" }), jsx("input", { type: "number", value: config.height, min: 1, max: 8192, onChange: (e) => setConfig({ height: parseInt(e.target.value, 10) || 1 }), style: { width: 70, padding: '3px 6px' } })] }), jsxs("label", { children: [t('renderExport.format', 'Format:'), jsxs("select", { value: config.format, onChange: (e) => setConfig({ format: e.target.value }), style: { width: '100%', marginTop: 2 }, children: [jsx("option", { value: "png", children: t('renderExport.pngLosslessAlpha', 'PNG (lossless + alpha)') }), jsx("option", { value: "jpeg", children: t('renderExport.jpegLossyNoAlpha', 'JPEG (lossy, no alpha)') }), jsx("option", { value: "exr", children: t('renderExport.exrHdrFloat', 'EXR (HDR float)') })] })] }), jsxs("label", { children: [t('renderExport.background', 'Background:'), jsxs("select", { value: config.backgroundMode, onChange: (e) => setConfig({ backgroundMode: e.target.value }), style: { width: '100%', marginTop: 2 }, children: [jsx("option", { value: "transparent", children: t('renderExport.transparent', 'Transparent') }), jsx("option", { value: "color", children: t('renderExport.solidColor', 'Solid Color') }), jsx("option", { value: "scene", children: t('renderExport.sceneBackground', 'Scene Background') })] })] }), config.backgroundMode === 'color' && (jsxs("label", { style: { display: 'flex', alignItems: 'center', gap: 6 }, children: [t('renderExport.color', 'Color:'), jsx("input", { type: "color", value: config.backgroundColor, onChange: (e) => setConfig({ backgroundColor: e.target.value }) })] })), jsxs("label", { children: [t('renderExport.supersamplingX', 'Supersampling: {samples}x').replace('{samples}', String(config.samples)), jsxs("select", { value: config.samples, onChange: (e) => setConfig({ samples: parseInt(e.target.value, 10) }), style: { width: '100%', marginTop: 2 }, children: [jsx("option", { value: 1, children: t('renderExport.n1xNone', '1x (none)') }), jsx("option", { value: 2, children: "2x" }), jsx("option", { value: 4, children: t('renderExport.n4xBestQuality', '4x (best quality)') })] })] }), jsx("button", { type: "button", onClick: handleRender, disabled: isRendering, style: {
|
|
326
329
|
background: isRendering
|
|
327
330
|
? 'var(--nice-bg-tertiary, #94a3b8)'
|
|
328
331
|
: 'var(--nice-color-accent, #6366f1)',
|
|
@@ -331,7 +334,10 @@ const NiceRenderExport = ({ renderer, scene, camera, className = '', }) => {
|
|
|
331
334
|
borderRadius: 4,
|
|
332
335
|
padding: '8px 12px',
|
|
333
336
|
cursor: isRendering ? 'wait' : 'pointer',
|
|
334
|
-
}, children: isRendering ? (jsxs(Fragment, { children: [jsx(NiceIcon, { name: "clock", size: 14 }), " Rendering
|
|
337
|
+
}, children: isRendering ? (jsxs(Fragment, { children: [jsx(NiceIcon, { name: "clock", size: 14 }), " ", t('renderExport.rendering', 'Rendering…')] })) : (jsxs(Fragment, { children: [jsx(NiceIcon, { name: "camera", size: 14 }), ' ', t('renderExport.render', 'Render {width}×{height} {format}')
|
|
338
|
+
.replace('{width}', String(config.width))
|
|
339
|
+
.replace('{height}', String(config.height))
|
|
340
|
+
.replace('{format}', config.format.toUpperCase())] })) })] }));
|
|
335
341
|
};
|
|
336
342
|
|
|
337
343
|
export { NiceRenderExport, useRenderExport };
|
|
@@ -2,6 +2,7 @@ import { jsxs, jsx } from 'react/jsx-runtime';
|
|
|
2
2
|
import { NiceIcon } from '@nice2dev/ui';
|
|
3
3
|
import { useState, useRef, useCallback, useEffect } from 'react';
|
|
4
4
|
import * as THREE from 'three';
|
|
5
|
+
import { useNiceTranslation } from '../core/i18n.js';
|
|
5
6
|
|
|
6
7
|
/* ── SSAO Shaders ── */
|
|
7
8
|
const SSAO_VERTEX = `
|
|
@@ -280,6 +281,7 @@ function useSSAO(renderer, scene, camera, configOverride) {
|
|
|
280
281
|
blurMat.dispose();
|
|
281
282
|
ortho.remove(quad);
|
|
282
283
|
};
|
|
284
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps -- the uniforms' first values; the next effect updates them without rebuilding the render targets
|
|
283
285
|
}, [renderer, camera, config.resolution]);
|
|
284
286
|
// Update uniforms
|
|
285
287
|
useEffect(() => {
|
|
@@ -336,8 +338,9 @@ function useSSAO(renderer, scene, camera, configOverride) {
|
|
|
336
338
|
}
|
|
337
339
|
/* ── Component ── */
|
|
338
340
|
const NiceSSAO = ({ renderer, scene, camera, config: configProp, className = '', }) => {
|
|
341
|
+
const { t } = useNiceTranslation();
|
|
339
342
|
const { config, setConfig } = useSSAO(renderer, scene, camera, configProp);
|
|
340
|
-
return (jsxs("div", { className: `nice-ssao ${className}`, style: { display: 'grid', gap: 8, fontSize: 13 }, children: [jsxs("div", { style: { display: 'flex', justifyContent: 'space-between', alignItems: 'center' }, children: [jsxs("strong", { children: [jsx(NiceIcon, { name: "circle", size: 14 }), " Ambient Occlusion
|
|
343
|
+
return (jsxs("div", { className: `nice-ssao ${className}`, style: { display: 'grid', gap: 8, fontSize: 13 }, children: [jsxs("div", { style: { display: 'flex', justifyContent: 'space-between', alignItems: 'center' }, children: [jsxs("strong", { children: [jsx(NiceIcon, { name: "circle", size: 14 }), " ", t('ssao.ambientOcclusion', 'Ambient Occlusion')] }), jsxs("label", { style: { display: 'flex', alignItems: 'center', gap: 4, fontSize: 11 }, children: [jsx("input", { type: "checkbox", checked: config.enabled, onChange: (e) => setConfig({ enabled: e.target.checked }) }), t('ssao.enabled', 'Enabled')] })] }), jsxs("label", { children: [t('ssao.mode', 'Mode:'), jsxs("select", { value: config.mode, onChange: (e) => setConfig({ mode: e.target.value }), style: { width: '100%', marginTop: 2 }, children: [jsx("option", { value: "ssao", children: t('ssao.ssao', 'SSAO') }), jsx("option", { value: "hbao", children: t('ssao.hbao', 'HBAO') })] })] }), jsxs("label", { children: [t('ssao.samples', 'Samples: {samples}').replace('{samples}', String(config.samples)), jsx("input", { type: "range", min: 8, max: 128, step: 8, value: config.samples, onChange: (e) => setConfig({ samples: parseInt(e.target.value, 10) }), style: { width: '100%' } })] }), jsxs("label", { children: [t('ssao.radius', 'Radius: {radius}').replace('{radius}', String(config.radius.toFixed(2))), jsx("input", { type: "range", min: 0.1, max: 5, step: 0.1, value: config.radius, onChange: (e) => setConfig({ radius: parseFloat(e.target.value) }), style: { width: '100%' } })] }), jsxs("label", { children: [t('ssao.intensity', 'Intensity: {intensity}').replace('{intensity}', String(config.intensity.toFixed(2))), jsx("input", { type: "range", min: 0, max: 3, step: 0.1, value: config.intensity, onChange: (e) => setConfig({ intensity: parseFloat(e.target.value) }), style: { width: '100%' } })] }), jsxs("label", { children: [t('ssao.bias', 'Bias: {bias}').replace('{bias}', String(config.bias.toFixed(3))), jsx("input", { type: "range", min: 0.001, max: 0.1, step: 0.001, value: config.bias, onChange: (e) => setConfig({ bias: parseFloat(e.target.value) }), style: { width: '100%' } })] }), jsxs("label", { children: [t('ssao.resolution', 'Resolution: {resolution}').replace('{resolution}', String(config.resolution.toFixed(2))), jsx("input", { type: "range", min: 0.25, max: 1, step: 0.25, value: config.resolution, onChange: (e) => setConfig({ resolution: parseFloat(e.target.value) }), style: { width: '100%' } })] }), jsxs("label", { style: { display: 'flex', alignItems: 'center', gap: 6 }, children: [jsx("input", { type: "checkbox", checked: config.blurEnabled, onChange: (e) => setConfig({ blurEnabled: e.target.checked }) }), t('ssao.bilateralBlurSize', 'Bilateral Blur (size: {blurSize})').replace('{blurSize}', String(config.blurSize))] })] }));
|
|
341
344
|
};
|
|
342
345
|
|
|
343
346
|
export { NiceSSAO, useSSAO };
|