@nice2dev/game-engine 1.3.15 → 1.3.16

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 (434) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/dist/cjs/accessibility/Accessibility.js +152 -165
  3. package/dist/cjs/ai/AI.js +292 -294
  4. package/dist/cjs/ai/BehaviorTree.js +1029 -1113
  5. package/dist/cjs/ai/StateMachine.js +694 -756
  6. package/dist/cjs/animation/Animation.js +232 -241
  7. package/dist/cjs/audio/AudioAdvanced.js +221 -236
  8. package/dist/cjs/audio/AudioBridge.js +441 -435
  9. package/dist/cjs/audio/AudioManager.js +242 -259
  10. package/dist/cjs/build-cloud/BuildOrchestration.js +1059 -1098
  11. package/dist/cjs/build-cloud/GodotBuildCloud.js +641 -670
  12. package/dist/cjs/build-cloud/UnityBuildCloud.js +563 -610
  13. package/dist/cjs/build-cloud/UnrealBuildCloud.js +610 -635
  14. package/dist/cjs/core/EventBus.js +51 -56
  15. package/dist/cjs/core/GameClock.js +62 -66
  16. package/dist/cjs/core/GameConfig.js +72 -79
  17. package/dist/cjs/core/GameLoop.js +80 -89
  18. package/dist/cjs/core/ServiceLocator.js +61 -65
  19. package/dist/cjs/core/Validation.js +72 -82
  20. package/dist/cjs/core/math.js +108 -112
  21. package/dist/cjs/devtools/DevTools.js +542 -563
  22. package/dist/cjs/devtools/DeveloperExperience.js +521 -559
  23. package/dist/cjs/devtools/GameplayAnalytics.js +636 -646
  24. package/dist/cjs/dialogue/DialogueSystem.js +984 -986
  25. package/dist/cjs/docs/DocGenerator.js +339 -364
  26. package/dist/cjs/ecs/World.js +355 -371
  27. package/dist/cjs/editor/AchievementEditor.js +580 -636
  28. package/dist/cjs/editor/AdvancedEditor.js +184 -191
  29. package/dist/cjs/editor/AnimationRetargeting.js +696 -741
  30. package/dist/cjs/editor/AssetBrowser.js +1072 -1160
  31. package/dist/cjs/editor/AssetManager.js +187 -192
  32. package/dist/cjs/editor/ConsolePro.js +971 -1061
  33. package/dist/cjs/editor/CraftingEditor.js +680 -730
  34. package/dist/cjs/editor/DebugTools.js +187 -185
  35. package/dist/cjs/editor/DialogueSystem.js +844 -901
  36. package/dist/cjs/editor/LeaderboardSystem.js +429 -483
  37. package/dist/cjs/editor/NiceGameEditor.js +1903 -1201
  38. package/dist/cjs/editor/PrefabSystem.js +772 -838
  39. package/dist/cjs/editor/ProfilerPanel.js +649 -700
  40. package/dist/cjs/editor/QuestEditor.js +792 -839
  41. package/dist/cjs/editor/ReplaySystem.js +585 -634
  42. package/dist/cjs/editor/SceneEditor.js +176 -200
  43. package/dist/cjs/editor/ScreenshotMode.js +621 -688
  44. package/dist/cjs/editor/ShaderGraph.js +1556 -1582
  45. package/dist/cjs/editor/TimelineEditor.js +715 -778
  46. package/dist/cjs/editor/UndoRedoPro.js +830 -904
  47. package/dist/cjs/editor/VRARMode.js +582 -645
  48. package/dist/cjs/engine/NiceGameEngine.js +141 -164
  49. package/dist/cjs/engine/SaveSystem.js +441 -495
  50. package/dist/cjs/enterprise/Enterprise.js +254 -261
  51. package/dist/cjs/export/BevyExporter.js +927 -967
  52. package/dist/cjs/export/CocosExporter.js +644 -673
  53. package/dist/cjs/export/Construct3Exporter.js +783 -794
  54. package/dist/cjs/export/DefoldExporter.js +1028 -1069
  55. package/dist/cjs/export/GDevelopExporter.js +674 -708
  56. package/dist/cjs/export/GameMakerExporter.js +791 -805
  57. package/dist/cjs/export/GodotExporter.js +1003 -1045
  58. package/dist/cjs/export/MinecraftBedrockExporter.js +573 -578
  59. package/dist/cjs/export/MonoGameExporter.js +1265 -1293
  60. package/dist/cjs/export/Pico8Exporter.js +766 -812
  61. package/dist/cjs/export/PlatformExporter.js +188 -206
  62. package/dist/cjs/export/RPGMakerExporter.js +860 -879
  63. package/dist/cjs/export/RobloxExporter.js +883 -919
  64. package/dist/cjs/export/Solar2DExporter.js +1218 -1256
  65. package/dist/cjs/export/ThreeJSExporter.js +1006 -1073
  66. package/dist/cjs/export/Tic80Exporter.js +1210 -1267
  67. package/dist/cjs/export/UnityExporter.js +1116 -1131
  68. package/dist/cjs/export/UnrealExporter.js +889 -919
  69. package/dist/cjs/export/WebExporter.js +931 -970
  70. package/dist/cjs/export/index.js +42 -65
  71. package/dist/cjs/godot-integration/GodotAssetLibrary.js +659 -692
  72. package/dist/cjs/godot-integration/GodotImport.js +929 -1027
  73. package/dist/cjs/godot-integration/GodotLiveLink.js +915 -945
  74. package/dist/cjs/godot-integration/components/GodotProjectBrowser.js +911 -611
  75. package/dist/cjs/i18n/I18n.js +860 -900
  76. package/dist/cjs/i18n/useTranslation.js +84 -89
  77. package/dist/cjs/import/AsepriteImporter.js +658 -716
  78. package/dist/cjs/import/DragonBonesImporter.js +437 -461
  79. package/dist/cjs/import/GameMakerImporter.js +511 -521
  80. package/dist/cjs/import/GodotSceneImporter.js +788 -822
  81. package/dist/cjs/import/LDtkImporter.js +436 -454
  82. package/dist/cjs/import/Live2DImporter.js +497 -518
  83. package/dist/cjs/import/NdgFormat.js +424 -457
  84. package/dist/cjs/import/OgmoImporter.js +466 -493
  85. package/dist/cjs/import/RPGMakerImporter.js +451 -477
  86. package/dist/cjs/import/SceneImporter.js +378 -423
  87. package/dist/cjs/import/SpineImporter.js +511 -546
  88. package/dist/cjs/import/SpriterImporter.js +590 -613
  89. package/dist/cjs/import/TiledMapImporter.js +811 -846
  90. package/dist/cjs/import/UnitySceneImporter.js +687 -703
  91. package/dist/cjs/import/index.js +206 -251
  92. package/dist/cjs/index.js +275 -278
  93. package/dist/cjs/input/GamepadNavigation.js +185 -205
  94. package/dist/cjs/input/InputManager.js +397 -421
  95. package/dist/cjs/input/useGamepads.js +70 -81
  96. package/dist/cjs/integration/IconSprite.js +129 -256
  97. package/dist/cjs/inventory/InventorySystem.js +920 -995
  98. package/dist/cjs/kids/KidMode.js +997 -1022
  99. package/dist/cjs/kids/KidTools.js +570 -594
  100. package/dist/cjs/monetization/Monetization.js +170 -177
  101. package/dist/cjs/multiplayer/LocalMultiplayer.js +287 -287
  102. package/dist/cjs/multiplayer/MiniGameTypes.js +49 -59
  103. package/dist/cjs/native-engine/AnimationSystem.js +731 -806
  104. package/dist/cjs/native-engine/AssetPipeline.js +454 -515
  105. package/dist/cjs/native-engine/AudioEngine.js +763 -804
  106. package/dist/cjs/native-engine/InputSystem.js +1075 -1145
  107. package/dist/cjs/native-engine/NetworkingSystem.js +733 -793
  108. package/dist/cjs/native-engine/PhysicsEngine.js +583 -607
  109. package/dist/cjs/native-engine/RenderingEngine.js +302 -350
  110. package/dist/cjs/native-engine/SceneGraph.js +769 -808
  111. package/dist/cjs/network/MultiplayerTransport.js +97 -132
  112. package/dist/cjs/network/Networking.js +549 -564
  113. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/AbortController.js +21 -29
  114. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/AccessTokenHttpClient.js +40 -48
  115. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/DefaultHttpClient.js +35 -43
  116. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/DefaultReconnectPolicy.js +10 -15
  117. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/Errors.js +103 -135
  118. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/FetchHttpClient.js +131 -158
  119. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/HandshakeProtocol.js +39 -53
  120. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/HeaderNames.js +5 -8
  121. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/HttpClient.js +40 -48
  122. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/HttpConnection.js +494 -572
  123. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/HubConnection.js +826 -953
  124. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/HubConnectionBuilder.js +125 -146
  125. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/IHubProtocol.js +13 -23
  126. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/ILogger.js +11 -25
  127. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/ITransport.js +13 -24
  128. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/JsonHubProtocol.js +108 -121
  129. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/Loggers.js +10 -14
  130. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/LongPollingTransport.js +150 -185
  131. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/MessageBuffer.js +158 -196
  132. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/ServerSentEventsTransport.js +90 -105
  133. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/Subject.js +30 -35
  134. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/TextMessageFormat.js +16 -21
  135. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/Utils.js +215 -248
  136. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/WebSocketTransport.js +135 -157
  137. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/XhrHttpClient.js +76 -85
  138. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/index.js +24 -27
  139. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/pkg-version.js +3 -4
  140. package/dist/cjs/pathfinding/Pathfinding.js +245 -263
  141. package/dist/cjs/performance/AssetStreaming.js +561 -635
  142. package/dist/cjs/performance/BenchmarkSuite.js +283 -311
  143. package/dist/cjs/performance/DeltaCompression.js +467 -526
  144. package/dist/cjs/performance/DeterministicPhysics.js +450 -498
  145. package/dist/cjs/performance/ECSOptimization.js +644 -695
  146. package/dist/cjs/performance/GameSaveSystem.js +509 -556
  147. package/dist/cjs/performance/HotReload.js +447 -500
  148. package/dist/cjs/performance/InputRecording.js +511 -561
  149. package/dist/cjs/performance/InterestManagement.js +453 -500
  150. package/dist/cjs/performance/LocalizationRuntime.js +376 -423
  151. package/dist/cjs/performance/MemoryManagement.js +410 -470
  152. package/dist/cjs/performance/ModSupport.js +445 -496
  153. package/dist/cjs/performance/MultiThreadedPhysics.js +400 -443
  154. package/dist/cjs/performance/NetworkPrediction.js +424 -482
  155. package/dist/cjs/performance/ObjectPooling.js +569 -617
  156. package/dist/cjs/performance/Performance.js +174 -190
  157. package/dist/cjs/performance/PerformanceAdvanced.js +614 -637
  158. package/dist/cjs/performance/WebGPURenderer.js +656 -683
  159. package/dist/cjs/physics/PhysicsAdvanced.js +345 -379
  160. package/dist/cjs/physics/PhysicsEngine2D.js +391 -427
  161. package/dist/cjs/plugins/PluginSDK.js +432 -466
  162. package/dist/cjs/plugins/PluginTestKit.js +307 -330
  163. package/dist/cjs/procedural/Procedural.js +243 -254
  164. package/dist/cjs/procedural/WorldBuilding.js +297 -314
  165. package/dist/cjs/quest/QuestSystem.js +975 -932
  166. package/dist/cjs/release/MobileExport.js +157 -163
  167. package/dist/cjs/release/Release.js +225 -238
  168. package/dist/cjs/rendering/Camera2D.js +121 -124
  169. package/dist/cjs/rendering/Renderer2D.js +321 -335
  170. package/dist/cjs/rendering/WebGPURenderPipeline.js +632 -651
  171. package/dist/cjs/runtime3d/Runtime3D.js +359 -378
  172. package/dist/cjs/runtime3d/SceneEditor3D.js +252 -263
  173. package/dist/cjs/scene/SceneManager.js +177 -193
  174. package/dist/cjs/scripting/GraphToAST.js +574 -547
  175. package/dist/cjs/scripting/LanguageExporter.js +254 -279
  176. package/dist/cjs/scripting/NodeGraph.js +546 -570
  177. package/dist/cjs/scripting/ScriptAST.js +31 -39
  178. package/dist/cjs/scripting/VisualScripting2.js +1016 -1065
  179. package/dist/cjs/scripting/exporters/CSharpExporter.js +464 -496
  180. package/dist/cjs/scripting/exporters/GDScriptExporter.js +390 -442
  181. package/dist/cjs/scripting/exporters/LuaExporter.js +406 -447
  182. package/dist/cjs/scripting/exporters/PythonExporter.js +484 -549
  183. package/dist/cjs/scripting/exporters/RustExporter.js +459 -512
  184. package/dist/cjs/scripting/exporters/TypeScriptExporter.js +505 -556
  185. package/dist/cjs/social/Social.js +72 -80
  186. package/dist/cjs/systems/LightingSystem.js +844 -931
  187. package/dist/cjs/systems/ParticleSystem2.js +1447 -1451
  188. package/dist/cjs/systems/PhysicsDebugSystem.js +1070 -1141
  189. package/dist/cjs/systems/TerrainSystem.js +985 -1098
  190. package/dist/cjs/templates/ActionTemplates.js +296 -309
  191. package/dist/cjs/templates/FightingTemplate.js +417 -463
  192. package/dist/cjs/templates/MetroidvaniaTemplate.js +353 -405
  193. package/dist/cjs/templates/PartyTemplates.js +190 -202
  194. package/dist/cjs/templates/PuzzleTemplates.js +245 -261
  195. package/dist/cjs/templates/RPGTemplates.js +160 -178
  196. package/dist/cjs/templates/SportsTemplates.js +237 -250
  197. package/dist/cjs/templates/StrategyTemplates.js +143 -153
  198. package/dist/cjs/templates/SurvivalTemplate.js +336 -380
  199. package/dist/cjs/templates/WaveDefense.js +499 -526
  200. package/dist/cjs/tilemap/Tilemap.js +207 -214
  201. package/dist/cjs/tutorials/TutorialBranching.js +396 -417
  202. package/dist/cjs/tutorials/TutorialEngine.js +888 -931
  203. package/dist/cjs/tutorials/TutorialOverlay.js +602 -640
  204. package/dist/cjs/tutorials/content/Tutorials_T05_T08.js +787 -809
  205. package/dist/cjs/tutorials/content/Tutorials_T09_T11.js +736 -756
  206. package/dist/cjs/tutorials/content/Tutorials_T12_T15.js +754 -778
  207. package/dist/cjs/ui/GameUI.js +295 -312
  208. package/dist/cjs/unity-integration/UnityAssetStore.js +700 -741
  209. package/dist/cjs/unity-integration/UnityImport.js +1066 -1176
  210. package/dist/cjs/unity-integration/UnityLiveLink.js +934 -981
  211. package/dist/cjs/unity-integration/components/UnityAssetStoreBrowser.js +1233 -757
  212. package/dist/cjs/unity-integration/components/UnityProjectBrowser.js +1240 -768
  213. package/dist/cjs/unreal-integration/UnrealImport.js +391 -412
  214. package/dist/cjs/unreal-integration/UnrealLiveLink.js +1102 -1137
  215. package/dist/cjs/unreal-integration/UnrealMarketplace.js +436 -473
  216. package/dist/cjs/unreal-integration/components/UnrealProjectBrowser.js +1150 -767
  217. package/dist/cjs/xr/ARVR.js +167 -175
  218. package/dist/esm/accessibility/Accessibility.js +160 -164
  219. package/dist/esm/ai/AI.js +310 -293
  220. package/dist/esm/ai/BehaviorTree.js +1057 -1112
  221. package/dist/esm/ai/StateMachine.js +709 -755
  222. package/dist/esm/animation/Animation.js +237 -240
  223. package/dist/esm/audio/AudioAdvanced.js +239 -235
  224. package/dist/esm/audio/AudioBridge.js +448 -434
  225. package/dist/esm/audio/AudioManager.js +243 -258
  226. package/dist/esm/build-cloud/BuildOrchestration.js +1071 -1097
  227. package/dist/esm/build-cloud/GodotBuildCloud.js +647 -669
  228. package/dist/esm/build-cloud/UnityBuildCloud.js +571 -609
  229. package/dist/esm/build-cloud/UnrealBuildCloud.js +615 -634
  230. package/dist/esm/core/EventBus.js +52 -55
  231. package/dist/esm/core/GameClock.js +63 -65
  232. package/dist/esm/core/GameConfig.js +77 -78
  233. package/dist/esm/core/GameLoop.js +81 -88
  234. package/dist/esm/core/ServiceLocator.js +63 -64
  235. package/dist/esm/core/Validation.js +82 -81
  236. package/dist/esm/core/math.js +109 -111
  237. package/dist/esm/devtools/DevTools.js +546 -562
  238. package/dist/esm/devtools/DeveloperExperience.js +535 -558
  239. package/dist/esm/devtools/GameplayAnalytics.js +647 -645
  240. package/dist/esm/dialogue/DialogueSystem.js +998 -985
  241. package/dist/esm/docs/DocGenerator.js +342 -363
  242. package/dist/esm/ecs/World.js +358 -370
  243. package/dist/esm/editor/AchievementEditor.js +584 -635
  244. package/dist/esm/editor/AdvancedEditor.js +191 -190
  245. package/dist/esm/editor/AnimationRetargeting.js +700 -740
  246. package/dist/esm/editor/AssetBrowser.js +1078 -1159
  247. package/dist/esm/editor/AssetManager.js +188 -191
  248. package/dist/esm/editor/ConsolePro.js +977 -1060
  249. package/dist/esm/editor/CraftingEditor.js +684 -729
  250. package/dist/esm/editor/DebugTools.js +194 -184
  251. package/dist/esm/editor/DialogueSystem.js +849 -900
  252. package/dist/esm/editor/LeaderboardSystem.js +433 -482
  253. package/dist/esm/editor/NiceGameEditor.js +1908 -1200
  254. package/dist/esm/editor/PrefabSystem.js +777 -837
  255. package/dist/esm/editor/ProfilerPanel.js +654 -699
  256. package/dist/esm/editor/QuestEditor.js +795 -838
  257. package/dist/esm/editor/ReplaySystem.js +591 -633
  258. package/dist/esm/editor/SceneEditor.js +189 -199
  259. package/dist/esm/editor/ScreenshotMode.js +628 -687
  260. package/dist/esm/editor/ShaderGraph.js +1565 -1581
  261. package/dist/esm/editor/TimelineEditor.js +733 -777
  262. package/dist/esm/editor/UndoRedoPro.js +835 -903
  263. package/dist/esm/editor/VRARMode.js +586 -644
  264. package/dist/esm/engine/NiceGameEngine.js +142 -163
  265. package/dist/esm/engine/SaveSystem.js +447 -494
  266. package/dist/esm/enterprise/Enterprise.js +265 -260
  267. package/dist/esm/export/BevyExporter.js +929 -966
  268. package/dist/esm/export/CocosExporter.js +646 -672
  269. package/dist/esm/export/Construct3Exporter.js +785 -793
  270. package/dist/esm/export/DefoldExporter.js +1030 -1068
  271. package/dist/esm/export/GDevelopExporter.js +676 -707
  272. package/dist/esm/export/GameMakerExporter.js +793 -804
  273. package/dist/esm/export/GodotExporter.js +1004 -1044
  274. package/dist/esm/export/MinecraftBedrockExporter.js +575 -577
  275. package/dist/esm/export/MonoGameExporter.js +1267 -1292
  276. package/dist/esm/export/Pico8Exporter.js +768 -811
  277. package/dist/esm/export/PlatformExporter.js +193 -205
  278. package/dist/esm/export/RPGMakerExporter.js +862 -878
  279. package/dist/esm/export/RobloxExporter.js +885 -918
  280. package/dist/esm/export/Solar2DExporter.js +1220 -1255
  281. package/dist/esm/export/ThreeJSExporter.js +1007 -1072
  282. package/dist/esm/export/Tic80Exporter.js +1212 -1266
  283. package/dist/esm/export/UnityExporter.js +1117 -1130
  284. package/dist/esm/export/UnrealExporter.js +891 -918
  285. package/dist/esm/export/WebExporter.js +933 -969
  286. package/dist/esm/export/index.js +86 -71
  287. package/dist/esm/godot-integration/GodotAssetLibrary.js +663 -691
  288. package/dist/esm/godot-integration/GodotImport.js +935 -1026
  289. package/dist/esm/godot-integration/GodotLiveLink.js +918 -944
  290. package/dist/esm/godot-integration/components/GodotProjectBrowser.js +912 -610
  291. package/dist/esm/i18n/I18n.js +871 -899
  292. package/dist/esm/i18n/useTranslation.js +88 -88
  293. package/dist/esm/import/AsepriteImporter.js +637 -715
  294. package/dist/esm/import/DragonBonesImporter.js +417 -460
  295. package/dist/esm/import/GameMakerImporter.js +491 -520
  296. package/dist/esm/import/GodotSceneImporter.js +767 -821
  297. package/dist/esm/import/LDtkImporter.js +415 -453
  298. package/dist/esm/import/Live2DImporter.js +477 -517
  299. package/dist/esm/import/NdgFormat.js +410 -456
  300. package/dist/esm/import/OgmoImporter.js +446 -492
  301. package/dist/esm/import/RPGMakerImporter.js +431 -476
  302. package/dist/esm/import/SceneImporter.js +385 -422
  303. package/dist/esm/import/SpineImporter.js +491 -545
  304. package/dist/esm/import/SpriterImporter.js +570 -612
  305. package/dist/esm/import/TiledMapImporter.js +790 -845
  306. package/dist/esm/import/UnitySceneImporter.js +666 -702
  307. package/dist/esm/import/index.js +247 -258
  308. package/dist/esm/index.js +1332 -188
  309. package/dist/esm/input/GamepadNavigation.js +187 -204
  310. package/dist/esm/input/InputManager.js +401 -420
  311. package/dist/esm/input/useGamepads.js +72 -80
  312. package/dist/esm/integration/IconSprite.js +143 -255
  313. package/dist/esm/inventory/InventorySystem.js +925 -994
  314. package/dist/esm/kids/KidMode.js +1003 -1021
  315. package/dist/esm/kids/KidTools.js +573 -593
  316. package/dist/esm/monetization/Monetization.js +180 -176
  317. package/dist/esm/multiplayer/LocalMultiplayer.js +290 -286
  318. package/dist/esm/multiplayer/MiniGameTypes.js +58 -58
  319. package/dist/esm/native-engine/AnimationSystem.js +735 -805
  320. package/dist/esm/native-engine/AssetPipeline.js +456 -514
  321. package/dist/esm/native-engine/AudioEngine.js +765 -803
  322. package/dist/esm/native-engine/InputSystem.js +1079 -1144
  323. package/dist/esm/native-engine/NetworkingSystem.js +740 -792
  324. package/dist/esm/native-engine/PhysicsEngine.js +585 -606
  325. package/dist/esm/native-engine/RenderingEngine.js +304 -349
  326. package/dist/esm/native-engine/SceneGraph.js +773 -807
  327. package/dist/esm/network/MultiplayerTransport.js +99 -131
  328. package/dist/esm/network/Networking.js +556 -563
  329. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/AbortController.js +22 -28
  330. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/AccessTokenHttpClient.js +41 -47
  331. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/DefaultHttpClient.js +36 -42
  332. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/DefaultReconnectPolicy.js +11 -14
  333. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/Errors.js +111 -134
  334. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/FetchHttpClient.js +132 -157
  335. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/HandshakeProtocol.js +40 -52
  336. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/HeaderNames.js +6 -7
  337. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/HttpClient.js +42 -47
  338. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/HttpConnection.js +496 -571
  339. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/HubConnection.js +828 -952
  340. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/HubConnectionBuilder.js +126 -145
  341. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/IHubProtocol.js +14 -23
  342. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/ILogger.js +12 -25
  343. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/ITransport.js +15 -24
  344. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/JsonHubProtocol.js +109 -120
  345. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/Loggers.js +11 -13
  346. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/LongPollingTransport.js +151 -184
  347. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/MessageBuffer.js +159 -195
  348. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/ServerSentEventsTransport.js +91 -104
  349. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/Subject.js +31 -34
  350. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/TextMessageFormat.js +17 -20
  351. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/Utils.js +230 -248
  352. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/WebSocketTransport.js +136 -156
  353. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/XhrHttpClient.js +77 -84
  354. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/index.js +31 -12
  355. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/pkg-version.js +4 -3
  356. package/dist/esm/pathfinding/Pathfinding.js +249 -262
  357. package/dist/esm/performance/AssetStreaming.js +567 -634
  358. package/dist/esm/performance/BenchmarkSuite.js +285 -310
  359. package/dist/esm/performance/DeltaCompression.js +478 -525
  360. package/dist/esm/performance/DeterministicPhysics.js +479 -497
  361. package/dist/esm/performance/ECSOptimization.js +653 -694
  362. package/dist/esm/performance/GameSaveSystem.js +515 -555
  363. package/dist/esm/performance/HotReload.js +454 -499
  364. package/dist/esm/performance/InputRecording.js +520 -560
  365. package/dist/esm/performance/InterestManagement.js +460 -499
  366. package/dist/esm/performance/LocalizationRuntime.js +382 -422
  367. package/dist/esm/performance/MemoryManagement.js +415 -469
  368. package/dist/esm/performance/ModSupport.js +455 -495
  369. package/dist/esm/performance/MultiThreadedPhysics.js +408 -442
  370. package/dist/esm/performance/NetworkPrediction.js +436 -481
  371. package/dist/esm/performance/ObjectPooling.js +582 -616
  372. package/dist/esm/performance/Performance.js +182 -189
  373. package/dist/esm/performance/PerformanceAdvanced.js +621 -636
  374. package/dist/esm/performance/WebGPURenderer.js +660 -682
  375. package/dist/esm/physics/PhysicsAdvanced.js +359 -378
  376. package/dist/esm/physics/PhysicsEngine2D.js +393 -426
  377. package/dist/esm/plugins/PluginSDK.js +435 -465
  378. package/dist/esm/plugins/PluginTestKit.js +315 -329
  379. package/dist/esm/procedural/Procedural.js +248 -253
  380. package/dist/esm/procedural/WorldBuilding.js +316 -313
  381. package/dist/esm/quest/QuestSystem.js +982 -931
  382. package/dist/esm/release/MobileExport.js +163 -162
  383. package/dist/esm/release/Release.js +234 -237
  384. package/dist/esm/rendering/Camera2D.js +122 -123
  385. package/dist/esm/rendering/Renderer2D.js +323 -334
  386. package/dist/esm/rendering/WebGPURenderPipeline.js +647 -650
  387. package/dist/esm/runtime3d/Runtime3D.js +368 -377
  388. package/dist/esm/runtime3d/SceneEditor3D.js +268 -262
  389. package/dist/esm/scene/SceneManager.js +178 -192
  390. package/dist/esm/scripting/GraphToAST.js +576 -546
  391. package/dist/esm/scripting/LanguageExporter.js +263 -278
  392. package/dist/esm/scripting/NodeGraph.js +550 -569
  393. package/dist/esm/scripting/ScriptAST.js +45 -38
  394. package/dist/esm/scripting/VisualScripting2.js +1025 -1064
  395. package/dist/esm/scripting/exporters/CSharpExporter.js +465 -495
  396. package/dist/esm/scripting/exporters/GDScriptExporter.js +391 -441
  397. package/dist/esm/scripting/exporters/LuaExporter.js +407 -446
  398. package/dist/esm/scripting/exporters/PythonExporter.js +485 -548
  399. package/dist/esm/scripting/exporters/RustExporter.js +460 -511
  400. package/dist/esm/scripting/exporters/TypeScriptExporter.js +506 -555
  401. package/dist/esm/social/Social.js +77 -79
  402. package/dist/esm/systems/LightingSystem.js +855 -930
  403. package/dist/esm/systems/ParticleSystem2.js +1453 -1450
  404. package/dist/esm/systems/PhysicsDebugSystem.js +1078 -1140
  405. package/dist/esm/systems/TerrainSystem.js +996 -1097
  406. package/dist/esm/templates/ActionTemplates.js +307 -308
  407. package/dist/esm/templates/FightingTemplate.js +439 -462
  408. package/dist/esm/templates/MetroidvaniaTemplate.js +391 -404
  409. package/dist/esm/templates/PartyTemplates.js +206 -201
  410. package/dist/esm/templates/PuzzleTemplates.js +260 -260
  411. package/dist/esm/templates/RPGTemplates.js +172 -177
  412. package/dist/esm/templates/SportsTemplates.js +251 -249
  413. package/dist/esm/templates/StrategyTemplates.js +158 -152
  414. package/dist/esm/templates/SurvivalTemplate.js +367 -379
  415. package/dist/esm/templates/WaveDefense.js +501 -525
  416. package/dist/esm/tilemap/Tilemap.js +209 -213
  417. package/dist/esm/tutorials/TutorialBranching.js +399 -416
  418. package/dist/esm/tutorials/TutorialEngine.js +893 -930
  419. package/dist/esm/tutorials/TutorialOverlay.js +603 -639
  420. package/dist/esm/tutorials/content/Tutorials_T05_T08.js +792 -808
  421. package/dist/esm/tutorials/content/Tutorials_T09_T11.js +740 -755
  422. package/dist/esm/tutorials/content/Tutorials_T12_T15.js +759 -777
  423. package/dist/esm/ui/GameUI.js +296 -311
  424. package/dist/esm/unity-integration/UnityAssetStore.js +704 -740
  425. package/dist/esm/unity-integration/UnityImport.js +1071 -1175
  426. package/dist/esm/unity-integration/UnityLiveLink.js +938 -980
  427. package/dist/esm/unity-integration/components/UnityAssetStoreBrowser.js +1234 -756
  428. package/dist/esm/unity-integration/components/UnityProjectBrowser.js +1241 -767
  429. package/dist/esm/unreal-integration/UnrealImport.js +395 -411
  430. package/dist/esm/unreal-integration/UnrealLiveLink.js +1105 -1136
  431. package/dist/esm/unreal-integration/UnrealMarketplace.js +442 -472
  432. package/dist/esm/unreal-integration/components/UnrealProjectBrowser.js +1151 -766
  433. package/dist/esm/xr/ARVR.js +181 -174
  434. package/package.json +7 -12
