@nice2dev/ui-graphics 1.2.0 → 1.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. package/CHANGELOG.md +103 -0
  2. package/dist/cjs/animation/Audience.js +3 -1
  3. package/dist/cjs/animation/rig/RigPlayer.js +1 -1
  4. package/dist/cjs/animation/rig/presets.js +67 -55
  5. package/dist/cjs/animation/shapes/headwear.js +4 -1
  6. package/dist/cjs/core/NiceBrushEngine.js +5 -3
  7. package/dist/cjs/core/editorAsk.js +48 -0
  8. package/dist/cjs/core/i18n.js +7 -3
  9. package/dist/cjs/core/plugins.js +1 -1
  10. package/dist/cjs/core/rtl.js +1 -1
  11. package/dist/cjs/core/theme.js +1 -1
  12. package/dist/cjs/font/NiceFontEditor.js +13 -11
  13. package/dist/cjs/game/GameAsset2dEditor.js +28 -16
  14. package/dist/cjs/nice2dev-ui-graphics.css +1 -1
  15. package/dist/cjs/photo/FilterThumb.js +3 -3
  16. package/dist/cjs/photo/NiceAITools.js +5 -3
  17. package/dist/cjs/photo/PhotoEditor.js +3 -1
  18. package/dist/cjs/photo/PhotoEditorCanvas.js +8 -6
  19. package/dist/cjs/photo/PhotoEditorLeftPanel.js +19 -19
  20. package/dist/cjs/photo/PhotoEditorToolbar.js +4 -4
  21. package/dist/cjs/photo/photoFilters.js +1 -0
  22. package/dist/cjs/pixel/PixelEditor.js +6 -3
  23. package/dist/cjs/pixel/PixelEditorCanvas.js +10 -6
  24. package/dist/cjs/pixel/PixelEditorMenuBar.js +3 -3
  25. package/dist/cjs/pixel/PixelEditorRightPanel.js +28 -24
  26. package/dist/cjs/pixel/PixelEditorStatusBar.js +8 -4
  27. package/dist/cjs/pixel/PixelEditorTimeline.js +11 -2
  28. package/dist/cjs/pixel/PixelEditorToolbar.js +10 -6
  29. package/dist/cjs/pixel/SpriteGeneratorPanel.js +11 -7
  30. package/dist/cjs/pixel/animalGeneratorPresets.js +31 -31
  31. package/dist/cjs/pixel/buildingGeneratorPresets.js +24 -24
  32. package/dist/cjs/pixel/characterGeneratorPresets.js +25 -25
  33. package/dist/cjs/pixel/usePixelEditor.js +13 -10
  34. package/dist/cjs/texture/Nice3DTexturePainter.js +10 -8
  35. package/dist/cjs/ui/NiceUIDesigner.js +17 -13
  36. package/dist/cjs/vector/NiceSvgToCode.js +6 -4
  37. package/dist/cjs/vector/VectorEditor.js +3 -2
  38. package/dist/cjs/vector/VectorEditorShapeRenderer.js +3 -1
  39. package/dist/cjs/vector/useVectorEditor.js +38 -29
  40. package/dist/cjs/vector/vectorEditorImport.js +1 -0
  41. package/dist/cjs/vector/vectorIconImport.js +1 -0
  42. package/dist/esm/animation/Audience.js +3 -1
  43. package/dist/esm/animation/rig/RigPlayer.js +1 -1
  44. package/dist/esm/animation/rig/presets.js +68 -56
  45. package/dist/esm/animation/shapes/headwear.js +4 -1
  46. package/dist/esm/animation/spineExport.js +1 -1
  47. package/dist/esm/core/NiceBrushEngine.js +5 -3
  48. package/dist/esm/core/editorAsk.js +45 -0
  49. package/dist/esm/core/i18n.js +8 -4
  50. package/dist/esm/core/plugins.js +1 -1
  51. package/dist/esm/core/rtl.js +1 -1
  52. package/dist/esm/core/theme.js +1 -1
  53. package/dist/esm/font/NiceFontEditor.js +13 -11
  54. package/dist/esm/game/GameAsset2dEditor.js +28 -16
  55. package/dist/esm/nice2dev-ui-graphics.css +1 -1
  56. package/dist/esm/photo/FilterThumb.js +3 -3
  57. package/dist/esm/photo/NiceAITools.js +5 -3
  58. package/dist/esm/photo/PhotoEditor.js +3 -1
  59. package/dist/esm/photo/PhotoEditorCanvas.js +8 -6
  60. package/dist/esm/photo/PhotoEditorLeftPanel.js +19 -19
  61. package/dist/esm/photo/PhotoEditorToolbar.js +4 -4
  62. package/dist/esm/photo/photoFilters.js +1 -0
  63. package/dist/esm/pixel/PixelEditor.js +6 -3
  64. package/dist/esm/pixel/PixelEditorCanvas.js +10 -6
  65. package/dist/esm/pixel/PixelEditorMenuBar.js +3 -3
  66. package/dist/esm/pixel/PixelEditorRightPanel.js +28 -24
  67. package/dist/esm/pixel/PixelEditorStatusBar.js +8 -4
  68. package/dist/esm/pixel/PixelEditorTimeline.js +11 -2
  69. package/dist/esm/pixel/PixelEditorToolbar.js +10 -6
  70. package/dist/esm/pixel/SpriteGeneratorPanel.js +11 -7
  71. package/dist/esm/pixel/animalGeneratorPresets.js +32 -32
  72. package/dist/esm/pixel/buildingGeneratorPresets.js +25 -25
  73. package/dist/esm/pixel/characterGeneratorPresets.js +26 -26
  74. package/dist/esm/pixel/usePixelEditor.js +13 -10
  75. package/dist/esm/texture/Nice3DTexturePainter.js +10 -8
  76. package/dist/esm/ui/NiceUIDesigner.js +17 -13
  77. package/dist/esm/vector/NiceSvgToCode.js +6 -4
  78. package/dist/esm/vector/VectorEditor.js +3 -2
  79. package/dist/esm/vector/VectorEditorShapeRenderer.js +3 -1
  80. package/dist/esm/vector/useVectorEditor.js +38 -29
  81. package/dist/esm/vector/vectorEditorImport.js +1 -0
  82. package/dist/esm/vector/vectorIconImport.js +1 -0
  83. package/dist/types/core/LocalUI.d.ts +1 -2
  84. package/dist/types/core/editorAsk.d.ts +26 -0
  85. package/dist/types/core/i18n.d.ts +1 -17
  86. package/dist/types/pixel/usePixelEditor.d.ts +3 -0
  87. package/dist/types/vector/useVectorEditor.d.ts +2 -0
  88. package/package.json +5 -5
@@ -4,6 +4,7 @@ var jsxRuntime = require('react/jsx-runtime');
4
4
  var ui = require('@nice2dev/ui');
5
5
  var uiCore = require('@nice2dev/ui-core');
6
6
  var React = require('react');
7
+ var i18n = require('../core/i18n.js');
7
8
  var GameAsset2dEditor_module = require('./GameAsset2dEditor.module.css.js');
8
9
  var useGameAssetEditor = require('./useGameAssetEditor.js');
9
10
 
@@ -11,8 +12,9 @@ var useGameAssetEditor = require('./useGameAssetEditor.js');
11
12
  MENU BAR
12
13
  ──────────────────────────────────────────────────────────────── */
13
14
  const MenuBar = ({ api }) => {
15
+ const { t } = i18n.useNiceTranslation();
14
16
  const fileInputRef = React.useRef(null);
15
- return (jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.menuBar, children: [jsxRuntime.jsxs("h3", { children: [jsxRuntime.jsx(uiCore.NiceIcon, { name: "gamepad", size: 16 }), " Game Asset Editor"] }), jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.menuGroup, children: [jsxRuntime.jsxs(ui.NiceButton, { className: GameAsset2dEditor_module.menuBtn, variant: "ghost", size: "sm", onClick: () => api.newProject('New Project'), children: [jsxRuntime.jsx(uiCore.NiceIcon, { name: "file", size: 14 }), " New"] }), jsxRuntime.jsxs(ui.NiceButton, { className: GameAsset2dEditor_module.menuBtn, variant: "ghost", size: "sm", onClick: () => { var _a; return (_a = fileInputRef.current) === null || _a === void 0 ? void 0 : _a.click(); }, children: [jsxRuntime.jsx(uiCore.NiceIcon, { name: "folder", size: 14 }), " Open"] }), jsxRuntime.jsxs(ui.NiceButton, { className: GameAsset2dEditor_module.menuBtn, variant: "ghost", size: "sm", onClick: api.saveProject, children: [jsxRuntime.jsx(uiCore.NiceIcon, { name: "save", size: 14 }), " Save"] })] }), jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.spacer }), jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.menuGroup, children: [jsxRuntime.jsxs(ui.NiceButton, { className: GameAsset2dEditor_module.menuBtn, variant: "ghost", size: "sm", onClick: api.undo, disabled: !api.canUndo, children: [jsxRuntime.jsx(uiCore.NiceIcon, { name: "arrow-left", size: 14 }), " Undo"] }), jsxRuntime.jsxs(ui.NiceButton, { className: GameAsset2dEditor_module.menuBtn, variant: "ghost", size: "sm", onClick: api.redo, disabled: !api.canRedo, children: [jsxRuntime.jsx(uiCore.NiceIcon, { name: "arrow-right", size: 14 }), " Redo"] })] }), jsxRuntime.jsx("input", { ref: fileInputRef, type: "file", accept: ".json", style: { display: 'none' }, onChange: (e) => {
17
+ return (jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.menuBar, children: [jsxRuntime.jsxs("h3", { children: [jsxRuntime.jsx(uiCore.NiceIcon, { name: "gamepad", size: 16 }), ' ', t('gameAsset2dEditor.gameAssetEditor', 'Game Asset Editor')] }), jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.menuGroup, children: [jsxRuntime.jsxs(ui.NiceButton, { className: GameAsset2dEditor_module.menuBtn, variant: "ghost", size: "sm", onClick: () => api.newProject('New Project'), children: [jsxRuntime.jsx(uiCore.NiceIcon, { name: "file", size: 14 }), " New"] }), jsxRuntime.jsxs(ui.NiceButton, { className: GameAsset2dEditor_module.menuBtn, variant: "ghost", size: "sm", onClick: () => { var _a; return (_a = fileInputRef.current) === null || _a === void 0 ? void 0 : _a.click(); }, children: [jsxRuntime.jsx(uiCore.NiceIcon, { name: "folder", size: 14 }), " ", t('gameAsset2dEditor.open', 'Open')] }), jsxRuntime.jsxs(ui.NiceButton, { className: GameAsset2dEditor_module.menuBtn, variant: "ghost", size: "sm", onClick: api.saveProject, children: [jsxRuntime.jsx(uiCore.NiceIcon, { name: "save", size: 14 }), " ", t('gameAsset2dEditor.save', 'Save')] })] }), jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.spacer }), jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.menuGroup, children: [jsxRuntime.jsxs(ui.NiceButton, { className: GameAsset2dEditor_module.menuBtn, variant: "ghost", size: "sm", onClick: api.undo, disabled: !api.canUndo, children: [jsxRuntime.jsx(uiCore.NiceIcon, { name: "arrow-left", size: 14 }), " ", t('gameAsset2dEditor.undo', 'Undo')] }), jsxRuntime.jsxs(ui.NiceButton, { className: GameAsset2dEditor_module.menuBtn, variant: "ghost", size: "sm", onClick: api.redo, disabled: !api.canRedo, children: [jsxRuntime.jsx(uiCore.NiceIcon, { name: "arrow-right", size: 14 }), " ", t('gameAsset2dEditor.redo', 'Redo')] })] }), jsxRuntime.jsx("input", { ref: fileInputRef, type: "file", accept: ".json", style: { display: 'none' }, onChange: (e) => {
16
18
  var _a;
17
19
  const file = (_a = e.target.files) === null || _a === void 0 ? void 0 : _a[0];
18
20
  if (file) {
@@ -37,6 +39,7 @@ const ModeTabs = ({ api }) => {
37
39
  TILE MAP TOOLBAR
38
40
  ──────────────────────────────────────────────────────────────── */
39
41
  const TileMapToolbar = ({ api }) => {
42
+ const { t } = i18n.useNiceTranslation();
40
43
  const tools = [
41
44
  { id: 'select', icon: 'square', label: 'Select' },
42
45
  { id: 'brush', icon: 'brush', label: 'Brush' },
@@ -46,22 +49,24 @@ const TileMapToolbar = ({ api }) => {
46
49
  { id: 'line', icon: 'line', label: 'Line' },
47
50
  { id: 'eyedropper', icon: 'eyedropper', label: 'Eyedropper' },
48
51
  ];
49
- return (jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.toolbar, children: [jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.toolGroup, children: tools.map((tool) => (jsxRuntime.jsx(ui.NiceButton, { className: `${GameAsset2dEditor_module.toolBtn} ${api.editorState.tileMapTool === tool.id ? GameAsset2dEditor_module.active : ''}`, variant: api.editorState.tileMapTool === tool.id ? 'primary' : 'ghost', size: "sm", onClick: () => api.setTileMapTool(tool.id), title: tool.label, children: jsxRuntime.jsx(uiCore.NiceIcon, { name: tool.icon, size: 16 }) }, tool.id))) }), jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.spacer }), jsxRuntime.jsx(ui.NiceButton, { className: `${GameAsset2dEditor_module.toolBtn} ${api.editorState.showGrid ? GameAsset2dEditor_module.active : ''}`, variant: api.editorState.showGrid ? 'primary' : 'ghost', size: "sm", onClick: api.toggleGrid, title: "Toggle Grid", "aria-label": "Toggle Grid", children: jsxRuntime.jsx(uiCore.NiceIcon, { name: "grid", size: 16 }) }), jsxRuntime.jsx(ui.NiceButton, { className: `${GameAsset2dEditor_module.toolBtn} ${api.editorState.showCollision ? GameAsset2dEditor_module.active : ''}`, variant: api.editorState.showCollision ? 'primary' : 'ghost', size: "sm", onClick: api.toggleCollision, title: "Show Collision", "aria-label": "Show Collision", children: jsxRuntime.jsx(uiCore.NiceIcon, { name: "square", size: 16 }) }), jsxRuntime.jsx(ui.NiceButton, { className: `${GameAsset2dEditor_module.toolBtn} ${api.editorState.snapToGrid ? GameAsset2dEditor_module.active : ''}`, variant: api.editorState.snapToGrid ? 'primary' : 'ghost', size: "sm", onClick: api.toggleSnap, title: "Snap to Grid", "aria-label": "Snap to Grid", children: jsxRuntime.jsx(uiCore.NiceIcon, { name: "grid", size: 16 }) })] }));
52
+ return (jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.toolbar, children: [jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.toolGroup, children: tools.map((tool) => (jsxRuntime.jsx(ui.NiceButton, { className: `${GameAsset2dEditor_module.toolBtn} ${api.editorState.tileMapTool === tool.id ? GameAsset2dEditor_module.active : ''}`, variant: api.editorState.tileMapTool === tool.id ? 'primary' : 'ghost', size: "sm", onClick: () => api.setTileMapTool(tool.id), title: tool.label, children: jsxRuntime.jsx(uiCore.NiceIcon, { name: tool.icon, size: 16 }) }, tool.id))) }), jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.spacer }), jsxRuntime.jsx(ui.NiceButton, { className: `${GameAsset2dEditor_module.toolBtn} ${api.editorState.showGrid ? GameAsset2dEditor_module.active : ''}`, variant: api.editorState.showGrid ? 'primary' : 'ghost', size: "sm", onClick: api.toggleGrid, title: t('gameAsset2dEditor.toggleGrid', 'Toggle Grid'), "aria-label": t('gameAsset2dEditor.toggleGrid', 'Toggle Grid'), children: jsxRuntime.jsx(uiCore.NiceIcon, { name: "grid", size: 16 }) }), jsxRuntime.jsx(ui.NiceButton, { className: `${GameAsset2dEditor_module.toolBtn} ${api.editorState.showCollision ? GameAsset2dEditor_module.active : ''}`, variant: api.editorState.showCollision ? 'primary' : 'ghost', size: "sm", onClick: api.toggleCollision, title: t('gameAsset2dEditor.showCollision', 'Show Collision'), "aria-label": t('gameAsset2dEditor.showCollision', 'Show Collision'), children: jsxRuntime.jsx(uiCore.NiceIcon, { name: "square", size: 16 }) }), jsxRuntime.jsx(ui.NiceButton, { className: `${GameAsset2dEditor_module.toolBtn} ${api.editorState.snapToGrid ? GameAsset2dEditor_module.active : ''}`, variant: api.editorState.snapToGrid ? 'primary' : 'ghost', size: "sm", onClick: api.toggleSnap, title: t('gameAsset2dEditor.snapToGrid', 'Snap to Grid'), "aria-label": t('gameAsset2dEditor.snapToGrid', 'Snap to Grid'), children: jsxRuntime.jsx(uiCore.NiceIcon, { name: "grid", size: 16 }) })] }));
50
53
  };
51
54
  /* ────────────────────────────────────────────────────────────────
52
55
  SPRITE SHEET TOOLBAR
53
56
  ──────────────────────────────────────────────────────────────── */
54
57
  const SpriteSheetToolbar = ({ api }) => {
58
+ const { t } = i18n.useNiceTranslation();
55
59
  const [sliceWidth, setSliceWidth] = React.useState(16);
56
60
  const [sliceHeight, setSliceHeight] = React.useState(16);
57
- return (jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.toolbar, children: [jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.toolGroup, children: [jsxRuntime.jsx(ui.NiceButton, { className: `${GameAsset2dEditor_module.toolBtn} ${api.editorState.spriteSheetTool === 'select' ? GameAsset2dEditor_module.active : ''}`, variant: api.editorState.spriteSheetTool === 'select' ? 'primary' : 'ghost', size: "sm", onClick: () => api.setSpriteSheetTool('select'), title: "Select", "aria-label": "Select", children: jsxRuntime.jsx(uiCore.NiceIcon, { name: "square", size: 16 }) }), jsxRuntime.jsx(ui.NiceButton, { className: `${GameAsset2dEditor_module.toolBtn} ${api.editorState.spriteSheetTool === 'slice' ? GameAsset2dEditor_module.active : ''}`, variant: api.editorState.spriteSheetTool === 'slice' ? 'primary' : 'ghost', size: "sm", onClick: () => api.setSpriteSheetTool('slice'), title: "Manual Slice", "aria-label": "Manual Slice", children: jsxRuntime.jsx(uiCore.NiceIcon, { name: "scissors", size: 16 }) })] }), jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.spacer }), jsxRuntime.jsxs("label", { style: { fontSize: 11, color: 'var(--nice-text-secondary, #8892a8)' }, children: ["Frame size:", jsxRuntime.jsx(ui.NiceNumberInput, { value: sliceWidth, onChange: (val) => setSliceWidth(val !== null && val !== void 0 ? val : 16), style: { width: 40, margin: '0 4px' }, className: GameAsset2dEditor_module.panelInput }), "\u00D7", jsxRuntime.jsx(ui.NiceNumberInput, { value: sliceHeight, onChange: (val) => setSliceHeight(val !== null && val !== void 0 ? val : 16), style: { width: 40, marginLeft: 4 }, className: GameAsset2dEditor_module.panelInput })] }), jsxRuntime.jsx(ui.NiceButton, { className: GameAsset2dEditor_module.btnSecondary, variant: "ghost", onClick: () => api.autoSlice(sliceWidth, sliceHeight), style: { marginLeft: 8 }, children: "Auto Slice" }), jsxRuntime.jsx(ui.NiceButton, { className: GameAsset2dEditor_module.btnSecondary, variant: "ghost", onClick: api.detectSprites, style: { marginLeft: 4 }, children: "Detect Sprites" })] }));
61
+ return (jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.toolbar, children: [jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.toolGroup, children: [jsxRuntime.jsx(ui.NiceButton, { className: `${GameAsset2dEditor_module.toolBtn} ${api.editorState.spriteSheetTool === 'select' ? GameAsset2dEditor_module.active : ''}`, variant: api.editorState.spriteSheetTool === 'select' ? 'primary' : 'ghost', size: "sm", onClick: () => api.setSpriteSheetTool('select'), title: t('gameAsset2dEditor.select', 'Select'), "aria-label": t('gameAsset2dEditor.select', 'Select'), children: jsxRuntime.jsx(uiCore.NiceIcon, { name: "square", size: 16 }) }), jsxRuntime.jsx(ui.NiceButton, { className: `${GameAsset2dEditor_module.toolBtn} ${api.editorState.spriteSheetTool === 'slice' ? GameAsset2dEditor_module.active : ''}`, variant: api.editorState.spriteSheetTool === 'slice' ? 'primary' : 'ghost', size: "sm", onClick: () => api.setSpriteSheetTool('slice'), title: t('gameAsset2dEditor.manualSlice', 'Manual Slice'), "aria-label": t('gameAsset2dEditor.manualSlice', 'Manual Slice'), children: jsxRuntime.jsx(uiCore.NiceIcon, { name: "scissors", size: 16 }) })] }), jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.spacer }), jsxRuntime.jsxs("label", { style: { fontSize: 11, color: 'var(--nice-text-secondary, #8892a8)' }, children: ["Frame size:", jsxRuntime.jsx(ui.NiceNumberInput, { value: sliceWidth, onChange: (val) => setSliceWidth(val !== null && val !== void 0 ? val : 16), style: { width: 40, margin: '0 4px' }, className: GameAsset2dEditor_module.panelInput }), "\u00D7", jsxRuntime.jsx(ui.NiceNumberInput, { value: sliceHeight, onChange: (val) => setSliceHeight(val !== null && val !== void 0 ? val : 16), style: { width: 40, marginLeft: 4 }, className: GameAsset2dEditor_module.panelInput })] }), jsxRuntime.jsx(ui.NiceButton, { className: GameAsset2dEditor_module.btnSecondary, variant: "ghost", onClick: () => api.autoSlice(sliceWidth, sliceHeight), style: { marginLeft: 8 }, children: t('gameAsset2dEditor.autoSlice', 'Auto Slice') }), jsxRuntime.jsx(ui.NiceButton, { className: GameAsset2dEditor_module.btnSecondary, variant: "ghost", onClick: api.detectSprites, style: { marginLeft: 4 }, children: t('gameAsset2dEditor.detectSprites', 'Detect Sprites') })] }));
58
62
  };
59
63
  /* ────────────────────────────────────────────────────────────────
60
64
  TILE PALETTE (LEFT PANEL)
61
65
  ──────────────────────────────────────────────────────────────── */
