@nice2dev/game-engine 1.1.6 → 1.1.9

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 (496) hide show
  1. package/CHANGELOG.md +125 -0
  2. package/dist/cjs/core/GameConfig.js +21 -7
  3. package/dist/cjs/devtools/DeveloperExperience.js +5 -5
  4. package/dist/cjs/dialogue/DialogueSystem.js +1 -1
  5. package/dist/cjs/editor/AssetBrowser.js +26 -25
  6. package/dist/cjs/editor/NiceGameEditor.js +66 -49
  7. package/dist/cjs/godot-integration/components/GodotProjectBrowser.js +33 -32
  8. package/dist/cjs/i18n/I18n.js +305 -0
  9. package/dist/cjs/kids/KidMode.js +36 -36
  10. package/dist/cjs/kids/KidTools.js +31 -31
  11. package/dist/cjs/native-engine/InputSystem.js +9 -2
  12. package/dist/cjs/package.json +3 -0
  13. package/dist/cjs/plugins/PluginSDK.js +1 -1
  14. package/dist/cjs/plugins/PluginTestKit.js +1 -1
  15. package/dist/cjs/quest/QuestSystem.js +5 -1
  16. package/dist/cjs/release/MobileExport.js +45 -12
  17. package/dist/cjs/tutorials/TutorialBranching.js +12 -12
  18. package/dist/cjs/tutorials/TutorialEngine.js +35 -35
  19. package/dist/cjs/tutorials/content/Tutorials_T05_T08.js +106 -89
  20. package/dist/cjs/tutorials/content/Tutorials_T09_T11.js +103 -55
  21. package/dist/cjs/tutorials/content/Tutorials_T12_T15.js +79 -56
  22. package/dist/cjs/unity-integration/components/UnityAssetStoreBrowser.js +25 -24
  23. package/dist/cjs/unity-integration/components/UnityProjectBrowser.js +28 -27
  24. package/dist/cjs/unreal-integration/components/UnrealProjectBrowser.js +31 -30
  25. package/dist/esm/core/GameConfig.js +21 -7
  26. package/dist/esm/devtools/DeveloperExperience.js +5 -5
  27. package/dist/esm/dialogue/DialogueSystem.js +1 -1
  28. package/dist/esm/editor/AssetBrowser.js +26 -25
  29. package/dist/esm/editor/NiceGameEditor.js +67 -50
  30. package/dist/esm/godot-integration/components/GodotProjectBrowser.js +33 -32
  31. package/dist/esm/i18n/I18n.js +305 -0
  32. package/dist/esm/kids/KidMode.js +36 -36
  33. package/dist/esm/kids/KidTools.js +31 -31
  34. package/dist/esm/native-engine/InputSystem.js +9 -2
  35. package/dist/esm/plugins/PluginSDK.js +1 -1
  36. package/dist/esm/plugins/PluginTestKit.js +1 -1
  37. package/dist/esm/quest/QuestSystem.js +5 -1
  38. package/dist/esm/release/MobileExport.js +45 -12
  39. package/dist/esm/tutorials/TutorialBranching.js +12 -12
  40. package/dist/esm/tutorials/TutorialEngine.js +35 -35
  41. package/dist/esm/tutorials/content/Tutorials_T05_T08.js +106 -89
  42. package/dist/esm/tutorials/content/Tutorials_T09_T11.js +103 -55
  43. package/dist/esm/tutorials/content/Tutorials_T12_T15.js +79 -56
  44. package/dist/esm/unity-integration/components/UnityAssetStoreBrowser.js +25 -24
  45. package/dist/esm/unity-integration/components/UnityProjectBrowser.js +28 -27
  46. package/dist/esm/unreal-integration/components/UnrealProjectBrowser.js +31 -30
  47. package/dist/types/core/index.d.ts +1 -1
  48. package/dist/types/editor/AssetBrowser.d.ts +1 -0
  49. package/dist/types/editor/behavior-tree/BTEditorNode.d.ts +2 -1
  50. package/dist/types/editor/behavior-tree/BTEditorToolbar.d.ts +1 -0
  51. package/dist/types/input/index.d.ts +1 -1
  52. package/dist/types/kids/KidMode.d.ts +4 -2
  53. package/dist/types/kids/KidTools.d.ts +1 -1
  54. package/dist/types/legendary/index.d.ts +7 -7
  55. package/dist/types/procedural/index.d.ts +1 -1
  56. package/dist/types/tutorials/TutorialBranching.d.ts +1 -1
  57. package/package.json +3 -2
  58. package/dist/cjs/accessibility/Accessibility.js.map +0 -1
  59. package/dist/cjs/ai/AI.js.map +0 -1
  60. package/dist/cjs/ai/BehaviorTree.js.map +0 -1
  61. package/dist/cjs/ai/StateMachine.js.map +0 -1
  62. package/dist/cjs/animation/Animation.js.map +0 -1
  63. package/dist/cjs/audio/AudioAdvanced.js.map +0 -1
  64. package/dist/cjs/audio/AudioBridge.js.map +0 -1
  65. package/dist/cjs/audio/AudioManager.js.map +0 -1
  66. package/dist/cjs/build-cloud/BuildOrchestration.js.map +0 -1
  67. package/dist/cjs/build-cloud/GodotBuildCloud.js.map +0 -1
  68. package/dist/cjs/build-cloud/UnityBuildCloud.js.map +0 -1
  69. package/dist/cjs/build-cloud/UnrealBuildCloud.js.map +0 -1
  70. package/dist/cjs/core/EventBus.js.map +0 -1
  71. package/dist/cjs/core/GameClock.js.map +0 -1
  72. package/dist/cjs/core/GameConfig.js.map +0 -1
  73. package/dist/cjs/core/GameLoop.js.map +0 -1
  74. package/dist/cjs/core/ServiceLocator.js.map +0 -1
  75. package/dist/cjs/core/Validation.js.map +0 -1
  76. package/dist/cjs/core/math.js.map +0 -1
  77. package/dist/cjs/devtools/DevTools.js.map +0 -1
  78. package/dist/cjs/devtools/DeveloperExperience.js.map +0 -1
  79. package/dist/cjs/devtools/GameplayAnalytics.js.map +0 -1
  80. package/dist/cjs/dialogue/DialogueSystem.js.map +0 -1
  81. package/dist/cjs/docs/DocGenerator.js.map +0 -1
  82. package/dist/cjs/ecs/World.js.map +0 -1
  83. package/dist/cjs/editor/AchievementEditor.js.map +0 -1
  84. package/dist/cjs/editor/AdvancedEditor.js.map +0 -1
  85. package/dist/cjs/editor/AnimationRetargeting.js.map +0 -1
  86. package/dist/cjs/editor/AssetBrowser.js.map +0 -1
  87. package/dist/cjs/editor/AssetManager.js.map +0 -1
  88. package/dist/cjs/editor/ConsolePro.js.map +0 -1
  89. package/dist/cjs/editor/CraftingEditor.js.map +0 -1
  90. package/dist/cjs/editor/DebugTools.js.map +0 -1
  91. package/dist/cjs/editor/DialogueSystem.js.map +0 -1
  92. package/dist/cjs/editor/LeaderboardSystem.js.map +0 -1
  93. package/dist/cjs/editor/NiceGameEditor.js.map +0 -1
  94. package/dist/cjs/editor/PrefabSystem.js.map +0 -1
  95. package/dist/cjs/editor/ProfilerPanel.js.map +0 -1
  96. package/dist/cjs/editor/QuestEditor.js.map +0 -1
  97. package/dist/cjs/editor/ReplaySystem.js.map +0 -1
  98. package/dist/cjs/editor/SceneEditor.js.map +0 -1
  99. package/dist/cjs/editor/ScreenshotMode.js.map +0 -1
  100. package/dist/cjs/editor/ShaderGraph.js.map +0 -1
  101. package/dist/cjs/editor/TimelineEditor.js.map +0 -1
  102. package/dist/cjs/editor/UndoRedoPro.js.map +0 -1
  103. package/dist/cjs/editor/VRARMode.js.map +0 -1
  104. package/dist/cjs/engine/NiceGameEngine.js.map +0 -1
  105. package/dist/cjs/engine/SaveSystem.js.map +0 -1
  106. package/dist/cjs/engine/SaveSystemV2.js +0 -530
  107. package/dist/cjs/engine/SaveSystemV2.js.map +0 -1
  108. package/dist/cjs/enterprise/Enterprise.js.map +0 -1
  109. package/dist/cjs/export/BevyExporter.js.map +0 -1
  110. package/dist/cjs/export/CocosExporter.js.map +0 -1
  111. package/dist/cjs/export/Construct3Exporter.js.map +0 -1
  112. package/dist/cjs/export/DefoldExporter.js.map +0 -1
  113. package/dist/cjs/export/GDevelopExporter.js.map +0 -1
  114. package/dist/cjs/export/GameMakerExporter.js.map +0 -1
  115. package/dist/cjs/export/GodotExporter.js.map +0 -1
  116. package/dist/cjs/export/MinecraftBedrockExporter.js.map +0 -1
  117. package/dist/cjs/export/MonoGameExporter.js.map +0 -1
  118. package/dist/cjs/export/Pico8Exporter.js.map +0 -1
  119. package/dist/cjs/export/PlatformExporter.js.map +0 -1
  120. package/dist/cjs/export/RPGMakerExporter.js.map +0 -1
  121. package/dist/cjs/export/RobloxExporter.js.map +0 -1
  122. package/dist/cjs/export/Solar2DExporter.js.map +0 -1
  123. package/dist/cjs/export/ThreeJSExporter.js.map +0 -1
  124. package/dist/cjs/export/Tic80Exporter.js.map +0 -1
  125. package/dist/cjs/export/UnityExporter.js.map +0 -1
  126. package/dist/cjs/export/UnrealExporter.js.map +0 -1
  127. package/dist/cjs/export/WebExporter.js.map +0 -1
  128. package/dist/cjs/export/index.js.map +0 -1
  129. package/dist/cjs/godot-integration/GodotAssetLibrary.js.map +0 -1
  130. package/dist/cjs/godot-integration/GodotImport.js.map +0 -1
  131. package/dist/cjs/godot-integration/GodotLiveLink.js.map +0 -1
  132. package/dist/cjs/godot-integration/components/GodotProjectBrowser.js.map +0 -1
  133. package/dist/cjs/i18n/I18n.js.map +0 -1
  134. package/dist/cjs/i18n/useTranslation.js.map +0 -1
  135. package/dist/cjs/import/AsepriteImporter.js.map +0 -1
  136. package/dist/cjs/import/DragonBonesImporter.js.map +0 -1
  137. package/dist/cjs/import/GameMakerImporter.js.map +0 -1
  138. package/dist/cjs/import/GodotSceneImporter.js.map +0 -1
  139. package/dist/cjs/import/LDtkImporter.js.map +0 -1
  140. package/dist/cjs/import/Live2DImporter.js.map +0 -1
  141. package/dist/cjs/import/NdgFormat.js.map +0 -1
  142. package/dist/cjs/import/OgmoImporter.js.map +0 -1
  143. package/dist/cjs/import/RPGMakerImporter.js.map +0 -1
  144. package/dist/cjs/import/SceneImporter.js.map +0 -1
  145. package/dist/cjs/import/SpineImporter.js.map +0 -1
  146. package/dist/cjs/import/SpriterImporter.js.map +0 -1
  147. package/dist/cjs/import/TiledMapImporter.js.map +0 -1
  148. package/dist/cjs/import/UnitySceneImporter.js.map +0 -1
  149. package/dist/cjs/import/index.js.map +0 -1
  150. package/dist/cjs/index.js.map +0 -1
  151. package/dist/cjs/input/GamepadNavigation.js.map +0 -1
  152. package/dist/cjs/input/InputManager.js.map +0 -1
  153. package/dist/cjs/input/useGamepads.js.map +0 -1
  154. package/dist/cjs/integration/IconSprite.js.map +0 -1
  155. package/dist/cjs/inventory/InventorySystem.js.map +0 -1
  156. package/dist/cjs/kids/KidMode.js.map +0 -1
  157. package/dist/cjs/kids/KidTools.js.map +0 -1
  158. package/dist/cjs/monetization/Monetization.js.map +0 -1
  159. package/dist/cjs/multiplayer/LocalMultiplayer.js.map +0 -1
  160. package/dist/cjs/multiplayer/MiniGameTypes.js.map +0 -1
  161. package/dist/cjs/native-engine/AssetPipeline.js.map +0 -1
  162. package/dist/cjs/native-engine/AudioEngine.js.map +0 -1
  163. package/dist/cjs/native-engine/InputSystem.js.map +0 -1
  164. package/dist/cjs/native-engine/NetworkingSystem.js.map +0 -1
  165. package/dist/cjs/native-engine/PhysicsEngine.js.map +0 -1
  166. package/dist/cjs/native-engine/RenderingEngine.js.map +0 -1
  167. package/dist/cjs/native-engine/SceneGraph.js.map +0 -1
  168. package/dist/cjs/network/MultiplayerTransport.js.map +0 -1
  169. package/dist/cjs/network/Networking.js.map +0 -1
  170. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/AbortController.js.map +0 -1
  171. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/AccessTokenHttpClient.js.map +0 -1
  172. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/DefaultHttpClient.js.map +0 -1
  173. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/DefaultReconnectPolicy.js.map +0 -1
  174. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/Errors.js.map +0 -1
  175. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/FetchHttpClient.js.map +0 -1
  176. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/HandshakeProtocol.js.map +0 -1
  177. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/HeaderNames.js.map +0 -1
  178. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/HttpClient.js.map +0 -1
  179. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/HttpConnection.js.map +0 -1
  180. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/HubConnection.js.map +0 -1
  181. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/HubConnectionBuilder.js.map +0 -1
  182. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/IHubProtocol.js.map +0 -1
  183. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/ILogger.js.map +0 -1
  184. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/ITransport.js.map +0 -1
  185. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/JsonHubProtocol.js.map +0 -1
  186. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/Loggers.js.map +0 -1
  187. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/LongPollingTransport.js.map +0 -1
  188. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/MessageBuffer.js.map +0 -1
  189. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/ServerSentEventsTransport.js.map +0 -1
  190. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/Subject.js.map +0 -1
  191. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/TextMessageFormat.js.map +0 -1
  192. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/Utils.js.map +0 -1
  193. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/WebSocketTransport.js.map +0 -1
  194. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/XhrHttpClient.js.map +0 -1
  195. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/index.js.map +0 -1
  196. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/pkg-version.js.map +0 -1
  197. package/dist/cjs/pathfinding/Pathfinding.js.map +0 -1
  198. package/dist/cjs/performance/AssetStreaming.js.map +0 -1
  199. package/dist/cjs/performance/BenchmarkSuite.js.map +0 -1
  200. package/dist/cjs/performance/DeltaCompression.js.map +0 -1
  201. package/dist/cjs/performance/DeterministicPhysics.js.map +0 -1
  202. package/dist/cjs/performance/ECSOptimization.js.map +0 -1
  203. package/dist/cjs/performance/GameSaveSystem.js.map +0 -1
  204. package/dist/cjs/performance/HotReload.js.map +0 -1
  205. package/dist/cjs/performance/InputRecording.js.map +0 -1
  206. package/dist/cjs/performance/InterestManagement.js.map +0 -1
  207. package/dist/cjs/performance/LocalizationRuntime.js.map +0 -1
  208. package/dist/cjs/performance/MemoryManagement.js.map +0 -1
  209. package/dist/cjs/performance/ModSupport.js.map +0 -1
  210. package/dist/cjs/performance/MultiThreadedPhysics.js.map +0 -1
  211. package/dist/cjs/performance/NetworkPrediction.js.map +0 -1
  212. package/dist/cjs/performance/ObjectPooling.js.map +0 -1
  213. package/dist/cjs/performance/Performance.js.map +0 -1
  214. package/dist/cjs/performance/PerformanceAdvanced.js.map +0 -1
  215. package/dist/cjs/performance/SaveSystem.js +0 -574
  216. package/dist/cjs/performance/SaveSystem.js.map +0 -1
  217. package/dist/cjs/performance/WebGPURenderer.js.map +0 -1
  218. package/dist/cjs/physics/PhysicsAdvanced.js.map +0 -1
  219. package/dist/cjs/physics/PhysicsEngine2D.js.map +0 -1
  220. package/dist/cjs/plugins/PluginSDK.js.map +0 -1
  221. package/dist/cjs/plugins/PluginTestKit.js.map +0 -1
  222. package/dist/cjs/procedural/Procedural.js.map +0 -1
  223. package/dist/cjs/procedural/WorldBuilding.js.map +0 -1
  224. package/dist/cjs/quest/QuestSystem.js.map +0 -1
  225. package/dist/cjs/release/MobileExport.js.map +0 -1
  226. package/dist/cjs/release/Release.js.map +0 -1
  227. package/dist/cjs/rendering/Camera2D.js.map +0 -1
  228. package/dist/cjs/rendering/Renderer2D.js.map +0 -1
  229. package/dist/cjs/rendering/WebGPURenderPipeline.js.map +0 -1
  230. package/dist/cjs/runtime3d/Runtime3D.js.map +0 -1
  231. package/dist/cjs/runtime3d/SceneEditor3D.js.map +0 -1
  232. package/dist/cjs/scene/SceneManager.js.map +0 -1
  233. package/dist/cjs/scripting/GraphToAST.js.map +0 -1
  234. package/dist/cjs/scripting/LanguageExporter.js.map +0 -1
  235. package/dist/cjs/scripting/NodeGraph.js.map +0 -1
  236. package/dist/cjs/scripting/ScriptAST.js.map +0 -1
  237. package/dist/cjs/scripting/VisualScripting2.js.map +0 -1
  238. package/dist/cjs/scripting/exporters/CSharpExporter.js.map +0 -1
  239. package/dist/cjs/scripting/exporters/GDScriptExporter.js.map +0 -1
  240. package/dist/cjs/scripting/exporters/LuaExporter.js.map +0 -1
  241. package/dist/cjs/scripting/exporters/PythonExporter.js.map +0 -1
  242. package/dist/cjs/scripting/exporters/RustExporter.js.map +0 -1
  243. package/dist/cjs/scripting/exporters/TypeScriptExporter.js.map +0 -1
  244. package/dist/cjs/social/Social.js.map +0 -1
  245. package/dist/cjs/systems/LightingSystem.js.map +0 -1
  246. package/dist/cjs/systems/ParticleSystem2.js.map +0 -1
  247. package/dist/cjs/systems/PhysicsDebugSystem.js.map +0 -1
  248. package/dist/cjs/systems/TerrainSystem.js.map +0 -1
  249. package/dist/cjs/templates/ActionTemplates.js.map +0 -1
  250. package/dist/cjs/templates/FightingTemplate.js.map +0 -1
  251. package/dist/cjs/templates/MetroidvaniaTemplate.js.map +0 -1
  252. package/dist/cjs/templates/PartyTemplates.js.map +0 -1
  253. package/dist/cjs/templates/PuzzleTemplates.js.map +0 -1
  254. package/dist/cjs/templates/RPGTemplates.js.map +0 -1
  255. package/dist/cjs/templates/SportsTemplates.js.map +0 -1
  256. package/dist/cjs/templates/StrategyTemplates.js.map +0 -1
  257. package/dist/cjs/templates/SurvivalTemplate.js.map +0 -1
  258. package/dist/cjs/templates/WaveDefense.js.map +0 -1
  259. package/dist/cjs/tilemap/Tilemap.js.map +0 -1
  260. package/dist/cjs/tutorials/TutorialBranching.js.map +0 -1
  261. package/dist/cjs/tutorials/TutorialEngine.js.map +0 -1
  262. package/dist/cjs/tutorials/TutorialOverlay.js.map +0 -1
  263. package/dist/cjs/tutorials/content/Tutorials_T05_T08.js.map +0 -1
  264. package/dist/cjs/tutorials/content/Tutorials_T09_T11.js.map +0 -1
  265. package/dist/cjs/tutorials/content/Tutorials_T12_T15.js.map +0 -1
  266. package/dist/cjs/ui/GameUI.js.map +0 -1
  267. package/dist/cjs/unity-integration/UnityAssetStore.js.map +0 -1
  268. package/dist/cjs/unity-integration/UnityImport.js.map +0 -1
  269. package/dist/cjs/unity-integration/UnityLiveLink.js.map +0 -1
  270. package/dist/cjs/unity-integration/components/UnityAssetStoreBrowser.js.map +0 -1
  271. package/dist/cjs/unity-integration/components/UnityProjectBrowser.js.map +0 -1
  272. package/dist/cjs/unreal-integration/UnrealImport.js.map +0 -1
  273. package/dist/cjs/unreal-integration/UnrealLiveLink.js.map +0 -1
  274. package/dist/cjs/unreal-integration/UnrealMarketplace.js.map +0 -1
  275. package/dist/cjs/unreal-integration/components/UnrealProjectBrowser.js.map +0 -1
  276. package/dist/cjs/xr/ARVR.js.map +0 -1
  277. package/dist/esm/accessibility/Accessibility.js.map +0 -1
  278. package/dist/esm/ai/AI.js.map +0 -1
  279. package/dist/esm/ai/BehaviorTree.js.map +0 -1
  280. package/dist/esm/ai/StateMachine.js.map +0 -1
  281. package/dist/esm/animation/Animation.js.map +0 -1
  282. package/dist/esm/audio/AudioAdvanced.js.map +0 -1
  283. package/dist/esm/audio/AudioBridge.js.map +0 -1
  284. package/dist/esm/audio/AudioManager.js.map +0 -1
  285. package/dist/esm/build-cloud/BuildOrchestration.js.map +0 -1
  286. package/dist/esm/build-cloud/GodotBuildCloud.js.map +0 -1
  287. package/dist/esm/build-cloud/UnityBuildCloud.js.map +0 -1
  288. package/dist/esm/build-cloud/UnrealBuildCloud.js.map +0 -1
  289. package/dist/esm/core/EventBus.js.map +0 -1
  290. package/dist/esm/core/GameClock.js.map +0 -1
  291. package/dist/esm/core/GameConfig.js.map +0 -1
  292. package/dist/esm/core/GameLoop.js.map +0 -1
  293. package/dist/esm/core/ServiceLocator.js.map +0 -1
  294. package/dist/esm/core/Validation.js.map +0 -1
  295. package/dist/esm/core/math.js.map +0 -1
  296. package/dist/esm/devtools/DevTools.js.map +0 -1
  297. package/dist/esm/devtools/DeveloperExperience.js.map +0 -1
  298. package/dist/esm/devtools/GameplayAnalytics.js.map +0 -1
  299. package/dist/esm/dialogue/DialogueSystem.js.map +0 -1
  300. package/dist/esm/docs/DocGenerator.js.map +0 -1
  301. package/dist/esm/ecs/World.js.map +0 -1
  302. package/dist/esm/editor/AchievementEditor.js.map +0 -1
  303. package/dist/esm/editor/AdvancedEditor.js.map +0 -1
  304. package/dist/esm/editor/AnimationRetargeting.js.map +0 -1
  305. package/dist/esm/editor/AssetBrowser.js.map +0 -1
  306. package/dist/esm/editor/AssetManager.js.map +0 -1
  307. package/dist/esm/editor/ConsolePro.js.map +0 -1
  308. package/dist/esm/editor/CraftingEditor.js.map +0 -1
  309. package/dist/esm/editor/DebugTools.js.map +0 -1
  310. package/dist/esm/editor/DialogueSystem.js.map +0 -1
  311. package/dist/esm/editor/LeaderboardSystem.js.map +0 -1
  312. package/dist/esm/editor/NiceGameEditor.js.map +0 -1
  313. package/dist/esm/editor/PrefabSystem.js.map +0 -1
  314. package/dist/esm/editor/ProfilerPanel.js.map +0 -1
  315. package/dist/esm/editor/QuestEditor.js.map +0 -1
  316. package/dist/esm/editor/ReplaySystem.js.map +0 -1
  317. package/dist/esm/editor/SceneEditor.js.map +0 -1
  318. package/dist/esm/editor/ScreenshotMode.js.map +0 -1
  319. package/dist/esm/editor/ShaderGraph.js.map +0 -1
  320. package/dist/esm/editor/TimelineEditor.js.map +0 -1
  321. package/dist/esm/editor/UndoRedoPro.js.map +0 -1
  322. package/dist/esm/editor/VRARMode.js.map +0 -1
  323. package/dist/esm/engine/NiceGameEngine.js.map +0 -1
  324. package/dist/esm/engine/SaveSystem.js.map +0 -1
  325. package/dist/esm/engine/SaveSystemV2.js +0 -523
  326. package/dist/esm/engine/SaveSystemV2.js.map +0 -1
  327. package/dist/esm/enterprise/Enterprise.js.map +0 -1
  328. package/dist/esm/export/BevyExporter.js.map +0 -1
  329. package/dist/esm/export/CocosExporter.js.map +0 -1
  330. package/dist/esm/export/Construct3Exporter.js.map +0 -1
  331. package/dist/esm/export/DefoldExporter.js.map +0 -1
  332. package/dist/esm/export/GDevelopExporter.js.map +0 -1
  333. package/dist/esm/export/GameMakerExporter.js.map +0 -1
  334. package/dist/esm/export/GodotExporter.js.map +0 -1
  335. package/dist/esm/export/MinecraftBedrockExporter.js.map +0 -1
  336. package/dist/esm/export/MonoGameExporter.js.map +0 -1
  337. package/dist/esm/export/Pico8Exporter.js.map +0 -1
  338. package/dist/esm/export/PlatformExporter.js.map +0 -1
  339. package/dist/esm/export/RPGMakerExporter.js.map +0 -1
  340. package/dist/esm/export/RobloxExporter.js.map +0 -1
  341. package/dist/esm/export/Solar2DExporter.js.map +0 -1
  342. package/dist/esm/export/ThreeJSExporter.js.map +0 -1
  343. package/dist/esm/export/Tic80Exporter.js.map +0 -1
  344. package/dist/esm/export/UnityExporter.js.map +0 -1
  345. package/dist/esm/export/UnrealExporter.js.map +0 -1
  346. package/dist/esm/export/WebExporter.js.map +0 -1
  347. package/dist/esm/export/index.js.map +0 -1
  348. package/dist/esm/godot-integration/GodotAssetLibrary.js.map +0 -1
  349. package/dist/esm/godot-integration/GodotImport.js.map +0 -1
  350. package/dist/esm/godot-integration/GodotLiveLink.js.map +0 -1
  351. package/dist/esm/godot-integration/components/GodotProjectBrowser.js.map +0 -1
  352. package/dist/esm/i18n/I18n.js.map +0 -1
  353. package/dist/esm/i18n/useTranslation.js.map +0 -1
  354. package/dist/esm/import/AsepriteImporter.js.map +0 -1
  355. package/dist/esm/import/DragonBonesImporter.js.map +0 -1
  356. package/dist/esm/import/GameMakerImporter.js.map +0 -1
  357. package/dist/esm/import/GodotSceneImporter.js.map +0 -1
  358. package/dist/esm/import/LDtkImporter.js.map +0 -1
  359. package/dist/esm/import/Live2DImporter.js.map +0 -1
  360. package/dist/esm/import/NdgFormat.js.map +0 -1
  361. package/dist/esm/import/OgmoImporter.js.map +0 -1
  362. package/dist/esm/import/RPGMakerImporter.js.map +0 -1
  363. package/dist/esm/import/SceneImporter.js.map +0 -1
  364. package/dist/esm/import/SpineImporter.js.map +0 -1
  365. package/dist/esm/import/SpriterImporter.js.map +0 -1
  366. package/dist/esm/import/TiledMapImporter.js.map +0 -1
  367. package/dist/esm/import/UnitySceneImporter.js.map +0 -1
  368. package/dist/esm/import/index.js.map +0 -1
  369. package/dist/esm/index.js.map +0 -1
  370. package/dist/esm/input/GamepadNavigation.js.map +0 -1
  371. package/dist/esm/input/InputManager.js.map +0 -1
  372. package/dist/esm/input/useGamepads.js.map +0 -1
  373. package/dist/esm/integration/IconSprite.js.map +0 -1
  374. package/dist/esm/inventory/InventorySystem.js.map +0 -1
  375. package/dist/esm/kids/KidMode.js.map +0 -1
  376. package/dist/esm/kids/KidTools.js.map +0 -1
  377. package/dist/esm/monetization/Monetization.js.map +0 -1
  378. package/dist/esm/multiplayer/LocalMultiplayer.js.map +0 -1
  379. package/dist/esm/multiplayer/MiniGameTypes.js.map +0 -1
  380. package/dist/esm/native-engine/AssetPipeline.js.map +0 -1
  381. package/dist/esm/native-engine/AudioEngine.js.map +0 -1
  382. package/dist/esm/native-engine/InputSystem.js.map +0 -1
  383. package/dist/esm/native-engine/NetworkingSystem.js.map +0 -1
  384. package/dist/esm/native-engine/PhysicsEngine.js.map +0 -1
  385. package/dist/esm/native-engine/RenderingEngine.js.map +0 -1
  386. package/dist/esm/native-engine/SceneGraph.js.map +0 -1
  387. package/dist/esm/network/MultiplayerTransport.js.map +0 -1
  388. package/dist/esm/network/Networking.js.map +0 -1
  389. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/AbortController.js.map +0 -1
  390. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/AccessTokenHttpClient.js.map +0 -1
  391. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/DefaultHttpClient.js.map +0 -1
  392. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/DefaultReconnectPolicy.js.map +0 -1
  393. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/Errors.js.map +0 -1
  394. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/FetchHttpClient.js.map +0 -1
  395. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/HandshakeProtocol.js.map +0 -1
  396. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/HeaderNames.js.map +0 -1
  397. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/HttpClient.js.map +0 -1
  398. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/HttpConnection.js.map +0 -1
  399. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/HubConnection.js.map +0 -1
  400. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/HubConnectionBuilder.js.map +0 -1
  401. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/IHubProtocol.js.map +0 -1
  402. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/ILogger.js.map +0 -1
  403. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/ITransport.js.map +0 -1
  404. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/JsonHubProtocol.js.map +0 -1
  405. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/Loggers.js.map +0 -1
  406. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/LongPollingTransport.js.map +0 -1
  407. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/MessageBuffer.js.map +0 -1
  408. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/ServerSentEventsTransport.js.map +0 -1
  409. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/Subject.js.map +0 -1
  410. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/TextMessageFormat.js.map +0 -1
  411. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/Utils.js.map +0 -1
  412. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/WebSocketTransport.js.map +0 -1
  413. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/XhrHttpClient.js.map +0 -1
  414. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/index.js.map +0 -1
  415. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/pkg-version.js.map +0 -1
  416. package/dist/esm/pathfinding/Pathfinding.js.map +0 -1
  417. package/dist/esm/performance/AssetStreaming.js.map +0 -1
  418. package/dist/esm/performance/BenchmarkSuite.js.map +0 -1
  419. package/dist/esm/performance/DeltaCompression.js.map +0 -1
  420. package/dist/esm/performance/DeterministicPhysics.js.map +0 -1
  421. package/dist/esm/performance/ECSOptimization.js.map +0 -1
  422. package/dist/esm/performance/GameSaveSystem.js.map +0 -1
  423. package/dist/esm/performance/HotReload.js.map +0 -1
  424. package/dist/esm/performance/InputRecording.js.map +0 -1
  425. package/dist/esm/performance/InterestManagement.js.map +0 -1
  426. package/dist/esm/performance/LocalizationRuntime.js.map +0 -1
  427. package/dist/esm/performance/MemoryManagement.js.map +0 -1
  428. package/dist/esm/performance/ModSupport.js.map +0 -1
  429. package/dist/esm/performance/MultiThreadedPhysics.js.map +0 -1
  430. package/dist/esm/performance/NetworkPrediction.js.map +0 -1
  431. package/dist/esm/performance/ObjectPooling.js.map +0 -1
  432. package/dist/esm/performance/Performance.js.map +0 -1
  433. package/dist/esm/performance/PerformanceAdvanced.js.map +0 -1
  434. package/dist/esm/performance/SaveSystem.js +0 -567
  435. package/dist/esm/performance/SaveSystem.js.map +0 -1
  436. package/dist/esm/performance/WebGPURenderer.js.map +0 -1
  437. package/dist/esm/physics/PhysicsAdvanced.js.map +0 -1
  438. package/dist/esm/physics/PhysicsEngine2D.js.map +0 -1
  439. package/dist/esm/plugins/PluginSDK.js.map +0 -1
  440. package/dist/esm/plugins/PluginTestKit.js.map +0 -1
  441. package/dist/esm/procedural/Procedural.js.map +0 -1
  442. package/dist/esm/procedural/WorldBuilding.js.map +0 -1
  443. package/dist/esm/quest/QuestSystem.js.map +0 -1
  444. package/dist/esm/release/MobileExport.js.map +0 -1
  445. package/dist/esm/release/Release.js.map +0 -1
  446. package/dist/esm/rendering/Camera2D.js.map +0 -1
  447. package/dist/esm/rendering/Renderer2D.js.map +0 -1
  448. package/dist/esm/rendering/WebGPURenderPipeline.js.map +0 -1
  449. package/dist/esm/runtime3d/Runtime3D.js.map +0 -1
  450. package/dist/esm/runtime3d/SceneEditor3D.js.map +0 -1
  451. package/dist/esm/scene/SceneManager.js.map +0 -1
  452. package/dist/esm/scripting/GraphToAST.js.map +0 -1
  453. package/dist/esm/scripting/LanguageExporter.js.map +0 -1
  454. package/dist/esm/scripting/NodeGraph.js.map +0 -1
  455. package/dist/esm/scripting/ScriptAST.js.map +0 -1
  456. package/dist/esm/scripting/VisualScripting2.js.map +0 -1
  457. package/dist/esm/scripting/exporters/CSharpExporter.js.map +0 -1
  458. package/dist/esm/scripting/exporters/GDScriptExporter.js.map +0 -1
  459. package/dist/esm/scripting/exporters/LuaExporter.js.map +0 -1
  460. package/dist/esm/scripting/exporters/PythonExporter.js.map +0 -1
  461. package/dist/esm/scripting/exporters/RustExporter.js.map +0 -1
  462. package/dist/esm/scripting/exporters/TypeScriptExporter.js.map +0 -1
  463. package/dist/esm/social/Social.js.map +0 -1
  464. package/dist/esm/systems/LightingSystem.js.map +0 -1
  465. package/dist/esm/systems/ParticleSystem2.js.map +0 -1
  466. package/dist/esm/systems/PhysicsDebugSystem.js.map +0 -1
  467. package/dist/esm/systems/TerrainSystem.js.map +0 -1
  468. package/dist/esm/templates/ActionTemplates.js.map +0 -1
  469. package/dist/esm/templates/FightingTemplate.js.map +0 -1
  470. package/dist/esm/templates/MetroidvaniaTemplate.js.map +0 -1
  471. package/dist/esm/templates/PartyTemplates.js.map +0 -1
  472. package/dist/esm/templates/PuzzleTemplates.js.map +0 -1
  473. package/dist/esm/templates/RPGTemplates.js.map +0 -1
  474. package/dist/esm/templates/SportsTemplates.js.map +0 -1
  475. package/dist/esm/templates/StrategyTemplates.js.map +0 -1
  476. package/dist/esm/templates/SurvivalTemplate.js.map +0 -1
  477. package/dist/esm/templates/WaveDefense.js.map +0 -1
  478. package/dist/esm/tilemap/Tilemap.js.map +0 -1
  479. package/dist/esm/tutorials/TutorialBranching.js.map +0 -1
  480. package/dist/esm/tutorials/TutorialEngine.js.map +0 -1
  481. package/dist/esm/tutorials/TutorialOverlay.js.map +0 -1
  482. package/dist/esm/tutorials/content/Tutorials_T05_T08.js.map +0 -1
  483. package/dist/esm/tutorials/content/Tutorials_T09_T11.js.map +0 -1
  484. package/dist/esm/tutorials/content/Tutorials_T12_T15.js.map +0 -1
  485. package/dist/esm/ui/GameUI.js.map +0 -1
  486. package/dist/esm/unity-integration/UnityAssetStore.js.map +0 -1
  487. package/dist/esm/unity-integration/UnityImport.js.map +0 -1
  488. package/dist/esm/unity-integration/UnityLiveLink.js.map +0 -1
  489. package/dist/esm/unity-integration/components/UnityAssetStoreBrowser.js.map +0 -1
  490. package/dist/esm/unity-integration/components/UnityProjectBrowser.js.map +0 -1
  491. package/dist/esm/unreal-integration/UnrealImport.js.map +0 -1
  492. package/dist/esm/unreal-integration/UnrealLiveLink.js.map +0 -1
  493. package/dist/esm/unreal-integration/UnrealMarketplace.js.map +0 -1
  494. package/dist/esm/unreal-integration/components/UnrealProjectBrowser.js.map +0 -1
  495. package/dist/esm/xr/ARVR.js.map +0 -1
  496. package/dist/types/engine/SaveSystemV2.d.ts +0 -155