@@ -1,834 +1,1219 @@
1
- import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
- import { NiceIcon, clickOnActivationKey } from '@nice2dev/ui';
3
- import { forwardRef, useReducer, useMemo, useCallback, useImperativeHandle, createContext, useContext } from 'react';
4
-
1
+ import { jsx, jsxs, Fragment } from "react/jsx-runtime";
2
+ import { NiceIcon, clickOnActivationKey } from "@nice2dev/ui";
3
+ import { forwardRef, useReducer, useMemo, useCallback, useImperativeHandle, createContext, useContext } from "react";
5
4
  const DEFAULT_THEME = {
6
- background: '#1c1c1c',
7
- panelBackground: '#242424',
8
- headerBackground: '#1a1a1a',
9
- itemBackground: 'rgba(255,255,255,0.02)',
10
- itemHover: 'rgba(255,255,255,0.05)',
11
- itemSelected: 'rgba(0, 150, 255, 0.2)',
12
- textPrimary: '#e6e6e6',
13
- textSecondary: '#a0a0a0',
14
- accent: '#0096ff',
15
- success: '#2ea043',
16
- warning: '#d29922',
17
- danger: '#cf222e',
18
- border: 'rgba(255,255,255,0.08)',
19
- unrealBlack: '#1c1c1c',
20
- blueprintBlue: '#0096ff',
21
- cppOrange: '#d97706',
22
- contentBrowserGray: '#2d2d2d',
5
+ background: "#1c1c1c",
6
+ panelBackground: "#242424",
7
+ headerBackground: "#1a1a1a",
8
+ itemBackground: "rgba(255,255,255,0.02)",
9
+ itemHover: "rgba(255,255,255,0.05)",
10
+ itemSelected: "rgba(0, 150, 255, 0.2)",
11
+ textPrimary: "#e6e6e6",
12
+ textSecondary: "#a0a0a0",
13
+ accent: "#0096ff",
14
+ success: "#2ea043",
15
+ warning: "#d29922",
16
+ danger: "#cf222e",
17
+ border: "rgba(255,255,255,0.08)",
18
+ unrealBlack: "#1c1c1c",
19
+ blueprintBlue: "#0096ff",
20
+ cppOrange: "#d97706",
21
+ contentBrowserGray: "#2d2d2d"
23
22
  };
