@nice2dev/game-engine 1.3.15 → 1.3.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (434) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/dist/cjs/accessibility/Accessibility.js +152 -165
  3. package/dist/cjs/ai/AI.js +292 -294
  4. package/dist/cjs/ai/BehaviorTree.js +1029 -1113
  5. package/dist/cjs/ai/StateMachine.js +694 -756
  6. package/dist/cjs/animation/Animation.js +232 -241
  7. package/dist/cjs/audio/AudioAdvanced.js +221 -236
  8. package/dist/cjs/audio/AudioBridge.js +441 -435
  9. package/dist/cjs/audio/AudioManager.js +242 -259
  10. package/dist/cjs/build-cloud/BuildOrchestration.js +1059 -1098
  11. package/dist/cjs/build-cloud/GodotBuildCloud.js +641 -670
  12. package/dist/cjs/build-cloud/UnityBuildCloud.js +563 -610
  13. package/dist/cjs/build-cloud/UnrealBuildCloud.js +610 -635
  14. package/dist/cjs/core/EventBus.js +51 -56
  15. package/dist/cjs/core/GameClock.js +62 -66
  16. package/dist/cjs/core/GameConfig.js +72 -79
  17. package/dist/cjs/core/GameLoop.js +80 -89
  18. package/dist/cjs/core/ServiceLocator.js +61 -65
  19. package/dist/cjs/core/Validation.js +72 -82
  20. package/dist/cjs/core/math.js +108 -112
  21. package/dist/cjs/devtools/DevTools.js +542 -563
  22. package/dist/cjs/devtools/DeveloperExperience.js +521 -559
  23. package/dist/cjs/devtools/GameplayAnalytics.js +636 -646
  24. package/dist/cjs/dialogue/DialogueSystem.js +984 -986
  25. package/dist/cjs/docs/DocGenerator.js +339 -364
  26. package/dist/cjs/ecs/World.js +355 -371
  27. package/dist/cjs/editor/AchievementEditor.js +580 -636
  28. package/dist/cjs/editor/AdvancedEditor.js +184 -191
  29. package/dist/cjs/editor/AnimationRetargeting.js +696 -741
  30. package/dist/cjs/editor/AssetBrowser.js +1072 -1160
  31. package/dist/cjs/editor/AssetManager.js +187 -192
  32. package/dist/cjs/editor/ConsolePro.js +971 -1061
  33. package/dist/cjs/editor/CraftingEditor.js +680 -730
  34. package/dist/cjs/editor/DebugTools.js +187 -185
  35. package/dist/cjs/editor/DialogueSystem.js +844 -901
  36. package/dist/cjs/editor/LeaderboardSystem.js +429 -483
  37. package/dist/cjs/editor/NiceGameEditor.js +1903 -1201
  38. package/dist/cjs/editor/PrefabSystem.js +772 -838
  39. package/dist/cjs/editor/ProfilerPanel.js +649 -700
  40. package/dist/cjs/editor/QuestEditor.js +792 -839
  41. package/dist/cjs/editor/ReplaySystem.js +585 -634
  42. package/dist/cjs/editor/SceneEditor.js +176 -200
  43. package/dist/cjs/editor/ScreenshotMode.js +621 -688
  44. package/dist/cjs/editor/ShaderGraph.js +1556 -1582
  45. package/dist/cjs/editor/TimelineEditor.js +715 -778
  46. package/dist/cjs/editor/UndoRedoPro.js +830 -904
  47. package/dist/cjs/editor/VRARMode.js +582 -645
  48. package/dist/cjs/engine/NiceGameEngine.js +141 -164
  49. package/dist/cjs/engine/SaveSystem.js +441 -495
  50. package/dist/cjs/enterprise/Enterprise.js +254 -261
  51. package/dist/cjs/export/BevyExporter.js +927 -967
  52. package/dist/cjs/export/CocosExporter.js +644 -673
  53. package/dist/cjs/export/Construct3Exporter.js +783 -794
  54. package/dist/cjs/export/DefoldExporter.js +1028 -1069
  55. package/dist/cjs/export/GDevelopExporter.js +674 -708
  56. package/dist/cjs/export/GameMakerExporter.js +791 -805
  57. package/dist/cjs/export/GodotExporter.js +1003 -1045
  58. package/dist/cjs/export/MinecraftBedrockExporter.js +573 -578
  59. package/dist/cjs/export/MonoGameExporter.js +1265 -1293
  60. package/dist/cjs/export/Pico8Exporter.js +766 -812
  61. package/dist/cjs/export/PlatformExporter.js +188 -206
  62. package/dist/cjs/export/RPGMakerExporter.js +860 -879
  63. package/dist/cjs/export/RobloxExporter.js +883 -919
  64. package/dist/cjs/export/Solar2DExporter.js +1218 -1256
  65. package/dist/cjs/export/ThreeJSExporter.js +1006 -1073
  66. package/dist/cjs/export/Tic80Exporter.js +1210 -1267
  67. package/dist/cjs/export/UnityExporter.js +1116 -1131
  68. package/dist/cjs/export/UnrealExporter.js +889 -919
  69. package/dist/cjs/export/WebExporter.js +931 -970
  70. package/dist/cjs/export/index.js +42 -65
  71. package/dist/cjs/godot-integration/GodotAssetLibrary.js +659 -692
  72. package/dist/cjs/godot-integration/GodotImport.js +929 -1027
  73. package/dist/cjs/godot-integration/GodotLiveLink.js +915 -945
  74. package/dist/cjs/godot-integration/components/GodotProjectBrowser.js +911 -611
  75. package/dist/cjs/i18n/I18n.js +860 -900
  76. package/dist/cjs/i18n/useTranslation.js +84 -89
  77. package/dist/cjs/import/AsepriteImporter.js +658 -716
  78. package/dist/cjs/import/DragonBonesImporter.js +437 -461
  79. package/dist/cjs/import/GameMakerImporter.js +511 -521
  80. package/dist/cjs/import/GodotSceneImporter.js +788 -822
  81. package/dist/cjs/import/LDtkImporter.js +436 -454
  82. package/dist/cjs/import/Live2DImporter.js +497 -518
  83. package/dist/cjs/import/NdgFormat.js +424 -457
  84. package/dist/cjs/import/OgmoImporter.js +466 -493
  85. package/dist/cjs/import/RPGMakerImporter.js +451 -477
  86. package/dist/cjs/import/SceneImporter.js +378 -423
  87. package/dist/cjs/import/SpineImporter.js +511 -546
  88. package/dist/cjs/import/SpriterImporter.js +590 -613
  89. package/dist/cjs/import/TiledMapImporter.js +811 -846
  90. package/dist/cjs/import/UnitySceneImporter.js +687 -703
  91. package/dist/cjs/import/index.js +206 -251
  92. package/dist/cjs/index.js +275 -278
  93. package/dist/cjs/input/GamepadNavigation.js +185 -205
  94. package/dist/cjs/input/InputManager.js +397 -421
  95. package/dist/cjs/input/useGamepads.js +70 -81
  96. package/dist/cjs/integration/IconSprite.js +129 -256
  97. package/dist/cjs/inventory/InventorySystem.js +920 -995
  98. package/dist/cjs/kids/KidMode.js +997 -1022
  99. package/dist/cjs/kids/KidTools.js +570 -594
  100. package/dist/cjs/monetization/Monetization.js +170 -177
  101. package/dist/cjs/multiplayer/LocalMultiplayer.js +287 -287
  102. package/dist/cjs/multiplayer/MiniGameTypes.js +49 -59
  103. package/dist/cjs/native-engine/AnimationSystem.js +731 -806
  104. package/dist/cjs/native-engine/AssetPipeline.js +454 -515
  105. package/dist/cjs/native-engine/AudioEngine.js +763 -804
  106. package/dist/cjs/native-engine/InputSystem.js +1075 -1145
  107. package/dist/cjs/native-engine/NetworkingSystem.js +733 -793
  108. package/dist/cjs/native-engine/PhysicsEngine.js +583 -607
  109. package/dist/cjs/native-engine/RenderingEngine.js +302 -350
  110. package/dist/cjs/native-engine/SceneGraph.js +769 -808
  111. package/dist/cjs/network/MultiplayerTransport.js +97 -132
  112. package/dist/cjs/network/Networking.js +549 -564
  113. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/AbortController.js +21 -29
  114. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/AccessTokenHttpClient.js +40 -48
  115. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/DefaultHttpClient.js +35 -43
  116. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/DefaultReconnectPolicy.js +10 -15
  117. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/Errors.js +103 -135
  118. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/FetchHttpClient.js +131 -158
  119. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/HandshakeProtocol.js +39 -53
  120. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/HeaderNames.js +5 -8
  121. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/HttpClient.js +40 -48
  122. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/HttpConnection.js +494 -572
  123. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/HubConnection.js +826 -953
  124. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/HubConnectionBuilder.js +125 -146
  125. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/IHubProtocol.js +13 -23
  126. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/ILogger.js +11 -25
  127. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/ITransport.js +13 -24
  128. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/JsonHubProtocol.js +108 -121
  129. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/Loggers.js +10 -14
  130. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/LongPollingTransport.js +150 -185
  131. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/MessageBuffer.js +158 -196
  132. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/ServerSentEventsTransport.js +90 -105
  133. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/Subject.js +30 -35
  134. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/TextMessageFormat.js +16 -21
  135. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/Utils.js +215 -248
  136. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/WebSocketTransport.js +135 -157
  137. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/XhrHttpClient.js +76 -85
  138. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/index.js +24 -27
  139. package/dist/cjs/node_modules/@microsoft/signalr/dist/esm/pkg-version.js +3 -4
  140. package/dist/cjs/pathfinding/Pathfinding.js +245 -263
  141. package/dist/cjs/performance/AssetStreaming.js +561 -635
  142. package/dist/cjs/performance/BenchmarkSuite.js +283 -311
  143. package/dist/cjs/performance/DeltaCompression.js +467 -526
  144. package/dist/cjs/performance/DeterministicPhysics.js +450 -498
  145. package/dist/cjs/performance/ECSOptimization.js +644 -695
  146. package/dist/cjs/performance/GameSaveSystem.js +509 -556
  147. package/dist/cjs/performance/HotReload.js +447 -500
  148. package/dist/cjs/performance/InputRecording.js +511 -561
  149. package/dist/cjs/performance/InterestManagement.js +453 -500
  150. package/dist/cjs/performance/LocalizationRuntime.js +376 -423
  151. package/dist/cjs/performance/MemoryManagement.js +410 -470
  152. package/dist/cjs/performance/ModSupport.js +445 -496
  153. package/dist/cjs/performance/MultiThreadedPhysics.js +400 -443
  154. package/dist/cjs/performance/NetworkPrediction.js +424 -482
  155. package/dist/cjs/performance/ObjectPooling.js +569 -617
  156. package/dist/cjs/performance/Performance.js +174 -190
  157. package/dist/cjs/performance/PerformanceAdvanced.js +614 -637
  158. package/dist/cjs/performance/WebGPURenderer.js +656 -683
  159. package/dist/cjs/physics/PhysicsAdvanced.js +345 -379
  160. package/dist/cjs/physics/PhysicsEngine2D.js +391 -427
  161. package/dist/cjs/plugins/PluginSDK.js +432 -466
  162. package/dist/cjs/plugins/PluginTestKit.js +307 -330
  163. package/dist/cjs/procedural/Procedural.js +243 -254
  164. package/dist/cjs/procedural/WorldBuilding.js +297 -314
  165. package/dist/cjs/quest/QuestSystem.js +975 -932
  166. package/dist/cjs/release/MobileExport.js +157 -163
  167. package/dist/cjs/release/Release.js +225 -238
  168. package/dist/cjs/rendering/Camera2D.js +121 -124
  169. package/dist/cjs/rendering/Renderer2D.js +321 -335
  170. package/dist/cjs/rendering/WebGPURenderPipeline.js +632 -651
  171. package/dist/cjs/runtime3d/Runtime3D.js +359 -378
  172. package/dist/cjs/runtime3d/SceneEditor3D.js +252 -263
  173. package/dist/cjs/scene/SceneManager.js +177 -193
  174. package/dist/cjs/scripting/GraphToAST.js +574 -547
  175. package/dist/cjs/scripting/LanguageExporter.js +254 -279
  176. package/dist/cjs/scripting/NodeGraph.js +546 -570
  177. package/dist/cjs/scripting/ScriptAST.js +31 -39
  178. package/dist/cjs/scripting/VisualScripting2.js +1016 -1065
  179. package/dist/cjs/scripting/exporters/CSharpExporter.js +464 -496
  180. package/dist/cjs/scripting/exporters/GDScriptExporter.js +390 -442
  181. package/dist/cjs/scripting/exporters/LuaExporter.js +406 -447
  182. package/dist/cjs/scripting/exporters/PythonExporter.js +484 -549
  183. package/dist/cjs/scripting/exporters/RustExporter.js +459 -512
  184. package/dist/cjs/scripting/exporters/TypeScriptExporter.js +505 -556
  185. package/dist/cjs/social/Social.js +72 -80
  186. package/dist/cjs/systems/LightingSystem.js +844 -931
  187. package/dist/cjs/systems/ParticleSystem2.js +1447 -1451
  188. package/dist/cjs/systems/PhysicsDebugSystem.js +1070 -1141
  189. package/dist/cjs/systems/TerrainSystem.js +985 -1098
  190. package/dist/cjs/templates/ActionTemplates.js +296 -309
  191. package/dist/cjs/templates/FightingTemplate.js +417 -463
  192. package/dist/cjs/templates/MetroidvaniaTemplate.js +353 -405
  193. package/dist/cjs/templates/PartyTemplates.js +190 -202
  194. package/dist/cjs/templates/PuzzleTemplates.js +245 -261
  195. package/dist/cjs/templates/RPGTemplates.js +160 -178
  196. package/dist/cjs/templates/SportsTemplates.js +237 -250
  197. package/dist/cjs/templates/StrategyTemplates.js +143 -153
  198. package/dist/cjs/templates/SurvivalTemplate.js +336 -380
  199. package/dist/cjs/templates/WaveDefense.js +499 -526
  200. package/dist/cjs/tilemap/Tilemap.js +207 -214
  201. package/dist/cjs/tutorials/TutorialBranching.js +396 -417
  202. package/dist/cjs/tutorials/TutorialEngine.js +888 -931
  203. package/dist/cjs/tutorials/TutorialOverlay.js +602 -640
  204. package/dist/cjs/tutorials/content/Tutorials_T05_T08.js +787 -809
  205. package/dist/cjs/tutorials/content/Tutorials_T09_T11.js +736 -756
  206. package/dist/cjs/tutorials/content/Tutorials_T12_T15.js +754 -778
  207. package/dist/cjs/ui/GameUI.js +295 -312
  208. package/dist/cjs/unity-integration/UnityAssetStore.js +700 -741
  209. package/dist/cjs/unity-integration/UnityImport.js +1066 -1176
  210. package/dist/cjs/unity-integration/UnityLiveLink.js +934 -981
  211. package/dist/cjs/unity-integration/components/UnityAssetStoreBrowser.js +1233 -757
  212. package/dist/cjs/unity-integration/components/UnityProjectBrowser.js +1240 -768
  213. package/dist/cjs/unreal-integration/UnrealImport.js +391 -412
  214. package/dist/cjs/unreal-integration/UnrealLiveLink.js +1102 -1137
  215. package/dist/cjs/unreal-integration/UnrealMarketplace.js +436 -473
  216. package/dist/cjs/unreal-integration/components/UnrealProjectBrowser.js +1150 -767
  217. package/dist/cjs/xr/ARVR.js +167 -175
  218. package/dist/esm/accessibility/Accessibility.js +160 -164
  219. package/dist/esm/ai/AI.js +310 -293
  220. package/dist/esm/ai/BehaviorTree.js +1057 -1112
  221. package/dist/esm/ai/StateMachine.js +709 -755
  222. package/dist/esm/animation/Animation.js +237 -240
  223. package/dist/esm/audio/AudioAdvanced.js +239 -235
  224. package/dist/esm/audio/AudioBridge.js +448 -434
  225. package/dist/esm/audio/AudioManager.js +243 -258
  226. package/dist/esm/build-cloud/BuildOrchestration.js +1071 -1097
  227. package/dist/esm/build-cloud/GodotBuildCloud.js +647 -669
  228. package/dist/esm/build-cloud/UnityBuildCloud.js +571 -609
  229. package/dist/esm/build-cloud/UnrealBuildCloud.js +615 -634
  230. package/dist/esm/core/EventBus.js +52 -55
  231. package/dist/esm/core/GameClock.js +63 -65
  232. package/dist/esm/core/GameConfig.js +77 -78
  233. package/dist/esm/core/GameLoop.js +81 -88
  234. package/dist/esm/core/ServiceLocator.js +63 -64
  235. package/dist/esm/core/Validation.js +82 -81
  236. package/dist/esm/core/math.js +109 -111
  237. package/dist/esm/devtools/DevTools.js +546 -562
  238. package/dist/esm/devtools/DeveloperExperience.js +535 -558
  239. package/dist/esm/devtools/GameplayAnalytics.js +647 -645
  240. package/dist/esm/dialogue/DialogueSystem.js +998 -985
  241. package/dist/esm/docs/DocGenerator.js +342 -363
  242. package/dist/esm/ecs/World.js +358 -370
  243. package/dist/esm/editor/AchievementEditor.js +584 -635
  244. package/dist/esm/editor/AdvancedEditor.js +191 -190
  245. package/dist/esm/editor/AnimationRetargeting.js +700 -740
  246. package/dist/esm/editor/AssetBrowser.js +1078 -1159
  247. package/dist/esm/editor/AssetManager.js +188 -191
  248. package/dist/esm/editor/ConsolePro.js +977 -1060
  249. package/dist/esm/editor/CraftingEditor.js +684 -729
  250. package/dist/esm/editor/DebugTools.js +194 -184
  251. package/dist/esm/editor/DialogueSystem.js +849 -900
  252. package/dist/esm/editor/LeaderboardSystem.js +433 -482
  253. package/dist/esm/editor/NiceGameEditor.js +1908 -1200
  254. package/dist/esm/editor/PrefabSystem.js +777 -837
  255. package/dist/esm/editor/ProfilerPanel.js +654 -699
  256. package/dist/esm/editor/QuestEditor.js +795 -838
  257. package/dist/esm/editor/ReplaySystem.js +591 -633
  258. package/dist/esm/editor/SceneEditor.js +189 -199
  259. package/dist/esm/editor/ScreenshotMode.js +628 -687
  260. package/dist/esm/editor/ShaderGraph.js +1565 -1581
  261. package/dist/esm/editor/TimelineEditor.js +733 -777
  262. package/dist/esm/editor/UndoRedoPro.js +835 -903
  263. package/dist/esm/editor/VRARMode.js +586 -644
  264. package/dist/esm/engine/NiceGameEngine.js +142 -163
  265. package/dist/esm/engine/SaveSystem.js +447 -494
  266. package/dist/esm/enterprise/Enterprise.js +265 -260
  267. package/dist/esm/export/BevyExporter.js +929 -966
  268. package/dist/esm/export/CocosExporter.js +646 -672
  269. package/dist/esm/export/Construct3Exporter.js +785 -793
  270. package/dist/esm/export/DefoldExporter.js +1030 -1068
  271. package/dist/esm/export/GDevelopExporter.js +676 -707
  272. package/dist/esm/export/GameMakerExporter.js +793 -804
  273. package/dist/esm/export/GodotExporter.js +1004 -1044
  274. package/dist/esm/export/MinecraftBedrockExporter.js +575 -577
  275. package/dist/esm/export/MonoGameExporter.js +1267 -1292
  276. package/dist/esm/export/Pico8Exporter.js +768 -811
  277. package/dist/esm/export/PlatformExporter.js +193 -205
  278. package/dist/esm/export/RPGMakerExporter.js +862 -878
  279. package/dist/esm/export/RobloxExporter.js +885 -918
  280. package/dist/esm/export/Solar2DExporter.js +1220 -1255
  281. package/dist/esm/export/ThreeJSExporter.js +1007 -1072
  282. package/dist/esm/export/Tic80Exporter.js +1212 -1266
  283. package/dist/esm/export/UnityExporter.js +1117 -1130
  284. package/dist/esm/export/UnrealExporter.js +891 -918
  285. package/dist/esm/export/WebExporter.js +933 -969
  286. package/dist/esm/export/index.js +86 -71
  287. package/dist/esm/godot-integration/GodotAssetLibrary.js +663 -691
  288. package/dist/esm/godot-integration/GodotImport.js +935 -1026
  289. package/dist/esm/godot-integration/GodotLiveLink.js +918 -944
  290. package/dist/esm/godot-integration/components/GodotProjectBrowser.js +912 -610
  291. package/dist/esm/i18n/I18n.js +871 -899
  292. package/dist/esm/i18n/useTranslation.js +88 -88
  293. package/dist/esm/import/AsepriteImporter.js +637 -715
  294. package/dist/esm/import/DragonBonesImporter.js +417 -460
  295. package/dist/esm/import/GameMakerImporter.js +491 -520
  296. package/dist/esm/import/GodotSceneImporter.js +767 -821
  297. package/dist/esm/import/LDtkImporter.js +415 -453
  298. package/dist/esm/import/Live2DImporter.js +477 -517
  299. package/dist/esm/import/NdgFormat.js +410 -456
  300. package/dist/esm/import/OgmoImporter.js +446 -492
  301. package/dist/esm/import/RPGMakerImporter.js +431 -476
  302. package/dist/esm/import/SceneImporter.js +385 -422
  303. package/dist/esm/import/SpineImporter.js +491 -545
  304. package/dist/esm/import/SpriterImporter.js +570 -612
  305. package/dist/esm/import/TiledMapImporter.js +790 -845
  306. package/dist/esm/import/UnitySceneImporter.js +666 -702
  307. package/dist/esm/import/index.js +247 -258
  308. package/dist/esm/index.js +1332 -188
  309. package/dist/esm/input/GamepadNavigation.js +187 -204
  310. package/dist/esm/input/InputManager.js +401 -420
  311. package/dist/esm/input/useGamepads.js +72 -80
  312. package/dist/esm/integration/IconSprite.js +143 -255
  313. package/dist/esm/inventory/InventorySystem.js +925 -994
  314. package/dist/esm/kids/KidMode.js +1003 -1021
  315. package/dist/esm/kids/KidTools.js +573 -593
  316. package/dist/esm/monetization/Monetization.js +180 -176
  317. package/dist/esm/multiplayer/LocalMultiplayer.js +290 -286
  318. package/dist/esm/multiplayer/MiniGameTypes.js +58 -58
  319. package/dist/esm/native-engine/AnimationSystem.js +735 -805
  320. package/dist/esm/native-engine/AssetPipeline.js +456 -514
  321. package/dist/esm/native-engine/AudioEngine.js +765 -803
  322. package/dist/esm/native-engine/InputSystem.js +1079 -1144
  323. package/dist/esm/native-engine/NetworkingSystem.js +740 -792
  324. package/dist/esm/native-engine/PhysicsEngine.js +585 -606
  325. package/dist/esm/native-engine/RenderingEngine.js +304 -349
  326. package/dist/esm/native-engine/SceneGraph.js +773 -807
  327. package/dist/esm/network/MultiplayerTransport.js +99 -131
  328. package/dist/esm/network/Networking.js +556 -563
  329. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/AbortController.js +22 -28
  330. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/AccessTokenHttpClient.js +41 -47
  331. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/DefaultHttpClient.js +36 -42
  332. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/DefaultReconnectPolicy.js +11 -14
  333. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/Errors.js +111 -134
  334. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/FetchHttpClient.js +132 -157
  335. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/HandshakeProtocol.js +40 -52
  336. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/HeaderNames.js +6 -7
  337. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/HttpClient.js +42 -47
  338. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/HttpConnection.js +496 -571
  339. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/HubConnection.js +828 -952
  340. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/HubConnectionBuilder.js +126 -145
  341. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/IHubProtocol.js +14 -23
  342. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/ILogger.js +12 -25
  343. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/ITransport.js +15 -24
  344. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/JsonHubProtocol.js +109 -120
  345. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/Loggers.js +11 -13
  346. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/LongPollingTransport.js +151 -184
  347. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/MessageBuffer.js +159 -195
  348. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/ServerSentEventsTransport.js +91 -104
  349. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/Subject.js +31 -34
  350. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/TextMessageFormat.js +17 -20
  351. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/Utils.js +230 -248
  352. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/WebSocketTransport.js +136 -156
  353. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/XhrHttpClient.js +77 -84
  354. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/index.js +31 -12
  355. package/dist/esm/node_modules/@microsoft/signalr/dist/esm/pkg-version.js +4 -3
  356. package/dist/esm/pathfinding/Pathfinding.js +249 -262
  357. package/dist/esm/performance/AssetStreaming.js +567 -634
  358. package/dist/esm/performance/BenchmarkSuite.js +285 -310
  359. package/dist/esm/performance/DeltaCompression.js +478 -525
  360. package/dist/esm/performance/DeterministicPhysics.js +479 -497
  361. package/dist/esm/performance/ECSOptimization.js +653 -694
  362. package/dist/esm/performance/GameSaveSystem.js +515 -555
  363. package/dist/esm/performance/HotReload.js +454 -499
  364. package/dist/esm/performance/InputRecording.js +520 -560
  365. package/dist/esm/performance/InterestManagement.js +460 -499
  366. package/dist/esm/performance/LocalizationRuntime.js +382 -422
  367. package/dist/esm/performance/MemoryManagement.js +415 -469
  368. package/dist/esm/performance/ModSupport.js +455 -495
  369. package/dist/esm/performance/MultiThreadedPhysics.js +408 -442
  370. package/dist/esm/performance/NetworkPrediction.js +436 -481
  371. package/dist/esm/performance/ObjectPooling.js +582 -616
  372. package/dist/esm/performance/Performance.js +182 -189
  373. package/dist/esm/performance/PerformanceAdvanced.js +621 -636
  374. package/dist/esm/performance/WebGPURenderer.js +660 -682
  375. package/dist/esm/physics/PhysicsAdvanced.js +359 -378
  376. package/dist/esm/physics/PhysicsEngine2D.js +393 -426
  377. package/dist/esm/plugins/PluginSDK.js +435 -465
  378. package/dist/esm/plugins/PluginTestKit.js +315 -329
  379. package/dist/esm/procedural/Procedural.js +248 -253
  380. package/dist/esm/procedural/WorldBuilding.js +316 -313
  381. package/dist/esm/quest/QuestSystem.js +982 -931
  382. package/dist/esm/release/MobileExport.js +163 -162
  383. package/dist/esm/release/Release.js +234 -237
  384. package/dist/esm/rendering/Camera2D.js +122 -123
  385. package/dist/esm/rendering/Renderer2D.js +323 -334
  386. package/dist/esm/rendering/WebGPURenderPipeline.js +647 -650
  387. package/dist/esm/runtime3d/Runtime3D.js +368 -377
  388. package/dist/esm/runtime3d/SceneEditor3D.js +268 -262
  389. package/dist/esm/scene/SceneManager.js +178 -192
  390. package/dist/esm/scripting/GraphToAST.js +576 -546
  391. package/dist/esm/scripting/LanguageExporter.js +263 -278
  392. package/dist/esm/scripting/NodeGraph.js +550 -569
  393. package/dist/esm/scripting/ScriptAST.js +45 -38
  394. package/dist/esm/scripting/VisualScripting2.js +1025 -1064
  395. package/dist/esm/scripting/exporters/CSharpExporter.js +465 -495
  396. package/dist/esm/scripting/exporters/GDScriptExporter.js +391 -441
  397. package/dist/esm/scripting/exporters/LuaExporter.js +407 -446
  398. package/dist/esm/scripting/exporters/PythonExporter.js +485 -548
  399. package/dist/esm/scripting/exporters/RustExporter.js +460 -511
  400. package/dist/esm/scripting/exporters/TypeScriptExporter.js +506 -555
  401. package/dist/esm/social/Social.js +77 -79
  402. package/dist/esm/systems/LightingSystem.js +855 -930
  403. package/dist/esm/systems/ParticleSystem2.js +1453 -1450
  404. package/dist/esm/systems/PhysicsDebugSystem.js +1078 -1140
  405. package/dist/esm/systems/TerrainSystem.js +996 -1097
  406. package/dist/esm/templates/ActionTemplates.js +307 -308
  407. package/dist/esm/templates/FightingTemplate.js +439 -462
  408. package/dist/esm/templates/MetroidvaniaTemplate.js +391 -404
  409. package/dist/esm/templates/PartyTemplates.js +206 -201
  410. package/dist/esm/templates/PuzzleTemplates.js +260 -260
  411. package/dist/esm/templates/RPGTemplates.js +172 -177
  412. package/dist/esm/templates/SportsTemplates.js +251 -249
  413. package/dist/esm/templates/StrategyTemplates.js +158 -152
  414. package/dist/esm/templates/SurvivalTemplate.js +367 -379
  415. package/dist/esm/templates/WaveDefense.js +501 -525
  416. package/dist/esm/tilemap/Tilemap.js +209 -213
  417. package/dist/esm/tutorials/TutorialBranching.js +399 -416
  418. package/dist/esm/tutorials/TutorialEngine.js +893 -930
  419. package/dist/esm/tutorials/TutorialOverlay.js +603 -639
  420. package/dist/esm/tutorials/content/Tutorials_T05_T08.js +792 -808
  421. package/dist/esm/tutorials/content/Tutorials_T09_T11.js +740 -755
  422. package/dist/esm/tutorials/content/Tutorials_T12_T15.js +759 -777
  423. package/dist/esm/ui/GameUI.js +296 -311
  424. package/dist/esm/unity-integration/UnityAssetStore.js +704 -740
  425. package/dist/esm/unity-integration/UnityImport.js +1071 -1175
  426. package/dist/esm/unity-integration/UnityLiveLink.js +938 -980
  427. package/dist/esm/unity-integration/components/UnityAssetStoreBrowser.js +1234 -756
  428. package/dist/esm/unity-integration/components/UnityProjectBrowser.js +1241 -767
  429. package/dist/esm/unreal-integration/UnrealImport.js +395 -411
  430. package/dist/esm/unreal-integration/UnrealLiveLink.js +1105 -1136
  431. package/dist/esm/unreal-integration/UnrealMarketplace.js +442 -472
  432. package/dist/esm/unreal-integration/components/UnrealProjectBrowser.js +1151 -766
  433. package/dist/esm/xr/ARVR.js +181 -174
  434. package/package.json +7 -12