@@ -1,8 +1,9 @@
1
1
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
- import { NiceTutorialButton, resolveTutorial } from '@nice2dev/ui';
2
+ import { NiceTutorialButton, resolveTutorial, NiceIcon } from '@nice2dev/ui';
3
3
  import React, { createContext, useReducer, useRef, useState, useCallback, useMemo, useContext, useEffect } from 'react';
4
4
  import { EventBus } from '../core/EventBus.js';
5
5
  import { World } from '../ecs/World.js';
6
+ import { useTranslation } from '../i18n/useTranslation.js';
6
7
  import { SceneManager } from '../scene/SceneManager.js';
7
8
 
8
9
  class UndoStack {
@@ -163,6 +164,7 @@ const GAME_EDITOR_TOUR = [
163
164
  },
164
165
  ];
165
166
  const NiceGameEditor = ({ project, onSave, className, style, tutorial, }) => {
167
+ const { t: tr } = useTranslation('engine');
166
168
  const [state, dispatch] = useReducer(editorReducer, DEFAULT_STATE);
167
169
  const worldRef = useRef(new World());
168
170
  const undoRef = useRef(new UndoStack());
@@ -335,7 +337,7 @@ const NiceGameEditor = ({ project, onSave, className, style, tutorial, }) => {
335
337
  fontSize: 13,
336
338
  position: 'relative',
337
339
  ...style,
338
- }, children: [jsx("span", { style: { position: 'absolute', top: 6, right: 6, zIndex: 30 }, children: jsx(NiceTutorialButton, { steps: resolveTutorial(tutorial, GAME_EDITOR_TOUR) }) }), jsx(EditorToolbar, {}), jsxs("div", { style: { display: 'flex', flex: 1, overflow: 'hidden' }, children: [state.panels.find((p) => p.id === 'hierarchy')?.visible && (jsx(EditorPanelContainer, { title: "Hierarchy", width: 250, position: "left", children: jsx(HierarchyPanel, {}) })), jsx("div", { style: { flex: 1, position: 'relative', overflow: 'hidden' }, children: jsx(EditorViewport, {}) }), state.panels.find((p) => p.id === 'inspector')?.visible && (jsx(EditorPanelContainer, { title: "Inspector", width: 300, position: "right", children: jsx(InspectorPanel, {}) }))] }), jsxs("div", { style: { display: 'flex', borderTop: '1px solid #45475a' }, children: [state.panels.find((p) => p.id === 'assets')?.visible && (jsx(EditorPanelContainer, { title: "Assets", height: 180, position: "bottom", children: jsx(AssetPanel, {}) })), state.panels.find((p) => p.id === 'console')?.visible && (jsx(EditorPanelContainer, { title: "Console", height: 180, position: "bottom", children: jsx(ConsolePanel, {}) }))] })] }) }));
340
+ }, children: [jsx("span", { style: { position: 'absolute', top: 6, right: 6, zIndex: 30 }, children: jsx(NiceTutorialButton, { steps: resolveTutorial(tutorial, GAME_EDITOR_TOUR) }) }), jsx(EditorToolbar, {}), jsxs("div", { style: { display: 'flex', flex: 1, overflow: 'hidden' }, children: [state.panels.find((p) => p.id === 'hierarchy')?.visible && (jsx(EditorPanelContainer, { title: tr('editor.panels.hierarchy'), width: 250, position: "left", children: jsx(HierarchyPanel, {}) })), jsx("div", { style: { flex: 1, position: 'relative', overflow: 'hidden' }, children: jsx(EditorViewport, {}) }), state.panels.find((p) => p.id === 'inspector')?.visible && (jsx(EditorPanelContainer, { title: tr('editor.panels.inspector'), width: 300, position: "right", children: jsx(InspectorPanel, {}) }))] }), jsxs("div", { style: { display: 'flex', borderTop: '1px solid #45475a' }, children: [state.panels.find((p) => p.id === 'assets')?.visible && (jsx(EditorPanelContainer, { title: tr('editor.panels.assets'), height: 180, position: "bottom", children: jsx(AssetPanel, {}) })), state.panels.find((p) => p.id === 'console')?.visible && (jsx(EditorPanelContainer, { title: tr('editor.panels.console'), height: 180, position: "bottom", children: jsx(ConsolePanel, {}) }))] })] }) }));
339
341
  };