24
23
  function browserReducer(state, action) {
25
- switch (action.type) {
26
- case 'SET_PROJECT':
27
- return { ...state, projectInfo: action.info, selectedAssets: new Set() };
28
- case 'CLEAR_PROJECT':
29
- return { ...state, projectInfo: null, selectedAssets: new Set() };
30
- case 'SELECT_ASSET':
31
- if (action.additive) {
32
- const newSet = new Set(state.selectedAssets);
33
- if (newSet.has(action.id)) {
34
- newSet.delete(action.id);
35
- }
36
- else {
37
- newSet.add(action.id);
38
- }
39
- return { ...state, selectedAssets: newSet };
40
- }
41
- return { ...state, selectedAssets: new Set([action.id]) };
42
- case 'SELECT_ALL':
43
- return {
44
- ...state,
45
- selectedAssets: new Set(state.projectInfo?.assets.map((a) => a.id) ?? []),
46
- };
47
- case 'DESELECT_ALL':
48
- return { ...state, selectedAssets: new Set() };
49
- case 'TOGGLE_FOLDER': {
50
- const expanded = new Set(state.expandedFolders);
51
- if (expanded.has(action.path)) {
52
- expanded.delete(action.path);
53
- }
54
- else {
55
- expanded.add(action.path);
56
- }
57
- return { ...state, expandedFolders: expanded };
24
+ switch (action.type) {
25
+ case "SET_PROJECT":
26
+ return { ...state, projectInfo: action.info, selectedAssets: /* @__PURE__ */ new Set() };
27
+ case "CLEAR_PROJECT":
28
+ return { ...state, projectInfo: null, selectedAssets: /* @__PURE__ */ new Set() };
29
+ case "SELECT_ASSET":
30
+ if (action.additive) {
31
+ const newSet = new Set(state.selectedAssets);
32
+ if (newSet.has(action.id)) {
33
+ newSet.delete(action.id);
34
+ } else {
35
+ newSet.add(action.id);
58
36
  }
59
- case 'SET_SEARCH':
60
- return { ...state, searchQuery: action.query };
61
- case 'SET_FILTER':
62
- return { ...state, filterType: action.filter };
63
- case 'SET_VIEW_MODE':
64
- return { ...state, viewMode: action.mode };
65
- case 'SET_PREVIEW':
66
- return { ...state, previewAsset: action.asset };
67
- case 'SET_LIVE_LINK_STATUS':
68
- return { ...state, liveLinkStatus: action.status };
69
- case 'SET_IMPORTING':
70
- return {
71
- ...state,
72
- importing: action.importing,
73
- importProgress: action.progress ?? state.importProgress,
74
- };
75
- case 'SET_TAB':
76
- return { ...state, tab: action.tab };
77
- case 'SET_TILE_SIZE':
78
- return { ...state, tileSize: action.size };
79
- default:
80
- return state;
37
+ return { ...state, selectedAssets: newSet };
38
+ }
39
+ return { ...state, selectedAssets: /* @__PURE__ */ new Set([action.id]) };
40
+ case "SELECT_ALL":
41
+ return {
42
+ ...state,
43
+ selectedAssets: new Set(state.projectInfo?.assets.map((a) => a.id) ?? [])
44
+ };
45
+ case "DESELECT_ALL":
46
+ return { ...state, selectedAssets: /* @__PURE__ */ new Set() };
47
+ case "TOGGLE_FOLDER": {
48
+ const expanded = new Set(state.expandedFolders);
49
+ if (expanded.has(action.path)) {
50
+ expanded.delete(action.path);
51
+ } else {
52
+ expanded.add(action.path);
53
+ }
54
+ return { ...state, expandedFolders: expanded };
81
55
  }
56
+ case "SET_SEARCH":
57
+ return { ...state, searchQuery: action.query };
58
+ case "SET_FILTER":
59
+ return { ...state, filterType: action.filter };
60
+ case "SET_VIEW_MODE":
61
+ return { ...state, viewMode: action.mode };
62
+ case "SET_PREVIEW":
63
+ return { ...state, previewAsset: action.asset };
64
+ case "SET_LIVE_LINK_STATUS":
65
+ return { ...state, liveLinkStatus: action.status };
66
+ case "SET_IMPORTING":
67
+ return {
68
+ ...state,
69
+ importing: action.importing,
70
+ importProgress: action.progress ?? state.importProgress
71
+ };
72
+ case "SET_TAB":
73
+ return { ...state, tab: action.tab };
74
+ case "SET_TILE_SIZE":
75
+ return { ...state, tileSize: action.size };
76
+ default:
77
+ return state;
78
+ }
82
79
  }
83
80
  const INITIAL_STATE = {
84
- projectInfo: null,
85
- selectedAssets: new Set(),
86
- expandedFolders: new Set(['/Game']),
87
- searchQuery: '',
88
- filterType: 'all',
89
- viewMode: 'tiles',
90
- previewAsset: null,
91
- liveLinkStatus: {
92
- connected: false,
93
- playState: 'stopped',
94
- compiling: false,
95
- hotReloadAvailable: false,
96
- },
97
- importing: false,
98
- importProgress: 0,
99
- tab: 'content',
100
- tileSize: 'medium',
81
+ projectInfo: null,
82
+ selectedAssets: /* @__PURE__ */ new Set(),
83
+ expandedFolders: /* @__PURE__ */ new Set(["/Game"]),
84
+ searchQuery: "",
85
+ filterType: "all",
86
+ viewMode: "tiles",
87
+ previewAsset: null,
88
+ liveLinkStatus: {
89
+ connected: false,
90
+ playState: "stopped",
91
+ compiling: false,
92
+ hotReloadAvailable: false
93
+ },
94
+ importing: false,
95
+ importProgress: 0,
96
+ tab: "content",
97
+ tileSize: "medium"
101
98
  };
102
99
  const BrowserContext = /* @__PURE__ */ createContext(null);
103
100
  function useBrowser() {
104
- const ctx = useContext(BrowserContext);
105
- if (!ctx) {
106
- throw new Error('useBrowser must be used within UnrealProjectBrowser');
107
- }
108
- return ctx;
101
+ const ctx = useContext(BrowserContext);
102
+ if (!ctx) {
103
+ throw new Error("useBrowser must be used within UnrealProjectBrowser");
104
+ }
105
+ return ctx;
109
106
  }
110
- /* ── Helper Functions ─────────────────────────────────────────── */
111
107
  function getAssetIcon(type) {
112
- switch (type) {
113
- case 'blueprint':
114
- return 'code';
115
- case 'level':
116
- return 'map-pin';
117
- case 'material':
118
- return 'palette';
119
- case 'texture':
120
- return 'image';
121
- case 'mesh':
122
- return 'hexagon';
123
- case 'skeletal_mesh':
124
- return 'user';
125
- case 'animation':
126
- return 'play';
127
- case 'sound':
128
- return 'volume';
129
- case 'particle':
130
- return 'star';
131
- case 'widget':
132
- return 'monitor';
133
- case 'data_asset':
134
- return 'table';
135
- default:
136
- return 'file';
137
- }
108
+ switch (type) {
109
+ case "blueprint":
110
+ return "code";
111
+ case "level":
112
+ return "map-pin";
113
+ case "material":
114
+ return "palette";
115
+ case "texture":
116
+ return "image";
117
+ case "mesh":
118
+ return "hexagon";
119
+ case "skeletal_mesh":
120
+ return "user";
121
+ case "animation":
122
+ return "play";
123
+ case "sound":
124
+ return "volume";
125
+ case "particle":
126
+ return "star";
127
+ case "widget":
128
+ return "monitor";
129
+ case "data_asset":
130
+ return "table";
131
+ default:
132
+ return "file";
133
+ }
138
134
  }
139
135
  function formatFileSize(bytes) {
140
- if (bytes < 1024) {
141
- return `${bytes} B`;
142
- }
143
- if (bytes < 1024 * 1024) {
144
- return `${(bytes / 1024).toFixed(1)} KB`;
145
- }
146
- return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
136
+ if (bytes < 1024) {
137
+ return `${bytes} B`;
138
+ }
139
+ if (bytes < 1024 * 1024) {
140
+ return `${(bytes / 1024).toFixed(1)} KB`;
141
+ }
142
+ return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
147
143
  }
148
144
  function getAssetColor(type, theme) {
149
- switch (type) {
150
- case 'blueprint':
151
- return theme.blueprintBlue;
152
- case 'material':
153
- return '#4ade80';
154
- case 'mesh':
155
- case 'skeletal_mesh':
156
- return '#c084fc';
157
- case 'texture':
158
- return '#f59e0b';
159
- case 'level':
160
- return '#22d3ee';
161
- case 'widget':
162
- return '#f472b6';
163
- default:
164
- return theme.textSecondary;
165
- }
145
+ switch (type) {
146
+ case "blueprint":
147
+ return theme.blueprintBlue;
148
+ case "material":
149
+ return "#4ade80";
150
+ case "mesh":
151
+ case "skeletal_mesh":
152
+ return "#c084fc";
153
+ case "texture":
154
+ return "#f59e0b";
155
+ case "level":
156
+ return "#22d3ee";
157
+ case "widget":
158
+ return "#f472b6";
159
+ default:
160
+ return theme.textSecondary;
161
+ }
166
162
  }
167
- /* ── Header Component ─────────────────────────────────────────── */
168
163
  const BrowserHeader = () => {
169
- const { state, dispatch: _dispatch, theme, connectLiveLink, disconnectLiveLink, triggerHotReload, } = useBrowser();
170
- return (jsxs("div", { style: {
171
- display: 'flex',
172
- alignItems: 'center',
173
- gap: 12,
174
- padding: '12px 16px',
175
- backgroundColor: theme.headerBackground,
176
- borderBottom: `1px solid ${theme.border}`,
177
- }, children: [jsx("div", { style: {
178
- width: 32,
179
- height: 32,
180
- backgroundColor: theme.unrealBlack,
181
- borderRadius: 4,
182
- display: 'flex',
183
- alignItems: 'center',
184
- justifyContent: 'center',
185
- fontSize: 18,
186
- border: '1px solid rgba(255,255,255,0.1)',
187
- }, 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: ["UE ", state.projectInfo.engineVersion, " \u2022 ", state.projectInfo.targetPlatforms.join(', ')] })) : ('Select a .uproject file') })] }), state.liveLinkStatus.connected && state.liveLinkStatus.hotReloadAvailable && (jsxs("button", { onClick: triggerHotReload, disabled: state.liveLinkStatus.compiling, style: {
188
- padding: '6px 12px',
189
- fontSize: 11,
190
- backgroundColor: state.liveLinkStatus.compiling ? theme.warning : theme.cppOrange,
191
- border: 'none',
164
+ const {
165
+ state,
166
+ dispatch: _dispatch,
167
+ theme,
168
+ connectLiveLink,
169
+ disconnectLiveLink,
170
+ triggerHotReload
171
+ } = useBrowser();
172
+ return /* @__PURE__ */ jsxs(
173
+ "div",
174
+ {
175
+ style: {
176
+ display: "flex",
177
+ alignItems: "center",
178
+ gap: 12,
179
+ padding: "12px 16px",
180
+ backgroundColor: theme.headerBackground,
181
+ borderBottom: `1px solid ${theme.border}`
182
+ },
183
+ children: [
184
+ /* @__PURE__ */ jsx(
185
+ "div",
186
+ {
187
+ style: {
188
+ width: 32,
189
+ height: 32,
190
+ backgroundColor: theme.unrealBlack,
191
+ borderRadius: 4,
192
+ display: "flex",
193
+ alignItems: "center",
194
+ justifyContent: "center",
195
+ fontSize: 18,
196
+ border: "1px solid rgba(255,255,255,0.1)"
197
+ },
198
+ children: /* @__PURE__ */ jsx(NiceIcon, { name: "gamepad", size: 18 })
199
+ }
200
+ ),
201
+ /* @__PURE__ */ jsxs("div", { style: { flex: 1 }, children: [
202
+ /* @__PURE__ */ jsx("div", { style: { fontSize: 14, fontWeight: 600, color: theme.textPrimary }, children: state.projectInfo?.name ?? "No Project Loaded" }),
203
+ /* @__PURE__ */ jsx("div", { style: { fontSize: 11, color: theme.textSecondary }, children: state.projectInfo ? /* @__PURE__ */ jsxs(Fragment, { children: [
204
+ "UE ",
205
+ state.projectInfo.engineVersion,
206
+ " • ",
207
+ state.projectInfo.targetPlatforms.join(", ")
208
+ ] }) : "Select a .uproject file" })
209
+ ] }),
210
+ state.liveLinkStatus.connected && state.liveLinkStatus.hotReloadAvailable && /* @__PURE__ */ jsxs(
211
+ "button",
212
+ {
213
+ onClick: triggerHotReload,
214
+ disabled: state.liveLinkStatus.compiling,
215
+ style: {
216
+ padding: "6px 12px",
217
+ fontSize: 11,
218
+ backgroundColor: state.liveLinkStatus.compiling ? theme.warning : theme.cppOrange,
219
+ border: "none",
220
+ borderRadius: 4,
221
+ color: "#fff",
222
+ cursor: state.liveLinkStatus.compiling ? "not-allowed" : "pointer"
223
+ },
224
+ children: [
225
+ /* @__PURE__ */ jsx(NiceIcon, { name: state.liveLinkStatus.compiling ? "clock" : "zap", size: 14 }),
226
+ " ",
227
+ state.liveLinkStatus.compiling ? "Compiling..." : "Hot Reload"
228
+ ]
229
+ }
230
+ ),
231
+ /* @__PURE__ */ jsxs(
232
+ "div",
233
+ {
234
+ style: {
235
+ display: "flex",
236
+ alignItems: "center",
237
+ gap: 8,
238
+ padding: "6px 12px",
239
+ backgroundColor: state.liveLinkStatus.connected ? "rgba(46, 160, 67, 0.1)" : "rgba(0,0,0,0.2)",
240
+ borderRadius: 20,
241
+ border: `1px solid ${state.liveLinkStatus.connected ? theme.success : theme.border}`
242
+ },
243
+ children: [
244
+ /* @__PURE__ */ jsx(
245
+ "div",
246
+ {
247
+ style: {
248
+ width: 8,
249
+ height: 8,
250
+ borderRadius: "50%",
251
+ backgroundColor: state.liveLinkStatus.connected ? state.liveLinkStatus.playState !== "stopped" ? theme.warning : theme.success : theme.textSecondary
252
+ }
253
+ }
254
+ ),
255
+ /* @__PURE__ */ jsx("span", { style: { fontSize: 11, color: theme.textPrimary }, children: state.liveLinkStatus.connected ? state.liveLinkStatus.playState === "stopped" ? "Editor" : state.liveLinkStatus.playState === "simulating" ? "Simulating" : "PIE" : "Disconnected" }),
256
+ /* @__PURE__ */ jsx(
257
+ "button",
258
+ {
259
+ onClick: () => state.liveLinkStatus.connected ? disconnectLiveLink() : connectLiveLink(),
260
+ style: {
261
+ padding: "2px 8px",
262
+ fontSize: 10,
263
+ backgroundColor: theme.accent,
264
+ border: "none",
192
265
  borderRadius: 4,
193
- color: '#fff',
194
- cursor: state.liveLinkStatus.compiling ? 'not-allowed' : 'pointer',
195
- }, children: [jsx(NiceIcon, { name: state.liveLinkStatus.compiling ? 'clock' : 'zap', size: 14 }), ' ', state.liveLinkStatus.compiling ? 'Compiling...' : 'Hot Reload'] })), jsxs("div", { style: {
196
- display: 'flex',
197
- alignItems: 'center',
198
- gap: 8,
199
- padding: '6px 12px',
200
- backgroundColor: state.liveLinkStatus.connected
201
- ? 'rgba(46, 160, 67, 0.1)'
202
- : 'rgba(0,0,0,0.2)',
203
- borderRadius: 20,
204
- border: `1px solid ${state.liveLinkStatus.connected ? theme.success : theme.border}`,
205
- }, children: [jsx("div", { style: {
206
- width: 8,
207
- height: 8,
208
- borderRadius: '50%',
209
- backgroundColor: state.liveLinkStatus.connected
210
- ? state.liveLinkStatus.playState !== 'stopped'
211
- ? theme.warning
212
- : theme.success
213
- : theme.textSecondary,
214
- } }), jsx("span", { style: { fontSize: 11, color: theme.textPrimary }, children: state.liveLinkStatus.connected
215
- ? state.liveLinkStatus.playState === 'stopped'
216
- ? 'Editor'
217
- : state.liveLinkStatus.playState === 'simulating'
218
- ? 'Simulating'
219
- : 'PIE'
220
- : 'Disconnected' }), jsx("button", { onClick: () => state.liveLinkStatus.connected ? disconnectLiveLink() : connectLiveLink(), style: {
221
- padding: '2px 8px',
222
- fontSize: 10,
223
- backgroundColor: theme.accent,
224
- border: 'none',
225
- borderRadius: 4,
226
- color: '#fff',
227
- cursor: 'pointer',
228
- }, children: state.liveLinkStatus.connected ? 'Disconnect' : 'Connect' })] })] }));
266
+ color: "#fff",
267
+ cursor: "pointer"
268
+ },
269
+ children: state.liveLinkStatus.connected ? "Disconnect" : "Connect"
270
+ }
271
+ )
272
+ ]
273
+ }
274
+ )
275
+ ]
276
+ }
277
+ );
229
278
  };
