@volter/game-editor 0.5.65

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 (653) hide show
  1. package/BUNDLED_NOTICES +11228 -0
  2. package/LICENSE +686 -0
  3. package/LICENSE-BLENDER +1409 -0
  4. package/LICENSE-MCP +21 -0
  5. package/NOTICE +21 -0
  6. package/catalog/entries/audio.json +14 -0
  7. package/catalog/entries/bake.json +36 -0
  8. package/catalog/entries/blender.json +17 -0
  9. package/catalog/entries/react-root.json +24 -0
  10. package/catalog/entries/reflections.json +29 -0
  11. package/catalog/entries/static-batch.json +25 -0
  12. package/catalog/project-source/LICENSE +37 -0
  13. package/catalog/project-source/src/contributions/bake.kind.ts +40 -0
  14. package/catalog/project-source/src/contributions/builder-document.tsx +65 -0
  15. package/catalog/project-source/src/contributions/builder-state.ts +27 -0
  16. package/catalog/project-source/src/contributions/builder-ui.tsx +61 -0
  17. package/catalog/project-source/src/contributions/module-source.ts +502 -0
  18. package/catalog/project-source/src/contributions/pages.finder.ts +61 -0
  19. package/catalog/project-source/src/lib/audio/sfx.ts +255 -0
  20. package/catalog/project-source/src/lib/bake/asset-seed.ts +128 -0
  21. package/catalog/project-source/src/lib/bake/bake-schema.ts +65 -0
  22. package/catalog/project-source/src/lib/bake/clip-layering.ts +203 -0
  23. package/catalog/project-source/src/lib/bake/gltf-bake.ts +657 -0
  24. package/catalog/project-source/src/lib/bake/mesh-slice.ts +157 -0
  25. package/catalog/project-source/src/lib/bake/node-image.ts +463 -0
  26. package/catalog/project-source/src/lib/bake/object3d-bake.ts +121 -0
  27. package/catalog/project-source/src/lib/bake/object3d-lifecycle.ts +15 -0
  28. package/catalog/project-source/src/lib/bake/object3d-source.ts +8 -0
  29. package/catalog/project-source/src/lib/bake/params.ts +75 -0
  30. package/catalog/project-source/src/lib/bake/rest-relative-animation.ts +217 -0
  31. package/catalog/project-source/src/lib/bake/use-model.ts +95 -0
  32. package/catalog/project-source/src/lib/react-root/index.ts +20 -0
  33. package/catalog/project-source/src/lib/react-root/react-root-adapter.tsx +57 -0
  34. package/catalog/project-source/src/lib/reflections/ReflectionProbe.tsx +201 -0
  35. package/catalog/project-source/src/lib/reflections/index.ts +19 -0
  36. package/catalog/project-source/src/lib/reflections/probe-controller.ts +75 -0
  37. package/catalog/project-source/src/lib/reflections/reflection-probe-registry.ts +402 -0
  38. package/catalog/project-source/src/lib/reflections/volume-reflection-material.ts +416 -0
  39. package/catalog/project-source/src/lib/static-batch/Frozen.tsx +91 -0
  40. package/catalog/project-source/src/lib/static-batch/freeze.ts +579 -0
  41. package/catalog/project-source/src/lib/static-batch/index.ts +44 -0
  42. package/catalog/project-source/src/lib/static-batch/mutation-watch.ts +149 -0
  43. package/catalog/project-source/src/lib/static-batch/shadow-cache.ts +171 -0
  44. package/catalog/project-source/src/tools/bake-module.tool.ts +139 -0
  45. package/catalog/project-source/src/tools/bake-preview.tool.ts +475 -0
  46. package/dist/.vite/manifest.json +8304 -0
  47. package/dist/assets/AssetBudgetPanel-J9--TZPU.js +23 -0
  48. package/dist/assets/AudioViewer-CR7333fe.js +1 -0
  49. package/dist/assets/BVHLoader-6bQIXhMX.js +1 -0
  50. package/dist/assets/BufferGeometryUtils-Nz37EVXf.js +1 -0
  51. package/dist/assets/CCDIKSolver-CD7vLpsK.js +1 -0
  52. package/dist/assets/CSS3DRenderer-CL7ABLVK.js +1 -0
  53. package/dist/assets/CanvasSceneViewport-Bpi6gVTC.js +1 -0
  54. package/dist/assets/ColladaLoader-aVOPIsCh.js +3 -0
  55. package/dist/assets/ColorInput-DQBNrW-K.js +1 -0
  56. package/dist/assets/ConvexGeometry-CAzXlPVG.js +1 -0
  57. package/dist/assets/ConvexHull-BINCESFp.js +1 -0
  58. package/dist/assets/CopyShader-BzTUYzf6.js +24 -0
  59. package/dist/assets/DecalGeometry-160KRdfg.js +1 -0
  60. package/dist/assets/EXRLoader-Cdans_oJ.js +1 -0
  61. package/dist/assets/EffectComposer-DQxfsXBZ.js +1 -0
  62. package/dist/assets/EntityModelDocument-Ccvw66N9.js +1 -0
  63. package/dist/assets/EnvironmentAssetDocument-Dg-Qq6O6.js +1 -0
  64. package/dist/assets/FBXLoader-B4MoUtAn.js +1 -0
  65. package/dist/assets/Fbo-Dz-Soul3.js +1 -0
  66. package/dist/assets/FontLoader-CvGoVI5a.js +2 -0
  67. package/dist/assets/GLTFExporter-HgrCle4L.js +1 -0
  68. package/dist/assets/GameplaySessionTimeline-B52W3FVZ.js +1 -0
  69. package/dist/assets/Gltf-UHVWKz65.js +2 -0
  70. package/dist/assets/HDRLoader-THU88oVD.js +5 -0
  71. package/dist/assets/ImageViewer-Tn7s_MnW.js +1 -0
  72. package/dist/assets/InspectorCanvasPreview-CEr_Kxna.js +1 -0
  73. package/dist/assets/InspectorObjectPreview-CVejvLRg.js +1 -0
  74. package/dist/assets/JsonAssetDocument-C7VGcLhu.js +3 -0
  75. package/dist/assets/LineSegments2-CsOpKSiM.js +370 -0
  76. package/dist/assets/MTLLoader-_Xzd4_0p.js +2 -0
  77. package/dist/assets/MarchingCubes-Bsp4wrzd.js +1 -0
  78. package/dist/assets/MeshBVH-BiDHDcu-.js +1 -0
  79. package/dist/assets/ModelAssetDocument-F5GACirk.js +1 -0
  80. package/dist/assets/NonThreeAuthoringBootstrap-C3woOMxX.js +1 -0
  81. package/dist/assets/OBJLoader-BhIC6Hwo.js +5 -0
  82. package/dist/assets/Object3DDocumentViewport-DB7T0NTl.js +2 -0
  83. package/dist/assets/Object3DPreview-DL8oi7Xs.js +2 -0
  84. package/dist/assets/OnlineAssetDetail-C6z9RvYK.js +2 -0
  85. package/dist/assets/OrbitControls-CM3bPray.js +1 -0
  86. package/dist/assets/OrbitControls-DLpayAaK.js +1 -0
  87. package/dist/assets/OrthographicCamera-bQozawrh.js +1 -0
  88. package/dist/assets/PLYLoader-DYQqs5Ik.js +2 -0
  89. package/dist/assets/PerspectiveCamera-CQ2lh01o.js +1 -0
  90. package/dist/assets/PlayBar-BR-Vg3Jb.js +2 -0
  91. package/dist/assets/RGBELoader-BgBcQv8j.js +1 -0
  92. package/dist/assets/RectAreaLightUniformsLib-CMMoWfll.js +1 -0
  93. package/dist/assets/RenderPass-DPrn-Uky.js +1 -0
  94. package/dist/assets/ResolutionPicker-C67vs1F3.js +1 -0
  95. package/dist/assets/RootSelectionOverlay-BZPlxmXU.js +1 -0
  96. package/dist/assets/RoundedBox-BDGBg6QZ.js +1 -0
  97. package/dist/assets/RoundedBoxGeometry-CyUuYPfW.js +1 -0
  98. package/dist/assets/STLLoader-Dyv3lsxY.js +1 -0
  99. package/dist/assets/SelectionBox-D_75KrNW.js +1 -0
  100. package/dist/assets/ShaderPass-QYRpPuFJ.js +1 -0
  101. package/dist/assets/ShadowEditor-DkImwu1Y.js +1 -0
  102. package/dist/assets/SimplifyModifier-C8ayvRzd.js +1 -0
  103. package/dist/assets/SkeletonUtils-Cps8GOC6.js +1 -0
  104. package/dist/assets/Sky-CQKCgYDs.js +154 -0
  105. package/dist/assets/SourceAssetViewer-2SWQoUut.js +12 -0
  106. package/dist/assets/StageHost-BN-IoTef.js +2 -0
  107. package/dist/assets/StoryPreviewMount-DjyxRCXu.js +1 -0
  108. package/dist/assets/TDSLoader-D_T8XJ81.js +1 -0
  109. package/dist/assets/TextGeometry-DOWAEUV0.js +1 -0
  110. package/dist/assets/ThreeBoardDocument-CVncZyIq.js +2 -0
  111. package/dist/assets/ThreeIsolationSceneContent-C8C8whSF.js +1 -0
  112. package/dist/assets/ToolObject3DPreview-BRoDWe4Q.js +1 -0
  113. package/dist/assets/TrackballControls-DfznuQTh.js +1 -0
  114. package/dist/assets/TransientHint-BB1fwrvK.js +1 -0
  115. package/dist/assets/UnrealBloomPass-CR-cS_K5.js +83 -0
  116. package/dist/assets/VideoViewer-C6kocgIU.js +1 -0
  117. package/dist/assets/_commonjsHelpers-D6-XlEtG.js +1 -0
  118. package/dist/assets/active-ingest-CT6jSGhr.js +3 -0
  119. package/dist/assets/adapter-surface-Y37Nzcyw.js +1 -0
  120. package/dist/assets/after-paint-CB4bz1-e.js +1 -0
  121. package/dist/assets/agx-base-srgb-BjWZJgrZ.lut +0 -0
  122. package/dist/assets/agx-look-medium-high-contrast-D5F_ob1L.lut +0 -0
  123. package/dist/assets/agx-look-punchy-dxsnycNs.lut +0 -0
  124. package/dist/assets/animation-clock-CnjZqfJp.js +1 -0
  125. package/dist/assets/asset-budget-asset.menu-Di3KiQCd.js +1 -0
  126. package/dist/assets/asset-budget.action-DCzzcuTh.js +1 -0
  127. package/dist/assets/asset-budget.document-BWU8wnVW.js +1 -0
  128. package/dist/assets/asset-budget.menu-BGZpT_31.js +1 -0
  129. package/dist/assets/asset-editor-persistence-BBaONOJt.js +1 -0
  130. package/dist/assets/asset-loaders-BOy5Ss8k.js +2 -0
  131. package/dist/assets/asset-parse-error-BHMwBRU3.js +3 -0
  132. package/dist/assets/assets-BuSoGjBX.js +1 -0
  133. package/dist/assets/audio-meter-CyiToeUW.js +1 -0
  134. package/dist/assets/audio-unlock.service-CfUgUQVy.js +1 -0
  135. package/dist/assets/audio.utility-C6K6jem8.js +1 -0
  136. package/dist/assets/authoring-CgcOFhGS.js +1 -0
  137. package/dist/assets/autoplay.service-BZBGNSvt.js +1 -0
  138. package/dist/assets/axe-LkjAB6Lv.js +30 -0
  139. package/dist/assets/babylon-authoring-adapter-CL02gWDn.js +1 -0
  140. package/dist/assets/binding-Bmxqznjk.js +1 -0
  141. package/dist/assets/binding-identity-DcTpbvyg.js +1 -0
  142. package/dist/assets/binding-resolver-Dsh-6Vor.js +2 -0
  143. package/dist/assets/blender-emscripten-engine-9ZIRYNhe.js +2 -0
  144. package/dist/assets/blender-node-editor.document-iIDkB9sI.js +1 -0
  145. package/dist/assets/blender-properties-tab-C5CyPydi.js +3 -0
  146. package/dist/assets/blender-runtime-host-BpBwGv7r.js +4 -0
  147. package/dist/assets/blender-runtime-skin-DyQ9B6CR.js +7140 -0
  148. package/dist/assets/blender-runtime.document-lIYhhPtv.js +8 -0
  149. package/dist/assets/blender-timeline.document-77fx96N7.js +1 -0
  150. package/dist/assets/blender-uv-editor.document-fsT7B4gV.js +1 -0
  151. package/dist/assets/blender-version.status-o6dBm3n6.js +1 -0
  152. package/dist/assets/blender-wali-engine-wTOcrOMC.js +2 -0
  153. package/dist/assets/blender.command-BtJeWk-A.js +1 -0
  154. package/dist/assets/blender.keymap-GAQgeklK.js +1 -0
  155. package/dist/assets/blender.status-ujwGU6dU.js +1 -0
  156. package/dist/assets/blender.style-Dcem5f_T.js +1 -0
  157. package/dist/assets/board-guides-DziKSTss.js +1 -0
  158. package/dist/assets/body-marks-h_xDxiDE.js +1 -0
  159. package/dist/assets/bridge.command-o5gDNEwa.js +3 -0
  160. package/dist/assets/browserAll-DeWblVez.js +1 -0
  161. package/dist/assets/build-profiles.document-kW8iw8Xj.js +2 -0
  162. package/dist/assets/build-progress.status-BNRLytg2.js +1 -0
  163. package/dist/assets/build-session-C_sg3CEn.js +9 -0
  164. package/dist/assets/build.action-lYjTLb7K.js +1 -0
  165. package/dist/assets/build.command-DIGgUPU_.js +1 -0
  166. package/dist/assets/build.header-CKajx5U3.js +1 -0
  167. package/dist/assets/build.menu-BdU0QXny.js +1 -0
  168. package/dist/assets/build.service-CbBAyeu3.js +1 -0
  169. package/dist/assets/bus-mixer-CGfWDP3C.js +1 -0
  170. package/dist/assets/camera-KEsKvOL7.js +1 -0
  171. package/dist/assets/camera-runtime.inspector-B7unX4g1.js +1 -0
  172. package/dist/assets/canvas-entry-runtime-SfBxaR9M.js +2 -0
  173. package/dist/assets/capability-coverage-Czas4C18.js +7 -0
  174. package/dist/assets/chrome-trace-YZHMz60-.js +1 -0
  175. package/dist/assets/client-DNXj_opT.js +25 -0
  176. package/dist/assets/clip-planes-CnAI6DZn.js +1 -0
  177. package/dist/assets/collaboration-presence-DLoZ7EA3.js +1 -0
  178. package/dist/assets/collider-Bw0mXlsW.js +1 -0
  179. package/dist/assets/collider-dimensions-9xoFADXN.js +1 -0
  180. package/dist/assets/collision-system-DpNUJRJ3.js +1 -0
  181. package/dist/assets/command-results-CUQD49AB.js +1 -0
  182. package/dist/assets/component-board-registry-DrIa2csL.js +1 -0
  183. package/dist/assets/component-board.service-DCwcUssB.js +2 -0
  184. package/dist/assets/component-board.service-DidCyM4O.js +2 -0
  185. package/dist/assets/component-verbs.command-7xzfjGMZ.js +1 -0
  186. package/dist/assets/component-verbs.service-Bv9jId3q.js +1 -0
  187. package/dist/assets/config-CEZk921y.js +6 -0
  188. package/dist/assets/configurations-DTBMdaTL.js +1 -0
  189. package/dist/assets/connection.status-BifnQdOs.js +1 -0
  190. package/dist/assets/console-bridge-CHcb-xk5.js +1 -0
  191. package/dist/assets/constraint-De8f1Uiq.js +1 -0
  192. package/dist/assets/constraints.inspector-B9U9Yj-u.js +1 -0
  193. package/dist/assets/countdown-timer-CUm74dom.js +1 -0
  194. package/dist/assets/coverage.service-VTX5Mcsx.js +3 -0
  195. package/dist/assets/crash-null-boundary-v3a0uEgw.js +1 -0
  196. package/dist/assets/create-runtime-CVCc1BDx.js +1 -0
  197. package/dist/assets/curve-7Q79VgU4.js +1 -0
  198. package/dist/assets/data-asset-4hjS642k.js +5 -0
  199. package/dist/assets/data-check-core-CQEjuFyt.js +1 -0
  200. package/dist/assets/data-ref-CQI28C0D.js +1 -0
  201. package/dist/assets/debug-bridge-CCohG-d-.js +1 -0
  202. package/dist/assets/debug-registry-Dgvitx8M.js +1 -0
  203. package/dist/assets/defaults-DKiBJCPN.js +1 -0
  204. package/dist/assets/deferred-commands-CEMmvL47.js +1 -0
  205. package/dist/assets/deferred-ingest-play-DCJi_Pgu.js +2 -0
  206. package/dist/assets/design-time-layers-wYgOTgni.js +1 -0
  207. package/dist/assets/design-time-mount-registry-DUpXCg1U.js +1 -0
  208. package/dist/assets/design-time-mount.service-BzY21e1F.js +2 -0
  209. package/dist/assets/design-time-react-mount-DM9WLrF2.js +1 -0
  210. package/dist/assets/dev-build-gDYrq68M.js +1 -0
  211. package/dist/assets/directional-shadow-fit-BVkOKAv2.js +1 -0
  212. package/dist/assets/document-preview-three-Kbg2GCLm.js +1 -0
  213. package/dist/assets/dom-authoring-adapter-CY8C7f4T.js +1 -0
  214. package/dist/assets/draco3d-BBUTcNkz.js +1 -0
  215. package/dist/assets/draco_decoder-DsQ12WqX.wasm +0 -0
  216. package/dist/assets/draco_encoder-2Tcju8Ns.wasm +0 -0
  217. package/dist/assets/edit-mode-audio.service-Bzetwd5B.js +1 -0
  218. package/dist/assets/edit-mode-authoring-B47TfLqu.js +1 -0
  219. package/dist/assets/edit-mode-networking.service-YCX6RRb_.js +1 -0
  220. package/dist/assets/editor-api-BoJIcyZG.js +1 -0
  221. package/dist/assets/editor-port-C_FeBdeV.js +1 -0
  222. package/dist/assets/editor-presentation-activity-C7SNSmTd.js +1 -0
  223. package/dist/assets/entry-adjudication-Cq8Yeb74.js +1 -0
  224. package/dist/assets/environment-capture-7himRh2L.js +1 -0
  225. package/dist/assets/esbuild-BHljloGq.wasm +0 -0
  226. package/dist/assets/events-156d8d12.esm-ErOhDXXB.js +36 -0
  227. package/dist/assets/extend-B-eOccUm.js +36 -0
  228. package/dist/assets/extends-CF3RwP-h.js +1 -0
  229. package/dist/assets/eyedropper-session-bjPXnfeX.js +1 -0
  230. package/dist/assets/fflate.module-DPuTF8aG.js +6 -0
  231. package/dist/assets/filmic-srgb-Ct35FIH6.lut +0 -0
  232. package/dist/assets/first-party-audio-system-DxnGJOER.js +1 -0
  233. package/dist/assets/first-party-navigation-system-CL5Bquub.js +1 -0
  234. package/dist/assets/fork-menu-BoVyw2Wu.js +1 -0
  235. package/dist/assets/frame-debugger-store-D1Mf_5up.js +1 -0
  236. package/dist/assets/frame-delta-D2nsw_Ht.js +1 -0
  237. package/dist/assets/frame-pacing-D5acoOzO.js +1 -0
  238. package/dist/assets/frame-selector-cache-cCeUbcjG.js +1 -0
  239. package/dist/assets/game-DHOZVb-7.js +1 -0
  240. package/dist/assets/game-contract-seams-a5YXejOu.js +1 -0
  241. package/dist/assets/game-css-scope-transform-Eng4wS8E.js +33 -0
  242. package/dist/assets/game-document.service-DbRfx2V0.js +1 -0
  243. package/dist/assets/game-eval.command-D-7Dxbj_.js +2 -0
  244. package/dist/assets/game-input-seams-CIQdetRw.js +1 -0
  245. package/dist/assets/game-loop-CZvXlY00.js +1 -0
  246. package/dist/assets/game-module-access-B2mFxv-i.js +1 -0
  247. package/dist/assets/game.layout-CBASrvQu.js +1 -0
  248. package/dist/assets/gameplay-export-BoKXm51x.js +1 -0
  249. package/dist/assets/gameplay-replay-e5umMlXv.js +1 -0
  250. package/dist/assets/gameplay-rng-trap-CTNhm-UW.js +3 -0
  251. package/dist/assets/gameplay.command-DxcVYX6F.js +1 -0
  252. package/dist/assets/generation-DhwCUHPf.css +1 -0
  253. package/dist/assets/generation-jobs-BQrXbGp_.js +1 -0
  254. package/dist/assets/generation.service-CDIgObuw.js +1 -0
  255. package/dist/assets/generations-DzUogZsM.js +1 -0
  256. package/dist/assets/generations.status-CgOUBCum.js +1 -0
  257. package/dist/assets/hierarchy-marks-BLPfSIym.js +1 -0
  258. package/dist/assets/host-pointer-DbGSCjE9.js +1 -0
  259. package/dist/assets/hosted-asset-materialization-CiIvWkGU.js +2 -0
  260. package/dist/assets/ibl-override-material-BlmCxFKq.js +6 -0
  261. package/dist/assets/index-96FBF1Oj.js +1 -0
  262. package/dist/assets/index-BAWkB0dv.js +1 -0
  263. package/dist/assets/index-BDnS2b6S.js +1 -0
  264. package/dist/assets/index-BHp07vN0.js +2 -0
  265. package/dist/assets/index-BMxv2MNV.js +1 -0
  266. package/dist/assets/index-BP6wv2A0.js +5 -0
  267. package/dist/assets/index-BcCBqgM_.js +952 -0
  268. package/dist/assets/index-Bge9JUr6.js +1 -0
  269. package/dist/assets/index-BjTCPEQ7.js +134 -0
  270. package/dist/assets/index-BncK9THk.js +1 -0
  271. package/dist/assets/index-CJbYy-CF.js +3 -0
  272. package/dist/assets/index-CVCb_ImQ.js +1 -0
  273. package/dist/assets/index-CZd9o7Lu.js +1 -0
  274. package/dist/assets/index-CanA16PU.js +2 -0
  275. package/dist/assets/index-CinJrH5C.js +9 -0
  276. package/dist/assets/index-CtzuWnCS.js +1 -0
  277. package/dist/assets/index-D2fNXpHa.css +1 -0
  278. package/dist/assets/index-DUpHH6JR.js +3120 -0
  279. package/dist/assets/index-DUqP1RMl.js +1 -0
  280. package/dist/assets/index-D_NuPfjr.js +9 -0
  281. package/dist/assets/index-Da9JhEvW.js +25 -0
  282. package/dist/assets/index-DgapqSPi.js +7 -0
  283. package/dist/assets/index-FUuS4qwW.js +562 -0
  284. package/dist/assets/index-GIL7oGEO.js +4894 -0
  285. package/dist/assets/index-IEjydI9d.js +1 -0
  286. package/dist/assets/index-OrYXPk3Z.js +487 -0
  287. package/dist/assets/index-V1R-e5Bd.js +1 -0
  288. package/dist/assets/index-bQE2NA0D.js +1 -0
  289. package/dist/assets/index-gHZae-lw.js +13 -0
  290. package/dist/assets/index-mjWQmGhM.js +1 -0
  291. package/dist/assets/index-nmcBqr7Y.js +1 -0
  292. package/dist/assets/inference-diagnostics-Dhmtfbq_.js +1 -0
  293. package/dist/assets/ingest-BbYMC2vQ.js +1 -0
  294. package/dist/assets/ingest-boot-viewport-D5rI_Kk_.js +1 -0
  295. package/dist/assets/ingest-siblings-Bop2kqVl.js +1 -0
  296. package/dist/assets/ingest-source-persistence-C_6Hiyra.js +1 -0
  297. package/dist/assets/ingest.service-BTDnQfM1.js +1 -0
  298. package/dist/assets/input-manager-DH_hGW6d.js +1 -0
  299. package/dist/assets/input-router-BNQvtIqw.js +1 -0
  300. package/dist/assets/inspect-BZfi3mmo.js +1 -0
  301. package/dist/assets/inspection-CObLhnrs.js +1 -0
  302. package/dist/assets/instance-fork-actions-D3sRzS3K.js +1 -0
  303. package/dist/assets/instances.command-D6UkZNO8.js +1 -0
  304. package/dist/assets/instruments-CKR02Y8I.js +1 -0
  305. package/dist/assets/json-history-resource-BbxllWfV.js +1 -0
  306. package/dist/assets/jsx-runtime-DPjLkJKQ.js +9 -0
  307. package/dist/assets/light-D-_wsKTq.js +1 -0
  308. package/dist/assets/light-camera-factory-CWbbe9gI.js +1 -0
  309. package/dist/assets/lil-gui.module.min-BF55BEwA.js +10 -0
  310. package/dist/assets/live-behaviors-Bxq49Maz.js +1 -0
  311. package/dist/assets/live-gesture-lock-DJbrjOqf.js +1 -0
  312. package/dist/assets/loader-CaF_I7Yt.js +1 -0
  313. package/dist/assets/logger-Dqis-7W1.js +1 -0
  314. package/dist/assets/loop-gate-report-N52EWFGD.js +1 -0
  315. package/dist/assets/matcap-texture-CVfalpWT.js +1 -0
  316. package/dist/assets/material-CpAdjDxn.js +1 -0
  317. package/dist/assets/material-factory-Bz6h__6g.js +1 -0
  318. package/dist/assets/mesh-B3WPtNKO.js +1 -0
  319. package/dist/assets/mesh-shadow-CZnXrw_l.js +1 -0
  320. package/dist/assets/mikktspace.module-DO88SLib.js +1 -0
  321. package/dist/assets/model-asset-sections-CFvvihfx.css +1 -0
  322. package/dist/assets/model-asset-sections.service-CHhFS3ZX.js +1 -0
  323. package/dist/assets/model.layout-BJUEQYUI.js +1 -0
  324. package/dist/assets/models.finder-G2jQgIRu.js +1 -0
  325. package/dist/assets/module-mode-DVBLT9d-.js +2 -0
  326. package/dist/assets/mount-canvas-ingest-root-DDuAWf_C.js +2 -0
  327. package/dist/assets/mount-dom-ingest-root-D_EiBgpn.js +2 -0
  328. package/dist/assets/mount-game-6t9cKNo4.js +1 -0
  329. package/dist/assets/mount-ingest-root-glv2SSWf.js +2 -0
  330. package/dist/assets/mount-manifest-CGVxhmAw.js +1 -0
  331. package/dist/assets/mount-readiness-Ds0HvvLH.js +4 -0
  332. package/dist/assets/mount-three-ingest-root-hrUt9VVU.js +1 -0
  333. package/dist/assets/mounted-authoring-Dmg5xmhP.js +1 -0
  334. package/dist/assets/mounted-story-viewport-source-DjP6RA9U.js +1 -0
  335. package/dist/assets/native-debug-module-CWicoSGD.js +1 -0
  336. package/dist/assets/native-entry-surface-BE8LJNdu.js +1 -0
  337. package/dist/assets/navigation-CIiCx-SM.js +1 -0
  338. package/dist/assets/navmesh-workflow-store-Cmnm57TB.js +1 -0
  339. package/dist/assets/navmesh.menu-CAKiH8PW.js +1 -0
  340. package/dist/assets/navmesh.service-jgDWlgj1.js +1 -0
  341. package/dist/assets/network.utility-CEu5nHf7.js +1 -0
  342. package/dist/assets/object-marks-DwvIEBOK.js +1 -0
  343. package/dist/assets/object3d-authoring-subject-CH5sI2oP.js +1 -0
  344. package/dist/assets/output-DK8waum9.js +195 -0
  345. package/dist/assets/particles-Y626p22p.js +1 -0
  346. package/dist/assets/particles-factory-DnLOHXT8.js +1 -0
  347. package/dist/assets/pasteboard-materialize-BqSS4QzV.js +20 -0
  348. package/dist/assets/pasteboard.action-DU3UHtJG.js +2 -0
  349. package/dist/assets/performance-profiler-D_Jey87L.js +1 -0
  350. package/dist/assets/physics-registry-B2Jkp8e6.js +1 -0
  351. package/dist/assets/physics-registry-CUB9cT9p.js +1 -0
  352. package/dist/assets/pixi-authoring-adapter-CjibysC3.js +1 -0
  353. package/dist/assets/pixi-live-write-target-DuWydlWb.js +1 -0
  354. package/dist/assets/pixi-primitive-DlWbUPN9.js +1 -0
  355. package/dist/assets/pixi-react-root-factory-DYsznYRQ.js +1 -0
  356. package/dist/assets/pixi-story-model-DNkfnWUV.js +1 -0
  357. package/dist/assets/pixi-transform-channels-VjdohT11.js +1 -0
  358. package/dist/assets/play-mode-BFU2PCkG.js +22 -0
  359. package/dist/assets/play.command-BpqqLqkq.js +2 -0
  360. package/dist/assets/playtest-BXIL1JEF.js +1 -0
  361. package/dist/assets/pose-guard-6Osb2cFu.js +1 -0
  362. package/dist/assets/presentation-BPP5pXeQ.js +1 -0
  363. package/dist/assets/product-DFhyARJj.js +1 -0
  364. package/dist/assets/profiler.action-CaXJDp3t.js +1 -0
  365. package/dist/assets/profiler.menu-BIMF6Bi4.js +1 -0
  366. package/dist/assets/profiler.utility-BExw9wBO.js +1 -0
  367. package/dist/assets/project-authoring-session-Bnt6icLr.js +2 -0
  368. package/dist/assets/project-provenance-BoP3nrle.js +1 -0
  369. package/dist/assets/prompt-labels-DSMdM2_B.js +1 -0
  370. package/dist/assets/properties-bone-constraints.inspector-ByT6p7S-.js +1 -0
  371. package/dist/assets/properties-bone.inspector-z4qJwKO5.js +1 -0
  372. package/dist/assets/properties-collection.inspector-D0_3ijWU.js +1 -0
  373. package/dist/assets/properties-constraints.inspector-CESzjuls.js +1 -0
  374. package/dist/assets/properties-data.inspector-hG8Wgyzb.js +1 -0
  375. package/dist/assets/properties-material.inspector-CzY0JCQ6.js +1 -0
  376. package/dist/assets/properties-modifiers.inspector-3dDhwf7g.js +1 -0
  377. package/dist/assets/properties-object.inspector-CiarfxkT.js +1 -0
  378. package/dist/assets/properties-output.inspector-DKJxmKSD.js +1 -0
  379. package/dist/assets/properties-particles.inspector-CCEdYWGm.js +1 -0
  380. package/dist/assets/properties-physics.inspector-B2c0KUyA.js +1 -0
  381. package/dist/assets/properties-render.inspector-Bcm0HLRW.js +1 -0
  382. package/dist/assets/properties-scene.inspector-PIM_eTb_.js +1 -0
  383. package/dist/assets/properties-texture.inspector-CgFlnyr8.js +1 -0
  384. package/dist/assets/properties-view-layer.inspector-DGjF_Aqo.js +1 -0
  385. package/dist/assets/properties-world.inspector-CrMvaRvB.js +1 -0
  386. package/dist/assets/r3f-design-session-D-4yyDO9.js +2 -0
  387. package/dist/assets/r3f-physics-binding-BBo8oma9.js +1 -0
  388. package/dist/assets/r3f-root-factory-z9llD1OU.js +1 -0
  389. package/dist/assets/r3f-source-authoring-adapter-w6Bc60K-.js +13 -0
  390. package/dist/assets/rapier-physics-adapter-CaZqWLu0.js +1 -0
  391. package/dist/assets/rapier-physics-bridge-CMoeVo3Y.js +1 -0
  392. package/dist/assets/react-18-By2b4xR9.js +1 -0
  393. package/dist/assets/react-inspector.service-B_neRnSK.js +1 -0
  394. package/dist/assets/react-root-CEz5NTck.js +1 -0
  395. package/dist/assets/react-story-board-BDDwiE2H.js +1 -0
  396. package/dist/assets/react-three-fiber.esm-CycrbDlA.js +1 -0
  397. package/dist/assets/react-three-rapier.esm-CEfKpvxT.js +1 -0
  398. package/dist/assets/react-world-authoring-adapter-DmrwM3py.js +1 -0
  399. package/dist/assets/realm-services-CobQsq_X.js +1 -0
  400. package/dist/assets/rebind-controller-Dtq19Vb3.js +1 -0
  401. package/dist/assets/recast-navigation.wasm-compat-Dsoa_MD-.js +1 -0
  402. package/dist/assets/reflection-probe-Don-M3Fj.js +1 -0
  403. package/dist/assets/reflection-probe-capture.inspector-CmFUoJCx.js +1 -0
  404. package/dist/assets/register-render-vitals-BiZk29b2.js +1 -0
  405. package/dist/assets/registry-02YZjMNp.js +1 -0
  406. package/dist/assets/relative-path-guard-GiM7Lsz8.js +1 -0
  407. package/dist/assets/render-audio-control-vMRlePWb.js +1 -0
  408. package/dist/assets/render-batch-system-0vq7p0VC.js +1 -0
  409. package/dist/assets/render-census-BrQX_CXv.js +1 -0
  410. package/dist/assets/render-control-Df3yTiyr.js +1 -0
  411. package/dist/assets/render-env-D2IV2x5k.js +1 -0
  412. package/dist/assets/render-features-CPQ_e568.js +1 -0
  413. package/dist/assets/render-seed-DF4JHy7P.js +1 -0
  414. package/dist/assets/render-settings-Bw4W9SYF.js +1 -0
  415. package/dist/assets/render-vitals-BZ5HtvMi.js +1 -0
  416. package/dist/assets/renderer-config-BqG4O8i9.js +1 -0
  417. package/dist/assets/resolve-three-SZE_WWUM.js +702 -0
  418. package/dist/assets/root-seam-contract-Z0VWX3Bk.js +1 -0
  419. package/dist/assets/rrweb-Cd2ifIRP.js +142 -0
  420. package/dist/assets/run-ticks-settled-C4ksViyA.js +1 -0
  421. package/dist/assets/runtime-inspection-l2iFQSsg.js +1 -0
  422. package/dist/assets/scene-capture-BQKzU0NT.js +1 -0
  423. package/dist/assets/scene-capture-CGYF-Viw.js +1 -0
  424. package/dist/assets/scene-document.service-qkDjUrlP.js +2 -0
  425. package/dist/assets/scene-framing-Cat0GtyJ.js +1 -0
  426. package/dist/assets/scene-index-B6BZOHMk.js +1 -0
  427. package/dist/assets/scene-query-C7_N-TpI.js +1 -0
  428. package/dist/assets/schema-kl9-2B_J.js +1 -0
  429. package/dist/assets/sculpt.layout-zJF55yCR.js +1 -0
  430. package/dist/assets/seeded-random-i3mtgBKZ.js +1 -0
  431. package/dist/assets/session-CZ5JPg-z.js +4877 -0
  432. package/dist/assets/setup-audio-S8GQF91f.js +1 -0
  433. package/dist/assets/setup-particles-GCXlnkj_.js +1 -0
  434. package/dist/assets/setup-physics-BeZ7-LKD.js +1 -0
  435. package/dist/assets/setup-renderer-DVXaSGin.js +1587 -0
  436. package/dist/assets/shading.layout-DULYZV6M.js +1 -0
  437. package/dist/assets/sim-clock-CLflx7kg.js +1 -0
  438. package/dist/assets/sky-precompute-worker-ChN7J87v.js +1 -0
  439. package/dist/assets/soft-particle-depth-DGvfQDi1.js +1 -0
  440. package/dist/assets/source-object3d-authoring-adapter-B-L6Ha6f.js +1 -0
  441. package/dist/assets/source-persistence-backend-C-aR-B_Y.js +1 -0
  442. package/dist/assets/spark-renderer-lifecycle-ynWESJcv.js +1 -0
  443. package/dist/assets/spark.module-4pXQoz5d.js +12120 -0
  444. package/dist/assets/stage-invalidation-DBg3C3Ta.js +1 -0
  445. package/dist/assets/stage-keyboard-n-5kKH-m.js +1 -0
  446. package/dist/assets/stage-overlay-set-B9zp2sLB.js +1 -0
  447. package/dist/assets/stage-presence-markers-DiGI6A45.js +1 -0
  448. package/dist/assets/standard-viewport-dressing-CzjAe_0A.js +7 -0
  449. package/dist/assets/state-bridge-DLP1jLRW.js +1 -0
  450. package/dist/assets/state-watch.action-BOvQR2qt.js +1 -0
  451. package/dist/assets/state-watch.menu-CNLvDeeY.js +1 -0
  452. package/dist/assets/state-watch.utility-Bg1tTTQU.js +1 -0
  453. package/dist/assets/static-batch-advisor-B13QEH7d.js +1 -0
  454. package/dist/assets/stats.module-BL02l9NC.js +1 -0
  455. package/dist/assets/story-arg-descriptors-Ek86ExX7.js +1 -0
  456. package/dist/assets/story-capture-_gC8dXV-.js +1 -0
  457. package/dist/assets/story-documents--TDLaPeL.js +3 -0
  458. package/dist/assets/story-documents.service-BiS_YbNQ.js +1 -0
  459. package/dist/assets/story-documents.service-CxOPYJ2j.js +1 -0
  460. package/dist/assets/story-media-presence-BHzk2IV5.js +1 -0
  461. package/dist/assets/story-mount-turn-DFRTj5hi.js +1 -0
  462. package/dist/assets/story-pixi-preview-BUrOJZXS.js +1 -0
  463. package/dist/assets/story-presentation-j2AVN-mK.js +1 -0
  464. package/dist/assets/story-three-preview-BHEDZzcl.js +2 -0
  465. package/dist/assets/structural-ids-Dc-7rEwi.js +1 -0
  466. package/dist/assets/structural-signature-0w-i_ats.js +1 -0
  467. package/dist/assets/surface-content-Dg9Kkazf.js +1 -0
  468. package/dist/assets/surface-state-DaxyruCj.js +3 -0
  469. package/dist/assets/system-adapters-rIC8FSGP.js +1 -0
  470. package/dist/assets/system-runner-DkOjxEBt.js +1 -0
  471. package/dist/assets/system-slot-E2mEdiih.js +1 -0
  472. package/dist/assets/team-playtest.service-DqOinFVA.js +1 -0
  473. package/dist/assets/texture.layout-DASpHVht.js +1 -0
  474. package/dist/assets/three-CDSueJyJ.js +1 -0
  475. package/dist/assets/three-authoring-adapter-CmSQ3Vui.js +1 -0
  476. package/dist/assets/three-authoring.service-iuHLwtf1.js +2 -0
  477. package/dist/assets/three-ingest-runtime-QzDYk6tU.js +1 -0
  478. package/dist/assets/three-projection-core-BmKMZ-nf.js +1 -0
  479. package/dist/assets/three-viewport-presentation-QBQpSdMh.js +1 -0
  480. package/dist/assets/three.module-D396a9Mn.js +3840 -0
  481. package/dist/assets/three.quarks.esm-B1C61jGo.js +1039 -0
  482. package/dist/assets/tools-B_NJsk05.js +1 -0
  483. package/dist/assets/transform-writer-BhBBTx33.js +1 -0
  484. package/dist/assets/transport.header-B-6HQlU2.js +1 -0
  485. package/dist/assets/trigger-volume-BNK2XzPL.js +1 -0
  486. package/dist/assets/tuples-CIQ4Bn1U.js +1 -0
  487. package/dist/assets/tween.module-DciWpAG6.js +1 -0
  488. package/dist/assets/ui-board-document-Bwtt--xp.js +2 -0
  489. package/dist/assets/unexported-game-trap-Dm1JYKHy.js +2 -0
  490. package/dist/assets/unmanaged-root-detector-B8CpbkSN.js +2 -0
  491. package/dist/assets/upstream-pin-BdgRH6ID.js +1 -0
  492. package/dist/assets/use-data-Dzq-MytE.js +1 -0
  493. package/dist/assets/use-live-actor-state-DErbWQWF.js +1 -0
  494. package/dist/assets/use-selection-DbR73-xd.js +1 -0
  495. package/dist/assets/user-data-BB2Of6Ht.js +1 -0
  496. package/dist/assets/utility-view-state-BHypxA33.js +1 -0
  497. package/dist/assets/uv-editing.layout-BEKHxmHw.js +1 -0
  498. package/dist/assets/vgai-shared-fontawesome-CU65D4Ij.js +1 -0
  499. package/dist/assets/vgai-shared-jsx-dev-runtime-DFDKL7fx.js +1 -0
  500. package/dist/assets/vgai-shared-jsx-runtime-DIqBpTut.js +1 -0
  501. package/dist/assets/vgai-shared-react-BT7rMc2H.js +1 -0
  502. package/dist/assets/vgai-shared-react-dom-DFajMqMT.js +1 -0
  503. package/dist/assets/vgai-shared-react-dom-client-S0ozfl6_.js +1 -0
  504. package/dist/assets/vgai-shared-three-Bc5PvpLM.js +1 -0
  505. package/dist/assets/viewport-pick-context-DkawXbEi.js +1 -0
  506. package/dist/assets/viewport-root-presentation-CWsE56K6.js +1 -0
  507. package/dist/assets/viewport-shading-BuA88e_A.js +1 -0
  508. package/dist/assets/viewport-shading-boundary-B_-_gABg.js +82 -0
  509. package/dist/assets/viewport-surface-status-B3om4Kcf.js +1 -0
  510. package/dist/assets/vision_bundle-DX0dWqEa.js +15 -0
  511. package/dist/assets/voxel-surface-DtcsSWRL.js +1 -0
  512. package/dist/assets/wav-encode-D31zWF6O.js +1 -0
  513. package/dist/assets/webgl-frame-capture-FlF9zQmW.js +1 -0
  514. package/dist/assets/webgl-gpu-timer-D3YX7RaD.js +1 -0
  515. package/dist/assets/webworkerAll-CM2o_dnz.js +1 -0
  516. package/dist/assets/worker-UrMcrc5_.js +2 -0
  517. package/dist/assets/world-documents-147tiFZe.js +1 -0
  518. package/dist/assets/world-root-stage-binding-vwTrtBz6.js +1 -0
  519. package/dist/assets/world-state-BWG-IcOd.js +1 -0
  520. package/dist/assets/writer-B-KovzkA.js +5 -0
  521. package/dist/assets/xstate-animation-binding-Brd0NST6.js +1 -0
  522. package/dist/assets/xstate-animation-meta-Q3u9zh_m.js +1 -0
  523. package/dist/assets/xstate-behavior.action-B8UluFBK.js +1 -0
  524. package/dist/assets/xstate-behavior.document-CKAsE45I.js +1 -0
  525. package/dist/assets/xstate-behavior.inspector-vJJyuifc.js +1 -0
  526. package/dist/assets/xstate-behavior.menu-BXbPICIh.js +1 -0
  527. package/dist/assets/xstate-inspection-BsZv8LS9.js +1 -0
  528. package/dist/vgai-shared-react.json +10 -0
  529. package/dist/vgai-shared-three.json +3 -0
  530. package/dist-node/cli.js +9320 -0
  531. package/dist-node/create.js +3239 -0
  532. package/package.json +91 -0
  533. package/presets.mjs +2 -0
  534. package/src/contributions.d.ts +4 -0
  535. package/src/index.ts +38 -0
  536. package/starter/cube.blend +0 -0
  537. package/starter/cube.py +81 -0
  538. package/template/.agents/references/project-manual.md +341 -0
  539. package/template/.agents/skills/editor/SKILL.md +53 -0
  540. package/template/.agents/skills/editor/agents/openai.yaml +4 -0
  541. package/template/.agents/skills/editor/references/editor-control.md +363 -0
  542. package/template/.agents/skills/vgai-3d-models/SKILL.md +64 -0
  543. package/template/.agents/skills/vgai-ingest-existing-game/SKILL.md +112 -0
  544. package/template/.agents/skills/vgai-threejs-authoring/SKILL.md +347 -0
  545. package/template/.agents/skills/vgai-threejs-authoring/agents/openai.yaml +4 -0
  546. package/template/.agents/skills/vgai-threejs-authoring/references/helper-catalog.md +65 -0
  547. package/template/.claude/skills/editor/SKILL.md +53 -0
  548. package/template/.claude/skills/editor/agents/openai.yaml +4 -0
  549. package/template/.claude/skills/editor/references/editor-control.md +363 -0
  550. package/template/.claude/skills/vgai-3d-models/SKILL.md +64 -0
  551. package/template/.claude/skills/vgai-ingest-existing-game/SKILL.md +112 -0
  552. package/template/.claude/skills/vgai-threejs-authoring/SKILL.md +347 -0
  553. package/template/.claude/skills/vgai-threejs-authoring/agents/openai.yaml +4 -0
  554. package/template/.claude/skills/vgai-threejs-authoring/references/helper-catalog.md +65 -0
  555. package/template/.github/copilot-instructions.md +6 -0
  556. package/template/.github/skills/editor/SKILL.md +53 -0
  557. package/template/.github/skills/editor/agents/openai.yaml +4 -0
  558. package/template/.github/skills/editor/references/editor-control.md +363 -0
  559. package/template/.github/skills/vgai-3d-models/SKILL.md +64 -0
  560. package/template/.github/skills/vgai-ingest-existing-game/SKILL.md +112 -0
  561. package/template/.github/skills/vgai-threejs-authoring/SKILL.md +347 -0
  562. package/template/.github/skills/vgai-threejs-authoring/agents/openai.yaml +4 -0
  563. package/template/.github/skills/vgai-threejs-authoring/references/helper-catalog.md +65 -0
  564. package/template/.mcp.json +12 -0
  565. package/template/.vgai/assets.json +1 -0
  566. package/template/.vgai/provenance.json +4 -0
  567. package/template/.volter/tracker/validation/.preset.base.mts +178 -0
  568. package/template/.volter/tracker/validation/preset.mts +186 -0
  569. package/template/.volter/tracker/visualizer/.extension.base.tsx +14 -0
  570. package/template/.volter/tracker/visualizer/extension.tsx +14 -0
  571. package/template/.volter/tracker-config.json +17 -0
  572. package/template/AGENTS.md +176 -0
  573. package/template/CLAUDE.md +1 -0
  574. package/template/DEVLOG.md +20 -0
  575. package/template/IDIOMS.md +118 -0
  576. package/template/LICENSE +30 -0
  577. package/template/README.md +83 -0
  578. package/template/ROADMAP.md +20 -0
  579. package/template/asset-manifest.json +3 -0
  580. package/template/check-idioms.ts +1533 -0
  581. package/template/index.html +18 -0
  582. package/template/manifest-entry-modules-plugin.ts +53 -0
  583. package/template/package.json +62 -0
  584. package/template/public/jsm/libs/basis/basis_transcoder.js +19 -0
  585. package/template/public/jsm/libs/basis/basis_transcoder.wasm +0 -0
  586. package/template/public/jsm/libs/draco/gltf/draco_decoder.js +33 -0
  587. package/template/public/jsm/libs/draco/gltf/draco_decoder.wasm +0 -0
  588. package/template/public/jsm/libs/draco/gltf/draco_encoder.js +33 -0
  589. package/template/public/jsm/libs/draco/gltf/draco_wasm_wrapper.js +116 -0
  590. package/template/public/shaders/daylight-sky.frag.glsl +15 -0
  591. package/template/public/shaders/daylight-sky.vert.glsl +7 -0
  592. package/template/scripts/patch-drei-stats-gl.mjs +35 -0
  593. package/template/server/colyseus-setup.ts +111 -0
  594. package/template/server/loopback.ts +76 -0
  595. package/template/server/main.ts +78 -0
  596. package/template/server/rooms/arena-room.ts +488 -0
  597. package/template/server/rooms/game-room.ts +274 -0
  598. package/template/server/rooms.ts +15 -0
  599. package/template/server/tsconfig.json +19 -0
  600. package/template/src/bot/QaTester.tsx +35 -0
  601. package/template/src/bot/behaviors.ts +203 -0
  602. package/template/src/bot/bot-station.ts +192 -0
  603. package/template/src/bot/tester-run.ts +238 -0
  604. package/template/src/bot/tester-station.ts +193 -0
  605. package/template/src/components/environment/DaylightSky.tsx +54 -0
  606. package/template/src/components/environment/Ground.tsx +129 -0
  607. package/template/src/components/environment/SceneAtmosphere.tsx +14 -0
  608. package/template/src/components/environment/SoftGroundShadow.tsx +62 -0
  609. package/template/src/components/environment/SunShadowFit.tsx +141 -0
  610. package/template/src/contributions/README.md +98 -0
  611. package/template/src/contributions/analytics.analytics.tsx +26 -0
  612. package/template/src/contributions/data.document.tsx +35 -0
  613. package/template/src/contributions/pages.finder.ts +61 -0
  614. package/template/src/contributions/tester.inspector.tsx +64 -0
  615. package/template/src/contributions/use-game-modules.ts +80 -0
  616. package/template/src/data/README.md +17 -0
  617. package/template/src/input.ts +97 -0
  618. package/template/src/lib/audio/capability.json +4 -0
  619. package/template/src/lib/audio/sfx.ts +255 -0
  620. package/template/src/lib/react-root/capability.json +4 -0
  621. package/template/src/lib/react-root/index.ts +20 -0
  622. package/template/src/lib/react-root/react-root-adapter.tsx +57 -0
  623. package/template/src/lib/reflections/ReflectionProbe.tsx +201 -0
  624. package/template/src/lib/reflections/capability.json +4 -0
  625. package/template/src/lib/reflections/index.ts +19 -0
  626. package/template/src/lib/reflections/probe-controller.ts +75 -0
  627. package/template/src/lib/reflections/reflection-probe-registry.ts +402 -0
  628. package/template/src/lib/reflections/volume-reflection-material.ts +416 -0
  629. package/template/src/lib/static-batch/Frozen.tsx +91 -0
  630. package/template/src/lib/static-batch/capability.json +4 -0
  631. package/template/src/lib/static-batch/freeze.ts +579 -0
  632. package/template/src/lib/static-batch/index.ts +44 -0
  633. package/template/src/lib/static-batch/mutation-watch.ts +149 -0
  634. package/template/src/lib/static-batch/shadow-cache.ts +171 -0
  635. package/template/src/main.ts +63 -0
  636. package/template/src/manifest-entry-modules.d.ts +3 -0
  637. package/template/src/prefabs/HeroBox.stories.tsx +23 -0
  638. package/template/src/prefabs/HeroBox.tsx +35 -0
  639. package/template/src/scenes/MainScene.tsx +77 -0
  640. package/template/src/world.tsx +87 -0
  641. package/template/tsconfig.json +35 -0
  642. package/template/tsconfig.node.json +32 -0
  643. package/template/tsconfig.tools.json +22 -0
  644. package/template/validate-asset-content.ts +27 -0
  645. package/template/validate-assets.ts +60 -0
  646. package/template/validate-manifest.ts +55 -0
  647. package/template/vgai.adapter.ts +76 -0
  648. package/template/vgai.project.json +24 -0
  649. package/template/vite.config.ts +247 -0
  650. package/template-dotfiles/gitignore +63 -0
  651. package/workbench/src/media/game-cover.css +83 -0
  652. package/workbench/src/product.contribution.ts +188 -0
  653. package/workbench/src/vgaiGameSkew.ts +276 -0