340
342
  /* ── Helpers ───────────────────────────────────────────────────── */
341
343
  function getEntityBounds(entityId, world) {
@@ -410,29 +412,33 @@ function colorToHex(c) {
410
412
  .padStart(2, '0');
411
413
  return `#${r}${g}${b}`;
412
414
  }
415
+ /** `label` is also the name given to a created entity, so it stays English (A3);
416
+ * `key` is what the button shows. */
413
417
  const ENTITY_PRESETS = [
414
- { label: 'Empty', icon: '○', components: ['Transform'] },
415
- { label: 'Sprite', icon: '🖼', components: ['Transform', 'Sprite'] },
416
- { label: 'Shape', icon: '■', components: ['Transform', 'Shape'] },
417
- { label: 'Text', icon: 'T', components: ['Transform', 'Text'] },
418
+ { key: 'empty', label: 'Empty', icon: 'circle', components: ['Transform'] },
419
+ { key: 'sprite', label: 'Sprite', icon: 'image', components: ['Transform', 'Sprite'] },
420
+ { key: 'shape', label: 'Shape', icon: 'square', components: ['Transform', 'Shape'] },
421
+ { key: 'text', label: 'Text', icon: 'type', components: ['Transform', 'Text'] },
418
422
  {
423
+ key: 'physicsBody',
419
424
  label: 'Physics Body',
420
- icon: '⚡',
425
+ icon: 'zap',
421
426
  components: ['Transform', 'Shape', 'Collider2D', 'RigidBody2D'],
422
427
  },
423
- { label: 'Camera', icon: '📷', components: ['Transform', 'CameraTarget'] },
428
+ { key: 'camera', label: 'Camera', icon: 'camera', components: ['Transform', 'CameraTarget'] },
424
429
  ];
425
430
  /* ── Sub-components ───────────────────────────────────────────── */
426
431
  const EditorToolbar = () => {
432
+ const { t: tr } = useTranslation('engine');
427
433
  const { state, dispatch, createNewEntity, undoStack } = useEditor();
428
434
  const [showAddMenu, setShowAddMenu] = useState(false);
429
435
  const tools = ['select', 'move', 'rotate', 'scale', 'pan'];
430
436
  const toolIcons = {
431
- select: '⊕',
432
- move: '✥',
433
- rotate: '↻',
434
- scale: '⇲',
435
- pan: '✋',
437
+ select: 'cursor',
438
+ move: 'move',
439
+ rotate: 'refresh',
440
+ scale: 'expand',
441
+ pan: 'grip',
436
442
  };
437
443
  const btnStyle = (active) => ({
438
444
  background: active ? '#585b70' : 'transparent',
@@ -450,7 +456,7 @@ const EditorToolbar = () => {
450
456
  padding: '4px 8px',
451
457
  borderBottom: '1px solid #45475a',
452
458
  backgroundColor: '#181825',
453
- }, children: [tools.map((t) => (jsx("button", { onClick: () => dispatch({ type: 'SET_TOOL', tool: t }), style: btnStyle(state.tool === t), title: `${t} (${t[0].toUpperCase()})`, children: toolIcons[t] }, t))), jsx("div", { style: { width: 1, height: 20, background: '#45475a', margin: '0 4px' } }), jsxs("div", { style: { position: 'relative' }, children: [jsx("button", { onClick: () => setShowAddMenu(!showAddMenu), style: {
459
+ }, children: [tools.map((t) => (jsx("button", { onClick: () => dispatch({ type: 'SET_TOOL', tool: t }), style: btnStyle(state.tool === t), title: `${tr(`editor.tools.${t}`)} (${t[0].toUpperCase()})`, children: jsx(NiceIcon, { name: toolIcons[t], size: 14 }) }, t))), jsx("div", { style: { width: 1, height: 20, background: '#45475a', margin: '0 4px' } }), jsxs("div", { style: { position: 'relative' }, children: [jsx("button", { onClick: () => setShowAddMenu(!showAddMenu), style: {
454
460
  ...btnStyle(false),
455
461
  fontSize: 12,
456
462
  padding: '4px 10px',
@@ -481,10 +487,10 @@ const EditorToolbar = () => {
481
487
  cursor: 'pointer',
482
488
  borderRadius: 2,
483
489
  fontSize: 12,
484
- }, children: [p.icon, " ", p.label] }, p.label))) }))] }), jsx("div", { style: { width: 1, height: 20, background: '#45475a', margin: '0 4px' } }), jsx("button", { onClick: () => dispatch({ type: 'SET_MODE', mode: state.mode === 'play' ? 'edit' : 'play' }), style: btnStyle(state.mode === 'play'), title: "Play/Stop", children: state.mode === 'play' ? '⏹' : '▶' }), jsx("button", { onClick: () => dispatch({ type: 'SET_MODE', mode: state.mode === 'pause' ? 'play' : 'pause' }), style: btnStyle(state.mode === 'pause'), title: "Pause", disabled: state.mode === 'edit', children: "\u23F8" }), jsx("div", { style: { width: 1, height: 20, background: '#45475a', margin: '0 4px' } }), jsx("button", { onClick: () => undoStack.undo(), style: btnStyle(false), title: "Undo (Ctrl+Z)", disabled: !undoStack.canUndo, children: "\u21A9" }), jsx("button", { onClick: () => undoStack.redo(), style: btnStyle(false), title: "Redo (Ctrl+Y)", disabled: !undoStack.canRedo, children: "\u21AA" }), jsx("div", { style: { width: 1, height: 20, background: '#45475a', margin: '0 4px' } }), jsx("button", { onClick: () => dispatch({ type: 'SET_ZOOM', zoom: state.zoom * 0.8 }), style: btnStyle(false), title: "Zoom Out", children: "\u2212" }), jsxs("span", { style: { fontSize: 11, minWidth: 40, textAlign: 'center' }, children: [(state.zoom * 100) | 0, "%"] }), jsx("button", { onClick: () => dispatch({ type: 'SET_ZOOM', zoom: state.zoom * 1.25 }), style: btnStyle(false), title: "Zoom In", children: "+" }), jsx("button", { onClick: () => {
490
+ }, children: [jsx(NiceIcon, { name: p.icon, size: 12 }), " ", tr(`editor.entity.${p.key}`)] }, p.label))) }))] }), jsx("div", { style: { width: 1, height: 20, background: '#45475a', margin: '0 4px' } }), jsx("button", { onClick: () => dispatch({ type: 'SET_MODE', mode: state.mode === 'play' ? 'edit' : 'play' }), style: btnStyle(state.mode === 'play'), title: tr('editor.view.playStop'), children: jsx(NiceIcon, { name: state.mode === 'play' ? 'stop' : 'play', size: 14 }) }), jsx("button", { onClick: () => dispatch({ type: 'SET_MODE', mode: state.mode === 'pause' ? 'play' : 'pause' }), style: btnStyle(state.mode === 'pause'), title: tr('editor.actions.pause'), disabled: state.mode === 'edit', children: jsx(NiceIcon, { name: "pause", size: 14 }) }), jsx("div", { style: { width: 1, height: 20, background: '#45475a', margin: '0 4px' } }), jsx("button", { onClick: () => undoStack.undo(), style: btnStyle(false), title: `${tr('editor.actions.undo')} (Ctrl+Z)`, disabled: !undoStack.canUndo, children: jsx(NiceIcon, { name: "undo", size: 14 }) }), jsx("button", { onClick: () => undoStack.redo(), style: btnStyle(false), title: `${tr('editor.actions.redo')} (Ctrl+Y)`, disabled: !undoStack.canRedo, children: jsx(NiceIcon, { name: "redo", size: 14 }) }), jsx("div", { style: { width: 1, height: 20, background: '#45475a', margin: '0 4px' } }), jsx("button", { onClick: () => dispatch({ type: 'SET_ZOOM', zoom: state.zoom * 0.8 }), style: btnStyle(false), title: tr('editor.view.zoomOut'), children: "\u2212" }), jsxs("span", { style: { fontSize: 11, minWidth: 40, textAlign: 'center' }, children: [(state.zoom * 100) | 0, "%"] }), jsx("button", { onClick: () => dispatch({ type: 'SET_ZOOM', zoom: state.zoom * 1.25 }), style: btnStyle(false), title: tr('editor.view.zoomIn'), children: "+" }), jsx("button", { onClick: () => {
485
491
  dispatch({ type: 'SET_ZOOM', zoom: 1 });
486
492
  dispatch({ type: 'SET_PAN', offset: { x: 0, y: 0 } });
487
- }, style: btnStyle(false), title: "Reset View", children: "\u2302" }), jsx("div", { style: { width: 1, height: 20, background: '#45475a', margin: '0 4px' } }), jsx("button", { onClick: () => dispatch({ type: 'TOGGLE_GRID' }), style: btnStyle(state.showGrid), title: "Toggle Grid (Ctrl+G)", children: "\u25A6" }), jsx("button", { onClick: () => dispatch({ type: 'TOGGLE_SNAP' }), style: btnStyle(state.snapToGrid), title: "Toggle Snap", children: "\u229E" }), jsx("div", { style: { flex: 1 } }), jsxs("span", { style: { fontSize: 11, opacity: 0.6 }, children: [state.mode.toUpperCase(), " | ", state.tool, " | ", state.dirty ? '● Unsaved' : '✓ Saved'] })] }));
493
+ }, style: btnStyle(false), title: tr('editor.view.resetView'), children: jsx(NiceIcon, { name: "home", size: 14 }) }), jsx("div", { style: { width: 1, height: 20, background: '#45475a', margin: '0 4px' } }), jsx("button", { onClick: () => dispatch({ type: 'TOGGLE_GRID' }), style: btnStyle(state.showGrid), title: `${tr('editor.view.toggleGrid')} (Ctrl+G)`, children: jsx(NiceIcon, { name: "grid", size: 14 }) }), jsx("button", { onClick: () => dispatch({ type: 'TOGGLE_SNAP' }), style: btnStyle(state.snapToGrid), title: tr('editor.view.toggleSnap'), children: jsx(NiceIcon, { name: "target", size: 14 }) }), jsx("div", { style: { flex: 1 } }), jsxs("span", { style: { fontSize: 11, opacity: 0.6 }, children: [state.mode.toUpperCase(), " | ", state.tool, " | ", state.dirty ? 'Unsaved' : 'Saved'] })] }));
488
494
  };