230
- /* ── Toolbar Component ────────────────────────────────────────── */
231
279
  const BrowserToolbar = () => {
232
- const { state, dispatch, theme, importSelectedAssets } = useBrowser();
233
- const filters = [
234
- { value: 'all', label: 'All Assets' },
235
- { value: 'blueprint', label: 'Blueprints' },
236
- { value: 'level', label: 'Levels' },
237
- { value: 'material', label: 'Materials' },
238
- { value: 'mesh', label: 'Static Meshes' },
239
- { value: 'skeletal_mesh', label: 'Skeletal Meshes' },
240
- { value: 'texture', label: 'Textures' },
241
- { value: 'animation', label: 'Animations' },
242
- { value: 'sound', label: 'Sounds' },
243
- { value: 'particle', label: 'Particles' },
244
- { value: 'widget', label: 'Widgets' },
245
- ];
246
- return (jsxs("div", { style: {
247
- display: 'flex',
248
- alignItems: 'center',
249
- gap: 8,
250
- padding: '8px 16px',
251
- backgroundColor: theme.panelBackground,
252
- borderBottom: `1px solid ${theme.border}`,
253
- }, children: [jsx("div", { style: { flex: 1, maxWidth: 300 }, children: jsx("input", { type: "text", placeholder: "Search Content Browser...", value: state.searchQuery, onChange: (e) => dispatch({ type: 'SET_SEARCH', query: e.target.value }), style: {
254
- width: '100%',
255
- padding: '6px 12px',
256
- fontSize: 12,
257
- backgroundColor: 'rgba(0,0,0,0.3)',
258
- border: `1px solid ${theme.border}`,
259
- borderRadius: 4,
260
- color: theme.textPrimary,
261
- outline: 'none',
262
- } }) }), jsx("select", { value: state.filterType, onChange: (e) => dispatch({ type: 'SET_FILTER', filter: e.target.value }), style: {
263
- padding: '6px 10px',
280
+ const { state, dispatch, theme, importSelectedAssets } = useBrowser();
281
+ const filters = [
282
+ { value: "all", label: "All Assets" },
283
+ { value: "blueprint", label: "Blueprints" },
284
+ { value: "level", label: "Levels" },
285
+ { value: "material", label: "Materials" },
286
+ { value: "mesh", label: "Static Meshes" },
287
+ { value: "skeletal_mesh", label: "Skeletal Meshes" },
288
+ { value: "texture", label: "Textures" },
289
+ { value: "animation", label: "Animations" },
290
+ { value: "sound", label: "Sounds" },
291
+ { value: "particle", label: "Particles" },
292
+ { value: "widget", label: "Widgets" }
293
+ ];
294
+ return /* @__PURE__ */ jsxs(
295
+ "div",
296
+ {
297
+ style: {
298
+ display: "flex",
299
+ alignItems: "center",
300
+ gap: 8,
301
+ padding: "8px 16px",
302
+ backgroundColor: theme.panelBackground,
303
+ borderBottom: `1px solid ${theme.border}`
304
+ },
305
+ children: [
306
+ /* @__PURE__ */ jsx("div", { style: { flex: 1, maxWidth: 300 }, children: /* @__PURE__ */ jsx(
307
+ "input",
308
+ {
309
+ type: "text",
310
+ placeholder: "Search Content Browser...",
311
+ value: state.searchQuery,
312
+ onChange: (e) => dispatch({ type: "SET_SEARCH", query: e.target.value }),
313
+ style: {
314
+ width: "100%",
315
+ padding: "6px 12px",
316
+ fontSize: 12,
317
+ backgroundColor: "rgba(0,0,0,0.3)",
318
+ border: `1px solid ${theme.border}`,
319
+ borderRadius: 4,
320
+ color: theme.textPrimary,
321
+ outline: "none"
322
+ }
323
+ }
324
+ ) }),
325
+ /* @__PURE__ */ jsx(
326
+ "select",
327
+ {
328
+ value: state.filterType,
329
+ onChange: (e) => dispatch({ type: "SET_FILTER", filter: e.target.value }),
330
+ style: {
331
+ padding: "6px 10px",
332
+ fontSize: 12,
333
+ backgroundColor: "rgba(0,0,0,0.3)",
334
+ border: `1px solid ${theme.border}`,
335
+ borderRadius: 4,
336
+ color: theme.textPrimary
337
+ },
338
+ children: filters.map((f) => /* @__PURE__ */ jsx("option", { value: f.value, children: f.label }, f.value))
339
+ }
340
+ ),
341
+ /* @__PURE__ */ jsxs(
342
+ "div",
343
+ {
344
+ style: {
345
+ display: "flex",
346
+ backgroundColor: "rgba(0,0,0,0.2)",
347
+ borderRadius: 4,
348
+ overflow: "hidden"
349
+ },
350
+ children: [
351
+ /* @__PURE__ */ jsx(
352
+ "button",
353
+ {
354
+ onClick: () => dispatch({ type: "SET_VIEW_MODE", mode: "tiles" }),
355
+ "aria-label": "Tile view",
356
+ style: {
357
+ padding: "6px 10px",
264
358
  fontSize: 12,
265
- backgroundColor: 'rgba(0,0,0,0.3)',
266
- border: `1px solid ${theme.border}`,
267
- borderRadius: 4,
268
- color: theme.textPrimary,
269
- }, children: filters.map((f) => (jsx("option", { value: f.value, children: f.label }, f.value))) }), jsxs("div", { style: {
270
- display: 'flex',
271
- backgroundColor: 'rgba(0,0,0,0.2)',
272
- borderRadius: 4,
273
- overflow: 'hidden',
274
- }, children: [jsx("button", { onClick: () => dispatch({ type: 'SET_VIEW_MODE', mode: 'tiles' }), "aria-label": "Tile view", style: {
275
- padding: '6px 10px',
276
- fontSize: 12,
277
- backgroundColor: state.viewMode === 'tiles' ? theme.accent : 'transparent',
278
- border: 'none',
279
- color: '#fff',
280
- cursor: 'pointer',
281
- }, children: jsx(NiceIcon, { name: "grid", size: 14 }) }), jsx("button", { onClick: () => dispatch({ type: 'SET_VIEW_MODE', mode: 'list' }), "aria-label": "List view", style: {
282
- padding: '6px 10px',
283
- fontSize: 12,
284
- backgroundColor: state.viewMode === 'list' ? theme.accent : 'transparent',
285
- border: 'none',
286
- color: '#fff',
287
- cursor: 'pointer',
288
- }, children: jsx(NiceIcon, { name: "list", size: 14 }) }), jsx("button", { onClick: () => dispatch({ type: 'SET_VIEW_MODE', mode: 'columns' }), "aria-label": "Column view", style: {
289
- padding: '6px 10px',
290
- fontSize: 12,
291
- backgroundColor: state.viewMode === 'columns' ? theme.accent : 'transparent',
292
- border: 'none',
293
- color: '#fff',
294
- cursor: 'pointer',
295
- }, children: jsx(NiceIcon, { name: "columns", size: 14 }) })] }), state.viewMode === 'tiles' && (jsxs("select", { value: state.tileSize, onChange: (e) => dispatch({ type: 'SET_TILE_SIZE', size: e.target.value }), style: {
296
- padding: '6px 10px',
359
+ backgroundColor: state.viewMode === "tiles" ? theme.accent : "transparent",
360
+ border: "none",
361
+ color: "#fff",
362
+ cursor: "pointer"
363
+ },
364
+ children: /* @__PURE__ */ jsx(NiceIcon, { name: "grid", size: 14 })
365
+ }
366
+ ),
367
+ /* @__PURE__ */ jsx(
368
+ "button",
369
+ {
370
+ onClick: () => dispatch({ type: "SET_VIEW_MODE", mode: "list" }),
371
+ "aria-label": "List view",
372
+ style: {
373
+ padding: "6px 10px",
297
374
  fontSize: 12,
298
- backgroundColor: 'rgba(0,0,0,0.3)',
299
- border: `1px solid ${theme.border}`,
300
- borderRadius: 4,
301
- color: theme.textPrimary,
302
- }, children: [jsx("option", { value: "small", children: "Small" }), jsx("option", { value: "medium", children: "Medium" }), jsx("option", { value: "large", children: "Large" })] })), jsx("div", { style: { flex: 1 } }), jsxs("span", { style: { fontSize: 11, color: theme.textSecondary }, children: [state.selectedAssets.size, " selected"] }), jsxs("button", { onClick: importSelectedAssets, disabled: state.selectedAssets.size === 0 || state.importing, style: {
303
- padding: '8px 16px',
375
+ backgroundColor: state.viewMode === "list" ? theme.accent : "transparent",
376
+ border: "none",
377
+ color: "#fff",
378
+ cursor: "pointer"
379
+ },
380
+ children: /* @__PURE__ */ jsx(NiceIcon, { name: "list", size: 14 })
381
+ }
382
+ ),
383
+ /* @__PURE__ */ jsx(
384
+ "button",
385
+ {
386
+ onClick: () => dispatch({ type: "SET_VIEW_MODE", mode: "columns" }),
387
+ "aria-label": "Column view",
388
+ style: {
389
+ padding: "6px 10px",
304
390
  fontSize: 12,
305
- fontWeight: 500,
306
- backgroundColor: state.selectedAssets.size > 0 && !state.importing ? theme.accent : theme.textSecondary,
307
- border: 'none',
308
- borderRadius: 4,
309
- color: '#fff',
310
- cursor: state.selectedAssets.size > 0 && !state.importing ? 'pointer' : 'not-allowed',
311
- opacity: state.selectedAssets.size > 0 && !state.importing ? 1 : 0.5,
312
- }, children: [jsx(NiceIcon, { name: state.importing ? 'clock' : 'download', size: 14 }), ' ', state.importing ? `${state.importProgress}%` : 'Import Selected'] })] }));
391
+ backgroundColor: state.viewMode === "columns" ? theme.accent : "transparent",
392
+ border: "none",
393
+ color: "#fff",
394
+ cursor: "pointer"
395
+ },
396
+ children: /* @__PURE__ */ jsx(NiceIcon, { name: "columns", size: 14 })
397
+ }
398
+ )
399
+ ]
400
+ }
401
+ ),
402
+ state.viewMode === "tiles" && /* @__PURE__ */ jsxs(
403
+ "select",
404
+ {
405
+ value: state.tileSize,
406
+ onChange: (e) => dispatch({ type: "SET_TILE_SIZE", size: e.target.value }),
407
+ style: {
408
+ padding: "6px 10px",
409
+ fontSize: 12,
410
+ backgroundColor: "rgba(0,0,0,0.3)",
411
+ border: `1px solid ${theme.border}`,
412
+ borderRadius: 4,
413
+ color: theme.textPrimary
414
+ },
415
+ children: [
416
+ /* @__PURE__ */ jsx("option", { value: "small", children: "Small" }),
417
+ /* @__PURE__ */ jsx("option", { value: "medium", children: "Medium" }),
418
+ /* @__PURE__ */ jsx("option", { value: "large", children: "Large" })
419
+ ]
420
+ }
421
+ ),
422
+ /* @__PURE__ */ jsx("div", { style: { flex: 1 } }),
423
+ /* @__PURE__ */ jsxs("span", { style: { fontSize: 11, color: theme.textSecondary }, children: [
424
+ state.selectedAssets.size,
425
+ " selected"
426
+ ] }),
427
+ /* @__PURE__ */ jsxs(
428
+ "button",
429
+ {
430
+ onClick: importSelectedAssets,
431
+ disabled: state.selectedAssets.size === 0 || state.importing,
432
+ style: {
433
+ padding: "8px 16px",
434
+ fontSize: 12,
435
+ fontWeight: 500,
436
+ backgroundColor: state.selectedAssets.size > 0 && !state.importing ? theme.accent : theme.textSecondary,
437
+ border: "none",
438
+ borderRadius: 4,
439
+ color: "#fff",
440
+ cursor: state.selectedAssets.size > 0 && !state.importing ? "pointer" : "not-allowed",
441
+ opacity: state.selectedAssets.size > 0 && !state.importing ? 1 : 0.5
442
+ },
443
+ children: [
444
+ /* @__PURE__ */ jsx(NiceIcon, { name: state.importing ? "clock" : "download", size: 14 }),
445
+ " ",
446
+ state.importing ? `${state.importProgress}%` : "Import Selected"
447
+ ]
448
+ }
449
+ )
450
+ ]
451
+ }
452
+ );
313
453
  };