@@ -0,0 +1 @@
1
+ import{a as d}from"./jsx-runtime-DPjLkJKQ.js";import{r as c}from"./index-nmcBqr7Y.js";import"./index-CtzuWnCS.js";import{gE as $e,f6 as Fe,bD as yt,gF as _t,gG as Nt,gH as Kt,f8 as Vt,a5 as Wt,gI as Ye,fQ as Ae,gJ as He,gK as _e,gL as Ne,gM as D,ep as Ke,aY as Ve,aG as We,gN as Ue,gO as Ze,f3 as Qe,gP as Pt,gQ as qe,gR as E,gS as Lt,gT as nt,gU as Je,gV as tn,gW as en,gX as nn,gY as on,gZ as Ut,g_ as rn,g$ as sn,h0 as an,h1 as ln,h2 as cn,h3 as dn,h4 as un,ek as le,h5 as pn,h6 as fn,ao as ot,h7 as xn,h8 as gn,bz as hn,h9 as bn,ha as yn,eh as ce,hb as vn,hc as mn,hd as wn,he as En,hf as Sn,hg as Rn,hh as Cn,ab as kn,bx as Pn,f4 as zn}from"./index-GIL7oGEO.js";import{s as Ln,i as Dn,r as Zt}from"./eyedropper-session-bjPXnfeX.js";import{z as In,k as jn}from"./react-story-board-BDDwiE2H.js";import{g as Dt}from"./viewport-pick-context-DkawXbEi.js";import{m as Tn}from"./inspect-BZfi3mmo.js";const Qt=new WeakMap;let qt=0;function Q(e){let o=Qt.get(e);return o||(o={guides:[],listeners:new Set,revision:0},Qt.set(e,o)),o}function It(e){e.revision+=1;for(const o of e.listeners)o()}function On(e){return Q(e).guides}function Bn(e){return Q(e).revision}function Gn(e,o){const i=Q(e);return i.listeners.add(o),()=>i.listeners.delete(o)}function Ao(e,o,i){qt+=1;const r=Q(e),u=`canvas-guide-${qt}`;return r.guides=[...r.guides,{id:u,axis:o,value:i}],It(r),u}function Ho(e,o,i){const r=Q(e),u=r.guides.map(s=>s.id===o?{...s,value:i}:s);u.every((s,p)=>s===r.guides[p])||(r.guides=u,It(r))}function _o(e,o){const i=Q(e),r=i.guides.filter(u=>u.id!==o);r.length!==i.guides.length&&(i.guides=r,It(i))}function Jt(e,o){for(const i of o){const r=D(e,i.id);if(!r)continue;const u={};i.x!==void 0&&(u.x=i.x),i.y!==void 0&&(u.y=i.y),Object.keys(u).length!==0&&(r.begin(i.id),r.apply(i.id,u),r.end(i.id))}}const Mn=[{op:"left",testId:"align-left",label:"Align left",icon:_t},{op:"hcenter",testId:"align-hcenter",label:"Align horizontal center",icon:Nt},{op:"right",testId:"align-right",label:"Align right",icon:Kt},{op:"top",testId:"align-top",label:"Align top",icon:_t,rotate:!0},{op:"vcenter",testId:"align-vcenter",label:"Align vertical center",icon:Nt,rotate:!0},{op:"bottom",testId:"align-bottom",label:"Align bottom",icon:Kt,rotate:!0}],Xn=[{axis:"horizontal",testId:"distribute-horizontal",label:"Distribute horizontally",icon:He},{axis:"vertical",testId:"distribute-vertical",label:"Distribute vertically",icon:_e}];function $n(e){const r=e.y-30-8;return{left:e.x,top:r<0?e.y+e.height+8:r}}function Fn({adapter:e,entries:o}){if(o.length<2)return null;const i=$e(o.map(p=>p.rect));if(!i)return null;const{left:r,top:u}=$n(i),s=o.length>=3;return d.jsxs(Fe,{label:"Align and distribute","data-testid":"align-toolbar",style:{position:"absolute",left:r,top:u,zIndex:yt.overlayLow,gap:2,padding:3},children:[Mn.map(({op:p,testId:b,label:y,icon:g,rotate:v})=>d.jsx(Vt,{"data-testid":b,title:y,"aria-label":y,variant:"ghost",size:"compact",onClick:()=>Jt(e,Ye(o,p)),children:d.jsx(Wt,{icon:g,"aria-hidden":"true",style:v?{transform:"rotate(90deg)"}:void 0})},p)),s&&d.jsxs(d.Fragment,{children:[d.jsx(Ae,{}),Xn.map(({axis:p,testId:b,label:y,icon:g})=>d.jsx(Vt,{"data-testid":b,title:y,"aria-label":y,variant:"ghost",size:"compact",onClick:()=>Jt(e,Ne(o,p)),children:d.jsx(Wt,{icon:g,"aria-hidden":"true"})},p))]})]})}function Yn({rect:e,initialText:o,onCommit:i,onCancel:r}){const[u,s]=c.useState(o),p=c.useRef(null),b=c.useRef(!1);c.useEffect(()=>{const v=p.current;v&&(v.focus(),v.select())},[]);const y=()=>{b.current||(b.current=!0,i(u))},g=()=>{b.current||(b.current=!0,r())};return d.jsx(Ke,{ref:p,"data-testid":"world-text-editor",value:u,onChange:v=>s(v.target.value),onBlur:y,onKeyDown:v=>{v.key==="Escape"?(v.stopPropagation(),g()):v.key==="Enter"&&!v.shiftKey&&(v.preventDefault(),y())},"data-variant":"inline-editor",style:{position:"absolute",left:e.x,top:e.y,width:Math.max(e.width,40),height:Math.max(e.height,20),boxSizing:"border-box",zIndex:yt.overlayLow,pointerEvents:"auto",resize:"none"}})}const C=ot.accent.default,An=yt.overlayLow,bt=5;function Hn(e,o,i){return e?!1:Dt()?.editorControls?.activate(o,i)??!1}function _n(e,o,i,r,u,s){const p=e?null:Dt()?.editorControls?.hover(o,i)??null;u(p),s(p?null:r(o,i))}function Nn(e,o){const i=e.hierarchy.node(o);return i?`${i.label}·${i.kind}`:o}function Kn(e){return e instanceof ce?e.childAdapters().some(o=>!!o.adapter.rects):!!e.rects}function Vn(e){const o=e instanceof ce?e.childAdapters():[{worldId:"",adapter:e}],i=[];for(const{worldId:r,adapter:u}of o)if(u.rects&&!(r&&Pn(r)))for(const s of zn(u)){if(u.inspector?.get(s,"locked")===!0)continue;const p=u.rects.rect(s);p&&i.push({id:s,rect:p})}return i}function Wn(e,o){return e.x<o.x+o.width&&e.x+e.width>o.x&&e.y<o.y+o.height&&e.y+e.height>o.y}function Un(e,o,i){if(!i)return[o];const r=new Set(e);return r.has(o)?r.delete(o):r.add(o),[...r]}function Zn(e,o,i,r){return o&&!!i&&(i.width>bt||i.height>bt)&&i?Vn(e).filter(p=>Wn(i,p.rect)).map(p=>p.id):r?null:[]}function Qn(e,o,i,r){return e?"grabbing":o?"grab":i||r?"crosshair":"default"}function F(e){try{e.currentTarget.setPointerCapture?.(e.pointerId)}catch{}}function zt(e){e.currentTarget.hasPointerCapture?.(e.pointerId)&&e.currentTarget.releasePointerCapture?.(e.pointerId)}function qn(e,o){if(o!==null)return!1;const i=e.currentTarget.parentElement?.parentElement??null;return jn(i,e.clientX,e.clientY)}function te(e,o){return{position:"absolute",left:e.x,top:e.y,width:e.width,height:e.height,border:`${o?2:1}px solid ${C}`,background:o?`color-mix(in srgb, ${C} 6%, transparent)`:"transparent",boxSizing:"border-box",pointerEvents:"none"}}function Jn(e){return{position:"absolute",left:e.x,top:Math.max(0,e.y-18),padding:"2px 6px",fontSize:11,fontFamily:"'SF Mono', 'Fira Code', Menlo, Consolas, monospace",fontWeight:600,color:"#fff",background:C,borderRadius:3,pointerEvents:"none",whiteSpace:"nowrap"}}const gt=10,ee=48;function ne(e,o){return{position:"absolute",left:e.x-gt/2,top:e.y-gt/2,width:gt,height:gt,background:"#fff",border:`1px solid ${C}`,boxSizing:"border-box",cursor:o,pointerEvents:"auto"}}const Z=12,to=24;function eo(e){return{position:"absolute",left:e.x+e.width/2-Z/2,top:e.y-to-Z/2,width:Z,height:Z,borderRadius:"50%",background:"#fff",border:`1px solid ${C}`,boxSizing:"border-box",cursor:"grab",padding:0,pointerEvents:"auto"}}const oe=12;function no(e){return{position:"absolute",left:e.position[0],top:e.position[1],width:oe,height:oe,borderRadius:"50%",background:e.writable?e.color:"transparent",border:`2px solid ${e.color}`,boxSizing:"border-box",cursor:e.writable?"grab":"not-allowed",padding:0,pointerEvents:e.writable?"auto":"none",touchAction:"none"}}function oo(e){return{position:"absolute",left:e.x-8,top:e.y-8,width:16,height:16,display:"grid",placeItems:"center",borderRadius:e.kind==="anchor"?"50%":2,background:"#fff",border:`1px solid ${C}`,boxSizing:"border-box",color:C,cursor:"crosshair",fontSize:9,fontFamily:"'SF Mono', 'Fira Code', Menlo, Consolas, monospace",fontWeight:700,lineHeight:1,padding:0,pointerEvents:"auto",touchAction:"none"}}function io(e){return{position:"absolute",left:e.x,top:e.y+e.height+4,padding:"2px 6px",fontSize:11,fontFamily:"'SF Mono', 'Fira Code', Menlo, Consolas, monospace",fontWeight:600,color:"#fff",background:C,borderRadius:3,pointerEvents:"none",whiteSpace:"nowrap"}}const ro="rgba(46, 204, 113, 0.25)",so="rgba(230, 126, 34, 0.25)";function ao(e){return{position:"absolute",left:e.x,top:e.y,width:e.width,height:e.height,background:e.kind==="padding"?ro:so,boxSizing:"border-box",cursor:e.cursor,pointerEvents:"auto"}}function lo(e){return{position:"absolute",left:e.labelX,top:e.labelY,transform:"translate(-50%, -50%)",fontSize:10,fontFamily:"monospace",color:e.kind==="padding"?"#1b7a3d":"#a35a12",background:"rgba(255,255,255,0.85)",padding:"0 2px",borderRadius:2,pointerEvents:"none",whiteSpace:"nowrap"}}function co(e){return{position:"absolute",left:e.x,top:e.y,width:e.width,height:e.height,border:`2px dashed ${C}`,background:`color-mix(in srgb, ${C} 15%, transparent)`,boxSizing:"border-box",pointerEvents:"none",opacity:.7}}function uo(e){return{position:"absolute",left:e.x,top:e.y,width:e.width,height:e.height,background:"#ff5fa2",borderRadius:2,pointerEvents:"none"}}const jt="#ff2d92",ht=6;function po(e){const o=e.orientation==="horizontal";return{position:"absolute",left:Math.min(e.x1,e.x2),top:Math.min(e.y1,e.y2),width:o?Math.abs(e.x2-e.x1):1,height:o?1:Math.abs(e.y2-e.y1),background:jt,pointerEvents:"none"}}function ie(e,o,i){return{position:"absolute",left:i?e:e-ht/2,top:i?o-ht/2:o,width:i?1:ht,height:i?ht:1,background:jt,pointerEvents:"none"}}function fo(e){return{position:"absolute",left:e.labelX,top:e.labelY,transform:"translate(-50%, -50%)",padding:"1px 4px",fontSize:10,fontFamily:"monospace",fontWeight:600,color:"#fff",background:jt,borderRadius:2,pointerEvents:"none",whiteSpace:"nowrap"}}const re="#f24822";function xo(e){const o=e.orientation==="vertical";return{position:"absolute",left:o?e.at:e.start,top:o?e.start:e.at,width:o?1:e.end-e.start,height:o?e.end-e.start:1,borderLeft:o?`1px dashed ${re}`:void 0,borderTop:o?void 0:`1px dashed ${re}`,pointerEvents:"none"}}function go(e){return{position:"absolute",left:e.x,top:Math.max(0,e.y-36),display:"flex",gap:4,pointerEvents:"none"}}const se={padding:"2px 6px",fontSize:10,fontFamily:"'SF Mono', 'Fira Code', Menlo, Consolas, monospace",fontWeight:600,color:ot.content.onAccent,background:`color-mix(in srgb, ${C} 85%, transparent)`,borderRadius:3,whiteSpace:"nowrap"};function ho(e){return{position:"absolute",left:e.x,top:e.y,width:e.width,height:e.height,border:`1px dashed color-mix(in srgb, ${C} 45%, transparent)`,boxSizing:"border-box",pointerEvents:"none"}}function ae(e,o,i){return o&&i>0?Math.round(e/i)*i:e}function bo(e,o,i,r,u,s){const p=e.nativeHandleSpan??1,b=e.nativeScaleAxis??"both";let y,g;if(b==="x")y=1+o/p,g=1;else if(b==="y")y=1,g=1+i/p;else{const v=1+(o+i)/(Math.SQRT2*p);y=v,g=v}return{...b!=="y"?{scaleXFactor:y}:{},...b!=="x"?{scaleYFactor:g}:{},...r&&!u?{scaleStep:s}:{}}}function yo(e,o,i,r,u,s){const p=e.nativeOrigin;if(!p)return{};const b=r&&!u;return{...e.moveAxis!=="y"?{originX:ae(p.x+o,b,s)}:{},...e.moveAxis!=="x"?{originY:ae(p.y+i,b,s)}:{}}}function vo(e,o,i){return e==="x"?{x:o.x+i,y:o.y}:e==="y"?{x:o.x,y:o.y+i}:{x:o.x+i/Math.SQRT2,y:o.y+i/Math.SQRT2}}function mo(e,o,i){return e==="x"?{dx:o,dy:0}:e==="y"?{dx:0,dy:i}:{dx:o,dy:i}}function wo(e,o){e.ownerBoxEdit.begin(e.id);for(const i of e.peers)i.ownerBoxEdit.begin(i.id);return{kind:"move",id:e.id,ownerBoxEdit:e.ownerBoxEdit,startLocal:o,origRect:e.origRect,context:e.context,...e.nativeOrigin?{nativeOrigin:e.nativeOrigin}:{},movePeers:e.peers}}function Eo(e,o,i){let r=o;for(let u=0;r!==null&&u<256;u++){if(i.has(r))return r;r=e.hierarchy.node(r)?.parentId??null}return null}function So(e,o,i){const r=D(e,o);if(!r)return null;const u=e.inspector?.get(o,"style.position"),s=Lt(e,o)==="2d";if(u!=="absolute"&&u!=="fixed"&&!s)return null;const p=E(e,o);if(!p)return null;const b=s?r.gizmoOrigin?.(o)??void 0:void 0,y=[];for(const g of i){if(g===o)continue;const v=D(e,g),it=E(e,g);if(!v||!it)continue;const _=e.inspector?.get(g,"style.position"),B=Lt(e,g)==="2d";if(_!=="absolute"&&_!=="fixed"&&!B)continue;const rt=B?v.gizmoOrigin?.(g)??void 0:void 0;y.push({id:g,ownerBoxEdit:v,origRect:it,...rt?{nativeOrigin:rt}:{}})}return{id:o,ownerBoxEdit:r,origRect:p,context:nt(e,o),...b?{nativeOrigin:b}:{},peers:y}}function Ro(e,o){if(!bn(e,o)?.reorder)return null;const r=yn(e,o);if(!r||r.length<3)return null;const u=E(e,o);if(!u)return null;const s=[];for(const p of r){if(p===o)continue;const b=E(e,p);b&&s.push({id:p,rect:b})}return s.length===0?null:{id:o,adapter:e,origRect:u,siblingRects:s}}function Co(){return vn()}function ko(e,o){if(o.size!==1)return null;const i=[...o][0],r=D(e,i);if(!r)return null;const u=E(e,i);if(!u)return null;const s=mn(u,wn(e,i));return{id:i,rect:u,ownerBoxEdit:r,spacingBands:s}}function Po(e,o){if(o.size<2)return null;const i=[];for(const r of o){const u=E(e,r);if(!u||!D(e,r))return null;i.push({id:r,rect:u})}return i}function zo(e,o,i){const r=o.size===1?[...o][0]:null,u=r?E(e,r):null,s=u&&i?En(u,i):[],p=r?Sn(e,r):null,b=!!(p&&(p.position||p.parentLayout)),y=r?nt(e,r)?.parent??null:null;return{selectedSingleRect:u,measureLines:s,positionBadge:p,showPositionBadge:b,parentRect:y}}function Lo({state:e,adapter:o,onClose:i}){const r=c.useRef(null);return c.useEffect(()=>{const u=p=>{r.current?.contains(p.target)||i()},s=p=>{p.key==="Escape"&&i()};return document.addEventListener("pointerdown",u),document.addEventListener("keydown",s),()=>{document.removeEventListener("pointerdown",u),document.removeEventListener("keydown",s)}},[i]),d.jsx(Rn,{children:d.jsx(Cn,{ref:r,"aria-label":"Pick object under pointer","data-testid":"viewport-pick-menu",style:{position:"fixed",left:e.x,top:e.y,minWidth:190,maxWidth:320,zIndex:yt.dropdown},children:e.ids.map(u=>{const s=o.hierarchy.node(u);return d.jsxs(kn,{"data-testid":"viewport-pick-menu-item",onSelect:()=>{le(o,[u]),i()},style:{justifyContent:"space-between",gap:20},children:[d.jsx("span",{children:s?.label??u}),d.jsx("span",{style:{color:ot.content.muted,fontSize:11},children:s?.kind??""})]},u)})})})}function No({adapter:e,view:o,transformModeAware:i=!1}={}){const r=Ve(),u=c.useSyncExternalStore(r.subscribe,r.getSnapshot),s=e??We(r),p=c.useCallback((t,n)=>e?e.pickable?.pick(t,n)??null:Ue(r,t,n),[e,r]),b=c.useRef(null),y=c.useRef(null),g=c.useRef(null),[v,it]=c.useState(null),[_,B]=c.useState(null),[rt,Tt]=c.useState(null),[Ot,vt]=c.useState(null),st=c.useRef(null),Bt=c.useCallback((t,n)=>{const l=Ze(r,t,n,{...e?{adapter:e}:{}});if(l.length===0){vt(null);return}vt({x:t,y:n,ids:l})},[e,r]);c.useEffect(()=>{const t=l=>{const a=st.current;!a||a.pointerId!==l.pointerId||a.moved||Math.hypot(l.clientX-a.startClientX,l.clientY-a.startClientY)>bt&&(a.moved=!0)},n=l=>{const a=st.current;!a||a.pointerId!==l.pointerId||(st.current=null,l.type==="pointerup"&&!a.moved&&Bt(l.clientX,l.clientY))};return window.addEventListener("pointermove",t),window.addEventListener("pointerup",n),window.addEventListener("pointercancel",n),()=>{window.removeEventListener("pointermove",t),window.removeEventListener("pointerup",n),window.removeEventListener("pointercancel",n)}},[Bt]);const de=c.useCallback(t=>{t.preventDefault(),t.stopPropagation()},[]),P=o??Qe,h=c.useSyncExternalStore(P.subscribe,P.get,P.get);c.useSyncExternalStore(c.useCallback(t=>Gn(P,t),[P]),c.useCallback(()=>Bn(P),[P]));const mt=i?On(P):[],N=i?1/h.zoom:1,wt=c.useRef(!1),[ue,Gt]=c.useState(!1),G=c.useRef(null),[pe,at]=c.useState(!1),R=c.useRef(null);c.useEffect(()=>()=>{const t=R.current;if(R.current=null,!!t){t.ownerBoxEdit.end(t.id);for(const n of t.movePeers??[])n.ownerBoxEdit.end(n.id)}},[]);const[,fe]=c.useState(0),[xe,q]=c.useState(null),[ge,K]=c.useState([]),Et=c.useRef(null),[he,be]=c.useState(null),V=c.useCallback(t=>{Et.current=t,be(t)},[]),Mt=c.useRef(null),[ye,ve]=c.useState(null),[lt,J]=c.useState(null),Y=c.useCallback(t=>{Mt.current=t,ve(t)},[]),St=c.useRef(null),Xt=c.useRef(null);c.useEffect(()=>{const t=St.current;if(!t)return;St.current=null;const n=Pt(s,t.id);n&&n.get(t.id)===null&&J({id:t.id,rect:t.rect})},[u]);const $t=c.useRef("");c.useEffect(()=>{const t=[...r.selectedEntityIds].sort().join(",");t!==$t.current&&($t.current=t,lt&&J(null))}),c.useEffect(()=>{if(!lt)return;const t=window.setTimeout(()=>J(null),4e3);return()=>window.clearTimeout(t)},[lt]);const M=c.useSyncExternalStore(Ln,Dn),[me,Ft]=c.useState(null),I=c.useCallback(t=>{g.current=t,it(t)},[]),m=c.useCallback((t,n)=>{const l=b.current?.getBoundingClientRect();return{x:(t-(l?.left??0)-h.x)/h.zoom,y:(n-(l?.top??0)-h.y)/h.zoom}},[h.x,h.y,h.zoom]),we=c.useCallback(t=>{!o||!i||!s.assetDrop||!t.dataTransfer.types.includes("application/x-editor-asset")||(t.preventDefault(),t.dataTransfer.dropEffect="copy")},[s.assetDrop,o,i]),Ee=c.useCallback(t=>{if(!o||!i||!s.assetDrop)return;const n=t.dataTransfer.getData("application/x-editor-asset");if(!n)return;let l;try{l=JSON.parse(n)}catch{return}const a=m(t.clientX,t.clientY),f={position:[a.x,a.y,0],item:l.component??{kind:"file",name:l.name??l.path.split("/").pop()??l.path}};s.assetDrop.accepts("",l.path,f)&&(t.preventDefault(),t.stopPropagation(),qe(s,"",l.path,f))},[s.assetDrop,o,m,i]),X=c.useCallback(()=>fe(t=>t+1),[]),ct=c.useCallback(()=>{const t=R.current;if(!t)return!1;R.current=null,t.ownerBoxEdit.end(t.id);for(const n of t.movePeers??[])n.ownerBoxEdit.end(n.id);return q(null),K([]),X(),!0},[X]),Se=c.useCallback((t,n)=>{if(n.stopPropagation(),n.button!==0)return;const l=r.selectedEntityIds;if(l.size!==1)return;const a=[...l][0],f=D(s,a),x=E(s,a);if(!f||!x)return;const w=s.inspector?.get(a,"style.position"),O=Lt(s,a)==="2d";F(n),f.begin(a),R.current={kind:"resize",id:a,ownerBoxEdit:f,startLocal:m(n.clientX,n.clientY),origRect:x,pos:t,isPositioned:w==="absolute"||w==="fixed"||O,context:nt(s,a)}},[s,r,m]),Re=c.useCallback(t=>{if(t.stopPropagation(),t.button!==0)return;const n=r.selectedEntityIds;if(n.size!==1)return;const l=[...n][0],a=D(s,l),f=E(s,l);if(!a||!f)return;const x=i?a.gizmoOrigin?.(l):null;F(t),a.begin(l),R.current={kind:"rotate",id:l,ownerBoxEdit:a,startLocal:m(t.clientX,t.clientY),origRect:f,center:x??{x:f.x+f.width/2,y:f.y+f.height/2},...x?{nativeOrigin:x}:{}}},[s,r,m,i]),Rt=c.useCallback((t,n)=>{if(n.stopPropagation(),n.button!==0)return;const l=r.selectedEntityIds;if(l.size!==1)return;const a=[...l][0],f=D(s,a),x=E(s,a);if(!f||!x)return;const w=f.gizmoOrigin?.(a)??{x:x.x+x.width/2,y:x.y+x.height/2};F(n),f.begin(a),R.current={kind:"move",id:a,ownerBoxEdit:f,startLocal:m(n.clientX,n.clientY),origRect:x,context:nt(s,a),moveAxis:t,nativeOrigin:w}},[s,r,m]),Ce=c.useCallback((t,n)=>{if(n.stopPropagation(),n.button!==0)return;const l=r.selectedEntityIds;if(l.size!==1)return;const a=[...l][0],f=D(s,a),x=E(s,a);if(!f||!x)return;const w=f.gizmoOrigin?.(a)??{x:x.x+x.width/2,y:x.y+x.height/2};F(n),f.begin(a),R.current={kind:"native-scale",id:a,ownerBoxEdit:f,startLocal:m(n.clientX,n.clientY),origRect:x,nativeOrigin:w,nativeScaleAxis:t,nativeHandleSpan:ee/h.zoom}},[s,h.zoom,r,m]),ke=c.useCallback((t,n)=>{if(n.stopPropagation(),n.button!==0)return;const l=r.selectedEntityIds;if(l.size!==1)return;const a=[...l][0],f=D(s,a),x=E(s,a);!f||!x||f.referencePoint?.(a)?.id!==t.id||(F(n),f.begin(a),R.current={kind:"reference",id:a,ownerBoxEdit:f,startLocal:m(n.clientX,n.clientY),origRect:x,context:nt(s,a),pointerId:n.pointerId,referencePoint:t})},[s,r,m]),dt=c.useRef(null),Pe=c.useCallback((t,n,l,a)=>{a.stopPropagation(),!(a.button!==0||!l.writable)&&(F(a),dt.current={id:t,handleId:l.id,provider:n})},[]),ze=c.useCallback(t=>{const n=dt.current;if(!n)return;const l=m(t.clientX,t.clientY);n.provider.preview(n.id,n.handleId,[l.x,l.y,0]),X()},[X,m]),Ct=c.useCallback(t=>{const n=dt.current;if(dt.current=null,!n)return;zt(t);const l=m(t.clientX,t.clientY);n.provider.commit(n.id,n.handleId,[l.x,l.y,0]),X()},[X,m]),Le=c.useCallback((t,n)=>{if(n.stopPropagation(),n.button!==0)return;const l=r.selectedEntityIds;if(l.size!==1)return;const a=[...l][0],f=D(s,a),x=E(s,a);!f||!x||(F(n),f.begin(a),R.current={kind:"spacing",id:a,ownerBoxEdit:f,startLocal:m(n.clientX,n.clientY),origRect:x,side:t.side,origValue:t.value})},[s,r,m]),ut=c.useCallback((t,n)=>{if(t.pointerId!==void 0&&n.pointerId!==t.pointerId)return;const l=m(n.clientX,n.clientY),a=l.x-t.startLocal.x,f=l.y-t.startLocal.y;let x;if(t.kind==="resize")x=Je(t.pos,a,f,t.origRect,!!t.isPositioned,n.altKey,t.context),K(tn(t.pos,a,f,t.origRect,n.altKey,t.context));else if(t.kind==="native-scale")x=bo(t,a,f,r.snapEnabled,n.altKey,r.snapValues.scale),K([]);else if(t.kind==="move"){const{dx:w,dy:O}=mo(t.moveAxis,a,f);if(t.nativeOrigin){x=yo(t,w,O,r.snapEnabled,n.altKey,r.snapValues.translate);const L=en({x:x.originX??t.nativeOrigin.x,y:x.originY??t.nativeOrigin.y},t.nativeOrigin,t.origRect,t.context,t.moveAxis,!r.snapEnabled||n.altKey,nn/Math.max(h.zoom,.01),{x:mt.filter(H=>H.axis==="x").map(H=>H.value),y:mt.filter(H=>H.axis==="y").map(H=>H.value)});x.originX!==void 0&&(x.originX=L.position.x),x.originY!==void 0&&(x.originY=L.position.y),K(L.guides)}else x=on(w,O,t.origRect,n.altKey,t.context);q(Ut(t.origRect,w,O)),t.nativeOrigin||K(rn(w,O,t.origRect,n.altKey,t.context))}else if(t.kind==="reference"){const w=sn(l,t.origRect,n.altKey,t.context,{bounded:t.referencePoint?.bounded,snapPoints:t.referencePoint?.snapPoints});x={referenceX:w.position.x,referenceY:w.position.y},K(w.guides)}else t.kind==="rotate"?x=an(t.center,t.startLocal,l,t.nativeOrigin&&!r.snapEnabled||n.altKey,t.nativeOrigin?r.snapValues.rotate:15):x=ln(t.side,a,f,t.origValue??0);if(t.ownerBoxEdit.apply(t.id,x),t.kind==="move"&&t.movePeers){const w=t.nativeOrigin?(x.originX??t.nativeOrigin.x)-t.nativeOrigin.x:(x.x??t.origRect.x)-t.origRect.x,O=t.nativeOrigin?(x.originY??t.nativeOrigin.y)-t.nativeOrigin.y:(x.y??t.origRect.y)-t.origRect.y;for(const L of t.movePeers)L.ownerBoxEdit.apply(L.id,L.nativeOrigin?{originX:L.nativeOrigin.x+w,originY:L.nativeOrigin.y+O}:{x:L.origRect.x+w,y:L.origRect.y+O})}X()},[m,X,r,mt,h.zoom]),pt=c.useCallback((t,n)=>{const l=p(t,n);if(!l)return null;const a=cn(s,l)?.backgroundChainAt(t,n)??null;return a?Tn(a):null},[s,p]);c.useEffect(()=>{if(!M)return;const t=n=>{n.key==="Escape"&&Zt(null)};return window.addEventListener("keydown",t),()=>window.removeEventListener("keydown",t)},[M]),c.useEffect(()=>{const t=a=>a instanceof HTMLInputElement||a instanceof HTMLTextAreaElement||a instanceof HTMLSelectElement||a instanceof HTMLElement&&a.isContentEditable,n=a=>{a.code!=="Space"||a.repeat||t(a.target)||a.target instanceof HTMLButtonElement||(a.preventDefault(),wt.current=!0,Gt(!0))},l=a=>{a.code==="Space"&&(wt.current=!1,Gt(!1),G.current&&(G.current=null,at(!1)))};return window.addEventListener("keydown",n),window.addEventListener("keyup",l),()=>{window.removeEventListener("keydown",n),window.removeEventListener("keyup",l)}},[]);const Yt=c.useCallback(t=>{if(t.stopPropagation(),F(t),wt.current){G.current={startClientX:t.clientX,startClientY:t.clientY,startPan:P.get()},at(!0);return}if(M){Zt(pt(t.clientX,t.clientY)),Ft(null);return}if(Hn(e,t.clientX,t.clientY)){y.current=null,B(null),I(null);return}const n=p(t.clientX,t.clientY);if(qn(t,n)){y.current=null,B(null),I(null);return}const l=n!==null?Eo(s,n,r.selectedEntityIds):null,a=(!i||r.transformMode==="translate")&&l!==null?So(s,l,r.selectedEntityIds):null,f=!a&&l!==null?Ro(s,l):null;y.current={downClientX:t.clientX,downClientY:t.clientY,downLocal:m(t.clientX,t.clientY),hitAtDown:n,moved:!1,moveCandidate:a,reorderCandidate:f},B(null),I(null)},[s,r,P,i,m,I,M,pt,p,e]),De=c.useCallback(t=>{if(t.button===2){st.current={pointerId:t.pointerId,startClientX:t.clientX,startClientY:t.clientY,moved:!1};return}t.button===0&&Yt(t)},[Yt]),At=c.useCallback((t,n)=>{const l=n.clientX-t.downClientX,a=n.clientY-t.downClientY;if(!t.moved&&Math.hypot(l,a)>bt&&(t.moved=!0),!!t.moved){if(t.moveCandidate){const f=wo(t.moveCandidate,t.downLocal);R.current=f,ut(f,n);return}if(t.reorderCandidate){const f=m(n.clientX,n.clientY),x=dn(t.reorderCandidate.siblingRects,f);x&&(V({id:t.reorderCandidate.id,adapter:t.reorderCandidate.adapter,gap:x}),q(Ut(t.reorderCandidate.origRect,f.x-t.downLocal.x,f.y-t.downLocal.y)));return}if(t.hitAtDown===null){const f=m(n.clientX,n.clientY);I({x:Math.min(t.downLocal.x,f.x),y:Math.min(t.downLocal.y,f.y),width:Math.abs(f.x-t.downLocal.x),height:Math.abs(f.y-t.downLocal.y)})}}},[m,I,ut,V]),j=c.useCallback(t=>{const n=G.current;if(n){P.setPan(n.startPan.x+(t.clientX-n.startClientX),n.startPan.y+(t.clientY-n.startClientY));return}if(M){const f=m(t.clientX,t.clientY);Ft({...f,color:pt(t.clientX,t.clientY)});return}const l=R.current;if(l){ut(l,t);return}if((t.buttons&1)===0){_n(e,t.clientX,t.clientY,p,Tt,B);return}const a=y.current;a&&At(a,t)},[r,P,m,ut,M,pt,At,p,e]),T=c.useCallback(t=>{if(zt(t),G.current){G.current=null,at(!1);return}const n=R.current;if(n?.pointerId!==void 0&&t.pointerId!==n.pointerId||ct())return;const l=Et.current;if(l){V(null),q(null),y.current=null,un(l.adapter,l.id,l.gap.beforeSiblingId);return}const a=y.current;if(y.current=null,!a)return;const f=a.hitAtDown!==null?Un(r.selectedEntityIds,a.hitAtDown,t.shiftKey):Zn(s,a.moved,g.current,t.shiftKey);f!==null&&le(s,f),I(null)},[s,r,I,ct,V]),z=c.useCallback(t=>{if(zt(t),G.current){G.current=null,at(!1);return}const n=R.current;n?.pointerId!==void 0&&t.pointerId!==n.pointerId||ct()||(Et.current&&(V(null),q(null)),y.current=null,I(null))},[ct,I,V]),Ie=c.useCallback(()=>{e||Dt()?.editorControls?.clearHover(),Tt(null),B(null)},[e]),je=c.useCallback(t=>{const n=b.current?.parentElement??null;if(In(n,t.clientX,t.clientY))return;const l=p(t.clientX,t.clientY);if(!l)return;const a=Pt(s,l);if(!a)return;const f=E(s,l);if(!f)return;const x=a.get(l);if(x===null){console.warn(`[RootSelectionOverlay] text edit refused for "${l}": dynamic body or has child elements — not inline-editable.`),Y(null),J({id:l,rect:f});return}J(null),Y({id:l,rect:f,initialText:x})},[s,p,Y]),Te=c.useCallback(t=>{const n=Mt.current;if(!n)return;const l=Pt(s,n.id);l&&(St.current={id:n.id,rect:n.rect},l.set(n.id,t)),Y(null)},[s,Y]),Oe=c.useCallback(()=>Y(null),[Y]);if(!Kn(s)||Co())return null;const A=new Set([...r.selectedEntityIds].filter(t=>s.hierarchy.node(t)!==void 0)),kt=_!==null&&!A.has(_)?E(s,_):null,k=ko(s,A),W=k?.rect??null,Be=k?.ownerBoxEdit??null,S=i&&k?k.ownerBoxEdit.gizmoOrigin?.(k.id)??{x:k.rect.x+k.rect.width/2,y:k.rect.y+k.rect.height/2}:null,tt=ee/h.zoom,$=k?k.ownerBoxEdit.referencePoint?.(k.id):null,Ge=k?.spacingBands??[],U=A.size===1?[...A][0]:null,ft=U?pn(s,U):null,Me=U&&ft&&r.showHelpers?ft.layers(U).filter(t=>r.helperVisibility[t.category]??!0):[],et=i?{selectedSingleRect:null,measureLines:[],positionBadge:null,showPositionBadge:!1,parentRect:null}:zo(s,A,kt),Ht=i?null:Po(s,A),xt=Xt.current,Xe=i?[]:xt&&xt.adapter===s&&xt.version===u?xt.hints:(()=>{const t=fn(s);return Xt.current={adapter:s,version:u,hints:t},t})();return d.jsxs("div",{style:{position:"absolute",inset:0,zIndex:An,pointerEvents:"none"},children:[d.jsx("div",{ref:b,"data-testid":"world-selection-overlay-interaction",style:{position:"absolute",inset:0,pointerEvents:"auto",touchAction:"none",userSelect:"none",cursor:rt??Qn(pe,ue,M,!!v)},onPointerDownCapture:De,onPointerMove:j,onPointerUp:T,onPointerCancel:z,onLostPointerCapture:z,onPointerLeave:Ie,onDoubleClick:je,onContextMenu:de,onDragOver:we,onDrop:Ee}),Ot?d.jsx(Lo,{state:Ot,adapter:s,onClose:()=>vt(null)}):null,d.jsxs("div",{"data-testid":"world-selection-overlay-chrome",style:{position:"absolute",inset:0,pointerEvents:"none",transform:hn(h),transformOrigin:"0 0"},children:[!i&&Xe.map(t=>d.jsx("div",{"data-testid":"world-empty-container-hint","data-entity-id":t.id,title:t.displayName,style:{position:"absolute",left:t.rect.x,top:t.rect.y,width:t.rect.width,height:t.rect.height,border:"1px dashed rgba(154, 160, 166, 0.7)",borderWidth:i?1/h.zoom:1,boxSizing:"border-box",pointerEvents:"none"}},t.id)),kt&&d.jsx("div",{"data-testid":"world-selection-hover",style:{...te(kt,!1),...i?{borderWidth:1/h.zoom}:{}}}),[...A].map(t=>{const n=E(s,t);return n?d.jsxs("div",{children:[d.jsx("div",{"data-testid":"world-selection-box","data-entity-id":t,style:{...te(n,!0),...i?{borderWidth:1/h.zoom,background:"transparent"}:{}}}),!i&&d.jsx("div",{"data-testid":"world-selection-label",style:Jn(n),children:Nn(s,t)})]},t):null}),v&&d.jsx("div",{"data-testid":"world-selection-marquee",style:{position:"absolute",left:v.x,top:v.y,width:v.width,height:v.height,border:`1px solid ${C}`,background:`color-mix(in srgb, ${C} 10%, transparent)`,pointerEvents:"none"}}),!i&&d.jsx(Do,{measureLines:et.measureLines,snapGuides:ge,positionBadge:et.positionBadge,showPositionBadge:et.showPositionBadge,badgeAnchorRect:et.selectedSingleRect,parentRect:et.parentRect,screenScale:N,screenZoom:1}),!i&&d.jsx(Io,{dragGhost:xe,reorderPreview:he}),!i&&Ht&&d.jsx(Fn,{adapter:s,entries:Ht}),W&&Be&&d.jsxs(d.Fragment,{children:[!i&&Ge.map(t=>d.jsxs("div",{children:[d.jsx("div",{"data-testid":`world-spacing-${t.kind}-${To(t.side)}`,style:ao(t),onPointerDown:n=>Le(t,n),onPointerMove:j,onPointerUp:T,onPointerCancel:z}),!t.isZero&&d.jsx("div",{style:{...lo(t),...i?{transform:`translate(-50%, -50%) scale(${N})`,transformOrigin:"center"}:{}},children:Math.round(t.value)})]},t.side)),$&&d.jsx("div",{"aria-label":`Edit ${$.label}`,"data-reference-kind":$.kind,"data-testid":"world-reference-point-handle",title:`${$.label} (${$.bounded?"native corner/edge/center snap":"8px/alignment snap"}, Alt for free movement)`,style:{...oo($),...i?{transform:`scale(${N})`,transformOrigin:"center"}:{}},onPointerDown:t=>ke($,t),onPointerMove:j,onPointerUp:T,onPointerCancel:z,onLostPointerCapture:z,role:"button",tabIndex:0,children:$.kind==="anchor"?"A":"P"}),U&&ft&&Me.flatMap(t=>t.handles.map(n=>d.jsx("div",{"aria-label":n.label,"data-testid":"world-spatial-handle","data-handle-id":n.id,"data-writable":n.writable,role:"button",tabIndex:0,title:n.writable?n.label:`${n.label} — ${n.reason}`,style:{...no(n),transform:`translate(-50%, -50%) scale(${N})`},onPointerDown:l=>Pe(U,ft,n,l),onPointerMove:ze,onPointerUp:Ct,onPointerCancel:Ct,onLostPointerCapture:Ct},`${t.id}:${n.id}`))),i&&r.transformMode==="translate"&&d.jsxs(d.Fragment,{children:[d.jsx("div",{"data-testid":"world-2d-move-axis-x",title:"Move on X axis",style:{position:"absolute",left:S.x,top:S.y-5/h.zoom,width:tt,height:10/h.zoom,borderTop:`${2/h.zoom}px solid #ef5350`,boxSizing:"border-box",cursor:"ew-resize",pointerEvents:"auto"},onPointerDown:t=>Rt("x",t),onPointerMove:j,onPointerUp:T,onPointerCancel:z}),d.jsx("div",{"data-testid":"world-2d-move-axis-y",title:"Move on Y axis",style:{position:"absolute",left:S.x-5/h.zoom,top:S.y,width:10/h.zoom,height:tt,borderLeft:`${2/h.zoom}px solid #66bb6a`,boxSizing:"border-box",cursor:"ns-resize",pointerEvents:"auto"},onPointerDown:t=>Rt("y",t),onPointerMove:j,onPointerUp:T,onPointerCancel:z}),d.jsx("div",{"data-testid":"world-2d-move-center",title:"Move freely",style:{position:"absolute",left:S.x-5/h.zoom,top:S.y-5/h.zoom,width:10/h.zoom,height:10/h.zoom,border:"1px solid rgba(255,255,255,.9)",background:"#4aa3ff",boxSizing:"border-box",cursor:"move",pointerEvents:"auto"},onPointerDown:t=>Rt("both",t),onPointerMove:j,onPointerUp:T,onPointerCancel:z})]}),(!i||r.transformMode==="scale")&&(i?d.jsxs(d.Fragment,{children:[d.jsx("div",{"data-testid":"world-2d-scale-axis-x",style:{position:"absolute",left:S.x,top:S.y,width:tt,borderTop:`${2/h.zoom}px solid #ef5350`,pointerEvents:"none"}}),d.jsx("div",{"data-testid":"world-2d-scale-axis-y",style:{position:"absolute",left:S.x,top:S.y,height:tt,borderLeft:`${2/h.zoom}px solid #66bb6a`,pointerEvents:"none"}}),[["x","ew-resize"],["y","ns-resize"],["both","nwse-resize"]].map(([t,n])=>{const l=vo(t,S,tt),a=t==="x"?"e":t==="y"?"s":"se";return d.jsx("div",{"data-testid":`world-resize-handle-${a}`,style:{...ne(l,n),transform:`scale(${N})`,transformOrigin:"center",background:t==="x"?"#ef5350":t==="y"?"#66bb6a":"#fff"},onPointerDown:f=>Ce(t,f),onPointerMove:j,onPointerUp:T,onPointerCancel:z},t)})]}):d.jsxs(d.Fragment,{children:[xn.map(({pos:t,cursor:n})=>d.jsx("div",{"data-testid":`world-resize-handle-${t}`,style:ne(gn(W,t),n),onPointerDown:l=>Se(t,l),onPointerMove:j,onPointerUp:T,onPointerCancel:z},t)),d.jsx("div",{"data-testid":"world-resize-dimension-label",style:io(W),children:`${Math.round(W.width)}×${Math.round(W.height)}`})]})),(!i||r.transformMode==="rotate")&&d.jsxs(d.Fragment,{children:[i&&d.jsx("div",{"data-testid":"world-2d-rotate-ring",style:{position:"absolute",left:S.x-40/h.zoom,top:S.y-40/h.zoom,width:80/h.zoom,height:80/h.zoom,border:`${1/h.zoom}px solid #4aa3ff`,borderRadius:"50%",boxSizing:"border-box",pointerEvents:"none"}}),d.jsx("div",{"data-testid":"world-rotate-handle","aria-label":"Rotate selection",title:"Rotate selection (15° snap, Alt for free rotation)",style:{...eo(W),...i?{left:S.x-Z/2,top:S.y-40/h.zoom-Z/2,transform:`scale(${N})`,transformOrigin:"center",background:"#4aa3ff"}:{}},onPointerDown:Re,onPointerMove:j,onPointerUp:T,onPointerCancel:z,role:"button",tabIndex:0})]})]}),!i&&d.jsx(jo,{textEdit:ye,onCommitTextEdit:Te,onCancelTextEdit:Oe,textEditRefused:lt,eyedropperActive:M,eyedropperPreview:me})]})]})}function Do(e){const{measureLines:o,snapGuides:i,positionBadge:r,showPositionBadge:u,badgeAnchorRect:s,parentRect:p,screenScale:b,screenZoom:y}=e;return d.jsxs(d.Fragment,{children:[p&&d.jsx("div",{"data-testid":"world-parent-outline",style:ho(p)}),o.map(g=>d.jsxs("div",{"data-testid":"world-measure-line",children:[d.jsx("div",{style:po(g)}),d.jsx("div",{style:ie(g.x1,g.y1,g.orientation==="horizontal")}),d.jsx("div",{style:ie(g.x2,g.y2,g.orientation==="horizontal")}),d.jsx("div",{"data-testid":"world-measure-line-label",style:{...fo(g),...b!==1?{transform:`translate(-50%, -50%) scale(${b})`,transformOrigin:"center"}:{}},children:g.distance})]},g.orientation)),i.map(g=>d.jsx("div",{"data-testid":"world-snap-guide",style:xo(g)},g.orientation)),u&&s&&r&&d.jsxs("div",{"data-testid":"world-position-badge",style:{...go(s),...b!==1?{top:s.y-36/y,transform:`scale(${b})`,transformOrigin:"top left"}:{}},children:[r.position&&d.jsx("span",{"data-testid":"world-position-badge-mode",style:se,children:r.position}),r.parentLayout&&d.jsx("span",{"data-testid":"world-position-badge-layout",style:se,children:r.parentLayout})]})]})}function Io(e){const{dragGhost:o,reorderPreview:i}=e;return d.jsxs(d.Fragment,{children:[o&&d.jsx("div",{"data-testid":"world-drag-ghost",style:co(o)}),i&&d.jsx("div",{"data-testid":"world-reorder-preview",style:uo(i.gap.marker)})]})}function jo(e){const{textEdit:o,onCommitTextEdit:i,onCancelTextEdit:r,textEditRefused:u,eyedropperActive:s,eyedropperPreview:p}=e;return d.jsxs(d.Fragment,{children:[o&&d.jsx("div",{style:{pointerEvents:"auto"},children:d.jsx(Yn,{rect:o.rect,initialText:o.initialText,onCommit:i,onCancel:r})}),u&&d.jsx("div",{"data-testid":"world-text-edit-refused",title:"dynamic body — not inline-editable",style:{position:"absolute",left:u.rect.x,top:u.rect.y,width:Math.max(u.rect.width,40),height:Math.max(u.rect.height,20),border:`2px dashed ${ot.semantic.danger}`,boxSizing:"border-box",background:ot.semantic.dangerMuted,pointerEvents:"none"}}),s&&p&&d.jsx("div",{"data-testid":"world-eyedropper-swatch","data-color-state":p.color?"resolved":"unknown",style:{position:"absolute",left:p.x+12,top:p.y+12,width:24,height:24,borderRadius:4,border:"2px solid #fff",boxShadow:"0 1px 4px rgba(0,0,0,0.5)",background:p.color??"repeating-linear-gradient(45deg, #999, #999 4px, #ccc 4px, #ccc 8px)",pointerEvents:"none"}})]})}function To(e){return e.endsWith("Top")?"top":e.endsWith("Right")?"right":e.endsWith("Bottom")?"bottom":"left"}export{No as R,On as a,Ao as b,Bn as c,Ho as m,_o as r,Gn as s};
@@ -0,0 +1 @@
1
+ import{_ as M}from"./extends-CF3RwP-h.js";import{r as o}from"./index-nmcBqr7Y.js";import{t as R}from"./BufferGeometryUtils-Nz37EVXf.js";import{b8 as I}from"./three.module-D396a9Mn.js";import"./_commonjsHelpers-D6-XlEtG.js";import"./index-D_NuPfjr.js";const t=1e-5;function h(c,a,n){const r=new I,e=n-t;return r.absarc(t,t,t,-Math.PI/2,-Math.PI,!0),r.absarc(t,a-e*2,t,Math.PI,Math.PI/2,!0),r.absarc(c-e*2,a-e*2,t,Math.PI/2,0,!0),r.absarc(c-e*2,t,t,0,-Math.PI/2,!0),r}const B=o.forwardRef(function({args:[a=1,n=1,r=1]=[],radius:e=.05,steps:m=1,smoothness:u=4,bevelSegments:f=4,creaseAngle:p=.4,children:b,...d},l){return o.createElement("mesh",M({ref:l},d),o.createElement(i,{args:[a,n,r],radius:e,steps:m,smoothness:u,bevelSegments:f,creaseAngle:p}),b)}),i=o.forwardRef(function({args:[a=1,n=1,r=1]=[],radius:e=.05,steps:m=1,smoothness:u=4,bevelSegments:f=4,creaseAngle:p=.4,...b},d){const l=o.useMemo(()=>h(a,n,e),[a,n,e]),x=o.useMemo(()=>({depth:r-e*2,bevelEnabled:!0,bevelSegments:f*2,steps:m,bevelSize:e-t,bevelThickness:e,curveSegments:u}),[r,e,u,f,m]),s=o.useRef(null);return o.useLayoutEffect(()=>{s.current&&(s.current.center(),R(s.current,p))},[l,x,p]),o.useImperativeHandle(d,()=>s.current),o.createElement("extrudeGeometry",M({ref:s,args:[l,x]},b))});export{B as RoundedBox,i as RoundedBoxGeometry};
@@ -0,0 +1 @@
1
+ import{B as S,V as f}from"./three.module-D396a9Mn.js";const h=new f;function a(k,o,i,l,g,e){const y=2*Math.PI*g/4,m=Math.max(e-2*g,0),x=Math.PI/4;h.copy(o),h[l]=0,h.normalize();const t=.5*y/(y+m),z=1-h.angleTo(k)/x;return Math.sign(h[i])===1?z*t:m/(y+m)+t+t*(1-z)}class v extends S{constructor(o=1,i=1,l=1,g=2,e=.1){const y=g*2+1;if(e=Math.min(o/2,i/2,l/2,e),super(1,1,1,y,y,y),this.type="RoundedBoxGeometry",this.parameters={width:o,height:i,depth:l,segments:g,radius:e},y===1)return;const m=this.toNonIndexed();this.index=null,this.attributes.position=m.attributes.position,this.attributes.normal=m.attributes.normal,this.attributes.uv=m.attributes.uv;const x=new f,t=new f,z=new f(o,i,l).divideScalar(2).subScalar(e),b=this.attributes.position.array,M=this.attributes.normal.array,r=this.attributes.uv.array,u=b.length/6,n=new f,p=.5/y;for(let c=0,s=0;c<b.length;c+=3,s+=2)switch(x.fromArray(b,c),t.copy(x),t.x-=Math.sign(t.x)*p,t.y-=Math.sign(t.y)*p,t.z-=Math.sign(t.z)*p,t.normalize(),b[c+0]=z.x*Math.sign(x.x)+t.x*e,b[c+1]=z.y*Math.sign(x.y)+t.y*e,b[c+2]=z.z*Math.sign(x.z)+t.z*e,M[c+0]=t.x,M[c+1]=t.y,M[c+2]=t.z,Math.floor(c/u)){case 0:n.set(1,0,0),r[s+0]=a(n,t,"z","y",e,l),r[s+1]=1-a(n,t,"y","z",e,i);break;case 1:n.set(-1,0,0),r[s+0]=1-a(n,t,"z","y",e,l),r[s+1]=1-a(n,t,"y","z",e,i);break;case 2:n.set(0,1,0),r[s+0]=1-a(n,t,"x","z",e,o),r[s+1]=a(n,t,"z","x",e,l);break;case 3:n.set(0,-1,0),r[s+0]=1-a(n,t,"x","z",e,o),r[s+1]=1-a(n,t,"z","x",e,l);break;case 4:n.set(0,0,1),r[s+0]=1-a(n,t,"x","y",e,o),r[s+1]=1-a(n,t,"y","x",e,i);break;case 5:n.set(0,0,-1),r[s+0]=a(n,t,"x","y",e,o),r[s+1]=1-a(n,t,"y","x",e,i);break}}static fromJSON(o){return new v(o.width,o.height,o.depth,o.segments,o.radius)}}export{v as RoundedBoxGeometry};
@@ -0,0 +1 @@
1
+ import{ak as z,al as I,aB as H,C as P,j as _,aC as G,V as k,aY as N}from"./three.module-D396a9Mn.js";class q extends z{constructor(h){super(h)}load(h,V,D,y){const b=this,x=new I(this.manager);x.setPath(this.path),x.setResponseType("arraybuffer"),x.setRequestHeader(this.requestHeader),x.setWithCredentials(this.withCredentials),x.load(h,function(T){try{V(b.parse(T))}catch(C){y?y(C):console.error(C),b.manager.itemError(h)}},D,y)}parse(h){function V(t){const e=new DataView(t),o=32/8*3+32/8*3*3+16/8,s=e.getUint32(80,!0);if(80+32/8+s*o===e.byteLength)return!0;const i=[115,111,108,105,100];for(let a=0;a<5;a++)if(D(i,e,a))return!1;return!0}function D(t,e,o){for(let s=0,f=t.length;s<f;s++)if(t[s]!==e.getUint8(o+s))return!1;return!0}function y(t){const e=new DataView(t),o=e.getUint32(80,!0);let s,f,i,a=!1,m,B,A,S,U;for(let n=0;n<70;n++)e.getUint32(n,!1)==1129270351&&e.getUint8(n+4)==82&&e.getUint8(n+5)==61&&(a=!0,m=new Float32Array(o*3*3),B=e.getUint8(n+6)/255,A=e.getUint8(n+7)/255,S=e.getUint8(n+8)/255,U=e.getUint8(n+9)/255);const g=84,r=50,c=new H,p=new Float32Array(o*3*3),d=new Float32Array(o*3*3),w=new P;for(let n=0;n<o;n++){const F=g+n*r,v=e.getFloat32(F,!0),L=e.getFloat32(F+4,!0),R=e.getFloat32(F+8,!0);if(a){const l=e.getUint16(F+48,!0);(l&32768)===0?(s=(l&31)/31,f=(l>>5&31)/31,i=(l>>10&31)/31):(s=B,f=A,i=S)}for(let l=1;l<=3;l++){const E=F+l*12,u=n*3*3+(l-1)*3;p[u]=e.getFloat32(E,!0),p[u+1]=e.getFloat32(E+4,!0),p[u+2]=e.getFloat32(E+8,!0),d[u]=v,d[u+1]=L,d[u+2]=R,a&&(w.setRGB(s,f,i,_),m[u]=w.r,m[u+1]=w.g,m[u+2]=w.b)}}return c.setAttribute("position",new G(p,3)),c.setAttribute("normal",new G(d,3)),a&&(c.setAttribute("color",new G(m,3)),c.hasColors=!0,c.alpha=U),c}function b(t){const e=new H,o=/solid([\s\S]*?)endsolid/g,s=/facet([\s\S]*?)endfacet/g,f=/solid\s(.+)/;let i=0;const a=/[\s]+([+-]?(?:\d*)(?:\.\d*)?(?:[eE][+-]?\d+)?)/.source,m=new RegExp("vertex"+a+a+a,"g"),B=new RegExp("normal"+a+a+a,"g"),A=[],S=[],U=[],g=new k;let r,c=0,p=0,d=0;for(;(r=o.exec(t))!==null;){p=d;const w=r[0],n=(r=f.exec(w))!==null?r[1]:"";for(U.push(n);(r=s.exec(w))!==null;){let L=0,R=0;const l=r[0];for(;(r=B.exec(l))!==null;)g.x=parseFloat(r[1]),g.y=parseFloat(r[2]),g.z=parseFloat(r[3]),R++;for(;(r=m.exec(l))!==null;)A.push(parseFloat(r[1]),parseFloat(r[2]),parseFloat(r[3])),S.push(g.x,g.y,g.z),L++,d++;R!==1&&console.error("THREE.STLLoader: Something isn't right with the normal of face number "+i),L!==3&&console.error("THREE.STLLoader: Something isn't right with the vertices of face number "+i),i++}const F=p,v=d-p;e.userData.groupNames=U,e.addGroup(F,v,c),c++}return e.setAttribute("position",new N(A,3)),e.setAttribute("normal",new N(S,3)),e}function x(t){return typeof t!="string"?new TextDecoder().decode(t):t}function T(t){if(typeof t=="string"){const e=new Uint8Array(t.length);for(let o=0;o<t.length;o++)e[o]=t.charCodeAt(o)&255;return e.buffer||e}else return t}const C=T(h);return V(C)?y(C):b(x(h))}}export{q as STLLoader};
@@ -0,0 +1 @@
1
+ import{V as a,bk as v,a as S,Q as L}from"./three.module-D396a9Mn.js";const C=new v,m=new a,p=new a,r=new a,i=new a,n=new a,o=new a,c=new a,l=new a,u=new a,x=new a,f=new a,y=new a,w=new a,_=new a,g=new S,I=new L,N=new a;class T{constructor(s,e,t=Number.MAX_VALUE){this.camera=s,this.scene=e,this.startPoint=new a,this.endPoint=new a,this.collection=[],this.instances={},this.deep=t}select(s,e){return this.startPoint=s||this.startPoint,this.endPoint=e||this.endPoint,this.collection=[],this._updateFrustum(this.startPoint,this.endPoint),this._searchChildInFrustum(C,this.scene),this.collection}_updateFrustum(s,e){if(s=s||this.startPoint,e=e||this.endPoint,s.x===e.x&&(e.x+=Number.EPSILON),s.y===e.y&&(e.y+=Number.EPSILON),this.camera.updateProjectionMatrix(),this.camera.updateMatrixWorld(),this.camera.isPerspectiveCamera){p.copy(s),p.x=Math.min(s.x,e.x),p.y=Math.max(s.y,e.y),e.x=Math.max(s.x,e.x),e.y=Math.min(s.y,e.y),r.setFromMatrixPosition(this.camera.matrixWorld),i.copy(p),n.set(e.x,p.y,0),o.copy(e),c.set(p.x,e.y,0),i.unproject(this.camera),n.unproject(this.camera),o.unproject(this.camera),c.unproject(this.camera),y.copy(i).sub(r),w.copy(n).sub(r),_.copy(o).sub(r),y.normalize(),w.normalize(),_.normalize(),y.multiplyScalar(this.deep),w.multiplyScalar(this.deep),_.multiplyScalar(this.deep),y.add(r),w.add(r),_.add(r);const t=C.planes;t[0].setFromCoplanarPoints(r,i,n),t[1].setFromCoplanarPoints(r,n,o),t[2].setFromCoplanarPoints(o,c,r),t[3].setFromCoplanarPoints(c,i,r),t[4].setFromCoplanarPoints(n,o,c),t[5].setFromCoplanarPoints(_,w,y),t[5].normal.multiplyScalar(-1)}else if(this.camera.isOrthographicCamera){const t=Math.min(s.x,e.x),F=Math.max(s.y,e.y),d=Math.max(s.x,e.x),M=Math.min(s.y,e.y);i.set(t,F,-1),n.set(d,F,-1),o.set(d,M,-1),c.set(t,M,-1),l.set(t,F,1),u.set(d,F,1),x.set(d,M,1),f.set(t,M,1),i.unproject(this.camera),n.unproject(this.camera),o.unproject(this.camera),c.unproject(this.camera),l.unproject(this.camera),u.unproject(this.camera),x.unproject(this.camera),f.unproject(this.camera);const h=C.planes;h[0].setFromCoplanarPoints(i,l,u),h[1].setFromCoplanarPoints(n,u,x),h[2].setFromCoplanarPoints(x,f,c),h[3].setFromCoplanarPoints(f,l,i),h[4].setFromCoplanarPoints(n,o,c),h[5].setFromCoplanarPoints(x,u,l),h[5].normal.multiplyScalar(-1)}else console.error("THREE.SelectionBox: Unsupported camera type.")}_searchChildInFrustum(s,e){if(e.isMesh||e.isLine||e.isPoints)if(e.isInstancedMesh){this.instances[e.uuid]=[];for(let t=0;t<e.count;t++)e.getMatrixAt(t,g),g.decompose(m,I,N),m.applyMatrix4(e.matrixWorld),s.containsPoint(m)&&this.instances[e.uuid].push(t)}else e.geometry.boundingSphere===null&&e.geometry.computeBoundingSphere(),m.copy(e.geometry.boundingSphere.center),m.applyMatrix4(e.matrixWorld),s.containsPoint(m)&&this.collection.push(e);if(e.children.length>0)for(let t=0;t<e.children.length;t++)this._searchChildInFrustum(s,e.children[t])}}export{T as SelectionBox};
@@ -0,0 +1 @@
1
+ import{h as s,U as a}from"./three.module-D396a9Mn.js";import{X as r,Y as o}from"./index-GIL7oGEO.js";import"./index-nmcBqr7Y.js";import"./_commonjsHelpers-D6-XlEtG.js";import"./index-D_NuPfjr.js";import"./jsx-runtime-DPjLkJKQ.js";import"./index-CtzuWnCS.js";import"./index-CinJrH5C.js";import"./index-FUuS4qwW.js";import"./client-DNXj_opT.js";class Q extends r{constructor(t,i="tDiffuse"){super(),this.textureID=i,this.uniforms=null,this.material=null,t instanceof s?(this.uniforms=t.uniforms,this.material=t):t&&(this.uniforms=a.clone(t.uniforms),this.material=new s({name:t.name!==void 0?t.name:"unspecified",defines:Object.assign({},t.defines),uniforms:this.uniforms,vertexShader:t.vertexShader,fragmentShader:t.fragmentShader})),this._fsQuad=new o(this.material)}render(t,i,e){this.uniforms[this.textureID]&&(this.uniforms[this.textureID].value=e.texture),this._fsQuad.material=this.material,this.renderToScreen?(t.setRenderTarget(null),this._fsQuad.render(t)):(t.setRenderTarget(i),this.clear&&t.clear(t.autoClearColor,t.autoClearDepth,t.autoClearStencil),this._fsQuad.render(t))}dispose(){this.material.dispose(),this._fsQuad.dispose()}}export{Q as ShaderPass};
@@ -0,0 +1 @@
1
+ import{a as o}from"./jsx-runtime-DPjLkJKQ.js";import{r as $}from"./index-nmcBqr7Y.js";import"./index-CtzuWnCS.js";import{ei as v,a4 as L,hu as N,hL as wt,bo as pt,ht as B,eq as zt,em as ut,a5 as X,f9 as ft,kA as it,e6 as Bt,i2 as ht,b5 as Dt,aV as Ft}from"./index-GIL7oGEO.js";const At={full:{anchor:{left:0,top:0,right:1,bottom:1},offset:{left:0,top:0,right:0,bottom:0}},top:{anchor:{left:0,top:0,right:1,bottom:0},offset:{left:0,top:0,right:0,bottom:0}},bottom:{anchor:{left:0,top:1,right:1,bottom:1},offset:{left:0,top:0,right:0,bottom:0}},left:{anchor:{left:0,top:0,right:0,bottom:1},offset:{left:0,top:0,right:0,bottom:0}},right:{anchor:{left:1,top:0,right:1,bottom:1},offset:{left:0,top:0,right:0,bottom:0}},center:{anchor:{left:.5,top:.5,right:.5,bottom:.5},offset:{left:-60,top:-20,right:60,bottom:20}},"top-left":{anchor:{left:0,top:0,right:0,bottom:0},offset:{left:0,top:0,right:120,bottom:40}},"top-right":{anchor:{left:1,top:0,right:1,bottom:0},offset:{left:-120,top:0,right:0,bottom:40}}},mt=["flex-start","center","flex-end"],gt=["flex-start","center","flex-end"];function Ht({row:t,col:e,justify:n,align:r,isActive:a,disabled:s,onSelect:c}){return o.jsx("div",{"data-testid":`alignment-grid-${t}-${e}`,onClick:()=>{s||c(n,r)},style:{width:16,height:16,display:"flex",alignItems:"center",justifyContent:"center",cursor:s?"not-allowed":"pointer",borderRadius:v.radiusSmall,background:a?v.accent:"transparent"},children:o.jsx("div",{style:{width:a?6:4,height:a?6:4,borderRadius:"50%",background:a?v.onAccent:v.textMuted}})})}function ce({value:t,onChange:e,disabled:n}){const r=mt.indexOf(t.justify),a=gt.indexOf(t.align);return o.jsx("div",{"data-testid":"alignment-grid",style:{display:"inline-grid",gridTemplateColumns:"repeat(3, 16px)",gridTemplateRows:"repeat(3, 16px)",gap:1,background:v.inputBg,borderRadius:v.radiusMedium,padding:4,opacity:n?.35:1},children:gt.map((s,c)=>mt.map((l,u)=>o.jsx(Ht,{row:c,col:u,justify:l,align:s,isActive:c===a&&u===r,disabled:n,onSelect:(p,h)=>e({justify:p,align:h})},`${c}-${u}`)))})}function de({onSelect:t,disabled:e}){return o.jsx("div",{"data-testid":"anchor-presets",style:{display:"flex",flexWrap:"wrap",gap:4},children:Object.entries(At).map(([n,r])=>o.jsx(L,{type:"button",variant:"secondary",size:"compact","data-testid":`anchor-preset-${n}`,disabled:e,onClick:()=>t(n,r),children:n},n))})}function nt(t){let e=t.replace("#","");e.length===3&&(e=`${e[0]??"0"}${e[0]??"0"}${e[1]??"0"}${e[1]??"0"}${e[2]??"0"}${e[2]??"0"}`);const n=Number.parseInt(e,16);return[n>>16&255,n>>8&255,n&255]}function St(t,e,n){return`#${[t,e,n].map(r=>Math.round(Math.max(0,Math.min(255,r))).toString(16).padStart(2,"0")).join("")}`}function J(t,e,n){const r=t/255,a=e/255,s=n/255,c=Math.max(r,a,s),l=Math.min(r,a,s),u=c-l;let p=0;u!==0&&(c===r?p=((a-s)/u%6+6)%6:c===a?p=(s-r)/u+2:p=(r-a)/u+4,p/=6);const h=c===0?0:u/c;return[p,h,c]}function K(t,e,n){const r=Math.floor(t*6),a=t*6-r,s=n*(1-e),c=n*(1-a*e),l=n*(1-(1-a)*e);let u=0,p=0,h=0;switch(r%6){case 0:u=n,p=l,h=s;break;case 1:u=c,p=n,h=s;break;case 2:u=s,p=n,h=l;break;case 3:u=s,p=c,h=n;break;case 4:u=l,p=s,h=n;break;case 5:u=n,p=s,h=c;break}return[Math.round(u*255),Math.round(p*255),Math.round(h*255)]}function kt(t,e,n){let r,a,s;if(e===0)r=a=s=n;else{const c=(p,h,d)=>{let b=d;return b<0&&(b+=1),b>1&&(b-=1),b<.16666666666666666?p+(h-p)*6*b:b<.5?h:b<.6666666666666666?p+(h-p)*(.6666666666666666-b)*6:p},l=n<.5?n*(1+e):n+e-n*e,u=2*n-l;r=c(u,l,t+1/3),a=c(u,l,t),s=c(u,l,t-1/3)}return[Math.round(r*255),Math.round(a*255),Math.round(s*255)]}function Pt(t,e,n){const r=t/255,a=e/255,s=n/255,c=Math.max(r,a,s),l=Math.min(r,a,s);let u=0,p=0;const h=(c+l)/2;if(c!==l){const d=c-l;p=h>.5?d/(2-c-l):d/(c+l),c===r?u=((a-s)/d+(a<s?6:0))/6:c===a?u=((s-r)/d+2)/6:u=((r-a)/d+4)/6}return[u,p,h]}function rt(t){if(t.startsWith("#")&&(t.length===4||t.length===7))return t;if(t.startsWith("#")&&t.length===9)return t.slice(0,7);const e=t.match(/rgba?\((\d+),\s*(\d+),\s*(\d+)/);if(e){const[,r,a,s]=e;return`#${[r??"0",a??"0",s??"0"].map(c=>Number.parseInt(c,10).toString(16).padStart(2,"0")).join("")}`}const n=t.match(/hsla?\((\d+),\s*(\d+)%?,\s*(\d+)%?/);if(n){const[r,a,s]=kt(Number.parseInt(n[1]??"0",10)/360,Number.parseInt(n[2]??"0",10)/100,Number.parseInt(n[3]??"0",10)/100);return St(r,a,s)}return"#000000"}function lt(t){const e=t.match(/rgba\([^,]+,[^,]+,[^,]+,\s*([\d.]+)\)/);if(e?.[1])return Number.parseFloat(e[1]);const n=t.match(/hsla\([^,]+,[^,]+,[^,]+,\s*([\d.]+)\)/);return n?.[1]?Number.parseFloat(n[1]):t.startsWith("#")&&t.length===9?Number.parseInt(t.slice(7,9),16)/255:1}function xt(t,e,n,r,a){if(a==="hex"){const d=St(t,e,n);return r<1?`rgba(${t}, ${e}, ${n}, ${r.toFixed(2)})`:d}if(a==="rgb")return r<1?`rgba(${t}, ${e}, ${n}, ${r.toFixed(2)})`:`rgb(${t}, ${e}, ${n})`;const[s,c,l]=Pt(t,e,n),u=Math.round(s*360),p=Math.round(c*100),h=Math.round(l*100);return r<1?`hsla(${u}, ${p}%, ${h}%, ${r.toFixed(2)})`:`hsl(${u}, ${p}%, ${h}%)`}function Mt(t){const e=t.match(/\d+/g);return!e||e.length<3?"#000000":`#${[e[0]??"0",e[1]??"0",e[2]??"0"].map(n=>Number.parseInt(n,10).toString(16).padStart(2,"0")).join("")}`}const F=200,Z=150,U=14;function Gt({value:t,onChange:e,onChangeEnd:n,onClose:r,recentColors:a,onAddRecentColor:s,eyedropperFallback:c,onEyedropperPick:l,disabled:u}){const p=rt(t),h=nt(p),[d,b]=$.useState(()=>J(...h)),[m,i]=$.useState(()=>lt(t)),[f,g]=$.useState("hex"),[k,C]=$.useState(p),z=$.useRef(null),S=$.useRef(null),w=$.useRef(null),E=$.useRef(null),T=$.useRef(null),A=$.useCallback((x=d,y=m,j=f)=>{const[M,R,I]=K(x[0],x[1],x[2]);return xt(M,R,I,y,j)},[d,m,f]);$.useEffect(()=>{C(A())},[A]),$.useEffect(()=>{const x=S.current,y=x?.getContext("2d");if(!x||!y)return;const[j,M,R]=K(d[0],1,1),I=y.createLinearGradient(0,0,F,0);I.addColorStop(0,"#ffffff"),I.addColorStop(1,`rgb(${j},${M},${R})`),y.fillStyle=I,y.fillRect(0,0,F,Z);const P=y.createLinearGradient(0,0,0,Z);P.addColorStop(0,"rgba(0,0,0,0)"),P.addColorStop(1,"rgba(0,0,0,1)"),y.fillStyle=P,y.fillRect(0,0,F,Z)},[d[0]]),$.useEffect(()=>{const x=w.current,y=x?.getContext("2d");if(!x||!y)return;const j=y.createLinearGradient(0,0,F,0);for(let M=0;M<=6;M++){const[R,I,P]=K(M/6,1,1);j.addColorStop(M/6,`rgb(${R},${I},${P})`)}y.fillStyle=j,y.fillRect(0,0,F,U)},[]),$.useEffect(()=>{const x=E.current,y=x?.getContext("2d");if(!x||!y)return;const j=4;for(let q=0;q<U;q+=j)for(let Q=0;Q<F;Q+=j)y.fillStyle=(Q/j+q/j)%2===0?"#ffffff":"#cccccc",y.fillRect(Q,q,j,j);const[M,R,I]=K(d[0],d[1],d[2]),P=y.createLinearGradient(0,0,F,0);P.addColorStop(0,`rgba(${M},${R},${I},0)`),P.addColorStop(1,`rgba(${M},${R},${I},1)`),y.fillStyle=P,y.fillRect(0,0,F,U)},[d]),$.useEffect(()=>{if(!r)return;function x(j){j.key==="Escape"&&r?.()}function y(j){z.current&&!z.current.contains(j.target)&&r?.()}return document.addEventListener("keydown",x),document.addEventListener("mousedown",y,!0),()=>{document.removeEventListener("keydown",x),document.removeEventListener("mousedown",y,!0)}},[r]);const _=$.useCallback((x,y,j,M)=>{const R=y?.getBoundingClientRect();if(R)if(x==="sat"){const I=[d[0],ct(j,R.left,R.width),_t(M,R.top,R.height)];b(I),N({onChange:e},A(I))}else if(x==="hue"){const I=[ct(j,R.left,R.width),d[1],d[2]];b(I),N({onChange:e},A(I))}else{const I=Math.round(ct(j,R.left,R.width)*100)/100;i(I),N({onChange:e},A(d,I))}},[d,A,e]);$.useEffect(()=>{function x(j){const M=T.current;if(!M)return;j.preventDefault();const R=M==="sat"?S.current:M==="hue"?w.current:E.current;_(M,R,j.clientX,j.clientY)}function y(){if(T.current){T.current=null;const j=A();B({onChange:e,onChangeEnd:n},j),s?.(j)}}return window.addEventListener("mousemove",x),window.addEventListener("mouseup",y),()=>{window.removeEventListener("mousemove",x),window.removeEventListener("mouseup",y)}},[_,A,e,n,s]);const D=(x,y)=>{u||(y.preventDefault(),T.current=x,_(x,y.currentTarget,y.clientX,y.clientY))},G=()=>{const x=k.trim(),y=Ot(x),j=y?{r:y[0],g:y[1],b:y[2],a:1}:Kt(x)??Ut(x);if(!j)return;b(J(j.r,j.g,j.b)),i(j.a);const M=y?x:xt(j.r,j.g,j.b,j.a,f);N({onChange:e},M),B({onChange:e,onChangeEnd:n},M),s?.(M)},st=()=>{g(x=>x==="hex"?"rgb":x==="rgb"?"hsl":"hex")},O=typeof globalThis.EyeDropper=="function",at=x=>{const y=rt(x);b(J(...nt(y))),i(lt(x)),N({onChange:e},x),B({onChange:e,onChangeEnd:n},x)},Ct=async()=>{if(O){try{const y=globalThis.EyeDropper,j=await new y().open();at(j.sRGBHex)}catch{}return}if(l){l(y=>{y&&at(y)});return}const x=c?.();x&&at(x)},[It,Lt,Tt]=K(d[0],d[1],d[2]),Nt=`rgba(${It},${Lt},${Tt},${m})`;return o.jsxs(wt,{ref:z,"data-testid":"inspector-color-picker",onMouseDown:x=>x.stopPropagation(),style:{padding:10,width:F+16,boxSizing:"border-box"},children:[o.jsx("canvas",{ref:S,"data-testid":"color-picker-sv",width:F,height:Z,onMouseDown:x=>D("sat",x),style:{cursor:"crosshair",borderRadius:v.radiusSmall,display:"block"}}),o.jsx("canvas",{ref:w,"data-testid":"color-picker-hue",width:F,height:U,onMouseDown:x=>D("hue",x),style:{cursor:"pointer",borderRadius:v.radiusSmall,display:"block",marginTop:6}}),o.jsx("canvas",{ref:E,"data-testid":"color-picker-alpha",width:F,height:U,onMouseDown:x=>D("alpha",x),style:{cursor:"pointer",borderRadius:v.radiusSmall,display:"block",marginTop:6}}),o.jsxs("div",{style:{display:"flex",gap:6,alignItems:"center",marginTop:8},children:[o.jsx("div",{style:{width:22,height:22,borderRadius:v.radiusSmall,flexShrink:0,border:`1px solid ${v.border}`,background:Nt}}),o.jsx(pt,{type:"text","data-testid":"color-picker-text",value:k,onChange:x=>C(x.target.value),onKeyDown:x=>{x.key==="Enter"&&G()},onBlur:G,"data-density":"compact","data-monospace":"true",style:{flex:1}}),o.jsx(L,{type:"button",variant:"secondary",size:"compact","data-testid":"color-format-toggle",onClick:st,title:"Cycle color format",style:{flexShrink:0},children:f.toUpperCase()}),(O||c||l)&&o.jsx(L,{type:"button",variant:"secondary",size:"compact","data-testid":"color-picker-eyedropper",onClick:Ct,title:"Eyedropper",style:{flexShrink:0},children:"⌖"})]}),a&&a.length>0&&o.jsx("div",{style:{display:"flex",flexWrap:"wrap",gap:3,marginTop:8,paddingTop:6,borderTop:`1px solid ${v.border}`},children:a.map((x,y)=>o.jsx("div",{"data-testid":"color-picker-recent",onClick:()=>{const j=rt(x);b(J(...nt(j))),i(lt(x)),N({onChange:e},x),B({onChange:e,onChangeEnd:n},x)},title:x,style:{width:16,height:16,borderRadius:v.radiusSmall,cursor:"pointer",background:x,border:`1px solid ${v.border}`}},`${x}-${y}`))})]})}function Y({label:t,value:e,onChange:n,onChangeEnd:r,recentColors:a,onAddRecentColor:s,eyedropperFallback:c,onEyedropperPick:l,disabled:u,testId:p}){const[h,d]=$.useState(!1),b=rt(e);return o.jsxs("div",{style:{display:"flex",alignItems:"center",gap:6,position:"relative"},children:[o.jsx("div",{"data-testid":p?`${p}-swatch`:"color-swatch",onClick:()=>{u||d(m=>!m)},style:{width:20,height:20,borderRadius:v.radiusSmall,flexShrink:0,background:b,border:`1px solid ${v.border}`,cursor:u?"not-allowed":"pointer"}}),t&&o.jsx("span",{style:{fontSize:10,color:v.textMuted,flexShrink:0},children:t}),h&&!u&&o.jsx("div",{style:{position:"absolute",zIndex:"var(--vgai-z-dropdown)",top:"100%",left:0,marginTop:4},children:o.jsx(Gt,{value:e,onChange:n,onChangeEnd:r,onClose:()=>d(!1),recentColors:a,onAddRecentColor:s,eyedropperFallback:c,onEyedropperPick:l})})]})}function Et(t){return Math.max(0,Math.min(1,t))}function ct(t,e,n){return Et(n?(t-e)/n:0)}function _t(t,e,n){return Et(n?1-(t-e)/n:0)}function Ot(t){return/^#[0-9a-fA-F]{6}$/.test(t)?nt(t):null}function Kt(t){const e=t.match(/rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*([\d.]+))?\)/);if(!e)return null;const[,n,r,a,s]=e;return{r:Number.parseInt(n??"0",10),g:Number.parseInt(r??"0",10),b:Number.parseInt(a??"0",10),a:s?Number.parseFloat(s):1}}function Ut(t){const e=t.match(/hsla?\((\d+),\s*(\d+)%?,\s*(\d+)%?(?:,\s*([\d.]+))?\)/);if(!e)return null;const[,n,r,a,s]=e,[c,l,u]=kt(Number.parseInt(n??"0",10)/360,Number.parseInt(r??"0",10)/100,Number.parseInt(a??"0",10)/100);return{r:c,g:l,b:u,a:s?Number.parseFloat(s):1}}function H({label:t,value:e,unit:n="",step:r=1,min:a,max:s,precision:c,disabled:l,onChange:u,onChangeEnd:p,testId:h,style:d}){const b=$.useRef(null),m=c??(r<1?2:r>=100?-2:0),i=$.useMemo(()=>w=>{if(m<0){const T=10**-m;return Math.round(w/T)*T}const E=10**m;return Math.round(w*E)/E},[m]),f=w=>{let E=w;return a!==void 0&&(E=Math.max(a,E)),s!==void 0&&(E=Math.min(s,E)),i(E)},g=w=>{if(l)return;w.preventDefault(),b.current={startX:w.clientX,startValue:e,last:e},document.body.style.cursor="ew-resize";const E=D=>{if(!b.current)return;D.preventDefault();const G=D.clientX-b.current.startX,st=D.shiftKey?10:D.altKey?.1:1,O=f(b.current.startValue+G*r*st);b.current.last=O,N({onChange:u},O)},T=()=>{document.body.style.cursor="",window.removeEventListener("mousemove",E),window.removeEventListener("mouseup",A),window.removeEventListener("keydown",_)},A=()=>{if(b.current){const D=b.current.last;b.current=null,B({onChange:u,onChangeEnd:p},D)}T()},_=D=>{if(D.key==="Escape"&&b.current){const G=f(b.current.startValue);b.current=null,N({onChange:u},G),B({onChange:u,onChangeEnd:p},G),T()}};window.addEventListener("mousemove",E),window.addEventListener("mouseup",A),window.addEventListener("keydown",_)},[k,C]=$.useState(null),z=$.useRef(!1),S=w=>{const E=Number.parseFloat(w);if(Number.isNaN(E))return;const T=f(E);T!==e&&B({onChange:u,onChangeEnd:p},T)};return o.jsxs("div",{style:{...zt,...d},children:[o.jsx("span",{className:"vgai-scrub-label","data-testid":h?`${h}-label`:void 0,onMouseDown:g,"data-disabled":l||void 0,style:{fontSize:11,...l?{color:v.dynamic}:{},flexShrink:0,cursor:l?"not-allowed":"ew-resize",userSelect:"none",fontWeight:500},children:t}),o.jsx(pt,{"data-testid":h,type:"text",value:k??`${e}${n}`,readOnly:l,"data-dynamic":l||void 0,onFocus:w=>{C(`${e}${n}`),w.target.select()},onChange:w=>C(w.target.value),onBlur:w=>{z.current||S(w.target.value),z.current=!1,C(null)},onKeyDown:w=>{w.key==="Enter"&&w.target.blur(),w.key==="Escape"&&(z.current=!0,w.target.blur())},style:{flex:1,width:0}})]})}const bt=["none","solid","dashed","dotted","double"];function Wt(t){return{top:t,right:t,bottom:t,left:t}}function Xt(t){const e=r=>`${r.width}|${r.style}|${r.color}`,n=e(t.top);return e(t.right)===n&&e(t.bottom)===n&&e(t.left)===n}function pe({value:t,onChange:e,onChangeEnd:n,disabled:r,recentColors:a,onAddRecentColor:s}){const[c,l]=$.useState(!Xt(t)),u=(d,b)=>{const m={...t.top,...d},i=Wt(m);b?B({onChange:e,onChangeEnd:n},i):N({onChange:e},i)},p=(d,b,m)=>{const i={...t,[d]:{...t[d],...b}};m?B({onChange:e,onChangeEnd:n},i):N({onChange:e},i)};if(!c)return o.jsxs("div",{"data-testid":"border-editor-uniform",style:{display:"flex",gap:6,alignItems:"center"},children:[o.jsx(Y,{testId:"border-color",value:t.top.color,disabled:r,onChange:d=>u({color:d},!1),onChangeEnd:d=>u({color:d},!0),recentColors:a,onAddRecentColor:s}),o.jsx(H,{testId:"border-width",label:"W",value:t.top.width,min:0,disabled:r,onChange:d=>u({width:d},!1),onChangeEnd:d=>u({width:d},!0),style:{width:64}}),o.jsx(ut,{className:"vgai-select","data-testid":"border-style",value:t.top.style,disabled:r,"data-dynamic":r||void 0,onChange:d=>u({style:d.target.value},!0),style:{flex:1},children:bt.map(d=>o.jsx("option",{value:d,children:d},d))}),o.jsx(L,{type:"button","data-testid":"border-expand",title:"Per-side borders","aria-label":"Edit borders per side",onClick:()=>l(!0),variant:"ghost",size:"compact",children:o.jsx(X,{icon:ft})})]});const h=[{key:"top",label:"T"},{key:"right",label:"R"},{key:"bottom",label:"B"},{key:"left",label:"L"}];return o.jsxs("div",{"data-testid":"border-editor-expanded",style:{display:"flex",flexDirection:"column",gap:4},children:[o.jsxs("div",{style:{display:"flex",alignItems:"center",gap:4},children:[o.jsx("span",{style:{fontSize:10,color:v.textMuted},children:"Per-side"}),o.jsx("div",{style:{flex:1}}),o.jsx(L,{type:"button",variant:"primary",size:"compact","data-testid":"border-collapse",title:"Uniform border","aria-label":"Use one border for all sides",onClick:()=>l(!1),children:o.jsx(X,{icon:ft})})]}),h.map(({key:d,label:b})=>o.jsxs("div",{style:{display:"flex",gap:4,alignItems:"center"},children:[o.jsx("span",{style:{fontSize:10,color:v.textMuted,width:10,textAlign:"center"},children:b}),o.jsx(Y,{testId:`border-${d}-color`,value:t[d].color,disabled:r,onChange:m=>p(d,{color:m},!1),onChangeEnd:m=>p(d,{color:m},!0),recentColors:a,onAddRecentColor:s}),o.jsx(H,{testId:`border-${d}-width`,label:"",value:t[d].width,min:0,disabled:r,onChange:m=>p(d,{width:m},!1),onChangeEnd:m=>p(d,{width:m},!0),style:{width:48}}),o.jsx(ut,{className:"vgai-select","data-testid":`border-${d}-style`,value:t[d].style,disabled:r,"data-density":"compact","data-dynamic":r||void 0,onChange:m=>p(d,{style:m.target.value},!0),style:{flex:1},children:bt.map(m=>o.jsx("option",{value:m,children:m},m))})]},d))]})}function Vt(t){return{topLeft:t,topRight:t,bottomLeft:t,bottomRight:t}}function Yt(t){return t.topLeft===t.topRight&&t.topRight===t.bottomLeft&&t.bottomLeft===t.bottomRight}function ue({value:t,onChange:e,onChangeEnd:n,disabled:r}){const[a,s]=$.useState(!Yt(t)),c=(p,h)=>{const d=Vt(p);h?B({onChange:e,onChangeEnd:n},d):N({onChange:e},d)},l=(p,h,d)=>{const b={...t,[p]:h};d?B({onChange:e,onChangeEnd:n},b):N({onChange:e},b)};if(!a)return o.jsxs("div",{"data-testid":"border-radius-editor-uniform",style:{display:"flex",gap:4,alignItems:"center"},children:[o.jsx(H,{testId:"border-radius",label:o.jsx(X,{icon:it,label:"Radius"}),value:t.topLeft,min:0,disabled:r,onChange:p=>c(p,!1),onChangeEnd:p=>c(p,!0),style:{flex:1}}),o.jsx(L,{type:"button","data-testid":"border-radius-expand",title:"Independent corners","aria-label":"Edit radius per corner",onClick:()=>s(!0),variant:"ghost",size:"compact",children:o.jsx(X,{icon:it})})]});const u=[{key:"topLeft",label:"TL"},{key:"topRight",label:"TR"},{key:"bottomLeft",label:"BL"},{key:"bottomRight",label:"BR"}];return o.jsxs("div",{"data-testid":"border-radius-editor-expanded",children:[o.jsxs("div",{style:{display:"flex",alignItems:"center",gap:4,marginBottom:4},children:[o.jsx("span",{style:{fontSize:10,color:v.textMuted},children:"Corners"}),o.jsx("div",{style:{flex:1}}),o.jsx(L,{type:"button",variant:"primary",size:"compact","data-testid":"border-radius-collapse",title:"Uniform radius","aria-label":"Use one radius for all corners",onClick:()=>s(!1),children:o.jsx(X,{icon:it})})]}),o.jsx("div",{style:{display:"grid",gridTemplateColumns:"1fr 1fr",gap:3},children:u.map(({key:p,label:h})=>o.jsx(H,{testId:`border-radius-${p}`,label:h,value:t[p],min:0,disabled:r,onChange:d=>l(p,d,!1),onChangeEnd:d=>l(p,d,!0)},p))})]})}const ot=[{name:"blur",unit:"px",min:0,max:50,step:.5,default:0},{name:"brightness",unit:"%",min:0,max:300,step:1,default:100},{name:"contrast",unit:"%",min:0,max:300,step:1,default:100},{name:"saturate",unit:"%",min:0,max:300,step:1,default:100},{name:"grayscale",unit:"%",min:0,max:100,step:1,default:0},{name:"hue-rotate",unit:"deg",min:0,max:360,step:1,default:0}];function fe(t){return!t||t==="none"?ot.map(e=>({name:e.name,value:e.default})):ot.map(e=>{const n=new RegExp(`${e.name}\\(([\\d.]+)${e.unit}?\\)`),r=t.match(n);return{name:e.name,value:r?.[1]?Number.parseFloat(r[1]):e.default}})}function he(t){const e=[];for(let n=0;n<t.length;n++){const r=t[n],a=ot[n];r&&a&&r.value!==a.default&&e.push(`${r.name}(${r.value}${a.unit})`)}return e.length?e.join(" "):"none"}function me({value:t,onChange:e,onChangeEnd:n,disabled:r,label:a="Filter",testId:s="filter-editor"}){const c=(l,u,p)=>{const h=t.map((d,b)=>b===l?{...d,value:u}:d);p?B({onChange:e,onChangeEnd:n},h):N({onChange:e},h)};return o.jsxs("div",{"data-testid":s,children:[o.jsx("div",{style:{fontSize:9,color:v.textMuted,marginBottom:4},children:a}),t.map((l,u)=>{const p=ot[u];return p?o.jsx("div",{"data-testid":`filter-row-${l.name}`,style:{marginBottom:3},children:o.jsx(H,{testId:`filter-${l.name}`,label:l.name.replace("hue-rotate","hue"),value:l.value,unit:p.unit,min:p.min,max:p.max,step:p.step,disabled:r,onChange:h=>c(u,h,!1),onChangeEnd:h=>c(u,h,!0)})},l.name):null})]})}const W=28,yt=10;function ge({value:t,onChange:e,disabled:n,fonts:r,testId:a="font-picker"}){const[s,c]=$.useState(!1),[l,u]=$.useState(""),[p,h]=$.useState(0),d=$.useRef(null),b=$.useRef(null);$.useEffect(()=>{s&&b.current?.focus()},[s]),$.useEffect(()=>{if(!s)return;const S=w=>{d.current&&!d.current.contains(w.target)&&c(!1)};return document.addEventListener("mousedown",S),()=>document.removeEventListener("mousedown",S)},[s]),$.useEffect(()=>{if(!s)return;const S=w=>{w.key==="Escape"&&c(!1)};return document.addEventListener("keydown",S),()=>document.removeEventListener("keydown",S)},[s]);const m=$.useMemo(()=>{if(!l)return r;const S=l.toLowerCase();return r.filter(w=>w.toLowerCase().includes(S))},[r,l]),i=m.length*W,f=Math.floor(p/W),g=Math.min(m.length,f+yt+2),k=m.slice(f,g),C=S=>{e(S),c(!1),u("")},z=t.replace(/^["']|["']$/g,"");return o.jsxs("div",{ref:d,"data-testid":a,style:{position:"relative",flex:1},children:[o.jsxs(L,{type:"button",variant:"secondary",className:"vgai-field-trigger","aria-haspopup":"listbox","aria-expanded":s,disabled:n,"data-testid":"font-picker-input",onClick:()=>{n||c(S=>!S)},children:[o.jsx("span",{style:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:z||"—"}),o.jsx(Bt,{direction:"down",tone:"muted",style:{marginLeft:4}})]}),s&&o.jsxs(wt,{"data-testid":"font-picker-dropdown",style:{position:"absolute",top:"100%",left:0,right:0,zIndex:"var(--vgai-z-dropdown)",marginTop:2},children:[o.jsx("div",{style:{padding:4},children:o.jsx(pt,{ref:b,type:"text","data-testid":"font-picker-search",value:l,onChange:S=>{u(S.target.value),h(0)},placeholder:"Search fonts…","data-density":"compact",style:{width:"100%",boxSizing:"border-box"}})}),o.jsx("div",{"data-testid":"font-picker-list",onScroll:S=>h(S.target.scrollTop),style:{maxHeight:yt*W,overflowY:"auto"},children:o.jsx("div",{style:{height:i,position:"relative"},children:k.map((S,w)=>{const E=f+w,T=S.toLowerCase()===z.toLowerCase();return o.jsx("div",{"data-testid":`font-picker-option-${S}`,onClick:()=>C(S),style:{position:"absolute",top:E*W,left:0,right:0,height:W,display:"flex",alignItems:"center",padding:"0 8px",cursor:"pointer",fontSize:12,background:T?v.accent:"transparent",color:T?v.onAccent:v.text},children:o.jsx("span",{style:{overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:S})},S)})})}),m.length===0&&o.jsx("div",{style:{padding:"8px 12px",color:v.textMuted,fontSize:10,textAlign:"center"},children:"No matching fonts"})]})]})}function qt(t){const e=t.stops.map(n=>`${n.color} ${Math.round(n.position*100)}%`).join(", ");return t.type==="radial"?`radial-gradient(circle, ${e})`:`linear-gradient(${t.angle}deg, ${e})`}function Qt(t){const e=t.match(/^linear-gradient\((.+)\)$/);if(e?.[1]!==void 0)return{type:"linear",inner:e[1]};const n=t.match(/^radial-gradient\((.+)\)$/);return n?.[1]!==void 0?{type:"radial",inner:n[1]}:null}function Jt(t){const e=t.match(/^(\d+)deg\s*,\s*/);if(e)return{angle:Number.parseInt(e[1]??"180",10),colorPart:t.slice(e[0].length)};if(t.startsWith("to ")){const n=t.match(/^to\s+\w+\s*,\s*/);if(n)return{angle:180,colorPart:t.slice(n[0].length)}}return{angle:180,colorPart:t}}function Zt(t){const e=t.split(/,\s*(?![^(]*\))/).map(n=>{const r=n.trim(),a=r.match(/\s+(\d+)%$/),s=a?Number.parseInt(a[1]??"0",10)/100:-1;return{color:a?r.slice(0,-a[0].length).trim():r,position:s}});for(let n=0;n<e.length;n++){const r=e[n];r&&r.position<0&&(r.position=e.length>1?n/(e.length-1):0)}return e}function xe(t){if(!t||t==="none")return null;const e=Qt(t);if(!e)return null;const{angle:n,colorPart:r}=e.type==="linear"?Jt(e.inner):{angle:180,colorPart:e.inner},a=Zt(r);return a.length<2?null:{type:e.type,angle:n,stops:a}}function dt({stops:t,selected:e,onSelect:n,onMove:r,disabled:a,testIdPrefix:s}){return o.jsx("div",{style:{position:"relative",height:12,marginTop:2},children:t.map((c,l)=>o.jsx("div",{"data-testid":`${s}-${l}`,onClick:()=>n(l),onMouseDown:u=>{if(a)return;u.preventDefault(),n(l);const h=u.target.parentElement?.getBoundingClientRect(),d=i=>h?.width?Math.max(0,Math.min(1,(i-h.left)/h.width)):c.position,b=i=>r(l,d(i.clientX),!1),m=i=>{r(l,d(i.clientX),!0),window.removeEventListener("mousemove",b),window.removeEventListener("mouseup",m)};window.addEventListener("mousemove",b),window.addEventListener("mouseup",m)},style:{position:"absolute",left:`${c.position*100}%`,top:0,width:10,height:10,borderRadius:"50%",background:c.css,border:`2px solid ${l===e?v.accent:"#fff"}`,transform:"translateX(-50%)",cursor:a?"not-allowed":"pointer"}},l))})}function be({value:t,onChange:e,onChangeEnd:n,disabled:r,recentColors:a,onAddRecentColor:s,testId:c="gradient-editor"}){const[l,u]=$.useState(0),p=(f,g)=>{g?B({onChange:e,onChangeEnd:n},f):N({onChange:e},f)},h=(f,g,k)=>{const C=t.stops.map((z,S)=>S===f?{...z,...g}:z);p({...t,stops:C},k)},d=()=>{const f=t.stops[t.stops.length-1]?.position??1,g=t.stops[0]?.position??0,k=(f+g)/2,C=[...t.stops,{color:"#888888",position:k}].sort((z,S)=>z.position-S.position);u(C.length-1),p({...t,stops:C},!0)},b=f=>{if(t.stops.length<=2)return;const g=t.stops.filter((k,C)=>C!==f);u(Math.min(l,g.length-1)),p({...t,stops:g},!0)},m=t.stops[l]?.color??"#000000",i=m.startsWith("#")?m:Mt(m);return o.jsxs("div",{"data-testid":c,children:[o.jsxs("div",{style:{position:"relative",marginBottom:8},children:[o.jsx("div",{"data-testid":"gradient-preview",style:{height:20,borderRadius:v.radiusSmall,border:`1px solid ${v.border}`,background:qt(t)}}),o.jsx(dt,{stops:t.stops.map(f=>({position:f.position,css:f.color})),selected:l,onSelect:u,onMove:(f,g,k)=>h(f,{position:g},k),disabled:r,testIdPrefix:"gradient-stop"})]}),o.jsxs("div",{style:{display:"flex",alignItems:"center",gap:6,marginBottom:4},children:[o.jsx(Y,{testId:"gradient-selected-color",value:i,disabled:r,onChange:f=>h(l,{color:f},!1),onChangeEnd:f=>h(l,{color:f},!0),recentColors:a,onAddRecentColor:s}),o.jsxs("span",{style:{fontSize:9,color:v.textMuted},children:["Stop ",l+1]}),t.stops.length>2&&o.jsx(L,{type:"button",variant:"ghost",size:"compact","aria-label":"Remove gradient stop","data-testid":"gradient-remove-stop",onClick:()=>b(l),children:"×"}),o.jsx(L,{type:"button",variant:"ghost",size:"compact","data-testid":"gradient-add-stop",onClick:d,children:"+ stop"})]}),o.jsxs("div",{style:{display:"flex",gap:6,alignItems:"center"},children:[o.jsxs("div",{style:{display:"flex",gap:1,flex:1},children:[o.jsx(ht,{testId:"gradient-type-linear",label:"Linear",active:t.type==="linear",disabled:r,onClick:()=>p({...t,type:"linear"},!0)}),o.jsx(ht,{testId:"gradient-type-radial",label:"Radial",active:t.type==="radial",disabled:r,onClick:()=>p({...t,type:"radial"},!0)})]}),t.type==="linear"&&o.jsx(H,{testId:"gradient-angle",label:"°",value:t.angle,unit:"deg",disabled:r,onChange:f=>p({...t,angle:f},!1),onChangeEnd:f=>p({...t,angle:f},!0),style:{width:70}})]})]})}function jt(t){const e=n=>Math.round(Math.max(0,Math.min(1,n))*255).toString(16).padStart(2,"0");return`#${e(t.r)}${e(t.g)}${e(t.b)}`}function vt(t){return{r:Number.parseInt(t.slice(1,3),16)/255,g:Number.parseInt(t.slice(3,5),16)/255,b:Number.parseInt(t.slice(5,7),16)/255}}function tt(t,e,n){if(t.length===0)return;if(e<=t[0].pos)return t[0].value;const r=t[t.length-1];if(e>=r.pos)return r.value;for(let a=0;a+1<t.length;a++){const s=t[a],c=t[a+1];if(e>=s.pos&&e<=c.pos){const l=c.pos>s.pos?(e-s.pos)/(c.pos-s.pos):0;return n(s.value,c.value,l)}}return r.value}const V=(t,e,n)=>t+(e-t)*n,$t=(t,e,n)=>({r:V(t.r,e.r,n),g:V(t.g,e.g,n),b:V(t.b,e.b,n)});function et(t,e,n){const r={...t[e],pos:n},a=[...t.filter((s,c)=>c!==e),r].sort((s,c)=>s.pos-c.pos);return{keys:a,index:a.indexOf(r)}}function ye({value:t,onChange:e,onChangeEnd:n,disabled:r,testId:a="quarks-gradient"}){const[s,c]=$.useState({track:"color",i:0}),l=(i,f)=>{f?B({onChange:e,onChangeEnd:n},i):N({onChange:e},i)},u=i=>({...t,color:{...t.color,keys:i}}),p=i=>({...t,alpha:{...t.alpha,keys:i}}),d=[...new Set([...t.color.keys.map(i=>i.pos),...t.alpha.keys.map(i=>i.pos)])].sort((i,f)=>i-f).map(i=>{const f=tt(t.color.keys,i,$t)??{r:1,g:1,b:1},g=tt(t.alpha.keys,i,V)??1;return`rgba(${Math.round(f.r*255)},${Math.round(f.g*255)},${Math.round(f.b*255)},${Math.round(g*1e3)/1e3}) ${Math.round(i*100)}%`}).join(", "),b=t.color.keys[s.track==="color"?s.i:0],m=t.alpha.keys[s.track==="alpha"?s.i:0];return o.jsxs("div",{"data-testid":a,children:[o.jsx(dt,{stops:t.alpha.keys.map(i=>{const f=Math.round(Math.max(0,Math.min(1,i.value))*255);return{position:i.pos,css:`rgb(${f},${f},${f})`}}),selected:s.track==="alpha"?s.i:-1,onSelect:i=>c({track:"alpha",i}),onMove:(i,f,g)=>{const{keys:k,index:C}=et(t.alpha.keys,i,f);c({track:"alpha",i:C}),l(p(k),g)},disabled:r,testIdPrefix:`${a}-alpha-stop`}),o.jsx("div",{"data-testid":`${a}-preview`,style:{height:20,borderRadius:v.radiusSmall,border:`1px solid ${v.border}`,backgroundImage:`linear-gradient(90deg, ${d}), repeating-linear-gradient(45deg, #777 0 5px, #aaa 5px 10px)`}}),o.jsx(dt,{stops:t.color.keys.map(i=>({position:i.pos,css:jt(i.value)})),selected:s.track==="color"?s.i:-1,onSelect:i=>c({track:"color",i}),onMove:(i,f,g)=>{const{keys:k,index:C}=et(t.color.keys,i,f);c({track:"color",i:C}),l(u(k),g)},disabled:r,testIdPrefix:`${a}-color-stop`}),s.track==="color"&&b&&o.jsxs("div",{style:{display:"flex",alignItems:"center",gap:6,marginTop:4},children:[o.jsx(Y,{testId:`${a}-color-swatch`,value:jt(b.value),disabled:r,onChange:i=>l(u(t.color.keys.map((f,g)=>g===s.i?{...f,value:vt(i)}:f)),!1),onChangeEnd:i=>l(u(t.color.keys.map((f,g)=>g===s.i?{...f,value:vt(i)}:f)),!0)}),o.jsxs("span",{style:{fontSize:9,color:v.textMuted},children:["Color ",s.i+1,"/",t.color.keys.length]}),t.color.keys.length>2&&o.jsx(L,{type:"button",variant:"ghost",size:"compact","aria-label":"Remove color stop","data-testid":`${a}-remove-color-stop`,onClick:()=>{const i=t.color.keys.filter((f,g)=>g!==s.i);c({track:"color",i:Math.min(s.i,i.length-1)}),l(u(i),!0)},children:"×"}),o.jsx(L,{type:"button",variant:"ghost",size:"compact","data-testid":`${a}-add-color-stop`,onClick:()=>{const f=tt(t.color.keys,.5,$t)??{r:1,g:1,b:1},{keys:g,index:k}=et([...t.color.keys,{value:f,pos:.5}],t.color.keys.length,.5);c({track:"color",i:k}),l(u(g),!0)},children:"+ stop"})]}),s.track==="alpha"&&m&&o.jsxs("div",{style:{display:"flex",alignItems:"center",gap:6,marginTop:4},children:[o.jsx(Dt,{label:"a",step:.05,testId:`${a}-alpha-value`,value:Math.round(m.value*1e3)/1e3,onChange:i=>l(p(t.alpha.keys.map((f,g)=>g===s.i?{...f,value:Math.max(0,Math.min(1,i))}:f)),!1),onChangeEnd:i=>l(p(t.alpha.keys.map((f,g)=>g===s.i?{...f,value:Math.max(0,Math.min(1,i))}:f)),!0)}),o.jsxs("span",{style:{fontSize:9,color:v.textMuted},children:["Alpha ",s.i+1,"/",t.alpha.keys.length]}),t.alpha.keys.length>2&&o.jsx(L,{type:"button",variant:"ghost",size:"compact","aria-label":"Remove alpha stop","data-testid":`${a}-remove-alpha-stop`,onClick:()=>{const i=t.alpha.keys.filter((f,g)=>g!==s.i);c({track:"alpha",i:Math.min(s.i,i.length-1)}),l(p(i),!0)},children:"×"}),o.jsx(L,{type:"button",variant:"ghost",size:"compact","data-testid":`${a}-add-alpha-stop`,onClick:()=>{const f=tt(t.alpha.keys,.5,V)??1,{keys:g,index:k}=et([...t.alpha.keys,{value:f,pos:.5}],t.alpha.keys.length,.5);c({track:"alpha",i:k}),l(p(g),!0)},children:"+ stop"})]})]})}const te={x:0,y:4,blur:8,spread:0,color:"rgba(0,0,0,0.25)",inset:!1,enabled:!0},ee={x:0,y:2,blur:4,spread:0,color:"rgba(0,0,0,0.3)",inset:!1,enabled:!0};function ne(t,e){return(e?[t.inset?"inset":"",`${t.x}px`,`${t.y}px`,`${t.blur}px`,`${t.spread}px`,t.color]:[`${t.x}px`,`${t.y}px`,`${t.blur}px`,t.color]).filter(Boolean).join(" ")}function je(t,e=!0){const n=t.filter(r=>r.enabled);return n.length===0?"none":n.map(r=>ne(r,e)).join(", ")}function re(t){const e=t.match(/(rgba?\([^)]+\))/);if(e?.[1])return{color:e[1],nums:t.replace(e[1],"").trim()};const n=t.match(/(#[0-9a-fA-F]{3,8})/);return n?.[1]?{color:n[1],nums:t.replace(n[1],"").trim()}:{color:"#000000",nums:t}}function oe(t,e){if(!t||t==="none")return null;const n=t.trim(),r=e&&n.startsWith("inset"),a=r?n.slice(5).trim():n,{color:s,nums:c}=re(a),l=c.split(/\s+/).map(u=>Number.parseFloat(u)).filter(u=>!Number.isNaN(u));return e?{inset:r,x:l[0]??0,y:l[1]??0,blur:l[2]??0,spread:l[3]??0,color:s}:l.length<2?null:{inset:!1,x:l[0]??0,y:l[1]??0,blur:l[2]??0,spread:0,color:s}}function ve(t,e=!0){if(!t||t==="none")return[];const n=t.split(/,\s*(?![^(]*\))/),r=[];for(const a of n){const s=oe(a.trim(),e);s&&r.push({...s,enabled:!0})}return r}function Rt({value:t,onChange:e,onChangeEnd:n,disabled:r,withSpreadInset:a=!0,label:s="Shadow",testId:c="shadow-editor",recentColors:l,onAddRecentColor:u}){const p=(m,i)=>{i?B({onChange:e,onChangeEnd:n},m):N({onChange:e},m)},h=(m,i,f=!1)=>{p(t.map((g,k)=>k===m?{...g,...i}:g),f)},d=m=>{p(t.filter((i,f)=>f!==m),!0)},b=()=>{p([...t,{...a?te:ee}],!0)};return o.jsxs("div",{"data-testid":c,children:[o.jsxs("div",{style:{display:"flex",alignItems:"center",gap:6,marginBottom:t.length>0?4:0},children:[o.jsx("span",{style:{fontSize:9,color:v.textMuted},children:s}),o.jsx("div",{style:{flex:1}}),!r&&o.jsx(L,{type:"button",variant:"ghost",size:"compact","data-testid":`${c}-add`,onClick:b,children:"+"})]}),t.map((m,i)=>{const f=m.color.startsWith("#")?m.color:Mt(m.color);return o.jsxs("div",{"data-testid":`${c}-row-${i}`,style:{marginBottom:6,padding:"4px 0",borderBottom:`1px solid ${v.border}`},children:[o.jsxs("div",{style:{display:"flex",alignItems:"center",gap:4,marginBottom:4},children:[o.jsx(L,{type:"button",variant:"ghost",size:"compact","aria-pressed":m.enabled,"data-testid":`${c}-toggle-${i}`,onClick:()=>{r||h(i,{enabled:!m.enabled},!0)},children:m.enabled?"●":"○"}),o.jsx(Y,{testId:`${c}-color-${i}`,value:f,disabled:r,onChange:g=>h(i,{color:g}),onChangeEnd:g=>h(i,{color:g},!0),recentColors:l,onAddRecentColor:u}),a&&o.jsxs("label",{style:{display:"flex",alignItems:"center",gap:2,fontSize:8,color:v.textMuted,cursor:"pointer"},children:[o.jsx(Ft,{className:"vgai-checkbox","data-testid":`${c}-inset-${i}`,checked:m.inset,disabled:r,onChange:g=>h(i,{inset:g.target.checked},!0)}),"in"]}),o.jsx("div",{style:{flex:1}}),!r&&o.jsx(L,{type:"button",variant:"ghost",size:"compact","aria-label":`Remove ${s.toLowerCase()} ${i+1}`,"data-testid":`${c}-remove-${i}`,onClick:()=>d(i),children:"×"})]}),m.enabled&&o.jsxs("div",{style:{display:"flex",gap:4},children:[o.jsx(H,{label:"X",value:m.x,disabled:r,onChange:g=>h(i,{x:g}),onChangeEnd:g=>h(i,{x:g},!0),style:{flex:1}}),o.jsx(H,{label:"Y",value:m.y,disabled:r,onChange:g=>h(i,{y:g}),onChangeEnd:g=>h(i,{y:g},!0),style:{flex:1}}),o.jsx(H,{label:"B",value:m.blur,min:0,disabled:r,onChange:g=>h(i,{blur:Math.max(0,g)}),onChangeEnd:g=>h(i,{blur:Math.max(0,g)},!0),style:{flex:1}}),a&&o.jsx(H,{label:"S",value:m.spread,disabled:r,onChange:g=>h(i,{spread:g}),onChangeEnd:g=>h(i,{spread:g},!0),style:{flex:1}})]})]},i)})]})}function $e(t){return o.jsx(Rt,{...t,withSpreadInset:!0,testId:"box-shadow-editor",label:t.label??"Shadow"})}function we(t){return o.jsx(Rt,{...t,withSpreadInset:!1,testId:"text-shadow-editor",label:t.label??"Text Shadow"})}export{ce as A,pe as B,Y as C,te as D,me as F,be as G,ye as Q,H as S,we as T,ue as a,fe as b,qt as c,he as d,ve as e,$e as f,je as g,ge as h,Xt as i,Yt as j,de as k,Gt as l,ee as m,dt as n,Rt as o,xe as p,Vt as q,Wt as u};
@@ -0,0 +1 @@
1
+ import{V as x,g as G,a0 as S,C as _,aB as H,aY as N}from"./three.module-D396a9Mn.js";import{dn as P}from"./index-GIL7oGEO.js";import"./index-nmcBqr7Y.js";import"./_commonjsHelpers-D6-XlEtG.js";import"./index-D_NuPfjr.js";import"./jsx-runtime-DPjLkJKQ.js";import"./index-CtzuWnCS.js";import"./index-CinJrH5C.js";import"./index-FUuS4qwW.js";import"./client-DNXj_opT.js";const z=new x,M=new x;class st{modify(t,o){t=t.clone(),delete t.morphAttributes.position,delete t.morphAttributes.normal;const n=t.attributes;for(const i in n)i!=="position"&&i!=="uv"&&i!=="normal"&&i!=="tangent"&&i!=="color"&&t.deleteAttribute(i);t=P(t);const l=[],s=[],p=t.getAttribute("position"),c=t.getAttribute("uv"),b=t.getAttribute("normal"),h=t.getAttribute("tangent"),A=t.getAttribute("color");let m=null,C=null,V=null,E=null;for(let i=0;i<p.count;i++){const r=new x().fromBufferAttribute(p,i);c&&(C=new G().fromBufferAttribute(c,i)),b&&(V=new x().fromBufferAttribute(b,i)),h&&(m=new S().fromBufferAttribute(h,i)),A&&(E=new _().fromBufferAttribute(A,i));const u=new K(r,C,V,m,E);l.push(u)}let a=t.getIndex();if(a!==null)for(let i=0;i<a.count;i+=3){const r=a.getX(i),u=a.getX(i+1),d=a.getX(i+2),B=new T(l[r],l[u],l[d],r,u,d);s.push(B)}else for(let i=0;i<p.count;i+=3){const r=i,u=i+1,d=i+2,B=new T(l[r],l[u],l[d],r,u,d);s.push(B)}for(let i=0,r=l.length;i<r;i++)X(l[i]);let w,k=o;for(;k--;){if(w=J(l),!w){console.log("THREE.SimplifyModifier: No next vertex");break}D(l,s,w,w.collapseNeighbor)}const f=new H,F=[],q=[],v=[],U=[],I=[];a=[];for(let i=0;i<l.length;i++){const r=l[i];F.push(r.position.x,r.position.y,r.position.z),r.uv&&q.push(r.uv.x,r.uv.y),r.normal&&v.push(r.normal.x,r.normal.y,r.normal.z),r.tangent&&U.push(r.tangent.x,r.tangent.y,r.tangent.z,r.tangent.w),r.color&&I.push(r.color.r,r.color.g,r.color.b),r.id=i}for(let i=0;i<s.length;i++){const r=s[i];a.push(r.v1.id,r.v2.id,r.v3.id)}return f.setAttribute("position",new N(F,3)),q.length>0&&f.setAttribute("uv",new N(q,2)),v.length>0&&f.setAttribute("normal",new N(v,3)),U.length>0&&f.setAttribute("tangent",new N(U,4)),I.length>0&&f.setAttribute("color",new N(I,3)),f.setIndex(a),f}}function R(e,t){e.indexOf(t)===-1&&e.push(t)}function g(e,t){const o=e.indexOf(t);o>-1&&e.splice(o,1)}function Y(e,t){const o=t.position.distanceTo(e.position);let n=0;const l=[];for(let c=0,b=e.faces.length;c<b;c++){const h=e.faces[c];h.hasVertex(t)&&l.push(h)}for(let c=0,b=e.faces.length;c<b;c++){let h=1;const A=e.faces[c];for(let m=0;m<l.length;m++){const C=l[m],V=A.normal.dot(C.normal);h=Math.min(h,(1.001-V)/2)}n=Math.max(n,h)}const s=0;return l.length<2&&(n=1),o*n+s}function X(e){if(e.neighbors.length===0){e.collapseNeighbor=null,e.collapseCost=-.01;return}e.collapseCost=1e5,e.collapseNeighbor=null;for(let t=0;t<e.neighbors.length;t++){const o=Y(e,e.neighbors[t]);e.collapseNeighbor||(e.collapseNeighbor=e.neighbors[t],e.collapseCost=o,e.minCost=o,e.totalCost=0,e.costCount=0),e.costCount++,e.totalCost+=o,o<e.minCost&&(e.collapseNeighbor=e.neighbors[t],e.minCost=o)}e.collapseCost=e.totalCost/e.costCount}function O(e,t){for(console.assert(e.faces.length===0);e.neighbors.length;){const o=e.neighbors.pop();g(o.neighbors,e)}g(t,e)}function j(e,t){g(t,e),e.v1&&g(e.v1.faces,e),e.v2&&g(e.v2.faces,e),e.v3&&g(e.v3.faces,e);const o=[e.v1,e.v2,e.v3];for(let n=0;n<3;n++){const l=o[n],s=o[(n+1)%3];!l||!s||(l.removeIfNonNeighbor(s),s.removeIfNonNeighbor(l))}}function D(e,t,o,n){if(!n){O(o,e);return}n.uv&&o.uv.copy(n.uv),n.normal&&n.normal.add(o.normal).normalize(),n.tangent&&n.tangent.add(o.tangent).normalize();const l=[];for(let s=0;s<o.neighbors.length;s++)l.push(o.neighbors[s]);for(let s=o.faces.length-1;s>=0;s--)o.faces[s]&&o.faces[s].hasVertex(n)&&j(o.faces[s],t);for(let s=o.faces.length-1;s>=0;s--)o.faces[s].replaceVertex(o,n);O(o,e);for(let s=0;s<l.length;s++)X(l[s])}function J(e){let t=e[0];for(let o=0;o<e.length;o++)e[o].collapseCost<t.collapseCost&&(t=e[o]);return t}class T{constructor(t,o,n,l,s,p){this.a=l,this.b=s,this.c=p,this.v1=t,this.v2=o,this.v3=n,this.normal=new x,this.computeNormal(),t.faces.push(this),t.addUniqueNeighbor(o),t.addUniqueNeighbor(n),o.faces.push(this),o.addUniqueNeighbor(t),o.addUniqueNeighbor(n),n.faces.push(this),n.addUniqueNeighbor(t),n.addUniqueNeighbor(o)}computeNormal(){const t=this.v1.position,o=this.v2.position,n=this.v3.position;z.subVectors(n,o),M.subVectors(t,o),z.cross(M).normalize(),this.normal.copy(z)}hasVertex(t){return t===this.v1||t===this.v2||t===this.v3}replaceVertex(t,o){t===this.v1?this.v1=o:t===this.v2?this.v2=o:t===this.v3&&(this.v3=o),g(t.faces,this),o.faces.push(this),t.removeIfNonNeighbor(this.v1),this.v1.removeIfNonNeighbor(t),t.removeIfNonNeighbor(this.v2),this.v2.removeIfNonNeighbor(t),t.removeIfNonNeighbor(this.v3),this.v3.removeIfNonNeighbor(t),this.v1.addUniqueNeighbor(this.v2),this.v1.addUniqueNeighbor(this.v3),this.v2.addUniqueNeighbor(this.v1),this.v2.addUniqueNeighbor(this.v3),this.v3.addUniqueNeighbor(this.v1),this.v3.addUniqueNeighbor(this.v2),this.computeNormal()}}class K{constructor(t,o,n,l,s){this.position=t,this.uv=o,this.normal=n,this.tangent=l,this.color=s,this.id=-1,this.faces=[],this.neighbors=[],this.collapseCost=0,this.collapseNeighbor=null}addUniqueNeighbor(t){R(this.neighbors,t)}removeIfNonNeighbor(t){const o=this.neighbors,n=this.faces,l=o.indexOf(t);if(l!==-1){for(let s=0;s<n.length;s++)if(n[s].hasVertex(t))return;o.splice(l,1)}}}export{st as SimplifyModifier};
@@ -0,0 +1 @@
1
+ import{V as k,a as F,Q as g,A,b as W,c as T,d as q,S as O}from"./three.module-D396a9Mn.js";function v(r,t){return t.getBoneName!==void 0?t.getBoneName(r):t.names[r.name]}function D(r,t,e={}){const a=new g,u=new k,l=new F,s=new F;e.preserveBoneMatrix=e.preserveBoneMatrix!==void 0?e.preserveBoneMatrix:!0,e.preserveBonePositions=e.preserveBonePositions!==void 0?e.preserveBonePositions:!0,e.useTargetMatrix=e.useTargetMatrix!==void 0?e.useTargetMatrix:!1,e.hip=e.hip!==void 0?e.hip:"hip",e.hipInfluence=e.hipInfluence!==void 0?e.hipInfluence:new k(1,1,1),e.scale=e.scale!==void 0?e.scale:1,e.names=e.names||{};const o=t.isObject3D?t.skeleton.bones:b(t),c=r.isObject3D?r.skeleton.bones:b(r);let i,d,m,x;if(r.isObject3D?r.skeleton.pose():(e.useTargetMatrix=!0,e.preserveBoneMatrix=!1),e.preserveBonePositions){x=[];for(let n=0;n<c.length;n++)x.push(c[n].position.clone())}if(e.preserveBoneMatrix){r.updateMatrixWorld(),r.matrixWorld.identity();for(let n=0;n<r.children.length;++n)r.children[n].updateMatrixWorld(!0)}for(let n=0;n<c.length;++n)i=c[n],d=v(i,e),m=w(d,o),s.copy(i.matrixWorld),m&&(m.updateMatrixWorld(),e.useTargetMatrix?l.copy(m.matrixWorld):(l.copy(r.matrixWorld).invert(),l.multiply(m.matrixWorld)),u.setFromMatrixScale(l),l.scale(u.set(1/u.x,1/u.y,1/u.z)),s.makeRotationFromQuaternion(a.setFromRotationMatrix(l)),r.isObject3D&&e.localOffsets&&e.localOffsets[i.name]&&s.multiply(e.localOffsets[i.name]),s.copyPosition(l)),d===e.hip&&(s.elements[12]*=e.scale*e.hipInfluence.x,s.elements[13]*=e.scale*e.hipInfluence.y,s.elements[14]*=e.scale*e.hipInfluence.z,e.hipPosition!==void 0&&(s.elements[12]+=e.hipPosition.x*e.scale,s.elements[13]+=e.hipPosition.y*e.scale,s.elements[14]+=e.hipPosition.z*e.scale)),i.parent?(i.matrix.copy(i.parent.matrixWorld).invert(),i.matrix.multiply(s)):i.matrix.copy(s),i.matrix.decompose(i.position,i.quaternion,i.scale),i.updateMatrixWorld();if(e.preserveBonePositions)for(let n=0;n<c.length;++n)i=c[n],d=v(i,e)||i.name,d!==e.hip&&i.position.copy(x[n]);e.preserveBoneMatrix&&r.updateMatrixWorld(!0)}function S(r,t,e,a={}){a.useFirstFramePosition=a.useFirstFramePosition!==void 0?a.useFirstFramePosition:!1,a.fps=a.fps!==void 0?a.fps:Math.max(...e.tracks.map(f=>f.times.length))/e.duration,a.names=a.names||[],t.isObject3D||(t=j(t));const u=Math.round(e.duration*(a.fps/1e3)*1e3),l=e.duration/(u-1),s=[],o=new A(t),c=b(r.skeleton),i=[];let d,m,x,n,y;o.clipAction(e).play();let p=0,h=u;a.trim!==void 0?(p=Math.round(a.trim[0]*a.fps),h=Math.min(Math.round(a.trim[1]*a.fps),u)-p,o.update(a.trim[0])):o.update(0),t.updateMatrixWorld();for(let f=0;f<h;++f){const B=f*l;D(r,t,a);for(let M=0;M<c.length;++M)m=c[M],y=v(m,a)||m.name,x=w(y,t.skeleton),x&&(n=i[M]=i[M]||{bone:m},a.hip===y&&(n.pos||(n.pos={times:new Float32Array(h),values:new Float32Array(h*3)}),a.useFirstFramePosition&&(f===0&&(d=m.position.clone()),m.position.sub(d)),n.pos.times[f]=B,m.position.toArray(n.pos.values,f*3)),n.quat||(n.quat={times:new Float32Array(h),values:new Float32Array(h*4)}),n.quat.times[f]=B,m.quaternion.toArray(n.quat.values,f*4));f===h-2?o.update(l-1e-7):o.update(l),t.updateMatrixWorld()}for(let f=0;f<i.length;++f)n=i[f],n&&(n.pos&&s.push(new W(".bones["+n.bone.name+"].position",n.pos.times,n.pos.values)),s.push(new T(".bones["+n.bone.name+"].quaternion",n.quat.times,n.quat.values)));return o.uncacheAction(e),new q(e.name,-1,s)}function Q(r){const t=new Map,e=new Map,a=r.clone();return P(r,a,function(u,l){t.set(l,u),e.set(u,l)}),a.traverse(function(u){if(!u.isSkinnedMesh)return;const l=u,s=t.get(u),o=s.skeleton.bones;l.skeleton=s.skeleton.clone(),l.bindMatrix.copy(s.bindMatrix),l.skeleton.bones=o.map(function(c){return e.get(c)}),l.bind(l.skeleton,l.bindMatrix)}),a}function w(r,t){for(let e=0,a=b(t);e<a.length;e++)if(r===a[e].name)return a[e]}function b(r){return Array.isArray(r)?r:r.bones}function j(r){const t=new O(r.bones[0]);return t.skeleton=r,t}function P(r,t,e){e(r,t);for(let a=0;a<r.children.length;a++)P(r.children[a],t.children[a],e)}export{Q as clone,D as retarget,S as retargetClip};
@@ -0,0 +1,154 @@
1
+ import{M as i,h as n,ao as r,U as s,B as c,V as o}from"./three.module-D396a9Mn.js";class t extends i{constructor(){const e=t.SkyShader,a=new n({name:e.name,uniforms:s.clone(e.uniforms),vertexShader:e.vertexShader,fragmentShader:e.fragmentShader,side:r,depthWrite:!1});super(new c(1,1,1),a),this.isSky=!0}}t.SkyShader={name:"SkyShader",uniforms:{turbidity:{value:2},rayleigh:{value:1},mieCoefficient:{value:.005},mieDirectionalG:{value:.8},sunPosition:{value:new o},up:{value:new o(0,1,0)}},vertexShader:`
2
+ uniform vec3 sunPosition;
3
+ uniform float rayleigh;
4
+ uniform float turbidity;
5
+ uniform float mieCoefficient;
6
+ uniform vec3 up;
7
+
8
+ varying vec3 vWorldPosition;
9
+ varying vec3 vSunDirection;
10
+ varying float vSunfade;
11
+ varying vec3 vBetaR;
12
+ varying vec3 vBetaM;
13
+ varying float vSunE;
14
+
15
+ // constants for atmospheric scattering
16
+ const float e = 2.71828182845904523536028747135266249775724709369995957;
17
+ const float pi = 3.141592653589793238462643383279502884197169;
18
+
19
+ // wavelength of used primaries, according to preetham
20
+ const vec3 lambda = vec3( 680E-9, 550E-9, 450E-9 );
21
+ // this pre-calculation replaces older TotalRayleigh(vec3 lambda) function:
22
+ // (8.0 * pow(pi, 3.0) * pow(pow(n, 2.0) - 1.0, 2.0) * (6.0 + 3.0 * pn)) / (3.0 * N * pow(lambda, vec3(4.0)) * (6.0 - 7.0 * pn))
23
+ const vec3 totalRayleigh = vec3( 5.804542996261093E-6, 1.3562911419845635E-5, 3.0265902468824876E-5 );
24
+
25
+ // mie stuff
26
+ // K coefficient for the primaries
27
+ const float v = 4.0;
28
+ const vec3 K = vec3( 0.686, 0.678, 0.666 );
29
+ // MieConst = pi * pow( ( 2.0 * pi ) / lambda, vec3( v - 2.0 ) ) * K
30
+ const vec3 MieConst = vec3( 1.8399918514433978E14, 2.7798023919660528E14, 4.0790479543861094E14 );
31
+
32
+ // earth shadow hack
33
+ // cutoffAngle = pi / 1.95;
34
+ const float cutoffAngle = 1.6110731556870734;
35
+ const float steepness = 1.5;
36
+ const float EE = 1000.0;
37
+
38
+ float sunIntensity( float zenithAngleCos ) {
39
+ zenithAngleCos = clamp( zenithAngleCos, -1.0, 1.0 );
40
+ return EE * max( 0.0, 1.0 - pow( e, -( ( cutoffAngle - acos( zenithAngleCos ) ) / steepness ) ) );
41
+ }
42
+
43
+ vec3 totalMie( float T ) {
44
+ float c = ( 0.2 * T ) * 10E-18;
45
+ return 0.434 * c * MieConst;
46
+ }
47
+
48
+ void main() {
49
+
50
+ vec4 worldPosition = modelMatrix * vec4( position, 1.0 );
51
+ vWorldPosition = worldPosition.xyz;
52
+
53
+ gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );
54
+ gl_Position.z = gl_Position.w; // set z to camera.far
55
+
56
+ vSunDirection = normalize( sunPosition );
57
+
58
+ vSunE = sunIntensity( dot( vSunDirection, up ) );
59
+
60
+ vSunfade = 1.0 - clamp( 1.0 - exp( ( sunPosition.y / 450000.0 ) ), 0.0, 1.0 );
61
+
62
+ float rayleighCoefficient = rayleigh - ( 1.0 * ( 1.0 - vSunfade ) );
63
+
64
+ // extinction (absorption + out scattering)
65
+ // rayleigh coefficients
66
+ vBetaR = totalRayleigh * rayleighCoefficient;
67
+
68
+ // mie coefficients
69
+ vBetaM = totalMie( turbidity ) * mieCoefficient;
70
+
71
+ }`,fragmentShader:`
72
+ varying vec3 vWorldPosition;
73
+ varying vec3 vSunDirection;
74
+ varying float vSunfade;
75
+ varying vec3 vBetaR;
76
+ varying vec3 vBetaM;
77
+ varying float vSunE;
78
+
79
+ uniform float mieDirectionalG;
80
+ uniform vec3 up;
81
+
82
+ // constants for atmospheric scattering
83
+ const float pi = 3.141592653589793238462643383279502884197169;
84
+
85
+ const float n = 1.0003; // refractive index of air
86
+ const float N = 2.545E25; // number of molecules per unit volume for air at 288.15K and 1013mb (sea level -45 celsius)
87
+
88
+ // optical length at zenith for molecules
89
+ const float rayleighZenithLength = 8.4E3;
90
+ const float mieZenithLength = 1.25E3;
91
+ // 66 arc seconds -> degrees, and the cosine of that
92
+ const float sunAngularDiameterCos = 0.999956676946448443553574619906976478926848692873900859324;
93
+
94
+ // 3.0 / ( 16.0 * pi )
95
+ const float THREE_OVER_SIXTEENPI = 0.05968310365946075;
96
+ // 1.0 / ( 4.0 * pi )
97
+ const float ONE_OVER_FOURPI = 0.07957747154594767;
98
+
99
+ float rayleighPhase( float cosTheta ) {
100
+ return THREE_OVER_SIXTEENPI * ( 1.0 + pow( cosTheta, 2.0 ) );
101
+ }
102
+
103
+ float hgPhase( float cosTheta, float g ) {
104
+ float g2 = pow( g, 2.0 );
105
+ float inverse = 1.0 / pow( 1.0 - 2.0 * g * cosTheta + g2, 1.5 );
106
+ return ONE_OVER_FOURPI * ( ( 1.0 - g2 ) * inverse );
107
+ }
108
+
109
+ void main() {
110
+
111
+ vec3 direction = normalize( vWorldPosition - cameraPosition );
112
+
113
+ // optical length
114
+ // cutoff angle at 90 to avoid singularity in next formula.
115
+ float zenithAngle = acos( max( 0.0, dot( up, direction ) ) );
116
+ float inverse = 1.0 / ( cos( zenithAngle ) + 0.15 * pow( 93.885 - ( ( zenithAngle * 180.0 ) / pi ), -1.253 ) );
117
+ float sR = rayleighZenithLength * inverse;
118
+ float sM = mieZenithLength * inverse;
119
+
120
+ // combined extinction factor
121
+ vec3 Fex = exp( -( vBetaR * sR + vBetaM * sM ) );
122
+
123
+ // in scattering
124
+ float cosTheta = dot( direction, vSunDirection );
125
+
126
+ float rPhase = rayleighPhase( cosTheta * 0.5 + 0.5 );
127
+ vec3 betaRTheta = vBetaR * rPhase;
128
+
129
+ float mPhase = hgPhase( cosTheta, mieDirectionalG );
130
+ vec3 betaMTheta = vBetaM * mPhase;
131
+
132
+ vec3 Lin = pow( vSunE * ( ( betaRTheta + betaMTheta ) / ( vBetaR + vBetaM ) ) * ( 1.0 - Fex ), vec3( 1.5 ) );
133
+ Lin *= mix( vec3( 1.0 ), pow( vSunE * ( ( betaRTheta + betaMTheta ) / ( vBetaR + vBetaM ) ) * Fex, vec3( 1.0 / 2.0 ) ), clamp( pow( 1.0 - dot( up, vSunDirection ), 5.0 ), 0.0, 1.0 ) );
134
+
135
+ // nightsky
136
+ float theta = acos( direction.y ); // elevation --> y-axis, [-pi/2, pi/2]
137
+ float phi = atan( direction.z, direction.x ); // azimuth --> x-axis [-pi/2, pi/2]
138
+ vec2 uv = vec2( phi, theta ) / vec2( 2.0 * pi, pi ) + vec2( 0.5, 0.0 );
139
+ vec3 L0 = vec3( 0.1 ) * Fex;
140
+
141
+ // composition + solar disc
142
+ float sundisk = smoothstep( sunAngularDiameterCos, sunAngularDiameterCos + 0.00002, cosTheta );
143
+ L0 += ( vSunE * 19000.0 * Fex ) * sundisk;
144
+
145
+ vec3 texColor = ( Lin + L0 ) * 0.04 + vec3( 0.0, 0.0003, 0.00075 );
146
+
147
+ vec3 retColor = pow( texColor, vec3( 1.0 / ( 1.2 + ( 1.2 * vSunfade ) ) ) );
148
+
149
+ gl_FragColor = vec4( retColor, 1.0 );
150
+
151
+ #include <tonemapping_fragment>
152
+ #include <colorspace_fragment>
153
+
154
+ }`};export{t as Sky};
@@ -0,0 +1,12 @@
1
+ import{a as o}from"./jsx-runtime-DPjLkJKQ.js";import{r as g}from"./index-nmcBqr7Y.js";import"./index-CtzuWnCS.js";import{kB as he,ao as h,kC as Re,kD as ge,hs as Fe,bm as ee,kE as ze,kF as Ne,V as Ue,kG as Oe,kH as _e,b0 as ye,kI as Ie,b2 as K,b3 as xe,b4 as L,cS as J,b5 as U,aV as be,eb as te,jk as He,em as Be,jp as Ve,aF as Ge}from"./index-GIL7oGEO.js";import{J as We,C as Xe,c as qe}from"./JsonAssetDocument-C7VGcLhu.js";import{AudioViewer as Ze}from"./AudioViewer-CR7333fe.js";import{EnvironmentAssetDocument as Ke}from"./EnvironmentAssetDocument-Dg-Qq6O6.js";import{ImageViewer as Je}from"./ImageViewer-Tn7s_MnW.js";import{O as Qe}from"./Object3DDocumentViewport-DB7T0NTl.js";import{STANDARD_COMPONENT_CAMERA_DIRECTION as Ye}from"./standard-viewport-dressing-CzjAe_0A.js";import{RootDocumentContent as Pe,activeRootDocumentHost as et}from"./world-documents-147tiFZe.js";import{aX as tt,u as rt,ak as nt,a7 as G,al as ot,V as O,aj as it,k as re,am as W,W as ve,j as Y,v as st,w as we,C as _,x as je,bF as at,D as lt,F as X,H as Se,B as Ee,y as ke,M as Me,h as ct,ap as ut,aF as dt,a as pt,g as Ce,a0 as Te,aE as ft,i as mt,R as ht,a5 as gt}from"./three.module-D396a9Mn.js";import{EffectComposer as yt,LUT3DEffect as xt,RenderPass as bt,EffectPass as vt}from"./index-BcCBqgM_.js";import{s as Q}from"./asset-editor-persistence-BBaONOJt.js";import{ModelAssetDocument as wt}from"./ModelAssetDocument-F5GACirk.js";import{C as jt}from"./ColorInput-DQBNrW-K.js";import"./_commonjsHelpers-D6-XlEtG.js";import"./index-D_NuPfjr.js";import"./index-CinJrH5C.js";import"./index-FUuS4qwW.js";import"./client-DNXj_opT.js";import"./three.quarks.esm-B1C61jGo.js";import"./project-provenance-BoP3nrle.js";import"./StageHost-BN-IoTef.js";import"./stage-invalidation-DBg3C3Ta.js";import"./live-gesture-lock-DJbrjOqf.js";import"./viewport-shading-boundary-B_-_gABg.js";import"./clip-planes-CnAI6DZn.js";import"./three-CDSueJyJ.js";import"./viewport-pick-context-DkawXbEi.js";import"./OrbitControls-CM3bPray.js";import"./LineSegments2-CsOpKSiM.js";import"./scene-framing-Cat0GtyJ.js";import"./source-object3d-authoring-adapter-B-L6Ha6f.js";import"./three-projection-core-BmKMZ-nf.js";import"./editor-presentation-activity-C7SNSmTd.js";import"./viewport-surface-status-B3om4Kcf.js";import"./EXRLoader-Cdans_oJ.js";import"./fflate.module-DPuTF8aG.js";import"./HDRLoader-THU88oVD.js";import"./design-time-layers-wYgOTgni.js";import"./edit-mode-authoring-B47TfLqu.js";import"./design-time-mount-registry-DUpXCg1U.js";import"./react-story-board-BDDwiE2H.js";import"./CanvasSceneViewport-Bpi6gVTC.js";import"./RootSelectionOverlay-BZPlxmXU.js";import"./eyedropper-session-bjPXnfeX.js";import"./inspect-BZfi3mmo.js";import"./inference-diagnostics-Dhmtfbq_.js";import"./TransientHint-BB1fwrvK.js";import"./component-board-registry-DrIa2csL.js";import"./surface-state-DaxyruCj.js";import"./board-guides-DziKSTss.js";class N extends Error{constructor(t){super(t.message),this.refusal=t,this.name="LiveModuleError"}}function St(e){return Object.keys(e).filter(t=>t!=="__esModule"&&t!=="Symbol.toStringTag")}function ne(e){return typeof e=="object"&&e!==null&&e.isObject3D===!0}function Et(e){if("default"in e)return{name:"default",value:e.default};const t=St(e);return t.length===0?{kind:"not-a-model",message:"This module exports nothing."}:t.length>1?{kind:"not-a-model",message:`This module has no default export and ${t.length} named exports (${t.join(", ")}), so there is no single subject to build. A model module default-exports its builder.`}:{name:t[0],value:e[t[0]]}}function oe(e){if(ne(e))return{root:e};if(!e||typeof e!="object")return;const t=e;if(!ne(t.root))return;const r=t.root;return Array.isArray(t.animations)&&r.animations.length===0&&(r.animations=t.animations),{root:r,...typeof t.dispose=="function"?{dispose:()=>t.dispose.call(e)}:{}}}function ie(e){if(e===void 0)return"undefined";if(e===null)return"null";if(typeof e!="object")return typeof e;if(Array.isArray(e))return"an array";const t=Object.keys(e);return t.length>0?`an object with keys ${t.slice(0,8).join(", ")}`:"an object with no own keys"}const se="a model module returns a THREE.Object3D, or a build result `{ root, animations?, dispose? }` whose `root` is one.";async function kt(e,t){const r=oe(t);if(r)return{...r,exportName:e};if(typeof t!="function")return{kind:"not-a-model",message:`Export '${e}' is ${ie(t)}, not a function and not a model — `+se};let n;try{n=await t()}catch(i){return{kind:"import-failed",message:`Export '${e}' threw while building: ${$e(i)}`,...i instanceof Error&&i.stack?{stack:i.stack}:{}}}const s=oe(n);return s?{...s,exportName:e}:{kind:"not-a-model",message:`Export '${e}' ran but returned ${ie(n)} — ${se}`}}function $e(e){return e instanceof Error?e.message:String(e)}async function Mt(e,t,r){let n;try{n=await import(he(e,t,r))}catch(l){throw new N({kind:"import-failed",message:$e(l),...l instanceof Error&&l.stack?{stack:l.stack}:{}})}const s=Et(n);if("kind"in s)throw new N(s);const i=await kt(s.name,s.value);if("kind"in i)throw new N(i);return i}const Ct="data-vgai-pasteboard";function Tt(e){let t=e;for(let r=0;r<12;r++){if(!t||typeof t!="object")return!1;const n=t;if(typeof n.type=="string")return n.props?.[Ct]==="true";if(typeof n.type=="function"){try{t=n.type(n.props??{})}catch{return!1}continue}return!1}return!1}async function $t(e,t,r){let n;try{n=await import(he(e,t,r))}catch{return!1}const s=n.default;if(typeof s!="function")return!1;let i;try{i=s({})}catch{return!1}return Tt(i)}function Lt({documentId:e,active:t,modulePath:r}){const n=et(),s=g.useMemo(()=>({worldId:`pasteboard:${r}`,kind:"dom",path:r,zOrder:0,pausable:!1,entryOnly:!0}),[r]);return n?o.jsx("div",{style:{position:"relative",height:"100%",width:"100%"},children:o.jsx(Pe,{documentId:e,active:t,composite:n.composite,descriptor:s,store:n.store})}):o.jsx("div",{style:{padding:20,color:h.content.muted},children:"This pasteboard needs the project session's root-document host, which is not installed yet. Reopen the file once the project finishes loading."})}const ae={height:"100%",width:"100%",minHeight:0,display:"flex",position:"relative"},le={flex:1,minWidth:0,minHeight:0,display:"flex"};function At(e,t){if(e.kind!=="import-failed")return{message:e.message};const r=_e(t);return r?{message:r,stack:e.message}:{message:e.message,stack:e.stack}}function Dt({documentId:e,projectRoot:t,modulePath:r,displayName:n,active:s,fallback:i}){const[l,a]=g.useState({status:"probing"}),[y,c]=g.useState(null),p=g.useMemo(()=>{const f=new tt;return f.name=r.split("/").pop()??r,f},[r]),u=g.useRef(!1);g.useEffect(()=>{let f=!1,v=0,d=null,m=Promise.resolve(),E=null,j=null;const S=()=>{d&&(p.remove(d),p.animations=[],j?j():ee(d),d=null,j=null)},k=(w,M)=>{S(),d=w,j=M,p.add(w),p.animations=w.animations,Oe(e)},$=(w,M)=>{if(w.kind==="not-a-model"&&!M){a({status:"fallback",reason:w.message});return}const C=At(w,r);c(C),Ue.error(`${r}: ${C.message}`,"live-module"),M||a({status:"fallback",reason:w.message})},D=w=>f||w!==v,B=async()=>{v+=1;const w=v,M=Ne();let C;try{C=await Mt(t,r,M)}catch(A){if(D(w))return;if(!(A instanceof N))throw A;if(A.refusal.kind==="not-a-model"&&d===null){const V=await $t(t,r,M);if(D(w))return;if(V){c(null),a({status:"pasteboard"});return}}E=A,$(A.refusal,d!==null);return}if(D(w)){C.dispose?C.dispose():ee(C.root);return}k(C.root,C.dispose??null),E=null,ze(r),c(null),a({status:"live",exportName:C.exportName})},F=()=>(m=B(),m),x=Re(e,async()=>{let w=F();for(;;){if(await w,f)throw new Error(`Document closed while rebuilding: ${r}`);if(w===m)break;w=m}if(E)throw E});F();const T=ge();return()=>{f=!0,x(),T(),S()}},[p,e,r,t]),g.useEffect(()=>{if(l.status!=="live"||u.current)return;let f=0,v=0;const d=()=>{const m=Fe(e);if(m){u.current=!0,new rt().setFromObject(p).isEmpty()||m.frame();return}++v>60||(f=requestAnimationFrame(d))};return f=requestAnimationFrame(d),()=>cancelAnimationFrame(f)},[p,e,l.status]);const b=g.useCallback(()=>({root:p,dispose(){}}),[p]);return l.status==="probing"?o.jsxs("div",{style:{padding:20,color:h.content.muted},children:["Inspecting ",n,"…"]}):l.status==="pasteboard"?o.jsx(Lt,{documentId:e,active:s,modulePath:r}):l.status==="fallback"?o.jsxs("div",{style:ae,children:[y?o.jsx(ce,{failure:y}):null,o.jsx("div",{style:{...le,overflow:"auto"},children:i})]}):o.jsxs("div",{style:ae,children:[o.jsx("div",{style:{...le,opacity:y?.35:1},children:o.jsx(Qe,{documentId:e,sourcePath:r,displayName:n,build:b,active:s,assetType:"model module",cameraDirection:Ye,modelSource:{kind:"project-file",path:r}})}),y?o.jsx(ce,{failure:y}):null]})}function ce({failure:e}){return o.jsxs("div",{role:"alert","data-testid":"live-module-error",style:{position:"absolute",top:8,left:8,right:8,zIndex:2,maxHeight:"60%",overflow:"auto",padding:"8px 10px",borderRadius:h.shape.small,background:h.surface.raised,border:`1px solid ${h.semantic.danger}`,color:h.semantic.danger,fontFamily:h.typography.mono,fontSize:11,lineHeight:1.5,whiteSpace:"pre-wrap",wordBreak:"break-word",pointerEvents:"auto"},children:[o.jsx("div",{style:{fontWeight:600},children:"This module did not build — showing the last good model."}),o.jsx("div",{style:{marginTop:4},children:e.message}),e.stack?o.jsx("div",{style:{marginTop:6,color:h.content.muted},children:e.stack}):null]})}class Rt extends nt{constructor(t){super(t),this.type=G}setType(t){return this.type=t,this}load(t,r,n,s){const i=new ot(this.manager);i.setPath(this.path),i.setResponseType("text"),i.load(t,l=>{try{r(this.parse(l))}catch(a){s?s(a):console.error(a),this.manager.itemError(t)}},n,s)}parse(t){const r=/TITLE +"([^"]*)"/,n=/LUT_3D_SIZE +(\d+)/,s=/DOMAIN_MIN +([\d.]+) +([\d.]+) +([\d.]+)/,i=/DOMAIN_MAX +([\d.]+) +([\d.]+) +([\d.]+)/,l=/^([\d.e+-]+) +([\d.e+-]+) +([\d.e+-]+) *$/gm;let a=r.exec(t);const y=a!==null?a[1]:null;if(a=n.exec(t),a===null)throw new Error("LUTCubeLoader: Missing LUT_3D_SIZE information");const c=Number(a[1]),p=c**3*4,u=this.type===G?new Uint8Array(p):new Float32Array(p),b=new O(0,0,0),f=new O(1,1,1);if(a=s.exec(t),a!==null&&b.set(Number(a[1]),Number(a[2]),Number(a[3])),a=i.exec(t),a!==null&&f.set(Number(a[1]),Number(a[2]),Number(a[3])),b.x>f.x||b.y>f.y||b.z>f.z)throw new Error("LUTCubeLoader: Invalid input domain");const v=this.type===G?255:1;let d=0;for(;(a=l.exec(t))!==null;)u[d++]=Number(a[1])*v,u[d++]=Number(a[2])*v,u[d++]=Number(a[3])*v,u[d++]=v;const m=new it;return m.image.data=u,m.image.width=c,m.image.height=c,m.image.depth=c,m.type=this.type,m.magFilter=re,m.minFilter=re,m.wrapS=W,m.wrapT=W,m.wrapR=W,m.generateMipmaps=!1,m.needsUpdate=!0,{title:y,size:c,domainMin:b,domainMax:f,texture3D:m}}}function z(e){return e.split("/").pop()??e}function I(e,t,r){return Math.min(r,Math.max(t,e))}function ue(e){return[e.x,e.y,e.z].map(t=>t.toFixed(2)).join(", ")}function Ft(){const e=new we;e.background=new _("#171a22");const t=new je(34,1,.1,100);t.position.set(6.6,4.6,8.8),t.lookAt(0,.7,0),e.add(new at("#dce8ff","#322a27",2.1));const r=new lt("#fff3db",3.8);r.position.set(4,7,5),e.add(r);const n=[],s=[],i=(c,p,u)=>{n.push(c),s.push(p);const b=new Me(c,p);return b.position.set(...u),b.castShadow=!0,b.receiveShadow=!0,e.add(b),b},l=[["#e64d45",-2.4],["#e5ad42",-1.2],["#55b86a",0],["#47a9d8",1.2],["#8a68d7",2.4]];for(const[c,p]of l)i(new Se(.48,48,32),new X({color:c,roughness:.3,metalness:.08}),[p,.65,0]);[.06,.18,.5,.82,1].forEach((c,p)=>{const u=Math.round(c*255);i(new Ee(.78,.78,.78),new X({color:new _(`rgb(${u}, ${u}, ${u})`),roughness:.72}),[-2.4+p*1.2,1.85,-.1])});const y=i(new ke(9,6),new X({color:"#777b86",roughness:.92}),[0,.08,-1.8]);return y.rotation.x=-Math.PI/2,{scene:e,camera:t,dispose:()=>{for(const c of n)c.dispose();for(const c of s)c.dispose()}}}function zt({lut:e,settingsRef:t}){const r=g.useRef(null);return g.useEffect(()=>{const n=r.current;if(!n)return;let s=!1,i=0;const l=document.createElement("canvas");l.setAttribute("aria-label","LUT before and after preview"),l.style.width="100%",l.style.height="100%",l.style.display="block",n.replaceChildren(l);const a=new ve({canvas:l,antialias:!0});a.outputColorSpace=Y,a.toneMapping=st,a.toneMappingExposure=1,a.shadowMap.enabled=!0;const y=Ft(),c=new yt(a),p=new xt(e.texture3D,{tetrahedralInterpolation:!0});c.addPass(new bt(y.scene,y.camera)),c.addPass(new vt(y.camera,p));const u={width:1,height:1},b=()=>{const m=t.current,E=Math.round(u.width*I(m.split,.05,.95));p.blendMode.opacity.value=I(m.intensity,0,1),p.tetrahedralInterpolation=m.tetrahedral,a.setScissorTest(!1),a.setRenderTarget(null),a.clear(),a.setScissorTest(!0),a.setScissor(0,0,E,u.height),a.render(y.scene,y.camera),a.setScissor(E,0,u.width-E,u.height),c.render(),a.setScissorTest(!1)},f=()=>{const m=n.getBoundingClientRect();u.width=Math.max(1,Math.floor(m.width)),u.height=Math.max(1,Math.floor(m.height)),a.setPixelRatio(Math.min(window.devicePixelRatio||1,2)),a.setSize(u.width,u.height,!1),c.setSize(u.width,u.height),y.camera.aspect=u.width/u.height,y.camera.updateProjectionMatrix()};f(),b();const v=new ResizeObserver(()=>{f(),b()});v.observe(n);const d=()=>{s||(b(),i=requestAnimationFrame(d))};return i=requestAnimationFrame(d),()=>{s=!0,cancelAnimationFrame(i),v.disconnect(),c.dispose(),p.dispose(),y.dispose(),a.dispose(),l.remove()}},[e,t]),o.jsx("div",{ref:r,"data-testid":"lut-preview",style:{width:"100%",height:"100%",minHeight:260,background:"#171a22"}})}function Nt({settings:e,onChange:t}){return o.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:12,padding:4},children:[o.jsxs("label",{style:{display:"flex",flexDirection:"column",gap:5,fontSize:11},children:["Intensity",o.jsx(U,{value:e.intensity,onChange:r=>t({...e,intensity:I(r,0,1)}),step:.01,precision:2})]}),o.jsxs("label",{style:{display:"flex",flexDirection:"column",gap:5,fontSize:11},children:["Comparison split",o.jsx(U,{value:e.split,onChange:r=>t({...e,split:I(r,.05,.95)}),step:.01,precision:2})]}),o.jsxs("label",{style:{display:"flex",alignItems:"center",gap:7,fontSize:11},children:[o.jsx(be,{checked:e.tetrahedral,onChange:r=>t({...e,tetrahedral:r.target.checked})}),"Tetrahedral interpolation"]}),o.jsx("div",{style:{color:h.content.muted,fontSize:10,lineHeight:1.45},children:"Preview controls are session-only. Bind the LUT and accepted intensity in the owning TSX post-processing composition."})]})}async function Ut(e){const t=await J(e);if(t===null)throw new Error(`CUBE LUT not found: ${e}`);return new Rt().parse(t)}function Ot({documentId:e,assetPath:t,active:r=!0}){const[n,s]=g.useState(0),[i,l]=g.useState(null),[a,y]=g.useState(null),[c,p]=g.useState({intensity:1,split:.5,tetrahedral:!0}),u=g.useRef(c);u.current=c,g.useEffect(()=>{if(r)return Q(t,()=>s(f=>f+1))},[r,t]),g.useEffect(()=>{if(!r)return;let f=!1,v=null;return l(null),y(null),Ut(t).then(d=>{if(v=d,f){d.texture3D.dispose();return}l(d)},d=>{f||y(d instanceof Error?d.message:String(d))}),()=>{f=!0,v?.texture3D.dispose()}},[r,t,n]);const b=g.useMemo(()=>[{id:"lut-profile",title:"Color Grade",icon:Ie,order:ye,body:{kind:"custom",...i?{data:{title:i.title,size:i.size,domainMin:i.domainMin.toArray(),domainMax:i.domainMax.toArray()}}:{},render:()=>o.jsxs("div",{style:{display:"grid",gridTemplateColumns:"auto 1fr",gap:"6px 10px"},children:[o.jsx("span",{style:{color:h.content.muted},children:"Title"}),o.jsx("span",{children:i?.title||z(t)}),o.jsx("span",{style:{color:h.content.muted},children:"Cube"}),o.jsx("span",{children:i?`${i.size}³`:"—"}),o.jsx("span",{style:{color:h.content.muted},children:"Domain"}),o.jsx("span",{children:i?`${ue(i.domainMin)} → ${ue(i.domainMax)}`:"—"})]})}},{id:"lut-preview-settings",title:"Preview",icon:xe,order:K,body:{kind:"custom",data:{...c},render:()=>o.jsx(Nt,{settings:c,onChange:p})}}],[t,i,c]);return a?o.jsx(L,{documentId:e,active:r,type:"color grade",title:z(t),status:"CUBE LUT unavailable",children:o.jsx("div",{role:"alert",style:{padding:20,color:h.semantic.danger},children:a})}):i?o.jsx(L,{documentId:e,active:r,type:"color grade",title:z(t),sections:b,status:`CUBE LUT · ${i.size}³`,fill:!0,children:o.jsxs("div",{style:{position:"relative",width:"100%",height:"100%",minHeight:0,background:"#171a22"},children:[o.jsx(zt,{lut:i,settingsRef:u}),o.jsx("div",{style:{position:"absolute",left:12,top:12,padding:"4px 7px",borderRadius:4,background:"rgba(12,14,20,0.72)",color:"#f2f4f8",fontSize:10,pointerEvents:"none"},children:"Original"}),o.jsx("div",{style:{position:"absolute",right:12,top:12,padding:"4px 7px",borderRadius:4,background:"rgba(12,14,20,0.72)",color:"#f2f4f8",fontSize:10,pointerEvents:"none"},children:i.title||"Graded"})]})}):o.jsx(L,{documentId:e,active:r,type:"color grade",title:z(t),status:"Loading CUBE LUT",children:o.jsx("div",{style:{padding:20,color:h.content.muted},children:"Loading color grade…"})})}const _t=[".vert",".vert.glsl"],It=[".frag",".frag.glsl"];function Ht(e){return e.split(/[?#]/,1)[0].toLowerCase()}function Bt(e,t=""){const r=Ht(e);return _t.some(n=>r.endsWith(n))?"vertex":It.some(n=>r.endsWith(n))?"fragment":/\bgl_Position\b/.test(t)?"vertex":"fragment"}function Le(e){const t=e.split(/[?#]/,1)[0];return/\.vert\.glsl$/i.test(t)?t.replace(/\.vert\.glsl$/i,".frag.glsl"):/\.frag\.glsl$/i.test(t)?t.replace(/\.frag\.glsl$/i,".vert.glsl"):/\.vert$/i.test(t)?t.replace(/\.vert$/i,".frag"):/\.frag$/i.test(t)?t.replace(/\.frag$/i,".vert"):null}function Vt(e){return e.replace(/\/\*[\s\S]*?\*\//g,t=>t.replace(/[^\n]/g," ")).replace(/\/\/[^\n]*/g,"")}function de(e,t){const r=[],n=/\buniform\s+(?:(?:lowp|mediump|highp)\s+)?([A-Za-z_]\w*)\s+([A-Za-z_]\w*)\s*(?:\[\s*(\d+)\s*\])?\s*;/g;for(const s of Vt(e).matchAll(n)){const i=s[1],l=s[2];if(!i||!l)continue;const a=s[3]?Number.parseInt(s[3],10):void 0;r.push({name:l,type:i,...a?{arraySize:a}:{},stages:[t]})}return r}function Gt(e,t){const r=new Map;for(const n of[...de(e,"vertex"),...de(t,"fragment")]){const s=r.get(n.name);if(!s){r.set(n.name,n);continue}r.set(n.name,{...s,stages:[...new Set([...s.stages,...n.stages])]})}return[...r.values()]}function q(e,t){const r=e.split(`
2
+ `).map(n=>Wt(n.trim(),t)).filter(n=>n!==null);return r.length===0&&e.trim()&&r.push({stage:t,severity:"error",message:e.trim()}),r}function Wt(e,t){if(!e)return null;const r=e.match(/^(ERROR|WARNING):\s*\d+:(\d+)(?::|\((\d+)\):)\s*(.*)$/i);if(r)return{stage:t,severity:r[1].toLowerCase()==="warning"?"warning":"error",line:Number.parseInt(r[2],10),...r[3]?{column:Number.parseInt(r[3],10)}:{},message:r[4]||e};const n=e.match(/^\d+:(\d+)\((\d+)\):\s*(?:(error|warning)\s*:?)?\s*(.*)$/i);return n?{stage:t,severity:n[3]?.toLowerCase()==="warning"?"warning":"error",line:Number.parseInt(n[1],10),column:Number.parseInt(n[2],10),message:n[4]||e}:null}function pe(e){return`#line 1
3
+ ${e}`}const Xt=`varying vec2 vUv;
4
+
5
+ void main() {
6
+ vUv = uv;
7
+ gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
8
+ }`,qt=`varying vec2 vUv;
9
+
10
+ void main() {
11
+ gl_FragColor = vec4(vUv, 0.55, 1.0);
12
+ }`;function Z(e,t=null){return{path:t,source:e==="vertex"?Xt:qt,available:!1}}function R(e){return e?.split("/").pop()??"Preview fallback"}function P(e){return e.type==="vec3"&&/(colou?r|tint|albedo|emissive)/i.test(e.name)}function Ae(e){return/^(u|i)?time$/i.test(e.name)&&/^(float|double)$/.test(e.type)?"time":/^(u|i)?resolution$/i.test(e.name)&&/^([diu]?vec)[234]$/.test(e.type)?"resolution":/^(u|i)?mouse$/i.test(e.name)&&/^([diu]?vec)[234]$/.test(e.type)?"mouse":null}function H(e){if(P(e))return/horizon/i.test(e.name)?"#badbe9":/zenith/i.test(e.name)?"#297aba":/sun/i.test(e.name)?"#fff0c2":"#6f8cff";if(e.type==="bool")return!1;if(/^(float|double|int|uint)$/.test(e.type))return 0;const t=e.type.match(/^(?:[biu]?vec)([234])$/);return t?Array.from({length:Number.parseInt(t[1],10)},()=>0):0}function Zt(){const e=new Uint8Array([38,43,58,255,176,190,255,255,176,190,255,255,38,43,58,255]),t=new mt(e,2,2,ht);return t.colorSpace=Y,t.magFilter=gt,t.needsUpdate=!0,t}function De(e,t,r){if(e.arraySize){const{arraySize:s,...i}=e;return Array.from({length:s},()=>De(i,t,r))}if(/^sampler2D/.test(e.type)){const s=Zt();return r.push(s),s}if(/^sampler/.test(e.type))return null;if(e.type==="mat3")return new dt;if(e.type==="mat4")return new pt;if(P(e))return new _(typeof t=="string"?t:"#6f8cff");const n=e.type.match(/^(?:[biu]?vec)([234])$/);if(n){const s=Array.isArray(t)?t:[],i=Number.parseInt(n[1],10);return i===2?new Ce(s[0]??0,s[1]??0):i===3?new O(s[0]??0,s[1]??0,s[2]??0):new Te(s[0]??0,s[1]??0,s[2]??0,s[3]??0)}return t}function Kt(e,t,r,n,s){const i=Ae(t);if(i==="time"){e.value=n;return}if(e.value instanceof _&&typeof r=="string"){e.value.set(r);return}const l=Array.isArray(r)?r:[];if(e.value instanceof Ce){e.value.set(i==="resolution"?s.width:l[0]??0,i==="resolution"?s.height:l[1]??0);return}if(e.value instanceof O){e.value.set(i==="resolution"?s.width:l[0]??0,i==="resolution"?s.height:l[1]??0,i==="resolution"?1:l[2]??0);return}if(e.value instanceof Te){e.value.set(i==="resolution"?s.width:l[0]??0,i==="resolution"?s.height:l[1]??0,i==="resolution"?1:l[2]??0,l[3]??0);return}i!=="mouse"&&!t.arraySize&&!/^sampler|^mat/.test(t.type)&&(e.value=r)}function Jt(e){return e==="box"?new Ee(1.35,1.35,1.35,48,48,48):e==="plane"?new ke(2.2,2.2,96,96):new Se(.95,96,64)}function Qt({vertexSource:e,fragmentSource:t,descriptors:r,valuesRef:n,geometry:s,onDiagnostics:i}){const l=g.useRef(null);return g.useEffect(()=>{const a=l.current;if(!a)return;let y=!1,c=0;const p=document.createElement("canvas");p.setAttribute("aria-label","Live shader preview"),p.style.width="100%",p.style.height="100%",p.style.display="block",a.replaceChildren(p);let u;try{u=new ve({canvas:p,antialias:!0,alpha:!1})}catch(x){i([{stage:"program",severity:"error",message:x instanceof Error?x.message:String(x)}]);return}u.outputColorSpace=Y,u.setClearColor(1119261,1),u.debug.checkShaderErrors=!0;const b=new we,f=new je(38,1,.01,100);f.position.set(0,0,3.4);const v=[],d={};for(const x of r)d[x.name]={value:De(x,n.current[x.name]??H(x),v)};const m=new ct({vertexShader:pe(e),fragmentShader:pe(t),uniforms:d,side:ut,toneMapped:!1}),E=Jt(s),j=new Me(E,m);b.add(j);const S=[];u.debug.onShaderError=(x,T,w,M)=>{const C=T,A=w,V=M;S.push(...q(x.getProgramInfoLog(C)??"","program"),...q(x.getShaderInfoLog(A)??"","vertex"),...q(x.getShaderInfoLog(V)??"","fragment"))};const k={width:1,height:1},$=()=>{const x=a.getBoundingClientRect();k.width=Math.max(1,Math.floor(x.width)),k.height=Math.max(1,Math.floor(x.height)),u.setPixelRatio(Math.min(window.devicePixelRatio||1,2)),u.setSize(k.width,k.height,!1),f.aspect=k.width/k.height,f.position.z=3.4/Math.min(1,f.aspect),f.updateProjectionMatrix()};$();const D=new ResizeObserver($);D.observe(a);const B=new ft;try{u.compile(b,f),u.render(b,f),i(S.filter((x,T,w)=>w.findIndex(M=>M.stage===x.stage&&M.line===x.line&&M.message===x.message)===T))}catch(x){i([{stage:"program",severity:"error",message:x instanceof Error?x.message:String(x)}])}const F=()=>{if(y)return;const x=B.getElapsedTime();for(const T of r){const w=d[T.name];w&&Kt(w,T,n.current[T.name]??H(T),x,k)}s!=="plane"&&(j.rotation.y=x*.18,j.rotation.x=Math.sin(x*.22)*.08),u.render(b,f),c=requestAnimationFrame(F)};return c=requestAnimationFrame(F),()=>{y=!0,cancelAnimationFrame(c),D.disconnect(),u.debug.onShaderError=null,E.dispose(),m.dispose();for(const x of v)x.dispose();u.dispose(),p.remove()}},[r,t,s,i,n,e]),o.jsx("div",{ref:l,"data-testid":"shader-preview",style:{width:"100%",height:"100%",minHeight:240,background:"#11141d"}})}function Yt({descriptors:e,values:t,onChange:r}){return e.length===0?o.jsx("div",{style:{color:h.content.muted},children:"No uniform declarations found."}):o.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:12,padding:4},children:[e.map(n=>o.jsx(Pt,{uniform:n,value:t[n.name]??H(n),onChange:s=>r(n.name,s)},n.name)),o.jsx("div",{style:{color:h.content.muted,fontSize:10,lineHeight:1.4},children:"Preview values are session-only. Author runtime defaults beside the ShaderMaterial in TS/TSX."})]})}function Pt({uniform:e,value:t,onChange:r}){const n=Ae(e),s=e.type.match(/^(?:[biu]?vec)([234])$/);let i;return n?i=o.jsxs("div",{style:{color:h.content.muted,fontSize:10},children:["Driven by preview ",n]}):P(e)?i=o.jsx(jt,{value:typeof t=="string"?t:"#6f8cff",onChange:r}):e.type==="bool"?i=o.jsxs("label",{style:{display:"flex",alignItems:"center",gap:7,fontSize:11},children:[o.jsx(be,{checked:!!t,onChange:l=>r(l.target.checked)}),t?"True":"False"]}):/^(float|double|int|uint)$/.test(e.type)?i=o.jsx(U,{value:typeof t=="number"?t:0,onChange:r,step:e.type==="int"||e.type==="uint"?1:.01,precision:e.type==="int"||e.type==="uint"?0:3}):s&&Array.isArray(t)?i=o.jsx("div",{style:{display:"grid",gridTemplateColumns:`repeat(${s[1]}, minmax(0, 1fr))`,gap:4},children:t.map((l,a)=>o.jsx(U,{value:l,label:"xyzw"[a],onChange:y=>{const c=[...t];c[a]=y,r(c)},step:.01},`${e.name}:${a}`))}):i=o.jsx("div",{style:{color:h.content.muted,fontSize:10},children:"Reflected for runtime binding; no scalar preview control."}),o.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:5},children:[o.jsxs("div",{style:{display:"flex",justifyContent:"space-between",gap:8},children:[o.jsx("span",{style:{color:h.content.primary,fontSize:11},children:e.name}),o.jsx("span",{style:{color:h.content.muted,fontSize:10},children:e.type})]}),i]})}function fe({diagnostics:e,files:t}){return e.length===0?o.jsx("div",{style:{color:h.semantic.success,fontSize:11,padding:4},children:"Shader program compiled successfully."}):o.jsx("div",{style:{display:"flex",flexDirection:"column",gap:6,padding:4},children:e.map((r,n)=>{const s=r.stage==="program"?null:t[r.stage];return o.jsxs("div",{style:{color:r.severity==="warning"?h.semantic.warning:h.semantic.danger,fontSize:10,lineHeight:1.45},children:[s?.available?R(s.path):r.stage,r.line?`:${r.line}${r.column?`:${r.column}`:""}`:""," · ",r.message]},`${r.stage}:${r.line??0}:${r.message}:${n}`)})})}async function er(e){const t=await J(e);if(t===null)throw new Error(`Could not read ${e}.`);const r=Bt(e,t),n=Le(e),s=n?await J(n):null,i={vertex:Z("vertex"),fragment:Z("fragment")};i[r]={path:e,source:t,available:!0};const l=r==="vertex"?"fragment":"vertex";return i[l]=s===null?Z(l,n):{path:n,source:s,available:!0},i}function tr({documentId:e,assetPath:t,active:r=!0}){const[n,s]=g.useState(null),[i,l]=g.useState(0),[a,y]=g.useState("sphere"),[c,p]=g.useState([]),[u,b]=g.useState({}),[f,v]=g.useState(null);g.useEffect(()=>{if(!r)return;const j=()=>l($=>$+1),S=Le(t),k=[Q(t,j),...S?[Q(S,j)]:[]];return()=>{for(const $ of k)$()}},[r,t]),g.useEffect(()=>{if(!r)return;let j=!1;return s(null),v(null),er(t).then(S=>{j||s(S)},S=>{j||v(S instanceof Error?S.message:String(S))}),()=>{j=!0}},[r,t,i]);const d=g.useMemo(()=>n?Gt(n.vertex.source,n.fragment.source):[],[n]);g.useEffect(()=>{b(j=>Object.fromEntries(d.map(S=>[S.name,j[S.name]??H(S)])))},[d]);const m=g.useRef(u);m.current=u;const E=g.useMemo(()=>[{id:"shader-pair",title:"Shader Pair",icon:te,order:ye,body:{kind:"custom",render:()=>o.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:5,padding:4,fontSize:10},children:[o.jsxs("span",{children:["Vertex · ",n?R(n.vertex.path):"Loading…",n&&!n.vertex.available?" (preview fallback)":""]}),o.jsxs("span",{children:["Fragment · ",n?R(n.fragment.path):"Loading…",n&&!n.fragment.available?" (preview fallback)":""]}),o.jsx("span",{style:{color:h.content.muted},children:"Ordinary sibling GLSL files; runtime composition stays in TS/TSX."})]})}},{id:"shader-uniforms",title:"Uniforms",icon:xe,order:K,description:`${d.length} reflected`,body:{kind:"custom",data:Object.fromEntries(d.map(j=>[j.name,u[j.name]])),render:()=>o.jsx(Yt,{descriptors:d,values:u,onChange:(j,S)=>b(k=>({...k,[j]:S}))})}},{id:"shader-diagnostics",title:"Diagnostics",icon:c.length>0?He:te,order:K+100,description:c.length===0?"Compiled":`${c.length} issue${c.length===1?"":"s"}`,body:{kind:"custom",data:{diagnostics:c},render:()=>n&&o.jsx(fe,{diagnostics:c,files:n})}}],[d,c,n,u]);return f?o.jsx(L,{documentId:e,active:r,type:"shader",title:R(t),status:"Shader unavailable",children:o.jsx("div",{role:"alert",style:{padding:20,color:h.semantic.danger},children:f})}):n?o.jsx(L,{documentId:e,active:r,type:"shader",title:R(t),sections:E,status:c.length===0?`GLSL · compiles · ${d.length} uniforms`:`GLSL · ${c.length} compile issues`,fill:!0,children:o.jsxs("div",{style:{width:"100%",height:"100%",minHeight:0,position:"relative",background:h.surface.panel},children:[o.jsx(Qt,{vertexSource:n.vertex.source,fragmentSource:n.fragment.source,descriptors:d,valuesRef:m,geometry:a,onDiagnostics:p}),o.jsx("div",{style:{position:"absolute",left:10,top:10},children:o.jsxs(Be,{"aria-label":"Preview geometry",value:a,onChange:j=>y(j.target.value),children:[o.jsx("option",{value:"sphere",children:"Sphere"}),o.jsx("option",{value:"box",children:"Box"}),o.jsx("option",{value:"plane",children:"Plane"})]})}),c.length>0&&o.jsx("div",{style:{position:"absolute",left:12,right:12,bottom:12,maxHeight:120,overflow:"auto",padding:8,border:`1px solid ${h.semantic.danger}`,borderRadius:6,background:h.surface.overlay},children:o.jsx(fe,{diagnostics:c,files:n})})]})}):o.jsx(L,{documentId:e,active:r,type:"shader",title:R(t),status:"Loading GLSL",children:o.jsx("div",{style:{padding:20,color:h.content.muted},children:"Loading shader files…"})})}function rr(e){const t=(e.split(/[?#]/,1)[0]??"").replace(/^\//,"");return t.startsWith("src/")&&/\.(?:[cm]?[jt]sx?)$/.test(t)}function nr(e){const t=Ve(e);return t.editor==="model"?"model":t.editor==="image"?"image":t.editor==="audio"?"audio":t.editor==="data"?"json":t.editor==="environment"?"environment":t.format==="cube"?"lut":t.format==="glsl"||t.format==="vert"||t.format==="frag"?"shader":rr(e)?"module":t.editor==="source"&&t.previewable?"text":"binary"}function me({documentId:e,assetPath:t,active:r=!0}){const[n,s]=g.useState(null),[i,l]=g.useState(null),a=t.split("/").pop()??t;return g.useEffect(()=>{let y=!1;s(null),l(null);const c=t.replace(/^\//,"");let p=0;async function u(){const f=++p;try{const v=`/__editor/source-file?path=${encodeURIComponent(c)}`,d=await fetch(v,{cache:"no-store"}).then(m=>{if(!m.ok)throw new Error(`HTTP ${m.status}`);return m.text()});!y&&f===p&&(s(d),l(null))}catch(v){!y&&f===p&&l(v instanceof Error?v.message:String(v))}}const b=ge();return u(),()=>{y=!0,b()}},[t]),o.jsx(L,{documentId:e,active:r,type:"source",title:a,sections:[],status:`source · ${t}`,fill:!0,children:o.jsx("div",{style:{padding:12,height:"100%",minHeight:0,display:"flex",flexDirection:"column",gap:8},children:o.jsx("div",{style:{padding:8,flex:1,minHeight:0,display:"flex",overflow:"hidden",background:h.surface.inset,border:`1px solid ${h.boundary.default}`,borderRadius:h.shape.small},children:i!==null||n===null?o.jsx("div",{style:{fontFamily:h.typography.mono,fontSize:11,lineHeight:1.5,color:i?h.semantic.danger:h.content.muted,padding:4},children:i??"Loading…"}):o.jsx(Xe,{value:n,followChanges:!0,language:qe(t),fontSize:11,maxHeight:"100%",ariaLabel:`Source of ${t}`})})})})}function nn({documentId:e,assetPath:t,active:r=!0}){switch(nr(t)){case"model":return o.jsx(wt,{documentId:e,assetPath:t,displayName:t.split("/").pop()??t,active:r});case"image":return o.jsx(Je,{assetPath:t});case"audio":return o.jsx(Ze,{assetPath:t});case"json":return o.jsx(We,{documentId:e,assetPath:t,displayName:t.split("/").pop()??t,active:r,sections:[],status:`json · ${t}`});case"environment":return o.jsx(Ke,{documentId:e,assetPath:t,active:r});case"lut":return o.jsx(Ot,{documentId:e,assetPath:t,active:r});case"shader":return o.jsx(tr,{documentId:e,assetPath:t,active:r});case"module":{const n=Ge()?.rootPath,s=o.jsx(me,{documentId:e,assetPath:t,active:r});return n?o.jsx(Dt,{documentId:e,projectRoot:n,modulePath:(t.split(/[?#]/,1)[0]??t).replace(/^\//,""),displayName:t.split("/").pop()??t,active:r,fallback:s}):s}case"text":return o.jsx(me,{documentId:e,assetPath:t,active:r});case"binary":return o.jsx(L,{documentId:e,active:r,type:"binary source",title:t.split("/").pop()??t,sections:[],status:`binary · ${t}`,children:o.jsxs("div",{style:{padding:16,color:h.content.muted,fontSize:12},children:[o.jsx("div",{style:{color:h.content.primary,fontWeight:600,marginBottom:6},children:t.split("/").pop()}),"This binary source is available in the project, but it has no safe in-editor renderer. Its file remains selectable and referenceable without being misidentified as another format."]})})}}export{nn as SourceAssetViewer,nr as sourceAssetRoute};