@fps-games/editor 0.2.1-beta.1 → 0.2.1-beta.2

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 (245) hide show
  1. package/dist/agent-bridge/capabilities/ui-regions.d.ts.map +1 -1
  2. package/dist/agent-bridge/capabilities/ui-regions.js +16 -0
  3. package/dist/agent-bridge/capabilities/ui-regions.js.map +1 -1
  4. package/dist/build-info.json +43 -43
  5. package/dist/internal/material-preview.d.ts +22 -0
  6. package/dist/internal/material-preview.d.ts.map +1 -0
  7. package/dist/internal/material-preview.js +186 -0
  8. package/dist/internal/material-preview.js.map +1 -0
  9. package/dist/internal/project-model-preview.d.ts +4 -0
  10. package/dist/internal/project-model-preview.d.ts.map +1 -0
  11. package/dist/internal/project-model-preview.js +359 -0
  12. package/dist/internal/project-model-preview.js.map +1 -0
  13. package/dist/local-editor-agent-context.d.ts +12 -1
  14. package/dist/local-editor-agent-context.d.ts.map +1 -1
  15. package/dist/local-editor-agent-context.js +47 -0
  16. package/dist/local-editor-agent-context.js.map +1 -1
  17. package/dist/local-editor-harness.d.ts +15 -2
  18. package/dist/local-editor-harness.d.ts.map +1 -1
  19. package/dist/local-editor-harness.js +310 -21
  20. package/dist/local-editor-harness.js.map +1 -1
  21. package/dist/local-editor-tools.d.ts +1 -0
  22. package/dist/local-editor-tools.d.ts.map +1 -1
  23. package/dist/local-editor-tools.js +3 -0
  24. package/dist/local-editor-tools.js.map +1 -1
  25. package/dist/playable-local-editor-host.d.ts +4 -0
  26. package/dist/playable-local-editor-host.d.ts.map +1 -1
  27. package/dist/playable-local-editor-host.js +27 -0
  28. package/dist/playable-local-editor-host.js.map +1 -1
  29. package/dist/playable-product-scene-capabilities.d.ts.map +1 -1
  30. package/dist/playable-product-scene-capabilities.js +9 -3
  31. package/dist/playable-product-scene-capabilities.js.map +1 -1
  32. package/dist/playable-standard-project.d.ts.map +1 -1
  33. package/dist/playable-standard-project.js +5 -2
  34. package/dist/playable-standard-project.js.map +1 -1
  35. package/node_modules/@fps-games/babylon-renderer/package.json +7 -7
  36. package/node_modules/@fps-games/editor-babylon/dist/marker-overlay.js +24 -0
  37. package/node_modules/@fps-games/editor-babylon/dist/marker-overlay.js.map +1 -1
  38. package/node_modules/@fps-games/editor-babylon/dist/projection.d.ts +10 -1
  39. package/node_modules/@fps-games/editor-babylon/dist/projection.d.ts.map +1 -1
  40. package/node_modules/@fps-games/editor-babylon/dist/projection.js +96 -1
  41. package/node_modules/@fps-games/editor-babylon/dist/projection.js.map +1 -1
  42. package/node_modules/@fps-games/editor-babylon/dist/scene-view-spatial-overlay-controller.d.ts.map +1 -1
  43. package/node_modules/@fps-games/editor-babylon/dist/scene-view-spatial-overlay-controller.js +85 -22
  44. package/node_modules/@fps-games/editor-babylon/dist/scene-view-spatial-overlay-controller.js.map +1 -1
  45. package/node_modules/@fps-games/editor-babylon/dist/selection-presentation-controller.d.ts +2 -0
  46. package/node_modules/@fps-games/editor-babylon/dist/selection-presentation-controller.d.ts.map +1 -1
  47. package/node_modules/@fps-games/editor-babylon/dist/selection-presentation-controller.js +150 -4
  48. package/node_modules/@fps-games/editor-babylon/dist/selection-presentation-controller.js.map +1 -1
  49. package/node_modules/@fps-games/editor-babylon/dist/transform-gizmo-controller.d.ts +1 -0
  50. package/node_modules/@fps-games/editor-babylon/dist/transform-gizmo-controller.d.ts.map +1 -1
  51. package/node_modules/@fps-games/editor-babylon/dist/transform-gizmo-controller.js +249 -15
  52. package/node_modules/@fps-games/editor-babylon/dist/transform-gizmo-controller.js.map +1 -1
  53. package/node_modules/@fps-games/editor-babylon/dist/types.d.ts +1 -1
  54. package/node_modules/@fps-games/editor-babylon/dist/types.d.ts.map +1 -1
  55. package/node_modules/@fps-games/editor-babylon/dist/types.js.map +1 -1
  56. package/node_modules/@fps-games/editor-babylon/package.json +6 -6
  57. package/node_modules/@fps-games/editor-browser/dist/index.d.ts +5 -0
  58. package/node_modules/@fps-games/editor-browser/dist/index.d.ts.map +1 -1
  59. package/node_modules/@fps-games/editor-browser/dist/index.js +3 -0
  60. package/node_modules/@fps-games/editor-browser/dist/index.js.map +1 -1
  61. package/node_modules/@fps-games/editor-browser/dist/local-editor-asset-browser-continuity.d.ts +35 -0
  62. package/node_modules/@fps-games/editor-browser/dist/local-editor-asset-browser-continuity.d.ts.map +1 -0
  63. package/node_modules/@fps-games/editor-browser/dist/local-editor-asset-browser-continuity.js +136 -0
  64. package/node_modules/@fps-games/editor-browser/dist/local-editor-asset-browser-continuity.js.map +1 -0
  65. package/node_modules/@fps-games/editor-browser/dist/local-editor-asset-filesystem.d.ts +46 -0
  66. package/node_modules/@fps-games/editor-browser/dist/local-editor-asset-filesystem.d.ts.map +1 -0
  67. package/node_modules/@fps-games/editor-browser/dist/local-editor-asset-filesystem.js +283 -0
  68. package/node_modules/@fps-games/editor-browser/dist/local-editor-asset-filesystem.js.map +1 -0
  69. package/node_modules/@fps-games/editor-browser/dist/local-editor-preview-cleanup-registry.d.ts +12 -0
  70. package/node_modules/@fps-games/editor-browser/dist/local-editor-preview-cleanup-registry.d.ts.map +1 -0
  71. package/node_modules/@fps-games/editor-browser/dist/local-editor-preview-cleanup-registry.js +67 -0
  72. package/node_modules/@fps-games/editor-browser/dist/local-editor-preview-cleanup-registry.js.map +1 -0
  73. package/node_modules/@fps-games/editor-browser/dist/local-editor-project-file-open.d.ts +6 -0
  74. package/node_modules/@fps-games/editor-browser/dist/local-editor-project-file-open.d.ts.map +1 -0
  75. package/node_modules/@fps-games/editor-browser/dist/local-editor-project-file-open.js +9 -0
  76. package/node_modules/@fps-games/editor-browser/dist/local-editor-project-file-open.js.map +1 -0
  77. package/node_modules/@fps-games/editor-browser/dist/local-editor-project-file-preview.d.ts +7 -0
  78. package/node_modules/@fps-games/editor-browser/dist/local-editor-project-file-preview.d.ts.map +1 -0
  79. package/node_modules/@fps-games/editor-browser/dist/local-editor-project-file-preview.js +20 -0
  80. package/node_modules/@fps-games/editor-browser/dist/local-editor-project-file-preview.js.map +1 -0
  81. package/node_modules/@fps-games/editor-browser/dist/local-editor-project-media-thumbnail-cache.d.ts +9 -0
  82. package/node_modules/@fps-games/editor-browser/dist/local-editor-project-media-thumbnail-cache.d.ts.map +1 -0
  83. package/node_modules/@fps-games/editor-browser/dist/local-editor-project-media-thumbnail-cache.js +219 -0
  84. package/node_modules/@fps-games/editor-browser/dist/local-editor-project-media-thumbnail-cache.js.map +1 -0
  85. package/node_modules/@fps-games/editor-browser/dist/local-editor-tool-presentation.d.ts +14 -0
  86. package/node_modules/@fps-games/editor-browser/dist/local-editor-tool-presentation.d.ts.map +1 -0
  87. package/node_modules/@fps-games/editor-browser/dist/local-editor-tool-presentation.js +42 -0
  88. package/node_modules/@fps-games/editor-browser/dist/local-editor-tool-presentation.js.map +1 -0
  89. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-asset-kind.d.ts.map +1 -1
  90. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-asset-kind.js +2 -0
  91. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-asset-kind.js.map +1 -1
  92. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-console.d.ts +27 -0
  93. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-console.d.ts.map +1 -0
  94. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-console.js +288 -0
  95. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-console.js.map +1 -0
  96. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-icons.d.ts +1 -1
  97. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-icons.d.ts.map +1 -1
  98. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-icons.js +29 -0
  99. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-icons.js.map +1 -1
  100. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-panels.d.ts +20 -1
  101. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-panels.d.ts.map +1 -1
  102. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-panels.js +321 -60
  103. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-panels.js.map +1 -1
  104. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-prefab-stage.d.ts +2 -1
  105. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-prefab-stage.d.ts.map +1 -1
  106. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-prefab-stage.js +4 -2
  107. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-prefab-stage.js.map +1 -1
  108. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-types.d.ts +63 -3
  109. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-types.d.ts.map +1 -1
  110. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-types.js.map +1 -1
  111. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-workbench.d.ts +9 -0
  112. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-workbench.d.ts.map +1 -1
  113. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-workbench.js +88 -16
  114. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui-workbench.js.map +1 -1
  115. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui.d.ts +2 -1
  116. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui.d.ts.map +1 -1
  117. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui.js +1463 -356
  118. package/node_modules/@fps-games/editor-browser/dist/local-editor-ui.js.map +1 -1
  119. package/node_modules/@fps-games/editor-browser/dist/local-editor-viewport-orientation.d.ts +13 -0
  120. package/node_modules/@fps-games/editor-browser/dist/local-editor-viewport-orientation.d.ts.map +1 -0
  121. package/node_modules/@fps-games/editor-browser/dist/local-editor-viewport-orientation.js +15 -0
  122. package/node_modules/@fps-games/editor-browser/dist/local-editor-viewport-orientation.js.map +1 -0
  123. package/node_modules/@fps-games/editor-browser/package.json +7 -7
  124. package/node_modules/@fps-games/editor-core/dist/editor-tools.d.ts +1 -0
  125. package/node_modules/@fps-games/editor-core/dist/editor-tools.d.ts.map +1 -1
  126. package/node_modules/@fps-games/editor-core/dist/editor-tools.js +3 -1
  127. package/node_modules/@fps-games/editor-core/dist/editor-tools.js.map +1 -1
  128. package/node_modules/@fps-games/editor-core/dist/viewport-tools.d.ts +11 -2
  129. package/node_modules/@fps-games/editor-core/dist/viewport-tools.d.ts.map +1 -1
  130. package/node_modules/@fps-games/editor-core/dist/viewport-tools.js +12 -1
  131. package/node_modules/@fps-games/editor-core/dist/viewport-tools.js.map +1 -1
  132. package/node_modules/@fps-games/editor-core/package.json +6 -6
  133. package/node_modules/@fps-games/editor-forge-play/package.json +2 -2
  134. package/node_modules/@fps-games/editor-playable-sdk/dist/asset-library/catalog.d.ts +1 -0
  135. package/node_modules/@fps-games/editor-playable-sdk/dist/asset-library/catalog.d.ts.map +1 -1
  136. package/node_modules/@fps-games/editor-playable-sdk/dist/asset-library/catalog.js +5 -0
  137. package/node_modules/@fps-games/editor-playable-sdk/dist/asset-library/catalog.js.map +1 -1
  138. package/node_modules/@fps-games/editor-playable-sdk/dist/asset-library/index.d.ts +1 -1
  139. package/node_modules/@fps-games/editor-playable-sdk/dist/asset-library/index.d.ts.map +1 -1
  140. package/node_modules/@fps-games/editor-playable-sdk/dist/asset-library/index.js +1 -1
  141. package/node_modules/@fps-games/editor-playable-sdk/dist/asset-library/index.js.map +1 -1
  142. package/node_modules/@fps-games/editor-playable-sdk/dist/authoring-server/handler.d.ts.map +1 -1
  143. package/node_modules/@fps-games/editor-playable-sdk/dist/authoring-server/handler.js +15 -1
  144. package/node_modules/@fps-games/editor-playable-sdk/dist/authoring-server/handler.js.map +1 -1
  145. package/node_modules/@fps-games/editor-playable-sdk/dist/authoring-server/routes.d.ts.map +1 -1
  146. package/node_modules/@fps-games/editor-playable-sdk/dist/authoring-server/routes.js +3 -0
  147. package/node_modules/@fps-games/editor-playable-sdk/dist/authoring-server/routes.js.map +1 -1
  148. package/node_modules/@fps-games/editor-playable-sdk/dist/authoring-server/types.d.ts +6 -1
  149. package/node_modules/@fps-games/editor-playable-sdk/dist/authoring-server/types.d.ts.map +1 -1
  150. package/node_modules/@fps-games/editor-playable-sdk/dist/authoring-server/types.js.map +1 -1
  151. package/node_modules/@fps-games/editor-playable-sdk/dist/index.d.ts +1 -0
  152. package/node_modules/@fps-games/editor-playable-sdk/dist/index.d.ts.map +1 -1
  153. package/node_modules/@fps-games/editor-playable-sdk/dist/index.js +1 -0
  154. package/node_modules/@fps-games/editor-playable-sdk/dist/index.js.map +1 -1
  155. package/node_modules/@fps-games/editor-playable-sdk/dist/product/scene-source.d.ts +4 -0
  156. package/node_modules/@fps-games/editor-playable-sdk/dist/product/scene-source.d.ts.map +1 -1
  157. package/node_modules/@fps-games/editor-playable-sdk/dist/product/scene-source.js +10 -1
  158. package/node_modules/@fps-games/editor-playable-sdk/dist/product/scene-source.js.map +1 -1
  159. package/node_modules/@fps-games/editor-playable-sdk/dist/project-files/index.d.ts +4 -0
  160. package/node_modules/@fps-games/editor-playable-sdk/dist/project-files/index.d.ts.map +1 -0
  161. package/node_modules/@fps-games/editor-playable-sdk/dist/project-files/index.js +4 -0
  162. package/node_modules/@fps-games/editor-playable-sdk/dist/project-files/index.js.map +1 -0
  163. package/node_modules/@fps-games/editor-playable-sdk/dist/project-files/protocol.d.ts +4 -0
  164. package/node_modules/@fps-games/editor-playable-sdk/dist/project-files/protocol.d.ts.map +1 -0
  165. package/node_modules/@fps-games/editor-playable-sdk/dist/project-files/protocol.js +86 -0
  166. package/node_modules/@fps-games/editor-playable-sdk/dist/project-files/protocol.js.map +1 -0
  167. package/node_modules/@fps-games/editor-playable-sdk/dist/project-files/support.d.ts +9 -0
  168. package/node_modules/@fps-games/editor-playable-sdk/dist/project-files/support.d.ts.map +1 -0
  169. package/node_modules/@fps-games/editor-playable-sdk/dist/project-files/support.js +76 -0
  170. package/node_modules/@fps-games/editor-playable-sdk/dist/project-files/support.js.map +1 -0
  171. package/node_modules/@fps-games/editor-playable-sdk/dist/project-files/types.d.ts +34 -0
  172. package/node_modules/@fps-games/editor-playable-sdk/dist/project-files/types.d.ts.map +1 -0
  173. package/node_modules/@fps-games/editor-playable-sdk/dist/project-files/types.js +2 -0
  174. package/node_modules/@fps-games/editor-playable-sdk/dist/project-files/types.js.map +1 -0
  175. package/node_modules/@fps-games/editor-playable-sdk/dist/scene-source/client.d.ts +4 -0
  176. package/node_modules/@fps-games/editor-playable-sdk/dist/scene-source/client.d.ts.map +1 -1
  177. package/node_modules/@fps-games/editor-playable-sdk/dist/scene-source/client.js +40 -0
  178. package/node_modules/@fps-games/editor-playable-sdk/dist/scene-source/client.js.map +1 -1
  179. package/node_modules/@fps-games/editor-playable-sdk/dist/vite/index.d.ts +1 -0
  180. package/node_modules/@fps-games/editor-playable-sdk/dist/vite/index.d.ts.map +1 -1
  181. package/node_modules/@fps-games/editor-playable-sdk/dist/vite/index.js +1 -0
  182. package/node_modules/@fps-games/editor-playable-sdk/dist/vite/index.js.map +1 -1
  183. package/node_modules/@fps-games/editor-playable-sdk/dist/vite/product-authoring-api.d.ts +1 -0
  184. package/node_modules/@fps-games/editor-playable-sdk/dist/vite/product-authoring-api.d.ts.map +1 -1
  185. package/node_modules/@fps-games/editor-playable-sdk/dist/vite/product-authoring-api.js +94 -0
  186. package/node_modules/@fps-games/editor-playable-sdk/dist/vite/product-authoring-api.js.map +1 -1
  187. package/node_modules/@fps-games/editor-playable-sdk/dist/vite/project-file-handle.d.ts +14 -0
  188. package/node_modules/@fps-games/editor-playable-sdk/dist/vite/project-file-handle.d.ts.map +1 -0
  189. package/node_modules/@fps-games/editor-playable-sdk/dist/vite/project-file-handle.js +101 -0
  190. package/node_modules/@fps-games/editor-playable-sdk/dist/vite/project-file-handle.js.map +1 -0
  191. package/node_modules/@fps-games/editor-playable-sdk/dist/vite/project-files.d.ts +23 -0
  192. package/node_modules/@fps-games/editor-playable-sdk/dist/vite/project-files.d.ts.map +1 -0
  193. package/node_modules/@fps-games/editor-playable-sdk/dist/vite/project-files.js +180 -0
  194. package/node_modules/@fps-games/editor-playable-sdk/dist/vite/project-files.js.map +1 -0
  195. package/node_modules/@fps-games/editor-playable-sdk/package.json +6 -6
  196. package/node_modules/@fps-games/editor-protocol/dist/agent.d.ts +23 -3
  197. package/node_modules/@fps-games/editor-protocol/dist/agent.d.ts.map +1 -1
  198. package/node_modules/@fps-games/editor-protocol/dist/agent.js.map +1 -1
  199. package/node_modules/@fps-games/editor-protocol/package.json +2 -2
  200. package/node_modules/@fps-games/editor-tooling/package.json +3 -3
  201. package/node_modules/@fps-games/editor-ui/dist/editor-ui-theme.d.ts.map +1 -1
  202. package/node_modules/@fps-games/editor-ui/dist/editor-ui-theme.js +103 -10
  203. package/node_modules/@fps-games/editor-ui/dist/editor-ui-theme.js.map +1 -1
  204. package/node_modules/@fps-games/editor-ui/package.json +1 -1
  205. package/node_modules/@fps-games/playable-assets/package.json +1 -1
  206. package/node_modules/@fps-games/playable-contracts/package.json +1 -1
  207. package/node_modules/@fps-games/playable-rendering/package.json +2 -2
  208. package/node_modules/@fps-games/playable-runtime/package.json +12 -12
  209. package/node_modules/@fps-games/playable-runtime-data/package.json +4 -4
  210. package/node_modules/@fps-games/playable-scene/package.json +2 -2
  211. package/node_modules/@fps-games/plugin-api/package.json +1 -1
  212. package/node_modules/@fps-games/plugin-assets/dist/version.d.ts +1 -1
  213. package/node_modules/@fps-games/plugin-assets/dist/version.js +1 -1
  214. package/node_modules/@fps-games/plugin-assets/dist/version.js.map +1 -1
  215. package/node_modules/@fps-games/plugin-assets/package.json +5 -5
  216. package/node_modules/@fps-games/plugin-hierarchy/dist/version.d.ts +1 -1
  217. package/node_modules/@fps-games/plugin-hierarchy/dist/version.js +1 -1
  218. package/node_modules/@fps-games/plugin-hierarchy/dist/version.js.map +1 -1
  219. package/node_modules/@fps-games/plugin-hierarchy/package.json +5 -5
  220. package/node_modules/@fps-games/plugin-host/package.json +2 -2
  221. package/node_modules/@fps-games/plugin-markers/dist/version.d.ts +1 -1
  222. package/node_modules/@fps-games/plugin-markers/dist/version.js +1 -1
  223. package/node_modules/@fps-games/plugin-markers/dist/version.js.map +1 -1
  224. package/node_modules/@fps-games/plugin-markers/package.json +5 -5
  225. package/node_modules/@fps-games/plugin-materials/dist/version.d.ts +1 -1
  226. package/node_modules/@fps-games/plugin-materials/dist/version.js +1 -1
  227. package/node_modules/@fps-games/plugin-materials/dist/version.js.map +1 -1
  228. package/node_modules/@fps-games/plugin-materials/package.json +5 -5
  229. package/node_modules/@fps-games/plugin-rendering/dist/version.d.ts +1 -1
  230. package/node_modules/@fps-games/plugin-rendering/dist/version.js +1 -1
  231. package/node_modules/@fps-games/plugin-rendering/dist/version.js.map +1 -1
  232. package/node_modules/@fps-games/plugin-rendering/package.json +5 -5
  233. package/node_modules/@fps-games/plugin-scene/dist/version.d.ts +1 -1
  234. package/node_modules/@fps-games/plugin-scene/dist/version.js +1 -1
  235. package/node_modules/@fps-games/plugin-scene/dist/version.js.map +1 -1
  236. package/node_modules/@fps-games/plugin-scene/package.json +5 -5
  237. package/node_modules/@fps-games/plugin-shadow-map-experiment/dist/version.d.ts +1 -1
  238. package/node_modules/@fps-games/plugin-shadow-map-experiment/dist/version.js +1 -1
  239. package/node_modules/@fps-games/plugin-shadow-map-experiment/dist/version.js.map +1 -1
  240. package/node_modules/@fps-games/plugin-shadow-map-experiment/package.json +5 -5
  241. package/node_modules/@fps-games/plugin-shadows/dist/version.d.ts +1 -1
  242. package/node_modules/@fps-games/plugin-shadows/dist/version.js +1 -1
  243. package/node_modules/@fps-games/plugin-shadows/dist/version.js.map +1 -1
  244. package/node_modules/@fps-games/plugin-shadows/package.json +7 -7
  245. package/package.json +22 -22