314
- /* ── Tab Bar ─────────────────────────────────────────────────── */
315
454
  const TabBar = () => {
316
- const { state, dispatch, theme } = useBrowser();
317
- const tabs = [
318
- { id: 'content', label: 'Content', icon: 'folder' },
319
- { id: 'levels', label: 'Levels', icon: 'map-pin' },
320
- { id: 'plugins', label: 'Plugins', icon: 'plug' },
321
- { id: 'modules', label: 'Modules', icon: 'box' },
322
- { id: 'settings', label: 'Settings', icon: 'settings' },
323
- ];
324
- return (jsx("div", { style: {
325
- display: 'flex',
326
- backgroundColor: theme.panelBackground,
327
- borderBottom: `1px solid ${theme.border}`,
328
- }, children: tabs.map((tab) => (jsxs("button", { onClick: () => dispatch({ type: 'SET_TAB', tab: tab.id }), style: {
329
- flex: 1,
330
- padding: '10px 16px',
331
- fontSize: 12,
332
- backgroundColor: state.tab === tab.id ? theme.background : 'transparent',
333
- border: 'none',
334
- borderBottom: state.tab === tab.id ? `2px solid ${theme.accent}` : '2px solid transparent',
335
- color: state.tab === tab.id ? theme.textPrimary : theme.textSecondary,
336
- cursor: 'pointer',
337
- }, children: [jsx(NiceIcon, { name: tab.icon, size: 14 }), " ", tab.label] }, tab.id))) }));
455
+ const { state, dispatch, theme } = useBrowser();
456
+ const tabs = [
457
+ { id: "content", label: "Content", icon: "folder" },
458
+ { id: "levels", label: "Levels", icon: "map-pin" },
459
+ { id: "plugins", label: "Plugins", icon: "plug" },
460
+ { id: "modules", label: "Modules", icon: "box" },
461
+ { id: "settings", label: "Settings", icon: "settings" }
462
+ ];
463
+ return /* @__PURE__ */ jsx(
464
+ "div",
465
+ {
466
+ style: {
467
+ display: "flex",
468
+ backgroundColor: theme.panelBackground,
469
+ borderBottom: `1px solid ${theme.border}`
470
+ },
471
+ children: tabs.map((tab) => /* @__PURE__ */ jsxs(
472
+ "button",
473
+ {
474
+ onClick: () => dispatch({ type: "SET_TAB", tab: tab.id }),
475
+ style: {
476
+ flex: 1,
477
+ padding: "10px 16px",
478
+ fontSize: 12,
479
+ backgroundColor: state.tab === tab.id ? theme.background : "transparent",
480
+ border: "none",
481
+ borderBottom: state.tab === tab.id ? `2px solid ${theme.accent}` : "2px solid transparent",
482
+ color: state.tab === tab.id ? theme.textPrimary : theme.textSecondary,
483
+ cursor: "pointer"
484
+ },
485
+ children: [
486
+ /* @__PURE__ */ jsx(NiceIcon, { name: tab.icon, size: 14 }),
487
+ " ",
488
+ tab.label
489
+ ]
490
+ },
491
+ tab.id
492
+ ))
493
+ }
494
+ );
338
495
  };