489
495
  const EditorPanelContainer = ({ title, width, height, position, children }) => {
490
496
  const isHorizontal = position === 'bottom';
@@ -509,28 +515,29 @@ const EditorPanelContainer = ({ title, width, height, position, children }) => {
509
515
  }, children: title }), jsx("div", { style: { flex: 1, overflow: 'auto', padding: 4 }, children: children })] }));
510
516
  };
511
517
  const HierarchyPanel = () => {
518
+ const { t: tr } = useTranslation('engine');
512
519
  const { world, state, dispatch, createNewEntity, refreshWorld, addLog } = useEditor();
513
520
  const entities = world.allEntities().filter((e) => e.parent == null);
514
521
  const getIcon = (id) => {
515
522
  if (world.hasComponent(id, 'CameraTarget')) {
516
- return '📷';
523
+ return 'camera';
517
524
  }
518
525
  if (world.hasComponent(id, 'Sprite')) {
519
- return '🖼';
526
+ return 'image';
520
527
  }
521
528
  if (world.hasComponent(id, 'Text')) {
522
- return 'T';
529
+ return 'type';
523
530
  }
524
531
  if (world.hasComponent(id, 'Shape')) {
525
- return '■';
532
+ return 'square';
526
533
  }
527
534
  if (world.hasComponent(id, 'ParticleEmitter')) {
528
- return '✨';
535
+ return 'star';
529
536
  }
530
537
  if (world.hasComponent(id, 'AudioSource')) {
531
- return '🔊';
538
+ return 'volume';
532
539
  }
533
- return '○';
540
+ return 'circle';
534
541
  };
535
542
  const renderEntity = (e, depth) => {
536
543
  const isSelected = state.selectedEntities.includes(e.id);
@@ -545,7 +552,7 @@ const HierarchyPanel = () => {
545
552
  alignItems: 'center',
546
553
  gap: 4,
547
554
  fontSize: 12,
548
- }, children: [jsx("span", { style: { fontSize: 10, width: 14, textAlign: 'center' }, children: getIcon(e.id) }), jsx("span", { style: { flex: 1 }, children: e.name }), jsxs("span", { style: { opacity: 0.3, fontSize: 10 }, children: ["#", e.id] })] }), children.map((c) => renderEntity(c, depth + 1))] }, e.id));
555
+ }, children: [jsx("span", { style: { width: 14, display: 'inline-flex', justifyContent: 'center' }, children: jsx(NiceIcon, { name: getIcon(e.id), size: 12 }) }), jsx("span", { style: { flex: 1 }, children: e.name }), jsxs("span", { style: { opacity: 0.3, fontSize: 10 }, children: ["#", e.id] })] }), children.map((c) => renderEntity(c, depth + 1))] }, e.id));
549
556
  };