@@ -1,667 +1,969 @@
1
- import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
- import { NiceIcon, clickOnActivationKey } from '@nice2dev/ui';
3
- import { forwardRef, useReducer, useMemo, useCallback, useImperativeHandle, createContext, useContext } from 'react';
4
-
1
+ import { jsx, jsxs, Fragment } from "react/jsx-runtime";
2
+ import { NiceIcon, clickOnActivationKey } from "@nice2dev/ui";
3
+ import { forwardRef, useReducer, useMemo, useCallback, useImperativeHandle, createContext, useContext } from "react";
5
4
  const DEFAULT_THEME = {
6
- background: '#1d2229',
7
- panelBackground: '#252d38',
8
- headerBackground: '#1a2028',
9
- itemBackground: 'rgba(255,255,255,0.02)',
10
- itemHover: 'rgba(255,255,255,0.05)',
11
- itemSelected: 'rgba(73, 140, 200, 0.2)',
12
- textPrimary: '#e0e6ed',
13
- textSecondary: '#8a99a8',
14
- accent: '#478cbf',
15
- success: '#38b54a',
16
- warning: '#e0c138',
17
- danger: '#dd5555',
18
- border: 'rgba(255,255,255,0.08)',
19
- godotBlue: '#478cbf',
20
- sceneColor: '#6ccdd8',
21
- scriptColor: '#a3d17a',
22
- resourceColor: '#c9bc57',
5
+ background: "#1d2229",
6
+ panelBackground: "#252d38",
7
+ headerBackground: "#1a2028",
8
+ itemBackground: "rgba(255,255,255,0.02)",
9
+ itemHover: "rgba(255,255,255,0.05)",
10
+ itemSelected: "rgba(73, 140, 200, 0.2)",
11
+ textPrimary: "#e0e6ed",
12
+ textSecondary: "#8a99a8",
13
+ accent: "#478cbf",
14
+ success: "#38b54a",
15
+ warning: "#e0c138",
16
+ danger: "#dd5555",
17
+ border: "rgba(255,255,255,0.08)",
18
+ godotBlue: "#478cbf",
19
+ sceneColor: "#6ccdd8",
20
+ scriptColor: "#a3d17a",
21
+ resourceColor: "#c9bc57"
23
22
  };