62
66
  const TilePalette = ({ api }) => {
67
+ const { t } = i18n.useNiceTranslation();
63
68
  const fileInputRef = React.useRef(null);
64
- return (jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.leftPanel, children: [jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.panelHeader, children: [jsxRuntime.jsx("span", { children: "Tiles" }), jsxRuntime.jsx(ui.NiceButton, { className: GameAsset2dEditor_module.menuBtn, variant: "ghost", size: "sm", onClick: () => { var _a; return (_a = fileInputRef.current) === null || _a === void 0 ? void 0 : _a.click(); }, children: "+ Add" })] }), jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.panelContent, children: api.project.tileSets.length === 0 ? (jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.emptyState, children: [jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.emptyStateText, children: "No tiles yet" }), jsxRuntime.jsx(ui.NiceButton, { className: GameAsset2dEditor_module.btnSecondary, variant: "ghost", onClick: () => { var _a; return (_a = fileInputRef.current) === null || _a === void 0 ? void 0 : _a.click(); }, children: "Import Tiles" })] })) : (jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.tilePalette, children: api.project.tileSets.map((tile) => (jsxRuntime.jsx("div", { className: `${GameAsset2dEditor_module.tileItem} ${api.editorState.selectedTileId === tile.id ? GameAsset2dEditor_module.selected : ''}`, onClick: () => api.selectTile(tile.id), title: tile.name, children: jsxRuntime.jsx("img", { src: tile.thumbnail, alt: tile.name }) }, tile.id))) })) }), jsxRuntime.jsx("input", { ref: fileInputRef, type: "file", accept: "image/*", style: { display: 'none' }, onChange: (e) => {
69
+ return (jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.leftPanel, children: [jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.panelHeader, children: [jsxRuntime.jsx("span", { children: t('gameAsset2dEditor.tiles', 'Tiles') }), jsxRuntime.jsx(ui.NiceButton, { className: GameAsset2dEditor_module.menuBtn, variant: "ghost", size: "sm", onClick: () => { var _a; return (_a = fileInputRef.current) === null || _a === void 0 ? void 0 : _a.click(); }, children: "+ Add" })] }), jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.panelContent, children: api.project.tileSets.length === 0 ? (jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.emptyState, children: [jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.emptyStateText, children: t('gameAsset2dEditor.noTilesYet', 'No tiles yet') }), jsxRuntime.jsx(ui.NiceButton, { className: GameAsset2dEditor_module.btnSecondary, variant: "ghost", onClick: () => { var _a; return (_a = fileInputRef.current) === null || _a === void 0 ? void 0 : _a.click(); }, children: t('gameAsset2dEditor.importTiles', 'Import Tiles') })] })) : (jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.tilePalette, children: api.project.tileSets.map((tile) => (jsxRuntime.jsx("div", { className: `${GameAsset2dEditor_module.tileItem} ${api.editorState.selectedTileId === tile.id ? GameAsset2dEditor_module.selected : ''}`, onClick: () => api.selectTile(tile.id), title: tile.name, children: jsxRuntime.jsx("img", { src: tile.thumbnail, alt: tile.name }) }, tile.id))) })) }), jsxRuntime.jsx("input", { ref: fileInputRef, type: "file", accept: "image/*", style: { display: 'none' }, onChange: (e) => {
65
70
  var _a;
66
71
  const file = (_a = e.target.files) === null || _a === void 0 ? void 0 : _a[0];
67
72
  if (file) {
@@ -74,16 +79,18 @@ const TilePalette = ({ api }) => {
74
79
  LAYERS PANEL (RIGHT PANEL)
75
80
  ──────────────────────────────────────────────────────────────── */
76
81
  const LayersPanel = ({ api }) => {
82
+ const { t } = i18n.useNiceTranslation();
77
83
  const activeMap = api.project.tileMaps.find((m) => m.id === api.editorState.activeTileMapId);
78
- return (jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.rightPanel, children: [jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.panelHeader, children: [jsxRuntime.jsx("span", { children: "Layers" }), jsxRuntime.jsx(ui.NiceButton, { className: GameAsset2dEditor_module.menuBtn, variant: "ghost", size: "sm", onClick: api.addLayer, disabled: !activeMap, children: "+ Add" })] }), jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.panelContent, children: activeMap ? (jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.layersList, children: [...activeMap.layers].reverse().map((layer) => (jsxRuntime.jsxs("div", { className: `${GameAsset2dEditor_module.layerItem} ${api.editorState.activeLayerId === layer.id ? GameAsset2dEditor_module.selected : ''}`, onClick: () => api.selectLayer(layer.id), children: [jsxRuntime.jsx(ui.NiceButton, { className: `${GameAsset2dEditor_module.layerVisibility} ${!layer.visible ? GameAsset2dEditor_module.hidden : ''}`, variant: "ghost", size: "sm", onClick: (e) => {
84
+ return (jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.rightPanel, children: [jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.panelHeader, children: [jsxRuntime.jsx("span", { children: t('gameAsset2dEditor.layers', 'Layers') }), jsxRuntime.jsx(ui.NiceButton, { className: GameAsset2dEditor_module.menuBtn, variant: "ghost", size: "sm", onClick: api.addLayer, disabled: !activeMap, children: "+ Add" })] }), jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.panelContent, children: activeMap ? (jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.layersList, children: [...activeMap.layers].reverse().map((layer) => (jsxRuntime.jsxs("div", { className: `${GameAsset2dEditor_module.layerItem} ${api.editorState.activeLayerId === layer.id ? GameAsset2dEditor_module.selected : ''}`, onClick: () => api.selectLayer(layer.id), children: [jsxRuntime.jsx(ui.NiceButton, { className: `${GameAsset2dEditor_module.layerVisibility} ${!layer.visible ? GameAsset2dEditor_module.hidden : ''}`, variant: "ghost", size: "sm", onClick: (e) => {
79
85
  e.stopPropagation();
80
86
  api.toggleLayerVisibility(layer.id);
81
- }, "aria-label": layer.visible ? 'Hide layer' : 'Show layer', children: jsxRuntime.jsx(uiCore.NiceIcon, { name: layer.visible ? 'eye' : 'eye-off', size: 16 }) }), jsxRuntime.jsx("span", { className: GameAsset2dEditor_module.layerName, children: layer.name }), jsxRuntime.jsxs("span", { className: GameAsset2dEditor_module.layerOpacity, children: [Math.round(layer.opacity * 100), "%"] })] }, layer.id))) })) : (jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.emptyState, children: jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.emptyStateText, children: "No tile map selected" }) })) }), jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.panelHeader, children: [jsxRuntime.jsx("span", { children: "Maps" }), jsxRuntime.jsx(ui.NiceButton, { className: GameAsset2dEditor_module.menuBtn, variant: "ghost", size: "sm", onClick: () => api.createTileMap('New Map', 32, 32), children: "+ New" })] }), jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.panelContent, children: api.project.tileMaps.map((map) => (jsxRuntime.jsxs("div", { className: `${GameAsset2dEditor_module.layerItem} ${api.editorState.activeTileMapId === map.id ? GameAsset2dEditor_module.selected : ''}`, onClick: () => api.selectTileMap(map.id), children: [jsxRuntime.jsx("span", { className: GameAsset2dEditor_module.layerName, children: map.name }), jsxRuntime.jsxs("span", { className: GameAsset2dEditor_module.layerOpacity, children: [map.width, "\u00D7", map.height] })] }, map.id))) })] }));
87
+ }, "aria-label": layer.visible ? 'Hide layer' : 'Show layer', children: jsxRuntime.jsx(uiCore.NiceIcon, { name: layer.visible ? 'eye' : 'eye-off', size: 16 }) }), jsxRuntime.jsx("span", { className: GameAsset2dEditor_module.layerName, children: layer.name }), jsxRuntime.jsxs("span", { className: GameAsset2dEditor_module.layerOpacity, children: [Math.round(layer.opacity * 100), "%"] })] }, layer.id))) })) : (jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.emptyState, children: jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.emptyStateText, children: t('gameAsset2dEditor.noTileMapSelected', 'No tile map selected') }) })) }), jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.panelHeader, children: [jsxRuntime.jsx("span", { children: t('gameAsset2dEditor.maps', 'Maps') }), jsxRuntime.jsx(ui.NiceButton, { className: GameAsset2dEditor_module.menuBtn, variant: "ghost", size: "sm", onClick: () => api.createTileMap('New Map', 32, 32), children: "+ New" })] }), jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.panelContent, children: api.project.tileMaps.map((map) => (jsxRuntime.jsxs("div", { className: `${GameAsset2dEditor_module.layerItem} ${api.editorState.activeTileMapId === map.id ? GameAsset2dEditor_module.selected : ''}`, onClick: () => api.selectTileMap(map.id), children: [jsxRuntime.jsx("span", { className: GameAsset2dEditor_module.layerName, children: map.name }), jsxRuntime.jsxs("span", { className: GameAsset2dEditor_module.layerOpacity, children: [map.width, "\u00D7", map.height] })] }, map.id))) })] }));
82
88
  };
83
89
  /* ────────────────────────────────────────────────────────────────
84
90
  TILE MAP CANVAS
85
91
  ──────────────────────────────────────────────────────────────── */
86
92
  const TileMapCanvas = ({ api }) => {
93
+ const { t } = i18n.useNiceTranslation();
87
94
  const canvasRef = React.useRef(null);
88
95
  const containerRef = React.useRef(null);
89
96
  const [isDragging, setIsDragging] = React.useState(false);
@@ -171,12 +178,13 @@ const TileMapCanvas = ({ api }) => {
171
178
  (api.editorState.tileMapTool === 'brush' || api.editorState.tileMapTool === 'eraser')) {
172
179
  handleCanvasClick(e);
173
180
  }
174
- } })) : (jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.emptyState, children: [jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.emptyStateText, children: "Create or select a tile map to start editing" }), jsxRuntime.jsx(ui.NiceButton, { className: GameAsset2dEditor_module.btnPrimary, variant: "primary", onClick: () => api.createTileMap('New Map', 32, 32), children: "Create Tile Map" })] })) }));
181
+ } })) : (jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.emptyState, children: [jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.emptyStateText, children: t('gameAsset2dEditor.createOrSelectATile', 'Create or select a tile map to start editing') }), jsxRuntime.jsx(ui.NiceButton, { className: GameAsset2dEditor_module.btnPrimary, variant: "primary", onClick: () => api.createTileMap('New Map', 32, 32), children: t('gameAsset2dEditor.createTileMap', 'Create Tile Map') })] })) }));
175
182
  };
176
183
  /* ────────────────────────────────────────────────────────────────
177
184
  SPRITE SHEET CANVAS
178
185
  ──────────────────────────────────────────────────────────────── */
179
186
  const SpriteSheetCanvas = ({ api }) => {
187
+ const { t } = i18n.useNiceTranslation();
180
188
  const canvasRef = React.useRef(null);
181
189
  const fileInputRef = React.useRef(null);
182
190
  const activeSheet = api.project.spriteSheets.find((s) => s.id === api.editorState.activeSpriteSheetId);
@@ -243,7 +251,7 @@ const SpriteSheetCanvas = ({ api }) => {
243
251
  }, [activeSheet, api]);
244
252
  return (jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.viewport, children: activeSheet ? (jsxRuntime.jsx("canvas", { ref: canvasRef, className: GameAsset2dEditor_module.viewportCanvas, style: {
245
253
  transform: `translate(-50%, -50%) scale(${api.editorState.zoom})`,
246
- }, onClick: handleFrameClick })) : (jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.emptyState, children: [jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.emptyStateText, children: "Import a sprite sheet to start" }), jsxRuntime.jsx(ui.NiceButton, { className: GameAsset2dEditor_module.btnPrimary, variant: "primary", onClick: () => { var _a; return (_a = fileInputRef.current) === null || _a === void 0 ? void 0 : _a.click(); }, children: "Import Sprite Sheet" }), jsxRuntime.jsx("input", { ref: fileInputRef, type: "file", accept: "image/*", style: { display: 'none' }, onChange: (e) => {
254
+ }, onClick: handleFrameClick })) : (jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.emptyState, children: [jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.emptyStateText, children: t('gameAsset2dEditor.importASpriteSheetTo', 'Import a sprite sheet to start') }), jsxRuntime.jsx(ui.NiceButton, { className: GameAsset2dEditor_module.btnPrimary, variant: "primary", onClick: () => { var _a; return (_a = fileInputRef.current) === null || _a === void 0 ? void 0 : _a.click(); }, children: t('gameAsset2dEditor.importSpriteSheet', 'Import Sprite Sheet') }), jsxRuntime.jsx("input", { ref: fileInputRef, type: "file", accept: "image/*", style: { display: 'none' }, onChange: (e) => {
247
255
  var _a;
248
256
  const file = (_a = e.target.files) === null || _a === void 0 ? void 0 : _a[0];
249
257
  if (file) {
@@ -256,8 +264,9 @@ const SpriteSheetCanvas = ({ api }) => {
256
264
  SPRITE SHEETS LIST
257
265
  ──────────────────────────────────────────────────────────────── */
258
266
  const SpriteSheetsList = ({ api }) => {
267
+ const { t } = i18n.useNiceTranslation();
259
268
  const fileInputRef = React.useRef(null);
260
- return (jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.leftPanel, children: [jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.panelHeader, children: [jsxRuntime.jsx("span", { children: "Sprite Sheets" }), jsxRuntime.jsx(ui.NiceButton, { className: GameAsset2dEditor_module.menuBtn, variant: "ghost", size: "sm", onClick: () => { var _a; return (_a = fileInputRef.current) === null || _a === void 0 ? void 0 : _a.click(); }, children: "+ Import" })] }), jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.panelContent, children: api.project.spriteSheets.length === 0 ? (jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.emptyState, children: jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.emptyStateText, children: "No sprite sheets" }) })) : (jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.layersList, children: api.project.spriteSheets.map((sheet) => (jsxRuntime.jsxs("div", { className: `${GameAsset2dEditor_module.layerItem} ${api.editorState.activeSpriteSheetId === sheet.id ? GameAsset2dEditor_module.selected : ''}`, onClick: () => api.selectSpriteSheet(sheet.id), children: [jsxRuntime.jsx("span", { className: GameAsset2dEditor_module.layerName, children: sheet.name }), jsxRuntime.jsxs("span", { className: GameAsset2dEditor_module.layerOpacity, children: [sheet.frames.length, " frames"] })] }, sheet.id))) })) }), jsxRuntime.jsx("input", { ref: fileInputRef, type: "file", accept: "image/*", style: { display: 'none' }, onChange: (e) => {
269
+ return (jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.leftPanel, children: [jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.panelHeader, children: [jsxRuntime.jsx("span", { children: t('gameAsset2dEditor.spriteSheets', 'Sprite Sheets') }), jsxRuntime.jsx(ui.NiceButton, { className: GameAsset2dEditor_module.menuBtn, variant: "ghost", size: "sm", onClick: () => { var _a; return (_a = fileInputRef.current) === null || _a === void 0 ? void 0 : _a.click(); }, children: "+ Import" })] }), jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.panelContent, children: api.project.spriteSheets.length === 0 ? (jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.emptyState, children: jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.emptyStateText, children: t('gameAsset2dEditor.noSpriteSheets', 'No sprite sheets') }) })) : (jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.layersList, children: api.project.spriteSheets.map((sheet) => (jsxRuntime.jsxs("div", { className: `${GameAsset2dEditor_module.layerItem} ${api.editorState.activeSpriteSheetId === sheet.id ? GameAsset2dEditor_module.selected : ''}`, onClick: () => api.selectSpriteSheet(sheet.id), children: [jsxRuntime.jsx("span", { className: GameAsset2dEditor_module.layerName, children: sheet.name }), jsxRuntime.jsxs("span", { className: GameAsset2dEditor_module.layerOpacity, children: [sheet.frames.length, " frames"] })] }, sheet.id))) })) }), jsxRuntime.jsx("input", { ref: fileInputRef, type: "file", accept: "image/*", style: { display: 'none' }, onChange: (e) => {
261
270
  var _a;
262
271
  const file = (_a = e.target.files) === null || _a === void 0 ? void 0 : _a[0];
263
272
  if (file) {
@@ -271,6 +280,7 @@ const SpriteSheetsList = ({ api }) => {
271
280
  ──────────────────────────────────────────────────────────────── */
272
281
  const FramesPanel = ({ api }) => {
273
282
  var _a;
283
+ const { t } = i18n.useNiceTranslation();
274
284
  const [animName, setAnimName] = React.useState('');
275
285
  const activeSheet = api.project.spriteSheets.find((s) => s.id === api.editorState.activeSpriteSheetId);
276
286
  const createAnimationFromSelection = React.useCallback(() => {
@@ -279,13 +289,14 @@ const FramesPanel = ({ api }) => {
279
289
  setAnimName('');
280
290
  }
281
291
  }, [animName, api]);
282
- return (jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.rightPanel, children: [jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.panelHeader, children: jsxRuntime.jsxs("span", { children: ["Frames (", (_a = activeSheet === null || activeSheet === void 0 ? void 0 : activeSheet.frames.length) !== null && _a !== void 0 ? _a : 0, ")"] }) }), jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.panelContent, style: { maxHeight: 200 }, children: activeSheet === null || activeSheet === void 0 ? void 0 : activeSheet.frames.map((frame) => (jsxRuntime.jsxs("div", { className: `${GameAsset2dEditor_module.layerItem} ${api.editorState.selectedFrameIds.includes(frame.id) ? GameAsset2dEditor_module.selected : ''}`, onClick: () => api.selectFrames([frame.id]), children: [jsxRuntime.jsx("span", { className: GameAsset2dEditor_module.layerName, children: frame.name }), jsxRuntime.jsxs("span", { className: GameAsset2dEditor_module.layerOpacity, children: [frame.width, "\u00D7", frame.height] })] }, frame.id))) }), jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.panelHeader, children: jsxRuntime.jsx("span", { children: "Animations" }) }), jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.panelContent, children: [api.editorState.selectedFrameIds.length > 0 && (jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.panelSection, children: [jsxRuntime.jsx(ui.NiceTextInput, { className: GameAsset2dEditor_module.panelInput, placeholder: "Animation name...", value: animName, onChange: (val) => setAnimName(val) }), jsxRuntime.jsxs(ui.NiceButton, { className: GameAsset2dEditor_module.btnPrimary, variant: "primary", onClick: createAnimationFromSelection, style: { marginTop: 8, width: '100%' }, disabled: !animName, children: ["Create from ", api.editorState.selectedFrameIds.length, " frames"] })] })), activeSheet === null || activeSheet === void 0 ? void 0 : activeSheet.animations.map((anim) => (jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.layerItem, children: [jsxRuntime.jsx("span", { className: GameAsset2dEditor_module.layerName, children: anim.name }), jsxRuntime.jsxs("span", { className: GameAsset2dEditor_module.layerOpacity, children: [anim.frameIds.length, "f"] }), jsxRuntime.jsx(ui.NiceButton, { className: GameAsset2dEditor_module.effectRemove, variant: "ghost", size: "sm", onClick: () => api.removeAnimation(anim.id), "aria-label": "Remove animation", children: jsxRuntime.jsx(uiCore.NiceIcon, { name: "close", size: 14 }) })] }, anim.id)))] })] }));
292
+ return (jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.rightPanel, children: [jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.panelHeader, children: jsxRuntime.jsxs("span", { children: ["Frames (", (_a = activeSheet === null || activeSheet === void 0 ? void 0 : activeSheet.frames.length) !== null && _a !== void 0 ? _a : 0, ")"] }) }), jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.panelContent, style: { maxHeight: 200 }, children: activeSheet === null || activeSheet === void 0 ? void 0 : activeSheet.frames.map((frame) => (jsxRuntime.jsxs("div", { className: `${GameAsset2dEditor_module.layerItem} ${api.editorState.selectedFrameIds.includes(frame.id) ? GameAsset2dEditor_module.selected : ''}`, onClick: () => api.selectFrames([frame.id]), children: [jsxRuntime.jsx("span", { className: GameAsset2dEditor_module.layerName, children: frame.name }), jsxRuntime.jsxs("span", { className: GameAsset2dEditor_module.layerOpacity, children: [frame.width, "\u00D7", frame.height] })] }, frame.id))) }), jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.panelHeader, children: jsxRuntime.jsx("span", { children: t('gameAsset2dEditor.animations', 'Animations') }) }), jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.panelContent, children: [api.editorState.selectedFrameIds.length > 0 && (jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.panelSection, children: [jsxRuntime.jsx(ui.NiceTextInput, { className: GameAsset2dEditor_module.panelInput, placeholder: t('gameAsset2dEditor.animationName', 'Animation name...'), value: animName, onChange: (val) => setAnimName(val) }), jsxRuntime.jsx(ui.NiceButton, { className: GameAsset2dEditor_module.btnPrimary, variant: "primary", onClick: createAnimationFromSelection, style: { marginTop: 8, width: '100%' }, disabled: !animName, children: t('gameAsset2dEditor.createFromFrames', 'Create from {count} frames').replace('{count}', String(api.editorState.selectedFrameIds.length)) })] })), activeSheet === null || activeSheet === void 0 ? void 0 : activeSheet.animations.map((anim) => (jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.layerItem, children: [jsxRuntime.jsx("span", { className: GameAsset2dEditor_module.layerName, children: anim.name }), jsxRuntime.jsxs("span", { className: GameAsset2dEditor_module.layerOpacity, children: [anim.frameIds.length, "f"] }), jsxRuntime.jsx(ui.NiceButton, { className: GameAsset2dEditor_module.effectRemove, variant: "ghost", size: "sm", onClick: () => api.removeAnimation(anim.id), "aria-label": t('gameAsset2dEditor.removeAnimation', 'Remove animation'), children: jsxRuntime.jsx(uiCore.NiceIcon, { name: "close", size: 14 }) })] }, anim.id)))] })] }));
283
293
  };
284
294
  /* ────────────────────────────────────────────────────────────────
285
295
  ANIMATION STATE MACHINE
286
296
  ──────────────────────────────────────────────────────────────── */
287
297
  const AnimationStateMachineView = ({ api }) => {
288
298
  var _a;
299
+ const { t } = i18n.useNiceTranslation();
289
300
  const [newStateName, setNewStateName] = React.useState('');
290
301
  const activeSM = api.project.stateMachines.find((sm) => sm.id === api.editorState.activeStateMachineId);
291
302
  // Get all animations from all sprite sheets
@@ -298,7 +309,7 @@ const AnimationStateMachineView = ({ api }) => {
298
309
  }
299
310
  return result;
300
311
  }, [api.project.spriteSheets]);