550
557
  return (jsxs("div", { children: [jsxs("div", { style: {
551
558
  padding: '2px 6px',
@@ -560,7 +567,7 @@ const HierarchyPanel = () => {
560
567
  color: '#a6adc8',
561
568
  cursor: 'pointer',
562
569
  fontSize: 10,
563
- }, title: "Add Entity", children: "+" }), jsx("button", { onClick: () => {
570
+ }, title: tr('editor.assets.addEntity'), children: "+" }), jsx("button", { onClick: () => {
564
571
  if (state.selectedEntities.length > 0) {
565
572
  const id = state.selectedEntities[0];
566
573
  const child = world.createEntity('Child');
@@ -577,7 +584,7 @@ const HierarchyPanel = () => {
577
584
  color: '#a6adc8',
578
585
  cursor: 'pointer',
579
586
  fontSize: 10,
580
- }, title: "Add Child", disabled: state.selectedEntities.length === 0, children: "\u21B3+" }), jsx("span", { style: { flex: 1 } }), jsxs("span", { style: { color: '#6c7086' }, children: [world.entityCount, " entities"] })] }), entities.map((e) => renderEntity(e, 0))] }));
587
+ }, title: tr('editor.assets.addChild'), disabled: state.selectedEntities.length === 0, children: jsx(NiceIcon, { name: "plus", size: 12 }) }), jsx("span", { style: { flex: 1 } }), jsxs("span", { style: { color: '#6c7086' }, children: [world.entityCount, " entities"] })] }), entities.map((e) => renderEntity(e, 0))] }));
581
588
  };