339
- /* ── Asset Tile ───────────────────────────────────────────────── */
340
- const AssetTile = ({ asset, size, }) => {
341
- const { state, dispatch, theme } = useBrowser();
342
- const isSelected = state.selectedAssets.has(asset.id);
343
- const sizeMap = { small: 80, medium: 120, large: 160 };
344
- const tileSize = sizeMap[size];
345
- return (jsxs("div", { role: "button", tabIndex: 0, onKeyDown: clickOnActivationKey, onClick: (e) => dispatch({ type: 'SELECT_ASSET', id: asset.id, additive: e.ctrlKey || e.metaKey }), onDoubleClick: () => dispatch({ type: 'SET_PREVIEW', asset }), style: {
346
- width: tileSize,
347
- display: 'flex',
348
- flexDirection: 'column',
349
- alignItems: 'center',
350
- padding: 8,
351
- backgroundColor: isSelected ? theme.itemSelected : theme.itemBackground,
352
- borderRadius: 4,
353
- border: `1px solid ${isSelected ? theme.accent : 'transparent'}`,
354
- cursor: 'pointer',
355
- }, children: [jsxs("div", { style: {
356
- width: tileSize - 16,
357
- height: tileSize - 16,
358
- backgroundColor: 'rgba(0,0,0,0.3)',
359
- borderRadius: 4,
360
- display: 'flex',
361
- alignItems: 'center',
362
- justifyContent: 'center',
363
- fontSize: tileSize > 100 ? 32 : 24,
364
- marginBottom: 8,
365
- position: 'relative',
366
- }, children: [asset.thumbnail ? (jsx("div", { style: {
367
- width: '100%',
368
- height: '100%',
369
- backgroundImage: `url(${asset.thumbnail})`,
370
- backgroundSize: 'cover',
371
- backgroundPosition: 'center',
372
- borderRadius: 4,
373
- } })) : (jsx(NiceIcon, { name: getAssetIcon(asset.type), size: 32 })), jsx("div", { style: {
374
- position: 'absolute',
375
- bottom: 4,
376
- right: 4,
377
- width: 12,
378
- height: 12,
379
- borderRadius: 2,
380
- backgroundColor: getAssetColor(asset.type, theme),
381
- } })] }), jsx("span", { style: {
382
- fontSize: 10,
383
- color: theme.textPrimary,
384
- textAlign: 'center',
385
- overflow: 'hidden',
386
- textOverflow: 'ellipsis',
387
- whiteSpace: 'nowrap',
388
- width: '100%',
389
- }, children: asset.name })] }));
496
+ const AssetTile = ({
497
+ asset,
498
+ size
499
+ }) => {
500
+ const { state, dispatch, theme } = useBrowser();
501
+ const isSelected = state.selectedAssets.has(asset.id);
502
+ const sizeMap = { small: 80, medium: 120, large: 160 };
503
+ const tileSize = sizeMap[size];
504
+ return /* @__PURE__ */ jsxs(
505
+ "div",
506
+ {
507
+ role: "button",
508
+ tabIndex: 0,
509
+ onKeyDown: clickOnActivationKey,
510
+ onClick: (e) => dispatch({ type: "SELECT_ASSET", id: asset.id, additive: e.ctrlKey || e.metaKey }),
511
+ onDoubleClick: () => dispatch({ type: "SET_PREVIEW", asset }),
512
+ style: {
513
+ width: tileSize,
514
+ display: "flex",
515
+ flexDirection: "column",
516
+ alignItems: "center",
517
+ padding: 8,
518
+ backgroundColor: isSelected ? theme.itemSelected : theme.itemBackground,
519
+ borderRadius: 4,
520
+ border: `1px solid ${isSelected ? theme.accent : "transparent"}`,
521
+ cursor: "pointer"
522
+ },
523
+ children: [
524
+ /* @__PURE__ */ jsxs(
525
+ "div",
526
+ {
527
+ style: {
528
+ width: tileSize - 16,
529
+ height: tileSize - 16,
530
+ backgroundColor: "rgba(0,0,0,0.3)",
531
+ borderRadius: 4,
532
+ display: "flex",
533
+ alignItems: "center",
534
+ justifyContent: "center",
535
+ fontSize: tileSize > 100 ? 32 : 24,
536
+ marginBottom: 8,
537
+ position: "relative"
538
+ },
539
+ children: [
540
+ asset.thumbnail ? /* @__PURE__ */ jsx(
541
+ "div",
542
+ {
543
+ style: {
544
+ width: "100%",
545
+ height: "100%",
546
+ backgroundImage: `url(${asset.thumbnail})`,
547
+ backgroundSize: "cover",
548
+ backgroundPosition: "center",
549
+ borderRadius: 4
550
+ }
551
+ }
552
+ ) : /* @__PURE__ */ jsx(NiceIcon, { name: getAssetIcon(asset.type), size: 32 }),
553
+ /* @__PURE__ */ jsx(
554
+ "div",
555
+ {
556
+ style: {
557
+ position: "absolute",
558
+ bottom: 4,
559
+ right: 4,
560
+ width: 12,
561
+ height: 12,
562
+ borderRadius: 2,
563
+ backgroundColor: getAssetColor(asset.type, theme)
564
+ }
565
+ }
566
+ )
567
+ ]
568
+ }
569
+ ),
570
+ /* @__PURE__ */ jsx(
571
+ "span",
572
+ {
573
+ style: {
574
+ fontSize: 10,
575
+ color: theme.textPrimary,
576
+ textAlign: "center",
577
+ overflow: "hidden",
578
+ textOverflow: "ellipsis",
579
+ whiteSpace: "nowrap",
580
+ width: "100%"
581
+ },
582
+ children: asset.name
583
+ }
584
+ )
585
+ ]
586
+ }
587
+ );
390
588
  };
391
- /* ── Content Panel ────────────────────────────────────────────── */
392
589
  const ContentPanel = () => {
393
- const { state, theme } = useBrowser();
394
- if (!state.projectInfo) {
395
- return (jsx("div", { style: { padding: 20, textAlign: 'center', color: theme.textSecondary }, children: "No project loaded. Select an Unreal project to browse." }));
590
+ const { state, theme } = useBrowser();
591
+ if (!state.projectInfo) {
592
+ return /* @__PURE__ */ jsx("div", { style: { padding: 20, textAlign: "center", color: theme.textSecondary }, children: "No project loaded. Select an Unreal project to browse." });
593
+ }
594
+ const filteredAssets = state.projectInfo.assets.filter((asset) => {
595
+ if (state.filterType !== "all" && asset.type !== state.filterType) {
596
+ return false;
396
597
  }
397
- const filteredAssets = state.projectInfo.assets.filter((asset) => {
398
- if (state.filterType !== 'all' && asset.type !== state.filterType) {
399
- return false;
400
- }
401
- if (state.searchQuery) {
402
- return asset.name.toLowerCase().includes(state.searchQuery.toLowerCase());
403
- }
404
- return true;
405
- });
406
- if (state.viewMode === 'tiles') {
407
- return (jsx("div", { style: {
408
- display: 'flex',
409
- flexWrap: 'wrap',
410
- gap: 8,
411
- padding: 12,
412
- alignContent: 'flex-start',
413
- }, children: filteredAssets.map((asset) => (jsx(AssetTile, { asset: asset, size: state.tileSize }, asset.id))) }));
598
+ if (state.searchQuery) {
599
+ return asset.name.toLowerCase().includes(state.searchQuery.toLowerCase());
414
600
  }
415
- // List view
416
- return (jsx("div", { style: { padding: 8 }, children: filteredAssets.map((asset) => {
417
- const isSelected = state.selectedAssets.has(asset.id);
418
- return jsx(AssetListItem, { asset: asset, isSelected: isSelected }, asset.id);
419
- }) }));
601
+ return true;
602
+ });
603
+ if (state.viewMode === "tiles") {
604
+ return /* @__PURE__ */ jsx(
605
+ "div",
606
+ {
607
+ style: {
608
+ display: "flex",
609
+ flexWrap: "wrap",
610
+ gap: 8,
611
+ padding: 12,
612
+ alignContent: "flex-start"
613
+ },
614
+ children: filteredAssets.map((asset) => /* @__PURE__ */ jsx(AssetTile, { asset, size: state.tileSize }, asset.id))
615
+ }
616
+ );
617
+ }
618
+ return /* @__PURE__ */ jsx("div", { style: { padding: 8 }, children: filteredAssets.map((asset) => {
619
+ const isSelected = state.selectedAssets.has(asset.id);
620
+ return /* @__PURE__ */ jsx(AssetListItem, { asset, isSelected }, asset.id);
621
+ }) });
420
622
  };
421
- const AssetListItem = ({ asset, isSelected, }) => {
422
- const { dispatch, theme } = useBrowser();
423
- return (jsxs("div", { role: "button", tabIndex: 0, onKeyDown: clickOnActivationKey, onClick: (e) => dispatch({ type: 'SELECT_ASSET', id: asset.id, additive: e.ctrlKey || e.metaKey }), onDoubleClick: () => dispatch({ type: 'SET_PREVIEW', asset }), style: {
424
- display: 'flex',
425
- alignItems: 'center',
426
- gap: 12,
427
- padding: '6px 8px',
428
- backgroundColor: isSelected ? theme.itemSelected : 'transparent',
429
- borderRadius: 4,
430
- cursor: 'pointer',
431
- }, children: [jsx("input", { type: "checkbox", checked: isSelected, onChange: () => dispatch({ type: 'SELECT_ASSET', id: asset.id, additive: true }), onClick: (e) => e.stopPropagation() }), jsx("div", { style: {
432
- width: 6,
433
- height: 6,
434
- borderRadius: 2,
435
- backgroundColor: getAssetColor(asset.type, theme),
436
- } }), jsx(NiceIcon, { name: getAssetIcon(asset.type), size: 14 }), jsx("span", { style: { flex: 1, fontSize: 12, color: theme.textPrimary }, children: asset.name }), jsx("span", { style: { fontSize: 11, color: theme.textSecondary }, children: asset.className }), jsx("span", { style: { fontSize: 10, color: theme.textSecondary }, children: formatFileSize(asset.size) })] }));
623
+ const AssetListItem = ({
624
+ asset,
625
+ isSelected
626
+ }) => {
627
+ const { dispatch, theme } = useBrowser();
628
+ return /* @__PURE__ */ jsxs(
629
+ "div",
630
+ {
631
+ role: "button",
632
+ tabIndex: 0,
633
+ onKeyDown: clickOnActivationKey,
634
+ onClick: (e) => dispatch({ type: "SELECT_ASSET", id: asset.id, additive: e.ctrlKey || e.metaKey }),
635
+ onDoubleClick: () => dispatch({ type: "SET_PREVIEW", asset }),
636
+ style: {
637
+ display: "flex",
638
+ alignItems: "center",
639
+ gap: 12,
640
+ padding: "6px 8px",
641
+ backgroundColor: isSelected ? theme.itemSelected : "transparent",
642
+ borderRadius: 4,
643
+ cursor: "pointer"
644
+ },
645
+ children: [
646
+ /* @__PURE__ */ jsx(
647
+ "input",
648
+ {
649
+ type: "checkbox",
650
+ checked: isSelected,
651
+ onChange: () => dispatch({ type: "SELECT_ASSET", id: asset.id, additive: true }),
652
+ onClick: (e) => e.stopPropagation()
653
+ }
654
+ ),
655
+ /* @__PURE__ */ jsx(
656
+ "div",
657
+ {
658
+ style: {
659
+ width: 6,
660
+ height: 6,
661
+ borderRadius: 2,
662
+ backgroundColor: getAssetColor(asset.type, theme)
663
+ }
664
+ }
665
+ ),
666
+ /* @__PURE__ */ jsx(NiceIcon, { name: getAssetIcon(asset.type), size: 14 }),
667
+ /* @__PURE__ */ jsx("span", { style: { flex: 1, fontSize: 12, color: theme.textPrimary }, children: asset.name }),
668
+ /* @__PURE__ */ jsx("span", { style: { fontSize: 11, color: theme.textSecondary }, children: asset.className }),
669
+ /* @__PURE__ */ jsx("span", { style: { fontSize: 10, color: theme.textSecondary }, children: formatFileSize(asset.size) })
670
+ ]
671
+ }
672
+ );
437
673
  };
438
- /* ── Levels Panel ─────────────────────────────────────────────── */
439
674
  const LevelsPanel = () => {
440
- const { state, theme } = useBrowser();
441
- if (!state.projectInfo) {
442
- return null;
443
- }
444
- return (jsxs("div", { style: { padding: 16 }, children: [jsx("h3", { style: { margin: '0 0 16px', fontSize: 14, fontWeight: 600, color: theme.textPrimary }, children: "World Levels" }), state.projectInfo.maps.map((map, i) => (jsxs("div", { style: {
445
- display: 'flex',
446
- alignItems: 'center',
447
- gap: 12,
448
- padding: '12px',
449
- marginBottom: 4,
450
- backgroundColor: theme.itemBackground,
451
- borderRadius: 4,
452
- }, children: [jsx(NiceIcon, { name: "map-pin", size: 20 }), jsxs("div", { style: { flex: 1 }, children: [jsx("div", { style: { fontSize: 13, color: theme.textPrimary, fontWeight: 500 }, children: map.name }), jsx("div", { style: { fontSize: 11, color: theme.textSecondary }, children: map.path })] }), map.persistent && (jsx("span", { style: {
453
- padding: '2px 8px',
454
- fontSize: 10,
455
- backgroundColor: theme.accent,
456
- borderRadius: 4,
457
- color: '#fff',
458
- }, children: "Persistent" })), jsx("button", { style: {
459
- padding: '6px 12px',
460
- fontSize: 11,
461
- backgroundColor: theme.success,
462
- border: 'none',
463
- borderRadius: 4,
464
- color: '#fff',
465
- cursor: 'pointer',
466
- }, children: "Open" })] }, i)))] }));
675
+ const { state, theme } = useBrowser();
676
+ if (!state.projectInfo) {
677
+ return null;
678
+ }
679
+ return /* @__PURE__ */ jsxs("div", { style: { padding: 16 }, children: [
680
+ /* @__PURE__ */ jsx("h3", { style: { margin: "0 0 16px", fontSize: 14, fontWeight: 600, color: theme.textPrimary }, children: "World Levels" }),
681
+ state.projectInfo.maps.map((map, i) => /* @__PURE__ */ jsxs(
682
+ "div",
683
+ {
684
+ style: {
685
+ display: "flex",
686
+ alignItems: "center",
687
+ gap: 12,
688
+ padding: "12px",
689
+ marginBottom: 4,
690
+ backgroundColor: theme.itemBackground,
691
+ borderRadius: 4
692
+ },
693
+ children: [
694
+ /* @__PURE__ */ jsx(NiceIcon, { name: "map-pin", size: 20 }),
695
+ /* @__PURE__ */ jsxs("div", { style: { flex: 1 }, children: [
696
+ /* @__PURE__ */ jsx("div", { style: { fontSize: 13, color: theme.textPrimary, fontWeight: 500 }, children: map.name }),
697
+ /* @__PURE__ */ jsx("div", { style: { fontSize: 11, color: theme.textSecondary }, children: map.path })
698
+ ] }),
699
+ map.persistent && /* @__PURE__ */ jsx(
700
+ "span",
701
+ {
702
+ style: {
703
+ padding: "2px 8px",
704
+ fontSize: 10,
705
+ backgroundColor: theme.accent,
706
+ borderRadius: 4,
707
+ color: "#fff"
708
+ },
709
+ children: "Persistent"
710
+ }
711
+ ),
712
+ /* @__PURE__ */ jsx(
713
+ "button",
714
+ {
715
+ style: {
716
+ padding: "6px 12px",
717
+ fontSize: 11,
718
+ backgroundColor: theme.success,
719
+ border: "none",
720
+ borderRadius: 4,
721
+ color: "#fff",
722
+ cursor: "pointer"
723
+ },
724
+ children: "Open"
725
+ }
726
+ )
727
+ ]
728
+ },
729
+ i
730
+ ))
731
+ ] });
467
732
  };
468
- /* ── Plugins Panel ────────────────────────────────────────────── */
469
733
  const PluginsPanel = () => {
470
- const { state, theme } = useBrowser();
471
- if (!state.projectInfo) {
472
- return null;
473
- }
474
- const groupedPlugins = state.projectInfo.plugins.reduce((acc, plugin) => {
475
- const cat = plugin.category || 'Other';
476
- if (!acc[cat]) {
477
- acc[cat] = [];
734
+ const { state, theme } = useBrowser();
735
+ if (!state.projectInfo) {
736
+ return null;
737
+ }
738
+ const groupedPlugins = state.projectInfo.plugins.reduce(
739
+ (acc, plugin) => {
740
+ const cat = plugin.category || "Other";
741
+ if (!acc[cat]) {
742
+ acc[cat] = [];
743
+ }
744
+ acc[cat].push(plugin);
745
+ return acc;
746
+ },
747
+ {}
748
+ );
749
+ return /* @__PURE__ */ jsxs("div", { style: { padding: 16 }, children: [
750
+ /* @__PURE__ */ jsxs("h3", { style: { margin: "0 0 16px", fontSize: 14, fontWeight: 600, color: theme.textPrimary }, children: [
751
+ "Plugins (",
752
+ state.projectInfo.plugins.length,
753
+ ")"
754
+ ] }),
755
+ Object.entries(groupedPlugins).map(([category, plugins]) => /* @__PURE__ */ jsxs("div", { style: { marginBottom: 16 }, children: [
756
+ /* @__PURE__ */ jsx(
757
+ "div",
758
+ {
759
+ style: { fontSize: 12, fontWeight: 600, color: theme.textSecondary, marginBottom: 8 },
760
+ children: category
478
761
  }
479
- acc[cat].push(plugin);
480
- return acc;
481
- }, {});
482
- return (jsxs("div", { style: { padding: 16 }, children: [jsxs("h3", { style: { margin: '0 0 16px', fontSize: 14, fontWeight: 600, color: theme.textPrimary }, children: ["Plugins (", state.projectInfo.plugins.length, ")"] }), Object.entries(groupedPlugins).map(([category, plugins]) => (jsxs("div", { style: { marginBottom: 16 }, children: [jsx("div", { style: { fontSize: 12, fontWeight: 600, color: theme.textSecondary, marginBottom: 8 }, children: category }), plugins.map((plugin) => (jsxs("div", { style: {
483
- display: 'flex',
484
- alignItems: 'center',
485
- gap: 12,
486
- padding: '10px 12px',
487
- marginBottom: 4,
488
- backgroundColor: theme.itemBackground,
489
- borderRadius: 4,
490
- }, children: [jsx("div", { style: {
491
- width: 8,
492
- height: 8,
493
- borderRadius: '50%',
494
- backgroundColor: plugin.enabled ? theme.success : theme.textSecondary,
495
- } }), jsx("span", { style: { flex: 1, fontSize: 12, color: theme.textPrimary }, children: plugin.name }), jsx("span", { style: { fontSize: 10, color: theme.textSecondary }, children: plugin.version }), jsx("button", { style: {
496
- padding: '4px 10px',
497
- fontSize: 10,
498
- backgroundColor: plugin.enabled ? theme.success : 'rgba(255,255,255,0.1)',
499
- border: 'none',
500
- borderRadius: 4,
501
- color: '#fff',
502
- cursor: 'pointer',
503
- }, children: plugin.enabled ? 'Enabled' : 'Disabled' })] }, plugin.name)))] }, category)))] }));
762
+ ),
763
+ plugins.map((plugin) => /* @__PURE__ */ jsxs(
764
+ "div",
765
+ {
766
+ style: {
767
+ display: "flex",
768
+ alignItems: "center",
769
+ gap: 12,
770
+ padding: "10px 12px",
771
+ marginBottom: 4,
772
+ backgroundColor: theme.itemBackground,
773
+ borderRadius: 4
774
+ },
775
+ children: [
776
+ /* @__PURE__ */ jsx(
777
+ "div",
778
+ {
779
+ style: {
780
+ width: 8,
781
+ height: 8,
782
+ borderRadius: "50%",
783
+ backgroundColor: plugin.enabled ? theme.success : theme.textSecondary
784
+ }
785
+ }
786
+ ),
787
+ /* @__PURE__ */ jsx("span", { style: { flex: 1, fontSize: 12, color: theme.textPrimary }, children: plugin.name }),
788
+ /* @__PURE__ */ jsx("span", { style: { fontSize: 10, color: theme.textSecondary }, children: plugin.version }),
789
+ /* @__PURE__ */ jsx(
790
+ "button",
791
+ {
792
+ style: {
793
+ padding: "4px 10px",
794
+ fontSize: 10,
795
+ backgroundColor: plugin.enabled ? theme.success : "rgba(255,255,255,0.1)",
796
+ border: "none",
797
+ borderRadius: 4,
798
+ color: "#fff",
799
+ cursor: "pointer"
800
+ },
801
+ children: plugin.enabled ? "Enabled" : "Disabled"
802
+ }
803
+ )
804
+ ]
805
+ },
806
+ plugin.name
807
+ ))
808
+ ] }, category))
809
+ ] });
504
810
  };
505
- /* ── Modules Panel ────────────────────────────────────────────── */
506
811
  const ModulesPanel = () => {
507
- const { state, theme } = useBrowser();
508
- if (!state.projectInfo) {
509
- return null;
812
+ const { state, theme } = useBrowser();
813
+ if (!state.projectInfo) {
814
+ return null;
815
+ }
816
+ const getModuleTypeColor = (type) => {
817
+ switch (type) {
818
+ case "Runtime":
819
+ return theme.success;
820
+ case "Editor":
821
+ return theme.accent;
822
+ case "Developer":
823
+ return theme.warning;
824
+ default:
825
+ return theme.textSecondary;
510
826
  }
511
- const getModuleTypeColor = (type) => {
512
- switch (type) {
513
- case 'Runtime':
514
- return theme.success;
515
- case 'Editor':
516
- return theme.accent;
517
- case 'Developer':
518
- return theme.warning;
519
- default:
520
- return theme.textSecondary;
521
- }
522
- };
523
- return (jsxs("div", { style: { padding: 16 }, children: [jsxs("h3", { style: { margin: '0 0 16px', fontSize: 14, fontWeight: 600, color: theme.textPrimary }, children: ["Code Modules (", state.projectInfo.modules.length, ")"] }), state.projectInfo.modules.map((module) => (jsxs("div", { style: {
524
- display: 'flex',
525
- alignItems: 'center',
526
- gap: 12,
527
- padding: '12px',
528
- marginBottom: 4,
529
- backgroundColor: theme.itemBackground,
530
- borderRadius: 4,
531
- }, children: [jsx(NiceIcon, { name: "box", size: 14 }), jsx("span", { style: { flex: 1, fontSize: 13, color: theme.textPrimary, fontWeight: 500 }, children: module.name }), jsx("span", { style: {
532
- padding: '2px 8px',
533
- fontSize: 10,
534
- backgroundColor: getModuleTypeColor(module.type),
535
- borderRadius: 4,
536
- color: '#fff',
537
- }, children: module.type }), jsx("span", { style: { fontSize: 10, color: theme.textSecondary }, children: module.loadingPhase })] }, module.name)))] }));
827
+ };
828
+ return /* @__PURE__ */ jsxs("div", { style: { padding: 16 }, children: [
829
+ /* @__PURE__ */ jsxs("h3", { style: { margin: "0 0 16px", fontSize: 14, fontWeight: 600, color: theme.textPrimary }, children: [
830
+ "Code Modules (",
831
+ state.projectInfo.modules.length,
832
+ ")"
833
+ ] }),
834
+ state.projectInfo.modules.map((module) => /* @__PURE__ */ jsxs(
835
+ "div",
836
+ {
837
+ style: {
838
+ display: "flex",
839
+ alignItems: "center",
840
+ gap: 12,
841
+ padding: "12px",
842
+ marginBottom: 4,
843
+ backgroundColor: theme.itemBackground,
844
+ borderRadius: 4
845
+ },
846
+ children: [
847
+ /* @__PURE__ */ jsx(NiceIcon, { name: "box", size: 14 }),
848
+ /* @__PURE__ */ jsx("span", { style: { flex: 1, fontSize: 13, color: theme.textPrimary, fontWeight: 500 }, children: module.name }),
849
+ /* @__PURE__ */ jsx(
850
+ "span",
851
+ {
852
+ style: {
853
+ padding: "2px 8px",
854
+ fontSize: 10,
855
+ backgroundColor: getModuleTypeColor(module.type),
856
+ borderRadius: 4,
857
+ color: "#fff"
858
+ },
859
+ children: module.type
860
+ }
861
+ ),
862
+ /* @__PURE__ */ jsx("span", { style: { fontSize: 10, color: theme.textSecondary }, children: module.loadingPhase })
863
+ ]
864
+ },
865
+ module.name
866
+ ))
867
+ ] });
538
868
  };
539
- /* ── Settings Panel ───────────────────────────────────────────── */
540
869
  const SettingsPanel = () => {
541
- const { state, theme } = useBrowser();
542
- if (!state.projectInfo) {
543
- return null;
870
+ const { state, theme } = useBrowser();
871
+ if (!state.projectInfo) {
872
+ return null;
873
+ }
874
+ const info = state.projectInfo;
875
+ const settingRow = (label, value) => /* @__PURE__ */ jsxs(
876
+ "div",
877
+ {
878
+ style: {
879
+ display: "flex",
880
+ justifyContent: "space-between",
881
+ padding: "10px 0",
882
+ borderBottom: `1px solid ${theme.border}`
883
+ },
884
+ children: [
885
+ /* @__PURE__ */ jsx("span", { style: { fontSize: 12, color: theme.textSecondary }, children: label }),
886
+ /* @__PURE__ */ jsx("span", { style: { fontSize: 12, color: theme.textPrimary, fontWeight: 500 }, children: value })
887
+ ]
544
888
  }
545
- const info = state.projectInfo;
546
- const settingRow = (label, value) => (jsxs("div", { style: {
547
- display: 'flex',
548
- justifyContent: 'space-between',
549
- padding: '10px 0',
550
- borderBottom: `1px solid ${theme.border}`,
551
- }, children: [jsx("span", { style: { fontSize: 12, color: theme.textSecondary }, children: label }), jsx("span", { style: { fontSize: 12, color: theme.textPrimary, fontWeight: 500 }, children: value })] }));
552
- return (jsxs("div", { style: { padding: 16 }, children: [jsx("h3", { style: { margin: '0 0 16px', fontSize: 14, fontWeight: 600, color: theme.textPrimary }, children: "Project Settings" }), jsxs("div", { style: { backgroundColor: theme.itemBackground, borderRadius: 8, padding: 12 }, children: [settingRow('Project Name', info.name), settingRow('Engine Version', info.engineVersion), settingRow('Engine Branch', info.engineBranch || 'Release'), settingRow('Target Platforms', info.targetPlatforms.join(', ')), settingRow('Default Map', info.config.defaultMap || 'None'), settingRow('Default Game Mode', info.config.defaultGameMode || 'None'), settingRow('Default Pawn', info.config.defaultPawn || 'None'), settingRow('Total Assets', `${info.assets.length}`), settingRow('Plugins', `${info.plugins.length}`), settingRow('Modules', `${info.modules.length}`)] })] }));
889
+ );
890
+ return /* @__PURE__ */ jsxs("div", { style: { padding: 16 }, children: [
891
+ /* @__PURE__ */ jsx("h3", { style: { margin: "0 0 16px", fontSize: 14, fontWeight: 600, color: theme.textPrimary }, children: "Project Settings" }),
892
+ /* @__PURE__ */ jsxs("div", { style: { backgroundColor: theme.itemBackground, borderRadius: 8, padding: 12 }, children: [
893
+ settingRow("Project Name", info.name),
894
+ settingRow("Engine Version", info.engineVersion),
895
+ settingRow("Engine Branch", info.engineBranch || "Release"),
896
+ settingRow("Target Platforms", info.targetPlatforms.join(", ")),
897
+ settingRow("Default Map", info.config.defaultMap || "None"),
898
+ settingRow("Default Game Mode", info.config.defaultGameMode || "None"),
899
+ settingRow("Default Pawn", info.config.defaultPawn || "None"),
900
+ settingRow("Total Assets", `${info.assets.length}`),
901
+ settingRow("Plugins", `${info.plugins.length}`),
902
+ settingRow("Modules", `${info.modules.length}`)
903
+ ] })
904
+ ] });
553
905
  };
554
- // Demo project
555
906
  const DEMO_PROJECT = {
556
- name: 'MyUnrealGame',
557
- path: 'C:/Projects/MyUnrealGame',
558
- engineVersion: '5.3.2',
559
- engineBranch: 'Release',
560
- targetPlatforms: ['Windows', 'Linux', 'PS5', 'XSX'],
561
- plugins: [
562
- { name: 'Paper2D', enabled: true, version: '5.3', category: '2D' },
563
- { name: 'Niagara', enabled: true, version: '5.3', category: 'VFX' },
564
- { name: 'ControlRig', enabled: true, version: '5.3', category: 'Animation' },
565
- { name: 'MetaHuman', enabled: false, version: '5.3', category: 'Characters' },
566
- { name: 'OnlineSubsystemSteam', enabled: true, version: '5.3', category: 'Online' },
567
- ],
568
- modules: [
569
- { name: 'MyUnrealGame', type: 'Runtime', loadingPhase: 'Default' },
570
- { name: 'MyUnrealGameEditor', type: 'Editor', loadingPhase: 'PostEngineInit' },
571
- ],
572
- assets: [
573
- {
574
- id: '1',
575
- name: 'BP_Player',
576
- path: '/Game/Blueprints/BP_Player',
577
- type: 'blueprint',
578
- className: 'Character',
579
- packagePath: '/Game/Blueprints',
580
- size: 125000,
581
- lastModified: '2024-01-15',
582
- selected: false,
583
- },
584
- {
585
- id: '2',
586
- name: 'BP_Enemy',
587
- path: '/Game/Blueprints/BP_Enemy',
588
- type: 'blueprint',
589
- className: 'Character',
590
- packagePath: '/Game/Blueprints',
591
- size: 89000,
592
- lastModified: '2024-01-14',
593
- selected: false,
594
- },
595
- {
596
- id: '3',
597
- name: 'MainLevel',
598
- path: '/Game/Maps/MainLevel',
599
- type: 'level',
600
- className: 'World',
601
- packagePath: '/Game/Maps',
602
- size: 2450000,
603
- lastModified: '2024-01-13',
604
- selected: false,
605
- },
606
- {
607
- id: '4',
608
- name: 'M_Standard',
609
- path: '/Game/Materials/M_Standard',
610
- type: 'material',
611
- className: 'Material',
612
- packagePath: '/Game/Materials',
613
- size: 15000,
614
- lastModified: '2024-01-12',
615
- selected: false,
616
- },
617
- {
618
- id: '5',
619
- name: 'SM_Cube',
620
- path: '/Game/Meshes/SM_Cube',
621
- type: 'mesh',
622
- className: 'StaticMesh',
623
- packagePath: '/Game/Meshes',
624
- size: 5000,
625
- lastModified: '2024-01-11',
626
- selected: false,
627
- },
628
- {
629
- id: '6',
630
- name: 'SK_Character',
631
- path: '/Game/Characters/SK_Character',
632
- type: 'skeletal_mesh',
633
- className: 'SkeletalMesh',
634
- packagePath: '/Game/Characters',
635
- size: 1250000,
636
- lastModified: '2024-01-10',
637
- selected: false,
638
- },
639
- {
640
- id: '7',
641
- name: 'T_Ground',
642
- path: '/Game/Textures/T_Ground',
643
- type: 'texture',
644
- className: 'Texture2D',
645
- packagePath: '/Game/Textures',
646
- size: 4096000,
647
- lastModified: '2024-01-09',
648
- selected: false,
649
- },
650
- {
651
- id: '8',
652
- name: 'NS_Explosion',
653
- path: '/Game/VFX/NS_Explosion',
654
- type: 'particle',
655
- className: 'NiagaraSystem',
656
- packagePath: '/Game/VFX',
657
- size: 45000,
658
- lastModified: '2024-01-08',
659
- selected: false,
660
- },
661
- {
662
- id: '9',
663
- name: 'WBP_HUD',
664
- path: '/Game/UI/WBP_HUD',
665
- type: 'widget',
666
- className: 'WidgetBlueprint',
667
- packagePath: '/Game/UI',
668
- size: 35000,
669
- lastModified: '2024-01-07',
670
- selected: false,
671
- },
672
- ],
673
- contentFolder: {
674
- path: '/Game',
675
- name: 'Game',
676
- expanded: true,
677
- children: [
678
- { path: '/Game/Blueprints', name: 'Blueprints', expanded: false, children: [] },
679
- { path: '/Game/Maps', name: 'Maps', expanded: false, children: [] },
680
- { path: '/Game/Materials', name: 'Materials', expanded: false, children: [] },
681
- { path: '/Game/Meshes', name: 'Meshes', expanded: false, children: [] },
682
- { path: '/Game/Characters', name: 'Characters', expanded: false, children: [] },
683
- { path: '/Game/Textures', name: 'Textures', expanded: false, children: [] },
684
- { path: '/Game/VFX', name: 'VFX', expanded: false, children: [] },
685
- { path: '/Game/UI', name: 'UI', expanded: false, children: [] },
686
- ],
907
+ name: "MyUnrealGame",
908
+ path: "C:/Projects/MyUnrealGame",
909
+ engineVersion: "5.3.2",
910
+ engineBranch: "Release",
911
+ targetPlatforms: ["Windows", "Linux", "PS5", "XSX"],
912
+ plugins: [
913
+ { name: "Paper2D", enabled: true, version: "5.3", category: "2D" },
914
+ { name: "Niagara", enabled: true, version: "5.3", category: "VFX" },
915
+ { name: "ControlRig", enabled: true, version: "5.3", category: "Animation" },
916
+ { name: "MetaHuman", enabled: false, version: "5.3", category: "Characters" },
917
+ { name: "OnlineSubsystemSteam", enabled: true, version: "5.3", category: "Online" }
918
+ ],
919
+ modules: [
920
+ { name: "MyUnrealGame", type: "Runtime", loadingPhase: "Default" },
921
+ { name: "MyUnrealGameEditor", type: "Editor", loadingPhase: "PostEngineInit" }
922
+ ],
923
+ assets: [
924
+ {
925
+ id: "1",
926
+ name: "BP_Player",
927
+ path: "/Game/Blueprints/BP_Player",
928
+ type: "blueprint",
929
+ className: "Character",
930
+ packagePath: "/Game/Blueprints",
931
+ size: 125e3,
932
+ lastModified: "2024-01-15",
933
+ selected: false
934
+ },
935
+ {
936
+ id: "2",
937
+ name: "BP_Enemy",
938
+ path: "/Game/Blueprints/BP_Enemy",
939
+ type: "blueprint",
940
+ className: "Character",
941
+ packagePath: "/Game/Blueprints",
942
+ size: 89e3,
943
+ lastModified: "2024-01-14",
944
+ selected: false
945
+ },
946
+ {
947
+ id: "3",
948
+ name: "MainLevel",
949
+ path: "/Game/Maps/MainLevel",
950
+ type: "level",
951
+ className: "World",
952
+ packagePath: "/Game/Maps",
953
+ size: 245e4,
954
+ lastModified: "2024-01-13",
955
+ selected: false
687
956
  },
688
- maps: [
689
- { name: 'MainLevel', path: '/Game/Maps/MainLevel', persistent: true },
690
- { name: 'Level_01', path: '/Game/Maps/Level_01', persistent: false },
691
- { name: 'Level_02', path: '/Game/Maps/Level_02', persistent: false },
692
- ],
693
- config: {
694
- defaultMap: '/Game/Maps/MainLevel',
695
- defaultGameMode: '/Game/Blueprints/BP_GameMode',
696
- defaultPawn: '/Game/Blueprints/BP_Player',
957
+ {
958
+ id: "4",
959
+ name: "M_Standard",
960
+ path: "/Game/Materials/M_Standard",
961
+ type: "material",
962
+ className: "Material",
963
+ packagePath: "/Game/Materials",
964
+ size: 15e3,
965
+ lastModified: "2024-01-12",
966
+ selected: false
697
967
  },
968
+ {
969
+ id: "5",
970
+ name: "SM_Cube",
971
+ path: "/Game/Meshes/SM_Cube",
972
+ type: "mesh",
973
+ className: "StaticMesh",
974
+ packagePath: "/Game/Meshes",
975
+ size: 5e3,
976
+ lastModified: "2024-01-11",
977
+ selected: false
978
+ },
979
+ {
980
+ id: "6",
981
+ name: "SK_Character",
982
+ path: "/Game/Characters/SK_Character",
983
+ type: "skeletal_mesh",
984
+ className: "SkeletalMesh",
985
+ packagePath: "/Game/Characters",
986
+ size: 125e4,
987
+ lastModified: "2024-01-10",
988
+ selected: false
989
+ },
990
+ {
991
+ id: "7",
992
+ name: "T_Ground",
993
+ path: "/Game/Textures/T_Ground",
994
+ type: "texture",
995
+ className: "Texture2D",
996
+ packagePath: "/Game/Textures",
997
+ size: 4096e3,
998
+ lastModified: "2024-01-09",
999
+ selected: false
1000
+ },
1001
+ {
1002
+ id: "8",
1003
+ name: "NS_Explosion",
1004
+ path: "/Game/VFX/NS_Explosion",
1005
+ type: "particle",
1006
+ className: "NiagaraSystem",
1007
+ packagePath: "/Game/VFX",
1008
+ size: 45e3,
1009
+ lastModified: "2024-01-08",
1010
+ selected: false
1011
+ },
1012
+ {
1013
+ id: "9",
1014
+ name: "WBP_HUD",
1015
+ path: "/Game/UI/WBP_HUD",
1016
+ type: "widget",
1017
+ className: "WidgetBlueprint",
1018
+ packagePath: "/Game/UI",
1019
+ size: 35e3,
1020
+ lastModified: "2024-01-07",
1021
+ selected: false
1022
+ }
1023
+ ],
1024
+ contentFolder: {
1025
+ path: "/Game",
1026
+ name: "Game",
1027
+ expanded: true,
1028
+ children: [
1029
+ { path: "/Game/Blueprints", name: "Blueprints", expanded: false, children: [] },
1030
+ { path: "/Game/Maps", name: "Maps", expanded: false, children: [] },
1031
+ { path: "/Game/Materials", name: "Materials", expanded: false, children: [] },
1032
+ { path: "/Game/Meshes", name: "Meshes", expanded: false, children: [] },
1033
+ { path: "/Game/Characters", name: "Characters", expanded: false, children: [] },
1034
+ { path: "/Game/Textures", name: "Textures", expanded: false, children: [] },
1035
+ { path: "/Game/VFX", name: "VFX", expanded: false, children: [] },
1036
+ { path: "/Game/UI", name: "UI", expanded: false, children: [] }
1037
+ ]
1038
+ },
1039
+ maps: [
1040
+ { name: "MainLevel", path: "/Game/Maps/MainLevel", persistent: true },
1041
+ { name: "Level_01", path: "/Game/Maps/Level_01", persistent: false },
1042
+ { name: "Level_02", path: "/Game/Maps/Level_02", persistent: false }
1043
+ ],
1044
+ config: {
1045
+ defaultMap: "/Game/Maps/MainLevel",
1046
+ defaultGameMode: "/Game/Blueprints/BP_GameMode",
1047
+ defaultPawn: "/Game/Blueprints/BP_Player"
1048
+ }
698
1049
  };
699
1050
  const UnrealProjectBrowser = /* @__PURE__ */ Object.assign(
700
- /* @__PURE__ */ forwardRef(({ projectPath: _projectPath, theme: themeOverride, onProjectLoad, onImport, onLiveLinkConnect, onLiveLinkDisconnect, onHotReload, className, style, }, ref) => {
701
- const [state, dispatch] = useReducer(browserReducer, {
1051
+ /* @__PURE__ */ forwardRef(
1052
+ ({
1053
+ projectPath: _projectPath,
1054
+ theme: themeOverride,
1055
+ onProjectLoad,
1056
+ onImport,
1057
+ onLiveLinkConnect,
1058
+ onLiveLinkDisconnect,
1059
+ onHotReload,
1060
+ className,
1061
+ style
1062
+ }, ref) => {
1063
+ const [state, dispatch] = useReducer(browserReducer, {
702
1064
  ...INITIAL_STATE,
703
- projectInfo: DEMO_PROJECT,
704
- });
705
- const theme = useMemo(() => ({ ...DEFAULT_THEME, ...themeOverride }), [themeOverride]);
706
- // Import selected assets
707
- const importSelectedAssets = useCallback(async () => {
1065
+ projectInfo: DEMO_PROJECT
1066
+ });
1067
+ const theme = useMemo(() => ({ ...DEFAULT_THEME, ...themeOverride }), [themeOverride]);
1068
+ const importSelectedAssets = useCallback(async () => {
708
1069
  if (state.selectedAssets.size === 0 || !state.projectInfo) {
709
- return;
1070
+ return;
710
1071
  }
711
- const selectedAssets = state.projectInfo.assets.filter((a) => state.selectedAssets.has(a.id));
712
- dispatch({ type: 'SET_IMPORTING', importing: true, progress: 0 });
1072
+ const selectedAssets = state.projectInfo.assets.filter(
1073
+ (a) => state.selectedAssets.has(a.id)
1074
+ );
1075
+ dispatch({ type: "SET_IMPORTING", importing: true, progress: 0 });
713
1076
  try {
714
- for (let i = 0; i < selectedAssets.length; i++) {
715
- dispatch({
716
- type: 'SET_IMPORTING',
717
- importing: true,
718
- progress: Math.round(((i + 1) / selectedAssets.length) * 100),
719
- });
720
- await new Promise((resolve) => setTimeout(resolve, 200));
721
- }
722
- if (onImport) {
723
- await onImport(selectedAssets);
724
- }
725
- dispatch({ type: 'DESELECT_ALL' });
726
- }
727
- finally {
728
- dispatch({ type: 'SET_IMPORTING', importing: false });
729
- }
730
- }, [state.selectedAssets, state.projectInfo, onImport]);
731
- // Live Link
732
- const connectLiveLink = useCallback(async () => {
733
- if (onLiveLinkConnect) {
734
- const status = await onLiveLinkConnect();
735
- dispatch({ type: 'SET_LIVE_LINK_STATUS', status });
736
- }
737
- else {
1077
+ for (let i = 0; i < selectedAssets.length; i++) {
738
1078
  dispatch({
739
- type: 'SET_LIVE_LINK_STATUS',
740
- status: {
741
- connected: true,
742
- engineVersion: '5.3.2',
743
- projectName: 'MyUnrealGame',
744
- playState: 'stopped',
745
- compiling: false,
746
- hotReloadAvailable: true,
747
- },
1079
+ type: "SET_IMPORTING",
1080
+ importing: true,
1081
+ progress: Math.round((i + 1) / selectedAssets.length * 100)
748
1082
  });
1083
+ await new Promise((resolve) => setTimeout(resolve, 200));
1084
+ }
1085
+ if (onImport) {
1086
+ await onImport(selectedAssets);
1087
+ }
1088
+ dispatch({ type: "DESELECT_ALL" });
1089
+ } finally {
1090
+ dispatch({ type: "SET_IMPORTING", importing: false });
1091
+ }
1092
+ }, [state.selectedAssets, state.projectInfo, onImport]);
1093
+ const connectLiveLink = useCallback(async () => {
1094
+ if (onLiveLinkConnect) {
1095
+ const status = await onLiveLinkConnect();
1096
+ dispatch({ type: "SET_LIVE_LINK_STATUS", status });
1097
+ } else {
1098
+ dispatch({
1099
+ type: "SET_LIVE_LINK_STATUS",
1100
+ status: {
1101
+ connected: true,
1102
+ engineVersion: "5.3.2",
1103
+ projectName: "MyUnrealGame",
1104
+ playState: "stopped",
1105
+ compiling: false,
1106
+ hotReloadAvailable: true
1107
+ }
1108
+ });
749
1109
  }
750
- }, [onLiveLinkConnect]);
751
- const disconnectLiveLink = useCallback(() => {
1110
+ }, [onLiveLinkConnect]);
1111
+ const disconnectLiveLink = useCallback(() => {
752
1112
  onLiveLinkDisconnect?.();
753
1113
  dispatch({
754
- type: 'SET_LIVE_LINK_STATUS',
755
- status: {
756
- connected: false,
757
- playState: 'stopped',
758
- compiling: false,
759
- hotReloadAvailable: false,
760
- },
1114
+ type: "SET_LIVE_LINK_STATUS",
1115
+ status: {
1116
+ connected: false,
1117
+ playState: "stopped",
1118
+ compiling: false,
1119
+ hotReloadAvailable: false
1120
+ }
761
1121
  });
762
- }, [onLiveLinkDisconnect]);
763
- // Hot Reload
764
- const triggerHotReload = useCallback(async () => {
1122
+ }, [onLiveLinkDisconnect]);
1123
+ const triggerHotReload = useCallback(async () => {
765
1124
  dispatch({
766
- type: 'SET_LIVE_LINK_STATUS',
767
- status: { ...state.liveLinkStatus, compiling: true },
1125
+ type: "SET_LIVE_LINK_STATUS",
1126
+ status: { ...state.liveLinkStatus, compiling: true }
768
1127
  });
769
1128
  try {
770
- if (onHotReload) {
771
- await onHotReload();
772
- }
773
- else {
774
- await new Promise((resolve) => setTimeout(resolve, 2000));
1129
+ if (onHotReload) {
1130
+ await onHotReload();
1131
+ } else {
1132
+ await new Promise((resolve) => setTimeout(resolve, 2e3));
1133
+ }
1134
+ dispatch({
1135
+ type: "SET_LIVE_LINK_STATUS",
1136
+ status: {
1137
+ ...state.liveLinkStatus,
1138
+ compiling: false,
1139
+ lastHotReload: (/* @__PURE__ */ new Date()).toISOString()
775
1140
  }
776
- dispatch({
777
- type: 'SET_LIVE_LINK_STATUS',
778
- status: {
779
- ...state.liveLinkStatus,
780
- compiling: false,
781
- lastHotReload: new Date().toISOString(),
782
- },
783
- });
784
- }
785
- catch {
786
- dispatch({
787
- type: 'SET_LIVE_LINK_STATUS',
788
- status: { ...state.liveLinkStatus, compiling: false },
789
- });
1141
+ });
1142
+ } catch {
1143
+ dispatch({
1144
+ type: "SET_LIVE_LINK_STATUS",
1145
+ status: { ...state.liveLinkStatus, compiling: false }
1146
+ });
790
1147
  }
791
- }, [state.liveLinkStatus, onHotReload]);
792
- // Imperative handle
793
- useImperativeHandle(ref, () => ({
794
- loadProject: async (_path) => {
795
- dispatch({ type: 'SET_PROJECT', info: DEMO_PROJECT });
1148
+ }, [state.liveLinkStatus, onHotReload]);
1149
+ useImperativeHandle(
1150
+ ref,
1151
+ () => ({
1152
+ loadProject: async (_path) => {
1153
+ dispatch({ type: "SET_PROJECT", info: DEMO_PROJECT });
796
1154
  onProjectLoad?.(DEMO_PROJECT);
797
- },
798
- getSelectedAssets: () => {
1155
+ },
1156
+ getSelectedAssets: () => {
799
1157
  if (!state.projectInfo) {
800
- return [];
1158
+ return [];
801
1159
  }
802
1160
  return state.projectInfo.assets.filter((a) => state.selectedAssets.has(a.id));
803
- },
804
- importSelected: importSelectedAssets,
805
- triggerHotReload,
806
- }), [
807
- state.projectInfo,
808
- state.selectedAssets,
809
- importSelectedAssets,
810
- triggerHotReload,
811
- onProjectLoad,
812
- ]);
813
- const ctxValue = useMemo(() => ({
814
- state,
815
- dispatch,
816
- theme,
817
- importSelectedAssets,
818
- connectLiveLink,
819
- disconnectLiveLink,
820
- triggerHotReload,
821
- }), [state, theme, importSelectedAssets, connectLiveLink, disconnectLiveLink, triggerHotReload]);
822
- return (jsx(BrowserContext.Provider, { value: ctxValue, children: jsxs("div", { className: `unreal-project-browser ${className ?? ''}`, style: {
823
- display: 'flex',
824
- flexDirection: 'column',
825
- width: '100%',
826
- height: '100%',
827
- backgroundColor: theme.background,
828
- fontFamily: 'system-ui, sans-serif',
829
- overflow: 'hidden',
830
- ...style,
831
- }, children: [jsx(BrowserHeader, {}), jsx(BrowserToolbar, {}), jsx(TabBar, {}), jsxs("div", { style: { flex: 1, overflow: 'auto' }, children: [state.tab === 'content' && jsx(ContentPanel, {}), state.tab === 'levels' && jsx(LevelsPanel, {}), state.tab === 'plugins' && jsx(PluginsPanel, {}), state.tab === 'modules' && jsx(ModulesPanel, {}), state.tab === 'settings' && jsx(SettingsPanel, {})] })] }) }));
832
- }), { displayName: 'UnrealProjectBrowser' });
833
-
834
- export { UnrealProjectBrowser };
1161
+ },
1162
+ importSelected: importSelectedAssets,
1163
+ triggerHotReload
1164
+ }),
1165
+ [
1166
+ state.projectInfo,
1167
+ state.selectedAssets,
1168
+ importSelectedAssets,
1169
+ triggerHotReload,
1170
+ onProjectLoad
1171
+ ]
1172
+ );
1173
+ const ctxValue = useMemo(
1174
+ () => ({
1175
+ state,
1176
+ dispatch,
1177
+ theme,
1178
+ importSelectedAssets,
1179
+ connectLiveLink,
1180
+ disconnectLiveLink,
1181
+ triggerHotReload
1182
+ }),
1183
+ [state, theme, importSelectedAssets, connectLiveLink, disconnectLiveLink, triggerHotReload]
1184
+ );
1185
+ return /* @__PURE__ */ jsx(BrowserContext.Provider, { value: ctxValue, children: /* @__PURE__ */ jsxs(
1186
+ "div",
1187
+ {
1188
+ className: `unreal-project-browser ${className ?? ""}`,
1189
+ style: {
1190
+ display: "flex",
1191
+ flexDirection: "column",
1192
+ width: "100%",
1193
+ height: "100%",
1194
+ backgroundColor: theme.background,
1195
+ fontFamily: "system-ui, sans-serif",
1196
+ overflow: "hidden",
1197
+ ...style
1198
+ },
1199
+ children: [
1200
+ /* @__PURE__ */ jsx(BrowserHeader, {}),
1201
+ /* @__PURE__ */ jsx(BrowserToolbar, {}),
1202
+ /* @__PURE__ */ jsx(TabBar, {}),
1203
+ /* @__PURE__ */ jsxs("div", { style: { flex: 1, overflow: "auto" }, children: [
1204
+ state.tab === "content" && /* @__PURE__ */ jsx(ContentPanel, {}),
1205
+ state.tab === "levels" && /* @__PURE__ */ jsx(LevelsPanel, {}),
1206
+ state.tab === "plugins" && /* @__PURE__ */ jsx(PluginsPanel, {}),
1207
+ state.tab === "modules" && /* @__PURE__ */ jsx(ModulesPanel, {}),
1208
+ state.tab === "settings" && /* @__PURE__ */ jsx(SettingsPanel, {})
1209
+ ] })
1210
+ ]
1211
+ }
1212
+ ) });
1213
+ }
1214
+ ),
1215
+ { displayName: "UnrealProjectBrowser" }
1216
+ );
1217
+ export {
1218
+ UnrealProjectBrowser
1219
+ };