@@ -1,7 +1,15 @@
1
1
  import { type EditorUiMount, type EditorUiLayerHost } from '@fps-games/editor-ui';
2
2
  import type { LocalEditorAssetBrowserTab, LocalEditorBottomDockTab, LocalEditorBrowserInspectorConflictStrategy, LocalEditorBrowserInspectorControlBindingOptions, LocalEditorBrowserInspectorControlRegistration, LocalEditorBrowserInspectorControlRenderContext, LocalEditorBrowserInspectorEffectMode, LocalEditorBrowserInspectorObject, LocalEditorBrowserInspectorProperty, LocalEditorBrowserInspectorSection, LocalEditorBrowserUiAssetItem, LocalEditorBrowserUiState, LocalEditorRightDockTab, LocalEditorWorkbenchPanelDescriptor } from './local-editor-ui-types';
3
+ import { type LocalEditorAssetFilesystemViewMode } from './local-editor-asset-filesystem';
3
4
  export declare function registerInspectorUiMount<T extends EditorUiMount>(mount: T): T;
4
5
  export declare function disposeInspectorPanelUi(panel: HTMLElement): void;
6
+ export type LocalEditorAssetBrowserViewMode = LocalEditorAssetFilesystemViewMode;
7
+ export interface LocalEditorAssetBrowserViewState {
8
+ expandedFolderPaths?: ReadonlySet<string>;
9
+ folderPath?: string;
10
+ viewMode?: LocalEditorAssetBrowserViewMode;
11
+ selectedEntryPath?: string | null;
12
+ }
5
13
  export type LocalEditorAssetPreviewVariant = 'list' | 'grid' | 'modal';
