@nice2dev/ui-3d 1.2.1 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/CHANGELOG.md +415 -0
  2. package/dist/cjs/material/NiceMaterialEditor.js +1 -0
  3. package/dist/cjs/model/ModelEditor.js +7 -1
  4. package/dist/cjs/model/ModelEditorLeftPanel.js +2 -2
  5. package/dist/cjs/model/ModelEditorMenuBar.js +5 -5
  6. package/dist/cjs/model/ModelEditorRightPanel.js +13 -9
  7. package/dist/cjs/model/ModelEditorSubComponents.js +10 -4
  8. package/dist/cjs/model/ModelEditorTimeline.js +4 -2
  9. package/dist/cjs/model/ModelEditorToolbar.js +1 -1
  10. package/dist/cjs/model/ModelEditorViewport.js +6 -3
  11. package/dist/cjs/model/ModelViewer.js +4 -4
  12. package/dist/cjs/model/NiceArmatureEditor.js +4 -4
  13. package/dist/cjs/model/NiceMorphTargetEditor.js +3 -1
  14. package/dist/cjs/model/NiceOctree.js +7 -4
  15. package/dist/cjs/model/NicePhysicsSimulation.js +4 -4
  16. package/dist/cjs/model/NiceProceduralGeometry.js +3 -3
  17. package/dist/cjs/model/NiceTerrainEditor.js +2 -2
  18. package/dist/cjs/model/NiceWeightPainter.js +2 -2
  19. package/dist/cjs/model/NiceXRPreview.js +6 -3
  20. package/dist/cjs/model/useModelEditor.js +131 -79
  21. package/dist/cjs/model/useModelViewer.js +19 -12
  22. package/dist/cjs/nice2dev-ui-3d.css +1 -1
  23. package/dist/cjs/particle/NiceParticleEditor.js +12 -5
  24. package/dist/cjs/rendering/NiceCascadedShadows.js +1 -1
  25. package/dist/cjs/rendering/NiceRenderExport.js +2 -2
  26. package/dist/cjs/rendering/NiceSSAO.js +2 -1
  27. package/dist/cjs/rendering/NiceSSR.js +2 -1
  28. package/dist/cjs/rendering/NiceWebGPURenderer.js +2 -1
  29. package/dist/cjs/uv/NiceUVEditor.js +3 -3
  30. package/dist/esm/material/NiceMaterialEditor.js +1 -0
  31. package/dist/esm/model/ModelEditor.js +7 -1
  32. package/dist/esm/model/ModelEditorLeftPanel.js +3 -3
  33. package/dist/esm/model/ModelEditorMenuBar.js +6 -6
  34. package/dist/esm/model/ModelEditorRightPanel.js +13 -9
  35. package/dist/esm/model/ModelEditorSubComponents.js +11 -5
  36. package/dist/esm/model/ModelEditorTimeline.js +5 -3
  37. package/dist/esm/model/ModelEditorToolbar.js +1 -1
  38. package/dist/esm/model/ModelEditorViewport.js +7 -4
  39. package/dist/esm/model/ModelViewer.js +4 -4
  40. package/dist/esm/model/NiceArmatureEditor.js +4 -4
  41. package/dist/esm/model/NiceMorphTargetEditor.js +3 -1
  42. package/dist/esm/model/NiceOctree.js +7 -4
  43. package/dist/esm/model/NicePhysicsSimulation.js +4 -4
  44. package/dist/esm/model/NiceProceduralGeometry.js +3 -3
  45. package/dist/esm/model/NiceTerrainEditor.js +2 -2
  46. package/dist/esm/model/NiceWeightPainter.js +2 -2
  47. package/dist/esm/model/NiceXRPreview.js +6 -3
  48. package/dist/esm/model/useModelEditor.js +131 -79
  49. package/dist/esm/model/useModelViewer.js +20 -13
  50. package/dist/esm/nice2dev-ui-3d.css +1 -1
  51. package/dist/esm/particle/NiceParticleEditor.js +13 -6
  52. package/dist/esm/rendering/NiceCascadedShadows.js +1 -1
  53. package/dist/esm/rendering/NiceRenderExport.js +2 -2
  54. package/dist/esm/rendering/NiceSSAO.js +2 -1
  55. package/dist/esm/rendering/NiceSSR.js +2 -1
  56. package/dist/esm/rendering/NiceWebGPURenderer.js +2 -1
  57. package/dist/esm/uv/NiceUVEditor.js +3 -3
  58. package/package.json +3 -3
@@ -10,6 +10,7 @@ var GLTFLoader_js = require('three/examples/jsm/loaders/GLTFLoader.js');
10
10
  var OBJLoader_js = require('three/examples/jsm/loaders/OBJLoader.js');
11
11
  var PLYLoader_js = require('three/examples/jsm/loaders/PLYLoader.js');
12
12
  var STLLoader_js = require('three/examples/jsm/loaders/STLLoader.js');
13
+ var i18n = require('../core/i18n.js');
13
14
  var threeCompat = require('../core/threeCompat.js');
14
15
 