301
- return (jsxRuntime.jsxs("div", { style: { display: 'flex', flex: 1, overflow: 'hidden' }, children: [jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.leftPanel, children: [jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.panelHeader, children: [jsxRuntime.jsx("span", { children: "State Machines" }), jsxRuntime.jsx("button", { className: GameAsset2dEditor_module.menuBtn, onClick: () => api.createStateMachine('New State Machine'), children: "+ New" })] }), jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.panelContent, style: { maxHeight: 150 }, children: api.project.stateMachines.map((sm) => (jsxRuntime.jsxs("div", { className: `${GameAsset2dEditor_module.layerItem} ${api.editorState.activeStateMachineId === sm.id ? GameAsset2dEditor_module.selected : ''}`, onClick: () => api.selectStateMachine(sm.id), children: [jsxRuntime.jsx("span", { className: GameAsset2dEditor_module.layerName, children: sm.name }), jsxRuntime.jsxs("span", { className: GameAsset2dEditor_module.layerOpacity, children: [sm.states.length, " states"] })] }, sm.id))) }), activeSM && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.panelHeader, children: jsxRuntime.jsx("span", { children: "States" }) }), jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.panelContent, children: [jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.panelSection, children: [jsxRuntime.jsx(ui.NiceTextInput, { className: GameAsset2dEditor_module.panelInput, placeholder: "State name...", value: newStateName, onChange: (val) => setNewStateName(val) }), allAnimations.length > 0 && newStateName && (jsxRuntime.jsx(ui.NiceSelect, { className: GameAsset2dEditor_module.panelInput, style: { marginTop: 4 }, onChange: (val) => {
312
+ return (jsxRuntime.jsxs("div", { style: { display: 'flex', flex: 1, overflow: 'hidden' }, children: [jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.leftPanel, children: [jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.panelHeader, children: [jsxRuntime.jsx("span", { children: t('gameAsset2dEditor.stateMachines', 'State Machines') }), jsxRuntime.jsx("button", { className: GameAsset2dEditor_module.menuBtn, onClick: () => api.createStateMachine('New State Machine'), children: "+ New" })] }), jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.panelContent, style: { maxHeight: 150 }, children: api.project.stateMachines.map((sm) => (jsxRuntime.jsxs("div", { className: `${GameAsset2dEditor_module.layerItem} ${api.editorState.activeStateMachineId === sm.id ? GameAsset2dEditor_module.selected : ''}`, onClick: () => api.selectStateMachine(sm.id), children: [jsxRuntime.jsx("span", { className: GameAsset2dEditor_module.layerName, children: sm.name }), jsxRuntime.jsxs("span", { className: GameAsset2dEditor_module.layerOpacity, children: [sm.states.length, " states"] })] }, sm.id))) }), activeSM && (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.panelHeader, children: jsxRuntime.jsx("span", { children: t('gameAsset2dEditor.states', 'States') }) }), jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.panelContent, children: [jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.panelSection, children: [jsxRuntime.jsx(ui.NiceTextInput, { className: GameAsset2dEditor_module.panelInput, placeholder: t('gameAsset2dEditor.stateName', 'State name...'), value: newStateName, onChange: (val) => setNewStateName(val) }), allAnimations.length > 0 && newStateName && (jsxRuntime.jsx(ui.NiceSelect, { className: GameAsset2dEditor_module.panelInput, style: { marginTop: 4 }, onChange: (val) => {
302
313
  if (val) {
303
314
  api.addState(newStateName, val);
304
315
  setNewStateName('');
@@ -312,7 +323,7 @@ const AnimationStateMachineView = ({ api }) => {
312
323
  ] }))] }), activeSM.states.map((state) => (jsxRuntime.jsxs("div", { className: `${GameAsset2dEditor_module.layerItem} ${api.editorState.selectedStateId === state.id ? GameAsset2dEditor_module.selected : ''} ${activeSM.entryStateId === state.id ? GameAsset2dEditor_module.entry : ''}`, onClick: () => api.selectState(state.id), children: [jsxRuntime.jsxs("span", { className: GameAsset2dEditor_module.layerName, children: [activeSM.entryStateId === state.id && jsxRuntime.jsx(uiCore.NiceIcon, { name: "play", size: 12 }), ' ', state.name] }), jsxRuntime.jsx(ui.NiceButton, { className: GameAsset2dEditor_module.effectRemove, variant: "ghost", size: "sm", onClick: (e) => {
313
324
  e.stopPropagation();
314
325
  api.removeState(state.id);
315
- }, "aria-label": "Remove state", children: jsxRuntime.jsx(uiCore.NiceIcon, { name: "close", size: 14 }) })] }, state.id)))] })] }))] }), jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.stateGraph, children: activeSM ? (jsxRuntime.jsxs("svg", { width: "100%", height: "100%", children: [jsxRuntime.jsx("defs", { children: jsxRuntime.jsx("marker", { id: "arrowhead", markerWidth: "10", markerHeight: "7", refX: "9", refY: "3.5", orient: "auto", children: jsxRuntime.jsx("polygon", { points: "0 0, 10 3.5, 0 7", fill: "var(--nice-text-secondary, #4a5a7e)" }) }) }), activeSM.transitions.map((trans) => {
326
+ }, "aria-label": t('gameAsset2dEditor.removeState', 'Remove state'), children: jsxRuntime.jsx(uiCore.NiceIcon, { name: "close", size: 14 }) })] }, state.id)))] })] }))] }), jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.stateGraph, children: activeSM ? (jsxRuntime.jsxs("svg", { width: "100%", height: "100%", children: [jsxRuntime.jsx("defs", { children: jsxRuntime.jsx("marker", { id: "arrowhead", markerWidth: "10", markerHeight: "7", refX: "9", refY: "3.5", orient: "auto", children: jsxRuntime.jsx("polygon", { points: "0 0, 10 3.5, 0 7", fill: "var(--nice-text-secondary, #4a5a7e)" }) }) }), activeSM.transitions.map((trans) => {
316
327
  const from = activeSM.states.find((s) => s.id === trans.fromStateId);
317
328
  const to = activeSM.states.find((s) => s.id === trans.toStateId);
318
329
  if (!from || !to) {
@@ -322,11 +333,11 @@ const AnimationStateMachineView = ({ api }) => {
322
333
  }), activeSM.states.map((state) => {
323
334
  var _a, _b;
324
335
  return (jsxRuntime.jsx("foreignObject", { x: state.position.x, y: state.position.y, width: 120, height: 50, children: jsxRuntime.jsxs("div", { className: `${GameAsset2dEditor_module.stateNode} ${api.editorState.selectedStateId === state.id ? GameAsset2dEditor_module.selected : ''} ${activeSM.entryStateId === state.id ? GameAsset2dEditor_module.entry : ''}`, onClick: () => api.selectState(state.id), children: [jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.stateNodeName, children: state.name }), jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.stateNodeAnim, children: (_b = (_a = allAnimations.find((a) => a.id === state.animationId)) === null || _a === void 0 ? void 0 : _a.name) !== null && _b !== void 0 ? _b : 'No animation' })] }) }, state.id));
325
- })] })) : (jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.emptyState, children: jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.emptyStateText, children: "Create a state machine to design animation flows" }) })) }), jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.rightPanel, children: [jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.panelHeader, children: [jsxRuntime.jsx("span", { children: "Parameters" }), jsxRuntime.jsx(ui.NiceButton, { className: GameAsset2dEditor_module.menuBtn, variant: "ghost", size: "sm", onClick: () => api.addParameter('new_param', 'trigger'), disabled: !activeSM, children: "+ Add" })] }), jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.panelContent, children: activeSM === null || activeSM === void 0 ? void 0 : activeSM.parameters.map((param) => (jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.layerItem, children: [jsxRuntime.jsx("span", { className: GameAsset2dEditor_module.layerOpacity, children: param.type }), jsxRuntime.jsx("span", { className: GameAsset2dEditor_module.layerName, children: param.name }), jsxRuntime.jsx(ui.NiceButton, { className: GameAsset2dEditor_module.effectRemove, variant: "ghost", size: "sm", onClick: () => api.removeParameter(param.id), "aria-label": "Remove parameter", children: jsxRuntime.jsx(uiCore.NiceIcon, { name: "close", size: 14 }) })] }, param.id))) }), jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.panelHeader, children: jsxRuntime.jsx("span", { children: "Transitions" }) }), jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.panelContent, children: [activeSM === null || activeSM === void 0 ? void 0 : activeSM.transitions.map((trans) => {
336
+ })] })) : (jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.emptyState, children: jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.emptyStateText, children: t('gameAsset2dEditor.createAStateMachineTo', 'Create a state machine to design animation flows') }) })) }), jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.rightPanel, children: [jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.panelHeader, children: [jsxRuntime.jsx("span", { children: t('gameAsset2dEditor.parameters', 'Parameters') }), jsxRuntime.jsx(ui.NiceButton, { className: GameAsset2dEditor_module.menuBtn, variant: "ghost", size: "sm", onClick: () => api.addParameter('new_param', 'trigger'), disabled: !activeSM, children: "+ Add" })] }), jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.panelContent, children: activeSM === null || activeSM === void 0 ? void 0 : activeSM.parameters.map((param) => (jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.layerItem, children: [jsxRuntime.jsx("span", { className: GameAsset2dEditor_module.layerOpacity, children: param.type }), jsxRuntime.jsx("span", { className: GameAsset2dEditor_module.layerName, children: param.name }), jsxRuntime.jsx(ui.NiceButton, { className: GameAsset2dEditor_module.effectRemove, variant: "ghost", size: "sm", onClick: () => api.removeParameter(param.id), "aria-label": t('gameAsset2dEditor.removeParameter', 'Remove parameter'), children: jsxRuntime.jsx(uiCore.NiceIcon, { name: "close", size: 14 }) })] }, param.id))) }), jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.panelHeader, children: jsxRuntime.jsx("span", { children: t('gameAsset2dEditor.transitions', 'Transitions') }) }), jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.panelContent, children: [activeSM === null || activeSM === void 0 ? void 0 : activeSM.transitions.map((trans) => {
326
337
  var _a, _b;
327
338
  const from = activeSM.states.find((s) => s.id === trans.fromStateId);
328
339
  const to = activeSM.states.find((s) => s.id === trans.toStateId);
329
- return (jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.layerItem, children: [jsxRuntime.jsxs("span", { className: GameAsset2dEditor_module.layerName, children: [(_a = from === null || from === void 0 ? void 0 : from.name) !== null && _a !== void 0 ? _a : '?', " \u2192 ", (_b = to === null || to === void 0 ? void 0 : to.name) !== null && _b !== void 0 ? _b : '?'] }), jsxRuntime.jsx(ui.NiceButton, { className: GameAsset2dEditor_module.effectRemove, variant: "ghost", size: "sm", onClick: () => api.removeTransition(trans.id), "aria-label": "Remove transition", children: jsxRuntime.jsx(uiCore.NiceIcon, { name: "close", size: 14 }) })] }, trans.id));
340
+ return (jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.layerItem, children: [jsxRuntime.jsxs("span", { className: GameAsset2dEditor_module.layerName, children: [(_a = from === null || from === void 0 ? void 0 : from.name) !== null && _a !== void 0 ? _a : '?', " ", jsxRuntime.jsx(uiCore.NiceIcon, { name: "arrow-right", size: 12 }), " ", (_b = to === null || to === void 0 ? void 0 : to.name) !== null && _b !== void 0 ? _b : '?'] }), jsxRuntime.jsx(ui.NiceButton, { className: GameAsset2dEditor_module.effectRemove, variant: "ghost", size: "sm", onClick: () => api.removeTransition(trans.id), "aria-label": t('gameAsset2dEditor.removeTransition', 'Remove transition'), children: jsxRuntime.jsx(uiCore.NiceIcon, { name: "close", size: 14 }) })] }, trans.id));
330
341
  }), api.editorState.selectedStateId && (jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.panelSection, style: { marginTop: 12 }, children: [jsxRuntime.jsx("label", { className: GameAsset2dEditor_module.panelLabel, children: "Add transition to:" }), jsxRuntime.jsx(ui.NiceSelect, { className: GameAsset2dEditor_module.panelInput, onChange: (val) => {
331
342
  if (val && api.editorState.selectedStateId) {
332
343
  api.addTransition(api.editorState.selectedStateId, val);
@@ -340,6 +351,7 @@ const AnimationStateMachineView = ({ api }) => {
340
351
  EFFECTS PANEL
341
352
  ──────────────────────────────────────────────────────────────── */
342
353
  const EffectsView = ({ api }) => {
354
+ const { t } = i18n.useNiceTranslation();
343
355
  const [_currentEffects, _setCurrentEffects] = React.useState([]);
344
356
  const [presetName, setPresetName] = React.useState('');
345
357
  const effectTypes = [
@@ -356,12 +368,12 @@ const EffectsView = ({ api }) => {
356
368
  { type: 'shadow', label: 'Shadow' },
357
369
  { type: 'palette-swap', label: 'Palette Swap' },
358
370
  ];
359
- return (jsxRuntime.jsxs("div", { style: { display: 'flex', flex: 1, overflow: 'hidden' }, children: [jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.leftPanel, children: [jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.panelHeader, children: jsxRuntime.jsx("span", { children: "Add Effect" }) }), jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.panelContent, children: effectTypes.map(({ type, label }) => (jsxRuntime.jsx(ui.NiceButton, { className: GameAsset2dEditor_module.layerItem, variant: "ghost", onClick: () => api.addEffect(type), style: { cursor: 'pointer', border: 'none', textAlign: 'left' }, children: jsxRuntime.jsx("span", { className: GameAsset2dEditor_module.layerName, children: label }) }, type))) }), jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.panelHeader, children: jsxRuntime.jsx("span", { children: "Presets" }) }), jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.panelContent, children: [jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.panelSection, children: [jsxRuntime.jsx(ui.NiceTextInput, { className: GameAsset2dEditor_module.panelInput, placeholder: "Preset name...", value: presetName, onChange: (val) => setPresetName(val) }), jsxRuntime.jsx(ui.NiceButton, { className: GameAsset2dEditor_module.btnSecondary, variant: "ghost", style: { marginTop: 4, width: '100%' }, onClick: () => {
371
+ return (jsxRuntime.jsxs("div", { style: { display: 'flex', flex: 1, overflow: 'hidden' }, children: [jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.leftPanel, children: [jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.panelHeader, children: jsxRuntime.jsx("span", { children: t('gameAsset2dEditor.addEffect', 'Add Effect') }) }), jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.panelContent, children: effectTypes.map(({ type, label }) => (jsxRuntime.jsx(ui.NiceButton, { className: GameAsset2dEditor_module.layerItem, variant: "ghost", onClick: () => api.addEffect(type), style: { cursor: 'pointer', border: 'none', textAlign: 'left' }, children: jsxRuntime.jsx("span", { className: GameAsset2dEditor_module.layerName, children: label }) }, type))) }), jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.panelHeader, children: jsxRuntime.jsx("span", { children: t('gameAsset2dEditor.presets', 'Presets') }) }), jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.panelContent, children: [jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.panelSection, children: [jsxRuntime.jsx(ui.NiceTextInput, { className: GameAsset2dEditor_module.panelInput, placeholder: t('gameAsset2dEditor.presetName', 'Preset name...'), value: presetName, onChange: (val) => setPresetName(val) }), jsxRuntime.jsx(ui.NiceButton, { className: GameAsset2dEditor_module.btnSecondary, variant: "ghost", style: { marginTop: 4, width: '100%' }, onClick: () => {
360
372
  if (presetName) {
361
373
  api.saveEffectPreset(presetName);
362
374
  setPresetName('');
363
375
  }
364
- }, disabled: !presetName, children: "Save Current Effects" })] }), api.project.effectPresets.map((preset) => (jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.layerItem, onClick: () => api.loadEffectPreset(preset.id), style: { cursor: 'pointer' }, children: [jsxRuntime.jsx("span", { className: GameAsset2dEditor_module.layerName, children: preset.name }), jsxRuntime.jsxs("span", { className: GameAsset2dEditor_module.layerOpacity, children: [preset.effects.length, " effects"] })] }, preset.id)))] })] }), jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.viewport, children: jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.emptyState, children: jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.emptyStateText, children: "Select a sprite or tile to preview effects" }) }) }), jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.rightPanel, children: [jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.panelHeader, children: jsxRuntime.jsx("span", { children: "Active Effects" }) }), jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.panelContent, children: jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.effectsList, children: jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.emptyState, children: jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.emptyStateText, children: "Add effects from the left panel" }) }) }) })] })] }));
376
+ }, disabled: !presetName, children: t('gameAsset2dEditor.saveCurrentEffects', 'Save Current Effects') })] }), api.project.effectPresets.map((preset) => (jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.layerItem, onClick: () => api.loadEffectPreset(preset.id), style: { cursor: 'pointer' }, children: [jsxRuntime.jsx("span", { className: GameAsset2dEditor_module.layerName, children: preset.name }), jsxRuntime.jsxs("span", { className: GameAsset2dEditor_module.layerOpacity, children: [preset.effects.length, " effects"] })] }, preset.id)))] })] }), jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.viewport, children: jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.emptyState, children: jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.emptyStateText, children: t('gameAsset2dEditor.selectASpriteOrTile', 'Select a sprite or tile to preview effects') }) }) }), jsxRuntime.jsxs("div", { className: GameAsset2dEditor_module.rightPanel, children: [jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.panelHeader, children: jsxRuntime.jsx("span", { children: t('gameAsset2dEditor.activeEffects', 'Active Effects') }) }), jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.panelContent, children: jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.effectsList, children: jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.emptyState, children: jsxRuntime.jsx("div", { className: GameAsset2dEditor_module.emptyStateText, children: t('gameAsset2dEditor.addEffectsFromTheLeft', 'Add effects from the left panel') }) }) }) })] })] }));
365
377
  };