24
23
  function browserReducer(state, action) {
25
- switch (action.type) {
26
- case 'SET_PROJECT':
27
- return { ...state, projectInfo: action.info, selectedResources: new Set() };
28
- case 'CLEAR_PROJECT':
29
- return { ...state, projectInfo: null, selectedResources: new Set() };
30
- case 'SELECT_RESOURCE':
31
- if (action.additive) {
32
- const newSet = new Set(state.selectedResources);
33
- if (newSet.has(action.id)) {
34
- newSet.delete(action.id);
35
- }
36
- else {
37
- newSet.add(action.id);
38
- }
39
- return { ...state, selectedResources: newSet };
40
- }
41
- return { ...state, selectedResources: new Set([action.id]) };
42
- case 'SELECT_ALL':
43
- return {
44
- ...state,
45
- selectedResources: new Set(state.projectInfo?.resources.map((r) => r.id) ?? []),
46
- };
47
- case 'DESELECT_ALL':
48
- return { ...state, selectedResources: new Set() };
49
- case 'TOGGLE_FOLDER': {
50
- const expanded = new Set(state.expandedFolders);
51
- if (expanded.has(action.path)) {
52
- expanded.delete(action.path);
53
- }
54
- else {
55
- expanded.add(action.path);
56
- }
57
- return { ...state, expandedFolders: expanded };
24
+ switch (action.type) {
25
+ case "SET_PROJECT":
26
+ return { ...state, projectInfo: action.info, selectedResources: /* @__PURE__ */ new Set() };
27
+ case "CLEAR_PROJECT":
28
+ return { ...state, projectInfo: null, selectedResources: /* @__PURE__ */ new Set() };
29
+ case "SELECT_RESOURCE":
30
+ if (action.additive) {
31
+ const newSet = new Set(state.selectedResources);
32
+ if (newSet.has(action.id)) {
33
+ newSet.delete(action.id);
34
+ } else {
35
+ newSet.add(action.id);
58
36
  }
59
- case 'SET_SEARCH':
60
- return { ...state, searchQuery: action.query };
61
- case 'SET_FILTER':
62
- return { ...state, filterType: action.filter };
63
- case 'SET_VIEW_MODE':
64
- return { ...state, viewMode: action.mode };
65
- case 'SET_PREVIEW':
66
- return { ...state, previewResource: action.resource };
67
- case 'SET_SYNC_STATUS':
68
- return { ...state, syncStatus: action.status };
69
- case 'SET_IMPORTING':
70
- return {
71
- ...state,
72
- importing: action.importing,
73
- importProgress: action.progress ?? state.importProgress,
74
- };
75
- case 'SET_TAB':
76
- return { ...state, tab: action.tab };
77
- default:
78
- return state;
37
+ return { ...state, selectedResources: newSet };
38
+ }
39
+ return { ...state, selectedResources: /* @__PURE__ */ new Set([action.id]) };
40
+ case "SELECT_ALL":
41
+ return {
42
+ ...state,
43
+ selectedResources: new Set(state.projectInfo?.resources.map((r) => r.id) ?? [])
44
+ };
45
+ case "DESELECT_ALL":
46
+ return { ...state, selectedResources: /* @__PURE__ */ new Set() };
47
+ case "TOGGLE_FOLDER": {
48
+ const expanded = new Set(state.expandedFolders);
49
+ if (expanded.has(action.path)) {
50
+ expanded.delete(action.path);
51
+ } else {
52
+ expanded.add(action.path);
53
+ }
54
+ return { ...state, expandedFolders: expanded };
79
55
  }
56
+ case "SET_SEARCH":
57
+ return { ...state, searchQuery: action.query };
58
+ case "SET_FILTER":
59
+ return { ...state, filterType: action.filter };
60
+ case "SET_VIEW_MODE":
61
+ return { ...state, viewMode: action.mode };
62
+ case "SET_PREVIEW":
63
+ return { ...state, previewResource: action.resource };
64
+ case "SET_SYNC_STATUS":
65
+ return { ...state, syncStatus: action.status };
66
+ case "SET_IMPORTING":
67
+ return {
68
+ ...state,
69
+ importing: action.importing,
70
+ importProgress: action.progress ?? state.importProgress
71
+ };
72
+ case "SET_TAB":
73
+ return { ...state, tab: action.tab };
74
+ default:
75
+ return state;
76
+ }
80
77
  }
81
78
  const INITIAL_STATE = {
82
- projectInfo: null,
83
- selectedResources: new Set(),
84
- expandedFolders: new Set(['res://']),
85
- searchQuery: '',
86
- filterType: 'all',
87
- viewMode: 'tree',
88
- previewResource: null,
89
- syncStatus: { connected: false, isRunning: false, debuggerConnected: false },
90
- importing: false,
91
- importProgress: 0,
92
- tab: 'files',
79
+ projectInfo: null,
80
+ selectedResources: /* @__PURE__ */ new Set(),
81
+ expandedFolders: /* @__PURE__ */ new Set(["res://"]),
82
+ searchQuery: "",
83
+ filterType: "all",
84
+ viewMode: "tree",
85
+ previewResource: null,
86
+ syncStatus: { connected: false, isRunning: false, debuggerConnected: false },
87
+ importing: false,
88
+ importProgress: 0,
89
+ tab: "files"
93
90
  };
94
91
  const BrowserContext = /* @__PURE__ */ createContext(null);
95
92
  function useBrowser() {
96
- const ctx = useContext(BrowserContext);
97
- if (!ctx) {
98
- throw new Error('useBrowser must be used within GodotProjectBrowser');
99
- }
100
- return ctx;
93
+ const ctx = useContext(BrowserContext);
94
+ if (!ctx) {
95
+ throw new Error("useBrowser must be used within GodotProjectBrowser");
96
+ }
97
+ return ctx;
101
98
  }
102
- /* ── Helper Functions ─────────────────────────────────────────── */
103
99
  function getResourceIcon(type) {
104
- switch (type) {
105
- case 'scene':
106
- return 'video';
107
- case 'script':
108
- return 'code';
109
- case 'resource':
110
- return 'file';
111
- case 'texture':
112
- return 'image';
113
- case 'audio':
114
- return 'volume';
115
- case 'mesh':
116
- return 'hexagon';
117
- case 'material':
118
- return 'palette';
119
- case 'animation':
120
- return 'play';
121
- case 'shader':
122
- return 'wand';
123
- case 'theme':
124
- return 'layers';
125
- default:
126
- return 'file';
127
- }
100
+ switch (type) {
101
+ case "scene":
102
+ return "video";
103
+ case "script":
104
+ return "code";
105
+ case "resource":
106
+ return "file";
107
+ case "texture":
108
+ return "image";
109
+ case "audio":
110
+ return "volume";
111
+ case "mesh":
112
+ return "hexagon";
113
+ case "material":
114
+ return "palette";
115
+ case "animation":
116
+ return "play";
117
+ case "shader":
118
+ return "wand";
119
+ case "theme":
120
+ return "layers";
121
+ default:
122
+ return "file";
123
+ }
128
124
  }
129
125
  function formatFileSize(bytes) {
130
- if (bytes < 1024) {
131
- return `${bytes} B`;
132
- }
133
- if (bytes < 1024 * 1024) {
134
- return `${(bytes / 1024).toFixed(1)} KB`;
135
- }
136
- return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
126
+ if (bytes < 1024) {
127
+ return `${bytes} B`;
128
+ }
129
+ if (bytes < 1024 * 1024) {
130
+ return `${(bytes / 1024).toFixed(1)} KB`;
131
+ }
132
+ return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
137
133
  }
138
- /* ── Header Component ─────────────────────────────────────────── */
139
134
  const BrowserHeader = () => {
140
- const { state, dispatch: _dispatch, theme, connectSync, disconnectSync } = useBrowser();
141
- return (jsxs("div", { style: {
142
- display: 'flex',
143
- alignItems: 'center',
144
- gap: 12,
145
- padding: '12px 16px',
146
- backgroundColor: theme.headerBackground,
147
- borderBottom: `1px solid ${theme.border}`,
148
- }, children: [jsx("div", { style: {
149
- width: 32,
150
- height: 32,
151
- backgroundColor: theme.godotBlue,
135
+ const { state, dispatch: _dispatch, theme, connectSync, disconnectSync } = useBrowser();
136
+ return /* @__PURE__ */ jsxs(
137
+ "div",
138
+ {
139
+ style: {
140
+ display: "flex",
141
+ alignItems: "center",
142
+ gap: 12,
143
+ padding: "12px 16px",
144
+ backgroundColor: theme.headerBackground,
145
+ borderBottom: `1px solid ${theme.border}`
146
+ },
147
+ children: [
148
+ /* @__PURE__ */ jsx(
149
+ "div",
150
+ {
151
+ style: {
152
+ width: 32,
153
+ height: 32,
154
+ backgroundColor: theme.godotBlue,
155
+ borderRadius: 4,
156
+ display: "flex",
157
+ alignItems: "center",
158
+ justifyContent: "center",
159
+ fontSize: 18
160
+ },
161
+ children: /* @__PURE__ */ jsx(NiceIcon, { name: "gamepad", size: 18 })
162
+ }
163
+ ),
164
+ /* @__PURE__ */ jsxs("div", { style: { flex: 1 }, children: [
165
+ /* @__PURE__ */ jsx("div", { style: { fontSize: 14, fontWeight: 600, color: theme.textPrimary }, children: state.projectInfo?.name ?? "No Project Loaded" }),
166
+ /* @__PURE__ */ jsx("div", { style: { fontSize: 11, color: theme.textSecondary }, children: state.projectInfo ? /* @__PURE__ */ jsxs(Fragment, { children: [
167
+ "Godot ",
168
+ state.projectInfo.godotVersion,
169
+ " •",
170
+ " ",
171
+ state.projectInfo.renderer.replace("_", " "),
172
+ state.projectInfo.dotnetEnabled && " • C#"
173
+ ] }) : "Select a Godot project.godot file" })
174
+ ] }),
175
+ /* @__PURE__ */ jsxs(
176
+ "div",
177
+ {
178
+ style: {
179
+ display: "flex",
180
+ alignItems: "center",
181
+ gap: 8,
182
+ padding: "6px 12px",
183
+ backgroundColor: state.syncStatus.connected ? "rgba(56, 181, 74, 0.1)" : "rgba(0,0,0,0.2)",
184
+ borderRadius: 20,
185
+ border: `1px solid ${state.syncStatus.connected ? theme.success : theme.border}`
186
+ },
187
+ children: [
188
+ /* @__PURE__ */ jsx(
189
+ "div",
190
+ {
191
+ style: {
192
+ width: 8,
193
+ height: 8,
194
+ borderRadius: "50%",
195
+ backgroundColor: state.syncStatus.connected ? state.syncStatus.isRunning ? theme.warning : theme.success : theme.textSecondary
196
+ }
197
+ }
198
+ ),
199
+ /* @__PURE__ */ jsx("span", { style: { fontSize: 11, color: theme.textPrimary }, children: state.syncStatus.connected ? state.syncStatus.isRunning ? "Running" : "Connected" : "Disconnected" }),
200
+ /* @__PURE__ */ jsx(
201
+ "button",
202
+ {
203
+ onClick: () => state.syncStatus.connected ? disconnectSync() : connectSync(),
204
+ style: {
205
+ padding: "2px 8px",
206
+ fontSize: 10,
207
+ backgroundColor: theme.accent,
208
+ border: "none",
152
209
  borderRadius: 4,
153
- display: 'flex',
154
- alignItems: 'center',
155
- justifyContent: 'center',
156
- fontSize: 18,
157
- }, children: jsx(NiceIcon, { name: "gamepad", size: 18 }) }), jsxs("div", { style: { flex: 1 }, children: [jsx("div", { style: { fontSize: 14, fontWeight: 600, color: theme.textPrimary }, children: state.projectInfo?.name ?? 'No Project Loaded' }), jsx("div", { style: { fontSize: 11, color: theme.textSecondary }, children: state.projectInfo ? (jsxs(Fragment, { children: ["Godot ", state.projectInfo.godotVersion, " \u2022", ' ', state.projectInfo.renderer.replace('_', ' '), state.projectInfo.dotnetEnabled && ' • C#'] })) : ('Select a Godot project.godot file') })] }), jsxs("div", { style: {
158
- display: 'flex',
159
- alignItems: 'center',
160
- gap: 8,
161
- padding: '6px 12px',
162
- backgroundColor: state.syncStatus.connected
163
- ? 'rgba(56, 181, 74, 0.1)'
164
- : 'rgba(0,0,0,0.2)',
165
- borderRadius: 20,
166
- border: `1px solid ${state.syncStatus.connected ? theme.success : theme.border}`,
167
- }, children: [jsx("div", { style: {
168
- width: 8,
169
- height: 8,
170
- borderRadius: '50%',
171
- backgroundColor: state.syncStatus.connected
172
- ? state.syncStatus.isRunning
173
- ? theme.warning
174
- : theme.success
175
- : theme.textSecondary,
176
- } }), jsx("span", { style: { fontSize: 11, color: theme.textPrimary }, children: state.syncStatus.connected
177
- ? state.syncStatus.isRunning
178
- ? 'Running'
179
- : 'Connected'
180
- : 'Disconnected' }), jsx("button", { onClick: () => (state.syncStatus.connected ? disconnectSync() : connectSync()), style: {
181
- padding: '2px 8px',
182
- fontSize: 10,
183
- backgroundColor: theme.accent,
184
- border: 'none',
185
- borderRadius: 4,
186
- color: '#fff',
187
- cursor: 'pointer',
188
- }, children: state.syncStatus.connected ? 'Disconnect' : 'Connect' })] })] }));
210
+ color: "#fff",
211
+ cursor: "pointer"
212
+ },
213
+ children: state.syncStatus.connected ? "Disconnect" : "Connect"
214
+ }
215
+ )
216
+ ]
217
+ }
218
+ )
219
+ ]
220
+ }
221
+ );
189
222
  };
190
- /* ── Toolbar Component ────────────────────────────────────────── */
191
223
  const BrowserToolbar = () => {
192
- const { state, dispatch, theme, importSelectedResources } = useBrowser();
193
- const filters = [
194
- { value: 'all', label: 'All' },
195
- { value: 'scene', label: 'Scenes' },
196
- { value: 'script', label: 'Scripts' },
197
- { value: 'resource', label: 'Resources' },
198
- { value: 'texture', label: 'Textures' },
199
- { value: 'mesh', label: 'Meshes' },
200
- { value: 'material', label: 'Materials' },
201
- { value: 'shader', label: 'Shaders' },
202
- { value: 'audio', label: 'Audio' },
203
- ];
204
- return (jsxs("div", { style: {
205
- display: 'flex',
206
- alignItems: 'center',
207
- gap: 8,
208
- padding: '8px 16px',
209
- backgroundColor: theme.panelBackground,
210
- borderBottom: `1px solid ${theme.border}`,
211
- }, children: [jsx("div", { style: { flex: 1, maxWidth: 300 }, children: jsx("input", { type: "text", placeholder: "Search resources...", value: state.searchQuery, onChange: (e) => dispatch({ type: 'SET_SEARCH', query: e.target.value }), style: {
212
- width: '100%',
213
- padding: '6px 12px',
214
- fontSize: 12,
215
- backgroundColor: 'rgba(0,0,0,0.2)',
216
- border: `1px solid ${theme.border}`,
217
- borderRadius: 6,
218
- color: theme.textPrimary,
219
- outline: 'none',
220
- } }) }), jsx("select", { value: state.filterType, onChange: (e) => dispatch({ type: 'SET_FILTER', filter: e.target.value }), style: {
221
- padding: '6px 10px',
224
+ const { state, dispatch, theme, importSelectedResources } = useBrowser();
225
+ const filters = [
226
+ { value: "all", label: "All" },
227
+ { value: "scene", label: "Scenes" },
228
+ { value: "script", label: "Scripts" },
229
+ { value: "resource", label: "Resources" },
230
+ { value: "texture", label: "Textures" },
231
+ { value: "mesh", label: "Meshes" },
232
+ { value: "material", label: "Materials" },
233
+ { value: "shader", label: "Shaders" },
234
+ { value: "audio", label: "Audio" }
235
+ ];
236
+ return /* @__PURE__ */ jsxs(
237
+ "div",
238
+ {
239
+ style: {
240
+ display: "flex",
241
+ alignItems: "center",
242
+ gap: 8,
243
+ padding: "8px 16px",
244
+ backgroundColor: theme.panelBackground,
245
+ borderBottom: `1px solid ${theme.border}`
246
+ },
247
+ children: [
248
+ /* @__PURE__ */ jsx("div", { style: { flex: 1, maxWidth: 300 }, children: /* @__PURE__ */ jsx(
249
+ "input",
250
+ {
251
+ type: "text",
252
+ placeholder: "Search resources...",
253
+ value: state.searchQuery,
254
+ onChange: (e) => dispatch({ type: "SET_SEARCH", query: e.target.value }),
255
+ style: {
256
+ width: "100%",
257
+ padding: "6px 12px",
258
+ fontSize: 12,
259
+ backgroundColor: "rgba(0,0,0,0.2)",
260
+ border: `1px solid ${theme.border}`,
261
+ borderRadius: 6,
262
+ color: theme.textPrimary,
263
+ outline: "none"
264
+ }
265
+ }
266
+ ) }),
267
+ /* @__PURE__ */ jsx(
268
+ "select",
269
+ {
270
+ value: state.filterType,
271
+ onChange: (e) => dispatch({ type: "SET_FILTER", filter: e.target.value }),
272
+ style: {
273
+ padding: "6px 10px",
274
+ fontSize: 12,
275
+ backgroundColor: "rgba(0,0,0,0.2)",
276
+ border: `1px solid ${theme.border}`,
277
+ borderRadius: 6,
278
+ color: theme.textPrimary
279
+ },
280
+ children: filters.map((f) => /* @__PURE__ */ jsx("option", { value: f.value, children: f.label }, f.value))
281
+ }
282
+ ),
283
+ /* @__PURE__ */ jsxs(
284
+ "div",
285
+ {
286
+ style: {
287
+ display: "flex",
288
+ backgroundColor: "rgba(0,0,0,0.2)",
289
+ borderRadius: 6,
290
+ overflow: "hidden"
291
+ },
292
+ children: [
293
+ /* @__PURE__ */ jsx(
294
+ "button",
295
+ {
296
+ onClick: () => dispatch({ type: "SET_VIEW_MODE", mode: "tree" }),
297
+ "aria-label": "Tree view",
298
+ style: {
299
+ padding: "6px 10px",
222
300
  fontSize: 12,
223
- backgroundColor: 'rgba(0,0,0,0.2)',
224
- border: `1px solid ${theme.border}`,
225
- borderRadius: 6,
226
- color: theme.textPrimary,
227
- }, children: filters.map((f) => (jsx("option", { value: f.value, children: f.label }, f.value))) }), jsxs("div", { style: {
228
- display: 'flex',
229
- backgroundColor: 'rgba(0,0,0,0.2)',
230
- borderRadius: 6,
231
- overflow: 'hidden',
232
- }, children: [jsx("button", { onClick: () => dispatch({ type: 'SET_VIEW_MODE', mode: 'tree' }), "aria-label": "Tree view", style: {
233
- padding: '6px 10px',
234
- fontSize: 12,
235
- backgroundColor: state.viewMode === 'tree' ? theme.accent : 'transparent',
236
- border: 'none',
237
- color: '#fff',
238
- cursor: 'pointer',
239
- }, children: jsx(NiceIcon, { name: "list", size: 14 }) }), jsx("button", { onClick: () => dispatch({ type: 'SET_VIEW_MODE', mode: 'grid' }), "aria-label": "Grid view", style: {
240
- padding: '6px 10px',
241
- fontSize: 12,
242
- backgroundColor: state.viewMode === 'grid' ? theme.accent : 'transparent',
243
- border: 'none',
244
- color: '#fff',
245
- cursor: 'pointer',
246
- }, children: jsx(NiceIcon, { name: "grid", size: 14 }) })] }), jsx("div", { style: { flex: 1 } }), jsxs("span", { style: { fontSize: 11, color: theme.textSecondary }, children: [state.selectedResources.size, " selected"] }), jsxs("button", { onClick: importSelectedResources, disabled: state.selectedResources.size === 0 || state.importing, style: {
247
- padding: '8px 16px',
301
+ backgroundColor: state.viewMode === "tree" ? theme.accent : "transparent",
302
+ border: "none",
303
+ color: "#fff",
304
+ cursor: "pointer"
305
+ },
306
+ children: /* @__PURE__ */ jsx(NiceIcon, { name: "list", size: 14 })
307
+ }
308
+ ),
309
+ /* @__PURE__ */ jsx(
310
+ "button",
311
+ {
312
+ onClick: () => dispatch({ type: "SET_VIEW_MODE", mode: "grid" }),
313
+ "aria-label": "Grid view",
314
+ style: {
315
+ padding: "6px 10px",
248
316
  fontSize: 12,
249
- fontWeight: 500,
250
- backgroundColor: state.selectedResources.size > 0 && !state.importing
251
- ? theme.accent
252
- : theme.textSecondary,
253
- border: 'none',
254
- borderRadius: 6,
255
- color: '#fff',
256
- cursor: state.selectedResources.size > 0 && !state.importing ? 'pointer' : 'not-allowed',
257
- opacity: state.selectedResources.size > 0 && !state.importing ? 1 : 0.5,
258
- }, children: [jsx(NiceIcon, { name: state.importing ? 'clock' : 'download', size: 14 }), ' ', state.importing ? `${state.importProgress}%` : 'Import Selected'] })] }));
317
+ backgroundColor: state.viewMode === "grid" ? theme.accent : "transparent",
318
+ border: "none",
319
+ color: "#fff",
320
+ cursor: "pointer"
321
+ },
322
+ children: /* @__PURE__ */ jsx(NiceIcon, { name: "grid", size: 14 })
323
+ }
324
+ )
325
+ ]
326
+ }
327
+ ),
328
+ /* @__PURE__ */ jsx("div", { style: { flex: 1 } }),
329
+ /* @__PURE__ */ jsxs("span", { style: { fontSize: 11, color: theme.textSecondary }, children: [
330
+ state.selectedResources.size,
331
+ " selected"
332
+ ] }),
333
+ /* @__PURE__ */ jsxs(
334
+ "button",
335
+ {
336
+ onClick: importSelectedResources,
337
+ disabled: state.selectedResources.size === 0 || state.importing,
338
+ style: {
339
+ padding: "8px 16px",
340
+ fontSize: 12,
341
+ fontWeight: 500,
342
+ backgroundColor: state.selectedResources.size > 0 && !state.importing ? theme.accent : theme.textSecondary,
343
+ border: "none",
344
+ borderRadius: 6,
345
+ color: "#fff",
346
+ cursor: state.selectedResources.size > 0 && !state.importing ? "pointer" : "not-allowed",
347
+ opacity: state.selectedResources.size > 0 && !state.importing ? 1 : 0.5
348
+ },
349
+ children: [
350
+ /* @__PURE__ */ jsx(NiceIcon, { name: state.importing ? "clock" : "download", size: 14 }),
351
+ " ",
352
+ state.importing ? `${state.importProgress}%` : "Import Selected"
353
+ ]
354
+ }
355
+ )
356
+ ]
357
+ }
358
+ );
259
359
  };
260
- /* ── Tab Bar ─────────────────────────────────────────────────── */
261
360
  const TabBar = () => {
262
- const { state, dispatch, theme } = useBrowser();
263
- const tabs = [
264
- { id: 'files', label: 'Files', icon: 'folder' },
265
- { id: 'autoloads', label: 'Autoloads', icon: 'rocket' },
266
- { id: 'plugins', label: 'Plugins', icon: 'plug' },
267
- { id: 'exports', label: 'Exports', icon: 'box' },
268
- ];
269
- return (jsx("div", { style: {
270
- display: 'flex',
271
- backgroundColor: theme.panelBackground,
272
- borderBottom: `1px solid ${theme.border}`,
273
- }, children: tabs.map((tab) => (jsxs("button", { onClick: () => dispatch({ type: 'SET_TAB', tab: tab.id }), style: {
274
- flex: 1,
275
- padding: '10px 16px',
276
- fontSize: 12,
277
- backgroundColor: state.tab === tab.id ? theme.background : 'transparent',
278
- border: 'none',
279
- borderBottom: state.tab === tab.id ? `2px solid ${theme.accent}` : '2px solid transparent',
280
- color: state.tab === tab.id ? theme.textPrimary : theme.textSecondary,
281
- cursor: 'pointer',
282
- }, children: [jsx(NiceIcon, { name: tab.icon, size: 14 }), " ", tab.label] }, tab.id))) }));
361
+ const { state, dispatch, theme } = useBrowser();
362
+ const tabs = [
363
+ { id: "files", label: "Files", icon: "folder" },
364
+ { id: "autoloads", label: "Autoloads", icon: "rocket" },
365
+ { id: "plugins", label: "Plugins", icon: "plug" },
366
+ { id: "exports", label: "Exports", icon: "box" }
367
+ ];
368
+ return /* @__PURE__ */ jsx(
369
+ "div",
370
+ {
371
+ style: {
372
+ display: "flex",
373
+ backgroundColor: theme.panelBackground,
374
+ borderBottom: `1px solid ${theme.border}`
375
+ },
376
+ children: tabs.map((tab) => /* @__PURE__ */ jsxs(
377
+ "button",
378
+ {
379
+ onClick: () => dispatch({ type: "SET_TAB", tab: tab.id }),
380
+ style: {
381
+ flex: 1,
382
+ padding: "10px 16px",
383
+ fontSize: 12,
384
+ backgroundColor: state.tab === tab.id ? theme.background : "transparent",
385
+ border: "none",
386
+ borderBottom: state.tab === tab.id ? `2px solid ${theme.accent}` : "2px solid transparent",
387
+ color: state.tab === tab.id ? theme.textPrimary : theme.textSecondary,
388
+ cursor: "pointer"
389
+ },
390
+ children: [
391
+ /* @__PURE__ */ jsx(NiceIcon, { name: tab.icon, size: 14 }),
392
+ " ",
393
+ tab.label
394
+ ]
395
+ },
396
+ tab.id
397
+ ))
398
+ }
399
+ );
283
400
  };
284
- /* ── Resource Tree Item ───────────────────────────────────────── */
285
- const ResourceTreeItem = ({ resource, indent, }) => {
286
- const { state, dispatch, theme } = useBrowser();
287
- const isSelected = state.selectedResources.has(resource.id);
288
- return (jsxs("div", { role: "button", tabIndex: 0, onKeyDown: clickOnActivationKey, onClick: (e) => dispatch({ type: 'SELECT_RESOURCE', id: resource.id, additive: e.ctrlKey || e.metaKey }), onDoubleClick: () => dispatch({ type: 'SET_PREVIEW', resource }), style: {
289
- display: 'flex',
290
- alignItems: 'center',
291
- gap: 8,
292
- padding: '4px 8px',
293
- paddingLeft: indent * 16 + 8,
294
- backgroundColor: isSelected ? theme.itemSelected : 'transparent',
295
- cursor: 'pointer',
296
- }, children: [jsx("input", { type: "checkbox", checked: isSelected, onChange: () => dispatch({ type: 'SELECT_RESOURCE', id: resource.id, additive: true }), onClick: (e) => e.stopPropagation() }), jsx(NiceIcon, { name: getResourceIcon(resource.type), size: 14 }), jsx("span", { style: {
297
- flex: 1,
298
- fontSize: 12,
299
- color: isSelected ? theme.textPrimary : theme.textSecondary,
300
- overflow: 'hidden',
301
- textOverflow: 'ellipsis',
302
- whiteSpace: 'nowrap',
303
- }, children: resource.name }), jsx("span", { style: { fontSize: 10, color: theme.textSecondary }, children: formatFileSize(resource.size) })] }));
401
+ const ResourceTreeItem = ({
402
+ resource,
403
+ indent
404
+ }) => {
405
+ const { state, dispatch, theme } = useBrowser();
406
+ const isSelected = state.selectedResources.has(resource.id);
407
+ return /* @__PURE__ */ jsxs(
408
+ "div",
409
+ {
410
+ role: "button",
411
+ tabIndex: 0,
412
+ onKeyDown: clickOnActivationKey,
413
+ onClick: (e) => dispatch({ type: "SELECT_RESOURCE", id: resource.id, additive: e.ctrlKey || e.metaKey }),
414
+ onDoubleClick: () => dispatch({ type: "SET_PREVIEW", resource }),
415
+ style: {
416
+ display: "flex",
417
+ alignItems: "center",
418
+ gap: 8,
419
+ padding: "4px 8px",
420
+ paddingLeft: indent * 16 + 8,
421
+ backgroundColor: isSelected ? theme.itemSelected : "transparent",
422
+ cursor: "pointer"
423
+ },
424
+ children: [
425
+ /* @__PURE__ */ jsx(
426
+ "input",
427
+ {
428
+ type: "checkbox",
429
+ checked: isSelected,
430
+ onChange: () => dispatch({ type: "SELECT_RESOURCE", id: resource.id, additive: true }),
431
+ onClick: (e) => e.stopPropagation()
432
+ }
433
+ ),
434
+ /* @__PURE__ */ jsx(NiceIcon, { name: getResourceIcon(resource.type), size: 14 }),
435
+ /* @__PURE__ */ jsx(
436
+ "span",
437
+ {
438
+ style: {
439
+ flex: 1,
440
+ fontSize: 12,
441
+ color: isSelected ? theme.textPrimary : theme.textSecondary,
442
+ overflow: "hidden",
443
+ textOverflow: "ellipsis",
444
+ whiteSpace: "nowrap"
445
+ },
446
+ children: resource.name
447
+ }
448
+ ),
449
+ /* @__PURE__ */ jsx("span", { style: { fontSize: 10, color: theme.textSecondary }, children: formatFileSize(resource.size) })
450
+ ]
451
+ }
452
+ );
304
453
  };
305
454
  const FolderTreeItem = ({ folder, indent }) => {
306
- const { state, dispatch, theme } = useBrowser();
307
- const isExpanded = state.expandedFolders.has(folder.path);
308
- const filteredChildren = useMemo(() => {
309
- return folder.children.filter((child) => {
310
- if ('children' in child) {
311
- return true;
312
- }
313
- const resource = child;
314
- if (state.filterType !== 'all' && resource.type !== state.filterType) {
315
- return false;
316
- }
317
- if (state.searchQuery) {
318
- return resource.name.toLowerCase().includes(state.searchQuery.toLowerCase());
455
+ const { state, dispatch, theme } = useBrowser();
456
+ const isExpanded = state.expandedFolders.has(folder.path);
457
+ const filteredChildren = useMemo(() => {
458
+ return folder.children.filter((child) => {
459
+ if ("children" in child) {
460
+ return true;
461
+ }
462
+ const resource = child;
463
+ if (state.filterType !== "all" && resource.type !== state.filterType) {
464
+ return false;
465
+ }
466
+ if (state.searchQuery) {
467
+ return resource.name.toLowerCase().includes(state.searchQuery.toLowerCase());
468
+ }
469
+ return true;
470
+ });
471
+ }, [folder.children, state.filterType, state.searchQuery]);
472
+ if (filteredChildren.length === 0 && state.searchQuery) {
473
+ return null;
474
+ }
475
+ return /* @__PURE__ */ jsxs("div", { children: [
476
+ /* @__PURE__ */ jsxs(
477
+ "div",
478
+ {
479
+ role: "button",
480
+ tabIndex: 0,
481
+ "aria-expanded": isExpanded,
482
+ onKeyDown: clickOnActivationKey,
483
+ onClick: () => dispatch({ type: "TOGGLE_FOLDER", path: folder.path }),
484
+ style: {
485
+ display: "flex",
486
+ alignItems: "center",
487
+ gap: 8,
488
+ padding: "4px 8px",
489
+ paddingLeft: indent * 16 + 8,
490
+ cursor: "pointer"
491
+ },
492
+ children: [
493
+ /* @__PURE__ */ jsx(
494
+ NiceIcon,
495
+ {
496
+ name: isExpanded ? "chevron-down" : "chevron-right",
497
+ size: 10,
498
+ color: theme.textSecondary
319
499
  }
320
- return true;
321
- });
322
- }, [folder.children, state.filterType, state.searchQuery]);
323
- if (filteredChildren.length === 0 && state.searchQuery) {
324
- return null;
325
- }
326
- return (jsxs("div", { children: [jsxs("div", { role: "button", tabIndex: 0, "aria-expanded": isExpanded, onKeyDown: clickOnActivationKey, onClick: () => dispatch({ type: 'TOGGLE_FOLDER', path: folder.path }), style: {
327
- display: 'flex',
328
- alignItems: 'center',
329
- gap: 8,
330
- padding: '4px 8px',
331
- paddingLeft: indent * 16 + 8,
332
- cursor: 'pointer',
333
- }, children: [jsx(NiceIcon, { name: isExpanded ? 'chevron-down' : 'chevron-right', size: 10, color: theme.textSecondary }), jsx(NiceIcon, { name: "folder", size: 14 }), jsx("span", { style: { fontSize: 12, color: theme.textPrimary, fontWeight: 500 }, children: folder.name }), jsxs("span", { style: { fontSize: 10, color: theme.textSecondary }, children: ["(", filteredChildren.length, ")"] })] }), isExpanded &&
334
- filteredChildren.map((child, _i) => 'children' in child ? (jsx(FolderTreeItem, { folder: child, indent: indent + 1 }, child.path)) : (jsx(ResourceTreeItem, { resource: child, indent: indent + 1 }, child.id)))] }));
500
+ ),
501
+ /* @__PURE__ */ jsx(NiceIcon, { name: "folder", size: 14 }),
502
+ /* @__PURE__ */ jsx("span", { style: { fontSize: 12, color: theme.textPrimary, fontWeight: 500 }, children: folder.name }),
503
+ /* @__PURE__ */ jsxs("span", { style: { fontSize: 10, color: theme.textSecondary }, children: [
504
+ "(",
505
+ filteredChildren.length,
506
+ ")"
507
+ ] })
508
+ ]
509
+ }
510
+ ),
511
+ isExpanded && filteredChildren.map(
512
+ (child, _i) => "children" in child ? /* @__PURE__ */ jsx(FolderTreeItem, { folder: child, indent: indent + 1 }, child.path) : /* @__PURE__ */ jsx(ResourceTreeItem, { resource: child, indent: indent + 1 }, child.id)
513
+ )
514
+ ] });
335
515
  };
336
- /* ── Files Panel ──────────────────────────────────────────────── */
337
516
  const FilesPanel = () => {
338
- const { state } = useBrowser();
339
- if (!state.projectInfo) {
340
- return (jsx("div", { style: { padding: 20, textAlign: 'center', color: '#8a99a8' }, children: "No project loaded. Select a Godot project to browse." }));
341
- }
342
- if (state.viewMode === 'tree') {
343
- return (jsx("div", { style: { padding: 8 }, children: jsx(FolderTreeItem, { folder: state.projectInfo.rootFolder, indent: 0 }) }));
517
+ const { state } = useBrowser();
518
+ if (!state.projectInfo) {
519
+ return /* @__PURE__ */ jsx("div", { style: { padding: 20, textAlign: "center", color: "#8a99a8" }, children: "No project loaded. Select a Godot project to browse." });
520
+ }
521
+ if (state.viewMode === "tree") {
522
+ return /* @__PURE__ */ jsx("div", { style: { padding: 8 }, children: /* @__PURE__ */ jsx(FolderTreeItem, { folder: state.projectInfo.rootFolder, indent: 0 }) });
523
+ }
524
+ return /* @__PURE__ */ jsx(
525
+ "div",
526
+ {
527
+ style: {
528
+ display: "grid",
529
+ gridTemplateColumns: "repeat(auto-fill, minmax(120px, 1fr))",
530
+ gap: 12,
531
+ padding: 12
532
+ },
533
+ children: state.projectInfo.resources.filter((r) => {
534
+ if (state.filterType !== "all" && r.type !== state.filterType) {
535
+ return false;
536
+ }
537
+ if (state.searchQuery) {
538
+ return r.name.toLowerCase().includes(state.searchQuery.toLowerCase());
539
+ }
540
+ return true;
541
+ }).map((resource) => {
542
+ const isSelected = state.selectedResources.has(resource.id);
543
+ return /* @__PURE__ */ jsx(ResourceGridItem, { resource, isSelected }, resource.id);
544
+ })
344
545
  }
345
- // Grid view
346
- return (jsx("div", { style: {
347
- display: 'grid',
348
- gridTemplateColumns: 'repeat(auto-fill, minmax(120px, 1fr))',
349
- gap: 12,
350
- padding: 12,
351
- }, children: state.projectInfo.resources
352
- .filter((r) => {
353
- if (state.filterType !== 'all' && r.type !== state.filterType) {
354
- return false;
355
- }
356
- if (state.searchQuery) {
357
- return r.name.toLowerCase().includes(state.searchQuery.toLowerCase());
358
- }
359
- return true;
360
- })
361
- .map((resource) => {
362
- const isSelected = state.selectedResources.has(resource.id);
363
- return jsx(ResourceGridItem, { resource: resource, isSelected: isSelected }, resource.id);
364
- }) }));
546
+ );
365
547
  };
366
- const ResourceGridItem = ({ resource, isSelected, }) => {
367
- const { dispatch, theme } = useBrowser();
368
- return (jsxs("div", { role: "button", tabIndex: 0, onKeyDown: clickOnActivationKey, onClick: (e) => dispatch({ type: 'SELECT_RESOURCE', id: resource.id, additive: e.ctrlKey || e.metaKey }), onDoubleClick: () => dispatch({ type: 'SET_PREVIEW', resource }), style: {
369
- display: 'flex',
370
- flexDirection: 'column',
371
- alignItems: 'center',
372
- padding: 12,
373
- backgroundColor: isSelected ? theme.itemSelected : theme.itemBackground,
374
- borderRadius: 8,
375
- border: `1px solid ${isSelected ? theme.accent : theme.border}`,
376
- cursor: 'pointer',
377
- }, children: [jsx("div", { style: { marginBottom: 8 }, children: jsx(NiceIcon, { name: getResourceIcon(resource.type), size: 32 }) }), jsx("span", { style: {
378
- fontSize: 11,
379
- color: theme.textPrimary,
380
- textAlign: 'center',
381
- overflow: 'hidden',
382
- textOverflow: 'ellipsis',
383
- whiteSpace: 'nowrap',
384
- width: '100%',
385
- }, children: resource.name }), jsx("span", { style: { fontSize: 9, color: theme.textSecondary }, children: formatFileSize(resource.size) })] }));
548
+ const ResourceGridItem = ({
549
+ resource,
550
+ isSelected
551
+ }) => {
552
+ const { dispatch, theme } = useBrowser();
553
+ return /* @__PURE__ */ jsxs(
554
+ "div",
555
+ {
556
+ role: "button",
557
+ tabIndex: 0,
558
+ onKeyDown: clickOnActivationKey,
559
+ onClick: (e) => dispatch({ type: "SELECT_RESOURCE", id: resource.id, additive: e.ctrlKey || e.metaKey }),
560
+ onDoubleClick: () => dispatch({ type: "SET_PREVIEW", resource }),
561
+ style: {
562
+ display: "flex",
563
+ flexDirection: "column",
564
+ alignItems: "center",
565
+ padding: 12,
566
+ backgroundColor: isSelected ? theme.itemSelected : theme.itemBackground,
567
+ borderRadius: 8,
568
+ border: `1px solid ${isSelected ? theme.accent : theme.border}`,
569
+ cursor: "pointer"
570
+ },
571
+ children: [
572
+ /* @__PURE__ */ jsx("div", { style: { marginBottom: 8 }, children: /* @__PURE__ */ jsx(NiceIcon, { name: getResourceIcon(resource.type), size: 32 }) }),
573
+ /* @__PURE__ */ jsx(
574
+ "span",
575
+ {
576
+ style: {
577
+ fontSize: 11,
578
+ color: theme.textPrimary,
579
+ textAlign: "center",
580
+ overflow: "hidden",
581
+ textOverflow: "ellipsis",
582
+ whiteSpace: "nowrap",
583
+ width: "100%"
584
+ },
585
+ children: resource.name
586
+ }
587
+ ),
588
+ /* @__PURE__ */ jsx("span", { style: { fontSize: 9, color: theme.textSecondary }, children: formatFileSize(resource.size) })
589
+ ]
590
+ }
591
+ );
386
592
  };
387
- /* ── Autoloads Panel ──────────────────────────────────────────── */
388
593
  const AutoloadsPanel = () => {
389
- const { state, theme } = useBrowser();
390
- if (!state.projectInfo) {
391
- return null;
392
- }
393
- return (jsxs("div", { style: { padding: 16 }, children: [jsx("h3", { style: { margin: '0 0 16px', fontSize: 14, fontWeight: 600, color: theme.textPrimary }, children: "Autoload Scripts (Singletons)" }), state.projectInfo.autoloads.map((autoload) => (jsxs("div", { style: {
394
- display: 'flex',
395
- alignItems: 'center',
396
- gap: 12,
397
- padding: '10px 12px',
398
- marginBottom: 4,
399
- backgroundColor: theme.itemBackground,
400
- borderRadius: 6,
401
- }, children: [jsx("input", { type: "checkbox", checked: autoload.enabled, readOnly: true }), jsx("span", { style: { fontSize: 13, color: theme.textPrimary, fontWeight: 500 }, children: autoload.name }), jsx("span", { style: { fontSize: 11, color: theme.textSecondary, flex: 1 }, children: autoload.path })] }, autoload.name))), state.projectInfo.autoloads.length === 0 && (jsx("div", { style: { color: theme.textSecondary }, children: "No autoloads configured" }))] }));
594
+ const { state, theme } = useBrowser();
595
+ if (!state.projectInfo) {
596
+ return null;
597
+ }
598
+ return /* @__PURE__ */ jsxs("div", { style: { padding: 16 }, children: [
599
+ /* @__PURE__ */ jsx("h3", { style: { margin: "0 0 16px", fontSize: 14, fontWeight: 600, color: theme.textPrimary }, children: "Autoload Scripts (Singletons)" }),
600
+ state.projectInfo.autoloads.map((autoload) => /* @__PURE__ */ jsxs(
601
+ "div",
602
+ {
603
+ style: {
604
+ display: "flex",
605
+ alignItems: "center",
606
+ gap: 12,
607
+ padding: "10px 12px",
608
+ marginBottom: 4,
609
+ backgroundColor: theme.itemBackground,
610
+ borderRadius: 6
611
+ },
612
+ children: [
613
+ /* @__PURE__ */ jsx("input", { type: "checkbox", checked: autoload.enabled, readOnly: true }),
614
+ /* @__PURE__ */ jsx("span", { style: { fontSize: 13, color: theme.textPrimary, fontWeight: 500 }, children: autoload.name }),
615
+ /* @__PURE__ */ jsx("span", { style: { fontSize: 11, color: theme.textSecondary, flex: 1 }, children: autoload.path })
616
+ ]
617
+ },
618
+ autoload.name
619
+ )),
620
+ state.projectInfo.autoloads.length === 0 && /* @__PURE__ */ jsx("div", { style: { color: theme.textSecondary }, children: "No autoloads configured" })
621
+ ] });
402
622
  };
403
- /* ── Plugins Panel ────────────────────────────────────────────── */
404
623
  const PluginsPanel = () => {
405
- const { state, theme } = useBrowser();
406
- if (!state.projectInfo) {
407
- return null;
408
- }
409
- return (jsxs("div", { style: { padding: 16 }, children: [jsx("h3", { style: { margin: '0 0 16px', fontSize: 14, fontWeight: 600, color: theme.textPrimary }, children: "Editor Plugins" }), state.projectInfo.plugins.map((plugin) => (jsxs("div", { style: {
410
- display: 'flex',
411
- alignItems: 'center',
412
- gap: 12,
413
- padding: '10px 12px',
414
- marginBottom: 4,
415
- backgroundColor: theme.itemBackground,
416
- borderRadius: 6,
417
- }, children: [jsx("div", { style: {
418
- width: 8,
419
- height: 8,
420
- borderRadius: '50%',
421
- backgroundColor: plugin.enabled ? theme.success : theme.textSecondary,
422
- } }), jsx("span", { style: { fontSize: 13, color: theme.textPrimary }, children: plugin.name }), jsx("span", { style: {
423
- marginLeft: 'auto',
424
- padding: '2px 8px',
425
- fontSize: 10,
426
- backgroundColor: plugin.enabled ? theme.success : 'rgba(255,255,255,0.1)',
427
- borderRadius: 4,
428
- color: '#fff',
429
- }, children: plugin.enabled ? 'Enabled' : 'Disabled' })] }, plugin.name))), state.projectInfo.plugins.length === 0 && (jsx("div", { style: { color: theme.textSecondary }, children: "No plugins installed" }))] }));
624
+ const { state, theme } = useBrowser();
625
+ if (!state.projectInfo) {
626
+ return null;
627
+ }
628
+ return /* @__PURE__ */ jsxs("div", { style: { padding: 16 }, children: [
629
+ /* @__PURE__ */ jsx("h3", { style: { margin: "0 0 16px", fontSize: 14, fontWeight: 600, color: theme.textPrimary }, children: "Editor Plugins" }),
630
+ state.projectInfo.plugins.map((plugin) => /* @__PURE__ */ jsxs(
631
+ "div",
632
+ {
633
+ style: {
634
+ display: "flex",
635
+ alignItems: "center",
636
+ gap: 12,
637
+ padding: "10px 12px",
638
+ marginBottom: 4,
639
+ backgroundColor: theme.itemBackground,
640
+ borderRadius: 6
641
+ },
642
+ children: [
643
+ /* @__PURE__ */ jsx(
644
+ "div",
645
+ {
646
+ style: {
647
+ width: 8,
648
+ height: 8,
649
+ borderRadius: "50%",
650
+ backgroundColor: plugin.enabled ? theme.success : theme.textSecondary
651
+ }
652
+ }
653
+ ),
654
+ /* @__PURE__ */ jsx("span", { style: { fontSize: 13, color: theme.textPrimary }, children: plugin.name }),
655
+ /* @__PURE__ */ jsx(
656
+ "span",
657
+ {
658
+ style: {
659
+ marginLeft: "auto",
660
+ padding: "2px 8px",
661
+ fontSize: 10,
662
+ backgroundColor: plugin.enabled ? theme.success : "rgba(255,255,255,0.1)",
663
+ borderRadius: 4,
664
+ color: "#fff"
665
+ },
666
+ children: plugin.enabled ? "Enabled" : "Disabled"
667
+ }
668
+ )
669
+ ]
670
+ },
671
+ plugin.name
672
+ )),
673
+ state.projectInfo.plugins.length === 0 && /* @__PURE__ */ jsx("div", { style: { color: theme.textSecondary }, children: "No plugins installed" })
674
+ ] });
430
675
  };
431
- /* ── Exports Panel ────────────────────────────────────────────── */
432
676
  const ExportsPanel = () => {
433
- const { state, theme } = useBrowser();
434
- if (!state.projectInfo) {
435
- return null;
677
+ const { state, theme } = useBrowser();
678
+ if (!state.projectInfo) {
679
+ return null;
680
+ }
681
+ const getPlatformIcon = (platform) => {
682
+ switch (platform.toLowerCase()) {
683
+ case "windows":
684
+ return "monitor";
685
+ case "linux":
686
+ return "terminal";
687
+ case "macos":
688
+ return "monitor";
689
+ case "android":
690
+ return "phone";
691
+ case "ios":
692
+ return "phone";
693
+ case "web":
694
+ return "globe";
695
+ default:
696
+ return "box";
436
697
  }
437
- const getPlatformIcon = (platform) => {
438
- switch (platform.toLowerCase()) {
439
- case 'windows':
440
- return 'monitor';
441
- case 'linux':
442
- return 'terminal';
443
- case 'macos':
444
- return 'monitor';
445
- case 'android':
446
- return 'phone';
447
- case 'ios':
448
- return 'phone';
449
- case 'web':
450
- return 'globe';
451
- default:
452
- return 'box';
453
- }
454
- };
455
- return (jsxs("div", { style: { padding: 16 }, children: [jsx("h3", { style: { margin: '0 0 16px', fontSize: 14, fontWeight: 600, color: theme.textPrimary }, children: "Export Presets" }), state.projectInfo.exportPresets.map((preset, i) => (jsxs("div", { style: {
456
- display: 'flex',
457
- alignItems: 'center',
458
- gap: 12,
459
- padding: '12px',
460
- marginBottom: 4,
461
- backgroundColor: theme.itemBackground,
462
- borderRadius: 6,
463
- }, children: [jsx(NiceIcon, { name: getPlatformIcon(preset.platform), size: 20 }), jsxs("div", { style: { flex: 1 }, children: [jsx("div", { style: { fontSize: 13, color: theme.textPrimary, fontWeight: 500 }, children: preset.name }), jsx("div", { style: { fontSize: 11, color: theme.textSecondary }, children: preset.platform })] }), jsx("button", { style: {
464
- padding: '6px 12px',
465
- fontSize: 11,
466
- backgroundColor: theme.accent,
467
- border: 'none',
468
- borderRadius: 4,
469
- color: '#fff',
470
- cursor: 'pointer',
471
- }, children: "Export" })] }, i))), state.projectInfo.exportPresets.length === 0 && (jsx("div", { style: { color: theme.textSecondary }, children: "No export presets configured" }))] }));
472
- };
473
- // Demo project
474
- const DEMO_PROJECT = {
475
- name: 'MyGodotGame',
476
- path: 'C:/Projects/MyGodotGame',
477
- godotVersion: '4.2.1',
478
- renderer: 'forward_plus',
479
- dotnetEnabled: false,
480
- features: ['Mobile', '3D', 'Physics'],
481
- resources: [
482
- {
483
- id: '1',
484
- name: 'main.tscn',
485
- path: 'res://scenes/main.tscn',
486
- type: 'scene',
487
- size: 12000,
488
- lastModified: '2024-01-15',
489
- selected: false,
490
- },
491
- {
492
- id: '2',
493
- name: 'player.tscn',
494
- path: 'res://scenes/player.tscn',
495
- type: 'scene',
496
- size: 8500,
497
- lastModified: '2024-01-14',
498
- selected: false,
499
- },
500
- {
501
- id: '3',
502
- name: 'player.gd',
503
- path: 'res://scripts/player.gd',
504
- type: 'script',
505
- size: 3200,
506
- lastModified: '2024-01-14',
507
- selected: false,
508
- },
509
- {
510
- id: '4',
511
- name: 'enemy.gd',
512
- path: 'res://scripts/enemy.gd',
513
- type: 'script',
514
- size: 2800,
515
- lastModified: '2024-01-13',
516
- selected: false,
517
- },
518
- {
519
- id: '5',
520
- name: 'player_texture.png',
521
- path: 'res://textures/player_texture.png',
522
- type: 'texture',
523
- size: 524000,
524
- lastModified: '2024-01-12',
525
- selected: false,
698
+ };
699
+ return /* @__PURE__ */ jsxs("div", { style: { padding: 16 }, children: [
700
+ /* @__PURE__ */ jsx("h3", { style: { margin: "0 0 16px", fontSize: 14, fontWeight: 600, color: theme.textPrimary }, children: "Export Presets" }),
701
+ state.projectInfo.exportPresets.map((preset, i) => /* @__PURE__ */ jsxs(
702
+ "div",
703
+ {
704
+ style: {
705
+ display: "flex",
706
+ alignItems: "center",
707
+ gap: 12,
708
+ padding: "12px",
709
+ marginBottom: 4,
710
+ backgroundColor: theme.itemBackground,
711
+ borderRadius: 6
526
712
  },
527
- {
528
- id: '6',
529
- name: 'standard_material.tres',
530
- path: 'res://materials/standard_material.tres',
531
- type: 'material',
532
- size: 1200,
533
- lastModified: '2024-01-11',
534
- selected: false,
535
- },
536
- {
537
- id: '7',
538
- name: 'custom_shader.gdshader',
539
- path: 'res://shaders/custom_shader.gdshader',
540
- type: 'shader',
541
- size: 2500,
542
- lastModified: '2024-01-10',
543
- selected: false,
544
- },
545
- {
546
- id: '8',
547
- name: 'jump.wav',
548
- path: 'res://audio/jump.wav',
549
- type: 'audio',
550
- size: 45000,
551
- lastModified: '2024-01-09',
552
- selected: false,
553
- },
554
- ],
555
- rootFolder: {
556
- path: 'res://',
557
- name: 'res://',
558
- expanded: true,
559
713
  children: [
560
- { path: 'res://scenes', name: 'scenes', expanded: false, children: [] },
561
- { path: 'res://scripts', name: 'scripts', expanded: false, children: [] },
562
- { path: 'res://textures', name: 'textures', expanded: false, children: [] },
563
- { path: 'res://materials', name: 'materials', expanded: false, children: [] },
564
- { path: 'res://shaders', name: 'shaders', expanded: false, children: [] },
565
- { path: 'res://audio', name: 'audio', expanded: false, children: [] },
566
- ],
714
+ /* @__PURE__ */ jsx(NiceIcon, { name: getPlatformIcon(preset.platform), size: 20 }),
715
+ /* @__PURE__ */ jsxs("div", { style: { flex: 1 }, children: [
716
+ /* @__PURE__ */ jsx("div", { style: { fontSize: 13, color: theme.textPrimary, fontWeight: 500 }, children: preset.name }),
717
+ /* @__PURE__ */ jsx("div", { style: { fontSize: 11, color: theme.textSecondary }, children: preset.platform })
718
+ ] }),
719
+ /* @__PURE__ */ jsx(
720
+ "button",
721
+ {
722
+ style: {
723
+ padding: "6px 12px",
724
+ fontSize: 11,
725
+ backgroundColor: theme.accent,
726
+ border: "none",
727
+ borderRadius: 4,
728
+ color: "#fff",
729
+ cursor: "pointer"
730
+ },
731
+ children: "Export"
732
+ }
733
+ )
734
+ ]
735
+ },
736
+ i
737
+ )),
738
+ state.projectInfo.exportPresets.length === 0 && /* @__PURE__ */ jsx("div", { style: { color: theme.textSecondary }, children: "No export presets configured" })
739
+ ] });
740
+ };
741
+ const DEMO_PROJECT = {
742
+ name: "MyGodotGame",
743
+ path: "C:/Projects/MyGodotGame",
744
+ godotVersion: "4.2.1",
745
+ renderer: "forward_plus",
746
+ dotnetEnabled: false,
747
+ features: ["Mobile", "3D", "Physics"],
748
+ resources: [
749
+ {
750
+ id: "1",
751
+ name: "main.tscn",
752
+ path: "res://scenes/main.tscn",
753
+ type: "scene",
754
+ size: 12e3,
755
+ lastModified: "2024-01-15",
756
+ selected: false
757
+ },
758
+ {
759
+ id: "2",
760
+ name: "player.tscn",
761
+ path: "res://scenes/player.tscn",
762
+ type: "scene",
763
+ size: 8500,
764
+ lastModified: "2024-01-14",
765
+ selected: false
766
+ },
767
+ {
768
+ id: "3",
769
+ name: "player.gd",
770
+ path: "res://scripts/player.gd",
771
+ type: "script",
772
+ size: 3200,
773
+ lastModified: "2024-01-14",
774
+ selected: false
567
775
  },
568
- autoloads: [
569
- { name: 'GameManager', path: 'res://scripts/game_manager.gd', enabled: true },
570
- { name: 'AudioManager', path: 'res://scripts/audio_manager.gd', enabled: true },
571
- ],
572
- plugins: [
573
- { name: 'godot-git-plugin', enabled: true },
574
- { name: 'dialogue-addon', enabled: false },
575
- ],
576
- exportPresets: [
577
- { name: 'Windows Desktop', platform: 'Windows' },
578
- { name: 'Linux Desktop', platform: 'Linux' },
579
- { name: 'Web Build', platform: 'Web' },
580
- ],
776
+ {
777
+ id: "4",
778
+ name: "enemy.gd",
779
+ path: "res://scripts/enemy.gd",
780
+ type: "script",
781
+ size: 2800,
782
+ lastModified: "2024-01-13",
783
+ selected: false
784
+ },
785
+ {
786
+ id: "5",
787
+ name: "player_texture.png",
788
+ path: "res://textures/player_texture.png",
789
+ type: "texture",
790
+ size: 524e3,
791
+ lastModified: "2024-01-12",
792
+ selected: false
793
+ },
794
+ {
795
+ id: "6",
796
+ name: "standard_material.tres",
797
+ path: "res://materials/standard_material.tres",
798
+ type: "material",
799
+ size: 1200,
800
+ lastModified: "2024-01-11",
801
+ selected: false
802
+ },
803
+ {
804
+ id: "7",
805
+ name: "custom_shader.gdshader",
806
+ path: "res://shaders/custom_shader.gdshader",
807
+ type: "shader",
808
+ size: 2500,
809
+ lastModified: "2024-01-10",
810
+ selected: false
811
+ },
812
+ {
813
+ id: "8",
814
+ name: "jump.wav",
815
+ path: "res://audio/jump.wav",
816
+ type: "audio",
817
+ size: 45e3,
818
+ lastModified: "2024-01-09",
819
+ selected: false
820
+ }
821
+ ],
822
+ rootFolder: {
823
+ path: "res://",
824
+ name: "res://",
825
+ expanded: true,
826
+ children: [
827
+ { path: "res://scenes", name: "scenes", expanded: false, children: [] },
828
+ { path: "res://scripts", name: "scripts", expanded: false, children: [] },
829
+ { path: "res://textures", name: "textures", expanded: false, children: [] },
830
+ { path: "res://materials", name: "materials", expanded: false, children: [] },
831
+ { path: "res://shaders", name: "shaders", expanded: false, children: [] },
832
+ { path: "res://audio", name: "audio", expanded: false, children: [] }
833
+ ]
834
+ },
835
+ autoloads: [
836
+ { name: "GameManager", path: "res://scripts/game_manager.gd", enabled: true },
837
+ { name: "AudioManager", path: "res://scripts/audio_manager.gd", enabled: true }
838
+ ],
839
+ plugins: [
840
+ { name: "godot-git-plugin", enabled: true },
841
+ { name: "dialogue-addon", enabled: false }
842
+ ],
843
+ exportPresets: [
844
+ { name: "Windows Desktop", platform: "Windows" },
845
+ { name: "Linux Desktop", platform: "Linux" },
846
+ { name: "Web Build", platform: "Web" }
847
+ ]
581
848
  };
582
849
  const GodotProjectBrowser = /* @__PURE__ */ Object.assign(
583
- /* @__PURE__ */ forwardRef(({ projectPath: _projectPath, theme: themeOverride, onProjectLoad, onImport, onSyncConnect, onSyncDisconnect, className, style, }, ref) => {
584
- const [state, dispatch] = useReducer(browserReducer, {
850
+ /* @__PURE__ */ forwardRef(
851
+ ({
852
+ projectPath: _projectPath,
853
+ theme: themeOverride,
854
+ onProjectLoad,
855
+ onImport,
856
+ onSyncConnect,
857
+ onSyncDisconnect,
858
+ className,
859
+ style
860
+ }, ref) => {
861
+ const [state, dispatch] = useReducer(browserReducer, {
585
862
  ...INITIAL_STATE,
586
- projectInfo: DEMO_PROJECT,
587
- });
588
- const theme = useMemo(() => ({ ...DEFAULT_THEME, ...themeOverride }), [themeOverride]);
589
- // Import selected resources
590
- const importSelectedResources = useCallback(async () => {
863
+ projectInfo: DEMO_PROJECT
864
+ });
865
+ const theme = useMemo(() => ({ ...DEFAULT_THEME, ...themeOverride }), [themeOverride]);
866
+ const importSelectedResources = useCallback(async () => {
591
867
  if (state.selectedResources.size === 0 || !state.projectInfo) {
592
- return;
868
+ return;
593
869
  }
594
- const selectedResources = state.projectInfo.resources.filter((r) => state.selectedResources.has(r.id));
595
- dispatch({ type: 'SET_IMPORTING', importing: true, progress: 0 });
870
+ const selectedResources = state.projectInfo.resources.filter(
871
+ (r) => state.selectedResources.has(r.id)
872
+ );
873
+ dispatch({ type: "SET_IMPORTING", importing: true, progress: 0 });
596
874
  try {
597
- for (let i = 0; i < selectedResources.length; i++) {
598
- dispatch({
599
- type: 'SET_IMPORTING',
600
- importing: true,
601
- progress: Math.round(((i + 1) / selectedResources.length) * 100),
602
- });
603
- await new Promise((resolve) => setTimeout(resolve, 200));
604
- }
605
- if (onImport) {
606
- await onImport(selectedResources);
607
- }
608
- dispatch({ type: 'DESELECT_ALL' });
609
- }
610
- finally {
611
- dispatch({ type: 'SET_IMPORTING', importing: false });
612
- }
613
- }, [state.selectedResources, state.projectInfo, onImport]);
614
- // Sync connection
615
- const connectSync = useCallback(async () => {
616
- if (onSyncConnect) {
617
- const status = await onSyncConnect();
618
- dispatch({ type: 'SET_SYNC_STATUS', status });
619
- }
620
- else {
875
+ for (let i = 0; i < selectedResources.length; i++) {
621
876
  dispatch({
622
- type: 'SET_SYNC_STATUS',
623
- status: {
624
- connected: true,
625
- godotVersion: '4.2.1',
626
- projectName: 'MyGodotGame',
627
- isRunning: false,
628
- debuggerConnected: true,
629
- },
877
+ type: "SET_IMPORTING",
878
+ importing: true,
879
+ progress: Math.round((i + 1) / selectedResources.length * 100)
630
880
  });
881
+ await new Promise((resolve) => setTimeout(resolve, 200));
882
+ }
883
+ if (onImport) {
884
+ await onImport(selectedResources);
885
+ }
886
+ dispatch({ type: "DESELECT_ALL" });
887
+ } finally {
888
+ dispatch({ type: "SET_IMPORTING", importing: false });
631
889
  }
632
- }, [onSyncConnect]);
633
- const disconnectSync = useCallback(() => {
890
+ }, [state.selectedResources, state.projectInfo, onImport]);
891
+ const connectSync = useCallback(async () => {
892
+ if (onSyncConnect) {
893
+ const status = await onSyncConnect();
894
+ dispatch({ type: "SET_SYNC_STATUS", status });
895
+ } else {
896
+ dispatch({
897
+ type: "SET_SYNC_STATUS",
898
+ status: {
899
+ connected: true,
900
+ godotVersion: "4.2.1",
901
+ projectName: "MyGodotGame",
902
+ isRunning: false,
903
+ debuggerConnected: true
904
+ }
905
+ });
906
+ }
907
+ }, [onSyncConnect]);
908
+ const disconnectSync = useCallback(() => {
634
909
  onSyncDisconnect?.();
635
910
  dispatch({
636
- type: 'SET_SYNC_STATUS',
637
- status: { connected: false, isRunning: false, debuggerConnected: false },
911
+ type: "SET_SYNC_STATUS",
912
+ status: { connected: false, isRunning: false, debuggerConnected: false }
638
913
  });
639
- }, [onSyncDisconnect]);
640
- // Imperative handle
641
- useImperativeHandle(ref, () => ({
642
- loadProject: async (_path) => {
643
- dispatch({ type: 'SET_PROJECT', info: DEMO_PROJECT });
914
+ }, [onSyncDisconnect]);
915
+ useImperativeHandle(
916
+ ref,
917
+ () => ({
918
+ loadProject: async (_path) => {
919
+ dispatch({ type: "SET_PROJECT", info: DEMO_PROJECT });
644
920
  onProjectLoad?.(DEMO_PROJECT);
645
- },
646
- getSelectedResources: () => {
921
+ },
922
+ getSelectedResources: () => {
647
923
  if (!state.projectInfo) {
648
- return [];
924
+ return [];
649
925
  }
650
926
  return state.projectInfo.resources.filter((r) => state.selectedResources.has(r.id));
651
- },
652
- importSelected: importSelectedResources,
653
- }), [state.projectInfo, state.selectedResources, importSelectedResources, onProjectLoad]);
654
- const ctxValue = useMemo(() => ({ state, dispatch, theme, importSelectedResources, connectSync, disconnectSync }), [state, theme, importSelectedResources, connectSync, disconnectSync]);
655
- return (jsx(BrowserContext.Provider, { value: ctxValue, children: jsxs("div", { className: `godot-project-browser ${className ?? ''}`, style: {
656
- display: 'flex',
657
- flexDirection: 'column',
658
- width: '100%',
659
- height: '100%',
660
- backgroundColor: theme.background,
661
- fontFamily: 'system-ui, sans-serif',
662
- overflow: 'hidden',
663
- ...style,
664
- }, children: [jsx(BrowserHeader, {}), jsx(BrowserToolbar, {}), jsx(TabBar, {}), jsxs("div", { style: { flex: 1, overflow: 'auto' }, children: [state.tab === 'files' && jsx(FilesPanel, {}), state.tab === 'autoloads' && jsx(AutoloadsPanel, {}), state.tab === 'plugins' && jsx(PluginsPanel, {}), state.tab === 'exports' && jsx(ExportsPanel, {})] })] }) }));
665
- }), { displayName: 'GodotProjectBrowser' });
666
-
667
- export { GodotProjectBrowser };
927
+ },
928
+ importSelected: importSelectedResources
929
+ }),
930
+ [state.projectInfo, state.selectedResources, importSelectedResources, onProjectLoad]
931
+ );
932
+ const ctxValue = useMemo(
933
+ () => ({ state, dispatch, theme, importSelectedResources, connectSync, disconnectSync }),
934
+ [state, theme, importSelectedResources, connectSync, disconnectSync]
935
+ );
936
+ return /* @__PURE__ */ jsx(BrowserContext.Provider, { value: ctxValue, children: /* @__PURE__ */ jsxs(
937
+ "div",
938
+ {
939
+ className: `godot-project-browser ${className ?? ""}`,
940
+ style: {
941
+ display: "flex",
942
+ flexDirection: "column",
943
+ width: "100%",
944
+ height: "100%",
945
+ backgroundColor: theme.background,
946
+ fontFamily: "system-ui, sans-serif",
947
+ overflow: "hidden",
948
+ ...style
949
+ },
950
+ children: [
951
+ /* @__PURE__ */ jsx(BrowserHeader, {}),
952
+ /* @__PURE__ */ jsx(BrowserToolbar, {}),
953
+ /* @__PURE__ */ jsx(TabBar, {}),
954
+ /* @__PURE__ */ jsxs("div", { style: { flex: 1, overflow: "auto" }, children: [
955
+ state.tab === "files" && /* @__PURE__ */ jsx(FilesPanel, {}),
956
+ state.tab === "autoloads" && /* @__PURE__ */ jsx(AutoloadsPanel, {}),
957
+ state.tab === "plugins" && /* @__PURE__ */ jsx(PluginsPanel, {}),
958
+ state.tab === "exports" && /* @__PURE__ */ jsx(ExportsPanel, {})
959
+ ] })
960
+ ]
961
+ }
962
+ ) });
963
+ }
964
+ ),
965
+ { displayName: "GodotProjectBrowser" }
966
+ );
967
+ export {
968
+ GodotProjectBrowser
969
+ };