@nice2dev/game-engine 1.3.15 → 1.3.17

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