582
589
  /* ── Inspector sub-editors ─────────────────────────────────────── */
583
590
  const fieldStyle = {
@@ -615,6 +622,7 @@ const TransformEditor = ({ entityId }) => {
615
622
  }) })] }));
616
623
  };
617
624
  const ShapeEditor = ({ entityId }) => {
625
+ const { t: tr } = useTranslation('engine');
618
626
  const { world, refreshWorld, dispatch } = useEditor();
619
627
  const s = world.getComponent(entityId, 'Shape');
620
628
  if (!s) {
@@ -625,10 +633,10 @@ const ShapeEditor = ({ entityId }) => {
625
633
  dispatch({ type: 'MARK_DIRTY' });
626
634
  refreshWorld();
627
635
  };
628
- return (jsxs(Fragment, { children: [jsxs("div", { style: { display: 'flex', alignItems: 'center', gap: 4, marginBottom: 2 }, children: [jsx("span", { style: { fontSize: 10, minWidth: 50, color: '#a6adc8' }, children: "Shape" }), jsxs("select", { value: s.shape, onChange: (e) => update(() => {
636
+ return (jsxs(Fragment, { children: [jsxs("div", { style: { display: 'flex', alignItems: 'center', gap: 4, marginBottom: 2 }, children: [jsx("span", { style: { fontSize: 10, minWidth: 50, color: '#a6adc8' }, children: tr('editor.fields.shape') }), jsxs("select", { value: s.shape, onChange: (e) => update(() => {
629
637
  // eslint-disable-next-line @typescript-eslint/no-explicit-any -- mutates discriminated-union variant; consumer narrows by `s.shape`
630
638
  s.shape = e.target.value;
631
- }), style: { ...fieldStyle, flex: 1 }, children: [jsx("option", { value: "rect", children: "Rectangle" }), jsx("option", { value: "circle", children: "Circle" }), jsx("option", { value: "polygon", children: "Polygon" }), jsx("option", { value: "line", children: "Line" })] })] }), s.shape !== 'circle' && (jsx(NumField, { label: "Width", value: s.width, onChange: (v) => update(() => {
639
+ }), style: { ...fieldStyle, flex: 1 }, children: [jsx("option", { value: "rect", children: tr('editor.shape.rect') }), jsx("option", { value: "circle", children: tr('editor.shape.circle') }), jsx("option", { value: "polygon", children: tr('editor.shape.polygon') }), jsx("option", { value: "line", children: tr('editor.shape.line') })] })] }), s.shape !== 'circle' && (jsx(NumField, { label: "Width", value: s.width, onChange: (v) => update(() => {
632
640
  s.width = v;
633
641
  }) })), s.shape !== 'circle' && (jsx(NumField, { label: "Height", value: s.height, onChange: (v) => update(() => {
634
642
  s.height = v;
@@ -643,6 +651,7 @@ const ShapeEditor = ({ entityId }) => {
643
651
  }) })] }));
644
652
  };
645
653
  const SpriteEditor = ({ entityId }) => {
654
+ const { t: tr } = useTranslation('engine');
646
655
  const { world, refreshWorld, dispatch } = useEditor();
647
656
  const s = world.getComponent(entityId, 'Sprite');
648
657
  if (!s) {
@@ -663,11 +672,12 @@ const SpriteEditor = ({ entityId }) => {
663
672
  s.opacity = Math.max(0, Math.min(1, v));
664
673
  }) }), jsx(NumField, { label: "Layer", value: s.layer, step: 1, onChange: (v) => update(() => {
665
674
  s.layer = v;
666
- }) }), jsxs("div", { style: { display: 'flex', alignItems: 'center', gap: 4, marginBottom: 2 }, children: [jsx("span", { style: { fontSize: 10, minWidth: 50, color: '#a6adc8' }, children: "Visible" }), jsx("input", { type: "checkbox", checked: s.visible, onChange: (e) => update(() => {
675
+ }) }), jsxs("div", { style: { display: 'flex', alignItems: 'center', gap: 4, marginBottom: 2 }, children: [jsx("span", { style: { fontSize: 10, minWidth: 50, color: '#a6adc8' }, children: tr('editor.fields.visible') }), jsx("input", { type: "checkbox", checked: s.visible, onChange: (e) => update(() => {
667
676
  s.visible = e.target.checked;
668
677
  }) })] })] }));
669
678
  };
670
679
  const TextEditor = ({ entityId }) => {
680
+ const { t: tr } = useTranslation('engine');
671
681
  const { world, refreshWorld, dispatch } = useEditor();
672
682
  const t = world.getComponent(entityId, 'Text');
673
683
  if (!t) {
@@ -678,17 +688,18 @@ const TextEditor = ({ entityId }) => {
678
688
  dispatch({ type: 'MARK_DIRTY' });
679
689
  refreshWorld();
680
690
  };
681
- return (jsxs(Fragment, { children: [jsxs("div", { style: { marginBottom: 2 }, children: [jsx("span", { style: { fontSize: 10, color: '#a6adc8' }, children: "Text" }), jsx("input", { type: "text", value: t.text, onChange: (e) => update(() => {
691
+ return (jsxs(Fragment, { children: [jsxs("div", { style: { marginBottom: 2 }, children: [jsx("span", { style: { fontSize: 10, color: '#a6adc8' }, children: tr('editor.fields.text') }), jsx("input", { type: "text", value: t.text, onChange: (e) => update(() => {
682
692
  t.text = e.target.value;
683
693
  }), style: { ...fieldStyle, width: '100%' } })] }), jsx(NumField, { label: "Font Size", value: t.fontSize, onChange: (v) => update(() => {
684
694
  t.fontSize = v;
685
- }) }), jsxs("div", { style: { display: 'flex', alignItems: 'center', gap: 4, marginBottom: 2 }, children: [jsx("span", { style: { fontSize: 10, minWidth: 50, color: '#a6adc8' }, children: "Align" }), jsxs("select", { value: t.align, onChange: (e) => update(() => {
695
+ }) }), jsxs("div", { style: { display: 'flex', alignItems: 'center', gap: 4, marginBottom: 2 }, children: [jsx("span", { style: { fontSize: 10, minWidth: 50, color: '#a6adc8' }, children: tr('editor.fields.align') }), jsxs("select", { value: t.align, onChange: (e) => update(() => {
686
696
  t.align = e.target.value;
687
- }), style: { ...fieldStyle, flex: 1 }, children: [jsx("option", { value: "left", children: "Left" }), jsx("option", { value: "center", children: "Center" }), jsx("option", { value: "right", children: "Right" })] })] }), jsx(ColField, { label: "Color", color: t.color, onChange: (c) => update(() => {
697
+ }), style: { ...fieldStyle, flex: 1 }, children: [jsx("option", { value: "left", children: tr('editor.align.left') }), jsx("option", { value: "center", children: tr('editor.align.center') }), jsx("option", { value: "right", children: tr('editor.align.right') })] })] }), jsx(ColField, { label: "Color", color: t.color, onChange: (c) => update(() => {
688
698
  Object.assign(t.color, c);
689
699
  }) })] }));
690
700
  };
691
701
  const RigidBodyEditor = ({ entityId }) => {
702
+ const { t: tr } = useTranslation('engine');
692
703
  const { world, refreshWorld, dispatch } = useEditor();
693
704
  const rb = world.getComponent(entityId, 'RigidBody2D');
694
705
  if (!rb) {
@@ -699,9 +710,9 @@ const RigidBodyEditor = ({ entityId }) => {
699
710
  dispatch({ type: 'MARK_DIRTY' });
700
711
  refreshWorld();
701
712
  };
702
- return (jsxs(Fragment, { children: [jsxs("div", { style: { display: 'flex', alignItems: 'center', gap: 4, marginBottom: 2 }, children: [jsx("span", { style: { fontSize: 10, minWidth: 50, color: '#a6adc8' }, children: "Body" }), jsxs("select", { value: rb.bodyType, onChange: (e) => update(() => {
713
+ return (jsxs(Fragment, { children: [jsxs("div", { style: { display: 'flex', alignItems: 'center', gap: 4, marginBottom: 2 }, children: [jsx("span", { style: { fontSize: 10, minWidth: 50, color: '#a6adc8' }, children: tr('editor.fields.body') }), jsxs("select", { value: rb.bodyType, onChange: (e) => update(() => {
703
714
  rb.bodyType = e.target.value;
704
- }), style: { ...fieldStyle, flex: 1 }, children: [jsx("option", { value: "dynamic", children: "Dynamic" }), jsx("option", { value: "static", children: "Static" }), jsx("option", { value: "kinematic", children: "Kinematic" })] })] }), jsx(NumField, { label: "Mass", value: rb.mass, step: 0.1, onChange: (v) => update(() => {
715
+ }), style: { ...fieldStyle, flex: 1 }, children: [jsx("option", { value: "dynamic", children: tr('editor.body.dynamic') }), jsx("option", { value: "static", children: tr('editor.body.static') }), jsx("option", { value: "kinematic", children: tr('editor.body.kinematic') })] })] }), jsx(NumField, { label: "Mass", value: rb.mass, step: 0.1, onChange: (v) => update(() => {
705
716
  rb.mass = v;
706
717
  }) }), jsx(NumField, { label: "Drag", value: rb.drag, step: 0.01, onChange: (v) => update(() => {
707
718
  rb.drag = v;
@@ -727,10 +738,11 @@ const ADDABLE_COMPONENTS = [
727
738
  'CameraTarget',
728
739
  ];
729
740
  const InspectorPanel = () => {
741
+ const { t: tr } = useTranslation('engine');
730
742
  const { state, world, dispatch, refreshWorld, addLog } = useEditor();
731
743
  const [showAddComp, setShowAddComp] = useState(false);
732
744
  if (state.selectedEntities.length === 0) {
733
- return jsx("div", { style: { opacity: 0.5, padding: 8 }, children: "No selection" });
745
+ return jsx("div", { style: { opacity: 0.5, padding: 8 }, children: tr('editor.messages.noSelection') });
734
746
  }
735
747
  const entityId = state.selectedEntities[0];
736
748
  const entity = world.getEntity(entityId);
@@ -773,7 +785,7 @@ const InspectorPanel = () => {
773
785
  color: '#f38ba8',
774
786
  cursor: 'pointer',
775
787
  fontSize: 10,
776
- }, title: `Remove ${type}`, children: "\u2715" }))] }), Editor ? (jsx(Editor, { entityId: entityId })) : (jsx("pre", { style: { fontSize: 10, opacity: 0.6, whiteSpace: 'pre-wrap', margin: 0 }, children: JSON.stringify(world.getComponent(entityId, type), null, 2) }))] }, type));
788
+ }, title: tr('editor.assets.removeComponent', { type }), children: jsx(NiceIcon, { name: "close", size: 10 }) }))] }), Editor ? (jsx(Editor, { entityId: entityId })) : (jsx("pre", { style: { fontSize: 10, opacity: 0.6, whiteSpace: 'pre-wrap', margin: 0 }, children: JSON.stringify(world.getComponent(entityId, type), null, 2) }))] }, type));
777
789
  }), jsxs("div", { style: { marginTop: 8, position: 'relative' }, children: [jsx("button", { onClick: () => setShowAddComp(!showAddComp), style: {
778
790
  width: '100%',
779
791
  padding: '4px 8px',
@@ -818,6 +830,7 @@ const InspectorPanel = () => {
818
830
  }, children: type }, type))) }))] })] }));
819
831
  };
820
832
  const AssetPanel = () => {
833
+ const { t: tr } = useTranslation('engine');
821
834
  const [tab, setTab] = useState('all');
822
835
  const tabBtnStyle = (active) => ({
823
836
  padding: '2px 8px',
@@ -829,15 +842,15 @@ const AssetPanel = () => {
829
842
  color: active ? '#cdd6f4' : '#6c7086',
830
843
  });
831
844
  const assets = [
832
- { name: 'player.png', type: 'sprites', icon: '🖼' },
833
- { name: 'enemy.png', type: 'sprites', icon: '🖼' },
834
- { name: 'tileset.png', type: 'sprites', icon: '🖼' },
835
- { name: 'background.jpg', type: 'sprites', icon: '🖼' },
836
- { name: 'jump.wav', type: 'audio', icon: '🔊' },
837
- { name: 'music.mp3', type: 'audio', icon: '🎵' },
838
- { name: 'coin.wav', type: 'audio', icon: '🔊' },
839
- { name: 'playerController.ts', type: 'scripts', icon: '📜' },
840
- { name: 'enemyAI.ts', type: 'scripts', icon: '📜' },
845
+ { name: 'player.png', type: 'sprites', icon: 'image' },
846
+ { name: 'enemy.png', type: 'sprites', icon: 'image' },
847
+ { name: 'tileset.png', type: 'sprites', icon: 'image' },
848
+ { name: 'background.jpg', type: 'sprites', icon: 'image' },
849
+ { name: 'jump.wav', type: 'audio', icon: 'volume' },
850
+ { name: 'music.mp3', type: 'audio', icon: 'music' },
851
+ { name: 'coin.wav', type: 'audio', icon: 'volume' },
852
+ { name: 'playerController.ts', type: 'scripts', icon: 'code' },
853
+ { name: 'enemyAI.ts', type: 'scripts', icon: 'code' },
841
854
  ];
842
855
  const filtered = tab === 'all' ? assets : assets.filter((a) => a.type === tab);
843
856
  return (jsxs("div", { style: { display: 'flex', flexDirection: 'column', height: '100%' }, children: [jsxs("div", { style: { display: 'flex', gap: 2, padding: '2px 4px', borderBottom: '1px solid #313244' }, children: [['all', 'sprites', 'audio', 'scripts'].map((t) => (jsx("button", { onClick: () => setTab(t), style: tabBtnStyle(tab === t), children: t.charAt(0).toUpperCase() + t.slice(1) }, t))), jsx("span", { style: { flex: 1 } }), jsx("button", { style: {
@@ -846,7 +859,7 @@ const AssetPanel = () => {
846
859
  color: '#a6adc8',
847
860
  cursor: 'pointer',
848
861
  fontSize: 10,
849
- }, title: "Import Asset", children: "+ Import" })] }), jsx("div", { style: {
862
+ }, title: tr('editor.assets.import'), children: "+ Import" })] }), jsx("div", { style: {
850
863
  flex: 1,
851
864
  overflow: 'auto',
852
865
  display: 'grid',
@@ -864,9 +877,10 @@ const AssetPanel = () => {
864
877
  cursor: 'grab',
865
878
  fontSize: 9,
866
879
  textAlign: 'center',
867
- }, children: [jsx("span", { style: { fontSize: 20 }, children: a.icon }), jsx("span", { style: { wordBreak: 'break-all' }, children: a.name })] }, a.name))) })] }));
880
+ }, children: [jsx(NiceIcon, { name: a.icon, size: 20 }), jsx("span", { style: { wordBreak: 'break-all' }, children: a.name })] }, a.name))) })] }));
868
881
  };