366
378
  /* ────────────────────────────────────────────────────────────────
367
379
  STATUS BAR
@@ -1 +1 @@
1
- .PixelEditor-module_root__3gidG{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}.PixelEditor-module_menuBar__8JFld{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)}.PixelEditor-module_menuBtn__w-GQC{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)}.PixelEditor-module_menuBtn__w-GQC:hover{background:var(--nice-bg-secondary);color:var(--nice-color-white)}.PixelEditor-module_menuSep__pNZsR{background:var(--nice-bg-secondary);height:16px;margin:0 var(--nice-space-1,4px);width:1px}.PixelEditor-module_menuBar__8JFld .nice-menu__btn{color:var(--nice-text-secondary);font-size:11px}.PixelEditor-module_menuBar__8JFld .nice-menu__btn:hover{background:var(--nice-bg-secondary);color:var(--nice-color-white)}.PixelEditor-module_toolbar__paCGq{background:var(--nice-bg-elevated);border-right:1px solid var(--nice-border-color);display:flex;flex-direction:column;flex-shrink:0;gap:var(--nice-space-0-5,2px);overflow-y:auto;padding:var(--nice-space-1,4px) var(--nice-space-0-5,2px);width:38px}.PixelEditor-module_toolBtn__wD1Kj{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}.PixelEditor-module_toolBtn__wD1Kj:hover{background:var(--nice-bg-secondary);color:var(--nice-text-secondary)}.PixelEditor-module_toolBtnActive__R51U0{border-color:var(--nice-color-white,#fff)!important;box-shadow:inset 2px 0 0 0 var(--nice-color-white,#fff),0 0 0 1px var(--nice-color-primary,#4f8cff)}.PixelEditor-module_toolBtnActive__R51U0,.PixelEditor-module_toolBtnActive__R51U0:hover{background:var(--nice-color-primary,#4f8cff)!important;color:var(--nice-color-white,#fff)!important}.PixelEditor-module_mainArea__Z0x6l{display:flex;flex:1;min-height:0}.PixelEditor-module_canvasContainer__8z2AY{background:var(--nice-bg-inset);cursor:crosshair;flex:1;height:100%;min-height:0;overflow:hidden;position:relative}.PixelEditor-module_canvasContainer__8z2AY canvas{image-rendering:pixelated;position:absolute}.PixelEditor-module_rightPanel__ZjrCh{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:220px}.PixelEditor-module_panelSection__3l225{border-bottom:1px solid var(--nice-border-color)}.PixelEditor-module_rightPanel__ZjrCh .nice-collapse__trigger{align-items:center;background:none;border:none;color:var(--nice-text-secondary);cursor:pointer;display:flex;font-size:10px;gap:var(--nice-space-1-5,6px);letter-spacing:.5px;padding:var(--nice-space-1-5,6px) var(--nice-space-2,8px);text-align:left;text-transform:uppercase;width:100%}.PixelEditor-module_rightPanel__ZjrCh .nice-collapse__trigger:hover{color:var(--nice-text-secondary)}.PixelEditor-module_rightPanel__ZjrCh .nice-collapse__panel{padding:0 var(--nice-space-2,8px) var(--nice-space-1-5,6px)}.PixelEditor-module_collapseChevron__Yuvz6{display:inline-flex;transition:transform .15s ease}.nice-collapse--expanded .PixelEditor-module_collapseChevron__Yuvz6{transform:rotate(90deg)}.PixelEditor-module_layerActions__pZH1f{display:flex;flex-wrap:wrap;gap:var(--nice-space-0-5,2px);margin-bottom:var(--nice-space-1,4px)}.PixelEditor-module_panelTitle__vYyeO{align-items:center;color:var(--nice-text-secondary);display:flex;font-size:10px;justify-content:space-between;letter-spacing:.5px;margin-bottom:var(--nice-space-1,4px);text-transform:uppercase}.PixelEditor-module_panelTitle__vYyeO 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)}.PixelEditor-module_panelTitle__vYyeO button:hover{color:var(--nice-text-muted)}.PixelEditor-module_layerItem__J-gtn{align-items:center;border-radius:var(--nice-radius-sm,3px);cursor:pointer;display:flex;font-size:11px;gap:var(--nice-space-1,4px);padding:var(--nice-space-0-75,3px) var(--nice-space-1,4px)}.PixelEditor-module_layerItem__J-gtn:hover{background:var(--nice-overlay-light-4,hsla(0,0%,100%,.04))}.PixelEditor-module_layerItemActive__yPt29{background:var(--nice-surface)!important;border:1px solid var(--nice-color-primary-hover)}.PixelEditor-module_layerVis__Uj7n2{align-items:center;cursor:pointer;display:flex;flex-shrink:0;font-size:10px;height:16px;justify-content:center;opacity:.6;width:16px}.PixelEditor-module_layerVis__Uj7n2:hover{opacity:1}.PixelEditor-module_layerName__HovwJ{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.PixelEditor-module_layerOpacity__qmWvu{color:var(--nice-text-muted);font-size:10px;text-align:right;width:36px}.PixelEditor-module_paletteGrid__knY-n{display:grid;gap:var(--nice-space-0-5,2px);grid-template-columns:repeat(8,1fr)}.PixelEditor-module_paletteSwatch__MUbha{aspect-ratio:1;border:1px solid var(--nice-overlay-light-8,hsla(0,0%,100%,.08));border-radius:var(--nice-radius-sm,2px);cursor:pointer;transition:transform .1s}.PixelEditor-module_paletteSwatch__MUbha:hover{transform:scale(1.15);z-index:1}.PixelEditor-module_paletteSwatchActive__wDR4T{border-color:var(--nice-color-white)!important;box-shadow:0 0 0 1px var(--nice-color-primary)}.PixelEditor-module_colorPickers__sQlBN{align-items:center;display:flex;gap:var(--nice-space-1-5,6px);margin-top:var(--nice-space-1-5,6px)}.PixelEditor-module_colorSample__GN7Rd{border:2px solid var(--nice-overlay-light-20,hsla(0,0%,100%,.2));border-radius:var(--nice-radius-sm,4px);height:28px;width:28px}.PixelEditor-module_bottomPanel__rviLF{background:var(--nice-bg-canvas);border-top:1px solid var(--nice-border-color);display:flex;flex-direction:column;flex-shrink:0;height:80px}.PixelEditor-module_timelineControls__Laroq{align-items:center;border-bottom:1px solid var(--nice-bg,#224);display:flex;font-size:11px;gap:var(--nice-space-1-5,6px);padding:var(--nice-space-0-5,2px) var(--nice-space-2,8px)}.PixelEditor-module_timelineControls__Laroq button{background:var(--nice-bg-secondary);border:none;border-radius:var(--nice-radius-sm,3px);color:var(--nice-text-muted);cursor:pointer;font-size:11px;padding:var(--nice-space-0-5,2px) var(--nice-space-2,8px)}.PixelEditor-module_timelineControls__Laroq button:hover{background:var(--nice-bg-tertiary);color:var(--nice-color-white)}.PixelEditor-module_timelineControls__Laroq label{color:var(--nice-text-muted)}.PixelEditor-module_timelineControls__Laroq input[type=number]{background:var(--nice-bg-canvas);border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-sm,3px);color:var(--nice-text-primary);font-size:11px;padding:var(--nice-space-px,1px) var(--nice-space-1,4px);text-align:center;width:40px}.PixelEditor-module_timelineControls__Laroq input[type=checkbox]{accent-color:var(--nice-color-primary)}.PixelEditor-module_timelineFrames__dw06F{align-items:stretch;display:flex;flex:1;gap:var(--nice-space-0-5,2px);overflow-x:auto;padding:var(--nice-space-1,4px) var(--nice-space-2,8px)}.PixelEditor-module_frameThumb__2E9mG{align-items:center;background:var(--nice-bg-primary);border:2px solid transparent;border-radius:var(--nice-radius-sm,4px);cursor:pointer;display:flex;flex-direction:column;justify-content:center;min-width:44px;overflow:hidden;position:relative;width:44px}.PixelEditor-module_frameThumb__2E9mG canvas{height:36px;image-rendering:pixelated;object-fit:contain;width:36px}.PixelEditor-module_frameThumb__2E9mG:hover{border-color:var(--nice-border-color)}.PixelEditor-module_frameThumbActive__Z0eK4{background:var(--nice-surface);border-color:var(--nice-color-primary)!important}.PixelEditor-module_frameNum__PoGQC{bottom:1px;color:var(--nice-text-muted);font-size:8px;position:absolute;right:3px}.PixelEditor-module_statusBar__QnphD{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)}.PixelEditor-module_dialogOverlay__IgyFy{align-items:center;background:var(--nice-overlay-60,rgba(0,0,0,.6));display:flex;inset:0;justify-content:center;position:absolute;z-index:100}.PixelEditor-module_dialog__OnkAG{background:var(--nice-bg-elevated);border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-lg,8px);box-shadow:0 8px 32px var(--nice-overlay-50,rgba(0,0,0,.5));min-width:300px;padding:var(--nice-space-5,20px)}.PixelEditor-module_dialog__OnkAG h3{color:var(--nice-text-secondary);font-size:14px;margin:0 0 var(--nice-space-3,12px)}.PixelEditor-module_dialog__OnkAG label{color:var(--nice-text-muted);display:block;font-size:11px;margin:var(--nice-space-2,8px) 0 var(--nice-space-0-5,2px)}.PixelEditor-module_dialog__OnkAG input,.PixelEditor-module_dialog__OnkAG select{background:var(--nice-bg-canvas);border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-sm,4px);color:var(--nice-text-primary);font-size:12px;padding:var(--nice-space-1,4px) var(--nice-space-2,8px);width:100%}.PixelEditor-module_dialogActions__fOa7a{display:flex;gap:var(--nice-space-2,8px);justify-content:flex-end;margin-top:var(--nice-space-4,16px)}.PixelEditor-module_dialogActions__fOa7a button{border:none;border-radius:var(--nice-radius-sm,4px);cursor:pointer;font-size:12px;padding:var(--nice-space-1,4px) var(--nice-space-4,16px)}.PixelEditor-module_btnPrimary__FYlTy{background:var(--nice-color-primary);color:var(--nice-color-white)}.PixelEditor-module_btnPrimary__FYlTy:hover{background:var(--nice-primary,#67d)}.PixelEditor-module_btnSecondary__qLfyJ{background:var(--nice-bg-secondary);color:var(--nice-text-muted)}.PixelEditor-module_btnSecondary__qLfyJ:hover{background:var(--nice-bg-tertiary);color:var(--nice-text-primary)}.PixelEditor-module_brushSlider__UxQ38{align-items:center;border-bottom:1px solid var(--nice-border-color);display:flex;gap:var(--nice-space-1,4px);padding:var(--nice-space-1,4px) var(--nice-space-2,8px)}.PixelEditor-module_brushSlider__UxQ38 label{color:var(--nice-text-muted);font-size:10px}.PixelEditor-module_brushSlider__UxQ38 input[type=range]{accent-color:var(--nice-color-primary);flex:1;height:4px}.PixelEditor-module_brushSlider__UxQ38 span{color:var(--nice-text-muted);font-size:10px;min-width:16px;text-align:center}.PixelEditor-module_toolSep__YIu-E{background:var(--nice-bg-secondary);height:1px;margin:var(--nice-space-1,4px) var(--nice-space-0-5,2px);width:28px}.PixelEditor-module_toolGroup__xA2lN{display:flex;flex-direction:column;gap:var(--nice-space-px,1px);padding:var(--nice-space-0-5,2px) 0}.PixelEditor-module_miniBtn__tg5N0{align-items:center;background:var(--nice-overlay-light-4,hsla(0,0%,100%,.04));border:1px solid transparent;border-radius:var(--nice-radius-sm,3px);color:var(--nice-text-muted);cursor:pointer;display:flex;font-size:10px;height:20px;justify-content:center;transition:all .1s;width:32px}.PixelEditor-module_miniBtn__tg5N0:hover{background:var(--nice-bg-secondary);color:var(--nice-text-secondary)}.PixelEditor-module_miniBtnActive__gpveu{background:var(--nice-bg-tertiary)!important;border-color:var(--nice-color-primary)!important;color:var(--nice-text-primary)!important}.PixelEditor-module_colorSwatches__jFuRX{align-items:center;border-top:1px solid var(--nice-border-color);display:flex;flex-direction:column;gap:var(--nice-space-1,4px);margin-top:var(--nice-space-1,4px);padding:var(--nice-space-1-5,6px) 0}.PixelEditor-module_brushShapes__2bBfl{display:flex;flex-wrap:wrap;gap:var(--nice-space-0-5,2px);padding:var(--nice-space-0-5,2px) 0}.PixelEditor-module_pressureToggles__AITuh{display:flex;flex-direction:column;gap:var(--nice-space-0-5,2px);padding:var(--nice-space-1,4px) 0}.PixelEditor-module_checkLabel__-d-TA{align-items:center;color:var(--nice-text-muted);cursor:pointer;display:flex;font-size:10px;gap:var(--nice-space-1,4px)}.PixelEditor-module_checkLabel__-d-TA input[type=checkbox]{accent-color:var(--nice-color-primary);height:12px;width:12px}.PixelEditor-module_hsvPicker__0ERIh{display:flex;flex-direction:column;gap:var(--nice-space-1,4px);padding:var(--nice-space-1,4px) 0}.PixelEditor-module_hsvRow__M3fhN{align-items:center;display:flex;gap:var(--nice-space-1,4px)}.PixelEditor-module_hsvLabel__O2MkX{color:var(--nice-text-muted);font-size:9px;min-width:16px;text-align:right}.PixelEditor-module_hsvSlider__KKMMJ{accent-color:var(--nice-color-primary);cursor:pointer;flex:1;height:6px;min-width:0}.PixelEditor-module_hsvVal__MgQ8W{color:var(--nice-text-muted);font-size:9px;min-width:28px;text-align:right}.PixelEditor-module_hsvNumInput__Wn4kG{text-align:center;width:36px}.PixelEditor-module_hsvHexInput__MU5Ms,.PixelEditor-module_hsvNumInput__Wn4kG{background:var(--nice-bg-canvas);border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-sm,3px);color:var(--nice-text-primary);font-size:10px;padding:var(--nice-space-px,1px) var(--nice-space-1,4px)}.PixelEditor-module_hsvHexInput__MU5Ms{flex:1}.PixelEditor-module_layerLock__xeWnc{align-items:center;cursor:pointer;display:flex;flex-shrink:0;font-size:10px;height:16px;justify-content:center;opacity:.6;width:16px}.PixelEditor-module_layerLock__xeWnc:hover{opacity:1}.PixelEditor-module_layerNameInput__ZiOKv{background:var(--nice-bg-canvas);border:1px solid var(--nice-color-primary);border-radius:var(--nice-radius-sm,2px);color:var(--nice-text-primary);flex:1;font-size:11px;min-width:0;outline:none;padding:0 var(--nice-space-1,4px)}.PixelEditor-module_layerControls__MrpXo{align-items:center;border-top:1px solid var(--nice-overlay-light-5,hsla(0,0%,100%,.05));display:flex;gap:var(--nice-space-1,4px);margin-top:var(--nice-space-1,4px);padding:var(--nice-space-1,4px) var(--nice-space-1,4px) var(--nice-space-0-5,2px)}.PixelEditor-module_blendSelect__QCwns{background:var(--nice-bg-canvas);border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-sm,3px);color:var(--nice-text-secondary);cursor:pointer;flex:1;font-size:10px;padding:var(--nice-space-px,1px) var(--nice-space-1,4px)}.PixelEditor-module_layerOpSlider__Vw-qs{accent-color:var(--nice-color-primary);cursor:pointer;height:4px;width:60px}.PixelEditor-module_genPanel__99Md8{display:flex;flex-direction:column;height:600px;max-height:70vh;overflow:hidden;width:100%}.PixelEditor-module_genTabs__No5Za{background:var(--nice-bg-canvas);border-bottom:1px solid var(--nice-border-color);display:flex;flex-shrink:0}.PixelEditor-module_genTabBtn__e2VhB{background:none;border:none;border-bottom:2px solid transparent;color:var(--nice-text-secondary);cursor:pointer;flex:1;font-size:11px;padding:var(--nice-space-1-5,6px) var(--nice-space-2,8px);transition:all .15s}.PixelEditor-module_genTabBtn__e2VhB:hover{background:var(--nice-bg-elevated);color:var(--nice-text-muted)}.PixelEditor-module_genTabBtnActive__Rt3jQ{background:var(--nice-bg-elevated)!important;border-bottom-color:var(--nice-color-primary)!important;color:var(--nice-text-primary)!important}.PixelEditor-module_genBody__MuiQy{display:flex;flex:1;min-height:0;overflow:hidden}.PixelEditor-module_genLeft__JdEw6{border-right:1px solid var(--nice-border-color);display:flex;flex-direction:column;flex-shrink:0;overflow-y:auto;width:200px}.PixelEditor-module_genCenter__c5X0S{align-items:center;display:flex;flex:1;flex-direction:column;gap:var(--nice-space-2,8px);overflow-y:auto;padding:var(--nice-space-2,8px)}.PixelEditor-module_genRight__qFz11{border-left:1px solid var(--nice-border-color);display:flex;flex-direction:column;flex-shrink:0;overflow-y:auto;width:200px}.PixelEditor-module_genPreviewWrap__360F-{align-items:center;background:var(--nice-bg-inset);border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-md,6px);display:flex;flex:1;justify-content:center;min-height:120px;overflow:hidden;width:100%}.PixelEditor-module_genPreviewCanvas__75Lw2{image-rendering:pixelated;max-height:100%;max-width:100%;min-height:64px;min-width:64px;object-fit:contain}.PixelEditor-module_genDirGrid__xjEp7{display:flex;flex-wrap:wrap;gap:var(--nice-space-0-5,2px);justify-content:center}.PixelEditor-module_genRow__awCw9{align-items:center;display:flex;gap:var(--nice-space-1,4px);width:100%}.PixelEditor-module_genPresetGrid__f9XK6{display:flex;flex-wrap:wrap;gap:var(--nice-space-0-5,2px)}.PixelEditor-module_genPresetBtn__5C2We{background:var(--nice-overlay-light-4,hsla(0,0%,100%,.04));border:1px solid transparent;border-radius:var(--nice-radius-sm,3px);color:var(--nice-text-muted);cursor:pointer;font-size:9px;padding:var(--nice-space-0-75,3px) var(--nice-space-1-5,6px);transition:all .1s}.PixelEditor-module_genPresetBtn__5C2We:hover{background:var(--nice-bg-secondary);color:var(--nice-text-secondary)}.PixelEditor-module_genPresetBtnActive__WAGew{background:var(--nice-bg-tertiary)!important;border-color:var(--nice-color-primary)!important;color:var(--nice-text-primary)!important}.PixelEditor-module_genPartGrid__l17oc{display:flex;flex-wrap:wrap;gap:var(--nice-space-0-5,2px)}.PixelEditor-module_genPartBtn__5OO82{min-width:32px;padding:0 var(--nice-space-1-5,6px);white-space:nowrap;width:auto}.PixelEditor-module_genColorSwatches__acI6q{display:flex;gap:var(--nice-space-0-5,2px);margin-top:var(--nice-space-0-5,2px)}.PixelEditor-module_genColorSwatch__JE8BO{border:1px solid var(--nice-overlay-light-10,hsla(0,0%,100%,.1));border-radius:var(--nice-radius-sm,2px);height:16px;width:16px}.PixelEditor-module_genAssemblyItem__zNL2P{align-items:center;border-radius:var(--nice-radius-sm,3px);display:flex;font-size:10px;gap:var(--nice-space-1,4px);padding:var(--nice-space-0-5,2px) var(--nice-space-1,4px)}.PixelEditor-module_genAssemblyItem__zNL2P:hover{background:var(--nice-overlay-light-4,hsla(0,0%,100%,.04))}.PixelEditor-module_genAssemblyName__GU-kr{color:var(--nice-text-secondary);flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.PixelEditor-module_genFooter__WkyJp{border-top:1px solid var(--nice-border-color);display:flex;flex-shrink:0;gap:var(--nice-space-2,8px);justify-content:flex-end;padding:var(--nice-space-2-5,10px) var(--nice-space-4,16px)}.PixelEditor-module_btnIcon__O59l9{background:none;border:none;color:var(--nice-text-muted);cursor:pointer;font-size:14px;line-height:1;padding:var(--nice-space-0-5,2px)}.PixelEditor-module_btnIcon__O59l9:hover{color:var(--nice-text-secondary)}.PixelEditor-module_propSelect__4P0Qi{flex:1}.PixelEditor-module_propInput__Q-kr2,.PixelEditor-module_propSelect__4P0Qi{background:var(--nice-bg-canvas);border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-sm,3px);color:var(--nice-text-primary);font-size:11px;min-width:0;padding:var(--nice-space-0-5,2px) var(--nice-space-1,4px)}.VectorEditor-module_root__rtRWo{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}.VectorEditor-module_menuBar__o25XM{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)}.VectorEditor-module_menuBtn__aP4vp{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)}.VectorEditor-module_menuBtn__aP4vp:hover{background:var(--nice-bg-secondary);color:var(--nice-text-primary)}.VectorEditor-module_menuBtn__aP4vp.VectorEditor-module_menuBtnActive__G4hDv,.VectorEditor-module_menuBtn__aP4vp.VectorEditor-module_menuBtnActive__G4hDv:hover{background:var(--nice-color-primary);color:var(--nice-text-on-primary,#fff)}.VectorEditor-module_menuSep__3-kTv{background:var(--nice-bg-secondary);height:16px;margin:0 var(--nice-space-1,4px);width:1px}.VectorEditor-module_menuLabel__Bsm0e{align-items:center;color:var(--nice-text-muted);cursor:pointer;display:flex;font-size:10px;gap:var(--nice-space-0-5,2px);padding:0 var(--nice-space-1,4px)}.VectorEditor-module_toolbar__fakYL{background:var(--nice-bg-elevated);border-right:1px solid var(--nice-border-color);display:flex;flex-direction:column;flex-shrink:0;gap:var(--nice-space-0-5,2px);padding:var(--nice-space-1,4px) var(--nice-space-0-5,2px);width:38px}.VectorEditor-module_toolBtn__Zh7D3{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}.VectorEditor-module_toolBtn__Zh7D3:hover{background:var(--nice-bg-secondary);color:var(--nice-text-secondary)}.VectorEditor-module_toolBtnActive__0xZlr{background:var(--nice-bg-tertiary)!important;border-color:var(--nice-color-primary)!important;color:var(--nice-color-white)!important}.VectorEditor-module_mainArea__3o89F{display:flex;flex:1;min-height:0}.VectorEditor-module_canvasContainer__hOUAx{background:var(--nice-bg-inset);flex:1;height:100%;min-height:0;overflow:hidden;position:relative}.VectorEditor-module_canvasContainer__hOUAx svg{height:100%;inset:0;position:absolute;width:100%}.VectorEditor-module_rightPanel__3hzcS{background:var(--nice-bg-primary);border-left:1px solid var(--nice-border-color);display:flex;flex-direction:column;flex-shrink:0;overflow:hidden;width:320px}.VectorEditor-module_rightPanelTabBody__QrkgO{flex:1 1 auto;min-height:0;overflow-y:auto}.VectorEditor-module_libraryGrid__utboD{display:grid;gap:var(--nice-space-1-5,6px);grid-template-columns:repeat(4,1fr);padding:var(--nice-space-1-5,6px)}.VectorEditor-module_libraryCell__WyOra{align-items:center;background:transparent;border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-sm,4px);color:var(--nice-text-secondary);cursor:pointer;display:flex;flex-direction:column;font-size:9px;gap:var(--nice-space-0-5,2px);overflow:hidden;padding:var(--nice-space-1-5,6px) var(--nice-space-0-5,2px);text-align:center;text-overflow:ellipsis}.VectorEditor-module_libraryCell__WyOra:hover{border-color:var(--nice-primary,#56c);color:var(--nice-text-primary)}.VectorEditor-module_layerRow__6dibJ{align-items:center;border-radius:var(--nice-radius-sm,4px);cursor:pointer;display:flex;font-size:11px;gap:var(--nice-space-1,4px);padding:var(--nice-space-1,4px) var(--nice-space-1-5,6px)}.VectorEditor-module_layerRow__6dibJ:hover{background:var(--nice-bg-secondary)}.VectorEditor-module_layerRowActive__Dqt0V{background:var(--nice-bg-secondary);outline:1px solid var(--nice-primary,#56c)}.VectorEditor-module_layerRowLocked__ubct0{opacity:.6}.VectorEditor-module_layerRowLocked__ubct0 .VectorEditor-module_layerNameInput__OtX-d{cursor:not-allowed}.VectorEditor-module_layerNameInput__OtX-d{background:transparent;border:none;color:var(--nice-text-primary);flex:1 1 auto;font-size:11px;min-width:0;outline:none}.VectorEditor-module_layerIconBtn__bchqi{background:none;border:none;color:var(--nice-text-secondary);cursor:pointer;font-size:12px;line-height:1;padding:0 var(--nice-space-0-5,2px)}.VectorEditor-module_layerIconBtn__bchqi:hover{color:var(--nice-text-primary)}.VectorEditor-module_panelSection__uteDQ{border-bottom:1px solid var(--nice-border-color);padding:var(--nice-space-1-5,6px) var(--nice-space-2,8px)}.VectorEditor-module_panelTitle__WBUxr{align-items:center;color:var(--nice-text-secondary);display:flex;font-size:10px;justify-content:space-between;letter-spacing:.5px;margin-bottom:var(--nice-space-1,4px);text-transform:uppercase}.VectorEditor-module_panelTitle__WBUxr 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)}.VectorEditor-module_panelTitle__WBUxr button:hover{color:var(--nice-text-muted)}.VectorEditor-module_shapeItem__bu2E2{align-items:center;border-radius:var(--nice-radius-sm,3px);cursor:pointer;display:flex;font-size:11px;gap:var(--nice-space-1-5,6px);padding:var(--nice-space-0-75,3px) var(--nice-space-1,4px)}.VectorEditor-module_shapeItem__bu2E2:hover{background:var(--nice-overlay-light-4,hsla(0,0%,100%,.04))}.VectorEditor-module_shapeItemActive__E2lK7{background:var(--nice-surface)!important;border:1px solid var(--nice-color-primary-hover)}.VectorEditor-module_shapeIcon__M4j6X{flex-shrink:0;font-size:14px;opacity:.7}.VectorEditor-module_shapeName__2QctO{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.VectorEditor-module_propRow__Alc4S{align-items:center;display:flex;gap:var(--nice-space-1-5,6px);margin-bottom:var(--nice-space-1,4px)}.VectorEditor-module_propLabel__J0lxK{color:var(--nice-text-muted);font-size:10px;min-width:40px}.VectorEditor-module_propInput__3my2d{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;padding:var(--nice-space-0-5,2px) var(--nice-space-1,4px)}.VectorEditor-module_propColorSwatch__JL97Z{border:1px solid var(--nice-overlay-light-15,hsla(0,0%,100%,.15));border-radius:var(--nice-radius-sm,3px);cursor:pointer;height:24px;position:relative;width:24px}.VectorEditor-module_propColorSwatch__JL97Z input{cursor:pointer;height:100%;inset:0;opacity:0;position:absolute;width:100%}.VectorEditor-module_statusBar__jMwan{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)}.VectorEditor-module_dialogOverlay__NLiCg{align-items:center;background:var(--nice-overlay-60,rgba(0,0,0,.6));display:flex;inset:0;justify-content:center;position:absolute;z-index:100}.VectorEditor-module_dialog__NDNK2{background:var(--nice-bg-elevated);border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-lg,8px);box-shadow:0 8px 32px var(--nice-overlay-50,rgba(0,0,0,.5));max-width:500px;min-width:300px;padding:var(--nice-space-5,20px)}.VectorEditor-module_dialog__NDNK2 h3{color:var(--nice-text-secondary);font-size:14px;margin:0 0 var(--nice-space-3,12px)}.VectorEditor-module_dialog__NDNK2 label{color:var(--nice-text-muted);display:block;font-size:11px;margin:var(--nice-space-2,8px) 0 var(--nice-space-0-5,2px)}.VectorEditor-module_dialog__NDNK2 input,.VectorEditor-module_dialog__NDNK2 select,.VectorEditor-module_dialog__NDNK2 textarea{background:var(--nice-bg-canvas);border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-sm,4px);color:var(--nice-text-primary);font-size:12px;padding:var(--nice-space-1,4px) var(--nice-space-2,8px);width:100%}.VectorEditor-module_dialog__NDNK2 textarea{font-family:monospace;min-height:120px;resize:vertical}.VectorEditor-module_dialogActions__0Sy4X{display:flex;gap:var(--nice-space-2,8px);justify-content:flex-end;margin-top:var(--nice-space-4,16px)}.VectorEditor-module_dialogActions__0Sy4X button{border:none;border-radius:var(--nice-radius-sm,4px);cursor:pointer;font-size:12px;padding:var(--nice-space-1,4px) var(--nice-space-4,16px)}.VectorEditor-module_btnPrimary__f9AaS{background:var(--nice-color-primary);color:var(--nice-color-white)}.VectorEditor-module_btnPrimary__f9AaS:hover{background:var(--nice-primary,#67d)}.VectorEditor-module_btnSecondary__wDps2{background:var(--nice-bg-secondary);color:var(--nice-text-muted)}.VectorEditor-module_btnSecondary__wDps2:hover{background:var(--nice-bg-tertiary);color:var(--nice-text-primary)}.VectorEditor-module_handleGroup__sMkQj circle{fill:var(--nice-color-primary);stroke:var(--nice-color-white);stroke-width:1;cursor:pointer}.VectorEditor-module_handleGroup__sMkQj circle:hover{fill:var(--nice-primary-hover,var(--nice-primary))}.PhotoEditor-module_wrapper__jrHYj{background:#1a1a1e;border-radius:var(--nice-radius-xl,12px);color:var(--nice-text-on-primary,#eee);font-family:Segoe UI,sans-serif;font-size:13px;height:100%;max-height:85vh;overflow:hidden;width:100%}.PhotoEditor-module_loadingWrap__QUTon{align-items:center;color:var(--nice-text-muted,#aaa);display:flex;justify-content:center;min-height:400px;width:100%}.PhotoEditor-module_loadingSpin__fGXBK{animation:PhotoEditor-module_nicePhotoEditorSpin__QorqZ 1s linear infinite}@keyframes PhotoEditor-module_nicePhotoEditorSpin__QorqZ{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.PhotoEditor-module_toolbar__RY-Ty{align-items:center;background:var(--nice-bg-secondary,#222226);border-bottom:1px solid var(--nice-border-color,#333);display:flex;justify-content:space-between;padding:var(--nice-space-2,8px) var(--nice-space-3-5,14px)}.PhotoEditor-module_toolbarGroup__PXw0-{display:flex;flex:0 0 auto;gap:6.5px}.PhotoEditor-module_toolbarDivider__o3kFV{background:var(--nice-border-color,#444);margin:0 var(--nice-space-1,4px);width:1px}.PhotoEditor-module_toolbarTitle__P1o18{align-items:center;display:flex;flex:1 1 auto;font-size:14px;font-weight:700;justify-content:center;min-width:0;overflow:hidden;padding:0 var(--nice-space-2,8px);text-overflow:ellipsis;white-space:nowrap}.PhotoEditor-module_leftPanel__DnHLU{background:var(--nice-bg-secondary,#222226);border-right:1px solid var(--nice-border-color,#333);display:flex;flex-direction:column;min-width:280px;overflow:hidden;width:280px}.PhotoEditor-module_tabBar__DZ3MG{border-bottom:1px solid var(--nice-border-color,#333);display:flex;flex-wrap:wrap}.PhotoEditor-module_tabButton__BLi97{align-items:center;background:transparent;border:none;border-bottom:2px solid transparent;color:var(--nice-text-secondary,#888);cursor:pointer;display:flex;flex:1 0 auto;flex-direction:column;font-size:10px;font-weight:600;gap:var(--nice-space-px,1px);min-width:34px;padding:var(--nice-space-2,8px) 0;transition:all .15s}.PhotoEditor-module_tabButtonActive__KlQG0{background:var(--nice-bg-secondary,#2a2a30)}.PhotoEditor-module_tabIcon__-Mq19{font-size:14px}.PhotoEditor-module_panelContent__l5i5t{flex:1;overflow-y:auto;padding:var(--nice-space-2-5,10px) var(--nice-space-3,12px)}.PhotoEditor-module_sectionTitle__tMvCm{font-size:12px;font-weight:600;margin-bottom:var(--nice-space-1-5,6px)}.PhotoEditor-module_sectionTitleMb8__PQ-lV{margin-bottom:var(--nice-space-2,8px)}.PhotoEditor-module_sectionInfo__bWxW5{color:var(--nice-text-muted,#aaa);font-size:11px}.PhotoEditor-module_pillRow__DGJUb,.PhotoEditor-module_sectionInfoMb__Hk6V-{margin-bottom:var(--nice-space-2-5,10px)}.PhotoEditor-module_pillRow__DGJUb{display:flex;flex-wrap:wrap;gap:var(--nice-space-1,4px)}.PhotoEditor-module_pillRowMb8__AQrth{margin-bottom:var(--nice-space-2,8px)}.PhotoEditor-module_pillRowGap3__Y46Vu{display:flex;flex-wrap:wrap;gap:var(--nice-space-0-75,3px);margin-bottom:var(--nice-space-2,8px)}.PhotoEditor-module_pill__wTFac{background:transparent;border:1px solid var(--nice-border-color,#444);border-radius:var(--nice-radius-xl,12px);color:var(--nice-text-muted,#aaa);cursor:pointer;font-size:11px;font-weight:600;padding:var(--nice-space-0-75,3px) var(--nice-space-2-5,10px)}.PhotoEditor-module_pillActive__AfdZR{color:var(--nice-text-primary,#fff)}.PhotoEditor-module_pillCrop__Nsisp{border-radius:var(--nice-radius-md,6px);padding:var(--nice-space-1,4px) var(--nice-space-3,12px)}.PhotoEditor-module_pillCropActive__p6csO{color:var(--nice-text-primary,#fff)}.PhotoEditor-module_pillEmoji__I42DJ{border-radius:var(--nice-radius-lg,10px);padding:var(--nice-space-0-5,2px) var(--nice-space-2,8px)}.PhotoEditor-module_pillEmojiActive__0-EM7{color:var(--nice-text-primary,#fff)}.PhotoEditor-module_filterGrid__-29PS{display:grid;gap:var(--nice-space-1-5,6px);grid-template-columns:repeat(3,1fr)}.PhotoEditor-module_emojiGrid__whqqK{display:grid;gap:var(--nice-space-0-5,2px);grid-template-columns:repeat(6,1fr);max-height:260px;overflow-y:auto}.PhotoEditor-module_shapeGrid__TawIy{margin-bottom:var(--nice-space-4,16px)}.PhotoEditor-module_frameGrid__R09dd,.PhotoEditor-module_shapeGrid__TawIy{display:grid;gap:var(--nice-space-1,4px);grid-template-columns:repeat(5,1fr)}.PhotoEditor-module_sliderRow__jsWDQ{align-items:center;display:flex;gap:var(--nice-space-1-5,6px);margin-bottom:var(--nice-space-2,8px)}.PhotoEditor-module_sliderLabel__zOZ49{color:var(--nice-text-muted,#aaa);font-size:11px}.PhotoEditor-module_sliderLabelSelf__EwYKU{align-self:center;margin-right:var(--nice-space-1,4px)}.PhotoEditor-module_sliderValue__qFuTw{font-size:11px;font-weight:600;min-width:28px}.PhotoEditor-module_sliderValueSm__U7FrJ{font-size:10px;min-width:28px}.PhotoEditor-module_adjustColumn__y---T{display:flex;flex-direction:column;gap:var(--nice-space-2,8px)}.PhotoEditor-module_adjustHeader__6s9zV{display:flex;font-size:11px;justify-content:space-between;margin-bottom:var(--nice-space-0-5,2px)}.PhotoEditor-module_adjustIcon__d56rY{text-align:center;width:14px}.PhotoEditor-module_adjustValue__aUUmg{cursor:pointer;font-weight:600;min-width:30px;text-align:right}.PhotoEditor-module_intensitySection__dhe5h{margin-top:var(--nice-space-3,12px);padding:var(--nice-space-2,8px) 0}.PhotoEditor-module_intensityHeader__-KKu6{display:flex;font-size:11px;justify-content:space-between;margin-bottom:var(--nice-space-1,4px)}.PhotoEditor-module_colorInput__xkF1h{border:none;cursor:pointer;height:28px;padding:0;width:28px}.PhotoEditor-module_colorInputLg__W2KrK{border:none;cursor:pointer;height:30px;padding:0;width:32px}.PhotoEditor-module_colorInputDraw__KYcdG{border:none;cursor:pointer;height:28px;padding:0;width:32px}.PhotoEditor-module_overlayToolbar__hfspp{border-bottom:1px solid var(--nice-border-color,#333);display:flex;flex-wrap:wrap;gap:var(--nice-space-1,4px);margin-bottom:var(--nice-space-2,8px);padding:var(--nice-space-1-5,6px) 0}.PhotoEditor-module_overlayToolbarLabel__mc4pU{align-self:center;color:var(--nice-text-muted,#aaa);font-size:11px;margin-right:var(--nice-space-1,4px)}.PhotoEditor-module_overlayToolbarBtn__AdTmZ{font-size:11px;padding:var(--nice-space-0-5,2px) var(--nice-space-1-5,6px)}.PhotoEditor-module_overlaySection__IIl4r{border-top:1px solid var(--nice-border-color,#333);margin-top:var(--nice-space-3,12px);padding-top:var(--nice-space-2,8px)}.PhotoEditor-module_overlaySectionTitle__FRx3e{color:var(--nice-text-muted,#aaa);font-size:11px;font-weight:600;margin-bottom:var(--nice-space-1,4px)}.PhotoEditor-module_overlayItem__DGUCN{align-items:center;background:transparent;border-radius:var(--nice-radius-sm,4px);color:var(--nice-text-secondary,#ccc);cursor:pointer;display:flex;font-size:11px;gap:var(--nice-space-1-5,6px);margin-bottom:var(--nice-space-0-5,2px);padding:var(--nice-space-0-75,3px) var(--nice-space-1-5,6px)}.PhotoEditor-module_overlayIcon__G0pFk{text-align:center;width:18px}.PhotoEditor-module_overlayName__JVh64{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.PhotoEditor-module_overlayDeleteBtn__Ontxv{background:none;border:none;color:var(--nice-danger,#f55);cursor:pointer;font-size:11px;padding:0}.PhotoEditor-module_emojiBtn__jxG9m{background:transparent;border:none;border-radius:var(--nice-radius-md,6px);cursor:pointer;font-size:22px;line-height:1;padding:var(--nice-space-1,4px) 0}.PhotoEditor-module_shapeBtn__xZdSV{font-size:20px}.PhotoEditor-module_frameBtn__coMkZ,.PhotoEditor-module_shapeBtn__xZdSV{background:transparent;border:1px solid var(--nice-border-color,#444);border-radius:var(--nice-radius-md,6px);color:var(--nice-text-secondary,#eee);cursor:pointer;line-height:1;padding:var(--nice-space-1-5,6px) 0}.PhotoEditor-module_frameBtn__coMkZ{font-size:18px}.PhotoEditor-module_removeFrameBtn__oCuua{background:transparent;border:1px solid var(--nice-border-color,#444);border-radius:var(--nice-radius-md,6px);color:var(--nice-danger,#f55);cursor:pointer;font-size:14px;padding:var(--nice-space-1-5,6px) 0}.PhotoEditor-module_textFormatBtn__7Z9RJ{min-width:32px}.PhotoEditor-module_textFormatBtnSm__3ptcG{min-width:28px}.PhotoEditor-module_drawActionBtn__teYz4{flex:1}.PhotoEditor-module_textArea__sBGlB{background:var(--nice-bg-secondary,#2a2a30);border:1px solid var(--nice-border-color,#444);border-radius:var(--nice-radius-md,6px);color:var(--nice-text-secondary,#eee);font-size:13px;margin-bottom:var(--nice-space-2,8px);resize:none}.PhotoEditor-module_textAreaSm__6xZnY{font-size:12px;margin-bottom:0}.PhotoEditor-module_textBtnRow__AcEnd{display:flex;flex-wrap:wrap;gap:var(--nice-space-1,4px);margin-bottom:var(--nice-space-2,8px)}.PhotoEditor-module_textGapRow__Dq2uz{display:flex;gap:var(--nice-space-1,4px);margin-top:var(--nice-space-1-5,6px)}.PhotoEditor-module_editSelectedSection__bgNEh{border-top:1px solid var(--nice-border-color,#333);margin-top:var(--nice-space-3,12px);padding-top:var(--nice-space-2,8px)}.PhotoEditor-module_editSelectedLabel__u2rmS{color:var(--nice-text-muted,#aaa);font-size:11px;margin-bottom:var(--nice-space-1,4px)}.PhotoEditor-module_shapeColorRow__ip5--{display:flex;flex-wrap:wrap;gap:var(--nice-space-1,4px);margin-bottom:var(--nice-space-2,8px)}.PhotoEditor-module_shapeColorLabel__nVcbU{align-self:center;color:var(--nice-text-muted,#aaa);font-size:11px;margin-right:var(--nice-space-0-5,2px)}.PhotoEditor-module_shapeColorLabelMl__KiM2d{margin-left:var(--nice-space-1,4px)}.PhotoEditor-module_shapeFillToggle__BXJ8C{font-size:10px;padding:var(--nice-space-0-5,2px) var(--nice-space-1-5,6px)}.PhotoEditor-module_frameColorRow__KRAHz{display:flex;gap:var(--nice-space-1,4px);margin-bottom:var(--nice-space-2,8px)}.PhotoEditor-module_frameThicknessWrap__lXCoC{align-items:center;display:flex;flex:1;gap:var(--nice-space-1,4px)}.PhotoEditor-module_frameThicknessValue__SAEuc{font-size:10px}.PhotoEditor-module_drawPreview__WPbiv{display:flex;justify-content:center;margin-bottom:var(--nice-space-3,12px)}.PhotoEditor-module_drawActionRow__CUSWS{display:flex;gap:var(--nice-space-1,4px)}.PhotoEditor-module_quickColorRow__DTy5E{align-items:center;display:flex;gap:var(--nice-space-1-5,6px);margin-bottom:var(--nice-space-2,8px)}.PhotoEditor-module_quickColorSwatch__ZjgoA{border:1px solid var(--nice-border-color,#555);border-radius:var(--nice-radius-sm,3px);cursor:pointer;height:18px;width:18px}.PhotoEditor-module_transformRow__LKRjS{display:flex;gap:var(--nice-space-1-5,6px);margin-bottom:var(--nice-space-4,16px)}.PhotoEditor-module_transformZoomRow__h2NlB{align-items:center;display:flex;gap:var(--nice-space-2,8px)}.PhotoEditor-module_transformZoomValue__LXa51{font-size:11px;font-weight:600;min-width:40px}.PhotoEditor-module_transformInfo__zXP9l{background:var(--nice-bg-secondary,#2a2a30);border-radius:var(--nice-radius-lg,8px);color:var(--nice-text-muted,#aaa);font-size:11px;margin-top:var(--nice-space-4,16px);padding:var(--nice-space-2-5,10px)}.PhotoEditor-module_canvasViewport__OMBIL{align-items:center;background:#111115;display:flex;flex:1;justify-content:center;overflow:auto;padding:var(--nice-space-5,20px);position:relative}.PhotoEditor-module_zoomWrap__JjfiJ{max-height:100%;max-width:100%;position:relative;transform-origin:center center;transition:transform .15s ease}.PhotoEditor-module_compareWrap__-J5ku{cursor:ew-resize;display:inline-block;position:relative}.PhotoEditor-module_canvasOriginal__Apf91{max-width:100%}.PhotoEditor-module_canvasEdited__Eroz7,.PhotoEditor-module_canvasOriginal__Apf91{display:block;max-height:60vh;object-fit:contain}.PhotoEditor-module_compareClip__5qG2I{bottom:0;left:0;overflow:hidden;position:absolute;top:0}.PhotoEditor-module_compareSlider__OIIIK{bottom:0;position:absolute;top:0;transform:translateX(-50%);width:3px}.PhotoEditor-module_compareSliderKnob__VohI9{align-items:center;border-radius:var(--nice-radius-full,50%);box-shadow:0 2px 8px var(--nice-overlay-40,rgba(0,0,0,.4));display:flex;height:28px;justify-content:center;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);width:28px}.PhotoEditor-module_compareSliderIcon__pXcct{color:var(--nice-text-primary,#fff);font-size:12px}.PhotoEditor-module_compareLabelOriginal__GaBoj{background:var(--nice-overlay-60,rgba(0,0,0,.6));color:var(--nice-text-on-primary,#fff);left:8px}.PhotoEditor-module_compareLabelEdited__Fr836,.PhotoEditor-module_compareLabelOriginal__GaBoj{border-radius:var(--nice-radius-sm,4px);font-size:11px;font-weight:600;padding:var(--nice-space-0-5,2px) var(--nice-space-2,8px);position:absolute;top:8px}.PhotoEditor-module_compareLabelEdited__Fr836{color:var(--nice-text-primary,#fff);right:8px}.PhotoEditor-module_regularWrap__8umPV{display:inline-block;position:relative}.PhotoEditor-module_canvasRegular__wxapL{border-radius:var(--nice-radius-md,6px);box-shadow:0 4px 20px var(--nice-overlay-40,rgba(0,0,0,.4));display:block;max-height:60vh;max-width:100%;object-fit:contain}.PhotoEditor-module_cropOverlay__MJk1Y{inset:0;pointer-events:none;position:absolute;z-index:2}.PhotoEditor-module_cropDarkBg__m3axV{background:var(--nice-overlay-55,rgba(0,0,0,.55));inset:0;position:absolute}.PhotoEditor-module_cropGridContainer__NfHdT{inset:0;position:absolute}.PhotoEditor-module_cropSizeLabel__fV2mF{background:var(--nice-overlay-75,rgba(0,0,0,.75));border-radius:var(--nice-radius-sm,3px);bottom:-24px;color:var(--nice-text-on-primary,#fff);font-size:10px;left:50%;padding:var(--nice-space-0-5,2px) var(--nice-space-2,8px);position:absolute;transform:translateX(-50%);white-space:nowrap}.PhotoEditor-module_cropInfo__Z1SCE{color:var(--nice-text-muted,#aaa);font-size:11px;margin-bottom:var(--nice-space-2-5,10px)}.PhotoEditor-module_cropAspectLabel__dieL-{font-size:12px;font-weight:600;margin-bottom:var(--nice-space-1-5,6px)}.PhotoEditor-module_cropAspectRow__scRj3{display:flex;flex-wrap:wrap;gap:var(--nice-space-1,4px)}.PhotoEditor-module_accentBtn__tgaEx{color:var(--nice-text-primary,#fff);font-weight:600;width:100%}.GameAsset2dEditor-module_root__WVJBM{background:var(--nice-bg,#1a1a2e);color:var(--nice-text-secondary,#e0e0e0);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;font-size:13px;height:100%;min-height:600px;user-select:none}.GameAsset2dEditor-module_menuBar__WaEaU{align-items:center;background:var(--nice-bg,#16213e);border-bottom:1px solid var(--nice-border-color,#0f3460);display:flex;gap:var(--nice-space-2,8px);padding:var(--nice-space-1-5,6px) var(--nice-space-3,12px)}.GameAsset2dEditor-module_menuBar__WaEaU h3{color:var(--nice-warning,#ffd369);font-size:14px;font-weight:600;margin:0}.GameAsset2dEditor-module_menuGroup__EOreB{display:flex;gap:var(--nice-space-0-5,2px)}.GameAsset2dEditor-module_menuBtn__JYWXn{align-items:center;background:transparent;border:none;border-radius:var(--nice-radius-sm,4px);color:var(--nice-text-muted,#b0b0b0);cursor:pointer;display:flex;font-size:12px;gap:var(--nice-space-1,4px);padding:var(--nice-space-1,4px) var(--nice-space-2,8px);transition:all .15s}.GameAsset2dEditor-module_menuBtn__JYWXn:hover{background:var(--nice-overlay-light-10,hsla(0,0%,100%,.1));color:var(--nice-text-on-primary,#fff)}.GameAsset2dEditor-module_menuBtn__JYWXn:disabled{cursor:not-allowed;opacity:.4}.GameAsset2dEditor-module_spacer__fPVeq{flex:1}.GameAsset2dEditor-module_modeTabs__iKh7C{background:var(--nice-bg,#1f2940);border-bottom:1px solid var(--nice-border-color,#0f3460);display:flex;gap:var(--nice-space-0-5,2px);padding:var(--nice-space-1,4px) var(--nice-space-3,12px)}.GameAsset2dEditor-module_modeTab__C12zt{background:transparent;border:none;border-radius:var(--nice-radius-sm,4px) var(--nice-radius-sm,4px) 0 0;color:var(--nice-text-secondary,#8892a8);cursor:pointer;font-size:12px;font-weight:500;padding:var(--nice-space-1-5,6px) var(--nice-space-4,16px);transition:all .15s}.GameAsset2dEditor-module_modeTab__C12zt:hover{background:var(--nice-overlay-light-5,hsla(0,0%,100%,.05));color:var(--nice-text-on-primary,#c0c8d8)}.GameAsset2dEditor-module_modeTab__C12zt.GameAsset2dEditor-module_active__DUroI{background:var(--nice-bg,#1a1a2e);color:var(--nice-warning,#ffd369)}.GameAsset2dEditor-module_mainArea__jwDUa{display:flex;flex:1;overflow:hidden}.GameAsset2dEditor-module_leftPanel__xxAg5{background:var(--nice-bg,#16213e);border-right:1px solid var(--nice-border-color,#0f3460);display:flex;flex-direction:column;overflow:hidden;width:220px}.GameAsset2dEditor-module_centerArea__xr-Hn{display:flex;flex:1;flex-direction:column;overflow:hidden}.GameAsset2dEditor-module_rightPanel__YoNuc{background:var(--nice-bg,#16213e);border-left:1px solid var(--nice-border-color,#0f3460);display:flex;flex-direction:column;overflow:hidden;width:260px}.GameAsset2dEditor-module_toolbar__hEC9S{align-items:center;background:var(--nice-bg,#1f2940);border-bottom:1px solid var(--nice-border-color,#0f3460);display:flex;gap:var(--nice-space-2,8px);padding:var(--nice-space-1-5,6px) var(--nice-space-3,12px)}.GameAsset2dEditor-module_toolGroup__Zbn47{background:var(--nice-overlay-20,rgba(0,0,0,.2));border-radius:var(--nice-radius-sm,4px);display:flex;gap:var(--nice-space-0-5,2px);padding:var(--nice-space-0-5,2px)}.GameAsset2dEditor-module_toolBtn__5U7Rw{align-items:center;background:transparent;border:none;border-radius:var(--nice-radius-sm,3px);color:var(--nice-text-secondary,#8892a8);cursor:pointer;display:flex;font-size:14px;height:28px;justify-content:center;transition:all .15s;width:28px}.GameAsset2dEditor-module_toolBtn__5U7Rw:hover{background:var(--nice-overlay-light-10,hsla(0,0%,100%,.1));color:var(--nice-text-on-primary,#fff)}.GameAsset2dEditor-module_toolBtn__5U7Rw.GameAsset2dEditor-module_active__DUroI{background:var(--nice-color-primary,#0f3460);color:var(--nice-text-on-primary,#ffd369)}.GameAsset2dEditor-module_toolBtn__5U7Rw:disabled{cursor:not-allowed;opacity:.3}.GameAsset2dEditor-module_viewport__vEKEv{background:var(--nice-bg,#0a0a14);flex:1;overflow:hidden;position:relative}.GameAsset2dEditor-module_viewportCanvas__FJ5qA{image-rendering:pixelated;image-rendering:crisp-edges;left:50%;position:absolute;top:50%}.GameAsset2dEditor-module_gridOverlay__K8B97{bottom:0;left:0;pointer-events:none;position:absolute;right:0;top:0}.GameAsset2dEditor-module_panelHeader__xm2As{align-items:center;background:var(--nice-bg-tertiary,#0f3460);color:var(--nice-text-secondary,#8892a8);display:flex;font-size:11px;font-weight:600;justify-content:space-between;letter-spacing:.5px;padding:var(--nice-space-2,8px) var(--nice-space-3,12px);text-transform:uppercase}.GameAsset2dEditor-module_panelContent__dvOGq{flex:1;overflow-y:auto;padding:var(--nice-space-2,8px)}.GameAsset2dEditor-module_panelSection__RQQDr{margin-bottom:var(--nice-space-4,16px)}.GameAsset2dEditor-module_panelLabel__Ks-Wa{color:var(--nice-text-secondary,#8892a8);display:block;font-size:11px;letter-spacing:.5px;margin-bottom:var(--nice-space-1-5,6px);text-transform:uppercase}.GameAsset2dEditor-module_panelInput__cxNiG{background:var(--nice-bg,#0a0a14);border:1px solid var(--nice-border-color,#2a3a5e);border-radius:var(--nice-radius-sm,4px);color:var(--nice-text-secondary,#e0e0e0);font-size:12px;padding:var(--nice-space-1-5,6px) var(--nice-space-2,8px);width:100%}.GameAsset2dEditor-module_panelInput__cxNiG:focus{border-color:var(--nice-warning,#ffd369);outline:none}.GameAsset2dEditor-module_tilePalette__OpzmV{display:grid;gap:var(--nice-space-1,4px);grid-template-columns:repeat(auto-fill,minmax(40px,1fr));padding:var(--nice-space-2,8px)}.GameAsset2dEditor-module_tileItem__uWNS9{aspect-ratio:1;background:var(--nice-bg,#0a0a14);border:2px solid transparent;border-radius:var(--nice-radius-sm,4px);cursor:pointer;overflow:hidden;transition:all .15s}.GameAsset2dEditor-module_tileItem__uWNS9:hover{border-color:var(--nice-border-color,#4a5a7e)}.GameAsset2dEditor-module_tileItem__uWNS9.GameAsset2dEditor-module_selected__216IN{border-color:var(--nice-warning,#ffd369)}.GameAsset2dEditor-module_tileItem__uWNS9 img{height:100%;image-rendering:pixelated;object-fit:contain;width:100%}.GameAsset2dEditor-module_layersList__anFaG{display:flex;flex-direction:column;gap:var(--nice-space-0-5,2px)}.GameAsset2dEditor-module_layerItem__XSGlu{align-items:center;background:var(--nice-bg,#1f2940);border-radius:var(--nice-radius-sm,4px);cursor:pointer;display:flex;gap:var(--nice-space-2,8px);padding:var(--nice-space-1-5,6px) var(--nice-space-2,8px);transition:all .15s}.GameAsset2dEditor-module_layerItem__XSGlu:hover{background:var(--nice-hover-bg,#2a3a5e)}.GameAsset2dEditor-module_layerItem__XSGlu.GameAsset2dEditor-module_selected__216IN{background:var(--nice-selected-bg,#0f3460);border-left:3px solid var(--nice-warning,#ffd369)}.GameAsset2dEditor-module_layerVisibility__RpHjV{align-items:center;background:transparent;border:none;border-radius:var(--nice-radius-sm,3px);color:var(--nice-text-secondary,#8892a8);cursor:pointer;display:flex;height:20px;justify-content:center;width:20px}.GameAsset2dEditor-module_layerVisibility__RpHjV:hover{background:var(--nice-overlay-light-10,hsla(0,0%,100%,.1))}.GameAsset2dEditor-module_layerVisibility__RpHjV.GameAsset2dEditor-module_hidden__mukOG{opacity:.4}.GameAsset2dEditor-module_layerName__WBxq5{color:var(--nice-text-secondary,#c0c8d8);flex:1;font-size:12px}.GameAsset2dEditor-module_layerOpacity__FpzL-{color:var(--nice-text-secondary,#8892a8);font-size:10px;text-align:right;width:40px}.GameAsset2dEditor-module_framesList__vg1oO{display:grid;gap:var(--nice-space-2,8px);grid-template-columns:repeat(auto-fill,minmax(60px,1fr));padding:var(--nice-space-2,8px)}.GameAsset2dEditor-module_frameItem__fkEfb{aspect-ratio:1;background:var(--nice-bg,#0a0a14);border:2px solid transparent;border-radius:var(--nice-radius-sm,4px);cursor:pointer;overflow:hidden;position:relative;transition:all .15s}.GameAsset2dEditor-module_frameItem__fkEfb:hover{border-color:var(--nice-border-color,#4a5a7e)}.GameAsset2dEditor-module_frameItem__fkEfb.GameAsset2dEditor-module_selected__216IN{border-color:var(--nice-warning,#ffd369)}.GameAsset2dEditor-module_frameItem__fkEfb canvas{height:100%;image-rendering:pixelated;object-fit:contain;width:100%}.GameAsset2dEditor-module_frameLabel__5IGW8{background:var(--nice-overlay-70,rgba(0,0,0,.7));bottom:0;color:var(--nice-text-muted,#b0b0b0);font-size:9px;left:0;padding:var(--nice-space-0-5,2px) var(--nice-space-1,4px);position:absolute;right:0;text-align:center}.GameAsset2dEditor-module_timeline__dPJk6{background:var(--nice-bg,#16213e);border-top:1px solid var(--nice-border-color,#0f3460);padding:var(--nice-space-2,8px)}.GameAsset2dEditor-module_timelineTrack__mr20w{background:var(--nice-bg,#0a0a14);border-radius:var(--nice-radius-sm,4px);display:flex;gap:var(--nice-space-1,4px);overflow-x:auto;padding:var(--nice-space-1,4px)}.GameAsset2dEditor-module_timelineFrame__AQyGe{background:var(--nice-bg,#1f2940);border:2px solid transparent;border-radius:var(--nice-radius-sm,4px);cursor:pointer;flex-shrink:0;height:48px;overflow:hidden;width:48px}.GameAsset2dEditor-module_timelineFrame__AQyGe:hover{border-color:var(--nice-border-color,#4a5a7e)}.GameAsset2dEditor-module_timelineFrame__AQyGe.GameAsset2dEditor-module_current__3sAfL{border-color:var(--nice-warning,#ffd369)}.GameAsset2dEditor-module_stateGraph__qAWlU{background:var(--nice-bg,#0a0a14);flex:1;overflow:hidden;position:relative}.GameAsset2dEditor-module_stateNode__W9Z-g{background:var(--nice-bg,#1f2940);border:2px solid var(--nice-border-color,#2a3a5e);border-radius:var(--nice-radius-lg,8px);cursor:move;min-width:120px;padding:var(--nice-space-2,8px) var(--nice-space-3,12px);position:absolute;transition:border-color .15s}.GameAsset2dEditor-module_stateNode__W9Z-g:hover{border-color:var(--nice-border-color,#4a5a7e)}.GameAsset2dEditor-module_stateNode__W9Z-g.GameAsset2dEditor-module_selected__216IN{border-color:var(--nice-warning,#ffd369)}.GameAsset2dEditor-module_stateNode__W9Z-g.GameAsset2dEditor-module_entry__cmA9n{border-color:var(--nice-success-light,#4ade80)}.GameAsset2dEditor-module_stateNodeName__TK5vs{color:var(--nice-text-secondary,#e0e0e0);font-size:12px;font-weight:500;text-align:center}.GameAsset2dEditor-module_stateNodeAnim__VGwnV{color:var(--nice-text-secondary,#8892a8);font-size:10px;margin-top:var(--nice-space-1,4px);text-align:center}.GameAsset2dEditor-module_transition__FBbno{stroke:var(--nice-text-secondary,#4a5a7e);stroke-width:2;fill:none;marker-end:url(#arrowhead)}.GameAsset2dEditor-module_transition__FBbno:hover{stroke:var(--nice-warning,#ffd369)}.GameAsset2dEditor-module_effectsList__vHq4I{display:flex;flex-direction:column;gap:var(--nice-space-2,8px)}.GameAsset2dEditor-module_effectItem__6-1li{background:var(--nice-bg,#1f2940);border-radius:var(--nice-radius-md,6px);overflow:hidden}.GameAsset2dEditor-module_effectHeader__cgVN-{align-items:center;cursor:pointer;display:flex;gap:var(--nice-space-2,8px);padding:var(--nice-space-2,8px)}.GameAsset2dEditor-module_effectToggle__lKE36{background:var(--nice-bg,#0a0a14);border:1px solid var(--nice-border-color,#2a3a5e);border-radius:var(--nice-radius-sm,3px);cursor:pointer;height:18px;width:18px}.GameAsset2dEditor-module_effectToggle__lKE36.GameAsset2dEditor-module_enabled__wgDzp{background:var(--nice-warning,#ffd369);border-color:var(--nice-warning,#ffd369)}.GameAsset2dEditor-module_effectName__NQCWj{color:var(--nice-text-secondary,#c0c8d8);flex:1;font-size:12px}.GameAsset2dEditor-module_effectRemove__TSSdI{align-items:center;background:transparent;border:none;border-radius:var(--nice-radius-sm,3px);color:var(--nice-text-secondary,#8892a8);cursor:pointer;display:flex;height:20px;justify-content:center;width:20px}.GameAsset2dEditor-module_effectRemove__TSSdI:hover{background:var(--nice-danger,#ef4444);color:var(--nice-text-on-primary,#fff)}.GameAsset2dEditor-module_effectParams__UqTBd{background:var(--nice-overlay-20,rgba(0,0,0,.2));padding:var(--nice-space-2,8px)}.GameAsset2dEditor-module_effectParam__hEsVY{align-items:center;display:flex;gap:var(--nice-space-2,8px);margin-bottom:var(--nice-space-2,8px)}.GameAsset2dEditor-module_effectParam__hEsVY:last-child{margin-bottom:0}.GameAsset2dEditor-module_effectParamLabel__u0Qoc{color:var(--nice-text-secondary,#8892a8);flex:0 0 80px;font-size:11px}.GameAsset2dEditor-module_effectParamInput__aqxdv{background:var(--nice-bg,#0a0a14);border:1px solid var(--nice-border-color,#2a3a5e);border-radius:var(--nice-radius-sm,3px);color:var(--nice-text-secondary,#e0e0e0);flex:1;font-size:11px;height:24px;padding:0 var(--nice-space-2,8px)}.GameAsset2dEditor-module_statusBar__eOrNe{align-items:center;background:var(--nice-bg-tertiary,#0f3460);color:var(--nice-text-secondary,#8892a8);display:flex;font-size:11px;gap:var(--nice-space-4,16px);padding:var(--nice-space-1,4px) var(--nice-space-3,12px)}.GameAsset2dEditor-module_statusItem__kKLHF,.GameAsset2dEditor-module_zoomControl__4YD9G{align-items:center;display:flex;gap:var(--nice-space-1,4px)}.GameAsset2dEditor-module_zoomControl__4YD9G{margin-left:auto}.GameAsset2dEditor-module_zoomBtn__hxYik{align-items:center;background:transparent;border:none;border-radius:var(--nice-radius-sm,3px);color:var(--nice-text-secondary,#8892a8);cursor:pointer;display:flex;height:20px;justify-content:center;width:20px}.GameAsset2dEditor-module_zoomBtn__hxYik:hover{background:var(--nice-overlay-light-10,hsla(0,0%,100%,.1));color:var(--nice-text-on-primary,#fff)}.GameAsset2dEditor-module_dialogOverlay__dZYwO{align-items:center;background:var(--nice-overlay-60,rgba(0,0,0,.6));bottom:0;display:flex;justify-content:center;left:0;position:fixed;right:0;top:0;z-index:1000}.GameAsset2dEditor-module_dialog__mfLFL{background:var(--nice-bg,#16213e);border-radius:var(--nice-radius-lg,8px);box-shadow:0 8px 32px var(--nice-overlay-40,rgba(0,0,0,.4));max-width:500px;min-width:300px;padding:var(--nice-space-6,24px)}.GameAsset2dEditor-module_dialog__mfLFL h3{color:var(--nice-warning,#ffd369);font-size:16px;margin:0 0 var(--nice-space-4,16px)}.GameAsset2dEditor-module_dialogActions__vhDXe{display:flex;gap:var(--nice-space-2,8px);justify-content:flex-end;margin-top:var(--nice-space-5,20px)}.GameAsset2dEditor-module_btnPrimary__Gzc25{background:var(--nice-warning,#ffd369);border:none;border-radius:var(--nice-radius-sm,4px);color:var(--nice-text-on-primary,#1a1a2e);cursor:pointer;font-size:12px;font-weight:600;padding:var(--nice-space-2,8px) var(--nice-space-4,16px);transition:all .15s}.GameAsset2dEditor-module_btnPrimary__Gzc25:hover{background:#ffe599}.GameAsset2dEditor-module_btnSecondary__G5nK5{background:transparent;border:1px solid var(--nice-border-color,#4a5a7e);border-radius:var(--nice-radius-sm,4px);color:var(--nice-text-secondary,#c0c8d8);cursor:pointer;font-size:12px;padding:var(--nice-space-2,8px) var(--nice-space-4,16px);transition:all .15s}.GameAsset2dEditor-module_btnSecondary__G5nK5:hover{background:var(--nice-overlay-light-5,hsla(0,0%,100%,.05));border-color:#6a7a9e}.GameAsset2dEditor-module_panelContent__dvOGq::-webkit-scrollbar{width:6px}.GameAsset2dEditor-module_panelContent__dvOGq::-webkit-scrollbar-track{background:var(--nice-bg,#0a0a14)}.GameAsset2dEditor-module_panelContent__dvOGq::-webkit-scrollbar-thumb{background:var(--nice-border-color,#2a3a5e);border-radius:var(--nice-radius-sm,3px)}.GameAsset2dEditor-module_panelContent__dvOGq::-webkit-scrollbar-thumb:hover{background:var(--nice-text-secondary,#4a5a7e)}.GameAsset2dEditor-module_dropZone__Z7sYz{border:2px dashed var(--nice-border-color,#4a5a7e);border-radius:var(--nice-radius-lg,8px);color:var(--nice-text-secondary,#8892a8);cursor:pointer;padding:var(--nice-space-6,24px);text-align:center;transition:all .15s}.GameAsset2dEditor-module_dropZone__Z7sYz:hover{border-color:var(--nice-warning,#ffd369);color:var(--nice-text-secondary,#c0c8d8)}.GameAsset2dEditor-module_dropZone__Z7sYz.GameAsset2dEditor-module_active__DUroI{background:rgba(255,211,105,.1);border-color:var(--nice-warning,#ffd369)}.GameAsset2dEditor-module_emptyState__3wryk{align-items:center;color:var(--nice-text-secondary,#8892a8);display:flex;flex-direction:column;justify-content:center;padding:var(--nice-space-8,32px);text-align:center}.GameAsset2dEditor-module_emptyState__3wryk svg{height:48px;margin-bottom:var(--nice-space-3,12px);opacity:.5;width:48px}.GameAsset2dEditor-module_emptyStateText__Q5V1a{font-size:12px;margin-bottom:var(--nice-space-3,12px)}
1
+ .PixelEditor-module_root__3gidG{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}.PixelEditor-module_menuBar__8JFld{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)}.PixelEditor-module_menuBtn__w-GQC{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)}.PixelEditor-module_menuBtn__w-GQC:hover{background:var(--nice-bg-secondary);color:var(--nice-color-white)}.PixelEditor-module_menuSep__pNZsR{background:var(--nice-bg-secondary);height:16px;margin:0 var(--nice-space-1,4px);width:1px}.PixelEditor-module_menuBar__8JFld .nice-menu__btn{color:var(--nice-text-secondary);font-size:11px}.PixelEditor-module_menuBar__8JFld .nice-menu__btn:hover{background:var(--nice-bg-secondary);color:var(--nice-color-white)}.PixelEditor-module_toolbar__paCGq{background:var(--nice-bg-elevated);border-right:1px solid var(--nice-border-color);display:flex;flex-direction:column;flex-shrink:0;gap:var(--nice-space-0-5,2px);overflow-y:auto;padding:var(--nice-space-1,4px) var(--nice-space-0-5,2px);width:38px}.PixelEditor-module_toolBtn__wD1Kj{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}.PixelEditor-module_toolBtn__wD1Kj:hover{background:var(--nice-bg-secondary);color:var(--nice-text-secondary)}.PixelEditor-module_toolBtnActive__R51U0{border-color:var(--nice-color-white,#fff)!important;box-shadow:inset 2px 0 0 0 var(--nice-color-white,#fff),0 0 0 1px var(--nice-color-primary,#4f8cff)}.PixelEditor-module_toolBtnActive__R51U0,.PixelEditor-module_toolBtnActive__R51U0:hover{background:var(--nice-color-primary,#4f8cff)!important;color:var(--nice-color-white,#fff)!important}.PixelEditor-module_mainArea__Z0x6l{display:flex;flex:1;min-height:0}.PixelEditor-module_canvasContainer__8z2AY{background:var(--nice-bg-inset);cursor:crosshair;flex:1;height:100%;min-height:0;overflow:hidden;position:relative}.PixelEditor-module_canvasContainer__8z2AY canvas{image-rendering:pixelated;position:absolute}.PixelEditor-module_rightPanel__ZjrCh{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:220px}.PixelEditor-module_panelSection__3l225{border-bottom:1px solid var(--nice-border-color)}.PixelEditor-module_rightPanel__ZjrCh .nice-collapse__trigger{align-items:center;background:none;border:none;color:var(--nice-text-secondary);cursor:pointer;display:flex;font-size:10px;gap:var(--nice-space-1-5,6px);letter-spacing:.5px;padding:var(--nice-space-1-5,6px) var(--nice-space-2,8px);text-align:left;text-transform:uppercase;width:100%}.PixelEditor-module_rightPanel__ZjrCh .nice-collapse__trigger:hover{color:var(--nice-text-secondary)}.PixelEditor-module_rightPanel__ZjrCh .nice-collapse__panel{padding:0 var(--nice-space-2,8px) var(--nice-space-1-5,6px)}.PixelEditor-module_collapseChevron__Yuvz6{display:inline-flex;transition:transform .15s ease}.nice-collapse--expanded .PixelEditor-module_collapseChevron__Yuvz6{transform:rotate(90deg)}.PixelEditor-module_layerActions__pZH1f{display:flex;flex-wrap:wrap;gap:var(--nice-space-0-5,2px);margin-bottom:var(--nice-space-1,4px)}.PixelEditor-module_panelTitle__vYyeO{align-items:center;color:var(--nice-text-secondary);display:flex;font-size:10px;justify-content:space-between;letter-spacing:.5px;margin-bottom:var(--nice-space-1,4px);text-transform:uppercase}.PixelEditor-module_panelTitle__vYyeO 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)}.PixelEditor-module_panelTitle__vYyeO button:hover{color:var(--nice-text-muted)}.PixelEditor-module_layerItem__J-gtn{align-items:center;border-radius:var(--nice-radius-sm,3px);cursor:pointer;display:flex;font-size:11px;gap:var(--nice-space-1,4px);padding:var(--nice-space-0-75,3px) var(--nice-space-1,4px)}.PixelEditor-module_layerItem__J-gtn:hover{background:var(--nice-overlay-light-4,hsla(0,0%,100%,.04))}.PixelEditor-module_layerItemActive__yPt29{background:var(--nice-surface)!important;border:1px solid var(--nice-color-primary-hover)}.PixelEditor-module_layerVis__Uj7n2{align-items:center;cursor:pointer;display:flex;flex-shrink:0;font-size:10px;height:16px;justify-content:center;opacity:.6;width:16px}.PixelEditor-module_layerVis__Uj7n2:hover{opacity:1}.PixelEditor-module_layerName__HovwJ{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.PixelEditor-module_layerOpacity__qmWvu{color:var(--nice-text-muted);font-size:10px;text-align:right;width:36px}.PixelEditor-module_paletteGrid__knY-n{display:grid;gap:var(--nice-space-0-5,2px);grid-template-columns:repeat(8,1fr)}.PixelEditor-module_paletteSwatch__MUbha{aspect-ratio:1;border:1px solid var(--nice-overlay-light-8,hsla(0,0%,100%,.08));border-radius:var(--nice-radius-sm,2px);cursor:pointer;transition:transform .1s}.PixelEditor-module_paletteSwatch__MUbha:hover{transform:scale(1.15);z-index:1}.PixelEditor-module_paletteSwatchActive__wDR4T{border-color:var(--nice-color-white)!important;box-shadow:0 0 0 1px var(--nice-color-primary)}.PixelEditor-module_colorPickers__sQlBN{align-items:center;display:flex;gap:var(--nice-space-1-5,6px);margin-top:var(--nice-space-1-5,6px)}.PixelEditor-module_colorSample__GN7Rd{border:2px solid var(--nice-overlay-light-20,hsla(0,0%,100%,.2));border-radius:var(--nice-radius-sm,4px);height:28px;width:28px}.PixelEditor-module_bottomPanel__rviLF{background:var(--nice-bg-canvas);border-top:1px solid var(--nice-border-color);display:flex;flex-direction:column;flex-shrink:0;height:80px}.PixelEditor-module_timelineControls__Laroq{align-items:center;border-bottom:1px solid var(--nice-bg,#224);display:flex;font-size:11px;gap:var(--nice-space-1-5,6px);padding:var(--nice-space-0-5,2px) var(--nice-space-2,8px)}.PixelEditor-module_timelineControls__Laroq button{background:var(--nice-bg-secondary);border:none;border-radius:var(--nice-radius-sm,3px);color:var(--nice-text-muted);cursor:pointer;font-size:11px;padding:var(--nice-space-0-5,2px) var(--nice-space-2,8px)}.PixelEditor-module_timelineControls__Laroq button:hover{background:var(--nice-bg-tertiary);color:var(--nice-color-white)}.PixelEditor-module_timelineControls__Laroq label{color:var(--nice-text-muted)}.PixelEditor-module_timelineControls__Laroq input[type=number]{background:var(--nice-bg-canvas);border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-sm,3px);color:var(--nice-text-primary);font-size:11px;padding:var(--nice-space-px,1px) var(--nice-space-1,4px);text-align:center;width:40px}.PixelEditor-module_timelineControls__Laroq input[type=checkbox]{accent-color:var(--nice-color-primary)}.PixelEditor-module_timelineFrames__dw06F{align-items:stretch;display:flex;flex:1;gap:var(--nice-space-0-5,2px);overflow-x:auto;padding:var(--nice-space-1,4px) var(--nice-space-2,8px)}.PixelEditor-module_frameThumb__2E9mG{align-items:center;background:var(--nice-bg-primary);border:2px solid transparent;border-radius:var(--nice-radius-sm,4px);cursor:pointer;display:flex;flex-direction:column;justify-content:center;min-width:44px;overflow:hidden;position:relative;width:44px}.PixelEditor-module_frameThumb__2E9mG canvas{height:36px;image-rendering:pixelated;object-fit:contain;width:36px}.PixelEditor-module_frameThumb__2E9mG:hover{border-color:var(--nice-border-color)}.PixelEditor-module_frameThumbActive__Z0eK4{background:var(--nice-surface);border-color:var(--nice-color-primary)!important}.PixelEditor-module_frameNum__PoGQC{bottom:1px;color:var(--nice-text-muted);font-size:8px;position:absolute;right:3px}.PixelEditor-module_statusBar__QnphD{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)}.PixelEditor-module_dialogOverlay__IgyFy{align-items:center;background:var(--nice-overlay-60,rgba(0,0,0,.6));display:flex;inset:0;justify-content:center;position:absolute;z-index:100}.PixelEditor-module_dialog__OnkAG{background:var(--nice-bg-elevated);border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-lg,8px);box-shadow:0 8px 32px var(--nice-overlay-50,rgba(0,0,0,.5));min-width:300px;padding:var(--nice-space-5,20px)}.PixelEditor-module_dialog__OnkAG h3{color:var(--nice-text-secondary);font-size:14px;margin:0 0 var(--nice-space-3,12px)}.PixelEditor-module_dialog__OnkAG label{color:var(--nice-text-muted);display:block;font-size:11px;margin:var(--nice-space-2,8px) 0 var(--nice-space-0-5,2px)}.PixelEditor-module_dialog__OnkAG input,.PixelEditor-module_dialog__OnkAG select{background:var(--nice-bg-canvas);border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-sm,4px);color:var(--nice-text-primary);font-size:12px;padding:var(--nice-space-1,4px) var(--nice-space-2,8px);width:100%}.PixelEditor-module_dialogActions__fOa7a{display:flex;gap:var(--nice-space-2,8px);justify-content:flex-end;margin-top:var(--nice-space-4,16px)}.PixelEditor-module_dialogActions__fOa7a button{border:none;border-radius:var(--nice-radius-sm,4px);cursor:pointer;font-size:12px;padding:var(--nice-space-1,4px) var(--nice-space-4,16px)}.PixelEditor-module_btnPrimary__FYlTy{background:var(--nice-color-primary);color:var(--nice-color-white)}.PixelEditor-module_btnPrimary__FYlTy:hover{background:var(--nice-primary,#67d)}.PixelEditor-module_btnSecondary__qLfyJ{background:var(--nice-bg-secondary);color:var(--nice-text-muted)}.PixelEditor-module_btnSecondary__qLfyJ:hover{background:var(--nice-bg-tertiary);color:var(--nice-text-primary)}.PixelEditor-module_brushSlider__UxQ38{align-items:center;border-bottom:1px solid var(--nice-border-color);display:flex;gap:var(--nice-space-1,4px);padding:var(--nice-space-1,4px) var(--nice-space-2,8px)}.PixelEditor-module_brushSlider__UxQ38 label{color:var(--nice-text-muted);font-size:10px}.PixelEditor-module_brushSlider__UxQ38 input[type=range]{accent-color:var(--nice-color-primary);flex:1;height:4px}.PixelEditor-module_brushSlider__UxQ38 span{color:var(--nice-text-muted);font-size:10px;min-width:16px;text-align:center}.PixelEditor-module_toolSep__YIu-E{background:var(--nice-bg-secondary);height:1px;margin:var(--nice-space-1,4px) var(--nice-space-0-5,2px);width:28px}.PixelEditor-module_toolGroup__xA2lN{display:flex;flex-direction:column;gap:var(--nice-space-px,1px);padding:var(--nice-space-0-5,2px) 0}.PixelEditor-module_miniBtn__tg5N0{align-items:center;background:var(--nice-overlay-light-4,hsla(0,0%,100%,.04));border:1px solid transparent;border-radius:var(--nice-radius-sm,3px);color:var(--nice-text-muted);cursor:pointer;display:flex;font-size:10px;height:20px;justify-content:center;transition:all .1s;width:32px}.PixelEditor-module_miniBtn__tg5N0:hover{background:var(--nice-bg-secondary);color:var(--nice-text-secondary)}.PixelEditor-module_miniBtnActive__gpveu{background:var(--nice-bg-tertiary)!important;border-color:var(--nice-color-primary)!important;color:var(--nice-text-primary)!important}.PixelEditor-module_colorSwatches__jFuRX{align-items:center;border-top:1px solid var(--nice-border-color);display:flex;flex-direction:column;gap:var(--nice-space-1,4px);margin-top:var(--nice-space-1,4px);padding:var(--nice-space-1-5,6px) 0}.PixelEditor-module_brushShapes__2bBfl{display:flex;flex-wrap:wrap;gap:var(--nice-space-0-5,2px);padding:var(--nice-space-0-5,2px) 0}.PixelEditor-module_pressureToggles__AITuh{display:flex;flex-direction:column;gap:var(--nice-space-0-5,2px);padding:var(--nice-space-1,4px) 0}.PixelEditor-module_checkLabel__-d-TA{align-items:center;color:var(--nice-text-muted);cursor:pointer;display:flex;font-size:10px;gap:var(--nice-space-1,4px)}.PixelEditor-module_checkLabel__-d-TA input[type=checkbox]{accent-color:var(--nice-color-primary);height:12px;width:12px}.PixelEditor-module_hsvPicker__0ERIh{display:flex;flex-direction:column;gap:var(--nice-space-1,4px);padding:var(--nice-space-1,4px) 0}.PixelEditor-module_hsvRow__M3fhN{align-items:center;display:flex;gap:var(--nice-space-1,4px)}.PixelEditor-module_hsvLabel__O2MkX{color:var(--nice-text-muted);font-size:9px;min-width:16px;text-align:right}.PixelEditor-module_hsvSlider__KKMMJ{accent-color:var(--nice-color-primary);cursor:pointer;flex:1;height:6px;min-width:0}.PixelEditor-module_hsvVal__MgQ8W{color:var(--nice-text-muted);font-size:9px;min-width:28px;text-align:right}.PixelEditor-module_hsvNumInput__Wn4kG{text-align:center;width:36px}.PixelEditor-module_hsvHexInput__MU5Ms,.PixelEditor-module_hsvNumInput__Wn4kG{background:var(--nice-bg-canvas);border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-sm,3px);color:var(--nice-text-primary);font-size:10px;padding:var(--nice-space-px,1px) var(--nice-space-1,4px)}.PixelEditor-module_hsvHexInput__MU5Ms{flex:1}.PixelEditor-module_layerLock__xeWnc{align-items:center;cursor:pointer;display:flex;flex-shrink:0;font-size:10px;height:16px;justify-content:center;opacity:.6;width:16px}.PixelEditor-module_layerLock__xeWnc:hover{opacity:1}.PixelEditor-module_layerNameInput__ZiOKv{background:var(--nice-bg-canvas);border:1px solid var(--nice-color-primary);border-radius:var(--nice-radius-sm,2px);color:var(--nice-text-primary);flex:1;font-size:11px;min-width:0;outline:none;padding:0 var(--nice-space-1,4px)}.PixelEditor-module_layerControls__MrpXo{align-items:center;border-top:1px solid var(--nice-overlay-light-5,hsla(0,0%,100%,.05));display:flex;gap:var(--nice-space-1,4px);margin-top:var(--nice-space-1,4px);padding:var(--nice-space-1,4px) var(--nice-space-1,4px) var(--nice-space-0-5,2px)}.PixelEditor-module_blendSelect__QCwns{background:var(--nice-bg-canvas);border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-sm,3px);color:var(--nice-text-secondary);cursor:pointer;flex:1;font-size:10px;padding:var(--nice-space-px,1px) var(--nice-space-1,4px)}.PixelEditor-module_layerOpSlider__Vw-qs{accent-color:var(--nice-color-primary);cursor:pointer;height:4px;width:60px}.PixelEditor-module_genPanel__99Md8{display:flex;flex-direction:column;height:600px;max-height:70vh;overflow:hidden;width:100%}.PixelEditor-module_genTabs__No5Za{background:var(--nice-bg-canvas);border-bottom:1px solid var(--nice-border-color);display:flex;flex-shrink:0}.PixelEditor-module_genTabBtn__e2VhB{background:none;border:none;border-bottom:2px solid transparent;color:var(--nice-text-secondary);cursor:pointer;flex:1;font-size:11px;padding:var(--nice-space-1-5,6px) var(--nice-space-2,8px);transition:all .15s}.PixelEditor-module_genTabBtn__e2VhB:hover{background:var(--nice-bg-elevated);color:var(--nice-text-muted)}.PixelEditor-module_genTabBtnActive__Rt3jQ{background:var(--nice-bg-elevated)!important;border-bottom-color:var(--nice-color-primary)!important;color:var(--nice-text-primary)!important}.PixelEditor-module_genBody__MuiQy{display:flex;flex:1;min-height:0;overflow:hidden}.PixelEditor-module_genLeft__JdEw6{border-right:1px solid var(--nice-border-color);display:flex;flex-direction:column;flex-shrink:0;overflow-y:auto;width:200px}.PixelEditor-module_genCenter__c5X0S{align-items:center;display:flex;flex:1;flex-direction:column;gap:var(--nice-space-2,8px);overflow-y:auto;padding:var(--nice-space-2,8px)}.PixelEditor-module_genRight__qFz11{border-left:1px solid var(--nice-border-color);display:flex;flex-direction:column;flex-shrink:0;overflow-y:auto;width:200px}.PixelEditor-module_genPreviewWrap__360F-{align-items:center;background:var(--nice-bg-inset);border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-md,6px);display:flex;flex:1;justify-content:center;min-height:120px;overflow:hidden;width:100%}.PixelEditor-module_genPreviewCanvas__75Lw2{image-rendering:pixelated;max-height:100%;max-width:100%;min-height:64px;min-width:64px;object-fit:contain}.PixelEditor-module_genDirGrid__xjEp7{display:flex;flex-wrap:wrap;gap:var(--nice-space-0-5,2px);justify-content:center}.PixelEditor-module_genRow__awCw9{align-items:center;display:flex;gap:var(--nice-space-1,4px);width:100%}.PixelEditor-module_genPresetGrid__f9XK6{display:flex;flex-wrap:wrap;gap:var(--nice-space-0-5,2px)}.PixelEditor-module_genPresetBtn__5C2We{background:var(--nice-overlay-light-4,hsla(0,0%,100%,.04));border:1px solid transparent;border-radius:var(--nice-radius-sm,3px);color:var(--nice-text-muted);cursor:pointer;font-size:9px;padding:var(--nice-space-0-75,3px) var(--nice-space-1-5,6px);transition:all .1s}.PixelEditor-module_genPresetBtn__5C2We:hover{background:var(--nice-bg-secondary);color:var(--nice-text-secondary)}.PixelEditor-module_genPresetBtnActive__WAGew{background:var(--nice-bg-tertiary)!important;border-color:var(--nice-color-primary)!important;color:var(--nice-text-primary)!important}.PixelEditor-module_genPartGrid__l17oc{display:flex;flex-wrap:wrap;gap:var(--nice-space-0-5,2px)}.PixelEditor-module_genPartBtn__5OO82{min-width:32px;padding:0 var(--nice-space-1-5,6px);white-space:nowrap;width:auto}.PixelEditor-module_genColorSwatches__acI6q{display:flex;gap:var(--nice-space-0-5,2px);margin-top:var(--nice-space-0-5,2px)}.PixelEditor-module_genColorSwatch__JE8BO{border:1px solid var(--nice-overlay-light-10,hsla(0,0%,100%,.1));border-radius:var(--nice-radius-sm,2px);height:16px;width:16px}.PixelEditor-module_genAssemblyItem__zNL2P{align-items:center;border-radius:var(--nice-radius-sm,3px);display:flex;font-size:10px;gap:var(--nice-space-1,4px);padding:var(--nice-space-0-5,2px) var(--nice-space-1,4px)}.PixelEditor-module_genAssemblyItem__zNL2P:hover{background:var(--nice-overlay-light-4,hsla(0,0%,100%,.04))}.PixelEditor-module_genAssemblyName__GU-kr{color:var(--nice-text-secondary);flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.PixelEditor-module_genFooter__WkyJp{border-top:1px solid var(--nice-border-color);display:flex;flex-shrink:0;gap:var(--nice-space-2,8px);justify-content:flex-end;padding:var(--nice-space-2-5,10px) var(--nice-space-4,16px)}.PixelEditor-module_btnIcon__O59l9{background:none;border:none;color:var(--nice-text-muted);cursor:pointer;font-size:14px;line-height:1;padding:var(--nice-space-0-5,2px)}.PixelEditor-module_btnIcon__O59l9:hover{color:var(--nice-text-secondary)}.PixelEditor-module_propSelect__4P0Qi{flex:1}.PixelEditor-module_propInput__Q-kr2,.PixelEditor-module_propSelect__4P0Qi{background:var(--nice-bg-canvas);border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-sm,3px);color:var(--nice-text-primary);font-size:11px;min-width:0;padding:var(--nice-space-0-5,2px) var(--nice-space-1,4px)}.VectorEditor-module_root__rtRWo{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}.VectorEditor-module_menuBar__o25XM{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)}.VectorEditor-module_menuBtn__aP4vp{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)}.VectorEditor-module_menuBtn__aP4vp:hover{background:var(--nice-bg-secondary);color:var(--nice-text-primary)}.VectorEditor-module_menuBtn__aP4vp.VectorEditor-module_menuBtnActive__G4hDv,.VectorEditor-module_menuBtn__aP4vp.VectorEditor-module_menuBtnActive__G4hDv:hover{background:var(--nice-color-primary);color:var(--nice-text-on-primary,#fff)}.VectorEditor-module_menuSep__3-kTv{background:var(--nice-bg-secondary);height:16px;margin:0 var(--nice-space-1,4px);width:1px}.VectorEditor-module_menuLabel__Bsm0e{align-items:center;color:var(--nice-text-muted);cursor:pointer;display:flex;font-size:10px;gap:var(--nice-space-0-5,2px);padding:0 var(--nice-space-1,4px)}.VectorEditor-module_toolbar__fakYL{background:var(--nice-bg-elevated);border-right:1px solid var(--nice-border-color);display:flex;flex-direction:column;flex-shrink:0;gap:var(--nice-space-0-5,2px);padding:var(--nice-space-1,4px) var(--nice-space-0-5,2px);width:38px}.VectorEditor-module_toolBtn__Zh7D3{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}.VectorEditor-module_toolBtn__Zh7D3:hover{background:var(--nice-bg-secondary);color:var(--nice-text-secondary)}.VectorEditor-module_toolBtnActive__0xZlr{background:var(--nice-bg-tertiary)!important;border-color:var(--nice-color-primary)!important;color:var(--nice-color-white)!important}.VectorEditor-module_mainArea__3o89F{display:flex;flex:1;min-height:0}.VectorEditor-module_canvasContainer__hOUAx{background:var(--nice-bg-inset);flex:1;height:100%;min-height:0;overflow:hidden;position:relative}.VectorEditor-module_canvasContainer__hOUAx svg{height:100%;inset:0;position:absolute;width:100%}.VectorEditor-module_rightPanel__3hzcS{background:var(--nice-bg-primary);border-left:1px solid var(--nice-border-color);display:flex;flex-direction:column;flex-shrink:0;overflow:hidden;width:320px}.VectorEditor-module_rightPanelTabBody__QrkgO{flex:1 1 auto;min-height:0;overflow-y:auto}.VectorEditor-module_libraryGrid__utboD{display:grid;gap:var(--nice-space-1-5,6px);grid-template-columns:repeat(4,1fr);padding:var(--nice-space-1-5,6px)}.VectorEditor-module_libraryCell__WyOra{align-items:center;background:transparent;border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-sm,4px);color:var(--nice-text-secondary);cursor:pointer;display:flex;flex-direction:column;font-size:9px;gap:var(--nice-space-0-5,2px);overflow:hidden;padding:var(--nice-space-1-5,6px) var(--nice-space-0-5,2px);text-align:center;text-overflow:ellipsis}.VectorEditor-module_libraryCell__WyOra:hover{border-color:var(--nice-primary,#56c);color:var(--nice-text-primary)}.VectorEditor-module_layerRow__6dibJ{align-items:center;border-radius:var(--nice-radius-sm,4px);cursor:pointer;display:flex;font-size:11px;gap:var(--nice-space-1,4px);padding:var(--nice-space-1,4px) var(--nice-space-1-5,6px)}.VectorEditor-module_layerRow__6dibJ:hover{background:var(--nice-bg-secondary)}.VectorEditor-module_layerRowActive__Dqt0V{background:var(--nice-bg-secondary);outline:1px solid var(--nice-primary,#56c)}.VectorEditor-module_layerRowLocked__ubct0{opacity:.6}.VectorEditor-module_layerRowLocked__ubct0 .VectorEditor-module_layerNameInput__OtX-d{cursor:not-allowed}.VectorEditor-module_layerNameInput__OtX-d{background:transparent;border:none;color:var(--nice-text-primary);flex:1 1 auto;font-size:11px;min-width:0;outline:none}.VectorEditor-module_layerIconBtn__bchqi{background:none;border:none;color:var(--nice-text-secondary);cursor:pointer;font-size:12px;line-height:1;padding:0 var(--nice-space-0-5,2px)}.VectorEditor-module_layerIconBtn__bchqi:hover{color:var(--nice-text-primary)}.VectorEditor-module_panelSection__uteDQ{border-bottom:1px solid var(--nice-border-color);padding:var(--nice-space-1-5,6px) var(--nice-space-2,8px)}.VectorEditor-module_panelTitle__WBUxr{align-items:center;color:var(--nice-text-secondary);display:flex;font-size:10px;justify-content:space-between;letter-spacing:.5px;margin-bottom:var(--nice-space-1,4px);text-transform:uppercase}.VectorEditor-module_panelTitle__WBUxr 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)}.VectorEditor-module_panelTitle__WBUxr button:hover{color:var(--nice-text-muted)}.VectorEditor-module_shapeItem__bu2E2{align-items:center;border-radius:var(--nice-radius-sm,3px);cursor:pointer;display:flex;font-size:11px;gap:var(--nice-space-1-5,6px);padding:var(--nice-space-0-75,3px) var(--nice-space-1,4px)}.VectorEditor-module_shapeItem__bu2E2:hover{background:var(--nice-overlay-light-4,hsla(0,0%,100%,.04))}.VectorEditor-module_shapeItemActive__E2lK7{background:var(--nice-surface)!important;border:1px solid var(--nice-color-primary-hover)}.VectorEditor-module_shapeIcon__M4j6X{flex-shrink:0;font-size:14px;opacity:.7}.VectorEditor-module_shapeName__2QctO{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.VectorEditor-module_propRow__Alc4S{align-items:center;display:flex;gap:var(--nice-space-1-5,6px);margin-bottom:var(--nice-space-1,4px)}.VectorEditor-module_propLabel__J0lxK{color:var(--nice-text-muted);font-size:10px;min-width:40px}.VectorEditor-module_propInput__3my2d{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;padding:var(--nice-space-0-5,2px) var(--nice-space-1,4px)}.VectorEditor-module_propColorSwatch__JL97Z{border:1px solid var(--nice-overlay-light-15,hsla(0,0%,100%,.15));border-radius:var(--nice-radius-sm,3px);cursor:pointer;height:24px;position:relative;width:24px}.VectorEditor-module_propColorSwatch__JL97Z input{cursor:pointer;height:100%;inset:0;opacity:0;position:absolute;width:100%}.VectorEditor-module_statusBar__jMwan{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)}.VectorEditor-module_dialogOverlay__NLiCg{align-items:center;background:var(--nice-overlay-60,rgba(0,0,0,.6));display:flex;inset:0;justify-content:center;position:absolute;z-index:100}.VectorEditor-module_dialog__NDNK2{background:var(--nice-bg-elevated);border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-lg,8px);box-shadow:0 8px 32px var(--nice-overlay-50,rgba(0,0,0,.5));max-width:500px;min-width:300px;padding:var(--nice-space-5,20px)}.VectorEditor-module_dialog__NDNK2 h3{color:var(--nice-text-secondary);font-size:14px;margin:0 0 var(--nice-space-3,12px)}.VectorEditor-module_dialog__NDNK2 label{color:var(--nice-text-muted);display:block;font-size:11px;margin:var(--nice-space-2,8px) 0 var(--nice-space-0-5,2px)}.VectorEditor-module_dialog__NDNK2 input,.VectorEditor-module_dialog__NDNK2 select,.VectorEditor-module_dialog__NDNK2 textarea{background:var(--nice-bg-canvas);border:1px solid var(--nice-border-color);border-radius:var(--nice-radius-sm,4px);color:var(--nice-text-primary);font-size:12px;padding:var(--nice-space-1,4px) var(--nice-space-2,8px);width:100%}.VectorEditor-module_dialog__NDNK2 textarea{font-family:monospace;min-height:120px;resize:vertical}.VectorEditor-module_dialogActions__0Sy4X{display:flex;gap:var(--nice-space-2,8px);justify-content:flex-end;margin-top:var(--nice-space-4,16px)}.VectorEditor-module_dialogActions__0Sy4X button{border:none;border-radius:var(--nice-radius-sm,4px);cursor:pointer;font-size:12px;padding:var(--nice-space-1,4px) var(--nice-space-4,16px)}.VectorEditor-module_btnPrimary__f9AaS{background:var(--nice-color-primary);color:var(--nice-color-white)}.VectorEditor-module_btnPrimary__f9AaS:hover{background:var(--nice-primary,#67d)}.VectorEditor-module_btnSecondary__wDps2{background:var(--nice-bg-secondary);color:var(--nice-text-muted)}.VectorEditor-module_btnSecondary__wDps2:hover{background:var(--nice-bg-tertiary);color:var(--nice-text-primary)}.VectorEditor-module_handleGroup__sMkQj circle{fill:var(--nice-color-primary);stroke:var(--nice-color-white);stroke-width:1;cursor:pointer}.VectorEditor-module_handleGroup__sMkQj circle:hover{fill:var(--nice-primary-hover,var(--nice-primary))}.PhotoEditor-module_wrapper__jrHYj{background:var(--nice-bg-primary,#1a1a1e);border-radius:var(--nice-radius-xl,12px);color:var(--nice-text-on-primary,#eee);font-family:Segoe UI,sans-serif;font-size:13px;height:100%;max-height:85vh;overflow:hidden;width:100%}.PhotoEditor-module_loadingWrap__QUTon{align-items:center;color:var(--nice-text-muted,#aaa);display:flex;justify-content:center;min-height:400px;width:100%}.PhotoEditor-module_loadingSpin__fGXBK{animation:PhotoEditor-module_nicePhotoEditorSpin__QorqZ 1s linear infinite}@keyframes PhotoEditor-module_nicePhotoEditorSpin__QorqZ{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.PhotoEditor-module_toolbar__RY-Ty{align-items:center;background:var(--nice-bg-secondary,#222226);border-bottom:1px solid var(--nice-border-color,#333);display:flex;justify-content:space-between;padding:var(--nice-space-2,8px) var(--nice-space-3-5,14px)}.PhotoEditor-module_toolbarGroup__PXw0-{display:flex;flex:0 0 auto;gap:var(--nice-space-1-5,6px)}.PhotoEditor-module_toolbarDivider__o3kFV{background:var(--nice-border-color,#444);margin:0 var(--nice-space-1,4px);width:1px}.PhotoEditor-module_toolbarTitle__P1o18{align-items:center;display:flex;flex:1 1 auto;font-size:14px;font-weight:700;justify-content:center;min-width:0;overflow:hidden;padding:0 var(--nice-space-2,8px);text-overflow:ellipsis;white-space:nowrap}.PhotoEditor-module_leftPanel__DnHLU{background:var(--nice-bg-secondary,#222226);border-right:1px solid var(--nice-border-color,#333);display:flex;flex-direction:column;min-width:280px;overflow:hidden;width:280px}.PhotoEditor-module_tabBar__DZ3MG{border-bottom:1px solid var(--nice-border-color,#333);display:flex;flex-wrap:wrap}.PhotoEditor-module_tabButton__BLi97{align-items:center;background:transparent;border:none;border-bottom:2px solid transparent;color:var(--nice-text-secondary,#888);cursor:pointer;display:flex;flex:1 0 auto;flex-direction:column;font-size:10px;font-weight:600;gap:var(--nice-space-px,1px);min-width:34px;padding:var(--nice-space-2,8px) 0;transition:all .15s}.PhotoEditor-module_tabButtonActive__KlQG0{background:var(--nice-bg-secondary,#2a2a30)}.PhotoEditor-module_tabIcon__-Mq19{font-size:14px}.PhotoEditor-module_panelContent__l5i5t{flex:1;overflow-y:auto;padding:var(--nice-space-2-5,10px) var(--nice-space-3,12px)}.PhotoEditor-module_sectionTitle__tMvCm{font-size:12px;font-weight:600;margin-bottom:var(--nice-space-1-5,6px)}.PhotoEditor-module_sectionTitleMb8__PQ-lV{margin-bottom:var(--nice-space-2,8px)}.PhotoEditor-module_sectionInfo__bWxW5{color:var(--nice-text-muted,#aaa);font-size:11px}.PhotoEditor-module_pillRow__DGJUb,.PhotoEditor-module_sectionInfoMb__Hk6V-{margin-bottom:var(--nice-space-2-5,10px)}.PhotoEditor-module_pillRow__DGJUb{display:flex;flex-wrap:wrap;gap:var(--nice-space-1,4px)}.PhotoEditor-module_pillRowMb8__AQrth{margin-bottom:var(--nice-space-2,8px)}.PhotoEditor-module_pillRowGap3__Y46Vu{display:flex;flex-wrap:wrap;gap:var(--nice-space-0-75,3px);margin-bottom:var(--nice-space-2,8px)}.PhotoEditor-module_pill__wTFac{background:transparent;border:1px solid var(--nice-border-color,#444);border-radius:var(--nice-radius-xl,12px);color:var(--nice-text-muted,#aaa);cursor:pointer;font-size:11px;font-weight:600;padding:var(--nice-space-0-75,3px) var(--nice-space-2-5,10px)}.PhotoEditor-module_pillActive__AfdZR{color:var(--nice-text-primary,#fff)}.PhotoEditor-module_pillCrop__Nsisp{border-radius:var(--nice-radius-md,6px);padding:var(--nice-space-1,4px) var(--nice-space-3,12px)}.PhotoEditor-module_pillCropActive__p6csO{color:var(--nice-text-primary,#fff)}.PhotoEditor-module_pillEmoji__I42DJ{border-radius:var(--nice-radius-lg,10px);padding:var(--nice-space-0-5,2px) var(--nice-space-2,8px)}.PhotoEditor-module_pillEmojiActive__0-EM7{color:var(--nice-text-primary,#fff)}.PhotoEditor-module_filterGrid__-29PS{display:grid;gap:var(--nice-space-1-5,6px);grid-template-columns:repeat(3,1fr)}.PhotoEditor-module_emojiGrid__whqqK{display:grid;gap:var(--nice-space-0-5,2px);grid-template-columns:repeat(6,1fr);max-height:260px;overflow-y:auto}.PhotoEditor-module_shapeGrid__TawIy{margin-bottom:var(--nice-space-4,16px)}.PhotoEditor-module_frameGrid__R09dd,.PhotoEditor-module_shapeGrid__TawIy{display:grid;gap:var(--nice-space-1,4px);grid-template-columns:repeat(5,1fr)}.PhotoEditor-module_sliderRow__jsWDQ{align-items:center;display:flex;gap:var(--nice-space-1-5,6px);margin-bottom:var(--nice-space-2,8px)}.PhotoEditor-module_sliderLabel__zOZ49{color:var(--nice-text-muted,#aaa);font-size:11px}.PhotoEditor-module_sliderLabelSelf__EwYKU{align-self:center;margin-right:var(--nice-space-1,4px)}.PhotoEditor-module_sliderValue__qFuTw{font-size:11px;font-weight:600;min-width:28px}.PhotoEditor-module_sliderValueSm__U7FrJ{font-size:10px;min-width:28px}.PhotoEditor-module_adjustColumn__y---T{display:flex;flex-direction:column;gap:var(--nice-space-2,8px)}.PhotoEditor-module_adjustHeader__6s9zV{display:flex;font-size:11px;justify-content:space-between;margin-bottom:var(--nice-space-0-5,2px)}.PhotoEditor-module_adjustIcon__d56rY{text-align:center;width:14px}.PhotoEditor-module_adjustValue__aUUmg{cursor:pointer;font-weight:600;min-width:30px;text-align:right}.PhotoEditor-module_intensitySection__dhe5h{margin-top:var(--nice-space-3,12px);padding:var(--nice-space-2,8px) 0}.PhotoEditor-module_intensityHeader__-KKu6{display:flex;font-size:11px;justify-content:space-between;margin-bottom:var(--nice-space-1,4px)}.PhotoEditor-module_colorInput__xkF1h{border:none;cursor:pointer;height:28px;padding:0;width:28px}.PhotoEditor-module_colorInputLg__W2KrK{border:none;cursor:pointer;height:30px;padding:0;width:32px}.PhotoEditor-module_colorInputDraw__KYcdG{border:none;cursor:pointer;height:28px;padding:0;width:32px}.PhotoEditor-module_overlayToolbar__hfspp{border-bottom:1px solid var(--nice-border-color,#333);display:flex;flex-wrap:wrap;gap:var(--nice-space-1,4px);margin-bottom:var(--nice-space-2,8px);padding:var(--nice-space-1-5,6px) 0}.PhotoEditor-module_overlayToolbarLabel__mc4pU{align-self:center;color:var(--nice-text-muted,#aaa);font-size:11px;margin-right:var(--nice-space-1,4px)}.PhotoEditor-module_overlayToolbarBtn__AdTmZ{font-size:11px;padding:var(--nice-space-0-5,2px) var(--nice-space-1-5,6px)}.PhotoEditor-module_overlaySection__IIl4r{border-top:1px solid var(--nice-border-color,#333);margin-top:var(--nice-space-3,12px);padding-top:var(--nice-space-2,8px)}.PhotoEditor-module_overlaySectionTitle__FRx3e{color:var(--nice-text-muted,#aaa);font-size:11px;font-weight:600;margin-bottom:var(--nice-space-1,4px)}.PhotoEditor-module_overlayItem__DGUCN{align-items:center;background:transparent;border-radius:var(--nice-radius-sm,4px);color:var(--nice-text-secondary,#ccc);cursor:pointer;display:flex;font-size:11px;gap:var(--nice-space-1-5,6px);margin-bottom:var(--nice-space-0-5,2px);padding:var(--nice-space-0-75,3px) var(--nice-space-1-5,6px)}.PhotoEditor-module_overlayIcon__G0pFk{text-align:center;width:18px}.PhotoEditor-module_overlayName__JVh64{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.PhotoEditor-module_overlayDeleteBtn__Ontxv{background:none;border:none;color:var(--nice-danger,#f55);cursor:pointer;font-size:11px;padding:0}.PhotoEditor-module_emojiBtn__jxG9m{background:transparent;border:none;border-radius:var(--nice-radius-md,6px);cursor:pointer;font-size:22px;line-height:1;padding:var(--nice-space-1,4px) 0}.PhotoEditor-module_shapeBtn__xZdSV{font-size:20px}.PhotoEditor-module_frameBtn__coMkZ,.PhotoEditor-module_shapeBtn__xZdSV{background:transparent;border:1px solid var(--nice-border-color,#444);border-radius:var(--nice-radius-md,6px);color:var(--nice-text-secondary,#eee);cursor:pointer;line-height:1;padding:var(--nice-space-1-5,6px) 0}.PhotoEditor-module_frameBtn__coMkZ{font-size:18px}.PhotoEditor-module_removeFrameBtn__oCuua{background:transparent;border:1px solid var(--nice-border-color,#444);border-radius:var(--nice-radius-md,6px);color:var(--nice-danger,#f55);cursor:pointer;font-size:14px;padding:var(--nice-space-1-5,6px) 0}.PhotoEditor-module_textFormatBtn__7Z9RJ{min-width:32px}.PhotoEditor-module_textFormatBtnSm__3ptcG{min-width:28px}.PhotoEditor-module_drawActionBtn__teYz4{flex:1}.PhotoEditor-module_textArea__sBGlB{background:var(--nice-bg-secondary,#2a2a30);border:1px solid var(--nice-border-color,#444);border-radius:var(--nice-radius-md,6px);color:var(--nice-text-secondary,#eee);font-size:13px;margin-bottom:var(--nice-space-2,8px);resize:none}.PhotoEditor-module_textAreaSm__6xZnY{font-size:12px;margin-bottom:0}.PhotoEditor-module_textBtnRow__AcEnd{display:flex;flex-wrap:wrap;gap:var(--nice-space-1,4px);margin-bottom:var(--nice-space-2,8px)}.PhotoEditor-module_textGapRow__Dq2uz{display:flex;gap:var(--nice-space-1,4px);margin-top:var(--nice-space-1-5,6px)}.PhotoEditor-module_editSelectedSection__bgNEh{border-top:1px solid var(--nice-border-color,#333);margin-top:var(--nice-space-3,12px);padding-top:var(--nice-space-2,8px)}.PhotoEditor-module_editSelectedLabel__u2rmS{color:var(--nice-text-muted,#aaa);font-size:11px;margin-bottom:var(--nice-space-1,4px)}.PhotoEditor-module_shapeColorRow__ip5--{display:flex;flex-wrap:wrap;gap:var(--nice-space-1,4px);margin-bottom:var(--nice-space-2,8px)}.PhotoEditor-module_shapeColorLabel__nVcbU{align-self:center;color:var(--nice-text-muted,#aaa);font-size:11px;margin-right:var(--nice-space-0-5,2px)}.PhotoEditor-module_shapeColorLabelMl__KiM2d{margin-left:var(--nice-space-1,4px)}.PhotoEditor-module_shapeFillToggle__BXJ8C{font-size:10px;padding:var(--nice-space-0-5,2px) var(--nice-space-1-5,6px)}.PhotoEditor-module_frameColorRow__KRAHz{display:flex;gap:var(--nice-space-1,4px);margin-bottom:var(--nice-space-2,8px)}.PhotoEditor-module_frameThicknessWrap__lXCoC{align-items:center;display:flex;flex:1;gap:var(--nice-space-1,4px)}.PhotoEditor-module_frameThicknessValue__SAEuc{font-size:10px}.PhotoEditor-module_drawPreview__WPbiv{display:flex;justify-content:center;margin-bottom:var(--nice-space-3,12px)}.PhotoEditor-module_drawActionRow__CUSWS{display:flex;gap:var(--nice-space-1,4px)}.PhotoEditor-module_quickColorRow__DTy5E{align-items:center;display:flex;gap:var(--nice-space-1-5,6px);margin-bottom:var(--nice-space-2,8px)}.PhotoEditor-module_quickColorSwatch__ZjgoA{border:1px solid var(--nice-border-color,#555);border-radius:var(--nice-radius-sm,3px);cursor:pointer;height:18px;width:18px}.PhotoEditor-module_transformRow__LKRjS{display:flex;gap:var(--nice-space-1-5,6px);margin-bottom:var(--nice-space-4,16px)}.PhotoEditor-module_transformZoomRow__h2NlB{align-items:center;display:flex;gap:var(--nice-space-2,8px)}.PhotoEditor-module_transformZoomValue__LXa51{font-size:11px;font-weight:600;min-width:40px}.PhotoEditor-module_transformInfo__zXP9l{background:var(--nice-bg-secondary,#2a2a30);border-radius:var(--nice-radius-lg,8px);color:var(--nice-text-muted,#aaa);font-size:11px;margin-top:var(--nice-space-4,16px);padding:var(--nice-space-2-5,10px)}.PhotoEditor-module_canvasViewport__OMBIL{align-items:center;background:#111115;display:flex;flex:1;justify-content:center;overflow:auto;padding:var(--nice-space-5,20px);position:relative}.PhotoEditor-module_zoomWrap__JjfiJ{max-height:100%;max-width:100%;position:relative;transform-origin:center center;transition:transform .15s ease}.PhotoEditor-module_compareWrap__-J5ku{cursor:ew-resize;display:inline-block;position:relative}.PhotoEditor-module_canvasOriginal__Apf91{max-width:100%}.PhotoEditor-module_canvasEdited__Eroz7,.PhotoEditor-module_canvasOriginal__Apf91{display:block;max-height:60vh;object-fit:contain}.PhotoEditor-module_compareClip__5qG2I{bottom:0;left:0;overflow:hidden;position:absolute;top:0}.PhotoEditor-module_compareSlider__OIIIK{bottom:0;position:absolute;top:0;transform:translateX(-50%);width:3px}.PhotoEditor-module_compareSliderKnob__VohI9{align-items:center;border-radius:var(--nice-radius-full,50%);box-shadow:0 2px 8px var(--nice-overlay-40,rgba(0,0,0,.4));display:flex;height:28px;justify-content:center;left:50%;position:absolute;top:50%;transform:translate(-50%,-50%);width:28px}.PhotoEditor-module_compareSliderIcon__pXcct{color:var(--nice-text-primary,#fff);font-size:12px}.PhotoEditor-module_compareLabelOriginal__GaBoj{background:var(--nice-overlay-60,rgba(0,0,0,.6));color:var(--nice-text-on-primary,#fff);left:8px}.PhotoEditor-module_compareLabelEdited__Fr836,.PhotoEditor-module_compareLabelOriginal__GaBoj{border-radius:var(--nice-radius-sm,4px);font-size:11px;font-weight:600;padding:var(--nice-space-0-5,2px) var(--nice-space-2,8px);position:absolute;top:8px}.PhotoEditor-module_compareLabelEdited__Fr836{color:var(--nice-text-primary,#fff);right:8px}.PhotoEditor-module_regularWrap__8umPV{display:inline-block;position:relative}.PhotoEditor-module_canvasRegular__wxapL{border-radius:var(--nice-radius-md,6px);box-shadow:0 4px 20px var(--nice-overlay-40,rgba(0,0,0,.4));display:block;max-height:60vh;max-width:100%;object-fit:contain}.PhotoEditor-module_cropOverlay__MJk1Y{inset:0;pointer-events:none;position:absolute;z-index:2}.PhotoEditor-module_cropDarkBg__m3axV{background:var(--nice-overlay-55,rgba(0,0,0,.55));inset:0;position:absolute}.PhotoEditor-module_cropGridContainer__NfHdT{inset:0;position:absolute}.PhotoEditor-module_cropSizeLabel__fV2mF{background:var(--nice-overlay-75,rgba(0,0,0,.75));border-radius:var(--nice-radius-sm,3px);bottom:-24px;color:var(--nice-text-on-primary,#fff);font-size:10px;left:50%;padding:var(--nice-space-0-5,2px) var(--nice-space-2,8px);position:absolute;transform:translateX(-50%);white-space:nowrap}.PhotoEditor-module_cropInfo__Z1SCE{color:var(--nice-text-muted,#aaa);font-size:11px;margin-bottom:var(--nice-space-2-5,10px)}.PhotoEditor-module_cropAspectLabel__dieL-{font-size:12px;font-weight:600;margin-bottom:var(--nice-space-1-5,6px)}.PhotoEditor-module_cropAspectRow__scRj3{display:flex;flex-wrap:wrap;gap:var(--nice-space-1,4px)}.PhotoEditor-module_accentBtn__tgaEx{color:var(--nice-text-primary,#fff);font-weight:600;width:100%}.GameAsset2dEditor-module_root__WVJBM{background:var(--nice-bg,#1a1a2e);color:var(--nice-text-secondary,#e0e0e0);font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;font-size:13px;height:100%;min-height:600px;user-select:none}.GameAsset2dEditor-module_menuBar__WaEaU{align-items:center;background:var(--nice-bg,#16213e);border-bottom:1px solid var(--nice-border-color,#0f3460);display:flex;gap:var(--nice-space-2,8px);padding:var(--nice-space-1-5,6px) var(--nice-space-3,12px)}.GameAsset2dEditor-module_menuBar__WaEaU h3{color:var(--nice-warning,#ffd369);font-size:14px;font-weight:600;margin:0}.GameAsset2dEditor-module_menuGroup__EOreB{display:flex;gap:var(--nice-space-0-5,2px)}.GameAsset2dEditor-module_menuBtn__JYWXn{align-items:center;background:transparent;border:none;border-radius:var(--nice-radius-sm,4px);color:var(--nice-text-muted,#b0b0b0);cursor:pointer;display:flex;font-size:12px;gap:var(--nice-space-1,4px);padding:var(--nice-space-1,4px) var(--nice-space-2,8px);transition:all .15s}.GameAsset2dEditor-module_menuBtn__JYWXn:hover{background:var(--nice-overlay-light-10,hsla(0,0%,100%,.1));color:var(--nice-text-on-primary,#fff)}.GameAsset2dEditor-module_menuBtn__JYWXn:disabled{cursor:not-allowed;opacity:.4}.GameAsset2dEditor-module_spacer__fPVeq{flex:1}.GameAsset2dEditor-module_modeTabs__iKh7C{background:var(--nice-bg,#1f2940);border-bottom:1px solid var(--nice-border-color,#0f3460);display:flex;gap:var(--nice-space-0-5,2px);padding:var(--nice-space-1,4px) var(--nice-space-3,12px)}.GameAsset2dEditor-module_modeTab__C12zt{background:transparent;border:none;border-radius:var(--nice-radius-sm,4px) var(--nice-radius-sm,4px) 0 0;color:var(--nice-text-secondary,#8892a8);cursor:pointer;font-size:12px;font-weight:500;padding:var(--nice-space-1-5,6px) var(--nice-space-4,16px);transition:all .15s}.GameAsset2dEditor-module_modeTab__C12zt:hover{background:var(--nice-overlay-light-5,hsla(0,0%,100%,.05));color:var(--nice-text-on-primary,#c0c8d8)}.GameAsset2dEditor-module_modeTab__C12zt.GameAsset2dEditor-module_active__DUroI{background:var(--nice-bg,#1a1a2e);color:var(--nice-warning,#ffd369)}.GameAsset2dEditor-module_mainArea__jwDUa{display:flex;flex:1;overflow:hidden}.GameAsset2dEditor-module_leftPanel__xxAg5{background:var(--nice-bg,#16213e);border-right:1px solid var(--nice-border-color,#0f3460);display:flex;flex-direction:column;overflow:hidden;width:220px}.GameAsset2dEditor-module_centerArea__xr-Hn{display:flex;flex:1;flex-direction:column;overflow:hidden}.GameAsset2dEditor-module_rightPanel__YoNuc{background:var(--nice-bg,#16213e);border-left:1px solid var(--nice-border-color,#0f3460);display:flex;flex-direction:column;overflow:hidden;width:260px}.GameAsset2dEditor-module_toolbar__hEC9S{align-items:center;background:var(--nice-bg,#1f2940);border-bottom:1px solid var(--nice-border-color,#0f3460);display:flex;gap:var(--nice-space-2,8px);padding:var(--nice-space-1-5,6px) var(--nice-space-3,12px)}.GameAsset2dEditor-module_toolGroup__Zbn47{background:var(--nice-overlay-20,rgba(0,0,0,.2));border-radius:var(--nice-radius-sm,4px);display:flex;gap:var(--nice-space-0-5,2px);padding:var(--nice-space-0-5,2px)}.GameAsset2dEditor-module_toolBtn__5U7Rw{align-items:center;background:transparent;border:none;border-radius:var(--nice-radius-sm,3px);color:var(--nice-text-secondary,#8892a8);cursor:pointer;display:flex;font-size:14px;height:28px;justify-content:center;transition:all .15s;width:28px}.GameAsset2dEditor-module_toolBtn__5U7Rw:hover{background:var(--nice-overlay-light-10,hsla(0,0%,100%,.1));color:var(--nice-text-on-primary,#fff)}.GameAsset2dEditor-module_toolBtn__5U7Rw.GameAsset2dEditor-module_active__DUroI{background:var(--nice-color-primary,#0f3460);color:var(--nice-text-on-primary,#ffd369)}.GameAsset2dEditor-module_toolBtn__5U7Rw:disabled{cursor:not-allowed;opacity:.3}.GameAsset2dEditor-module_viewport__vEKEv{background:var(--nice-bg,#0a0a14);flex:1;overflow:hidden;position:relative}.GameAsset2dEditor-module_viewportCanvas__FJ5qA{image-rendering:pixelated;image-rendering:crisp-edges;left:50%;position:absolute;top:50%}.GameAsset2dEditor-module_gridOverlay__K8B97{bottom:0;left:0;pointer-events:none;position:absolute;right:0;top:0}.GameAsset2dEditor-module_panelHeader__xm2As{align-items:center;background:var(--nice-bg-tertiary,#0f3460);color:var(--nice-text-secondary,#8892a8);display:flex;font-size:11px;font-weight:600;justify-content:space-between;letter-spacing:.5px;padding:var(--nice-space-2,8px) var(--nice-space-3,12px);text-transform:uppercase}.GameAsset2dEditor-module_panelContent__dvOGq{flex:1;overflow-y:auto;padding:var(--nice-space-2,8px)}.GameAsset2dEditor-module_panelSection__RQQDr{margin-bottom:var(--nice-space-4,16px)}.GameAsset2dEditor-module_panelLabel__Ks-Wa{color:var(--nice-text-secondary,#8892a8);display:block;font-size:11px;letter-spacing:.5px;margin-bottom:var(--nice-space-1-5,6px);text-transform:uppercase}.GameAsset2dEditor-module_panelInput__cxNiG{background:var(--nice-bg,#0a0a14);border:1px solid var(--nice-border-color,#2a3a5e);border-radius:var(--nice-radius-sm,4px);color:var(--nice-text-secondary,#e0e0e0);font-size:12px;padding:var(--nice-space-1-5,6px) var(--nice-space-2,8px);width:100%}.GameAsset2dEditor-module_panelInput__cxNiG:focus{border-color:var(--nice-warning,#ffd369);outline:none}.GameAsset2dEditor-module_tilePalette__OpzmV{display:grid;gap:var(--nice-space-1,4px);grid-template-columns:repeat(auto-fill,minmax(40px,1fr));padding:var(--nice-space-2,8px)}.GameAsset2dEditor-module_tileItem__uWNS9{aspect-ratio:1;background:var(--nice-bg,#0a0a14);border:2px solid transparent;border-radius:var(--nice-radius-sm,4px);cursor:pointer;overflow:hidden;transition:all .15s}.GameAsset2dEditor-module_tileItem__uWNS9:hover{border-color:var(--nice-border-color,#4a5a7e)}.GameAsset2dEditor-module_tileItem__uWNS9.GameAsset2dEditor-module_selected__216IN{border-color:var(--nice-warning,#ffd369)}.GameAsset2dEditor-module_tileItem__uWNS9 img{height:100%;image-rendering:pixelated;object-fit:contain;width:100%}.GameAsset2dEditor-module_layersList__anFaG{display:flex;flex-direction:column;gap:var(--nice-space-0-5,2px)}.GameAsset2dEditor-module_layerItem__XSGlu{align-items:center;background:var(--nice-bg,#1f2940);border-radius:var(--nice-radius-sm,4px);cursor:pointer;display:flex;gap:var(--nice-space-2,8px);padding:var(--nice-space-1-5,6px) var(--nice-space-2,8px);transition:all .15s}.GameAsset2dEditor-module_layerItem__XSGlu:hover{background:var(--nice-hover-bg,#2a3a5e)}.GameAsset2dEditor-module_layerItem__XSGlu.GameAsset2dEditor-module_selected__216IN{background:var(--nice-selected-bg,#0f3460);border-left:3px solid var(--nice-warning,#ffd369)}.GameAsset2dEditor-module_layerVisibility__RpHjV{align-items:center;background:transparent;border:none;border-radius:var(--nice-radius-sm,3px);color:var(--nice-text-secondary,#8892a8);cursor:pointer;display:flex;height:20px;justify-content:center;width:20px}.GameAsset2dEditor-module_layerVisibility__RpHjV:hover{background:var(--nice-overlay-light-10,hsla(0,0%,100%,.1))}.GameAsset2dEditor-module_layerVisibility__RpHjV.GameAsset2dEditor-module_hidden__mukOG{opacity:.4}.GameAsset2dEditor-module_layerName__WBxq5{color:var(--nice-text-secondary,#c0c8d8);flex:1;font-size:12px}.GameAsset2dEditor-module_layerOpacity__FpzL-{color:var(--nice-text-secondary,#8892a8);font-size:10px;text-align:right;width:40px}.GameAsset2dEditor-module_framesList__vg1oO{display:grid;gap:var(--nice-space-2,8px);grid-template-columns:repeat(auto-fill,minmax(60px,1fr));padding:var(--nice-space-2,8px)}.GameAsset2dEditor-module_frameItem__fkEfb{aspect-ratio:1;background:var(--nice-bg,#0a0a14);border:2px solid transparent;border-radius:var(--nice-radius-sm,4px);cursor:pointer;overflow:hidden;position:relative;transition:all .15s}.GameAsset2dEditor-module_frameItem__fkEfb:hover{border-color:var(--nice-border-color,#4a5a7e)}.GameAsset2dEditor-module_frameItem__fkEfb.GameAsset2dEditor-module_selected__216IN{border-color:var(--nice-warning,#ffd369)}.GameAsset2dEditor-module_frameItem__fkEfb canvas{height:100%;image-rendering:pixelated;object-fit:contain;width:100%}.GameAsset2dEditor-module_frameLabel__5IGW8{background:var(--nice-overlay-70,rgba(0,0,0,.7));bottom:0;color:var(--nice-text-muted,#b0b0b0);font-size:9px;left:0;padding:var(--nice-space-0-5,2px) var(--nice-space-1,4px);position:absolute;right:0;text-align:center}.GameAsset2dEditor-module_timeline__dPJk6{background:var(--nice-bg,#16213e);border-top:1px solid var(--nice-border-color,#0f3460);padding:var(--nice-space-2,8px)}.GameAsset2dEditor-module_timelineTrack__mr20w{background:var(--nice-bg,#0a0a14);border-radius:var(--nice-radius-sm,4px);display:flex;gap:var(--nice-space-1,4px);overflow-x:auto;padding:var(--nice-space-1,4px)}.GameAsset2dEditor-module_timelineFrame__AQyGe{background:var(--nice-bg,#1f2940);border:2px solid transparent;border-radius:var(--nice-radius-sm,4px);cursor:pointer;flex-shrink:0;height:48px;overflow:hidden;width:48px}.GameAsset2dEditor-module_timelineFrame__AQyGe:hover{border-color:var(--nice-border-color,#4a5a7e)}.GameAsset2dEditor-module_timelineFrame__AQyGe.GameAsset2dEditor-module_current__3sAfL{border-color:var(--nice-warning,#ffd369)}.GameAsset2dEditor-module_stateGraph__qAWlU{background:var(--nice-bg,#0a0a14);flex:1;overflow:hidden;position:relative}.GameAsset2dEditor-module_stateNode__W9Z-g{background:var(--nice-bg,#1f2940);border:2px solid var(--nice-border-color,#2a3a5e);border-radius:var(--nice-radius-lg,8px);cursor:move;min-width:120px;padding:var(--nice-space-2,8px) var(--nice-space-3,12px);position:absolute;transition:border-color .15s}.GameAsset2dEditor-module_stateNode__W9Z-g:hover{border-color:var(--nice-border-color,#4a5a7e)}.GameAsset2dEditor-module_stateNode__W9Z-g.GameAsset2dEditor-module_selected__216IN{border-color:var(--nice-warning,#ffd369)}.GameAsset2dEditor-module_stateNode__W9Z-g.GameAsset2dEditor-module_entry__cmA9n{border-color:var(--nice-success-light,#4ade80)}.GameAsset2dEditor-module_stateNodeName__TK5vs{color:var(--nice-text-secondary,#e0e0e0);font-size:12px;font-weight:500;text-align:center}.GameAsset2dEditor-module_stateNodeAnim__VGwnV{color:var(--nice-text-secondary,#8892a8);font-size:10px;margin-top:var(--nice-space-1,4px);text-align:center}.GameAsset2dEditor-module_transition__FBbno{stroke:var(--nice-text-secondary,#4a5a7e);stroke-width:2;fill:none;marker-end:url(#arrowhead)}.GameAsset2dEditor-module_transition__FBbno:hover{stroke:var(--nice-warning,#ffd369)}.GameAsset2dEditor-module_effectsList__vHq4I{display:flex;flex-direction:column;gap:var(--nice-space-2,8px)}.GameAsset2dEditor-module_effectItem__6-1li{background:var(--nice-bg,#1f2940);border-radius:var(--nice-radius-md,6px);overflow:hidden}.GameAsset2dEditor-module_effectHeader__cgVN-{align-items:center;cursor:pointer;display:flex;gap:var(--nice-space-2,8px);padding:var(--nice-space-2,8px)}.GameAsset2dEditor-module_effectToggle__lKE36{background:var(--nice-bg,#0a0a14);border:1px solid var(--nice-border-color,#2a3a5e);border-radius:var(--nice-radius-sm,3px);cursor:pointer;height:18px;width:18px}.GameAsset2dEditor-module_effectToggle__lKE36.GameAsset2dEditor-module_enabled__wgDzp{background:var(--nice-warning,#ffd369);border-color:var(--nice-warning,#ffd369)}.GameAsset2dEditor-module_effectName__NQCWj{color:var(--nice-text-secondary,#c0c8d8);flex:1;font-size:12px}.GameAsset2dEditor-module_effectRemove__TSSdI{align-items:center;background:transparent;border:none;border-radius:var(--nice-radius-sm,3px);color:var(--nice-text-secondary,#8892a8);cursor:pointer;display:flex;height:20px;justify-content:center;width:20px}.GameAsset2dEditor-module_effectRemove__TSSdI:hover{background:var(--nice-danger,#ef4444);color:var(--nice-text-on-primary,#fff)}.GameAsset2dEditor-module_effectParams__UqTBd{background:var(--nice-overlay-20,rgba(0,0,0,.2));padding:var(--nice-space-2,8px)}.GameAsset2dEditor-module_effectParam__hEsVY{align-items:center;display:flex;gap:var(--nice-space-2,8px);margin-bottom:var(--nice-space-2,8px)}.GameAsset2dEditor-module_effectParam__hEsVY:last-child{margin-bottom:0}.GameAsset2dEditor-module_effectParamLabel__u0Qoc{color:var(--nice-text-secondary,#8892a8);flex:0 0 80px;font-size:11px}.GameAsset2dEditor-module_effectParamInput__aqxdv{background:var(--nice-bg,#0a0a14);border:1px solid var(--nice-border-color,#2a3a5e);border-radius:var(--nice-radius-sm,3px);color:var(--nice-text-secondary,#e0e0e0);flex:1;font-size:11px;height:24px;padding:0 var(--nice-space-2,8px)}.GameAsset2dEditor-module_statusBar__eOrNe{align-items:center;background:var(--nice-bg-tertiary,#0f3460);color:var(--nice-text-secondary,#8892a8);display:flex;font-size:11px;gap:var(--nice-space-4,16px);padding:var(--nice-space-1,4px) var(--nice-space-3,12px)}.GameAsset2dEditor-module_statusItem__kKLHF,.GameAsset2dEditor-module_zoomControl__4YD9G{align-items:center;display:flex;gap:var(--nice-space-1,4px)}.GameAsset2dEditor-module_zoomControl__4YD9G{margin-left:auto}.GameAsset2dEditor-module_zoomBtn__hxYik{align-items:center;background:transparent;border:none;border-radius:var(--nice-radius-sm,3px);color:var(--nice-text-secondary,#8892a8);cursor:pointer;display:flex;height:20px;justify-content:center;width:20px}.GameAsset2dEditor-module_zoomBtn__hxYik:hover{background:var(--nice-overlay-light-10,hsla(0,0%,100%,.1));color:var(--nice-text-on-primary,#fff)}.GameAsset2dEditor-module_dialogOverlay__dZYwO{align-items:center;background:var(--nice-overlay-60,rgba(0,0,0,.6));bottom:0;display:flex;justify-content:center;left:0;position:fixed;right:0;top:0;z-index:1000}.GameAsset2dEditor-module_dialog__mfLFL{background:var(--nice-bg,#16213e);border-radius:var(--nice-radius-lg,8px);box-shadow:0 8px 32px var(--nice-overlay-40,rgba(0,0,0,.4));max-width:500px;min-width:300px;padding:var(--nice-space-6,24px)}.GameAsset2dEditor-module_dialog__mfLFL h3{color:var(--nice-warning,#ffd369);font-size:16px;margin:0 0 var(--nice-space-4,16px)}.GameAsset2dEditor-module_dialogActions__vhDXe{display:flex;gap:var(--nice-space-2,8px);justify-content:flex-end;margin-top:var(--nice-space-5,20px)}.GameAsset2dEditor-module_btnPrimary__Gzc25{background:var(--nice-warning,#ffd369);border:none;border-radius:var(--nice-radius-sm,4px);color:var(--nice-text-on-primary,#1a1a2e);cursor:pointer;font-size:12px;font-weight:600;padding:var(--nice-space-2,8px) var(--nice-space-4,16px);transition:all .15s}.GameAsset2dEditor-module_btnPrimary__Gzc25:hover{background:color-mix(in srgb,var(--nice-warning,#ffd369) 80%,#fff)}.GameAsset2dEditor-module_btnSecondary__G5nK5{background:transparent;border:1px solid var(--nice-border-color,#4a5a7e);border-radius:var(--nice-radius-sm,4px);color:var(--nice-text-secondary,#c0c8d8);cursor:pointer;font-size:12px;padding:var(--nice-space-2,8px) var(--nice-space-4,16px);transition:all .15s}.GameAsset2dEditor-module_btnSecondary__G5nK5:hover{background:var(--nice-overlay-light-5,hsla(0,0%,100%,.05));border-color:var(--nice-border-strong,#6a7a9e)}.GameAsset2dEditor-module_panelContent__dvOGq::-webkit-scrollbar{width:6px}.GameAsset2dEditor-module_panelContent__dvOGq::-webkit-scrollbar-track{background:var(--nice-bg,#0a0a14)}.GameAsset2dEditor-module_panelContent__dvOGq::-webkit-scrollbar-thumb{background:var(--nice-border-color,#2a3a5e);border-radius:var(--nice-radius-sm,3px)}.GameAsset2dEditor-module_panelContent__dvOGq::-webkit-scrollbar-thumb:hover{background:var(--nice-text-secondary,#4a5a7e)}.GameAsset2dEditor-module_dropZone__Z7sYz{border:2px dashed var(--nice-border-color,#4a5a7e);border-radius:var(--nice-radius-lg,8px);color:var(--nice-text-secondary,#8892a8);cursor:pointer;padding:var(--nice-space-6,24px);text-align:center;transition:all .15s}.GameAsset2dEditor-module_dropZone__Z7sYz:hover{border-color:var(--nice-warning,#ffd369);color:var(--nice-text-secondary,#c0c8d8)}.GameAsset2dEditor-module_dropZone__Z7sYz.GameAsset2dEditor-module_active__DUroI{background:color-mix(in srgb,var(--nice-warning,#ffd369) 10%,transparent);border-color:var(--nice-warning,#ffd369)}.GameAsset2dEditor-module_emptyState__3wryk{align-items:center;color:var(--nice-text-secondary,#8892a8);display:flex;flex-direction:column;justify-content:center;padding:var(--nice-space-8,32px);text-align:center}.GameAsset2dEditor-module_emptyState__3wryk svg{height:48px;margin-bottom:var(--nice-space-3,12px);opacity:.5;width:48px}.GameAsset2dEditor-module_emptyStateText__Q5V1a{font-size:12px;margin-bottom:var(--nice-space-3,12px)}
@@ -4,7 +4,8 @@ var jsxRuntime = require('react/jsx-runtime');
4
4
  var React = require('react');
5
5
  var PhotoEditor_module = require('./PhotoEditor.module.css.js');
6
6
 
7
- const FilterThumb = React.memo(({ filter, selected, accent, onSelect, generateThumbnail }) => {
7
+ const FilterThumb = /* @__PURE__ */ Object.assign(
8
+ /* @__PURE__ */ React.memo(({ filter, selected, accent, onSelect, generateThumbnail }) => {
8
9
  const [thumb, setThumb] = React.useState('');
9
10
  const canvasRef = React.useRef(null);
10
11
  const mounted = React.useRef(true);
@@ -24,7 +25,6 @@ const FilterThumb = React.memo(({ filter, selected, accent, onSelect, generateTh
24
25
  borderColor: selected ? accent : undefined,
25
26
  boxShadow: selected ? `0 0 0 2px ${accent}` : undefined,
26
27
  }, title: filter.name, children: [thumb ? (jsxRuntime.jsx("img", { src: thumb, alt: filter.name, className: PhotoEditor_module.filterThumbImg })) : (jsxRuntime.jsx("div", { className: PhotoEditor_module.filterThumbPlaceholder })), jsxRuntime.jsx("span", { className: PhotoEditor_module.filterThumbLabel, children: filter.name })] }));
27
- });
28
- FilterThumb.displayName = 'FilterThumb';
28
+ }), { displayName: 'FilterThumb' });
29
29
 
30
30
  module.exports = FilterThumb;