6
14
  export interface LocalEditorBrowserInspectorRenderOptions<TDocument = unknown> {
7
15
  title?: string;
@@ -13,7 +21,8 @@ export interface LocalEditorBrowserInspectorRenderOptions<TDocument = unknown> {
13
21
  lockedVectorGroups?: ReadonlySet<string>;
14
22
  }
15
23
  export declare function renderBottomDockPanel<TDocument>(doc: Document, panel: HTMLElement, state: LocalEditorBrowserUiState<TDocument>, activeTab: LocalEditorBottomDockTab, activeAssetBrowserTab?: LocalEditorAssetBrowserTab): void;
16
- export declare function renderWorkbenchBottomDockPanel<TDocument>(doc: Document, panel: HTMLElement, state: LocalEditorBrowserUiState<TDocument>, activeTab: LocalEditorBottomDockTab, panels?: LocalEditorWorkbenchPanelDescriptor[], activeAssetBrowserTab?: LocalEditorAssetBrowserTab): void;
24
+ export declare function renderWorkbenchBottomDockPanel<TDocument>(doc: Document, panel: HTMLElement, state: LocalEditorBrowserUiState<TDocument>, activeTab: LocalEditorBottomDockTab, panels?: LocalEditorWorkbenchPanelDescriptor[], activeAssetBrowserTab?: LocalEditorAssetBrowserTab, assetBrowserView?: LocalEditorAssetBrowserViewState): void;
25
+ export declare function syncLocalEditorAssetBrowserEffectiveFolderPath(panel: Pick<HTMLElement, 'dataset'>, content: Pick<HTMLElement, 'dataset'>): void;
17
26
  export declare function renderWorkbenchRightDockTabs(doc: Document, panel: HTMLElement, activeTab: LocalEditorRightDockTab, panels?: LocalEditorWorkbenchPanelDescriptor[]): void;
18
27
  export declare function renderMarkerPanel<TDocument>(doc: Document, panel: HTMLElement, state: LocalEditorBrowserUiState<TDocument>): void;
19
28
  export declare function shouldShowPrefabModelAddAction<TDocument>(state: LocalEditorBrowserUiState<TDocument>, asset: LocalEditorBrowserUiAssetItem): boolean;
@@ -21,6 +30,16 @@ export declare function renderWorkbenchLeftDockTabs(doc: Document, panel: HTMLEl
21
30
  export declare function renderRenderingPanel<TDocument>(doc: Document, panel: HTMLElement, state: LocalEditorBrowserUiState<TDocument>, options?: {
22
31
  layerHost?: EditorUiLayerHost;
23
32
  }): void;
33
+ export declare function resolveLocalEditorAssetBrowserTypeOptionTitle(title: string, itemCount: number, truncated: boolean): string;
34
+ export declare function resolveLocalEditorAssetBrowserFolderTitle(label: string, descendantItemCount: number, truncated: boolean): string;
35
+ export declare function resolveLocalEditorAssetBrowserCountLabel(input: {
36
+ matchingCount: number;
37
+ normalizedFilter: string;
38
+ resultLimited: boolean;
39
+ truncated: boolean;
40
+ typeLabel: string | null;
41
+ visibleCount: number;
42
+ }): string;
24
43
  export declare function createAssetPreviewElement(doc: Document, asset: LocalEditorBrowserUiAssetItem, variant: LocalEditorAssetPreviewVariant): HTMLElement;
25
44
  export declare function renderInspectorPanel<TDocument>(doc: Document, panel: HTMLElement, state: LocalEditorBrowserUiState<TDocument>, filter?: string, options?: LocalEditorBrowserInspectorRenderOptions<TDocument>): void;
26
45
  export type LocalEditorBrowserInspectorAccessMode = 'editable' | 'mixed' | 'readonly' | 'runtime';
@@ -1 +1 @@
1
- {"version":3,"file":"local-editor-ui-panels.d.ts","sourceRoot":"","sources":["../src/local-editor-ui-panels.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"local-editor-ui-panels.d.ts","sourceRoot":"","sources":["../src/local-editor-ui-panels.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,7 @@ import { createBadge, createAssetList, createDockTab, createEditorInputStyle, cr
4
4
  import { configureLocalEditorDockPanelContent, createLocalEditorDockPanelViewport, renderLocalEditorDockTabStrip, } from './local-editor-ui-dock-panel.js';
5
5
  import { clearElement, createButton, toTitle } from './local-editor-ui-shared.js';
6
6
  import { resolveLocalEditorAssetBrowserTab, resolveLocalEditorBrowserAssetKind, } from './local-editor-ui-asset-kind.js';
7
+ import { createLocalEditorAssetFilesystemSnapshot, filterLocalEditorAssetFilesystemEntries, resolveLocalEditorAssetFilesystemBreadcrumbs, resolveLocalEditorAssetFilesystemEntryTab, resolveLocalEditorAssetFilesystemExistingFolderPath, resolveLocalEditorAssetFilesystemParentPath, resolveLocalEditorAssetFilesystemVisibleFolders, resolveLocalEditorProjectMediaThumbnailCacheKey, resolveLocalEditorProjectMediaThumbnailKind, } from './local-editor-asset-filesystem.js';
7
8
  import { createLocalEditorBrowserInspectorVectorCopyPayload, } from './local-editor-inspector-clipboard.js';
8
9
  import { resolveLocalEditorBrowserInspectorVectorGroupAxisFromPropertyPath, resolveLocalEditorBrowserInspectorVectorGroupPathFromProperties, } from './local-editor-inspector-groups.js';
9
10
  const inspectorUiMounts = new WeakMap();
@@ -67,6 +68,7 @@ const ASSET_BROWSER_TABS = [
67
68
  { id: 'prefabs', label: '预制体', title: '显示预制体资产' },
68
69
  { id: 'materials', label: '材质', title: '显示项目材质资产' },
69
70
  { id: 'textures', label: '贴图', title: '显示贴图资产' },
71
+ { id: 'audio', label: '音频', title: '显示音频资产' },
70
72
  ];
71
73
  export function renderBottomDockPanel(doc, panel, state, activeTab, activeAssetBrowserTab = 'all') {
72
74
  clearElement(panel);
@@ -76,7 +78,7 @@ export function renderBottomDockPanel(doc, panel, state, activeTab, activeAssetB
76
78
  else
77
79
  renderAssetBrowserContent(doc, panel, state, 'list', activeAssetBrowserTab);
78
80
  }
79
- export function renderWorkbenchBottomDockPanel(doc, panel, state, activeTab, panels = [], activeAssetBrowserTab = 'all') {
81
+ export function renderWorkbenchBottomDockPanel(doc, panel, state, activeTab, panels = [], activeAssetBrowserTab = 'all', assetBrowserView = {}) {
80
82
  clearElement(panel);
81
83
  const tabHeader = doc.createElement('div');
82
84
  renderLocalEditorDockTabStrip(doc, {
@@ -97,10 +99,21 @@ export function renderWorkbenchBottomDockPanel(doc, panel, state, activeTab, pan
97
99
  content.dataset.editorPanelId = activeTab;
98
100
  content.style.cssText = 'flex:1;min-height:0;display:flex;flex-direction:column;overflow:hidden;padding:8px';
99
101
  panel.appendChild(content);
100
- if (activeTab === 'history')
102
+ if (activeTab === 'history') {
103
+ delete panel.dataset.editorAssetBrowserFolderPath;
101
104
  renderHistoryPanel(doc, content, state.session?.history ?? null);
105
+ }
106
+ else {
107
+ renderAssetBrowserContent(doc, content, state, assetBrowserView.viewMode ?? 'grid', activeAssetBrowserTab, assetBrowserView.folderPath ?? '/', assetBrowserView.selectedEntryPath ?? null, assetBrowserView.expandedFolderPaths ?? new Set(['/']));
108
+ syncLocalEditorAssetBrowserEffectiveFolderPath(panel, content);
109
+ }
110
+ }
111
+ export function syncLocalEditorAssetBrowserEffectiveFolderPath(panel, content) {
112
+ const effectiveFolderPath = content.dataset.editorAssetBrowserFolderPath;
113
+ if (effectiveFolderPath === undefined)
114
+ delete panel.dataset.editorAssetBrowserFolderPath;
102
115
  else
103
- renderAssetBrowserContent(doc, content, state, 'grid', activeAssetBrowserTab);
116
+ panel.dataset.editorAssetBrowserFolderPath = effectiveFolderPath;
104
117
  }
105
118
  function appendDockTabs(doc, panel, activeTab) {
106
119
  const tabs = doc.createElement('div');
@@ -1311,86 +1324,254 @@ function createHeadingLabel(doc, text) {
1311
1324
  label.style.cssText = 'min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap';
1312
1325
  return label;
1313
1326
  }
1314
- function renderAssetBrowserContent(doc, panel, state, variant = 'list', activeTab = 'all') {
1327
+ function renderAssetBrowserContent(doc, panel, state, variant = 'list', activeTab = 'all', requestedFolderPath = '/', selectedEntryPath = null, expandedFolderPaths = new Set(['/'])) {
1315
1328
  configureLocalEditorDockPanelContent(panel);
1316
- const title = doc.createElement('h2');
1317
- title.className = 'fps-editor-ui-panel-title';
1318
- title.appendChild(createLocalEditorIcon(doc, 'asset'));
1319
- title.appendChild(createHeadingLabel(doc, '资产浏览器'));
1320
- panel.appendChild(title);
1321
- appendAssetBrowserTabs(doc, panel, state, activeTab);
1322
- if (activeTab === 'materials') {
1323
- const createMaterialButton = createToolbarButton(doc, '+ 材质', 'asset');
1329
+ panel.classList.add('fps-editor-ui-asset-filesystem');
1330
+ const snapshot = createLocalEditorAssetFilesystemSnapshot(state.assets, state.projectFiles);
1331
+ const folderPath = resolveLocalEditorAssetFilesystemExistingFolderPath(snapshot, requestedFolderPath);
1332
+ panel.dataset.editorAssetBrowserFolderPath = folderPath;
1333
+ const toolbar = doc.createElement('div');
1334
+ toolbar.className = 'fps-editor-ui-asset-toolbar';
1335
+ const toolbarPrimary = doc.createElement('div');
1336
+ toolbarPrimary.className = 'fps-editor-ui-asset-toolbar-group';
1337
+ if (folderPath === '/@editor/materials' || activeTab === 'materials') {
1338
+ const createMaterialButton = createToolbarButton(doc, '', 'plus');
1324
1339
  createMaterialButton.dataset.editorCreateMaterialAsset = 'true';
1325
1340
  createMaterialButton.title = '新建项目材质';
1326
- createMaterialButton.style.cssText = [
1327
- 'height:28px',
1328
- 'margin:0 0 8px',
1329
- 'padding:0 10px',
1330
- 'font-size:12px',
1331
- 'font-weight:800',
1332
- 'align-self:flex-start',
1333
- ].join(';');
1334
- panel.appendChild(createMaterialButton);
1341
+ createMaterialButton.setAttribute('aria-label', createMaterialButton.title);
1342
+ createMaterialButton.dataset.editorAssetToolbarIcon = 'true';
1343
+ toolbarPrimary.appendChild(createMaterialButton);
1335
1344
  }
1345
+ const parentFolderPath = resolveLocalEditorAssetFilesystemParentPath(snapshot, folderPath);
1346
+ const parentButton = createToolbarButton(doc, '', 'arrow-up');
1347
+ parentButton.dataset.editorAssetBrowserParent = 'true';
1348
+ parentButton.dataset.editorAssetToolbarIcon = 'true';
1349
+ parentButton.title = parentFolderPath ? '返回上一级目录' : '已位于项目根目录';
1350
+ parentButton.setAttribute('aria-label', parentButton.title);
1351
+ parentButton.disabled = !parentFolderPath;
1352
+ if (parentFolderPath)
1353
+ parentButton.dataset.editorAssetFolderPath = parentFolderPath;
1354
+ toolbarPrimary.appendChild(parentButton);
1355
+ const refreshButton = createToolbarButton(doc, '', 'refresh');
1356
+ refreshButton.dataset.editorAssetBrowserRefresh = 'true';
1357
+ refreshButton.dataset.editorAssetToolbarIcon = 'true';
1358
+ refreshButton.title = '刷新项目文件与资产';
1359
+ refreshButton.setAttribute('aria-label', refreshButton.title);
1360
+ toolbarPrimary.appendChild(refreshButton);
1361
+ const gridButton = createToolbarButton(doc, '', 'grid');
1362
+ gridButton.dataset.editorAssetViewMode = 'grid';
1363
+ gridButton.dataset.active = variant === 'grid' ? 'true' : 'false';
1364
+ gridButton.dataset.editorAssetToolbarIcon = 'true';
1365
+ gridButton.title = '网格视图';
1366
+ gridButton.setAttribute('aria-label', gridButton.title);
1367
+ gridButton.setAttribute('aria-pressed', variant === 'grid' ? 'true' : 'false');
1368
+ const listButton = createToolbarButton(doc, '', 'list');
1369
+ listButton.dataset.editorAssetViewMode = 'list';
1370
+ listButton.dataset.active = variant === 'list' ? 'true' : 'false';
1371
+ listButton.dataset.editorAssetToolbarIcon = 'true';
1372
+ listButton.title = '列表视图';
1373
+ listButton.setAttribute('aria-label', listButton.title);
1374
+ listButton.setAttribute('aria-pressed', variant === 'list' ? 'true' : 'false');
1375
+ toolbarPrimary.append(gridButton, listButton);
1376
+ toolbar.appendChild(toolbarPrimary);
1377
+ const typeFilter = doc.createElement('select');
1378
+ typeFilter.className = 'fps-editor-ui-asset-type-filter';
1379
+ typeFilter.dataset.editorAssetBrowserTypeFilter = 'true';
1380
+ typeFilter.title = '按资产类型筛选';
1381
+ for (const tab of ASSET_BROWSER_TABS) {
1382
+ const option = doc.createElement('option');
1383
+ option.value = tab.id;
1384
+ const itemCount = snapshot.entries.filter(entry => (entry.kind !== 'directory'
1385
+ && (tab.id === 'all' || resolveLocalEditorAssetFilesystemEntryTab(entry) === tab.id))).length;
1386
+ option.textContent = tab.label;
1387
+ option.title = resolveLocalEditorAssetBrowserTypeOptionTitle(tab.title, itemCount, snapshot.truncated);
1388
+ typeFilter.appendChild(option);
1389
+ }
1390
+ typeFilter.value = activeTab;
1391
+ toolbar.appendChild(typeFilter);
1392
+ const search = doc.createElement('div');
1393
+ search.className = 'fps-editor-ui-asset-search';
1336
1394
  const filter = doc.createElement('input');
1337
1395
  filter.className = 'fps-editor-ui-search';
1338
1396
  filter.type = 'search';
1339
- filter.placeholder = '筛选资产';
1397
+ filter.placeholder = '搜索文件和资产';
1340
1398
  filter.value = state.assetFilter;
1341
1399
  filter.dataset.editorAssetFilter = 'true';
1342
- panel.appendChild(filter);
1343
- const tabAssets = filterAssetsByBrowserTab(state.assets, activeTab);
1400
+ const searchIcon = createLocalEditorIcon(doc, 'search', { size: 16 });
1401
+ searchIcon.classList.add('fps-editor-ui-asset-search-icon');
1402
+ const clearFilterButton = createToolbarButton(doc, '', 'close');
1403
+ clearFilterButton.dataset.editorAssetFilterClear = 'true';
1404
+ clearFilterButton.dataset.editorAssetToolbarIcon = 'true';
1405
+ clearFilterButton.title = '清除搜索';
1406
+ clearFilterButton.setAttribute('aria-label', clearFilterButton.title);
1407
+ clearFilterButton.hidden = state.assetFilter.length === 0;
1408
+ search.append(searchIcon, filter, clearFilterButton);
1409
+ toolbar.appendChild(search);
1410
+ panel.appendChild(toolbar);
1344
1411
  const normalizedFilter = state.assetFilter.trim().toLowerCase();
1345
- const filteredAssets = tabAssets
1346
- .filter((asset) => {
1412
+ const typeFilterActive = activeTab !== 'all';
1413
+ const recursiveFilterActive = normalizedFilter.length > 0 || typeFilterActive;
1414
+ const folderEntries = filterLocalEditorAssetFilesystemEntries(snapshot, folderPath, recursiveFilterActive, activeTab);
1415
+ const matchingEntries = folderEntries.filter((entry) => {
1347
1416
  if (!normalizedFilter)
1348
1417
  return true;
1418
+ const asset = entry.asset;
1349
1419
  return [
1350
- asset.id,
1351
- asset.assetId ?? '',
1352
- asset.guid ?? '',
1353
- asset.kind ?? '',
1354
- asset.label,
1355
- asset.meta ?? '',
1356
- asset.external?.platformAssetId ?? '',
1357
- asset.external?.assetPath ?? '',
1358
- asset.external?.assetUrl ?? '',
1420
+ entry.label,
1421
+ entry.path,
1422
+ entry.extension ?? '',
1423
+ asset?.id ?? '',
1424
+ asset?.assetId ?? '',
1425
+ asset?.guid ?? '',
1426
+ asset?.label ?? '',
1427
+ asset?.kind ?? '',
1428
+ asset?.relativePath ?? '',
1429
+ asset?.meta ?? '',
1430
+ asset?.external?.platformAssetId ?? '',
1431
+ asset?.external?.assetPath ?? '',
1432
+ asset?.external?.assetUrl ?? '',
1359
1433
  ]
1360
1434
  .some(value => value.toLowerCase().includes(normalizedFilter));
1361
- })
1362
- .slice(0, 80);
1435
+ });
1436
+ const filteredEntries = matchingEntries.slice(0, 200);
1437
+ const resultLimited = matchingEntries.length > filteredEntries.length;
1438
+ const body = doc.createElement('div');
1439
+ body.className = 'fps-editor-ui-asset-filesystem-body';
1440
+ const tree = doc.createElement('aside');
1441
+ tree.className = 'fps-editor-ui-asset-folder-tree';
1442
+ tree.setAttribute('aria-label', '资产目录');
1443
+ const visibleFolders = resolveLocalEditorAssetFilesystemVisibleFolders(snapshot, expandedFolderPaths);
1444
+ for (const folder of visibleFolders) {
1445
+ const hasChildFolders = snapshot.folders.some(candidate => candidate.parentPath === folder.path);
1446
+ const expanded = expandedFolderPaths.has(folder.path);
1447
+ const row = doc.createElement('div');
1448
+ row.className = 'fps-editor-ui-asset-folder-tree-row';
1449
+ row.style.setProperty('--fps-editor-asset-folder-depth', String(folder.depth));
1450
+ const toggle = doc.createElement('button');
1451
+ toggle.type = 'button';
1452
+ toggle.className = 'fps-editor-ui-asset-folder-toggle';
1453
+ toggle.dataset.editorAssetFolderToggle = folder.path;
1454
+ toggle.disabled = !hasChildFolders;
1455
+ toggle.title = hasChildFolders
1456
+ ? `${expanded ? '折叠' : '展开'} ${folder.path === '/' ? snapshot.rootName : folder.label}`
1457
+ : '';
1458
+ toggle.setAttribute('aria-label', toggle.title || `${folder.label} 无子目录`);
1459
+ toggle.setAttribute('aria-expanded', hasChildFolders ? String(expanded) : 'false');
1460
+ if (hasChildFolders) {
1461
+ toggle.appendChild(createLocalEditorIcon(doc, expanded ? 'chevron-down' : 'chevron-right', { size: 13 }));
1462
+ }
1463
+ const button = doc.createElement('button');
1464
+ button.type = 'button';
1465
+ button.className = 'fps-editor-ui-asset-folder-row';
1466
+ button.dataset.editorAssetFolderPath = folder.path;
1467
+ button.dataset.editorAssetFolderTreePath = folder.path;
1468
+ button.dataset.selected = folder.path === folderPath ? 'true' : 'false';
1469
+ button.appendChild(createLocalEditorIcon(doc, folder.path === '/' ? 'root' : 'folder', { size: 15 }));
1470
+ const label = doc.createElement('span');
1471
+ label.className = 'fps-editor-ui-ellipsis';
1472
+ label.textContent = folder.path === '/' ? snapshot.rootName : folder.label;
1473
+ button.title = resolveLocalEditorAssetBrowserFolderTitle(label.textContent, folder.descendantItemCount, snapshot.truncated);
1474
+ button.append(label);
1475
+ row.append(toggle, button);
1476
+ tree.appendChild(row);
1477
+ }
1478
+ body.appendChild(tree);
1479
+ const browser = doc.createElement('section');
1480
+ browser.className = 'fps-editor-ui-asset-browser';
1481
+ const summary = doc.createElement('div');
1482
+ summary.className = 'fps-editor-ui-asset-browser-summary';
1483
+ const breadcrumb = doc.createElement('nav');
1484
+ breadcrumb.className = 'fps-editor-ui-asset-breadcrumb';
1485
+ breadcrumb.setAttribute('aria-label', '当前项目路径');
1486
+ const breadcrumbs = resolveLocalEditorAssetFilesystemBreadcrumbs(snapshot, folderPath);
1487
+ breadcrumbs.forEach((item, index) => {
1488
+ if (index > 0) {
1489
+ const separator = doc.createElement('span');
1490
+ separator.className = 'fps-editor-ui-asset-breadcrumb-separator';
1491
+ separator.textContent = '/';
1492
+ breadcrumb.appendChild(separator);
1493
+ }
1494
+ if (index === breadcrumbs.length - 1) {
1495
+ const current = doc.createElement('span');
1496
+ current.className = 'fps-editor-ui-asset-breadcrumb-current fps-editor-ui-ellipsis';
1497
+ current.textContent = item.label;
1498
+ current.title = item.path;
1499
+ current.setAttribute('aria-current', 'page');
1500
+ breadcrumb.appendChild(current);
1501
+ return;
1502
+ }
1503
+ const segment = doc.createElement('button');
1504
+ segment.type = 'button';
1505
+ segment.className = 'fps-editor-ui-asset-breadcrumb-button fps-editor-ui-ellipsis';
1506
+ segment.dataset.editorAssetFolderPath = item.path;
1507
+ segment.textContent = item.label;
1508
+ segment.title = item.path;
1509
+ breadcrumb.appendChild(segment);
1510
+ });
1363
1511
  const count = doc.createElement('div');
1364
1512
  count.className = 'fps-editor-ui-asset-count';
1365
- const activeTabLabel = ASSET_BROWSER_TABS.find(tab => tab.id === activeTab)?.label ?? '资产';
1366
- count.textContent = activeTab === 'all' && state.assetCountLabel
1367
- ? `${filteredAssets.length} / ${state.assetCountLabel}`
1368
- : `${filteredAssets.length} / ${tabAssets.length} 个${activeTabLabel}资产`;
1369
- panel.appendChild(count);
1513
+ count.textContent = resolveLocalEditorAssetBrowserCountLabel({
1514
+ matchingCount: matchingEntries.length,
1515
+ normalizedFilter,
1516
+ resultLimited,
1517
+ truncated: snapshot.truncated,
1518
+ typeLabel: typeFilterActive
1519
+ ? ASSET_BROWSER_TABS.find(tab => tab.id === activeTab)?.label ?? ''
1520
+ : null,
1521
+ visibleCount: filteredEntries.length,
1522
+ });
1523
+ summary.append(breadcrumb, count);
1524
+ browser.appendChild(summary);
1370
1525
  const list = createAssetList(doc, variant === 'grid');
1371
1526
  list.dataset.editorAssetBrowserList = 'true';
1527
+ list.dataset.searchActive = recursiveFilterActive ? 'true' : 'false';
1372
1528
  list.style.overflow = 'visible';
1529
+ list.style.maxHeight = 'none';
1373
1530
  list.style.paddingRight = '0';
1374
- for (const asset of filteredAssets) {
1531
+ for (const entry of filteredEntries) {
1532
+ if (entry.kind === 'directory') {
1533
+ list.appendChild(createProjectFilesystemEntryButton(doc, entry, variant, selectedEntryPath === entry.path, recursiveFilterActive ? entry.parentPath : undefined));
1534
+ continue;
1535
+ }
1536
+ const asset = entry.asset;
1537
+ if (!asset) {
1538
+ list.appendChild(createProjectFilesystemEntryButton(doc, entry, variant, selectedEntryPath === entry.path, recursiveFilterActive ? entry.parentPath : undefined));
1539
+ continue;
1540
+ }
1375
1541
  const selected = state.selectedAssetId === asset.id;
1376
1542
  const hasPreview = !!asset.preview;
1377
1543
  const button = doc.createElement('button');
1378
1544
  button.className = 'fps-editor-ui-asset-card';
1379
1545
  button.type = 'button';
1380
1546
  button.dataset.editorAssetId = asset.id;
1547
+ button.dataset.editorProjectFilePath = entry.path;
1381
1548
  button.disabled = asset.disabled ?? false;
1382
1549
  button.setAttribute('aria-selected', selected ? 'true' : 'false');
1383
1550
  button.dataset.variant = variant;
1384
1551
  button.dataset.hasPreview = hasPreview ? 'true' : 'false';
1385
- const preview = createAssetPreviewElement(doc, asset, variant);
1552
+ button.dataset.searchResult = recursiveFilterActive ? 'true' : 'false';
1553
+ button.title = entry.path;
1554
+ const mediaThumbnailKind = asset.preview ? null : resolveLocalEditorProjectMediaThumbnailKind(entry);
1555
+ const preview = mediaThumbnailKind
1556
+ ? createProjectMediaThumbnailPlaceholder(doc, entry, variant, mediaThumbnailKind)
1557
+ : createAssetPreviewElement(doc, asset, variant);
1386
1558
  const body = doc.createElement('div');
1387
1559
  body.className = 'fps-editor-ui-asset-card-body';
1388
1560
  const label = doc.createElement('div');
1389
1561
  label.className = 'fps-editor-ui-asset-card-label fps-editor-ui-ellipsis';
1390
- label.textContent = asset.label;
1562
+ label.textContent = entry.kind === 'file' ? entry.label : asset.label;
1391
1563
  const meta = doc.createElement('div');
1392
1564
  meta.className = 'fps-editor-ui-asset-card-meta fps-editor-ui-ellipsis';
1393
- meta.textContent = asset.meta ?? asset.id;
1565
+ meta.textContent = recursiveFilterActive
1566
+ ? [asset.label !== entry.label ? asset.label : '', entry.parentPath]
1567
+ .filter(Boolean)
1568
+ .join(' · ')
1569
+ : entry.kind === 'file'
1570
+ ? [entry.extension?.toUpperCase(), asset.label !== entry.label ? asset.label : '', asset.kind ?? 'asset']
1571
+ .filter(Boolean)
1572
+ .join(' · ')
1573
+ : asset.meta ?? asset.id;
1574
+ meta.title = meta.textContent;
1394
1575
  body.appendChild(label);
1395
1576
  body.appendChild(meta);
1396
1577
  button.appendChild(preview);
@@ -1418,15 +1599,92 @@ function renderAssetBrowserContent(doc, panel, state, variant = 'list', activeTa
1418
1599
  list.appendChild(button);
1419
1600
  }
1420
1601
  }
1421
- if (filteredAssets.length === 0) {
1422
- list.appendChild(createEmptyState(doc, normalizedFilter ? '没有匹配的资产。' : '暂无该类型资产。'));
1602
+ if (filteredEntries.length === 0) {
1603
+ list.appendChild(createEmptyState(doc, recursiveFilterActive ? '当前目录及子目录中没有匹配的资源。' : '当前目录为空。'));
1423
1604
  }
1424
1605
  const viewport = createLocalEditorDockPanelViewport(doc, 'editorAssetBrowserScrollViewport');
1425
1606
  viewport.appendChild(list);
1426
- panel.appendChild(viewport);
1607
+ browser.appendChild(viewport);
1608
+ body.appendChild(browser);
1609
+ panel.appendChild(body);
1610
+ }
1611
+ export function resolveLocalEditorAssetBrowserTypeOptionTitle(title, itemCount, truncated) {
1612
+ return truncated
1613
+ ? `${title},当前清单 ${itemCount} 项 · 文件清单已截断`
1614
+ : `${title},共 ${itemCount} 项`;
1615
+ }
1616
+ export function resolveLocalEditorAssetBrowserFolderTitle(label, descendantItemCount, truncated) {
1617
+ return truncated
1618
+ ? `${label} · 当前清单 ${descendantItemCount} 个文件 · 文件清单已截断`
1619
+ : `${label} · ${descendantItemCount} 个文件`;
1620
+ }
1621
+ export function resolveLocalEditorAssetBrowserCountLabel(input) {
1622
+ const truncationSuffix = input.truncated ? ' · 文件清单已截断' : '';
1623
+ if (input.resultLimited) {
1624
+ return input.truncated
1625
+ ? `显示前 ${input.visibleCount} 项(当前清单 ${input.matchingCount} 项)${truncationSuffix}`
1626
+ : `显示前 ${input.visibleCount} 项(共 ${input.matchingCount} 项)`;
1627
+ }
1628
+ if (input.normalizedFilter)
1629
+ return `${input.visibleCount} 个匹配项${truncationSuffix}`;
1630
+ if (input.typeLabel != null)
1631
+ return `${input.visibleCount} 个${input.typeLabel}资源${truncationSuffix}`;
1632
+ return `${input.visibleCount} 个项目${truncationSuffix}`;
1633
+ }
1634
+ function createProjectFilesystemEntryButton(doc, entry, variant, selected, searchParentPath) {
1635
+ const button = doc.createElement('button');
1636
+ button.className = 'fps-editor-ui-asset-card';
1637
+ button.type = 'button';
1638
+ button.dataset.variant = variant;
1639
+ const mediaThumbnailKind = resolveLocalEditorProjectMediaThumbnailKind(entry);
1640
+ button.dataset.hasPreview = mediaThumbnailKind ? 'true' : 'false';
1641
+ button.dataset.searchResult = searchParentPath ? 'true' : 'false';
1642
+ button.setAttribute('aria-selected', selected ? 'true' : 'false');
1643
+ button.title = entry.path;
1644
+ if (entry.kind === 'directory')
1645
+ button.dataset.editorProjectDirectoryPath = entry.path;
1646
+ else
1647
+ button.dataset.editorProjectFilePath = entry.path;
1648
+ button.appendChild(mediaThumbnailKind
1649
+ ? createProjectMediaThumbnailPlaceholder(doc, entry, variant, mediaThumbnailKind)
1650
+ : createLocalEditorIcon(doc, entry.kind === 'directory' ? 'folder' : 'asset', {
1651
+ size: variant === 'grid' ? 42 : 16,
1652
+ strokeWidth: variant === 'grid' ? 1.35 : 2,
1653
+ }));
1654
+ const body = doc.createElement('div');
1655
+ body.className = 'fps-editor-ui-asset-card-body';
1656
+ const label = doc.createElement('div');
1657
+ label.className = 'fps-editor-ui-asset-card-label fps-editor-ui-ellipsis';
1658
+ label.textContent = entry.label;
1659
+ const meta = doc.createElement('div');
1660
+ meta.className = 'fps-editor-ui-asset-card-meta fps-editor-ui-ellipsis';
1661
+ meta.textContent = searchParentPath || (entry.kind === 'directory'
1662
+ ? 'Folder'
1663
+ : entry.extension?.toUpperCase() || 'File');
1664
+ body.append(label, meta);
1665
+ button.appendChild(body);
1666
+ return button;
1667
+ }
1668
+ function createProjectMediaThumbnailPlaceholder(doc, entry, variant, kind) {
1669
+ const frame = doc.createElement('div');
1670
+ frame.className = 'fps-editor-ui-project-media-thumbnail';
1671
+ frame.dataset.editorProjectMediaThumbnailPath = entry.path;
1672
+ frame.dataset.editorProjectMediaThumbnailKind = kind;
1673
+ const cacheKey = resolveLocalEditorProjectMediaThumbnailCacheKey(entry);
1674
+ if (cacheKey)
1675
+ frame.dataset.editorProjectMediaThumbnailCacheKey = cacheKey;
1676
+ frame.dataset.thumbnailState = 'loading';
1677
+ frame.dataset.variant = variant;
1678
+ const fallback = createLocalEditorIcon(doc, kind === 'model' ? 'object' : 'asset', {
1679
+ size: variant === 'grid' ? 34 : 15,
1680
+ strokeWidth: variant === 'grid' ? 1.35 : 2,
1681
+ });
1682
+ fallback.classList.add('fps-editor-ui-project-media-thumbnail-fallback');
1683
+ frame.appendChild(fallback);
1684
+ return frame;
1427
1685
  }
1428
1686
  export function createAssetPreviewElement(doc, asset, variant) {
1429
- const size = variant === 'modal' ? 220 : variant === 'grid' ? 46 : 24;
1687
+ const size = variant === 'modal' ? 220 : variant === 'grid' ? 64 : 24;
1430
1688
  const preview = asset.preview;
1431
1689
  if (!preview) {
1432
1690
  const kind = resolveLocalEditorBrowserAssetKind(asset);
@@ -1437,7 +1695,10 @@ export function createAssetPreviewElement(doc, asset, variant) {
1437
1695
  : kind === 'texture'
1438
1696
  ? 'asset'
1439
1697
  : 'object';
1440
- return createLocalEditorIcon(doc, icon, { size: variant === 'grid' ? 18 : 16 });
1698
+ return createLocalEditorIcon(doc, icon, {
1699
+ size: variant === 'grid' ? 42 : 16,
1700
+ strokeWidth: variant === 'grid' ? 1.35 : 2,
1701
+ });
1441
1702
  }
1442
1703
  const frame = doc.createElement('div');
1443
1704
  frame.style.cssText = [
@@ -1475,16 +1736,16 @@ export function createAssetPreviewElement(doc, asset, variant) {
1475
1736
  const emissionColor = formatAssetPreviewColor(preview.emissionColor, '#ffffff');
1476
1737
  sphere.style.cssText = [
1477
1738
  'position:relative',
1478
- 'width:82%',
1479
- 'height:82%',
1739
+ 'width:76%',
1740
+ 'height:76%',
1480
1741
  'overflow:hidden',
1481
1742
  'border-radius:999px',
1482
1743
  `background:${baseColor}`,
1483
- 'border:1px solid rgba(255,255,255,0.22)',
1744
+ 'border:1px solid rgba(255,255,255,0.12)',
1484
1745
  'box-shadow:' + [
1485
- `inset -5px -7px 12px rgba(0,0,0,${(0.26 + roughness * 0.14).toFixed(2)})`,
1486
- `inset 5px 5px 10px rgba(255,255,255,${(0.12 + metallic * 0.2).toFixed(2)})`,
1487
- emissionIntensity > 0 ? `0 0 ${Math.round(6 + emissionIntensity * 5)}px ${emissionColor}` : '0 1px 2px rgba(0,0,0,0.4)',
1746
+ `inset -5px -7px 12px rgba(0,0,0,${(0.24 + roughness * 0.12).toFixed(2)})`,
1747
+ `inset 4px 4px 9px rgba(255,255,255,${(0.08 + metallic * 0.14).toFixed(2)})`,
1748
+ emissionIntensity > 0 ? `0 0 ${Math.round(3 + emissionIntensity * 2)}px ${emissionColor}` : '0 1px 2px rgba(0,0,0,0.34)',
1488
1749
  ].join(','),
1489
1750
  ].join(';');
1490
1751
  if (preview.textureUrl) {
@@ -1503,8 +1764,8 @@ export function createAssetPreviewElement(doc, asset, variant) {
1503
1764
  sphere.appendChild(image);
1504
1765
  }
1505
1766
  const shading = doc.createElement('div');
1506
- const highlightAlpha = clampNumber(0.86 - roughness * 0.48 + metallic * 0.12, 0.25, 0.92);
1507
- const highlightEnd = Math.round(9 + roughness * 12);
1767
+ const highlightAlpha = clampNumber(0.66 - roughness * 0.38 + metallic * 0.08, 0.18, 0.72);
1768
+ const highlightEnd = Math.round(8 + roughness * 11);
1508
1769
  const shadowAlpha = clampNumber(0.28 + roughness * 0.14 + metallic * 0.16, 0.2, 0.62);
1509
1770
  const rimAlpha = clampNumber(0.12 + metallic * 0.36, 0.08, 0.52);
1510
1771
  shading.style.cssText = [
@@ -1513,7 +1774,7 @@ export function createAssetPreviewElement(doc, asset, variant) {
1513
1774
  'border-radius:inherit',
1514
1775
  'pointer-events:none',
1515
1776
  'background:' + [
1516
- `radial-gradient(circle at 31% 23%, rgba(255,255,255,${highlightAlpha.toFixed(2)}) 0 ${highlightEnd}%, rgba(255,255,255,0) ${highlightEnd + 17}%)`,
1777
+ `radial-gradient(circle at 31% 23%, rgba(255,255,255,${highlightAlpha.toFixed(2)}) 0 ${highlightEnd}%, rgba(255,255,255,0) ${highlightEnd + 20}%)`,
1517
1778
  `radial-gradient(circle at 70% 82%, rgba(0,0,0,${shadowAlpha.toFixed(2)}) 0 26%, rgba(0,0,0,0) 58%)`,
1518
1779
  `radial-gradient(circle at 82% 22%, rgba(255,255,255,${rimAlpha.toFixed(2)}) 0 9%, rgba(255,255,255,0) 36%)`,
1519
1780
  `linear-gradient(135deg, rgba(255,255,255,${(0.08 + metallic * 0.16).toFixed(2)}), rgba(0,0,0,${(0.12 + roughness * 0.1).toFixed(2)}))`,