869
882
  const ConsolePanel = () => {
883
+ const { t: tr } = useTranslation('engine');
870
884
  const { consoleLogs } = useEditor();
871
885
  const [filter, setFilter] = useState('all');
872
886
  const scrollRef = useRef(null);
@@ -886,7 +900,7 @@ const ConsolePanel = () => {
886
900
  background: filter === f ? '#313244' : 'transparent',
887
901
  color: filter === f ? '#cdd6f4' : '#6c7086',
888
902
  }, children: label }));
889
- return (jsxs("div", { style: { display: 'flex', flexDirection: 'column', height: '100%', fontFamily: 'monospace' }, children: [jsxs("div", { style: { display: 'flex', gap: 2, padding: '2px 4px', borderBottom: '1px solid #313244' }, children: [filterBtn('all', 'All'), " ", filterBtn('info', 'Info'), " ", filterBtn('warn', 'Warn'), ' ', filterBtn('error', 'Error'), jsx("span", { style: { flex: 1 } }), jsxs("span", { style: { fontSize: 9, color: '#6c7086' }, children: [filtered.length, " entries"] })] }), jsx("div", { ref: scrollRef, style: { flex: 1, overflow: 'auto', fontSize: 10 }, children: filtered.length === 0 ? (jsx("div", { style: { opacity: 0.4, padding: 8 }, children: "Console ready." })) : (filtered.map((log) => (jsxs("div", { style: {
903
+ return (jsxs("div", { style: { display: 'flex', flexDirection: 'column', height: '100%', fontFamily: 'monospace' }, children: [jsxs("div", { style: { display: 'flex', gap: 2, padding: '2px 4px', borderBottom: '1px solid #313244' }, children: [filterBtn('all', 'All'), " ", filterBtn('info', 'Info'), " ", filterBtn('warn', 'Warn'), ' ', filterBtn('error', 'Error'), jsx("span", { style: { flex: 1 } }), jsxs("span", { style: { fontSize: 9, color: '#6c7086' }, children: [filtered.length, " entries"] })] }), jsx("div", { ref: scrollRef, style: { flex: 1, overflow: 'auto', fontSize: 10 }, children: filtered.length === 0 ? (jsx("div", { style: { opacity: 0.4, padding: 8 }, children: tr('editor.messages.consoleReady') })) : (filtered.map((log) => (jsxs("div", { style: {
890
904
  padding: '1px 4px',
891
905
  borderBottom: '1px solid #181825',
892
906
  display: 'flex',
@@ -1056,7 +1070,10 @@ const EditorViewport = () => {
1056
1070
  ctx.fillStyle = '#f9e2af';
1057
1071
  ctx.font = `${8 / state.zoom}px monospace`;
1058
1072
  ctx.textAlign = 'center';
1059
- ctx.fillText('✨', 0, 3 / state.zoom);
1073
+ // Sparkle marker drawn as a cross (no glyph fonts on the canvas)
1074
+ const spark = 4 / state.zoom;
1075
+ ctx.fillRect(-spark / 4, -spark, spark / 2, spark * 2);
1076
+ ctx.fillRect(-spark, -spark / 4, spark * 2, spark / 2);
1060
1077
  }
1061
1078
  // Camera indicator
1062
1079
  const cam = world.getComponent(entity.id, 'CameraTarget');
@@ -1068,7 +1085,7 @@ const EditorViewport = () => {
1068
1085
  ctx.font = `${8 / state.zoom}px monospace`;
1069
1086
  ctx.fillStyle = '#a6e3a1';
1070
1087
  ctx.textAlign = 'center';
1071
- ctx.fillText('📷 Camera', 0, -hh - 4 / state.zoom);
1088
+ ctx.fillText('Camera', 0, -hh - 4 / state.zoom);
1072
1089
  }
1073
1090
  // Selection highlight
1074
1091
  if (isSelected) {
@@ -1,4 +1,5 @@
1
1
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
+ import { NiceIcon } from '@nice2dev/ui';
2
3
  import { createContext, forwardRef, useReducer, useMemo, useCallback, useImperativeHandle, useContext } from 'react';
3
4
 
4
5
  const DEFAULT_THEME = {
@@ -102,27 +103,27 @@ function useBrowser() {
102
103
  function getResourceIcon(type) {
103
104
  switch (type) {
104
105
  case 'scene':
105
- return '🎬';
106
+ return 'video';
106
107
  case 'script':
107
- return '📜';
108
+ return 'code';
108
109
  case 'resource':
109
- return '📄';
110
+ return 'file';
110
111
  case 'texture':
111
- return '🖼️';
112
+ return 'image';
112
113
  case 'audio':
113
- return '🔊';
114
+ return 'volume';
114
115
  case 'mesh':
115
- return '🔷';
116
+ return 'hexagon';
116
117
  case 'material':
117
- return '🎨';
118
+ return 'palette';
118
119
  case 'animation':
119
- return '🏃';
120
+ return 'play';
120
121
  case 'shader':
121
- return '✨';
122
+ return 'wand';
122
123
  case 'theme':
123
- return '🎭';
124
+ return 'layers';
124
125
  default:
125
- return '📄';
126
+ return 'file';
126
127
  }
127
128
  }
128
129
  function formatFileSize(bytes) {
@@ -153,7 +154,7 @@ const BrowserHeader = () => {
153
154
  alignItems: 'center',
154
155
  justifyContent: 'center',
155
156
  fontSize: 18,
156
- }, children: "\uD83E\uDD16" }), jsxs("div", { style: { flex: 1 }, children: [jsx("div", { style: { fontSize: 14, fontWeight: 600, color: theme.textPrimary }, children: state.projectInfo?.name ?? 'No Project Loaded' }), jsx("div", { style: { fontSize: 11, color: theme.textSecondary }, children: state.projectInfo ? (jsxs(Fragment, { children: ["Godot ", state.projectInfo.godotVersion, " \u2022", ' ', state.projectInfo.renderer.replace('_', ' '), state.projectInfo.dotnetEnabled && ' • C#'] })) : ('Select a Godot project.godot file') })] }), jsxs("div", { style: {
157
+ }, children: jsx(NiceIcon, { name: "gamepad", size: 18 }) }), jsxs("div", { style: { flex: 1 }, children: [jsx("div", { style: { fontSize: 14, fontWeight: 600, color: theme.textPrimary }, children: state.projectInfo?.name ?? 'No Project Loaded' }), jsx("div", { style: { fontSize: 11, color: theme.textSecondary }, children: state.projectInfo ? (jsxs(Fragment, { children: ["Godot ", state.projectInfo.godotVersion, " \u2022", ' ', state.projectInfo.renderer.replace('_', ' '), state.projectInfo.dotnetEnabled && ' • C#'] })) : ('Select a Godot project.godot file') })] }), jsxs("div", { style: {
157
158
  display: 'flex',
158
159
  alignItems: 'center',
159
160
  gap: 8,
@@ -228,21 +229,21 @@ const BrowserToolbar = () => {
228
229
  backgroundColor: 'rgba(0,0,0,0.2)',
229
230
  borderRadius: 6,
230
231
  overflow: 'hidden',
231
- }, children: [jsx("button", { onClick: () => dispatch({ type: 'SET_VIEW_MODE', mode: 'tree' }), style: {
232
+ }, children: [jsx("button", { onClick: () => dispatch({ type: 'SET_VIEW_MODE', mode: 'tree' }), "aria-label": "Tree view", style: {
232
233
  padding: '6px 10px',
233
234
  fontSize: 12,
234
235
  backgroundColor: state.viewMode === 'tree' ? theme.accent : 'transparent',
235
236
  border: 'none',
236
237
  color: '#fff',
237
238
  cursor: 'pointer',
238
- }, children: "\uD83D\uDCD1" }), jsx("button", { onClick: () => dispatch({ type: 'SET_VIEW_MODE', mode: 'grid' }), style: {
239
+ }, children: jsx(NiceIcon, { name: "list", size: 14 }) }), jsx("button", { onClick: () => dispatch({ type: 'SET_VIEW_MODE', mode: 'grid' }), "aria-label": "Grid view", style: {
239
240
  padding: '6px 10px',
240
241
  fontSize: 12,
241
242
  backgroundColor: state.viewMode === 'grid' ? theme.accent : 'transparent',
242
243
  border: 'none',
243
244
  color: '#fff',
244
245
  cursor: 'pointer',
245
- }, children: "\uD83D\uDD32" })] }), jsx("div", { style: { flex: 1 } }), jsxs("span", { style: { fontSize: 11, color: theme.textSecondary }, children: [state.selectedResources.size, " selected"] }), jsx("button", { onClick: importSelectedResources, disabled: state.selectedResources.size === 0 || state.importing, style: {
246
+ }, children: jsx(NiceIcon, { name: "grid", size: 14 }) })] }), jsx("div", { style: { flex: 1 } }), jsxs("span", { style: { fontSize: 11, color: theme.textSecondary }, children: [state.selectedResources.size, " selected"] }), jsxs("button", { onClick: importSelectedResources, disabled: state.selectedResources.size === 0 || state.importing, style: {
246
247
  padding: '8px 16px',
247
248
  fontSize: 12,
248
249
  fontWeight: 500,
@@ -254,16 +255,16 @@ const BrowserToolbar = () => {
254
255
  color: '#fff',
255
256
  cursor: state.selectedResources.size > 0 && !state.importing ? 'pointer' : 'not-allowed',
256
257
  opacity: state.selectedResources.size > 0 && !state.importing ? 1 : 0.5,
257
- }, children: state.importing ? `⏳ ${state.importProgress}%` : '📥 Import Selected' })] }));
258
+ }, children: [jsx(NiceIcon, { name: state.importing ? 'clock' : 'download', size: 14 }), ' ', state.importing ? `${state.importProgress}%` : 'Import Selected'] })] }));
258
259
  };
259
260
  /* ── Tab Bar ─────────────────────────────────────────────────── */
260
261
  const TabBar = () => {
261
262
  const { state, dispatch, theme } = useBrowser();
262
263
  const tabs = [
263
- { id: 'files', label: 'Files', icon: '📁' },
264
- { id: 'autoloads', label: 'Autoloads', icon: '🚀' },
265
- { id: 'plugins', label: 'Plugins', icon: '🔌' },
266
- { id: 'exports', label: 'Exports', icon: '📦' },
264
+ { id: 'files', label: 'Files', icon: 'folder' },
265
+ { id: 'autoloads', label: 'Autoloads', icon: 'rocket' },
266
+ { id: 'plugins', label: 'Plugins', icon: 'plug' },
267
+ { id: 'exports', label: 'Exports', icon: 'box' },
267
268
  ];
268
269
  return (jsx("div", { style: {
269
270
  display: 'flex',
@@ -278,7 +279,7 @@ const TabBar = () => {
278
279
  borderBottom: state.tab === tab.id ? `2px solid ${theme.accent}` : '2px solid transparent',
279
280
  color: state.tab === tab.id ? theme.textPrimary : theme.textSecondary,
280
281
  cursor: 'pointer',
281
- }, children: [tab.icon, " ", tab.label] }, tab.id))) }));
282
+ }, children: [jsx(NiceIcon, { name: tab.icon, size: 14 }), " ", tab.label] }, tab.id))) }));
282
283
  };
283
284
  /* ── Resource Tree Item ───────────────────────────────────────── */
284
285
  const ResourceTreeItem = ({ resource, indent, }) => {
@@ -292,7 +293,7 @@ const ResourceTreeItem = ({ resource, indent, }) => {
292
293
  paddingLeft: indent * 16 + 8,
293
294
  backgroundColor: isSelected ? theme.itemSelected : 'transparent',
294
295
  cursor: 'pointer',
295
- }, children: [jsx("input", { type: "checkbox", checked: isSelected, onChange: () => dispatch({ type: 'SELECT_RESOURCE', id: resource.id, additive: true }), onClick: (e) => e.stopPropagation() }), jsx("span", { style: { fontSize: 14 }, children: getResourceIcon(resource.type) }), jsx("span", { style: {
296
+ }, children: [jsx("input", { type: "checkbox", checked: isSelected, onChange: () => dispatch({ type: 'SELECT_RESOURCE', id: resource.id, additive: true }), onClick: (e) => e.stopPropagation() }), jsx(NiceIcon, { name: getResourceIcon(resource.type), size: 14 }), jsx("span", { style: {
296
297
  flex: 1,
297
298
  fontSize: 12,
298
299
  color: isSelected ? theme.textPrimary : theme.textSecondary,
@@ -329,7 +330,7 @@ const FolderTreeItem = ({ folder, indent }) => {
329
330
  padding: '4px 8px',
330
331
  paddingLeft: indent * 16 + 8,
331
332
  cursor: 'pointer',
332
- }, children: [jsx("span", { style: { fontSize: 10, color: theme.textSecondary }, children: isExpanded ? '▼' : '▶' }), jsx("span", { style: { fontSize: 14 }, children: "\uD83D\uDCC1" }), jsx("span", { style: { fontSize: 12, color: theme.textPrimary, fontWeight: 500 }, children: folder.name }), jsxs("span", { style: { fontSize: 10, color: theme.textSecondary }, children: ["(", filteredChildren.length, ")"] })] }), isExpanded &&
333
+ }, children: [jsx(NiceIcon, { name: isExpanded ? 'chevron-down' : 'chevron-right', size: 10, color: theme.textSecondary }), jsx(NiceIcon, { name: "folder", size: 14 }), jsx("span", { style: { fontSize: 12, color: theme.textPrimary, fontWeight: 500 }, children: folder.name }), jsxs("span", { style: { fontSize: 10, color: theme.textSecondary }, children: ["(", filteredChildren.length, ")"] })] }), isExpanded &&
333
334
  filteredChildren.map((child, _i) => 'children' in child ? (jsx(FolderTreeItem, { folder: child, indent: indent + 1 }, child.path)) : (jsx(ResourceTreeItem, { resource: child, indent: indent + 1 }, child.id)))] }));
334
335
  };
335
336
  /* ── Files Panel ──────────────────────────────────────────────── */
@@ -373,7 +374,7 @@ const ResourceGridItem = ({ resource, isSelected, }) => {
373
374
  borderRadius: 8,
374
375
  border: `1px solid ${isSelected ? theme.accent : theme.border}`,
375
376
  cursor: 'pointer',
376
- }, children: [jsx("div", { style: { fontSize: 32, marginBottom: 8 }, children: getResourceIcon(resource.type) }), jsx("span", { style: {
377
+ }, children: [jsx("div", { style: { marginBottom: 8 }, children: jsx(NiceIcon, { name: getResourceIcon(resource.type), size: 32 }) }), jsx("span", { style: {
377
378
  fontSize: 11,
378
379
  color: theme.textPrimary,
379
380
  textAlign: 'center',
@@ -436,19 +437,19 @@ const ExportsPanel = () => {
436
437
  const getPlatformIcon = (platform) => {
437
438
  switch (platform.toLowerCase()) {
438
439
  case 'windows':
439
- return '🪟';
440
+ return 'monitor';
440
441
  case 'linux':
441
- return '🐧';
442
+ return 'terminal';
442
443
  case 'macos':
443
- return '🍎';
444
+ return 'monitor';
444
445
  case 'android':
445
- return '🤖';
446
+ return 'phone';
446
447
  case 'ios':
447
- return '📱';
448
+ return 'phone';
448
449
  case 'web':
449
- return '🌐';
450
+ return 'globe';
450
451
  default:
451
- return '📦';
452
+ return 'box';
452
453
  }
453
454
  };
454
455
  return (jsxs("div", { style: { padding: 16 }, children: [jsx("h3", { style: { margin: '0 0 16px', fontSize: 14, fontWeight: 600, color: theme.textPrimary }, children: "Export Presets" }), state.projectInfo.exportPresets.map((preset, i) => (jsxs("div", { style: {
@@ -459,7 +460,7 @@ const ExportsPanel = () => {
459
460
  marginBottom: 4,
460
461
  backgroundColor: theme.itemBackground,
461
462
  borderRadius: 6,
462
- }, children: [jsx("span", { style: { fontSize: 20 }, children: getPlatformIcon(preset.platform) }), jsxs("div", { style: { flex: 1 }, children: [jsx("div", { style: { fontSize: 13, color: theme.textPrimary, fontWeight: 500 }, children: preset.name }), jsx("div", { style: { fontSize: 11, color: theme.textSecondary }, children: preset.platform })] }), jsx("button", { style: {
463
+ }, children: [jsx(NiceIcon, { name: getPlatformIcon(preset.platform), size: 20 }), jsxs("div", { style: { flex: 1 }, children: [jsx("div", { style: { fontSize: 13, color: theme.textPrimary, fontWeight: 500 }, children: preset.name }), jsx("div", { style: { fontSize: 11, color: theme.textSecondary }, children: preset.platform })] }), jsx("button", { style: {
463
464
  padding: '6px 12px',
464
465
  fontSize: 11,
465
466
  backgroundColor: theme.accent,