15
16
  function _interopNamespaceDefault(e) {
@@ -62,6 +63,7 @@ const TONE_MAP = {
62
63
  ═══════════════════════════════════════════ */
63
64
  function useModelViewer(props = {}) {
64
65
  var _a;
66
+ const { t } = i18n.useNiceTranslation();
65
67
  const { src, format, navigationMode: initNavMode = 'orbit', quality = 'high', autoRotateSpeed: initAutoRotate = 0, backgroundColor = 'var(--nice-bg, #1a1a2e)', showGrid: initShowGrid = true, shadows = true, gamepad = false, cameraPresets: _cameraPresets = [], annotations: _annotations = [], hotspots: _hotspots = [], floorPlans: _floorPlans = [], onHotspotClick: _onHotspotClick, onAnnotationClick: _onAnnotationClick, onLoadProgress, onLoad, onError, clippingPlanes = [], measureMode: initMeasureMode = false, measurements: _measurements = [], onMeasure: _onMeasure, minDistance = 0.1, maxDistance = 1000, fov = 50, vr: _vr = false, walkSpeed = 5, ambientIntensity = 0.5, directionalIntensity = 0.8, antiAlias = true, toneMapping = 'aces', exposure = 1, } = props;
66
68
  /* ── refs ── */
67
69
  const mountRef = React.useRef(null);
@@ -181,7 +183,7 @@ function useModelViewer(props = {}) {
181
183
  ro.observe(mount);
182
184
  // Animation loop
183
185
  const animate = () => {
184
- var _a, _b, _c, _d, _e, _f, _g;
186
+ var _a, _b, _c, _d, _e, _f;
185
187
  if (disposeRef.current) {
186
188
  return;
187
189
  }
@@ -189,12 +191,12 @@ function useModelViewer(props = {}) {
189
191
  const dt = (_b = (_a = clockRef.current) === null || _a === void 0 ? void 0 : _a.getDelta()) !== null && _b !== void 0 ? _b : 0;
190
192
  // Gamepad FPS-style nav
191
193
  if (gamepad && navMode === 'fps') {
192
- const pads = (_c = navigator.getGamepads) === null || _c === void 0 ? void 0 : _c.call(navigator);
193
- const gp = (_d = pads === null || pads === void 0 ? void 0 : pads[0]) !== null && _d !== void 0 ? _d : null;
194
+ // The pads the input engine read this frame (1.3.0: the engine is the only pad reader).
195
+ const gp = (_c = ui.getInputEngine().gamepadSnapshot[0]) !== null && _c !== void 0 ? _c : null;
194
196
  if (gp) {
195
- const lx = (_e = gp.axes[0]) !== null && _e !== void 0 ? _e : 0;
196
- const ly = (_f = gp.axes[1]) !== null && _f !== void 0 ? _f : 0;
197
- const rx = (_g = gp.axes[2]) !== null && _g !== void 0 ? _g : 0;
197
+ const lx = (_d = gp.axes[0]) !== null && _d !== void 0 ? _d : 0;
198
+ const ly = (_e = gp.axes[1]) !== null && _e !== void 0 ? _e : 0;
199
+ const rx = (_f = gp.axes[2]) !== null && _f !== void 0 ? _f : 0;
198
200
  const fwd = new THREE__namespace.Vector3();
199
201
  camera.getWorldDirection(fwd);
200
202
  fwd.y = 0;
@@ -349,7 +351,7 @@ function useModelViewer(props = {}) {
349
351
  setLoading(true);
350
352
  setLoadProgress(0);
351
353
  setError(null);
352
- setStatusText('Loading…');
354
+ setStatusText(t('useModelViewer.loading', 'Loading…'));
353
355
  const detectedFmt = detectFormat(url, fmt);
354
356
  const onProgress = (e) => {
355
357
  if (e.lengthComputable) {
@@ -457,21 +459,23 @@ function useModelViewer(props = {}) {
457
459
  mixerRef.current = mixer;
458
460
  }
459
461
  countScene();
460
- setStatusText(`Loaded – ${polyCount} tris, ${meshCount} meshes`);
462
+ setStatusText(t('useModelViewer.loadedTrisMeshes', 'Loaded – {polyCount} tris, {meshCount} meshes')
463
+ .replace('{polyCount}', String(polyCount))
464
+ .replace('{meshCount}', String(meshCount)));
461
465
  onLoad === null || onLoad === void 0 ? void 0 : onLoad();
462
466
  }
463
467
  }
464
468
  catch (err) {
465
469
  const msg = err instanceof Error ? err.message : String(err);
466
470
  setError(msg);
467
- setStatusText(`Error: ${msg}`);
471
+ setStatusText(t('useModelViewer.error', 'Error: {msg}').replace('{msg}', String(msg)));
468
472
  onError === null || onError === void 0 ? void 0 : onError(err instanceof Error ? err : new Error(msg));
469
473
  }
470
474
  finally {
471
475
  setLoading(false);
472
476
  setLoadProgress(1);
473
477
  }
474
- }, [countScene, detectFormat, onLoad, onError, onLoadProgress, polyCount, meshCount]);
478
+ }, [countScene, detectFormat, onLoad, onError, onLoadProgress, polyCount, meshCount, t]);
475
479
  /* ── auto-load from src ── */
476
480
  React.useEffect(() => {
477
481
  if (src) {
@@ -612,9 +616,12 @@ function useModelViewer(props = {}) {
612
616
  /* ── finalise status text ── */
613
617
  React.useEffect(() => {
614
618
  if (!loading && !error && polyCount > 0) {
615
- setStatusText(`${polyCount.toLocaleString()} triangles · ${meshCount} meshes · ${animNames.length} animation(s)`);
619
+ setStatusText(t('useModelViewer.trianglesMeshesAnimationS', '{polyCount} triangles · {meshCount} meshes · {animNames} animation(s)')
620
+ .replace('{polyCount}', String(polyCount.toLocaleString()))
621
+ .replace('{meshCount}', String(meshCount))
622
+ .replace('{animNames}', String(animNames.length)));
616
623
  }
617
- }, [loading, error, polyCount, meshCount, animNames.length]);
624
+ }, [loading, error, polyCount, meshCount, animNames.length, t]);
618
625
  return {
619
626
  mountRef,
620
627
  loading,
@@ -1 +1 @@
1
- .ModelEditor-module_root__Aiqom{background:var(--nice-bg-primary);color:var(--nice-text-primary);display:flex;flex-direction:column;font-family:Segoe UI,Consolas,monospace;font-size:12px;height:100%;overflow:hidden;user-select:none}.ModelEditor-module_menuBar__5P6Wi{align-items:center;background:var(--nice-bg-canvas);border-bottom:1px solid var(--nice-border-color);display:flex;flex-shrink:0;gap:0;height:28px;padding:0 var(--nice-space-1,4px)}.ModelEditor-module_menuBtn__f1u-N{background:none;border:none;border-radius:var(--nice-radius-sm,3px);color:var(--nice-text-secondary);cursor:pointer;font-size:11px;padding:var(--nice-space-1,4px) var(--nice-space-2-5,10px);white-space:nowrap}.ModelEditor-module_menuBtn__f1u-N:hover{background:var(--nice-bg-secondary);color:var(--nice-color-white)}.ModelEditor-module_menuBtn__f1u-N:disabled{cursor:default;opacity:.4}.ModelEditor-module_menuSep__Jilgu{background:var(--nice-bg-secondary);height:16px;margin:0 var(--nice-space-1,4px);width:1px}.ModelEditor-module_menuLabel__gn6yQ{color:var(--nice-text-secondary);font-size:10px;margin:0 var(--nice-space-1-5,6px);white-space:nowrap}.ModelEditor-module_menuRight__YQWk7{align-items:center;display:flex;gap:var(--nice-space-1,4px);margin-left:auto}.ModelEditor-module_leftPanel__sVsxG{background:var(--nice-bg-primary);overflow:hidden;width:240px}.ModelEditor-module_leftPanel__sVsxG,.ModelEditor-module_toolbar__l8uKC{border-right:1px solid var(--nice-border-color);display:flex;flex-direction:column;flex-shrink:0}.ModelEditor-module_toolbar__l8uKC{background:var(--nice-bg-elevated);gap:var(--nice-space-0-5,2px);padding:var(--nice-space-1,4px) var(--nice-space-0-5,2px);width:38px}.ModelEditor-module_toolBtn__8DzAf{align-items:center;background:none;border:1px solid transparent;border-radius:var(--nice-radius-sm,4px);color:var(--nice-text-muted);cursor:pointer;display:flex;font-size:16px;height:32px;justify-content:center;transition:all .1s;width:32px}.ModelEditor-module_toolBtn__8DzAf:hover{background:var(--nice-bg-secondary);color:var(--nice-text-secondary)}.ModelEditor-module_toolBtnActive__ek-nN{background:var(--nice-bg-tertiary)!important;border-color:var(--nice-color-primary)!important;color:var(--nice-color-white)!important}.ModelEditor-module_toolSep__5I72j{background:var(--nice-bg-secondary);height:1px;margin:var(--nice-space-1,4px) var(--nice-space-0-5,2px)}.ModelEditor-module_viewportContainer__O-e-6{background:var(--nice-bg-inset);flex:1;height:100%;min-height:0;overflow:hidden;position:relative}.ModelEditor-module_viewportContainer__O-e-6 canvas{display:block;height:100%;width:100%}.ModelEditor-module_viewportOverlay__LXDnT{display:flex;gap:var(--nice-space-1,4px);left:8px;position:absolute;top:8px;z-index:10}.ModelEditor-module_viewportBadge__-5C9w{background:var(--nice-overlay-80,rgba(20,20,40,.8));border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-sm,4px);color:var(--nice-text-muted);font-size:10px;padding:var(--nice-space-0-5,2px) var(--nice-space-2,8px)}.ModelEditor-module_viewportDropZone__PBrTo{align-items:center;background:rgba(85,102,204,.15);border:2px dashed var(--nice-color-primary);display:flex;inset:0;justify-content:center;pointer-events:none;position:absolute;z-index:20}.ModelEditor-module_viewportDropZone__PBrTo span{background:rgba(20,20,40,.9);border-radius:var(--nice-radius-lg,8px);color:var(--nice-text-muted,#aab);font-size:14px;padding:var(--nice-space-3,12px) var(--nice-space-6,24px)}.ModelEditor-module_rightPanel__oJf3N{background:var(--nice-bg-primary);border-left:1px solid var(--nice-border-color);display:flex;flex-direction:column;flex-shrink:0;overflow-y:auto;width:280px}.ModelEditor-module_panelSection__yb-jc{border-bottom:1px solid var(--nice-border-color);padding:var(--nice-space-1-5,6px) var(--nice-space-2,8px)}.ModelEditor-module_panelTitle__rp8tH{align-items:center;color:var(--nice-text-secondary);cursor:pointer;display:flex;font-size:10px;justify-content:space-between;letter-spacing:.5px;margin-bottom:var(--nice-space-1,4px);text-transform:uppercase}.ModelEditor-module_panelTitle__rp8tH button{background:none;border:none;color:var(--nice-text-secondary);cursor:pointer;font-size:14px;line-height:1;padding:0 var(--nice-space-0-5,2px)}.ModelEditor-module_panelTitle__rp8tH button:hover{color:var(--nice-text-muted)}.ModelEditor-module_panelCollapsed__xBsUg .ModelEditor-module_panelContent__IMNnR{display:none}.ModelEditor-module_panelContent__IMNnR{padding-top:var(--nice-space-1,4px)}.ModelEditor-module_treeItem__MiVWT{align-items:center;border-radius:var(--nice-radius-sm,3px);cursor:pointer;display:flex;font-size:11px;gap:var(--nice-space-1,4px);overflow:hidden;padding:var(--nice-space-0-75,3px) var(--nice-space-1,4px) var(--nice-space-0-75,3px) 0;text-overflow:ellipsis;white-space:nowrap}.ModelEditor-module_treeItem__MiVWT:hover{background:var(--nice-overlay-light-4,hsla(0,0%,100%,.04))}.ModelEditor-module_treeItemActive__4ntXK{background:var(--nice-surface)!important;outline:1px solid var(--nice-color-primary-hover)}.ModelEditor-module_treeIcon__PzniU{flex-shrink:0;font-size:12px;opacity:.6;text-align:center;width:16px}.ModelEditor-module_treeIndent__ISBk-{display:inline-block;flex-shrink:0;width:16px}.ModelEditor-module_treeToggle__Ge5PW{color:var(--nice-text-muted);cursor:pointer;flex-shrink:0;font-size:8px;text-align:center;width:12px}.ModelEditor-module_treeVisibility__BjKaL{cursor:pointer;flex-shrink:0;font-size:10px;opacity:.5;padding:0 var(--nice-space-0-5,2px)}.ModelEditor-module_treeVisibility__BjKaL:hover{opacity:1}.ModelEditor-module_propRow__AONtp{align-items:center;display:flex;gap:var(--nice-space-1-5,6px);margin-bottom:var(--nice-space-0-75,3px)}.ModelEditor-module_propLabel__bwkAK{color:var(--nice-text-muted);flex-shrink:0;font-size:10px;min-width:50px}.ModelEditor-module_propInput__aFI4Q{background:var(--nice-bg-canvas);border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-sm,3px);color:var(--nice-text-primary);flex:1;font-size:11px;min-width:0;padding:var(--nice-space-0-5,2px) var(--nice-space-1,4px)}.ModelEditor-module_propInput__aFI4Q:focus{border-color:var(--nice-color-primary);outline:none}.ModelEditor-module_propVec3__2FcMf{display:flex;flex:1;gap:var(--nice-space-0-5,2px)}.ModelEditor-module_propVec3__2FcMf input{background:var(--nice-bg-canvas);border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-sm,3px);color:var(--nice-text-primary);flex:1;font-size:10px;min-width:0;padding:var(--nice-space-0-5,2px) var(--nice-space-0-75,3px);text-align:center}.ModelEditor-module_propVec3__2FcMf input:focus{border-color:var(--nice-color-primary);outline:none}.ModelEditor-module_propVec3X__lfQtN{border-left:2px solid #c44!important}.ModelEditor-module_propVec3Y__PmF5p{border-left:2px solid #4c4!important}.ModelEditor-module_propVec3Z__swB76{border-left:2px solid #48c!important}.ModelEditor-module_propColorSwatch__SMg9F{border:1px solid var(--nice-overlay-light-15,hsla(0,0%,100%,.15));border-radius:var(--nice-radius-sm,3px);cursor:pointer;flex-shrink:0;height:24px;position:relative;width:24px}.ModelEditor-module_propColorSwatch__SMg9F input{cursor:pointer;height:100%;inset:0;opacity:0;position:absolute;width:100%}.ModelEditor-module_propCheckbox__-eSHl{accent-color:var(--nice-color-primary)}.ModelEditor-module_propSelect__1YXcX{background:var(--nice-bg-canvas);border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-sm,3px);color:var(--nice-text-primary);flex:1;font-size:11px;min-width:0;padding:var(--nice-space-0-5,2px) var(--nice-space-1,4px)}.ModelEditor-module_bottomPanel__ojUaN{background:var(--nice-bg-canvas);border-top:1px solid var(--nice-border-color);display:flex;flex-direction:column;flex-shrink:0;height:200px;overflow:hidden}.ModelEditor-module_bottomPanelCollapsed__P2I6E{height:28px}.ModelEditor-module_bottomPanelHeader__z9D6b{align-items:center;border-bottom:1px solid var(--nice-border-color);display:flex;flex-shrink:0;gap:var(--nice-space-1,4px);height:28px;padding:0 var(--nice-space-2,8px)}.ModelEditor-module_bottomPanelTitle__0P32m{color:var(--nice-text-secondary);cursor:pointer;font-size:10px;letter-spacing:.5px;text-transform:uppercase}.ModelEditor-module_bottomToggle__fsUEB{color:var(--nice-text-muted);cursor:pointer;font-size:8px;margin-right:var(--nice-space-1,4px)}.ModelEditor-module_transportBar__bh6Sb{align-items:center;display:flex;gap:var(--nice-space-0-5,2px)}.ModelEditor-module_transportBtn__egXSB{background:none;border:none;border-radius:var(--nice-radius-sm,3px);color:var(--nice-text-secondary);cursor:pointer;font-size:14px;padding:var(--nice-space-0-5,2px) var(--nice-space-1-5,6px)}.ModelEditor-module_transportBtn__egXSB:hover{background:var(--nice-bg-secondary);color:var(--nice-color-white)}.ModelEditor-module_transportBtnActive__j6Y94{color:var(--nice-color-primary)!important}.ModelEditor-module_transportTime__7RzUh{color:var(--nice-text-muted);font-size:10px;font-variant-numeric:tabular-nums;margin:0 var(--nice-space-2,8px)}.ModelEditor-module_animListArea__rzc1e{display:flex;flex:1;min-height:0;overflow:hidden}.ModelEditor-module_animList__lGNt5{border-right:1px solid var(--nice-border-color);flex-shrink:0;overflow-y:auto;width:200px}.ModelEditor-module_animItem__lZGOY{align-items:center;border-left:2px solid transparent;cursor:pointer;display:flex;font-size:11px;gap:var(--nice-space-1,4px);padding:var(--nice-space-0-75,3px) var(--nice-space-2,8px)}.ModelEditor-module_animItem__lZGOY:hover{background:var(--nice-overlay-light-4,hsla(0,0%,100%,.04))}.ModelEditor-module_animItemActive__8pKLd{background:var(--nice-surface)!important;border-left-color:var(--nice-color-primary)}.ModelEditor-module_animDuration__CAwuG{color:var(--nice-text-muted);font-size:9px;margin-left:auto}.ModelEditor-module_timelineArea__WFBHa{flex:1;overflow-x:auto;overflow-y:hidden;position:relative}.ModelEditor-module_timelineRuler__jlW8F{background:var(--nice-bg-canvas);border-bottom:1px solid var(--nice-border-color);height:20px;position:relative}.ModelEditor-module_rulerTick__VhJRA{background:var(--nice-bg-secondary);height:100%;position:absolute;top:0;width:1px}.ModelEditor-module_rulerLabel__Pwl9a{color:var(--nice-text-muted);font-size:8px;position:absolute;top:2px;transform:translateX(-50%)}.ModelEditor-module_playhead__Rd4rh{background:var(--nice-color-primary);pointer-events:none;position:absolute;top:0;width:2px;z-index:3}.ModelEditor-module_playheadHandle__rIBHA{background:var(--nice-color-primary);clip-path:polygon(0 0,100% 0,50% 100%);height:8px;position:absolute;top:0;transform:translateX(-3px);width:8px}.ModelEditor-module_timelineTracks__joMHo{position:relative}.ModelEditor-module_keyframeDiamond__kffdC{background:#e8a030;cursor:pointer;height:8px;position:absolute;transform:rotate(45deg);width:8px;z-index:2}.ModelEditor-module_keyframeDiamond__kffdC:hover{background:#f0c060}.ModelEditor-module_keyframeDiamondSelected__xURk4{background:var(--nice-color-white)!important}.ModelEditor-module_statusBar__AJMzx{align-items:center;background:var(--nice-bg-canvas);border-top:1px solid var(--nice-border-color);color:var(--nice-text-muted);display:flex;flex-shrink:0;font-size:10px;gap:var(--nice-space-3,12px);height:20px;padding:var(--nice-space-0-5,2px) var(--nice-space-2,8px)}.ModelEditor-module_materialCard__1IGe7{background:var(--nice-bg-canvas);border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-sm,4px);margin-bottom:var(--nice-space-1-5,6px);padding:var(--nice-space-1-5,6px)}.ModelEditor-module_materialCardActive__VEnBX{border-color:var(--nice-color-primary)}.ModelEditor-module_materialHeader__WtTh3{align-items:center;display:flex;gap:var(--nice-space-1-5,6px);margin-bottom:var(--nice-space-1,4px)}.ModelEditor-module_materialPreview__IF7qd{border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-sm,4px);flex-shrink:0;height:32px;overflow:hidden;width:32px}.ModelEditor-module_materialPreview__IF7qd canvas{height:100%;width:100%}.ModelEditor-module_materialName__TvRhs{flex:1;font-size:11px;font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ModelEditor-module_textureSlot__PLqef{align-items:center;display:flex;gap:var(--nice-space-1-5,6px);margin-bottom:var(--nice-space-1,4px)}.ModelEditor-module_textureThumb__PdCTD{background:#0a0a15;border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-sm,3px);flex-shrink:0;height:28px;overflow:hidden;width:28px}.ModelEditor-module_textureThumb__PdCTD img{height:100%;object-fit:cover;width:100%}.ModelEditor-module_textureInfo__XOzZI{flex:1;min-width:0}.ModelEditor-module_textureName__H-2d3{font-size:10px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ModelEditor-module_textureBtn__zUt3m{background:none;border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-sm,3px);color:var(--nice-text-muted);cursor:pointer;font-size:10px;padding:var(--nice-space-px,1px) var(--nice-space-1-5,6px)}.ModelEditor-module_textureBtn__zUt3m:hover{background:var(--nice-bg-secondary);color:var(--nice-text-secondary)}.ModelEditor-module_btnPrimary__IAz0U{background:var(--nice-color-primary);border:none;border-radius:var(--nice-radius-sm,4px);color:var(--nice-color-white);cursor:pointer;font-size:11px;padding:var(--nice-space-1,4px) var(--nice-space-3,12px);white-space:nowrap}.ModelEditor-module_btnPrimary__IAz0U:hover{background:var(--nice-primary,#67d)}.ModelEditor-module_btnPrimary__IAz0U:disabled{cursor:default;opacity:.4}.ModelEditor-module_btnSecondary__nJpgi{background:var(--nice-bg-secondary);border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-sm,4px);color:var(--nice-text-muted);cursor:pointer;font-size:11px;padding:var(--nice-space-1,4px) var(--nice-space-3,12px);white-space:nowrap}.ModelEditor-module_btnSecondary__nJpgi:hover{background:#3a3a5a;color:var(--nice-text-primary)}.ModelEditor-module_btnIcon__Qq9nz{background:none;border:none;color:var(--nice-text-muted);cursor:pointer;font-size:14px;line-height:1;padding:var(--nice-space-0-5,2px)}.ModelEditor-module_btnIcon__Qq9nz:hover{color:var(--nice-text-secondary)}.ModelEditor-module_aiPanel__-U1jO{background:linear-gradient(135deg,var(--nice-bg,#1a1a3e),#1e1a2e);border:1px solid var(--nice-bg-secondary,#4a3a6a);border-radius:var(--nice-radius-md,6px);margin:var(--nice-space-1,4px) 0;padding:var(--nice-space-2,8px)}.ModelEditor-module_aiHeader__WMZF5{align-items:center;color:#b88adf;display:flex;font-size:11px;gap:var(--nice-space-1,4px);margin-bottom:var(--nice-space-1-5,6px)}.ModelEditor-module_aiInput__-23jT{background:var(--nice-bg-canvas);border:1px solid var(--nice-bg-secondary,#4a3a6a);border-radius:var(--nice-radius-sm,4px);color:var(--nice-text-primary);font-size:11px;margin-bottom:var(--nice-space-1,4px);min-height:28px;padding:var(--nice-space-1,4px) var(--nice-space-2,8px);resize:vertical;width:100%}.ModelEditor-module_aiInput__-23jT:focus{border-color:#86c;outline:none}.ModelEditor-module_aiBtnRow__F-S-Z{display:flex;gap:var(--nice-space-1,4px)}.ModelEditor-module_aiBtn__8dcrE{background:linear-gradient(135deg,#54a,#64c);border:none;border-radius:var(--nice-radius-sm,4px);color:var(--nice-color-white);cursor:pointer;font-size:10px;padding:var(--nice-space-0-75,3px) var(--nice-space-2-5,10px)}.ModelEditor-module_aiBtn__8dcrE:hover{background:linear-gradient(135deg,#65b,#75d)}.ModelEditor-module_aiBtn__8dcrE:disabled{opacity:.4}.ModelEditor-module_aiStatus__Y5g59{color:#86a;font-size:10px;margin-top:var(--nice-space-1,4px)}.ModelEditor-module_dragOver__2VGIz{outline:2px dashed var(--nice-color-primary);outline-offset:-2px}.ModelEditor-module_contextMenu__sEb9s{background:var(--nice-bg-elevated);border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-md,6px);box-shadow:0 4px 16px var(--nice-overlay-50,rgba(0,0,0,.5));min-width:180px;padding:var(--nice-space-1,4px) 0;position:fixed;z-index:999}.ModelEditor-module_contextItem__W90fc{align-items:center;color:var(--nice-text-secondary);cursor:pointer;display:flex;font-size:11px;gap:var(--nice-space-2,8px);padding:var(--nice-space-1-25,5px) var(--nice-space-3,12px)}.ModelEditor-module_contextItem__W90fc:hover{background:var(--nice-surface)}.ModelEditor-module_contextSep__QCWTX{background:var(--nice-bg-secondary);height:1px;margin:var(--nice-space-0-5,2px) 0}.ModelEditor-module_contextKey__HxGV6{color:var(--nice-text-muted);font-size:10px;margin-left:auto}.ModelEditor-module_animList__lGNt5::-webkit-scrollbar,.ModelEditor-module_leftPanel__sVsxG::-webkit-scrollbar,.ModelEditor-module_rightPanel__oJf3N::-webkit-scrollbar,.ModelEditor-module_timelineArea__WFBHa::-webkit-scrollbar{height:6px;width:6px}.ModelEditor-module_animList__lGNt5::-webkit-scrollbar-track,.ModelEditor-module_leftPanel__sVsxG::-webkit-scrollbar-track,.ModelEditor-module_rightPanel__oJf3N::-webkit-scrollbar-track,.ModelEditor-module_timelineArea__WFBHa::-webkit-scrollbar-track{background:transparent}.ModelEditor-module_animList__lGNt5::-webkit-scrollbar-thumb,.ModelEditor-module_leftPanel__sVsxG::-webkit-scrollbar-thumb,.ModelEditor-module_rightPanel__oJf3N::-webkit-scrollbar-thumb,.ModelEditor-module_timelineArea__WFBHa::-webkit-scrollbar-thumb{background:var(--nice-bg-secondary);border-radius:var(--nice-radius-sm,3px)}.ModelEditor-module_animList__lGNt5::-webkit-scrollbar-thumb:hover,.ModelEditor-module_leftPanel__sVsxG::-webkit-scrollbar-thumb:hover,.ModelEditor-module_rightPanel__oJf3N::-webkit-scrollbar-thumb:hover,.ModelEditor-module_timelineArea__WFBHa::-webkit-scrollbar-thumb:hover{background:var(--nice-bg-tertiary)}.ModelEditor-module_resizeHandle__CyDw4{background:transparent;cursor:ns-resize;height:4px;transition:background .1s}.ModelEditor-module_resizeHandle__CyDw4:hover{background:var(--nice-color-primary)}.ModelEditor-module_modeSelect__KroPg{background:var(--nice-bg,#224);border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-sm,4px);color:#b0b0d0;cursor:pointer;font-size:11px;font-weight:600;outline:none;padding:var(--nice-space-0-5,2px) var(--nice-space-2,8px)}.ModelEditor-module_modeSelect__KroPg:focus{border-color:var(--nice-color-primary)}.ModelEditor-module_modeSelect__KroPg option{background:var(--nice-bg-primary)}.ModelEditor-module_menuDropdownWrap__6dicW{position:relative}.ModelEditor-module_dropdownMenu__ixJxD{background:var(--nice-bg-elevated);border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-md,6px);box-shadow:0 6px 24px var(--nice-overlay-60,rgba(0,0,0,.6));left:0;max-height:420px;min-width:200px;overflow-y:auto;padding:var(--nice-space-1,4px) 0;position:absolute;top:100%;z-index:999}.ModelEditor-module_dropdownTitle__zzdA6{color:var(--nice-color-primary);font-size:9px;font-weight:700;letter-spacing:1px;padding:var(--nice-space-1-5,6px) var(--nice-space-3,12px) var(--nice-space-0-5,2px);text-transform:uppercase}.ModelEditor-module_dropdownItem__4dllG{align-items:center;color:var(--nice-text-secondary);cursor:pointer;display:flex;font-size:11px;gap:var(--nice-space-1-5,6px);padding:var(--nice-space-1-25,5px) var(--nice-space-4,16px);transition:background .08s}.ModelEditor-module_dropdownItem__4dllG:hover{background:var(--nice-surface);color:var(--nice-color-white)}.ModelEditor-module_dropdownSep__oFx30{background:var(--nice-bg-secondary);height:1px;margin:var(--nice-space-1,4px) 0}.ModelEditor-module_dropdownMenu__ixJxD::-webkit-scrollbar{width:6px}.ModelEditor-module_dropdownMenu__ixJxD::-webkit-scrollbar-track{background:transparent}.ModelEditor-module_dropdownMenu__ixJxD::-webkit-scrollbar-thumb{background:var(--nice-bg-tertiary);border-radius:var(--nice-radius-sm,3px)}.ModelEditor-module_viewportShadingBar__NOK0h{background:var(--nice-overlay-80,rgba(20,20,40,.8));border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-md,6px);display:flex;gap:var(--nice-space-0-5,2px);padding:var(--nice-space-0-5,2px) var(--nice-space-1,4px);position:absolute;right:8px;top:8px;z-index:10}.ModelEditor-module_shadingBtn__SAIR9{background:none;border:1px solid transparent;border-radius:var(--nice-radius-sm,4px);color:var(--nice-text-muted);cursor:pointer;font-size:12px;padding:var(--nice-space-0-75,3px) var(--nice-space-2,8px);transition:all .1s;white-space:nowrap}.ModelEditor-module_shadingBtn__SAIR9:hover{background:var(--nice-bg-secondary);color:var(--nice-text-secondary)}.ModelEditor-module_shadingBtnActive__ST5YT{background:var(--nice-bg-tertiary)!important;border-color:var(--nice-color-primary)!important;color:var(--nice-color-white)!important}.ModelEditor-module_viewportGizmoInfo__k0ily{position:absolute;right:8px;top:44px;z-index:10}.ModelEditor-module_propTabs__Vw0-u{background:var(--nice-bg-canvas);border-bottom:1px solid var(--nice-border-color);display:flex;flex-shrink:0}.ModelEditor-module_propTabBtn__s8xDE{background:none;border:none;border-bottom:2px solid transparent;color:var(--nice-text-secondary);cursor:pointer;flex:1;font-size:14px;padding:var(--nice-space-1-5,6px) var(--nice-space-1,4px);transition:all .15s}.ModelEditor-module_propTabBtn__s8xDE:hover{background:var(--nice-bg-elevated);color:var(--nice-text-muted)}.ModelEditor-module_propTabBtnActive__-woXw{background:var(--nice-bg-elevated)!important;border-bottom-color:var(--nice-color-primary)!important;color:var(--nice-color-white)!important}.ModelEditor-module_outlinerSearch__p5L46{padding:var(--nice-space-1,4px) var(--nice-space-2,8px) 0}.ModelEditor-module_outlinerSearch__p5L46 input{background:var(--nice-bg-canvas);border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-sm,4px);color:var(--nice-text-secondary);font-size:11px;padding:var(--nice-space-0-75,3px) var(--nice-space-2,8px)}.ModelEditor-module_outlinerSearch__p5L46 input:focus{border-color:var(--nice-color-primary);outline:none}.ModelEditor-module_outlinerSearch__p5L46 input::placeholder{color:var(--nice-text-muted)}.ModelViewer-module_root__6Fbj3{background:var(--nice-bg-primary,#1a1a2e);color:var(--nice-text-primary,#e0e0e0);display:flex;flex-direction:column;font-family:Segoe UI,Consolas,monospace;font-size:12px;height:100%;overflow:hidden;position:relative;user-select:none}.ModelViewer-module_toolbar__EQJRN{align-items:center;background:var(--nice-bg-canvas,#12122a);border-bottom:1px solid var(--nice-border-color,#252545);display:flex;flex-shrink:0;gap:var(--nice-space-0-5,2px);height:32px;padding:0 var(--nice-space-1-5,6px);z-index:2}.ModelViewer-module_toolBtn__f9833{align-items:center;background:none;border:none;border-radius:var(--nice-radius-sm,3px);color:var(--nice-text-secondary,#ccc);cursor:pointer;display:flex;font-size:11px;gap:var(--nice-space-1,4px);padding:var(--nice-space-1,4px) var(--nice-space-2,8px);white-space:nowrap}.ModelViewer-module_toolBtn__f9833:hover{background:var(--nice-bg-secondary,#252545);color:var(--nice-text-primary,#fff)}.ModelViewer-module_toolBtn__f9833.ModelViewer-module_active__MgURC{background:var(--nice-color-primary,#57f);color:var(--nice-text-on-primary,#fff)}.ModelViewer-module_toolBtn__f9833:disabled{cursor:default;opacity:.4}.ModelViewer-module_toolSep__5zuAK{background:var(--nice-bg-secondary,#333);height:16px;margin:0 var(--nice-space-1,4px);width:1px}.ModelViewer-module_toolLabel__PcpJC{color:var(--nice-text-secondary,#888);font-size:10px;margin:0 var(--nice-space-1,4px);white-space:nowrap}.ModelViewer-module_toolRight__VSuzD{align-items:center;display:flex;gap:var(--nice-space-0-5,2px);margin-left:auto}.ModelViewer-module_viewport__-1llx{flex:1;outline:none;overflow:hidden;position:relative}.ModelViewer-module_viewport__-1llx canvas{display:block;height:100%!important;width:100%!important}.ModelViewer-module_loadingOverlay__Ayyci{align-items:center;background:var(--nice-overlay-85,rgba(20,20,40,.85));display:flex;flex-direction:column;inset:0;justify-content:center;position:absolute;z-index:10}.ModelViewer-module_loadingBar__RDqVv{background:var(--nice-bg-tertiary,#444);border-radius:var(--nice-radius-sm,2px);height:4px;margin-top:var(--nice-space-3,12px);overflow:hidden;width:200px}.ModelViewer-module_loadingBarFill__zvIoP{background:var(--nice-color-primary,#57f);height:100%;transition:width .2s}.ModelViewer-module_loadingText__6OGeA{color:var(--nice-text-secondary,#ccc);font-size:13px;margin-bottom:var(--nice-space-2,8px)}.ModelViewer-module_errorOverlay__ASUqN{align-items:center;background:var(--nice-overlay-85,rgba(20,20,40,.85));color:var(--nice-danger,#ff6b6b);display:flex;flex-direction:column;inset:0;justify-content:center;position:absolute;z-index:10}.ModelViewer-module_sidePanel__-QFkd{background:var(--nice-bg-canvas,#12122a);border-left:1px solid var(--nice-border-color,#252545);bottom:24px;display:flex;flex-direction:column;font-size:11px;gap:var(--nice-space-3,12px);overflow-y:auto;padding:var(--nice-space-2,8px);position:absolute;right:0;top:32px;width:240px;z-index:5}.ModelViewer-module_sidePanel__-QFkd.ModelViewer-module_hidden__yoMuq{display:none}.ModelViewer-module_panelSection__bH-O3{display:flex;flex-direction:column;gap:var(--nice-space-1,4px)}.ModelViewer-module_panelTitle__xsn3e{color:var(--nice-text-secondary,#888);font-size:10px;letter-spacing:.5px;margin-bottom:var(--nice-space-1,4px);text-transform:uppercase}.ModelViewer-module_panelRow__3QxnD{align-items:center;display:flex;gap:var(--nice-space-1-5,6px)}.ModelViewer-module_panelRow__3QxnD label{color:var(--nice-text-secondary,#aaa);flex:0 0 70px;font-size:10px}.ModelViewer-module_panelRow__3QxnD span{color:var(--nice-text-primary,#e0e0e0);font-size:11px}.ModelViewer-module_animBar__qcYi5{align-items:center;background:var(--nice-bg-canvas,#12122a);border-top:1px solid var(--nice-border-color,#252545);display:flex;flex-shrink:0;gap:var(--nice-space-1,4px);height:28px;padding:0 var(--nice-space-2,8px)}.ModelViewer-module_animBar__qcYi5.ModelViewer-module_hidden__yoMuq{display:none}.ModelViewer-module_animSlider__9AQzN{appearance:none;background:var(--nice-bg-tertiary,#444);border-radius:var(--nice-radius-sm,2px);cursor:pointer;flex:1;height:4px}.ModelViewer-module_animSlider__9AQzN::-webkit-slider-thumb{appearance:none;background:var(--nice-color-primary,#57f);border-radius:var(--nice-radius-full,50%);cursor:pointer;height:10px;width:10px}.ModelViewer-module_animSelect__LhFWD{background:var(--nice-bg-secondary,#252545);border:1px solid var(--nice-border-color,#555);border-radius:var(--nice-radius-sm,3px);color:var(--nice-text-primary,#e0e0e0);font-size:10px;max-width:120px;padding:var(--nice-space-0-5,2px) var(--nice-space-1,4px)}.ModelViewer-module_statusBar__-3uuA{align-items:center;background:var(--nice-bg-canvas,#12122a);border-top:1px solid var(--nice-border-color,#252545);color:var(--nice-text-muted,#888);display:flex;flex-shrink:0;font-size:10px;gap:var(--nice-space-2,8px);height:22px;padding:0 var(--nice-space-2,8px)}.ModelViewer-module_statusRight__vI51s{display:flex;gap:var(--nice-space-3,12px);margin-left:auto}.ModelViewer-module_annotationLayer__-NzZF{inset:0;pointer-events:none;position:absolute;z-index:3}.ModelViewer-module_annotation__H6DgR{background:color-mix(in srgb,var(--nice-color-primary,#57f) 85%,transparent);border-radius:var(--nice-radius-sm,4px);color:var(--nice-text-on-primary,#fff);cursor:pointer;font-size:10px;padding:var(--nice-space-1,4px) var(--nice-space-2,8px);pointer-events:auto;position:absolute;transform:translate(-50%,-100%);white-space:nowrap}.ModelViewer-module_annotation__H6DgR:hover{background:var(--nice-color-primary,#57f)}.ModelViewer-module_dropZone__eNrPo{align-items:center;background:color-mix(in srgb,var(--nice-color-primary,#57f) 15%,transparent);border:2px dashed var(--nice-color-primary,#57f);color:var(--nice-color-primary,#57f);display:flex;font-size:16px;inset:0;justify-content:center;pointer-events:none;position:absolute;z-index:20}.UVEditor-module_uvEditor__9yahO{background:var(--nice-bg-secondary,#1e1e1e);border:1px solid var(--nice-border,#333);border-radius:var(--nice-radius-sm,4px);color:var(--nice-text,#e0e0e0);font-family:var(--nice-font-family,system-ui,sans-serif);font-size:12px;overflow:hidden}.UVEditor-module_toolbar__wPDkZ{align-items:center;background:var(--nice-bg-tertiary,#252526);border-bottom:1px solid var(--nice-border,#333);display:flex;flex-wrap:wrap;gap:var(--nice-space-2,8px);padding:var(--nice-space-1-5,6px) var(--nice-space-2,8px)}.UVEditor-module_toolGroup__hzVqv{border-right:1px solid var(--nice-border,#444);display:flex;gap:var(--nice-space-0-5,2px);padding:0 var(--nice-space-1,4px)}.UVEditor-module_toolGroup__hzVqv:last-child{border-right:none}.UVEditor-module_toolBtn__oIzVq{align-items:center;background:var(--nice-bg-secondary,#2d2d2d);border:1px solid transparent;border-radius:var(--nice-radius-sm,3px);color:var(--nice-text-secondary,#aaa);cursor:pointer;display:flex;font-size:11px;font-weight:500;height:24px;justify-content:center;min-width:28px;padding:0 var(--nice-space-1-5,6px);transition:all .15s ease}.UVEditor-module_toolBtn__oIzVq:hover:not(:disabled){background:var(--nice-bg-hover,#3c3c3c);color:var(--nice-text,#fff)}.UVEditor-module_toolBtn__oIzVq.UVEditor-module_active__gahDI{background:var(--nice-primary,#007acc);border-color:var(--nice-primary-hover,#0098ff);color:var(--nice-text-on-primary,#fff)}.UVEditor-module_toolBtn__oIzVq:disabled{cursor:not-allowed;opacity:.5}.UVEditor-module_select__cd9Xa{background:var(--nice-bg-secondary,#2d2d2d);border:1px solid var(--nice-border,#444);border-radius:var(--nice-radius-sm,3px);color:var(--nice-text,#e0e0e0);cursor:pointer;font-size:11px;height:24px;padding:0 var(--nice-space-1-5,6px)}.UVEditor-module_select__cd9Xa:focus{border-color:var(--nice-primary,#007acc);outline:none}.UVEditor-module_viewport__0S2EF{background:var(--nice-bg-secondary,#2a2a2a);cursor:crosshair;flex:1;overflow:hidden;position:relative}.UVEditor-module_canvas__L8eJJ{display:block;height:100%;width:100%}.UVEditor-module_noGeometry__J0MOa{align-items:center;color:var(--nice-text-muted,#666);display:flex;font-size:14px;inset:0;justify-content:center;pointer-events:none;position:absolute}.UVEditor-module_sidebar__zcI1d{background:var(--nice-bg-tertiary,#252526);border-left:1px solid var(--nice-border,#333);overflow-y:auto;width:200px}.UVEditor-module_panel__wRBD0{border-bottom:1px solid var(--nice-border,#333);padding:var(--nice-space-2-5,10px)}.UVEditor-module_panelTitle__5oDRo{color:var(--nice-text-muted,#888);font-size:11px;font-weight:600;letter-spacing:.5px;margin:0 0 var(--nice-space-2,8px) 0;text-transform:uppercase}.UVEditor-module_checkbox__P2anI{align-items:center;cursor:pointer;display:flex;font-size:11px;gap:var(--nice-space-1-5,6px);margin-bottom:var(--nice-space-1-5,6px)}.UVEditor-module_checkbox__P2anI input{accent-color:var(--nice-primary,#007acc);cursor:pointer;height:14px;margin:0;width:14px}.UVEditor-module_stat__j2lxJ{display:flex;font-size:11px;justify-content:space-between;padding:var(--nice-space-0-75,3px) 0}.UVEditor-module_stat__j2lxJ span:first-child{color:var(--nice-text-muted,#888)}.UVEditor-module_stat__j2lxJ span:last-child{color:var(--nice-text,#e0e0e0);font-weight:500}.UVEditor-module_rangeLabel__6OS0o{display:block;font-size:11px;margin-top:var(--nice-space-2,8px)}.UVEditor-module_rangeLabel__6OS0o input{accent-color:var(--nice-primary,#007acc);margin-top:var(--nice-space-1,4px);width:100%}.UVEditor-module_statusBar__KYYrx{background:var(--nice-bg-inset,#1a1a1a);border-top:1px solid var(--nice-border,#333);color:var(--nice-text-muted,#888);display:flex;font-size:11px;gap:var(--nice-space-4,16px);padding:var(--nice-space-1,4px) var(--nice-space-2,8px)}.UVEditor-module_statusBar__KYYrx span{white-space:nowrap}@media (max-width:768px){.UVEditor-module_sidebar__zcI1d{display:none}.UVEditor-module_toolbar__wPDkZ{overflow-x:auto}}.MaterialEditor-module_materialEditor__RjU0e{--bg-primary:var(--nice-bg,#1e1e1e);--bg-secondary:var(--nice-bg-secondary,#252526);--bg-tertiary:var(--nice-bg-secondary,#2d2d2d);--bg-hover:var(--nice-bg-secondary,#3a3a3a);--bg-active:var(--nice-bg-secondary,#4a4a4a);--text-primary:var(--nice-text-primary,#fff);--text-secondary:var(--nice-text-secondary,#ccc);--text-muted:var(--nice-text-secondary,#888);--border-color:var(--nice-bg-secondary,#3a3a3a);--border-light:var(--nice-bg-secondary,#4a4a4a);--accent-color:var(--nice-primary,#0078d4);--accent-hover:#1084d8;--error-color:var(--nice-danger,#f44336);--warning-color:var(--nice-warning,#ff9800);--success-color:var(--nice-success,#4caf50);--shadow-sm:0 1px 3px var(--nice-overlay-30,rgba(0,0,0,.3));--shadow-md:0 4px 6px var(--nice-overlay-40,rgba(0,0,0,.4));--shadow-lg:0 10px 20px var(--nice-overlay-50,rgba(0,0,0,.5));--node-shadow:0 4px 12px var(--nice-overlay-50,rgba(0,0,0,.5));--transition-fast:0.1s ease;--transition-normal:0.2s ease;--border-radius-sm:3px;--border-radius-md:6px;--border-radius-lg:10px}.MaterialEditor-module_materialEditor__RjU0e.MaterialEditor-module_light__zSnpW{--bg-primary:var(--nice-bg-secondary,#f5f5f5);--bg-secondary:var(--nice-bg,#fff);--bg-tertiary:var(--nice-border,#e0e0e0);--bg-hover:var(--nice-border,#d0d0d0);--bg-active:var(--nice-border,silver);--text-primary:var(--nice-text-primary,#1e1e1e);--text-secondary:var(--nice-text,#333);--text-muted:var(--nice-text-secondary,#666);--border-color:var(--nice-border,#d0d0d0);--border-light:var(--nice-border,#e0e0e0);--shadow-sm:0 1px 3px var(--nice-overlay-10,rgba(0,0,0,.1));--shadow-md:0 4px 6px var(--nice-overlay-15,rgba(0,0,0,.15));--shadow-lg:0 10px 20px var(--nice-overlay-20,rgba(0,0,0,.2));--node-shadow:0 4px 12px var(--nice-overlay-20,rgba(0,0,0,.2))}.MaterialEditor-module_materialEditor__RjU0e{background-color:var(--nice-bg-primary);border-radius:var(--nice-radius-lg);color:var(--nice-text-primary);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;font-size:13px;overflow:hidden;user-select:none}.MaterialEditor-module_toolbar__qqDbE{align-items:center;background-color:var(--nice-bg-secondary);border-bottom:1px solid var(--nice-border-color);display:flex;gap:var(--nice-space-1,4px);padding:var(--nice-space-1-5,6px) var(--nice-space-2-5,10px)}.MaterialEditor-module_toolbarGroup__fgE2r{align-items:center;display:flex;gap:var(--nice-space-0-5,2px)}.MaterialEditor-module_toolbarSeparator__Z9B1i{background-color:var(--nice-border-color);height:20px;margin:0 var(--nice-space-1-5,6px);width:1px}.MaterialEditor-module_toolbar__qqDbE button{align-items:center;background-color:transparent;border:none;border-radius:var(--nice-radius-sm);color:var(--nice-text-primary);cursor:pointer;display:flex;font-size:14px;height:28px;justify-content:center;padding:0;transition:background-color var(--transition-fast);width:28px}.MaterialEditor-module_toolbar__qqDbE button:active:not(:disabled),.MaterialEditor-module_toolbar__qqDbE button:hover:not(:disabled){background-color:var(--nice-hover-bg)}.MaterialEditor-module_toolbar__qqDbE button:disabled{cursor:not-allowed;opacity:.4}.MaterialEditor-module_toolbar__qqDbE button.MaterialEditor-module_active__DEZaw{background-color:var(--nice-color-accent);color:#fff}.MaterialEditor-module_palette__VNmnu{background-color:var(--nice-bg-secondary);border-right:1px solid var(--nice-border-color);display:flex;flex-direction:column;flex-shrink:0;width:220px}.MaterialEditor-module_paletteSearch__rE-c5{border-bottom:1px solid var(--nice-border-color);padding:var(--nice-space-2,8px)}.MaterialEditor-module_searchInput__H7FJt{background-color:var(--nice-bg-tertiary);border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-md);color:var(--nice-text-primary);font-size:12px;outline:none;padding:var(--nice-space-1-5,6px) var(--nice-space-2-5,10px);transition:border-color var(--transition-fast);width:100%}.MaterialEditor-module_searchInput__H7FJt:focus{border-color:var(--nice-color-accent)}.MaterialEditor-module_searchInput__H7FJt::placeholder{color:var(--nice-text-muted)}.MaterialEditor-module_paletteCategories__sbn9d{flex:1;overflow-y:auto;padding:var(--nice-space-1,4px) 0}.MaterialEditor-module_paletteCategory__LgsIy{margin-bottom:var(--nice-space-0-5,2px)}.MaterialEditor-module_categoryHeader__8M6DH{align-items:center;background-color:transparent;border:none;border-left:3px solid transparent;color:var(--nice-text-primary);cursor:pointer;display:flex;font-size:12px;font-weight:600;gap:var(--nice-space-1-5,6px);padding:var(--nice-space-2,8px) var(--nice-space-2-5,10px);text-align:left;transition:background-color var(--transition-fast);width:100%}.MaterialEditor-module_categoryHeader__8M6DH:hover{background-color:var(--nice-hover-bg)}.MaterialEditor-module_categoryIcon__coBim{color:var(--nice-text-muted);font-size:10px;width:14px}.MaterialEditor-module_categoryCount__rnYwK{background-color:var(--nice-bg-tertiary);border-radius:var(--nice-radius-lg,10px);color:var(--nice-text-muted);font-size:10px;font-weight:400;margin-left:auto;padding:var(--nice-space-0-5,2px) var(--nice-space-1-5,6px)}.MaterialEditor-module_categoryNodes__GMJz6{padding:var(--nice-space-0-5,2px) 0}.MaterialEditor-module_paletteNode__4-ncg{align-items:center;cursor:grab;display:flex;gap:var(--nice-space-2,8px);padding:var(--nice-space-1-5,6px) var(--nice-space-2-5,10px) var(--nice-space-1-5,6px) var(--nice-space-7,28px);transition:background-color var(--transition-fast)}.MaterialEditor-module_paletteNode__4-ncg:hover{background-color:var(--nice-hover-bg)}.MaterialEditor-module_paletteNode__4-ncg:active{cursor:grabbing}.MaterialEditor-module_nodeColor__ql5xb{border-radius:var(--nice-radius-sm,3px);flex-shrink:0;height:12px;width:12px}.MaterialEditor-module_nodeName__K0Rqi{color:var(--nice-text-secondary);flex:1;font-size:12px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.MaterialEditor-module_graphCanvas__guLj7{background-color:var(--nice-bg-primary);cursor:grab;flex:1;overflow:hidden;position:relative}.MaterialEditor-module_graphCanvas__guLj7:active{cursor:grabbing}.MaterialEditor-module_connectionsSvg__9SyYo{height:100%;left:0;pointer-events:none;position:absolute;top:0;width:100%}.MaterialEditor-module_connection__x9F9U{cursor:pointer;pointer-events:stroke;transition:stroke-width var(--transition-fast),stroke var(--transition-fast)}.MaterialEditor-module_connection__x9F9U:hover{stroke-width:4px}.MaterialEditor-module_pendingConnection__NCBtj{animation:MaterialEditor-module_dashAnimation__YLpH3 .5s linear infinite;pointer-events:none}@keyframes MaterialEditor-module_dashAnimation__YLpH3{to{stroke-dashoffset:-10}}.MaterialEditor-module_graphNode__pCqYA{background-color:var(--nice-bg-secondary);border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-md);box-shadow:var(--node-shadow);cursor:move;overflow:visible;position:absolute;transition:border-color var(--transition-fast),box-shadow var(--transition-fast)}.MaterialEditor-module_graphNode__pCqYA:hover{border-color:var(--nice-border-light)}.MaterialEditor-module_graphNode__pCqYA.MaterialEditor-module_selected__ozIqt{border-color:var(--nice-color-accent);box-shadow:0 0 0 2px var(--nice-color-accent),var(--node-shadow)}.MaterialEditor-module_graphNode__pCqYA.MaterialEditor-module_locked__8RRAH{cursor:not-allowed;opacity:.8}.MaterialEditor-module_nodeHeader__-PBFg{align-items:center;border-radius:var(--nice-radius-md) var(--nice-radius-md) 0 0;color:#fff;display:flex;font-size:11px;font-weight:600;justify-content:space-between;padding:var(--nice-space-1-5,6px) var(--nice-space-2-5,10px);text-shadow:0 1px 2px var(--nice-overlay-30,rgba(0,0,0,.3))}.MaterialEditor-module_nodeTitle__i2PcO{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.MaterialEditor-module_lockIcon__tPzIi{font-size:10px;margin-left:var(--nice-space-1-5,6px)}.MaterialEditor-module_nodePorts__APKPN{padding:var(--nice-space-1,4px) 0;position:relative}.MaterialEditor-module_inputPorts__7MVX4{left:0;position:absolute;top:0}.MaterialEditor-module_outputPorts__GUwXJ{position:absolute;right:0;top:0}.MaterialEditor-module_port__zc4vm{align-items:center;display:flex;font-size:10px;height:20px;position:absolute;white-space:nowrap}.MaterialEditor-module_inputPorts__7MVX4 .MaterialEditor-module_port__zc4vm{left:0;padding-left:var(--nice-space-3-5,14px)}.MaterialEditor-module_outputPorts__GUwXJ .MaterialEditor-module_port__zc4vm{justify-content:flex-end;padding-right:var(--nice-space-3-5,14px);right:0}.MaterialEditor-module_portHandle__oNh4P{border:2px solid var(--nice-bg-secondary);border-radius:var(--nice-radius-full,50%);box-sizing:border-box;cursor:crosshair;height:10px;position:absolute;transition:transform var(--transition-fast);width:10px}.MaterialEditor-module_portHandle__oNh4P:hover{transform:scale(1.3)}.MaterialEditor-module_inputHandle__6lz91{left:-5px}.MaterialEditor-module_outputHandle__8-r1i{right:-5px}.MaterialEditor-module_portHandle__oNh4P.MaterialEditor-module_connected__qo4za{border-color:transparent}.MaterialEditor-module_portLabel__T8daS{color:var(--nice-text-secondary)}.MaterialEditor-module_nodeComment__wkIoF{background-color:rgba(255,235,59,.15);border:1px solid rgba(255,235,59,.4);border-radius:var(--nice-radius-sm);bottom:-24px;color:var(--nice-warning,#ffeb3b);font-size:10px;left:0;overflow:hidden;padding:var(--nice-space-0-5,2px) var(--nice-space-1-5,6px);position:absolute;right:0;text-overflow:ellipsis;white-space:nowrap}.MaterialEditor-module_previewPanel__lqiI0{background-color:var(--nice-bg-secondary);border-left:1px solid var(--nice-border-color);display:flex;flex-direction:column;flex-shrink:0;width:220px}.MaterialEditor-module_previewHeader__vkqDk{align-items:center;border-bottom:1px solid var(--nice-border-color);display:flex;font-size:12px;font-weight:600;justify-content:space-between;padding:var(--nice-space-2-5,10px) var(--nice-space-3,12px)}.MaterialEditor-module_previewModeSelect__qbL8f{background-color:var(--nice-bg-tertiary);border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-sm);color:var(--nice-text-primary);cursor:pointer;font-size:11px;padding:var(--nice-space-0-75,3px) var(--nice-space-2,8px)}.MaterialEditor-module_previewCanvas__q91ue{align-items:center;aspect-ratio:1;background-color:var(--nice-bg-primary);border-bottom:1px solid var(--nice-border-color);display:flex;justify-content:center;position:relative}.MaterialEditor-module_previewCanvas__q91ue canvas{max-height:100%;max-width:100%}.MaterialEditor-module_previewCompiling__GVFRq{align-items:center;animation:MaterialEditor-module_pulse__6IS0P 1s ease infinite;background-color:var(--nice-overlay-60,rgba(0,0,0,.6));bottom:0;color:#fff;display:flex;font-size:12px;justify-content:center;left:0;position:absolute;right:0;top:0}@keyframes MaterialEditor-module_pulse__6IS0P{0%,to{opacity:1}50%{opacity:.6}}.MaterialEditor-module_previewErrors__6JZfZ{flex:1;overflow-y:auto;padding:var(--nice-space-2-5,10px)}.MaterialEditor-module_previewError__Rotpo{background-color:rgba(244,67,54,.15);border:1px solid rgba(244,67,54,.4);border-radius:var(--nice-radius-sm);color:var(--nice-color-error);font-size:11px;margin-bottom:var(--nice-space-1-5,6px);padding:var(--nice-space-1-5,6px) var(--nice-space-2,8px);word-break:break-word}.MaterialEditor-module_propertiesPanel__H3Lej{background-color:var(--nice-bg-secondary);border-left:1px solid var(--nice-border-color);display:flex;flex-direction:column;flex-shrink:0;width:280px}.MaterialEditor-module_propertiesHeader__ZLXL2{align-items:center;border-bottom:1px solid var(--nice-border-color);display:flex;font-size:12px;font-weight:600;padding:var(--nice-space-2-5,10px) var(--nice-space-3,12px)}.MaterialEditor-module_propertiesContent__3LWte{flex:1;overflow-y:auto;padding:var(--nice-space-3,12px)}.MaterialEditor-module_propertyGroup__3Rz-K{margin-bottom:var(--nice-space-4,16px)}.MaterialEditor-module_propertyGroupTitle__Wsswl{color:var(--nice-text-muted);font-size:11px;font-weight:600;letter-spacing:.5px;margin-bottom:var(--nice-space-2,8px);text-transform:uppercase}.MaterialEditor-module_propertyRow__eAshz{display:flex;flex-direction:column;margin-bottom:var(--nice-space-2-5,10px)}.MaterialEditor-module_propertyLabel__wwNGL{color:var(--nice-text-secondary);font-size:11px;margin-bottom:var(--nice-space-1,4px)}.MaterialEditor-module_propertyInput__oK2eE{background-color:var(--nice-bg-tertiary);border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-sm);color:var(--nice-text-primary);font-size:12px;outline:none;padding:var(--nice-space-1-5,6px) var(--nice-space-2,8px);transition:border-color var(--transition-fast)}.MaterialEditor-module_propertyInput__oK2eE:focus{border-color:var(--nice-color-accent)}.MaterialEditor-module_propertyColorPreview__1L-S5{align-items:center;display:flex;gap:var(--nice-space-2,8px)}.MaterialEditor-module_colorSwatch__rHMga{border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-sm);cursor:pointer;height:24px;width:24px}.MaterialEditor-module_propertySlider__NztWp{align-items:center;display:flex;gap:var(--nice-space-2,8px)}.MaterialEditor-module_propertySlider__NztWp input[type=range]{-webkit-appearance:none;background:var(--nice-bg-tertiary);border-radius:var(--nice-radius-sm,2px);flex:1;height:4px;outline:none}.MaterialEditor-module_propertySlider__NztWp input[type=range]::-webkit-slider-thumb{-webkit-appearance:none;background:var(--nice-color-accent);border-radius:var(--nice-radius-full,50%);cursor:pointer;height:14px;width:14px}.MaterialEditor-module_propertySlider__NztWp .MaterialEditor-module_sliderValue__HeKO-{color:var(--nice-text-secondary);font-size:11px;text-align:right;width:50px}.MaterialEditor-module_minimap__mPE-C{background-color:var(--nice-bg-secondary);border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-md);bottom:10px;box-shadow:var(--nice-shadow-md);height:100px;overflow:hidden;position:absolute;right:10px;width:150px}.MaterialEditor-module_minimapNodes__DCW6r{height:100%;position:relative;width:100%}.MaterialEditor-module_minimapNode__EoDhh{border-radius:var(--nice-radius-sm,2px);position:absolute}.MaterialEditor-module_minimapViewport__qUyIg{border:1px solid var(--nice-color-accent)}.MaterialEditor-module_minimapViewport__qUyIg,.MaterialEditor-module_selectionBox__5-dcw{background-color:var(--nice-primary-tint-10,rgba(0,120,212,.1));pointer-events:none;position:absolute}.MaterialEditor-module_selectionBox__5-dcw{border:1px dashed var(--nice-color-accent)}.MaterialEditor-module_contextMenu__jMJ2-{background-color:var(--nice-bg-secondary);border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-md);box-shadow:var(--nice-shadow-lg);min-width:160px;padding:var(--nice-space-1,4px) 0;position:fixed;z-index:1000}.MaterialEditor-module_contextMenuItem__NltnJ{align-items:center;cursor:pointer;display:flex;font-size:12px;justify-content:space-between;padding:var(--nice-space-1-5,6px) var(--nice-space-3,12px);transition:background-color var(--transition-fast)}.MaterialEditor-module_contextMenuItem__NltnJ:hover{background-color:var(--nice-hover-bg)}.MaterialEditor-module_contextMenuItem__NltnJ.MaterialEditor-module_disabled__NnXkq{color:var(--nice-text-muted);cursor:not-allowed}.MaterialEditor-module_contextMenuItem__NltnJ.MaterialEditor-module_disabled__NnXkq:hover{background-color:transparent}.MaterialEditor-module_contextMenuShortcut__2-fdl{color:var(--nice-text-muted);font-size:11px;margin-left:var(--nice-space-5,20px)}.MaterialEditor-module_contextMenuSeparator__yYjvC{background-color:var(--nice-border-color);height:1px;margin:var(--nice-space-1,4px) 0}.MaterialEditor-module_zoomControls__7PATW{align-items:center;background-color:var(--nice-bg-secondary);border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-md);bottom:10px;box-shadow:var(--nice-shadow-sm);display:flex;gap:var(--nice-space-1,4px);left:10px;padding:var(--nice-space-1,4px);position:absolute}.MaterialEditor-module_zoomControls__7PATW button{align-items:center;background-color:transparent;border:none;border-radius:var(--nice-radius-sm);color:var(--nice-text-primary);cursor:pointer;display:flex;font-size:14px;height:26px;justify-content:center;padding:0;transition:background-color var(--transition-fast);width:26px}.MaterialEditor-module_zoomControls__7PATW button:hover{background-color:var(--nice-hover-bg)}.MaterialEditor-module_zoomLevel__Rw6xW{color:var(--nice-text-secondary);font-size:11px;min-width:50px;text-align:center}.MaterialEditor-module_tooltip__lTpIH{word-wrap:break-word;background-color:var(--nice-text-primary,#333);border-radius:var(--nice-radius-sm);box-shadow:var(--nice-shadow-md);color:var(--nice-text-inverse,#fff);font-size:11px;max-width:250px;padding:var(--nice-space-1-5,6px) var(--nice-space-2-5,10px);pointer-events:none;position:fixed;white-space:pre-wrap;z-index:9999}.MaterialEditor-module_tooltip__lTpIH:before{border-color:var(--nice-border-color,#333) transparent transparent transparent;border-style:solid;border-width:5px;content:"";left:50%;position:absolute;top:100%;transform:translateX(-50%)}.MaterialEditor-module_emptyState__Kpa84{color:var(--nice-text-muted);left:50%;position:absolute;text-align:center;top:50%;transform:translate(-50%,-50%)}.MaterialEditor-module_emptyStateIcon__67zsA{font-size:48px;margin-bottom:var(--nice-space-4,16px);opacity:.5}.MaterialEditor-module_emptyStateTitle__0NQ65{color:var(--nice-text-secondary);font-size:16px;font-weight:600;margin-bottom:var(--nice-space-2,8px)}.MaterialEditor-module_emptyStateDescription__QgVz5{font-size:13px;line-height:1.5;max-width:300px}@media (max-width:900px){.MaterialEditor-module_palette__VNmnu{bottom:0;left:0;position:absolute;top:0;transform:translateX(-100%);transition:transform var(--transition-normal);z-index:100}.MaterialEditor-module_palette__VNmnu.MaterialEditor-module_open__DG5-R{transform:translateX(0)}.MaterialEditor-module_previewPanel__lqiI0{bottom:0;position:absolute;right:0;top:0;transform:translateX(100%);transition:transform var(--transition-normal);z-index:100}.MaterialEditor-module_previewPanel__lqiI0.MaterialEditor-module_open__DG5-R{transform:translateX(0)}}@media (max-width:600px){.MaterialEditor-module_toolbar__qqDbE{flex-wrap:wrap;padding:var(--nice-space-1,4px)}.MaterialEditor-module_toolbarGroup__fgE2r{flex-wrap:wrap}.MaterialEditor-module_toolbar__qqDbE button{font-size:16px;height:32px;width:32px}.MaterialEditor-module_palette__VNmnu,.MaterialEditor-module_previewPanel__lqiI0{max-width:280px;width:100%}}@keyframes MaterialEditor-module_nodeAppear__4vHEB{0%{opacity:0;transform:scale(.9)}to{opacity:1;transform:scale(1)}}.MaterialEditor-module_graphNode__pCqYA{animation:MaterialEditor-module_nodeAppear__4vHEB .2s ease}@keyframes MaterialEditor-module_connectionDraw__xvI66{0%{stroke-dashoffset:1000}to{stroke-dashoffset:0}}.MaterialEditor-module_connection__x9F9U{stroke-dasharray:1000;animation:MaterialEditor-module_connectionDraw__xvI66 .3s ease forwards}.MaterialEditor-module_materialEditor__RjU0e:focus-visible{outline:2px solid var(--nice-color-accent);outline-offset:-2px}.MaterialEditor-module_categoryHeader__8M6DH:focus-visible,.MaterialEditor-module_paletteNode__4-ncg:focus-visible,.MaterialEditor-module_toolbar__qqDbE button:focus-visible{outline:2px solid var(--nice-color-accent);outline-offset:-2px}@media (prefers-reduced-motion:reduce){.MaterialEditor-module_connection__x9F9U,.MaterialEditor-module_graphNode__pCqYA,.MaterialEditor-module_pendingConnection__NCBtj{animation:none}*,:after,:before{animation-duration:.01ms!important;transition-duration:.01ms!important}}@media print{.MaterialEditor-module_minimap__mPE-C,.MaterialEditor-module_palette__VNmnu,.MaterialEditor-module_previewPanel__lqiI0,.MaterialEditor-module_toolbar__qqDbE,.MaterialEditor-module_zoomControls__7PATW{display:none!important}.MaterialEditor-module_materialEditor__RjU0e{border:1px solid var(--nice-border,#ccc)}.MaterialEditor-module_graphCanvas__guLj7{background-color:#fff}.MaterialEditor-module_graphNode__pCqYA{border:1px solid var(--nice-border-color,#333);box-shadow:none}.MaterialEditor-module_connection__x9F9U{stroke:var(--nice-text,#333)!important}}.ParticleEditor-module_particleEditor__HiTCi{--pe-bg-primary:var(--nice-bg,#1a1a1a);--pe-bg-secondary:var(--nice-bg-secondary,#252525);--pe-bg-tertiary:var(--nice-bg-secondary,#2d2d2d);--pe-bg-hover:var(--nice-bg-secondary,#3a3a3a);--pe-bg-active:var(--nice-bg-secondary,#4a4a4a);--pe-border-color:var(--nice-border,#404040);--pe-text-primary:var(--nice-text-primary,#fff);--pe-text-secondary:var(--nice-text-muted,#b0b0b0);--pe-text-muted:#707070;--pe-accent:#4fc3f7;--pe-accent-hover:#29b6f6;--pe-success:#66bb6a;--pe-warning:var(--nice-warning,#ffa726);--pe-error:#ef5350;--pe-toolbar-height:40px;--pe-panel-width:260px;--pe-radius:4px;--pe-transition:150ms ease}.ParticleEditor-module_particleEditor__HiTCi.ParticleEditor-module_light__AiNYo{--pe-bg-primary:var(--nice-bg-secondary,#f5f5f5);--pe-bg-secondary:var(--nice-bg,#fff);--pe-bg-tertiary:var(--nice-bg-secondary,#fafafa);--pe-bg-hover:var(--nice-border,#eee);--pe-bg-active:var(--nice-border,#e0e0e0);--pe-border-color:var(--nice-border,#d0d0d0);--pe-text-primary:var(--nice-text,#212121);--pe-text-secondary:var(--nice-text-secondary,#616161);--pe-text-muted:var(--nice-text-secondary,#9e9e9e);--pe-accent:var(--nice-primary-hover,#1976d2);--pe-accent-hover:var(--nice-primary-dark,#1565c0)}.ParticleEditor-module_particleEditor__HiTCi{background-color:var(--pe-bg-primary);border-radius:var(--pe-radius);color:var(--pe-text-primary);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;font-size:13px;overflow:hidden;user-select:none}.ParticleEditor-module_toolbar__KptWe{align-items:center;background-color:var(--pe-bg-secondary);border-bottom:1px solid var(--pe-border-color);display:flex;gap:var(--nice-space-1,4px);height:var(--pe-toolbar-height);padding:0 var(--nice-space-2,8px)}.ParticleEditor-module_toolbarGroup__-N0jI{align-items:center;display:flex;gap:var(--nice-space-0-5,2px)}.ParticleEditor-module_toolbarSeparator__kIZmD{background-color:var(--pe-border-color);height:20px;margin:0 var(--nice-space-1-5,6px);width:1px}.ParticleEditor-module_toolbar__KptWe button{align-items:center;background:transparent;border:none;border-radius:var(--pe-radius);color:var(--pe-text-secondary);cursor:pointer;display:flex;font-size:14px;height:28px;justify-content:center;transition:all var(--pe-transition);width:28px}.ParticleEditor-module_toolbar__KptWe button:hover:not(:disabled){background-color:var(--pe-bg-hover);color:var(--pe-text-primary)}.ParticleEditor-module_toolbar__KptWe button:active:not(:disabled){background-color:var(--pe-bg-active)}.ParticleEditor-module_toolbar__KptWe button.ParticleEditor-module_active__81dHl{background-color:var(--pe-accent);color:#fff}.ParticleEditor-module_toolbar__KptWe button:disabled{cursor:not-allowed;opacity:.4}.ParticleEditor-module_speedSelect__vZO0v{background-color:var(--pe-bg-tertiary);border:1px solid var(--pe-border-color);border-radius:var(--pe-radius);color:var(--pe-text-primary);cursor:pointer;font-size:11px;height:24px;padding:0 var(--nice-space-1-5,6px)}.ParticleEditor-module_timeDisplay__tl1Qv{color:var(--pe-text-secondary);font-family:monospace;font-size:11px;min-width:50px;padding:0 var(--nice-space-2,8px);text-align:right}.ParticleEditor-module_systemList__Vaiea{background-color:var(--pe-bg-secondary);border-right:1px solid var(--pe-border-color);display:flex;flex-direction:column;min-width:var(--pe-panel-width);overflow:hidden;width:var(--pe-panel-width)}.ParticleEditor-module_systemListHeader__I9W61{align-items:center;border-bottom:1px solid var(--pe-border-color);color:var(--pe-text-secondary);display:flex;font-size:12px;font-weight:600;justify-content:space-between;letter-spacing:.5px;padding:var(--nice-space-2-5,10px) var(--nice-space-3,12px);text-transform:uppercase}.ParticleEditor-module_systemListActions__C289h{display:flex;gap:var(--nice-space-1,4px)}.ParticleEditor-module_systemListActions__C289h button{align-items:center;background:transparent;border:none;border-radius:var(--pe-radius);color:var(--pe-text-secondary);cursor:pointer;display:flex;font-size:12px;height:22px;justify-content:center;width:22px}.ParticleEditor-module_systemListActions__C289h button:hover{background-color:var(--pe-bg-hover);color:var(--pe-text-primary)}.ParticleEditor-module_presetMenu__FXV-m{background-color:var(--pe-bg-tertiary);border-bottom:1px solid var(--pe-border-color);display:flex;flex-wrap:wrap;gap:var(--nice-space-1,4px);padding:var(--nice-space-1-5,6px)}.ParticleEditor-module_presetItem__zt9wm{background-color:var(--pe-bg-secondary);border:1px solid var(--pe-border-color);border-radius:var(--pe-radius);color:var(--pe-text-secondary);cursor:pointer;font-size:11px;padding:var(--nice-space-1,4px) var(--nice-space-2-5,10px);transition:all var(--pe-transition)}.ParticleEditor-module_presetItem__zt9wm:hover{background-color:var(--pe-accent);border-color:var(--pe-accent);color:#fff}.ParticleEditor-module_systemItems__a4eQN{flex:1;overflow-y:auto;padding:var(--nice-space-1-5,6px)}.ParticleEditor-module_systemItem__y-cTZ{align-items:center;border-radius:var(--pe-radius);cursor:pointer;display:flex;justify-content:space-between;padding:var(--nice-space-2,8px) var(--nice-space-2-5,10px);transition:all var(--pe-transition)}.ParticleEditor-module_systemItem__y-cTZ:hover{background-color:var(--pe-bg-hover)}.ParticleEditor-module_systemItem__y-cTZ.ParticleEditor-module_selected__wzmRZ{background-color:var(--pe-accent);color:#fff}.ParticleEditor-module_systemItem__y-cTZ.ParticleEditor-module_selected__wzmRZ .ParticleEditor-module_systemItemActions__Dc1Bw button{color:var(--nice-overlay-light-70,hsla(0,0%,100%,.7))}.ParticleEditor-module_systemItem__y-cTZ.ParticleEditor-module_selected__wzmRZ .ParticleEditor-module_systemItemActions__Dc1Bw button:hover{color:#fff}.ParticleEditor-module_systemName__-EAlQ{flex:1;font-size:12px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ParticleEditor-module_systemItemActions__Dc1Bw{display:flex;gap:var(--nice-space-0-5,2px);opacity:0;transition:opacity var(--pe-transition)}.ParticleEditor-module_systemItem__y-cTZ:hover .ParticleEditor-module_systemItemActions__Dc1Bw{opacity:1}.ParticleEditor-module_systemItemActions__Dc1Bw button{align-items:center;background:transparent;border:none;color:var(--pe-text-muted);cursor:pointer;display:flex;font-size:11px;height:20px;justify-content:center;width:20px}.ParticleEditor-module_systemItemActions__Dc1Bw button:hover:not(:disabled){color:var(--pe-text-primary)}.ParticleEditor-module_systemItemActions__Dc1Bw button:disabled{cursor:not-allowed;opacity:.3}.ParticleEditor-module_renameInput__jUWw2{background-color:var(--pe-bg-primary);border:1px solid var(--pe-accent);border-radius:var(--pe-radius);color:var(--pe-text-primary);font-size:12px;outline:none;padding:var(--nice-space-0-5,2px) var(--nice-space-1-5,6px);width:100%}.ParticleEditor-module_inspector__qP8Gq{background-color:var(--pe-bg-secondary);border-left:1px solid var(--pe-border-color);display:flex;flex-direction:column;min-width:280px;overflow:hidden;width:320px}.ParticleEditor-module_inspectorHeader__l6Uxn{border-bottom:1px solid var(--pe-border-color);font-size:13px;font-weight:600;overflow:hidden;padding:var(--nice-space-2-5,10px) var(--nice-space-3,12px);text-overflow:ellipsis;white-space:nowrap}.ParticleEditor-module_inspectorModules__pTVRa{flex:1;overflow-y:auto}.ParticleEditor-module_emptyInspector__JYoth{align-items:center;color:var(--pe-text-muted);display:flex;font-style:italic;height:100%;justify-content:center}.ParticleEditor-module_moduleSection__dQhZv{border-bottom:1px solid var(--pe-border-color)}.ParticleEditor-module_moduleHeader__u-Jjw{align-items:center;cursor:pointer;display:flex;gap:var(--nice-space-1-5,6px);padding:var(--nice-space-2,8px) var(--nice-space-3,12px);transition:background-color var(--pe-transition)}.ParticleEditor-module_moduleHeader__u-Jjw:hover{background-color:var(--pe-bg-hover)}.ParticleEditor-module_moduleHeader__u-Jjw.ParticleEditor-module_selected__wzmRZ{background-color:var(--pe-bg-tertiary)}.ParticleEditor-module_moduleIcon__iVDB-{color:var(--pe-text-muted);font-size:10px;width:12px}.ParticleEditor-module_moduleCheckbox__0B4Md{accent-color:var(--pe-accent);cursor:pointer;height:14px;margin:0;width:14px}.ParticleEditor-module_moduleName__m8AJX{flex:1;font-size:12px;font-weight:500}.ParticleEditor-module_moduleContent__pE2Ux{background-color:var(--pe-bg-tertiary);border-top:1px solid var(--pe-border-color);padding:var(--nice-space-2,8px) var(--nice-space-3,12px)}.ParticleEditor-module_moduleNotImplemented__NZDCG{color:var(--pe-text-muted);font-size:11px;font-style:italic;padding:var(--nice-space-3,12px);text-align:center}.ParticleEditor-module_propertyRow__TzuYo{align-items:center;display:flex;gap:var(--nice-space-2,8px);margin-bottom:var(--nice-space-2,8px)}.ParticleEditor-module_propertyRow__TzuYo:last-child{margin-bottom:0}.ParticleEditor-module_propertyRow__TzuYo>label{color:var(--pe-text-secondary);flex:0 0 100px;font-size:11px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ParticleEditor-module_numberInput__cKItO{background-color:var(--pe-bg-primary);border:1px solid var(--pe-border-color);border-radius:var(--pe-radius);color:var(--pe-text-primary);flex:1;font-family:monospace;font-size:11px;height:24px;min-width:50px;padding:0 var(--nice-space-1-5,6px)}.ParticleEditor-module_numberInput__cKItO:focus{border-color:var(--pe-accent);outline:none}.ParticleEditor-module_selectInput__RhZly{background-color:var(--pe-bg-primary);border:1px solid var(--pe-border-color);border-radius:var(--pe-radius);color:var(--pe-text-primary);cursor:pointer;flex:1;font-size:11px;height:24px;padding:0 var(--nice-space-1-5,6px)}.ParticleEditor-module_selectInput__RhZly:focus{border-color:var(--pe-accent);outline:none}.ParticleEditor-module_toggleInput__seU4y{accent-color:var(--pe-accent);cursor:pointer;height:16px;width:16px}.ParticleEditor-module_distributionInput__M5ciH{align-items:center;display:flex;flex:1;gap:var(--nice-space-1,4px)}.ParticleEditor-module_distributionType__NTuwm{background-color:var(--pe-bg-primary);border:1px solid var(--pe-border-color);border-radius:var(--pe-radius);color:var(--pe-text-primary);cursor:pointer;font-size:11px;height:24px;padding:0 var(--nice-space-1,4px);width:80px}.ParticleEditor-module_addButton__nSODD{background-color:var(--pe-accent);border:none;border-radius:var(--pe-radius);color:#fff;cursor:pointer;font-size:11px;padding:var(--nice-space-1,4px) var(--nice-space-3,12px);transition:background-color var(--pe-transition)}.ParticleEditor-module_addButton__nSODD:hover{background-color:var(--pe-accent-hover)}.ParticleEditor-module_previewPanel__sCCsm{align-items:center;background-color:var(--pe-bg-primary);display:flex;flex:1;justify-content:center;min-width:200px}.ParticleEditor-module_previewCanvas__b8PcH{background-color:var(--nice-bg,#1a1a1a);border-radius:var(--pe-radius)}.ParticleEditor-module_particleEditor__HiTCi ::-webkit-scrollbar{height:8px;width:8px}.ParticleEditor-module_particleEditor__HiTCi ::-webkit-scrollbar-track{background:var(--pe-bg-tertiary)}.ParticleEditor-module_particleEditor__HiTCi ::-webkit-scrollbar-thumb{background:var(--pe-border-color);border-radius:var(--nice-radius-sm,4px)}.ParticleEditor-module_particleEditor__HiTCi ::-webkit-scrollbar-thumb:hover{background:var(--pe-text-muted)}@media (max-width:900px){.ParticleEditor-module_systemList__Vaiea{min-width:200px;width:200px}.ParticleEditor-module_inspector__qP8Gq{min-width:220px;width:260px}.ParticleEditor-module_propertyRow__TzuYo>label{flex:0 0 80px}}@media (max-width:700px){.ParticleEditor-module_systemList__Vaiea{border-bottom:1px solid var(--pe-border-color);border-right:none;max-height:150px;min-width:unset;width:100%}.ParticleEditor-module_inspector__qP8Gq{border-left:none;border-top:1px solid var(--pe-border-color);min-width:unset;width:100%}}
1
+ .ModelEditor-module_root__Aiqom{background:var(--nice-bg-primary);color:var(--nice-text-primary);display:flex;flex-direction:column;font-family:Segoe UI,Consolas,monospace;font-size:12px;height:100%;overflow:hidden;user-select:none}.ModelEditor-module_menuBar__5P6Wi{align-items:center;background:var(--nice-bg-canvas);border-bottom:1px solid var(--nice-border-color);display:flex;flex-shrink:0;gap:0;height:28px;padding:0 var(--nice-space-1,4px)}.ModelEditor-module_menuBtn__f1u-N{background:none;border:none;border-radius:var(--nice-radius-sm,3px);color:var(--nice-text-secondary);cursor:pointer;font-size:11px;padding:var(--nice-space-1,4px) var(--nice-space-2-5,10px);white-space:nowrap}.ModelEditor-module_menuBtn__f1u-N:hover{background:var(--nice-bg-secondary);color:var(--nice-color-white)}.ModelEditor-module_menuBtn__f1u-N:disabled{cursor:default;opacity:.4}.ModelEditor-module_menuSep__Jilgu{background:var(--nice-bg-secondary);height:16px;margin:0 var(--nice-space-1,4px);width:1px}.ModelEditor-module_menuLabel__gn6yQ{color:var(--nice-text-secondary);font-size:10px;margin:0 var(--nice-space-1-5,6px);white-space:nowrap}.ModelEditor-module_menuRight__YQWk7{align-items:center;display:flex;gap:var(--nice-space-1,4px);margin-left:auto}.ModelEditor-module_leftPanel__sVsxG{background:var(--nice-bg-primary);overflow:hidden;width:240px}.ModelEditor-module_leftPanel__sVsxG,.ModelEditor-module_toolbar__l8uKC{border-right:1px solid var(--nice-border-color);display:flex;flex-direction:column;flex-shrink:0}.ModelEditor-module_toolbar__l8uKC{background:var(--nice-bg-elevated);gap:var(--nice-space-0-5,2px);padding:var(--nice-space-1,4px) var(--nice-space-0-5,2px);width:38px}.ModelEditor-module_toolBtn__8DzAf{align-items:center;background:none;border:1px solid transparent;border-radius:var(--nice-radius-sm,4px);color:var(--nice-text-muted);cursor:pointer;display:flex;font-size:16px;height:32px;justify-content:center;transition:all .1s;width:32px}.ModelEditor-module_toolBtn__8DzAf:hover{background:var(--nice-bg-secondary);color:var(--nice-text-secondary)}.ModelEditor-module_toolBtnActive__ek-nN{background:var(--nice-bg-tertiary)!important;border-color:var(--nice-color-primary)!important;color:var(--nice-color-white)!important}.ModelEditor-module_toolSep__5I72j{background:var(--nice-bg-secondary);height:1px;margin:var(--nice-space-1,4px) var(--nice-space-0-5,2px)}.ModelEditor-module_viewportContainer__O-e-6{background:var(--nice-bg-inset);flex:1;height:100%;min-height:0;overflow:hidden;position:relative}.ModelEditor-module_viewportContainer__O-e-6 canvas{display:block;height:100%;width:100%}.ModelEditor-module_viewportOverlay__LXDnT{display:flex;gap:var(--nice-space-1,4px);left:8px;position:absolute;top:8px;z-index:10}.ModelEditor-module_viewportBadge__-5C9w{background:var(--nice-overlay-80,rgba(20,20,40,.8));border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-sm,4px);color:var(--nice-text-muted);font-size:10px;padding:var(--nice-space-0-5,2px) var(--nice-space-2,8px)}.ModelEditor-module_viewportDropZone__PBrTo{align-items:center;background:rgba(85,102,204,.15);border:2px dashed var(--nice-color-primary);display:flex;inset:0;justify-content:center;pointer-events:none;position:absolute;z-index:20}.ModelEditor-module_viewportDropZone__PBrTo span{background:rgba(20,20,40,.9);border-radius:var(--nice-radius-lg,8px);color:var(--nice-text-muted,#aab);font-size:14px;padding:var(--nice-space-3,12px) var(--nice-space-6,24px)}.ModelEditor-module_rightPanel__oJf3N{background:var(--nice-bg-primary);border-left:1px solid var(--nice-border-color);display:flex;flex-direction:column;flex-shrink:0;overflow-y:auto;width:280px}.ModelEditor-module_panelSection__yb-jc{border-bottom:1px solid var(--nice-border-color);padding:var(--nice-space-1-5,6px) var(--nice-space-2,8px)}.ModelEditor-module_panelTitle__rp8tH{align-items:center;color:var(--nice-text-secondary);cursor:pointer;display:flex;font-size:10px;justify-content:space-between;letter-spacing:.5px;margin-bottom:var(--nice-space-1,4px);text-transform:uppercase}.ModelEditor-module_panelTitle__rp8tH button{background:none;border:none;color:var(--nice-text-secondary);cursor:pointer;font-size:14px;line-height:1;padding:0 var(--nice-space-0-5,2px)}.ModelEditor-module_panelTitle__rp8tH button:hover{color:var(--nice-text-muted)}.ModelEditor-module_panelCollapsed__xBsUg .ModelEditor-module_panelContent__IMNnR{display:none}.ModelEditor-module_panelContent__IMNnR{padding-top:var(--nice-space-1,4px)}.ModelEditor-module_treeItem__MiVWT{align-items:center;border-radius:var(--nice-radius-sm,3px);cursor:pointer;display:flex;font-size:11px;gap:var(--nice-space-1,4px);overflow:hidden;padding:var(--nice-space-0-75,3px) var(--nice-space-1,4px) var(--nice-space-0-75,3px) 0;text-overflow:ellipsis;white-space:nowrap}.ModelEditor-module_treeItem__MiVWT:hover{background:var(--nice-overlay-light-4,hsla(0,0%,100%,.04))}.ModelEditor-module_treeItemActive__4ntXK{background:var(--nice-surface)!important;outline:1px solid var(--nice-color-primary-hover)}.ModelEditor-module_treeIcon__PzniU{flex-shrink:0;font-size:12px;opacity:.6;text-align:center;width:16px}.ModelEditor-module_treeIndent__ISBk-{display:inline-block;flex-shrink:0;width:16px}.ModelEditor-module_treeToggle__Ge5PW{color:var(--nice-text-muted);cursor:pointer;flex-shrink:0;font-size:8px;text-align:center;width:12px}.ModelEditor-module_treeVisibility__BjKaL{cursor:pointer;flex-shrink:0;font-size:10px;opacity:.5;padding:0 var(--nice-space-0-5,2px)}.ModelEditor-module_treeVisibility__BjKaL:hover{opacity:1}.ModelEditor-module_propRow__AONtp{align-items:center;display:flex;gap:var(--nice-space-1-5,6px);margin-bottom:var(--nice-space-0-75,3px)}.ModelEditor-module_propLabel__bwkAK{color:var(--nice-text-muted);flex-shrink:0;font-size:10px;min-width:50px}.ModelEditor-module_propInput__aFI4Q{background:var(--nice-bg-canvas);border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-sm,3px);color:var(--nice-text-primary);flex:1;font-size:11px;min-width:0;padding:var(--nice-space-0-5,2px) var(--nice-space-1,4px)}.ModelEditor-module_propInput__aFI4Q:focus{border-color:var(--nice-color-primary);outline:none}.ModelEditor-module_propVec3__2FcMf{display:flex;flex:1;gap:var(--nice-space-0-5,2px)}.ModelEditor-module_propVec3__2FcMf input{background:var(--nice-bg-canvas);border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-sm,3px);color:var(--nice-text-primary);flex:1;font-size:10px;min-width:0;padding:var(--nice-space-0-5,2px) var(--nice-space-0-75,3px);text-align:center}.ModelEditor-module_propVec3__2FcMf input:focus{border-color:var(--nice-color-primary);outline:none}.ModelEditor-module_propVec3X__lfQtN{border-left:2px solid #c44!important}.ModelEditor-module_propVec3Y__PmF5p{border-left:2px solid #4c4!important}.ModelEditor-module_propVec3Z__swB76{border-left:2px solid #48c!important}.ModelEditor-module_propColorSwatch__SMg9F{border:1px solid var(--nice-overlay-light-15,hsla(0,0%,100%,.15));border-radius:var(--nice-radius-sm,3px);cursor:pointer;flex-shrink:0;height:24px;position:relative;width:24px}.ModelEditor-module_propColorSwatch__SMg9F input{cursor:pointer;height:100%;inset:0;opacity:0;position:absolute;width:100%}.ModelEditor-module_propCheckbox__-eSHl{accent-color:var(--nice-color-primary)}.ModelEditor-module_propSelect__1YXcX{background:var(--nice-bg-canvas);border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-sm,3px);color:var(--nice-text-primary);flex:1;font-size:11px;min-width:0;padding:var(--nice-space-0-5,2px) var(--nice-space-1,4px)}.ModelEditor-module_bottomPanel__ojUaN{background:var(--nice-bg-canvas);border-top:1px solid var(--nice-border-color);display:flex;flex-direction:column;flex-shrink:0;height:200px;overflow:hidden}.ModelEditor-module_bottomPanelCollapsed__P2I6E{height:28px}.ModelEditor-module_bottomPanelHeader__z9D6b{align-items:center;border-bottom:1px solid var(--nice-border-color);display:flex;flex-shrink:0;gap:var(--nice-space-1,4px);height:28px;padding:0 var(--nice-space-2,8px)}.ModelEditor-module_bottomPanelTitle__0P32m{color:var(--nice-text-secondary);cursor:pointer;font-size:10px;letter-spacing:.5px;text-transform:uppercase}.ModelEditor-module_bottomToggle__fsUEB{color:var(--nice-text-muted);cursor:pointer;font-size:8px;margin-right:var(--nice-space-1,4px)}.ModelEditor-module_transportBar__bh6Sb{align-items:center;display:flex;gap:var(--nice-space-0-5,2px)}.ModelEditor-module_transportBtn__egXSB{background:none;border:none;border-radius:var(--nice-radius-sm,3px);color:var(--nice-text-secondary);cursor:pointer;font-size:14px;padding:var(--nice-space-0-5,2px) var(--nice-space-1-5,6px)}.ModelEditor-module_transportBtn__egXSB:hover{background:var(--nice-bg-secondary);color:var(--nice-color-white)}.ModelEditor-module_transportBtnActive__j6Y94{color:var(--nice-color-primary)!important}.ModelEditor-module_transportTime__7RzUh{color:var(--nice-text-muted);font-size:10px;font-variant-numeric:tabular-nums;margin:0 var(--nice-space-2,8px)}.ModelEditor-module_animListArea__rzc1e{display:flex;flex:1;min-height:0;overflow:hidden}.ModelEditor-module_animList__lGNt5{border-right:1px solid var(--nice-border-color);flex-shrink:0;overflow-y:auto;width:200px}.ModelEditor-module_animItem__lZGOY{align-items:center;border-left:2px solid transparent;cursor:pointer;display:flex;font-size:11px;gap:var(--nice-space-1,4px);padding:var(--nice-space-0-75,3px) var(--nice-space-2,8px)}.ModelEditor-module_animItem__lZGOY:hover{background:var(--nice-overlay-light-4,hsla(0,0%,100%,.04))}.ModelEditor-module_animItemActive__8pKLd{background:var(--nice-surface)!important;border-left-color:var(--nice-color-primary)}.ModelEditor-module_animDuration__CAwuG{color:var(--nice-text-muted);font-size:9px;margin-left:auto}.ModelEditor-module_timelineArea__WFBHa{flex:1;overflow-x:auto;overflow-y:hidden;position:relative}.ModelEditor-module_timelineRuler__jlW8F{background:var(--nice-bg-canvas);border-bottom:1px solid var(--nice-border-color);height:20px;position:relative}.ModelEditor-module_rulerTick__VhJRA{background:var(--nice-bg-secondary);height:100%;position:absolute;top:0;width:1px}.ModelEditor-module_rulerLabel__Pwl9a{color:var(--nice-text-muted);font-size:8px;position:absolute;top:2px;transform:translateX(-50%)}.ModelEditor-module_playhead__Rd4rh{background:var(--nice-color-primary);pointer-events:none;position:absolute;top:0;width:2px;z-index:3}.ModelEditor-module_playheadHandle__rIBHA{background:var(--nice-color-primary);clip-path:polygon(0 0,100% 0,50% 100%);height:8px;position:absolute;top:0;transform:translateX(-3px);width:8px}.ModelEditor-module_timelineTracks__joMHo{position:relative}.ModelEditor-module_keyframeDiamond__kffdC{background:#e8a030;cursor:pointer;height:8px;position:absolute;transform:rotate(45deg);width:8px;z-index:2}.ModelEditor-module_keyframeDiamond__kffdC:hover{background:#f0c060}.ModelEditor-module_keyframeDiamondSelected__xURk4{background:var(--nice-color-white)!important}.ModelEditor-module_statusBar__AJMzx{align-items:center;background:var(--nice-bg-canvas);border-top:1px solid var(--nice-border-color);color:var(--nice-text-muted);display:flex;flex-shrink:0;font-size:10px;gap:var(--nice-space-3,12px);height:20px;padding:var(--nice-space-0-5,2px) var(--nice-space-2,8px)}.ModelEditor-module_materialCard__1IGe7{background:var(--nice-bg-canvas);border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-sm,4px);margin-bottom:var(--nice-space-1-5,6px);padding:var(--nice-space-1-5,6px)}.ModelEditor-module_materialCardActive__VEnBX{border-color:var(--nice-color-primary)}.ModelEditor-module_materialHeader__WtTh3{align-items:center;display:flex;gap:var(--nice-space-1-5,6px);margin-bottom:var(--nice-space-1,4px)}.ModelEditor-module_materialPreview__IF7qd{border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-sm,4px);flex-shrink:0;height:32px;overflow:hidden;width:32px}.ModelEditor-module_materialPreview__IF7qd canvas{height:100%;width:100%}.ModelEditor-module_materialName__TvRhs{flex:1;font-size:11px;font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ModelEditor-module_textureSlot__PLqef{align-items:center;display:flex;gap:var(--nice-space-1-5,6px);margin-bottom:var(--nice-space-1,4px)}.ModelEditor-module_textureThumb__PdCTD{background:#0a0a15;border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-sm,3px);flex-shrink:0;height:28px;overflow:hidden;width:28px}.ModelEditor-module_textureThumb__PdCTD img{height:100%;object-fit:cover;width:100%}.ModelEditor-module_textureInfo__XOzZI{flex:1;min-width:0}.ModelEditor-module_textureName__H-2d3{font-size:10px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ModelEditor-module_textureBtn__zUt3m{background:none;border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-sm,3px);color:var(--nice-text-muted);cursor:pointer;font-size:10px;padding:var(--nice-space-px,1px) var(--nice-space-1-5,6px)}.ModelEditor-module_textureBtn__zUt3m:hover{background:var(--nice-bg-secondary);color:var(--nice-text-secondary)}.ModelEditor-module_btnPrimary__IAz0U{background:var(--nice-color-primary);border:none;border-radius:var(--nice-radius-sm,4px);color:var(--nice-color-white);cursor:pointer;font-size:11px;padding:var(--nice-space-1,4px) var(--nice-space-3,12px);white-space:nowrap}.ModelEditor-module_btnPrimary__IAz0U:hover{background:var(--nice-primary,#67d)}.ModelEditor-module_btnPrimary__IAz0U:disabled{cursor:default;opacity:.4}.ModelEditor-module_btnSecondary__nJpgi{background:var(--nice-bg-secondary);border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-sm,4px);color:var(--nice-text-muted);cursor:pointer;font-size:11px;padding:var(--nice-space-1,4px) var(--nice-space-3,12px);white-space:nowrap}.ModelEditor-module_btnSecondary__nJpgi:hover{background:#3a3a5a;color:var(--nice-text-primary)}.ModelEditor-module_btnIcon__Qq9nz{background:none;border:none;color:var(--nice-text-muted);cursor:pointer;font-size:14px;line-height:1;padding:var(--nice-space-0-5,2px)}.ModelEditor-module_btnIcon__Qq9nz:hover{color:var(--nice-text-secondary)}.ModelEditor-module_aiPanel__-U1jO{background:linear-gradient(135deg,var(--nice-bg,#1a1a3e),#1e1a2e);border:1px solid var(--nice-bg-secondary,#4a3a6a);border-radius:var(--nice-radius-md,6px);margin:var(--nice-space-1,4px) 0;padding:var(--nice-space-2,8px)}.ModelEditor-module_aiHeader__WMZF5{align-items:center;color:#b88adf;display:flex;font-size:11px;gap:var(--nice-space-1,4px);margin-bottom:var(--nice-space-1-5,6px)}.ModelEditor-module_aiInput__-23jT{background:var(--nice-bg-canvas);border:1px solid var(--nice-bg-secondary,#4a3a6a);border-radius:var(--nice-radius-sm,4px);color:var(--nice-text-primary);font-size:11px;margin-bottom:var(--nice-space-1,4px);min-height:28px;padding:var(--nice-space-1,4px) var(--nice-space-2,8px);resize:vertical;width:100%}.ModelEditor-module_aiInput__-23jT:focus{border-color:#86c;outline:none}.ModelEditor-module_aiBtnRow__F-S-Z{display:flex;gap:var(--nice-space-1,4px)}.ModelEditor-module_aiBtn__8dcrE{background:linear-gradient(135deg,#54a,#64c);border:none;border-radius:var(--nice-radius-sm,4px);color:var(--nice-color-white);cursor:pointer;font-size:10px;padding:var(--nice-space-0-75,3px) var(--nice-space-2-5,10px)}.ModelEditor-module_aiBtn__8dcrE:hover{background:linear-gradient(135deg,#65b,#75d)}.ModelEditor-module_aiBtn__8dcrE:disabled{opacity:.4}.ModelEditor-module_aiStatus__Y5g59{color:#86a;font-size:10px;margin-top:var(--nice-space-1,4px)}.ModelEditor-module_dragOver__2VGIz{outline:2px dashed var(--nice-color-primary);outline-offset:-2px}.ModelEditor-module_contextMenu__sEb9s{background:var(--nice-bg-elevated);border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-md,6px);box-shadow:0 4px 16px var(--nice-overlay-50,rgba(0,0,0,.5));min-width:180px;padding:var(--nice-space-1,4px) 0;position:fixed;z-index:999}.ModelEditor-module_contextItem__W90fc{align-items:center;color:var(--nice-text-secondary);cursor:pointer;display:flex;font-size:11px;gap:var(--nice-space-2,8px);padding:var(--nice-space-1-25,5px) var(--nice-space-3,12px)}.ModelEditor-module_contextItem__W90fc:hover{background:var(--nice-surface)}.ModelEditor-module_contextSep__QCWTX{background:var(--nice-bg-secondary);height:1px;margin:var(--nice-space-0-5,2px) 0}.ModelEditor-module_contextKey__HxGV6{color:var(--nice-text-muted);font-size:10px;margin-left:auto}.ModelEditor-module_animList__lGNt5::-webkit-scrollbar,.ModelEditor-module_leftPanel__sVsxG::-webkit-scrollbar,.ModelEditor-module_rightPanel__oJf3N::-webkit-scrollbar,.ModelEditor-module_timelineArea__WFBHa::-webkit-scrollbar{height:6px;width:6px}.ModelEditor-module_animList__lGNt5::-webkit-scrollbar-track,.ModelEditor-module_leftPanel__sVsxG::-webkit-scrollbar-track,.ModelEditor-module_rightPanel__oJf3N::-webkit-scrollbar-track,.ModelEditor-module_timelineArea__WFBHa::-webkit-scrollbar-track{background:transparent}.ModelEditor-module_animList__lGNt5::-webkit-scrollbar-thumb,.ModelEditor-module_leftPanel__sVsxG::-webkit-scrollbar-thumb,.ModelEditor-module_rightPanel__oJf3N::-webkit-scrollbar-thumb,.ModelEditor-module_timelineArea__WFBHa::-webkit-scrollbar-thumb{background:var(--nice-bg-secondary);border-radius:var(--nice-radius-sm,3px)}.ModelEditor-module_animList__lGNt5::-webkit-scrollbar-thumb:hover,.ModelEditor-module_leftPanel__sVsxG::-webkit-scrollbar-thumb:hover,.ModelEditor-module_rightPanel__oJf3N::-webkit-scrollbar-thumb:hover,.ModelEditor-module_timelineArea__WFBHa::-webkit-scrollbar-thumb:hover{background:var(--nice-bg-tertiary)}.ModelEditor-module_resizeHandle__CyDw4{background:transparent;cursor:ns-resize;height:4px;transition:background .1s}.ModelEditor-module_resizeHandle__CyDw4:hover{background:var(--nice-color-primary)}.ModelEditor-module_modeSelect__KroPg{background:var(--nice-bg,#224);border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-sm,4px);color:#b0b0d0;cursor:pointer;font-size:11px;font-weight:600;outline:none;padding:var(--nice-space-0-5,2px) var(--nice-space-2,8px)}.ModelEditor-module_modeSelect__KroPg:focus{border-color:var(--nice-color-primary)}.ModelEditor-module_modeSelect__KroPg option{background:var(--nice-bg-primary)}.ModelEditor-module_menuDropdownWrap__6dicW{position:relative}.ModelEditor-module_dropdownMenu__ixJxD{background:var(--nice-bg-elevated);border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-md,6px);box-shadow:0 6px 24px var(--nice-overlay-60,rgba(0,0,0,.6));left:0;max-height:420px;min-width:200px;overflow-y:auto;padding:var(--nice-space-1,4px) 0;position:absolute;top:100%;z-index:999}.ModelEditor-module_dropdownTitle__zzdA6{color:var(--nice-color-primary);font-size:9px;font-weight:700;letter-spacing:1px;padding:var(--nice-space-1-5,6px) var(--nice-space-3,12px) var(--nice-space-0-5,2px);text-transform:uppercase}.ModelEditor-module_dropdownItem__4dllG{align-items:center;color:var(--nice-text-secondary);cursor:pointer;display:flex;font-size:11px;gap:var(--nice-space-1-5,6px);padding:var(--nice-space-1-25,5px) var(--nice-space-4,16px);transition:background .08s}.ModelEditor-module_dropdownItem__4dllG:hover{background:var(--nice-surface);color:var(--nice-color-white)}.ModelEditor-module_dropdownSep__oFx30{background:var(--nice-bg-secondary);height:1px;margin:var(--nice-space-1,4px) 0}.ModelEditor-module_dropdownMenu__ixJxD::-webkit-scrollbar{width:6px}.ModelEditor-module_dropdownMenu__ixJxD::-webkit-scrollbar-track{background:transparent}.ModelEditor-module_dropdownMenu__ixJxD::-webkit-scrollbar-thumb{background:var(--nice-bg-tertiary);border-radius:var(--nice-radius-sm,3px)}.ModelEditor-module_viewportShadingBar__NOK0h{background:var(--nice-overlay-80,rgba(20,20,40,.8));border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-md,6px);display:flex;gap:var(--nice-space-0-5,2px);padding:var(--nice-space-0-5,2px) var(--nice-space-1,4px);position:absolute;right:8px;top:8px;z-index:10}.ModelEditor-module_shadingBtn__SAIR9{background:none;border:1px solid transparent;border-radius:var(--nice-radius-sm,4px);color:var(--nice-text-muted);cursor:pointer;font-size:12px;padding:var(--nice-space-0-75,3px) var(--nice-space-2,8px);transition:all .1s;white-space:nowrap}.ModelEditor-module_shadingBtn__SAIR9:hover{background:var(--nice-bg-secondary);color:var(--nice-text-secondary)}.ModelEditor-module_shadingBtnActive__ST5YT{background:var(--nice-bg-tertiary)!important;border-color:var(--nice-color-primary)!important;color:var(--nice-color-white)!important}.ModelEditor-module_viewportGizmoInfo__k0ily{position:absolute;right:8px;top:44px;z-index:10}.ModelEditor-module_propTabs__Vw0-u{background:var(--nice-bg-canvas);border-bottom:1px solid var(--nice-border-color);display:flex;flex-shrink:0}.ModelEditor-module_propTabBtn__s8xDE{background:none;border:none;border-bottom:2px solid transparent;color:var(--nice-text-secondary);cursor:pointer;flex:1;font-size:14px;padding:var(--nice-space-1-5,6px) var(--nice-space-1,4px);transition:all .15s}.ModelEditor-module_propTabBtn__s8xDE:hover{background:var(--nice-bg-elevated);color:var(--nice-text-muted)}.ModelEditor-module_propTabBtnActive__-woXw{background:var(--nice-bg-elevated)!important;border-bottom-color:var(--nice-color-primary)!important;color:var(--nice-color-white)!important}.ModelEditor-module_outlinerSearch__p5L46{padding:var(--nice-space-1,4px) var(--nice-space-2,8px) 0}.ModelEditor-module_outlinerSearch__p5L46 input{background:var(--nice-bg-canvas);border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-sm,4px);color:var(--nice-text-secondary);font-size:11px;padding:var(--nice-space-0-75,3px) var(--nice-space-2,8px)}.ModelEditor-module_outlinerSearch__p5L46 input:focus{border-color:var(--nice-color-primary);outline:none}.ModelEditor-module_outlinerSearch__p5L46 input::placeholder{color:var(--nice-text-muted)}.ModelViewer-module_root__6Fbj3{background:var(--nice-bg-primary,#1a1a2e);color:var(--nice-text-primary,#e0e0e0);display:flex;flex-direction:column;font-family:Segoe UI,Consolas,monospace;font-size:12px;height:100%;overflow:hidden;position:relative;user-select:none}.ModelViewer-module_toolbar__EQJRN{align-items:center;background:var(--nice-bg-canvas,#12122a);border-bottom:1px solid var(--nice-border-color,#252545);display:flex;flex-shrink:0;gap:var(--nice-space-0-5,2px);height:32px;padding:0 var(--nice-space-1-5,6px);z-index:2}.ModelViewer-module_toolBtn__f9833{align-items:center;background:none;border:none;border-radius:var(--nice-radius-sm,3px);color:var(--nice-text-secondary,#ccc);cursor:pointer;display:flex;font-size:11px;gap:var(--nice-space-1,4px);padding:var(--nice-space-1,4px) var(--nice-space-2,8px);white-space:nowrap}.ModelViewer-module_toolBtn__f9833:hover{background:var(--nice-bg-secondary,#252545);color:var(--nice-text-primary,#fff)}.ModelViewer-module_toolBtn__f9833.ModelViewer-module_active__MgURC{background:var(--nice-color-primary,#57f);color:var(--nice-text-on-primary,#fff)}.ModelViewer-module_toolBtn__f9833:disabled{cursor:default;opacity:.4}.ModelViewer-module_toolSep__5zuAK{background:var(--nice-bg-secondary,#333);height:16px;margin:0 var(--nice-space-1,4px);width:1px}.ModelViewer-module_toolLabel__PcpJC{color:var(--nice-text-secondary,#888);font-size:10px;margin:0 var(--nice-space-1,4px);white-space:nowrap}.ModelViewer-module_toolRight__VSuzD{align-items:center;display:flex;gap:var(--nice-space-0-5,2px);margin-left:auto}.ModelViewer-module_viewport__-1llx{flex:1;outline:none;overflow:hidden;position:relative}.ModelViewer-module_viewport__-1llx:focus-visible:after{box-shadow:inset 0 0 0 2px var(--nice-color-primary,#3b82f6);content:"";inset:0;pointer-events:none;position:absolute}.ModelViewer-module_viewport__-1llx canvas{display:block;height:100%!important;width:100%!important}.ModelViewer-module_loadingOverlay__Ayyci{align-items:center;background:var(--nice-overlay-85,rgba(20,20,40,.85));display:flex;flex-direction:column;inset:0;justify-content:center;position:absolute;z-index:10}.ModelViewer-module_loadingBar__RDqVv{background:var(--nice-bg-tertiary,#444);border-radius:var(--nice-radius-sm,2px);height:4px;margin-top:var(--nice-space-3,12px);overflow:hidden;width:200px}.ModelViewer-module_loadingBarFill__zvIoP{background:var(--nice-color-primary,#57f);height:100%;transition:width .2s}.ModelViewer-module_loadingText__6OGeA{color:var(--nice-text-secondary,#ccc);font-size:13px;margin-bottom:var(--nice-space-2,8px)}.ModelViewer-module_errorOverlay__ASUqN{align-items:center;background:var(--nice-overlay-85,rgba(20,20,40,.85));color:var(--nice-danger,#ff6b6b);display:flex;flex-direction:column;inset:0;justify-content:center;position:absolute;z-index:10}.ModelViewer-module_sidePanel__-QFkd{background:var(--nice-bg-canvas,#12122a);border-left:1px solid var(--nice-border-color,#252545);bottom:24px;display:flex;flex-direction:column;font-size:11px;gap:var(--nice-space-3,12px);overflow-y:auto;padding:var(--nice-space-2,8px);position:absolute;right:0;top:32px;width:240px;z-index:5}.ModelViewer-module_sidePanel__-QFkd.ModelViewer-module_hidden__yoMuq{display:none}.ModelViewer-module_panelSection__bH-O3{display:flex;flex-direction:column;gap:var(--nice-space-1,4px)}.ModelViewer-module_panelTitle__xsn3e{color:var(--nice-text-secondary,#888);font-size:10px;letter-spacing:.5px;margin-bottom:var(--nice-space-1,4px);text-transform:uppercase}.ModelViewer-module_panelRow__3QxnD{align-items:center;display:flex;gap:var(--nice-space-1-5,6px)}.ModelViewer-module_panelRow__3QxnD label{color:var(--nice-text-secondary,#aaa);flex:0 0 70px;font-size:10px}.ModelViewer-module_panelRow__3QxnD span{color:var(--nice-text-primary,#e0e0e0);font-size:11px}.ModelViewer-module_animBar__qcYi5{align-items:center;background:var(--nice-bg-canvas,#12122a);border-top:1px solid var(--nice-border-color,#252545);display:flex;flex-shrink:0;gap:var(--nice-space-1,4px);height:28px;padding:0 var(--nice-space-2,8px)}.ModelViewer-module_animBar__qcYi5.ModelViewer-module_hidden__yoMuq{display:none}.ModelViewer-module_animSlider__9AQzN{appearance:none;background:var(--nice-bg-tertiary,#444);border-radius:var(--nice-radius-sm,2px);cursor:pointer;flex:1;height:4px}.ModelViewer-module_animSlider__9AQzN::-webkit-slider-thumb{appearance:none;background:var(--nice-color-primary,#57f);border-radius:var(--nice-radius-full,50%);cursor:pointer;height:10px;width:10px}.ModelViewer-module_animSelect__LhFWD{background:var(--nice-bg-secondary,#252545);border:1px solid var(--nice-border-color,#555);border-radius:var(--nice-radius-sm,3px);color:var(--nice-text-primary,#e0e0e0);font-size:10px;max-width:120px;padding:var(--nice-space-0-5,2px) var(--nice-space-1,4px)}.ModelViewer-module_statusBar__-3uuA{align-items:center;background:var(--nice-bg-canvas,#12122a);border-top:1px solid var(--nice-border-color,#252545);color:var(--nice-text-muted,#888);display:flex;flex-shrink:0;font-size:10px;gap:var(--nice-space-2,8px);height:22px;padding:0 var(--nice-space-2,8px)}.ModelViewer-module_statusRight__vI51s{display:flex;gap:var(--nice-space-3,12px);margin-left:auto}.ModelViewer-module_annotationLayer__-NzZF{inset:0;pointer-events:none;position:absolute;z-index:3}.ModelViewer-module_annotation__H6DgR{background:color-mix(in srgb,var(--nice-color-primary,#57f) 85%,transparent);border-radius:var(--nice-radius-sm,4px);color:var(--nice-text-on-primary,#fff);cursor:pointer;font-size:10px;padding:var(--nice-space-1,4px) var(--nice-space-2,8px);pointer-events:auto;position:absolute;transform:translate(-50%,-100%);white-space:nowrap}.ModelViewer-module_annotation__H6DgR:hover{background:var(--nice-color-primary,#57f)}.ModelViewer-module_dropZone__eNrPo{align-items:center;background:color-mix(in srgb,var(--nice-color-primary,#57f) 15%,transparent);border:2px dashed var(--nice-color-primary,#57f);color:var(--nice-color-primary,#57f);display:flex;font-size:16px;inset:0;justify-content:center;pointer-events:none;position:absolute;z-index:20}.UVEditor-module_uvEditor__9yahO{background:var(--nice-bg-secondary,#1e1e1e);border:1px solid var(--nice-border,#333);border-radius:var(--nice-radius-sm,4px);color:var(--nice-text,#e0e0e0);font-family:var(--nice-font-family,system-ui,sans-serif);font-size:12px;overflow:hidden}.UVEditor-module_toolbar__wPDkZ{align-items:center;background:var(--nice-bg-tertiary,#252526);border-bottom:1px solid var(--nice-border,#333);display:flex;flex-wrap:wrap;gap:var(--nice-space-2,8px);padding:var(--nice-space-1-5,6px) var(--nice-space-2,8px)}.UVEditor-module_toolGroup__hzVqv{border-right:1px solid var(--nice-border,#444);display:flex;gap:var(--nice-space-0-5,2px);padding:0 var(--nice-space-1,4px)}.UVEditor-module_toolGroup__hzVqv:last-child{border-right:none}.UVEditor-module_toolBtn__oIzVq{align-items:center;background:var(--nice-bg-secondary,#2d2d2d);border:1px solid transparent;border-radius:var(--nice-radius-sm,3px);color:var(--nice-text-secondary,#aaa);cursor:pointer;display:flex;font-size:11px;font-weight:500;height:24px;justify-content:center;min-width:28px;padding:0 var(--nice-space-1-5,6px);transition:all .15s ease}.UVEditor-module_toolBtn__oIzVq:hover:not(:disabled){background:var(--nice-bg-hover,#3c3c3c);color:var(--nice-text,#fff)}.UVEditor-module_toolBtn__oIzVq.UVEditor-module_active__gahDI{background:var(--nice-primary,#007acc);border-color:var(--nice-primary-hover,#0098ff);color:var(--nice-text-on-primary,#fff)}.UVEditor-module_toolBtn__oIzVq:disabled{cursor:not-allowed;opacity:.5}.UVEditor-module_select__cd9Xa{background:var(--nice-bg-secondary,#2d2d2d);border:1px solid var(--nice-border,#444);border-radius:var(--nice-radius-sm,3px);color:var(--nice-text,#e0e0e0);cursor:pointer;font-size:11px;height:24px;padding:0 var(--nice-space-1-5,6px)}.UVEditor-module_select__cd9Xa:focus{border-color:var(--nice-primary,#007acc);outline:none}.UVEditor-module_viewport__0S2EF{background:var(--nice-bg-secondary,#2a2a2a);cursor:crosshair;flex:1;overflow:hidden;position:relative}.UVEditor-module_canvas__L8eJJ{display:block;height:100%;width:100%}.UVEditor-module_noGeometry__J0MOa{align-items:center;color:var(--nice-text-muted,#666);display:flex;font-size:14px;inset:0;justify-content:center;pointer-events:none;position:absolute}.UVEditor-module_sidebar__zcI1d{background:var(--nice-bg-tertiary,#252526);border-left:1px solid var(--nice-border,#333);overflow-y:auto;width:200px}.UVEditor-module_panel__wRBD0{border-bottom:1px solid var(--nice-border,#333);padding:var(--nice-space-2-5,10px)}.UVEditor-module_panelTitle__5oDRo{color:var(--nice-text-muted,#888);font-size:11px;font-weight:600;letter-spacing:.5px;margin:0 0 var(--nice-space-2,8px) 0;text-transform:uppercase}.UVEditor-module_checkbox__P2anI{align-items:center;cursor:pointer;display:flex;font-size:11px;gap:var(--nice-space-1-5,6px);margin-bottom:var(--nice-space-1-5,6px)}.UVEditor-module_checkbox__P2anI input{accent-color:var(--nice-primary,#007acc);cursor:pointer;height:14px;margin:0;width:14px}.UVEditor-module_stat__j2lxJ{display:flex;font-size:11px;justify-content:space-between;padding:var(--nice-space-0-75,3px) 0}.UVEditor-module_stat__j2lxJ span:first-child{color:var(--nice-text-muted,#888)}.UVEditor-module_stat__j2lxJ span:last-child{color:var(--nice-text,#e0e0e0);font-weight:500}.UVEditor-module_rangeLabel__6OS0o{display:block;font-size:11px;margin-top:var(--nice-space-2,8px)}.UVEditor-module_rangeLabel__6OS0o input{accent-color:var(--nice-primary,#007acc);margin-top:var(--nice-space-1,4px);width:100%}.UVEditor-module_statusBar__KYYrx{background:var(--nice-bg-inset,#1a1a1a);border-top:1px solid var(--nice-border,#333);color:var(--nice-text-muted,#888);display:flex;font-size:11px;gap:var(--nice-space-4,16px);padding:var(--nice-space-1,4px) var(--nice-space-2,8px)}.UVEditor-module_statusBar__KYYrx span{white-space:nowrap}@media (max-width:768px){.UVEditor-module_sidebar__zcI1d{display:none}.UVEditor-module_toolbar__wPDkZ{overflow-x:auto}}.MaterialEditor-module_materialEditor__RjU0e{--bg-primary:var(--nice-bg,#1e1e1e);--bg-secondary:var(--nice-bg-secondary,#252526);--bg-tertiary:var(--nice-bg-secondary,#2d2d2d);--bg-hover:var(--nice-bg-secondary,#3a3a3a);--bg-active:var(--nice-bg-secondary,#4a4a4a);--text-primary:var(--nice-text-primary,#fff);--text-secondary:var(--nice-text-secondary,#ccc);--text-muted:var(--nice-text-secondary,#888);--border-color:var(--nice-bg-secondary,#3a3a3a);--border-light:var(--nice-bg-secondary,#4a4a4a);--accent-color:var(--nice-primary,#0078d4);--accent-hover:#1084d8;--error-color:var(--nice-danger,#f44336);--warning-color:var(--nice-warning,#ff9800);--success-color:var(--nice-success,#4caf50);--shadow-sm:0 1px 3px var(--nice-overlay-30,rgba(0,0,0,.3));--shadow-md:0 4px 6px var(--nice-overlay-40,rgba(0,0,0,.4));--shadow-lg:0 10px 20px var(--nice-overlay-50,rgba(0,0,0,.5));--node-shadow:0 4px 12px var(--nice-overlay-50,rgba(0,0,0,.5));--transition-fast:0.1s ease;--transition-normal:0.2s ease;--border-radius-sm:3px;--border-radius-md:6px;--border-radius-lg:10px}.MaterialEditor-module_materialEditor__RjU0e.MaterialEditor-module_light__zSnpW{--bg-primary:var(--nice-bg-secondary,#f5f5f5);--bg-secondary:var(--nice-bg,#fff);--bg-tertiary:var(--nice-border,#e0e0e0);--bg-hover:var(--nice-border,#d0d0d0);--bg-active:var(--nice-border,silver);--text-primary:var(--nice-text-primary,#1e1e1e);--text-secondary:var(--nice-text,#333);--text-muted:var(--nice-text-secondary,#666);--border-color:var(--nice-border,#d0d0d0);--border-light:var(--nice-border,#e0e0e0);--shadow-sm:0 1px 3px var(--nice-overlay-10,rgba(0,0,0,.1));--shadow-md:0 4px 6px var(--nice-overlay-15,rgba(0,0,0,.15));--shadow-lg:0 10px 20px var(--nice-overlay-20,rgba(0,0,0,.2));--node-shadow:0 4px 12px var(--nice-overlay-20,rgba(0,0,0,.2))}.MaterialEditor-module_materialEditor__RjU0e{background-color:var(--nice-bg-primary);border-radius:var(--nice-radius-lg);color:var(--nice-text-primary);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;font-size:13px;overflow:hidden;user-select:none}.MaterialEditor-module_toolbar__qqDbE{align-items:center;background-color:var(--nice-bg-secondary);border-bottom:1px solid var(--nice-border-color);display:flex;gap:var(--nice-space-1,4px);padding:var(--nice-space-1-5,6px) var(--nice-space-2-5,10px)}.MaterialEditor-module_toolbarGroup__fgE2r{align-items:center;display:flex;gap:var(--nice-space-0-5,2px)}.MaterialEditor-module_toolbarSeparator__Z9B1i{background-color:var(--nice-border-color);height:20px;margin:0 var(--nice-space-1-5,6px);width:1px}.MaterialEditor-module_toolbar__qqDbE button{align-items:center;background-color:transparent;border:none;border-radius:var(--nice-radius-sm);color:var(--nice-text-primary);cursor:pointer;display:flex;font-size:14px;height:28px;justify-content:center;padding:0;transition:background-color var(--transition-fast);width:28px}.MaterialEditor-module_toolbar__qqDbE button:active:not(:disabled),.MaterialEditor-module_toolbar__qqDbE button:hover:not(:disabled){background-color:var(--nice-hover-bg)}.MaterialEditor-module_toolbar__qqDbE button:disabled{cursor:not-allowed;opacity:.4}.MaterialEditor-module_toolbar__qqDbE button.MaterialEditor-module_active__DEZaw{background-color:var(--nice-color-accent);color:#fff}.MaterialEditor-module_palette__VNmnu{background-color:var(--nice-bg-secondary);border-right:1px solid var(--nice-border-color);display:flex;flex-direction:column;flex-shrink:0;width:220px}.MaterialEditor-module_paletteSearch__rE-c5{border-bottom:1px solid var(--nice-border-color);padding:var(--nice-space-2,8px)}.MaterialEditor-module_searchInput__H7FJt{background-color:var(--nice-bg-tertiary);border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-md);color:var(--nice-text-primary);font-size:12px;outline:none;padding:var(--nice-space-1-5,6px) var(--nice-space-2-5,10px);transition:border-color var(--transition-fast);width:100%}.MaterialEditor-module_searchInput__H7FJt:focus{border-color:var(--nice-color-accent)}.MaterialEditor-module_searchInput__H7FJt::placeholder{color:var(--nice-text-muted)}.MaterialEditor-module_paletteCategories__sbn9d{flex:1;overflow-y:auto;padding:var(--nice-space-1,4px) 0}.MaterialEditor-module_paletteCategory__LgsIy{margin-bottom:var(--nice-space-0-5,2px)}.MaterialEditor-module_categoryHeader__8M6DH{align-items:center;background-color:transparent;border:none;border-left:3px solid transparent;color:var(--nice-text-primary);cursor:pointer;display:flex;font-size:12px;font-weight:600;gap:var(--nice-space-1-5,6px);padding:var(--nice-space-2,8px) var(--nice-space-2-5,10px);text-align:left;transition:background-color var(--transition-fast);width:100%}.MaterialEditor-module_categoryHeader__8M6DH:hover{background-color:var(--nice-hover-bg)}.MaterialEditor-module_categoryIcon__coBim{color:var(--nice-text-muted);font-size:10px;width:14px}.MaterialEditor-module_categoryCount__rnYwK{background-color:var(--nice-bg-tertiary);border-radius:var(--nice-radius-lg,10px);color:var(--nice-text-muted);font-size:10px;font-weight:400;margin-left:auto;padding:var(--nice-space-0-5,2px) var(--nice-space-1-5,6px)}.MaterialEditor-module_categoryNodes__GMJz6{padding:var(--nice-space-0-5,2px) 0}.MaterialEditor-module_paletteNode__4-ncg{align-items:center;cursor:grab;display:flex;gap:var(--nice-space-2,8px);padding:var(--nice-space-1-5,6px) var(--nice-space-2-5,10px) var(--nice-space-1-5,6px) var(--nice-space-7,28px);transition:background-color var(--transition-fast)}.MaterialEditor-module_paletteNode__4-ncg:hover{background-color:var(--nice-hover-bg)}.MaterialEditor-module_paletteNode__4-ncg:active{cursor:grabbing}.MaterialEditor-module_nodeColor__ql5xb{border-radius:var(--nice-radius-sm,3px);flex-shrink:0;height:12px;width:12px}.MaterialEditor-module_nodeName__K0Rqi{color:var(--nice-text-secondary);flex:1;font-size:12px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.MaterialEditor-module_graphCanvas__guLj7{background-color:var(--nice-bg-primary);cursor:grab;flex:1;overflow:hidden;position:relative}.MaterialEditor-module_graphCanvas__guLj7:active{cursor:grabbing}.MaterialEditor-module_connectionsSvg__9SyYo{height:100%;left:0;pointer-events:none;position:absolute;top:0;width:100%}.MaterialEditor-module_connection__x9F9U{cursor:pointer;pointer-events:stroke;transition:stroke-width var(--transition-fast),stroke var(--transition-fast)}.MaterialEditor-module_connection__x9F9U:hover{stroke-width:4px}.MaterialEditor-module_pendingConnection__NCBtj{animation:MaterialEditor-module_dashAnimation__YLpH3 .5s linear infinite;pointer-events:none}@keyframes MaterialEditor-module_dashAnimation__YLpH3{to{stroke-dashoffset:-10}}.MaterialEditor-module_graphNode__pCqYA{background-color:var(--nice-bg-secondary);border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-md);box-shadow:var(--node-shadow);cursor:move;overflow:visible;position:absolute;transition:border-color var(--transition-fast),box-shadow var(--transition-fast)}.MaterialEditor-module_graphNode__pCqYA:hover{border-color:var(--nice-border-light)}.MaterialEditor-module_graphNode__pCqYA.MaterialEditor-module_selected__ozIqt{border-color:var(--nice-color-accent);box-shadow:0 0 0 2px var(--nice-color-accent),var(--node-shadow)}.MaterialEditor-module_graphNode__pCqYA.MaterialEditor-module_locked__8RRAH{cursor:not-allowed;opacity:.8}.MaterialEditor-module_nodeHeader__-PBFg{align-items:center;border-radius:var(--nice-radius-md) var(--nice-radius-md) 0 0;color:#fff;display:flex;font-size:11px;font-weight:600;justify-content:space-between;padding:var(--nice-space-1-5,6px) var(--nice-space-2-5,10px);text-shadow:0 1px 2px var(--nice-overlay-30,rgba(0,0,0,.3))}.MaterialEditor-module_nodeTitle__i2PcO{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.MaterialEditor-module_lockIcon__tPzIi{font-size:10px;margin-left:var(--nice-space-1-5,6px)}.MaterialEditor-module_nodePorts__APKPN{padding:var(--nice-space-1,4px) 0;position:relative}.MaterialEditor-module_inputPorts__7MVX4{left:0;position:absolute;top:0}.MaterialEditor-module_outputPorts__GUwXJ{position:absolute;right:0;top:0}.MaterialEditor-module_port__zc4vm{align-items:center;display:flex;font-size:10px;height:20px;position:absolute;white-space:nowrap}.MaterialEditor-module_inputPorts__7MVX4 .MaterialEditor-module_port__zc4vm{left:0;padding-left:var(--nice-space-3-5,14px)}.MaterialEditor-module_outputPorts__GUwXJ .MaterialEditor-module_port__zc4vm{justify-content:flex-end;padding-right:var(--nice-space-3-5,14px);right:0}.MaterialEditor-module_portHandle__oNh4P{border:2px solid var(--nice-bg-secondary);border-radius:var(--nice-radius-full,50%);box-sizing:border-box;cursor:crosshair;height:10px;position:absolute;transition:transform var(--transition-fast);width:10px}.MaterialEditor-module_portHandle__oNh4P:hover{transform:scale(1.3)}.MaterialEditor-module_inputHandle__6lz91{left:-5px}.MaterialEditor-module_outputHandle__8-r1i{right:-5px}.MaterialEditor-module_portHandle__oNh4P.MaterialEditor-module_connected__qo4za{border-color:transparent}.MaterialEditor-module_portLabel__T8daS{color:var(--nice-text-secondary)}.MaterialEditor-module_nodeComment__wkIoF{background-color:rgba(255,235,59,.15);border:1px solid rgba(255,235,59,.4);border-radius:var(--nice-radius-sm);bottom:-24px;color:var(--nice-warning,#ffeb3b);font-size:10px;left:0;overflow:hidden;padding:var(--nice-space-0-5,2px) var(--nice-space-1-5,6px);position:absolute;right:0;text-overflow:ellipsis;white-space:nowrap}.MaterialEditor-module_previewPanel__lqiI0{background-color:var(--nice-bg-secondary);border-left:1px solid var(--nice-border-color);display:flex;flex-direction:column;flex-shrink:0;width:220px}.MaterialEditor-module_previewHeader__vkqDk{align-items:center;border-bottom:1px solid var(--nice-border-color);display:flex;font-size:12px;font-weight:600;justify-content:space-between;padding:var(--nice-space-2-5,10px) var(--nice-space-3,12px)}.MaterialEditor-module_previewModeSelect__qbL8f{background-color:var(--nice-bg-tertiary);border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-sm);color:var(--nice-text-primary);cursor:pointer;font-size:11px;padding:var(--nice-space-0-75,3px) var(--nice-space-2,8px)}.MaterialEditor-module_previewCanvas__q91ue{align-items:center;aspect-ratio:1;background-color:var(--nice-bg-primary);border-bottom:1px solid var(--nice-border-color);display:flex;justify-content:center;position:relative}.MaterialEditor-module_previewCanvas__q91ue canvas{max-height:100%;max-width:100%}.MaterialEditor-module_previewCompiling__GVFRq{align-items:center;animation:MaterialEditor-module_pulse__6IS0P 1s ease infinite;background-color:var(--nice-overlay-60,rgba(0,0,0,.6));bottom:0;color:#fff;display:flex;font-size:12px;justify-content:center;left:0;position:absolute;right:0;top:0}@keyframes MaterialEditor-module_pulse__6IS0P{0%,to{opacity:1}50%{opacity:.6}}.MaterialEditor-module_previewErrors__6JZfZ{flex:1;overflow-y:auto;padding:var(--nice-space-2-5,10px)}.MaterialEditor-module_previewError__Rotpo{background-color:rgba(244,67,54,.15);border:1px solid rgba(244,67,54,.4);border-radius:var(--nice-radius-sm);color:var(--nice-color-error);font-size:11px;margin-bottom:var(--nice-space-1-5,6px);padding:var(--nice-space-1-5,6px) var(--nice-space-2,8px);word-break:break-word}.MaterialEditor-module_propertiesPanel__H3Lej{background-color:var(--nice-bg-secondary);border-left:1px solid var(--nice-border-color);display:flex;flex-direction:column;flex-shrink:0;width:280px}.MaterialEditor-module_propertiesHeader__ZLXL2{align-items:center;border-bottom:1px solid var(--nice-border-color);display:flex;font-size:12px;font-weight:600;padding:var(--nice-space-2-5,10px) var(--nice-space-3,12px)}.MaterialEditor-module_propertiesContent__3LWte{flex:1;overflow-y:auto;padding:var(--nice-space-3,12px)}.MaterialEditor-module_propertyGroup__3Rz-K{margin-bottom:var(--nice-space-4,16px)}.MaterialEditor-module_propertyGroupTitle__Wsswl{color:var(--nice-text-muted);font-size:11px;font-weight:600;letter-spacing:.5px;margin-bottom:var(--nice-space-2,8px);text-transform:uppercase}.MaterialEditor-module_propertyRow__eAshz{display:flex;flex-direction:column;margin-bottom:var(--nice-space-2-5,10px)}.MaterialEditor-module_propertyLabel__wwNGL{color:var(--nice-text-secondary);font-size:11px;margin-bottom:var(--nice-space-1,4px)}.MaterialEditor-module_propertyInput__oK2eE{background-color:var(--nice-bg-tertiary);border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-sm);color:var(--nice-text-primary);font-size:12px;outline:none;padding:var(--nice-space-1-5,6px) var(--nice-space-2,8px);transition:border-color var(--transition-fast)}.MaterialEditor-module_propertyInput__oK2eE:focus{border-color:var(--nice-color-accent)}.MaterialEditor-module_propertyColorPreview__1L-S5{align-items:center;display:flex;gap:var(--nice-space-2,8px)}.MaterialEditor-module_colorSwatch__rHMga{border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-sm);cursor:pointer;height:24px;width:24px}.MaterialEditor-module_propertySlider__NztWp{align-items:center;display:flex;gap:var(--nice-space-2,8px)}.MaterialEditor-module_propertySlider__NztWp input[type=range]{-webkit-appearance:none;background:var(--nice-bg-tertiary);border-radius:var(--nice-radius-sm,2px);flex:1;height:4px;outline:none}.MaterialEditor-module_propertySlider__NztWp input[type=range]::-webkit-slider-thumb{-webkit-appearance:none;background:var(--nice-color-accent);border-radius:var(--nice-radius-full,50%);cursor:pointer;height:14px;width:14px}.MaterialEditor-module_propertySlider__NztWp .MaterialEditor-module_sliderValue__HeKO-{color:var(--nice-text-secondary);font-size:11px;text-align:right;width:50px}.MaterialEditor-module_minimap__mPE-C{background-color:var(--nice-bg-secondary);border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-md);bottom:10px;box-shadow:var(--nice-shadow-md);height:100px;overflow:hidden;position:absolute;right:10px;width:150px}.MaterialEditor-module_minimapNodes__DCW6r{height:100%;position:relative;width:100%}.MaterialEditor-module_minimapNode__EoDhh{border-radius:var(--nice-radius-sm,2px);position:absolute}.MaterialEditor-module_minimapViewport__qUyIg{border:1px solid var(--nice-color-accent)}.MaterialEditor-module_minimapViewport__qUyIg,.MaterialEditor-module_selectionBox__5-dcw{background-color:var(--nice-primary-tint-10,rgba(0,120,212,.1));pointer-events:none;position:absolute}.MaterialEditor-module_selectionBox__5-dcw{border:1px dashed var(--nice-color-accent)}.MaterialEditor-module_contextMenu__jMJ2-{background-color:var(--nice-bg-secondary);border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-md);box-shadow:var(--nice-shadow-lg);min-width:160px;padding:var(--nice-space-1,4px) 0;position:fixed;z-index:1000}.MaterialEditor-module_contextMenuItem__NltnJ{align-items:center;cursor:pointer;display:flex;font-size:12px;justify-content:space-between;padding:var(--nice-space-1-5,6px) var(--nice-space-3,12px);transition:background-color var(--transition-fast)}.MaterialEditor-module_contextMenuItem__NltnJ:hover{background-color:var(--nice-hover-bg)}.MaterialEditor-module_contextMenuItem__NltnJ.MaterialEditor-module_disabled__NnXkq{color:var(--nice-text-muted);cursor:not-allowed}.MaterialEditor-module_contextMenuItem__NltnJ.MaterialEditor-module_disabled__NnXkq:hover{background-color:transparent}.MaterialEditor-module_contextMenuShortcut__2-fdl{color:var(--nice-text-muted);font-size:11px;margin-left:var(--nice-space-5,20px)}.MaterialEditor-module_contextMenuSeparator__yYjvC{background-color:var(--nice-border-color);height:1px;margin:var(--nice-space-1,4px) 0}.MaterialEditor-module_zoomControls__7PATW{align-items:center;background-color:var(--nice-bg-secondary);border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-md);bottom:10px;box-shadow:var(--nice-shadow-sm);display:flex;gap:var(--nice-space-1,4px);left:10px;padding:var(--nice-space-1,4px);position:absolute}.MaterialEditor-module_zoomControls__7PATW button{align-items:center;background-color:transparent;border:none;border-radius:var(--nice-radius-sm);color:var(--nice-text-primary);cursor:pointer;display:flex;font-size:14px;height:26px;justify-content:center;padding:0;transition:background-color var(--transition-fast);width:26px}.MaterialEditor-module_zoomControls__7PATW button:hover{background-color:var(--nice-hover-bg)}.MaterialEditor-module_zoomLevel__Rw6xW{color:var(--nice-text-secondary);font-size:11px;min-width:50px;text-align:center}.MaterialEditor-module_tooltip__lTpIH{word-wrap:break-word;background-color:var(--nice-text-primary,#333);border-radius:var(--nice-radius-sm);box-shadow:var(--nice-shadow-md);color:var(--nice-text-inverse,#fff);font-size:11px;max-width:250px;padding:var(--nice-space-1-5,6px) var(--nice-space-2-5,10px);pointer-events:none;position:fixed;white-space:pre-wrap;z-index:9999}.MaterialEditor-module_tooltip__lTpIH:before{border-color:var(--nice-border-color,#333) transparent transparent transparent;border-style:solid;border-width:5px;content:"";left:50%;position:absolute;top:100%;transform:translateX(-50%)}.MaterialEditor-module_emptyState__Kpa84{color:var(--nice-text-muted);left:50%;position:absolute;text-align:center;top:50%;transform:translate(-50%,-50%)}.MaterialEditor-module_emptyStateIcon__67zsA{font-size:48px;margin-bottom:var(--nice-space-4,16px);opacity:.5}.MaterialEditor-module_emptyStateTitle__0NQ65{color:var(--nice-text-secondary);font-size:16px;font-weight:600;margin-bottom:var(--nice-space-2,8px)}.MaterialEditor-module_emptyStateDescription__QgVz5{font-size:13px;line-height:1.5;max-width:300px}@media (max-width:900px){.MaterialEditor-module_palette__VNmnu{bottom:0;left:0;position:absolute;top:0;transform:translateX(-100%);transition:transform var(--transition-normal);z-index:100}.MaterialEditor-module_palette__VNmnu.MaterialEditor-module_open__DG5-R{transform:translateX(0)}.MaterialEditor-module_previewPanel__lqiI0{bottom:0;position:absolute;right:0;top:0;transform:translateX(100%);transition:transform var(--transition-normal);z-index:100}.MaterialEditor-module_previewPanel__lqiI0.MaterialEditor-module_open__DG5-R{transform:translateX(0)}}@media (max-width:600px){.MaterialEditor-module_toolbar__qqDbE{flex-wrap:wrap;padding:var(--nice-space-1,4px)}.MaterialEditor-module_toolbarGroup__fgE2r{flex-wrap:wrap}.MaterialEditor-module_toolbar__qqDbE button{font-size:16px;height:32px;width:32px}.MaterialEditor-module_palette__VNmnu,.MaterialEditor-module_previewPanel__lqiI0{max-width:280px;width:100%}}@keyframes MaterialEditor-module_nodeAppear__4vHEB{0%{opacity:0;transform:scale(.9)}to{opacity:1;transform:scale(1)}}.MaterialEditor-module_graphNode__pCqYA{animation:MaterialEditor-module_nodeAppear__4vHEB .2s ease}@keyframes MaterialEditor-module_connectionDraw__xvI66{0%{stroke-dashoffset:1000}to{stroke-dashoffset:0}}.MaterialEditor-module_connection__x9F9U{stroke-dasharray:1000;animation:MaterialEditor-module_connectionDraw__xvI66 .3s ease forwards}.MaterialEditor-module_materialEditor__RjU0e:focus-visible{outline:2px solid var(--nice-color-accent);outline-offset:-2px}.MaterialEditor-module_categoryHeader__8M6DH:focus-visible,.MaterialEditor-module_paletteNode__4-ncg:focus-visible,.MaterialEditor-module_toolbar__qqDbE button:focus-visible{outline:2px solid var(--nice-color-accent);outline-offset:-2px}@media (prefers-reduced-motion:reduce){.MaterialEditor-module_connection__x9F9U,.MaterialEditor-module_graphNode__pCqYA,.MaterialEditor-module_pendingConnection__NCBtj{animation:none}*,:after,:before{animation-duration:.01ms!important;transition-duration:.01ms!important}}@media print{.MaterialEditor-module_minimap__mPE-C,.MaterialEditor-module_palette__VNmnu,.MaterialEditor-module_previewPanel__lqiI0,.MaterialEditor-module_toolbar__qqDbE,.MaterialEditor-module_zoomControls__7PATW{display:none!important}.MaterialEditor-module_materialEditor__RjU0e{border:1px solid var(--nice-border,#ccc)}.MaterialEditor-module_graphCanvas__guLj7{background-color:#fff}.MaterialEditor-module_graphNode__pCqYA{border:1px solid var(--nice-border-color,#333);box-shadow:none}.MaterialEditor-module_connection__x9F9U{stroke:var(--nice-text,#333)!important}}.ParticleEditor-module_particleEditor__HiTCi{--pe-bg-primary:var(--nice-bg,#1a1a1a);--pe-bg-secondary:var(--nice-bg-secondary,#252525);--pe-bg-tertiary:var(--nice-bg-secondary,#2d2d2d);--pe-bg-hover:var(--nice-bg-secondary,#3a3a3a);--pe-bg-active:var(--nice-bg-secondary,#4a4a4a);--pe-border-color:var(--nice-border,#404040);--pe-text-primary:var(--nice-text-primary,#fff);--pe-text-secondary:var(--nice-text-muted,#b0b0b0);--pe-text-muted:#707070;--pe-accent:#4fc3f7;--pe-accent-hover:#29b6f6;--pe-success:#66bb6a;--pe-warning:var(--nice-warning,#ffa726);--pe-error:#ef5350;--pe-toolbar-height:40px;--pe-panel-width:260px;--pe-radius:4px;--pe-transition:150ms ease}.ParticleEditor-module_particleEditor__HiTCi.ParticleEditor-module_light__AiNYo{--pe-bg-primary:var(--nice-bg-secondary,#f5f5f5);--pe-bg-secondary:var(--nice-bg,#fff);--pe-bg-tertiary:var(--nice-bg-secondary,#fafafa);--pe-bg-hover:var(--nice-border,#eee);--pe-bg-active:var(--nice-border,#e0e0e0);--pe-border-color:var(--nice-border,#d0d0d0);--pe-text-primary:var(--nice-text,#212121);--pe-text-secondary:var(--nice-text-secondary,#616161);--pe-text-muted:var(--nice-text-secondary,#9e9e9e);--pe-accent:var(--nice-primary-hover,#1976d2);--pe-accent-hover:var(--nice-primary-dark,#1565c0)}.ParticleEditor-module_particleEditor__HiTCi{background-color:var(--pe-bg-primary);border-radius:var(--pe-radius);color:var(--pe-text-primary);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;font-size:13px;overflow:hidden;user-select:none}.ParticleEditor-module_toolbar__KptWe{align-items:center;background-color:var(--pe-bg-secondary);border-bottom:1px solid var(--pe-border-color);display:flex;gap:var(--nice-space-1,4px);height:var(--pe-toolbar-height);padding:0 var(--nice-space-2,8px)}.ParticleEditor-module_toolbarGroup__-N0jI{align-items:center;display:flex;gap:var(--nice-space-0-5,2px)}.ParticleEditor-module_toolbarSeparator__kIZmD{background-color:var(--pe-border-color);height:20px;margin:0 var(--nice-space-1-5,6px);width:1px}.ParticleEditor-module_toolbar__KptWe button{align-items:center;background:transparent;border:none;border-radius:var(--pe-radius);color:var(--pe-text-secondary);cursor:pointer;display:flex;font-size:14px;height:28px;justify-content:center;transition:all var(--pe-transition);width:28px}.ParticleEditor-module_toolbar__KptWe button:hover:not(:disabled){background-color:var(--pe-bg-hover);color:var(--pe-text-primary)}.ParticleEditor-module_toolbar__KptWe button:active:not(:disabled){background-color:var(--pe-bg-active)}.ParticleEditor-module_toolbar__KptWe button.ParticleEditor-module_active__81dHl{background-color:var(--pe-accent);color:#fff}.ParticleEditor-module_toolbar__KptWe button:disabled{cursor:not-allowed;opacity:.4}.ParticleEditor-module_speedSelect__vZO0v{background-color:var(--pe-bg-tertiary);border:1px solid var(--pe-border-color);border-radius:var(--pe-radius);color:var(--pe-text-primary);cursor:pointer;font-size:11px;height:24px;padding:0 var(--nice-space-1-5,6px)}.ParticleEditor-module_timeDisplay__tl1Qv{color:var(--pe-text-secondary);font-family:monospace;font-size:11px;min-width:50px;padding:0 var(--nice-space-2,8px);text-align:right}.ParticleEditor-module_systemList__Vaiea{background-color:var(--pe-bg-secondary);border-right:1px solid var(--pe-border-color);display:flex;flex-direction:column;min-width:var(--pe-panel-width);overflow:hidden;width:var(--pe-panel-width)}.ParticleEditor-module_systemListHeader__I9W61{align-items:center;border-bottom:1px solid var(--pe-border-color);color:var(--pe-text-secondary);display:flex;font-size:12px;font-weight:600;justify-content:space-between;letter-spacing:.5px;padding:var(--nice-space-2-5,10px) var(--nice-space-3,12px);text-transform:uppercase}.ParticleEditor-module_systemListActions__C289h{display:flex;gap:var(--nice-space-1,4px)}.ParticleEditor-module_systemListActions__C289h button{align-items:center;background:transparent;border:none;border-radius:var(--pe-radius);color:var(--pe-text-secondary);cursor:pointer;display:flex;font-size:12px;height:22px;justify-content:center;width:22px}.ParticleEditor-module_systemListActions__C289h button:hover{background-color:var(--pe-bg-hover);color:var(--pe-text-primary)}.ParticleEditor-module_presetMenu__FXV-m{background-color:var(--pe-bg-tertiary);border-bottom:1px solid var(--pe-border-color);display:flex;flex-wrap:wrap;gap:var(--nice-space-1,4px);padding:var(--nice-space-1-5,6px)}.ParticleEditor-module_presetItem__zt9wm{background-color:var(--pe-bg-secondary);border:1px solid var(--pe-border-color);border-radius:var(--pe-radius);color:var(--pe-text-secondary);cursor:pointer;font-size:11px;padding:var(--nice-space-1,4px) var(--nice-space-2-5,10px);transition:all var(--pe-transition)}.ParticleEditor-module_presetItem__zt9wm:hover{background-color:var(--pe-accent);border-color:var(--pe-accent);color:#fff}.ParticleEditor-module_systemItems__a4eQN{flex:1;overflow-y:auto;padding:var(--nice-space-1-5,6px)}.ParticleEditor-module_systemItem__y-cTZ{align-items:center;border-radius:var(--pe-radius);cursor:pointer;display:flex;justify-content:space-between;padding:var(--nice-space-2,8px) var(--nice-space-2-5,10px);transition:all var(--pe-transition)}.ParticleEditor-module_systemItem__y-cTZ:hover{background-color:var(--pe-bg-hover)}.ParticleEditor-module_systemItem__y-cTZ.ParticleEditor-module_selected__wzmRZ{background-color:var(--pe-accent);color:#fff}.ParticleEditor-module_systemItem__y-cTZ.ParticleEditor-module_selected__wzmRZ .ParticleEditor-module_systemItemActions__Dc1Bw button{color:var(--nice-overlay-light-70,hsla(0,0%,100%,.7))}.ParticleEditor-module_systemItem__y-cTZ.ParticleEditor-module_selected__wzmRZ .ParticleEditor-module_systemItemActions__Dc1Bw button:hover{color:#fff}.ParticleEditor-module_systemName__-EAlQ{flex:1;font-size:12px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ParticleEditor-module_systemItemActions__Dc1Bw{display:flex;gap:var(--nice-space-0-5,2px);opacity:0;transition:opacity var(--pe-transition)}.ParticleEditor-module_systemItem__y-cTZ:hover .ParticleEditor-module_systemItemActions__Dc1Bw{opacity:1}.ParticleEditor-module_systemItemActions__Dc1Bw button{align-items:center;background:transparent;border:none;color:var(--pe-text-muted);cursor:pointer;display:flex;font-size:11px;height:20px;justify-content:center;width:20px}.ParticleEditor-module_systemItemActions__Dc1Bw button:hover:not(:disabled){color:var(--pe-text-primary)}.ParticleEditor-module_systemItemActions__Dc1Bw button:disabled{cursor:not-allowed;opacity:.3}.ParticleEditor-module_renameInput__jUWw2{background-color:var(--pe-bg-primary);border:1px solid var(--pe-accent);border-radius:var(--pe-radius);color:var(--pe-text-primary);font-size:12px;outline:none;padding:var(--nice-space-0-5,2px) var(--nice-space-1-5,6px);width:100%}.ParticleEditor-module_inspector__qP8Gq{background-color:var(--pe-bg-secondary);border-left:1px solid var(--pe-border-color);display:flex;flex-direction:column;min-width:280px;overflow:hidden;width:320px}.ParticleEditor-module_inspectorHeader__l6Uxn{border-bottom:1px solid var(--pe-border-color);font-size:13px;font-weight:600;overflow:hidden;padding:var(--nice-space-2-5,10px) var(--nice-space-3,12px);text-overflow:ellipsis;white-space:nowrap}.ParticleEditor-module_inspectorModules__pTVRa{flex:1;overflow-y:auto}.ParticleEditor-module_emptyInspector__JYoth{align-items:center;color:var(--pe-text-muted);display:flex;font-style:italic;height:100%;justify-content:center}.ParticleEditor-module_moduleSection__dQhZv{border-bottom:1px solid var(--pe-border-color)}.ParticleEditor-module_moduleHeader__u-Jjw{align-items:center;cursor:pointer;display:flex;gap:var(--nice-space-1-5,6px);padding:var(--nice-space-2,8px) var(--nice-space-3,12px);transition:background-color var(--pe-transition)}.ParticleEditor-module_moduleHeader__u-Jjw:hover{background-color:var(--pe-bg-hover)}.ParticleEditor-module_moduleHeader__u-Jjw.ParticleEditor-module_selected__wzmRZ{background-color:var(--pe-bg-tertiary)}.ParticleEditor-module_moduleIcon__iVDB-{color:var(--pe-text-muted);font-size:10px;width:12px}.ParticleEditor-module_moduleCheckbox__0B4Md{accent-color:var(--pe-accent);cursor:pointer;height:14px;margin:0;width:14px}.ParticleEditor-module_moduleName__m8AJX{flex:1;font-size:12px;font-weight:500}.ParticleEditor-module_moduleContent__pE2Ux{background-color:var(--pe-bg-tertiary);border-top:1px solid var(--pe-border-color);padding:var(--nice-space-2,8px) var(--nice-space-3,12px)}.ParticleEditor-module_moduleNotImplemented__NZDCG{color:var(--pe-text-muted);font-size:11px;font-style:italic;padding:var(--nice-space-3,12px);text-align:center}.ParticleEditor-module_propertyRow__TzuYo{align-items:center;display:flex;gap:var(--nice-space-2,8px);margin-bottom:var(--nice-space-2,8px)}.ParticleEditor-module_propertyRow__TzuYo:last-child{margin-bottom:0}.ParticleEditor-module_propertyRow__TzuYo>label{color:var(--pe-text-secondary);flex:0 0 100px;font-size:11px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ParticleEditor-module_numberInput__cKItO{background-color:var(--pe-bg-primary);border:1px solid var(--pe-border-color);border-radius:var(--pe-radius);color:var(--pe-text-primary);flex:1;font-family:monospace;font-size:11px;height:24px;min-width:50px;padding:0 var(--nice-space-1-5,6px)}.ParticleEditor-module_numberInput__cKItO:focus{border-color:var(--pe-accent);outline:none}.ParticleEditor-module_selectInput__RhZly{background-color:var(--pe-bg-primary);border:1px solid var(--pe-border-color);border-radius:var(--pe-radius);color:var(--pe-text-primary);cursor:pointer;flex:1;font-size:11px;height:24px;padding:0 var(--nice-space-1-5,6px)}.ParticleEditor-module_selectInput__RhZly:focus{border-color:var(--pe-accent);outline:none}.ParticleEditor-module_toggleInput__seU4y{accent-color:var(--pe-accent);cursor:pointer;height:16px;width:16px}.ParticleEditor-module_distributionInput__M5ciH{align-items:center;display:flex;flex:1;gap:var(--nice-space-1,4px)}.ParticleEditor-module_distributionType__NTuwm{background-color:var(--pe-bg-primary);border:1px solid var(--pe-border-color);border-radius:var(--pe-radius);color:var(--pe-text-primary);cursor:pointer;font-size:11px;height:24px;padding:0 var(--nice-space-1,4px);width:80px}.ParticleEditor-module_addButton__nSODD{background-color:var(--pe-accent);border:none;border-radius:var(--pe-radius);color:#fff;cursor:pointer;font-size:11px;padding:var(--nice-space-1,4px) var(--nice-space-3,12px);transition:background-color var(--pe-transition)}.ParticleEditor-module_addButton__nSODD:hover{background-color:var(--pe-accent-hover)}.ParticleEditor-module_previewPanel__sCCsm{align-items:center;background-color:var(--pe-bg-primary);display:flex;flex:1;justify-content:center;min-width:200px}.ParticleEditor-module_previewCanvas__b8PcH{background-color:var(--nice-bg,#1a1a1a);border-radius:var(--pe-radius)}.ParticleEditor-module_particleEditor__HiTCi ::-webkit-scrollbar{height:8px;width:8px}.ParticleEditor-module_particleEditor__HiTCi ::-webkit-scrollbar-track{background:var(--pe-bg-tertiary)}.ParticleEditor-module_particleEditor__HiTCi ::-webkit-scrollbar-thumb{background:var(--pe-border-color);border-radius:var(--nice-radius-sm,4px)}.ParticleEditor-module_particleEditor__HiTCi ::-webkit-scrollbar-thumb:hover{background:var(--pe-text-muted)}@media (max-width:900px){.ParticleEditor-module_systemList__Vaiea{min-width:200px;width:200px}.ParticleEditor-module_inspector__qP8Gq{min-width:220px;width:260px}.ParticleEditor-module_propertyRow__TzuYo>label{flex:0 0 80px}}@media (max-width:700px){.ParticleEditor-module_systemList__Vaiea{border-bottom:1px solid var(--pe-border-color);border-right:none;max-height:150px;min-width:unset;width:100%}.ParticleEditor-module_inspector__qP8Gq{border-left:none;border-top:1px solid var(--pe-border-color);min-width:unset;width:100%}}
@@ -297,10 +297,10 @@ function SystemListPanel({ systems, selectedId, onSelect, onAdd, onRemove, onDup
297
297
  }
298
298
  setEditingId(null);
299
299
  };
300
- return (jsxRuntime.jsxs("div", { className: ParticleEditor_module.systemList, children: [jsxRuntime.jsxs("div", { className: ParticleEditor_module.systemListHeader, children: [jsxRuntime.jsxs("span", { children: ["Systems (", systems.length, ")"] }), jsxRuntime.jsxs("div", { className: ParticleEditor_module.systemListActions, children: [jsxRuntime.jsx("button", { onClick: onAdd, title: t('particleEditor.newSystem', 'New System'), "aria-label": t('particleEditor.newSystem', 'New System'), children: jsxRuntime.jsx(ui.NiceIcon, { name: "plus", size: 14 }) }), jsxRuntime.jsx("button", { onClick: () => setShowPresets(!showPresets), title: t('particleEditor.addPreset', 'Add Preset'), "aria-label": t('particleEditor.addPreset', 'Add Preset'), children: jsxRuntime.jsx(ui.NiceIcon, { name: "clipboard", size: 14 }) })] })] }), showPresets && (jsxRuntime.jsx("div", { className: ParticleEditor_module.presetMenu, children: Object.keys(particleEditorUtils.PARTICLE_PRESETS).map((preset) => (jsxRuntime.jsx("button", { className: ParticleEditor_module.presetItem, onClick: () => {
300
+ return (jsxRuntime.jsxs("div", { className: ParticleEditor_module.systemList, children: [jsxRuntime.jsxs("div", { className: ParticleEditor_module.systemListHeader, children: [jsxRuntime.jsx("span", { children: t('particleEditor.systems', 'Systems ({systems})').replace('{systems}', String(systems.length)) }), jsxRuntime.jsxs("div", { className: ParticleEditor_module.systemListActions, children: [jsxRuntime.jsx("button", { onClick: onAdd, title: t('particleEditor.newSystem', 'New System'), "aria-label": t('particleEditor.newSystem', 'New System'), children: jsxRuntime.jsx(ui.NiceIcon, { name: "plus", size: 14 }) }), jsxRuntime.jsx("button", { onClick: () => setShowPresets(!showPresets), title: t('particleEditor.addPreset', 'Add Preset'), "aria-label": t('particleEditor.addPreset', 'Add Preset'), children: jsxRuntime.jsx(ui.NiceIcon, { name: "clipboard", size: 14 }) })] })] }), showPresets && (jsxRuntime.jsx("div", { className: ParticleEditor_module.presetMenu, children: Object.keys(particleEditorUtils.PARTICLE_PRESETS).map((preset) => (jsxRuntime.jsx("button", { className: ParticleEditor_module.presetItem, onClick: () => {
301
301
  onAddPreset(preset);
302
302
  setShowPresets(false);
303
- }, children: preset.charAt(0).toUpperCase() + preset.slice(1) }, preset))) })), jsxRuntime.jsx("div", { className: ParticleEditor_module.systemItems, children: systems.map((system) => (jsxRuntime.jsx("div", { className: `${ParticleEditor_module.systemItem} ${selectedId === system.id ? ParticleEditor_module.selected : ''}`, onClick: () => onSelect(system.id), children: editingId === system.id ? (jsxRuntime.jsx("input", { type: "text", value: editName, onChange: (e) => setEditName(e.target.value), onBlur: handleFinishRename, onKeyDown: (e) => e.key === 'Enter' && handleFinishRename(), autoFocus: true, className: ParticleEditor_module.renameInput })) : (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("span", { className: ParticleEditor_module.systemName, onDoubleClick: () => handleStartRename(system), children: system.name }), jsxRuntime.jsxs("div", { className: ParticleEditor_module.systemItemActions, children: [jsxRuntime.jsx("button", { onClick: (e) => {
303
+ }, children: preset.charAt(0).toUpperCase() + preset.slice(1) }, preset))) })), jsxRuntime.jsx("div", { className: ParticleEditor_module.systemItems, children: systems.map((system) => (jsxRuntime.jsx("div", { role: "button", tabIndex: 0, onKeyDown: ui.clickOnActivationKey, className: `${ParticleEditor_module.systemItem} ${selectedId === system.id ? ParticleEditor_module.selected : ''}`, onClick: () => onSelect(system.id), children: editingId === system.id ? (jsxRuntime.jsx("input", { type: "text", value: editName, onChange: (e) => setEditName(e.target.value), onBlur: handleFinishRename, onKeyDown: (e) => e.key === 'Enter' && handleFinishRename(), autoFocus: true, className: ParticleEditor_module.renameInput })) : (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("span", { className: ParticleEditor_module.systemName, onDoubleClick: () => handleStartRename(system), children: system.name }), jsxRuntime.jsxs("div", { className: ParticleEditor_module.systemItemActions, children: [jsxRuntime.jsx("button", { onClick: (e) => {
304
304
  e.stopPropagation();
305
305
  onDuplicate(system.id);
306
306
  }, title: t('particleEditor.duplicate', 'Duplicate'), "aria-label": t('particleEditor.duplicate', 'Duplicate'), children: jsxRuntime.jsx(ui.NiceIcon, { name: "clipboard", size: 14 }) }), jsxRuntime.jsx("button", { onClick: (e) => {
@@ -350,7 +350,7 @@ function InspectorPanel({ system, expandedModules, selectedModule, onToggleModul
350
350
  const current = system[key];
351
351
  onUpdateSystem({ [key]: { ...current, enabled } });
352
352
  };
353
- return (jsxRuntime.jsxs("div", { className: ParticleEditor_module.inspector, children: [jsxRuntime.jsx("div", { className: ParticleEditor_module.inspectorHeader, children: jsxRuntime.jsx("span", { children: system.name }) }), jsxRuntime.jsx("div", { className: ParticleEditor_module.inspectorModules, children: modules.map((mod) => (jsxRuntime.jsxs("div", { className: ParticleEditor_module.moduleSection, children: [jsxRuntime.jsxs("div", { className: `${ParticleEditor_module.moduleHeader} ${selectedModule === mod.key ? ParticleEditor_module.selected : ''}`, onClick: () => onToggleModule(mod.key), children: [jsxRuntime.jsx("span", { className: ParticleEditor_module.moduleIcon, children: jsxRuntime.jsx(ui.NiceIcon, { name: expandedModules.includes(mod.key) ? 'chevron-down' : 'chevron-right', size: 14 }) }), mod.hasEnabled && (jsxRuntime.jsx("input", { type: "checkbox", checked: mod.enabled, onChange: (e) => {
353
+ return (jsxRuntime.jsxs("div", { className: ParticleEditor_module.inspector, children: [jsxRuntime.jsx("div", { className: ParticleEditor_module.inspectorHeader, children: jsxRuntime.jsx("span", { children: system.name }) }), jsxRuntime.jsx("div", { className: ParticleEditor_module.inspectorModules, children: modules.map((mod) => (jsxRuntime.jsxs("div", { className: ParticleEditor_module.moduleSection, children: [jsxRuntime.jsxs("div", { role: "button", tabIndex: 0, "aria-expanded": expandedModules.includes(mod.key), onKeyDown: ui.clickOnActivationKey, className: `${ParticleEditor_module.moduleHeader} ${selectedModule === mod.key ? ParticleEditor_module.selected : ''}`, onClick: () => onToggleModule(mod.key), children: [jsxRuntime.jsx("span", { className: ParticleEditor_module.moduleIcon, children: jsxRuntime.jsx(ui.NiceIcon, { name: expandedModules.includes(mod.key) ? 'chevron-down' : 'chevron-right', size: 14 }) }), mod.hasEnabled && (jsxRuntime.jsx("input", { type: "checkbox", checked: mod.enabled, onChange: (e) => {
354
354
  e.stopPropagation();
355
355
  handleModuleToggle(mod.key, e.target.checked);
356
356
  }, className: ParticleEditor_module.moduleCheckbox })), jsxRuntime.jsx("span", { className: ParticleEditor_module.moduleName, children: particleEditorTypes.MODULE_NAMES[mod.key] || mod.key })] }), expandedModules.includes(mod.key) && (jsxRuntime.jsx("div", { className: ParticleEditor_module.moduleContent, children: jsxRuntime.jsx(ModuleEditor, { system: system, moduleKey: mod.key, onUpdate: onUpdateSystem }) }))] }, mod.key))) })] }));
@@ -385,7 +385,7 @@ function ModuleEditor({ system, moduleKey, onUpdate }) {
385
385
  step: 0.1,
386
386
  }), 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 })] }));
387
387
  case 'emission':
388
- return (jsxRuntime.jsxs(jsxRuntime.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 } })), jsxRuntime.jsxs("div", { className: ParticleEditor_module.propertyRow, children: [jsxRuntime.jsxs("label", { children: ["Bursts (", system.emission.bursts.length, ")"] }), jsxRuntime.jsx("button", { className: ParticleEditor_module.addButton, onClick: () => onUpdate({
388
+ return (jsxRuntime.jsxs(jsxRuntime.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 } })), jsxRuntime.jsxs("div", { className: ParticleEditor_module.propertyRow, children: [jsxRuntime.jsx("label", { children: t('particleEditor.bursts', 'Bursts ({bursts})').replace('{bursts}', String(system.emission.bursts.length)) }), jsxRuntime.jsx("button", { className: ParticleEditor_module.addButton, onClick: () => onUpdate({
389
389
  emission: {
390
390
  ...system.emission,
391
391
  bursts: [
@@ -546,7 +546,14 @@ function NiceParticleEditor({ systems: initialSystems, onSystemsChange, onPlay,
546
546
  cancelAnimationFrame(animationFrameRef.current);
547
547
  }
548
548
  };
549
- }, [state.isPlaying, state.isPaused, state.playbackSpeed, state.currentTime, selectedSystem]);
549
+ }, [
550
+ state.isPlaying,
551
+ state.isPaused,
552
+ state.playbackSpeed,
553
+ state.currentTime,
554
+ selectedSystem,
555
+ dispatch,
556
+ ]);
550
557
  // Export/Import handlers
551
558
  const handleExport = () => {
552
559
  const json = particleEditorUtils.exportSystemsToJSON(state.systems);
@@ -274,7 +274,7 @@ const NiceCascadedShadows = ({ scene, camera, config: configProp, showDebug: ini
274
274
  setShowDebug(initialDebug);
275
275
  }
276
276
  }, [initialDebug, setShowDebug]);
277
- return (jsxRuntime.jsxs("div", { className: `nice-cascaded-shadows ${className}`, style: { display: 'grid', gap: 8, fontSize: 13 }, children: [jsxRuntime.jsxs("strong", { children: [jsxRuntime.jsx(ui.NiceIcon, { name: "lightbulb", size: 14 }), ' ', t('cascadedShadows.cascadedShadowMaps', 'Cascaded Shadow Maps')] }), jsxRuntime.jsxs("label", { children: ["Cascades: ", config.cascadeCount, jsxRuntime.jsx("input", { type: "range", min: 1, max: 5, value: config.cascadeCount, onChange: (e) => setConfig({ cascadeCount: parseInt(e.target.value, 10) }), style: { width: '100%' } })] }), jsxRuntime.jsxs("label", { children: ["Max Distance: ", config.maxFar, jsxRuntime.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%' } })] }), jsxRuntime.jsxs("label", { children: ["Split Mode:", jsxRuntime.jsxs("select", { value: config.splitMode, onChange: (e) => setConfig({ splitMode: e.target.value }), style: { width: '100%', marginTop: 2 }, children: [jsxRuntime.jsx("option", { value: "practical", children: t('cascadedShadows.practical', 'Practical') }), jsxRuntime.jsx("option", { value: "logarithmic", children: t('cascadedShadows.logarithmic', 'Logarithmic') }), jsxRuntime.jsx("option", { value: "linear", children: t('cascadedShadows.linear', 'Linear') })] })] }), config.splitMode === 'practical' && (jsxRuntime.jsxs("label", { children: ["Lambda: ", config.practicalSplitLambda.toFixed(2), jsxRuntime.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%' } })] })), jsxRuntime.jsxs("label", { children: ["Shadow Map Size: ", config.shadowMapSize, jsxRuntime.jsxs("select", { value: config.shadowMapSize, onChange: (e) => setConfig({ shadowMapSize: parseInt(e.target.value, 10) }), style: { width: '100%', marginTop: 2 }, children: [jsxRuntime.jsx("option", { value: 512, children: "512" }), jsxRuntime.jsx("option", { value: 1024, children: "1024" }), jsxRuntime.jsx("option", { value: 2048, children: "2048" }), jsxRuntime.jsx("option", { value: 4096, children: "4096" })] })] }), jsxRuntime.jsxs("div", { style: { fontSize: 10, opacity: 0.7 }, children: ["Cascade splits: ", cascadeSplits.map((s) => s.toFixed(1)).join(' | ')] }), jsxRuntime.jsxs("label", { style: { display: 'flex', alignItems: 'center', gap: 6 }, children: [jsxRuntime.jsx("input", { type: "checkbox", checked: showDebug, onChange: (e) => setShowDebug(e.target.checked) }), t('cascadedShadows.showCascadeFrustums', 'Show cascade frustums')] })] }));
277
+ return (jsxRuntime.jsxs("div", { className: `nice-cascaded-shadows ${className}`, style: { display: 'grid', gap: 8, fontSize: 13 }, children: [jsxRuntime.jsxs("strong", { children: [jsxRuntime.jsx(ui.NiceIcon, { name: "lightbulb", size: 14 }), ' ', t('cascadedShadows.cascadedShadowMaps', 'Cascaded Shadow Maps')] }), jsxRuntime.jsxs("label", { children: [t('cascadedShadows.cascades', 'Cascades: {cascadeCount}').replace('{cascadeCount}', String(config.cascadeCount)), jsxRuntime.jsx("input", { type: "range", min: 1, max: 5, value: config.cascadeCount, onChange: (e) => setConfig({ cascadeCount: parseInt(e.target.value, 10) }), style: { width: '100%' } })] }), jsxRuntime.jsxs("label", { children: [t('cascadedShadows.maxDistance', 'Max Distance: {maxFar}').replace('{maxFar}', String(config.maxFar)), jsxRuntime.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%' } })] }), jsxRuntime.jsxs("label", { children: [t('cascadedShadows.splitMode', 'Split Mode:'), jsxRuntime.jsxs("select", { value: config.splitMode, onChange: (e) => setConfig({ splitMode: e.target.value }), style: { width: '100%', marginTop: 2 }, children: [jsxRuntime.jsx("option", { value: "practical", children: t('cascadedShadows.practical', 'Practical') }), jsxRuntime.jsx("option", { value: "logarithmic", children: t('cascadedShadows.logarithmic', 'Logarithmic') }), jsxRuntime.jsx("option", { value: "linear", children: t('cascadedShadows.linear', 'Linear') })] })] }), config.splitMode === 'practical' && (jsxRuntime.jsxs("label", { children: [t('cascadedShadows.lambda', 'Lambda: {practicalSplitLambda}').replace('{practicalSplitLambda}', String(config.practicalSplitLambda.toFixed(2))), jsxRuntime.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%' } })] })), jsxRuntime.jsxs("label", { children: [t('cascadedShadows.shadowMapSize', 'Shadow Map Size: {shadowMapSize}').replace('{shadowMapSize}', String(config.shadowMapSize)), jsxRuntime.jsxs("select", { value: config.shadowMapSize, onChange: (e) => setConfig({ shadowMapSize: parseInt(e.target.value, 10) }), style: { width: '100%', marginTop: 2 }, children: [jsxRuntime.jsx("option", { value: 512, children: "512" }), jsxRuntime.jsx("option", { value: 1024, children: "1024" }), jsxRuntime.jsx("option", { value: 2048, children: "2048" }), jsxRuntime.jsx("option", { value: 4096, children: "4096" })] })] }), jsxRuntime.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(' | '))) }), jsxRuntime.jsxs("label", { style: { display: 'flex', alignItems: 'center', gap: 6 }, children: [jsxRuntime.jsx("input", { type: "checkbox", checked: showDebug, onChange: (e) => setShowDebug(e.target.checked) }), t('cascadedShadows.showCascadeFrustums', 'Show cascade frustums')] })] }));
278
278
  };
279
279
 
280
280
  exports.NiceCascadedShadows = NiceCascadedShadows;
@@ -346,7 +346,7 @@ const NiceRenderExport = ({ renderer, scene, camera, className = '', }) => {
346
346
  color: config.width === p.width && config.height === p.height
347
347
  ? 'var(--nice-color-white, #fff)'
348
348
  : 'inherit',
349
- }, children: p.label }, p.label))) }), jsxRuntime.jsxs("div", { style: { display: 'flex', gap: 4, alignItems: 'center' }, children: [jsxRuntime.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' } }), jsxRuntime.jsx("span", { children: "\u00D7" }), jsxRuntime.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' } })] }), jsxRuntime.jsxs("label", { children: ["Format:", jsxRuntime.jsxs("select", { value: config.format, onChange: (e) => setConfig({ format: e.target.value }), style: { width: '100%', marginTop: 2 }, children: [jsxRuntime.jsx("option", { value: "png", children: "PNG (lossless + alpha)" }), jsxRuntime.jsx("option", { value: "jpeg", children: "JPEG (lossy, no alpha)" }), jsxRuntime.jsx("option", { value: "exr", children: "EXR (HDR float)" })] })] }), jsxRuntime.jsxs("label", { children: ["Background:", jsxRuntime.jsxs("select", { value: config.backgroundMode, onChange: (e) => setConfig({ backgroundMode: e.target.value }), style: { width: '100%', marginTop: 2 }, children: [jsxRuntime.jsx("option", { value: "transparent", children: t('renderExport.transparent', 'Transparent') }), jsxRuntime.jsx("option", { value: "color", children: t('renderExport.solidColor', 'Solid Color') }), jsxRuntime.jsx("option", { value: "scene", children: t('renderExport.sceneBackground', 'Scene Background') })] })] }), config.backgroundMode === 'color' && (jsxRuntime.jsxs("label", { style: { display: 'flex', alignItems: 'center', gap: 6 }, children: ["Color:", jsxRuntime.jsx("input", { type: "color", value: config.backgroundColor, onChange: (e) => setConfig({ backgroundColor: e.target.value }) })] })), jsxRuntime.jsxs("label", { children: ["Supersampling: ", config.samples, "x", jsxRuntime.jsxs("select", { value: config.samples, onChange: (e) => setConfig({ samples: parseInt(e.target.value, 10) }), style: { width: '100%', marginTop: 2 }, children: [jsxRuntime.jsx("option", { value: 1, children: "1x (none)" }), jsxRuntime.jsx("option", { value: 2, children: "2x" }), jsxRuntime.jsx("option", { value: 4, children: "4x (best quality)" })] })] }), jsxRuntime.jsx("button", { type: "button", onClick: handleRender, disabled: isRendering, style: {
349
+ }, children: p.label }, p.label))) }), jsxRuntime.jsxs("div", { style: { display: 'flex', gap: 4, alignItems: 'center' }, children: [jsxRuntime.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' } }), jsxRuntime.jsx("span", { children: "\u00D7" }), jsxRuntime.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' } })] }), jsxRuntime.jsxs("label", { children: [t('renderExport.format', 'Format:'), jsxRuntime.jsxs("select", { value: config.format, onChange: (e) => setConfig({ format: e.target.value }), style: { width: '100%', marginTop: 2 }, children: [jsxRuntime.jsx("option", { value: "png", children: t('renderExport.pngLosslessAlpha', 'PNG (lossless + alpha)') }), jsxRuntime.jsx("option", { value: "jpeg", children: t('renderExport.jpegLossyNoAlpha', 'JPEG (lossy, no alpha)') }), jsxRuntime.jsx("option", { value: "exr", children: t('renderExport.exrHdrFloat', 'EXR (HDR float)') })] })] }), jsxRuntime.jsxs("label", { children: [t('renderExport.background', 'Background:'), jsxRuntime.jsxs("select", { value: config.backgroundMode, onChange: (e) => setConfig({ backgroundMode: e.target.value }), style: { width: '100%', marginTop: 2 }, children: [jsxRuntime.jsx("option", { value: "transparent", children: t('renderExport.transparent', 'Transparent') }), jsxRuntime.jsx("option", { value: "color", children: t('renderExport.solidColor', 'Solid Color') }), jsxRuntime.jsx("option", { value: "scene", children: t('renderExport.sceneBackground', 'Scene Background') })] })] }), config.backgroundMode === 'color' && (jsxRuntime.jsxs("label", { style: { display: 'flex', alignItems: 'center', gap: 6 }, children: [t('renderExport.color', 'Color:'), jsxRuntime.jsx("input", { type: "color", value: config.backgroundColor, onChange: (e) => setConfig({ backgroundColor: e.target.value }) })] })), jsxRuntime.jsxs("label", { children: [t('renderExport.supersamplingX', 'Supersampling: {samples}x').replace('{samples}', String(config.samples)), jsxRuntime.jsxs("select", { value: config.samples, onChange: (e) => setConfig({ samples: parseInt(e.target.value, 10) }), style: { width: '100%', marginTop: 2 }, children: [jsxRuntime.jsx("option", { value: 1, children: t('renderExport.n1xNone', '1x (none)') }), jsxRuntime.jsx("option", { value: 2, children: "2x" }), jsxRuntime.jsx("option", { value: 4, children: t('renderExport.n4xBestQuality', '4x (best quality)') })] })] }), jsxRuntime.jsx("button", { type: "button", onClick: handleRender, disabled: isRendering, style: {
350
350
  background: isRendering
351
351
  ? 'var(--nice-bg-tertiary, #94a3b8)'
352
352
  : 'var(--nice-color-accent, #6366f1)',
@@ -355,7 +355,7 @@ const NiceRenderExport = ({ renderer, scene, camera, className = '', }) => {
355
355
  borderRadius: 4,
356
356
  padding: '8px 12px',
357
357
  cursor: isRendering ? 'wait' : 'pointer',
358
- }, children: isRendering ? (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(ui.NiceIcon, { name: "clock", size: 14 }), " Rendering\u2026"] })) : (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(ui.NiceIcon, { name: "camera", size: 14 }), ' ', t('renderExport.render', 'Render {width}×{height} {format}')
358
+ }, children: isRendering ? (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(ui.NiceIcon, { name: "clock", size: 14 }), " ", t('renderExport.rendering', 'Rendering…')] })) : (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(ui.NiceIcon, { name: "camera", size: 14 }), ' ', t('renderExport.render', 'Render {width}×{height} {format}')
359
359
  .replace('{width}', String(config.width))
360
360
  .replace('{height}', String(config.height))
361
361
  .replace('{format}', config.format.toUpperCase())] })) })] }));
@@ -302,6 +302,7 @@ function useSSAO(renderer, scene, camera, configOverride) {
302
302
  blurMat.dispose();
303
303
  ortho.remove(quad);
304
304
  };
305
+ // eslint-disable-next-line react-hooks/exhaustive-deps -- the uniforms' first values; the next effect updates them without rebuilding the render targets
305
306
  }, [renderer, camera, config.resolution]);
306
307
  // Update uniforms
307
308
  React.useEffect(() => {
@@ -360,7 +361,7 @@ function useSSAO(renderer, scene, camera, configOverride) {
360
361
  const NiceSSAO = ({ renderer, scene, camera, config: configProp, className = '', }) => {
361
362
  const { t } = i18n.useNiceTranslation();
362
363
  const { config, setConfig } = useSSAO(renderer, scene, camera, configProp);
363
- return (jsxRuntime.jsxs("div", { className: `nice-ssao ${className}`, style: { display: 'grid', gap: 8, fontSize: 13 }, children: [jsxRuntime.jsxs("div", { style: { display: 'flex', justifyContent: 'space-between', alignItems: 'center' }, children: [jsxRuntime.jsxs("strong", { children: [jsxRuntime.jsx(ui.NiceIcon, { name: "circle", size: 14 }), " ", t('ssao.ambientOcclusion', 'Ambient Occlusion')] }), jsxRuntime.jsxs("label", { style: { display: 'flex', alignItems: 'center', gap: 4, fontSize: 11 }, children: [jsxRuntime.jsx("input", { type: "checkbox", checked: config.enabled, onChange: (e) => setConfig({ enabled: e.target.checked }) }), t('ssao.enabled', 'Enabled')] })] }), jsxRuntime.jsxs("label", { children: ["Mode:", jsxRuntime.jsxs("select", { value: config.mode, onChange: (e) => setConfig({ mode: e.target.value }), style: { width: '100%', marginTop: 2 }, children: [jsxRuntime.jsx("option", { value: "ssao", children: t('ssao.ssao', 'SSAO') }), jsxRuntime.jsx("option", { value: "hbao", children: t('ssao.hbao', 'HBAO') })] })] }), jsxRuntime.jsxs("label", { children: ["Samples: ", config.samples, jsxRuntime.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%' } })] }), jsxRuntime.jsxs("label", { children: ["Radius: ", config.radius.toFixed(2), jsxRuntime.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%' } })] }), jsxRuntime.jsxs("label", { children: ["Intensity: ", config.intensity.toFixed(2), jsxRuntime.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%' } })] }), jsxRuntime.jsxs("label", { children: ["Bias: ", config.bias.toFixed(3), jsxRuntime.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%' } })] }), jsxRuntime.jsxs("label", { children: ["Resolution: ", config.resolution.toFixed(2), jsxRuntime.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%' } })] }), jsxRuntime.jsxs("label", { style: { display: 'flex', alignItems: 'center', gap: 6 }, children: [jsxRuntime.jsx("input", { type: "checkbox", checked: config.blurEnabled, onChange: (e) => setConfig({ blurEnabled: e.target.checked }) }), "Bilateral Blur (size: ", config.blurSize, ")"] })] }));
364
+ return (jsxRuntime.jsxs("div", { className: `nice-ssao ${className}`, style: { display: 'grid', gap: 8, fontSize: 13 }, children: [jsxRuntime.jsxs("div", { style: { display: 'flex', justifyContent: 'space-between', alignItems: 'center' }, children: [jsxRuntime.jsxs("strong", { children: [jsxRuntime.jsx(ui.NiceIcon, { name: "circle", size: 14 }), " ", t('ssao.ambientOcclusion', 'Ambient Occlusion')] }), jsxRuntime.jsxs("label", { style: { display: 'flex', alignItems: 'center', gap: 4, fontSize: 11 }, children: [jsxRuntime.jsx("input", { type: "checkbox", checked: config.enabled, onChange: (e) => setConfig({ enabled: e.target.checked }) }), t('ssao.enabled', 'Enabled')] })] }), jsxRuntime.jsxs("label", { children: [t('ssao.mode', 'Mode:'), jsxRuntime.jsxs("select", { value: config.mode, onChange: (e) => setConfig({ mode: e.target.value }), style: { width: '100%', marginTop: 2 }, children: [jsxRuntime.jsx("option", { value: "ssao", children: t('ssao.ssao', 'SSAO') }), jsxRuntime.jsx("option", { value: "hbao", children: t('ssao.hbao', 'HBAO') })] })] }), jsxRuntime.jsxs("label", { children: [t('ssao.samples', 'Samples: {samples}').replace('{samples}', String(config.samples)), jsxRuntime.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%' } })] }), jsxRuntime.jsxs("label", { children: [t('ssao.radius', 'Radius: {radius}').replace('{radius}', String(config.radius.toFixed(2))), jsxRuntime.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%' } })] }), jsxRuntime.jsxs("label", { children: [t('ssao.intensity', 'Intensity: {intensity}').replace('{intensity}', String(config.intensity.toFixed(2))), jsxRuntime.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%' } })] }), jsxRuntime.jsxs("label", { children: [t('ssao.bias', 'Bias: {bias}').replace('{bias}', String(config.bias.toFixed(3))), jsxRuntime.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%' } })] }), jsxRuntime.jsxs("label", { children: [t('ssao.resolution', 'Resolution: {resolution}').replace('{resolution}', String(config.resolution.toFixed(2))), jsxRuntime.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%' } })] }), jsxRuntime.jsxs("label", { style: { display: 'flex', alignItems: 'center', gap: 6 }, children: [jsxRuntime.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))] })] }));
364
365
  };
365
366
 
366
367
  exports.NiceSSAO = NiceSSAO;
@@ -228,6 +228,7 @@ function useSSR(renderer, scene, camera, configOverride) {
228
228
  material.dispose();
229
229
  ortho.remove(quad);
230
230
  };
231
+ // eslint-disable-next-line react-hooks/exhaustive-deps -- the uniforms' first values; the next effect updates them without rebuilding the render targets
231
232
  }, [renderer, camera, config.resolution]);
232
233
  // Update uniforms when config changes
233
234
  React.useEffect(() => {
@@ -277,7 +278,7 @@ function useSSR(renderer, scene, camera, configOverride) {
277
278
  const NiceSSR = ({ renderer, scene, camera, config: configProp, className = '', }) => {
278
279
  const { t } = i18n.useNiceTranslation();
279
280
  const { config, setConfig } = useSSR(renderer, scene, camera, configProp);
280
- return (jsxRuntime.jsxs("div", { className: `nice-ssr ${className}`, style: { display: 'grid', gap: 8, fontSize: 13 }, children: [jsxRuntime.jsxs("div", { style: { display: 'flex', justifyContent: 'space-between', alignItems: 'center' }, children: [jsxRuntime.jsxs("strong", { children: [jsxRuntime.jsx(ui.NiceIcon, { name: "copy", size: 14 }), ' ', t('ssr.screenSpaceReflections', 'Screen-Space Reflections')] }), jsxRuntime.jsxs("label", { style: { display: 'flex', alignItems: 'center', gap: 4, fontSize: 11 }, children: [jsxRuntime.jsx("input", { type: "checkbox", checked: config.enabled, onChange: (e) => setConfig({ enabled: e.target.checked }) }), t('ssr.enabled', 'Enabled')] })] }), jsxRuntime.jsxs("label", { children: ["Max Steps: ", config.maxSteps, jsxRuntime.jsx("input", { type: "range", min: 16, max: 256, step: 16, value: config.maxSteps, onChange: (e) => setConfig({ maxSteps: parseInt(e.target.value, 10) }), style: { width: '100%' } })] }), jsxRuntime.jsxs("label", { children: ["Max Distance: ", config.maxDistance, jsxRuntime.jsx("input", { type: "range", min: 5, max: 200, step: 5, value: config.maxDistance, onChange: (e) => setConfig({ maxDistance: parseInt(e.target.value, 10) }), style: { width: '100%' } })] }), jsxRuntime.jsxs("label", { children: ["Intensity: ", config.intensity.toFixed(2), jsxRuntime.jsx("input", { type: "range", min: 0, max: 1, step: 0.05, value: config.intensity, onChange: (e) => setConfig({ intensity: parseFloat(e.target.value) }), style: { width: '100%' } })] }), jsxRuntime.jsxs("label", { children: ["Thickness: ", config.thickness.toFixed(2), jsxRuntime.jsx("input", { type: "range", min: 0.05, max: 2, step: 0.05, value: config.thickness, onChange: (e) => setConfig({ thickness: parseFloat(e.target.value) }), style: { width: '100%' } })] }), jsxRuntime.jsxs("label", { children: ["Jitter: ", config.jitter.toFixed(2), jsxRuntime.jsx("input", { type: "range", min: 0, max: 1, step: 0.05, value: config.jitter, onChange: (e) => setConfig({ jitter: parseFloat(e.target.value) }), style: { width: '100%' } })] }), jsxRuntime.jsxs("label", { children: ["Resolution Scale: ", config.resolution.toFixed(2), jsxRuntime.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%' } })] }), jsxRuntime.jsxs("label", { children: ["Fresnel: ", config.fresnelExponent.toFixed(1), jsxRuntime.jsx("input", { type: "range", min: 1, max: 8, step: 0.5, value: config.fresnelExponent, onChange: (e) => setConfig({ fresnelExponent: parseFloat(e.target.value) }), style: { width: '100%' } })] })] }));
281
+ return (jsxRuntime.jsxs("div", { className: `nice-ssr ${className}`, style: { display: 'grid', gap: 8, fontSize: 13 }, children: [jsxRuntime.jsxs("div", { style: { display: 'flex', justifyContent: 'space-between', alignItems: 'center' }, children: [jsxRuntime.jsxs("strong", { children: [jsxRuntime.jsx(ui.NiceIcon, { name: "copy", size: 14 }), ' ', t('ssr.screenSpaceReflections', 'Screen-Space Reflections')] }), jsxRuntime.jsxs("label", { style: { display: 'flex', alignItems: 'center', gap: 4, fontSize: 11 }, children: [jsxRuntime.jsx("input", { type: "checkbox", checked: config.enabled, onChange: (e) => setConfig({ enabled: e.target.checked }) }), t('ssr.enabled', 'Enabled')] })] }), jsxRuntime.jsxs("label", { children: [t('ssr.maxSteps', 'Max Steps: {maxSteps}').replace('{maxSteps}', String(config.maxSteps)), jsxRuntime.jsx("input", { type: "range", min: 16, max: 256, step: 16, value: config.maxSteps, onChange: (e) => setConfig({ maxSteps: parseInt(e.target.value, 10) }), style: { width: '100%' } })] }), jsxRuntime.jsxs("label", { children: [t('ssr.maxDistance', 'Max Distance: {maxDistance}').replace('{maxDistance}', String(config.maxDistance)), jsxRuntime.jsx("input", { type: "range", min: 5, max: 200, step: 5, value: config.maxDistance, onChange: (e) => setConfig({ maxDistance: parseInt(e.target.value, 10) }), style: { width: '100%' } })] }), jsxRuntime.jsxs("label", { children: [t('ssr.intensity', 'Intensity: {intensity}').replace('{intensity}', String(config.intensity.toFixed(2))), jsxRuntime.jsx("input", { type: "range", min: 0, max: 1, step: 0.05, value: config.intensity, onChange: (e) => setConfig({ intensity: parseFloat(e.target.value) }), style: { width: '100%' } })] }), jsxRuntime.jsxs("label", { children: [t('ssr.thickness', 'Thickness: {thickness}').replace('{thickness}', String(config.thickness.toFixed(2))), jsxRuntime.jsx("input", { type: "range", min: 0.05, max: 2, step: 0.05, value: config.thickness, onChange: (e) => setConfig({ thickness: parseFloat(e.target.value) }), style: { width: '100%' } })] }), jsxRuntime.jsxs("label", { children: [t('ssr.jitter', 'Jitter: {jitter}').replace('{jitter}', String(config.jitter.toFixed(2))), jsxRuntime.jsx("input", { type: "range", min: 0, max: 1, step: 0.05, value: config.jitter, onChange: (e) => setConfig({ jitter: parseFloat(e.target.value) }), style: { width: '100%' } })] }), jsxRuntime.jsxs("label", { children: [t('ssr.resolutionScale', 'Resolution Scale: {resolution}').replace('{resolution}', String(config.resolution.toFixed(2))), jsxRuntime.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%' } })] }), jsxRuntime.jsxs("label", { children: [t('ssr.fresnel', 'Fresnel: {fresnelExponent}').replace('{fresnelExponent}', String(config.fresnelExponent.toFixed(1))), jsxRuntime.jsx("input", { type: "range", min: 1, max: 8, step: 0.5, value: config.fresnelExponent, onChange: (e) => setConfig({ fresnelExponent: parseFloat(e.target.value) }), style: { width: '100%' } })] })] }));
281
282
  };
282
283
 
283
284
  exports.NiceSSR = NiceSSR;