super-three 0.181.0 → 0.185.0

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 (693) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +3 -4
  3. package/build/three.cjs +21332 -19201
  4. package/build/three.core.js +20908 -19853
  5. package/build/three.core.min.js +2 -2
  6. package/build/three.module.js +1947 -862
  7. package/build/three.module.min.js +2 -2
  8. package/build/three.tsl.js +37 -16
  9. package/build/three.tsl.min.js +2 -2
  10. package/build/three.webgpu.js +33628 -25197
  11. package/build/three.webgpu.min.js +2 -2
  12. package/build/three.webgpu.nodes.js +33394 -25000
  13. package/build/three.webgpu.nodes.min.js +2 -2
  14. package/examples/jsm/Addons.js +14 -3
  15. package/examples/jsm/animation/CCDIKSolver.js +7 -3
  16. package/examples/jsm/controls/ArcballControls.js +13 -6
  17. package/examples/jsm/controls/DragControls.js +2 -2
  18. package/examples/jsm/controls/FirstPersonControls.js +127 -86
  19. package/examples/jsm/controls/FlyControls.js +4 -0
  20. package/examples/jsm/controls/MapControls.js +55 -1
  21. package/examples/jsm/controls/OrbitControls.js +111 -8
  22. package/examples/jsm/controls/TrackballControls.js +8 -8
  23. package/examples/jsm/controls/TransformControls.js +102 -17
  24. package/examples/jsm/csm/CSM.js +2 -1
  25. package/examples/jsm/csm/CSMFrustum.js +31 -6
  26. package/examples/jsm/csm/CSMShadowNode.js +10 -3
  27. package/examples/jsm/effects/AnaglyphEffect.js +102 -7
  28. package/examples/jsm/effects/AsciiEffect.js +14 -1
  29. package/examples/jsm/environments/ColorEnvironment.js +59 -0
  30. package/examples/jsm/environments/RoomEnvironment.js +3 -0
  31. package/examples/jsm/exporters/DRACOExporter.js +27 -6
  32. package/examples/jsm/exporters/EXRExporter.js +1 -1
  33. package/examples/jsm/exporters/GLTFExporter.js +266 -21
  34. package/examples/jsm/exporters/PLYExporter.js +286 -73
  35. package/examples/jsm/exporters/USDZExporter.js +353 -99
  36. package/examples/jsm/generators/CityGenerator.js +346 -0
  37. package/examples/jsm/generators/ForestGenerator.js +347 -0
  38. package/examples/jsm/generators/TerrainGenerator.js +504 -0
  39. package/examples/jsm/generators/TreeGenerator.js +377 -0
  40. package/examples/jsm/generators/city/SidewalkGenerator.js +253 -0
  41. package/examples/jsm/generators/city/SkyscraperGenerator.js +1357 -0
  42. package/examples/jsm/geometries/DecalGeometry.js +1 -1
  43. package/examples/jsm/geometries/LoftGeometry.js +355 -0
  44. package/examples/jsm/geometries/TextGeometry.js +18 -0
  45. package/examples/jsm/helpers/AnimationPathHelper.js +302 -0
  46. package/examples/jsm/helpers/LightProbeGridHelper.js +221 -0
  47. package/examples/jsm/helpers/LightProbeHelper.js +5 -4
  48. package/examples/jsm/helpers/LightProbeHelperGPU.js +1 -1
  49. package/examples/jsm/helpers/TextureHelperGPU.js +1 -1
  50. package/examples/jsm/helpers/ViewHelper.js +83 -14
  51. package/examples/jsm/inspector/Extension.js +13 -0
  52. package/examples/jsm/inspector/Inspector.js +244 -91
  53. package/examples/jsm/inspector/RendererInspector.js +165 -39
  54. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphEditor.js +916 -0
  55. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphLoader.js +281 -0
  56. package/examples/jsm/inspector/tabs/Console.js +241 -25
  57. package/examples/jsm/inspector/tabs/Memory.js +136 -0
  58. package/examples/jsm/inspector/tabs/Parameters.js +115 -7
  59. package/examples/jsm/inspector/tabs/Performance.js +24 -9
  60. package/examples/jsm/inspector/tabs/Settings.js +306 -0
  61. package/examples/jsm/inspector/tabs/Timeline.js +1696 -0
  62. package/examples/jsm/inspector/tabs/Viewer.js +723 -9
  63. package/examples/jsm/inspector/ui/Graph.js +162 -25
  64. package/examples/jsm/inspector/ui/Item.js +92 -13
  65. package/examples/jsm/inspector/ui/List.js +2 -2
  66. package/examples/jsm/inspector/ui/Profiler.js +1991 -44
  67. package/examples/jsm/inspector/ui/Style.js +1943 -543
  68. package/examples/jsm/inspector/ui/Tab.js +226 -5
  69. package/examples/jsm/inspector/ui/Values.js +126 -8
  70. package/examples/jsm/inspector/ui/utils.js +143 -10
  71. package/examples/jsm/interaction/InteractionManager.js +226 -0
  72. package/examples/jsm/libs/basis/README.md +0 -1
  73. package/examples/jsm/libs/demuxer_mp4.js +3 -3
  74. package/examples/jsm/libs/draco/README.md +0 -1
  75. package/examples/jsm/libs/meshopt_clusterizer.module.js +421 -0
  76. package/examples/jsm/libs/meshopt_decoder.module.js +9 -8
  77. package/examples/jsm/libs/meshopt_simplifier.module.js +627 -0
  78. package/examples/jsm/libs/mikktspace.module.js +34 -9
  79. package/examples/jsm/lighting/ClusteredLighting.js +55 -0
  80. package/examples/jsm/lighting/DynamicLighting.js +82 -0
  81. package/examples/jsm/lighting/LightProbeGrid.js +681 -0
  82. package/examples/jsm/lines/LineMaterial.js +45 -16
  83. package/examples/jsm/lines/LineSegments2.js +8 -0
  84. package/examples/jsm/lines/webgpu/LineSegments2.js +8 -0
  85. package/examples/jsm/loaders/3DMLoader.js +6 -5
  86. package/examples/jsm/loaders/3MFLoader.js +2 -2
  87. package/examples/jsm/loaders/AMFLoader.js +2 -2
  88. package/examples/jsm/loaders/ColladaLoader.js +24 -4026
  89. package/examples/jsm/loaders/DRACOLoader.js +51 -18
  90. package/examples/jsm/loaders/EXRLoader.js +701 -90
  91. package/examples/jsm/loaders/FBXLoader.js +235 -37
  92. package/examples/jsm/loaders/GCodeLoader.js +34 -8
  93. package/examples/jsm/loaders/GLTFLoader.js +146 -178
  94. package/examples/jsm/loaders/HDRLoader.js +7 -30
  95. package/examples/jsm/loaders/KMZLoader.js +5 -5
  96. package/examples/jsm/loaders/KTX2Loader.js +58 -17
  97. package/examples/jsm/loaders/LDrawLoader.js +49 -58
  98. package/examples/jsm/loaders/LUT3dlLoader.js +2 -2
  99. package/examples/jsm/loaders/LUTCubeLoader.js +2 -2
  100. package/examples/jsm/loaders/LWOLoader.js +11 -39
  101. package/examples/jsm/loaders/LottieLoader.js +1 -1
  102. package/examples/jsm/loaders/MaterialXLoader.js +31 -9
  103. package/examples/jsm/loaders/NRRDLoader.js +5 -5
  104. package/examples/jsm/loaders/PCDLoader.js +11 -9
  105. package/examples/jsm/loaders/PLYLoader.js +218 -55
  106. package/examples/jsm/loaders/SVGLoader.js +549 -497
  107. package/examples/jsm/loaders/TDSLoader.js +0 -2
  108. package/examples/jsm/loaders/TGALoader.js +0 -2
  109. package/examples/jsm/loaders/TTFLoader.js +1 -1
  110. package/examples/jsm/loaders/USDLoader.js +127 -43
  111. package/examples/jsm/loaders/UltraHDRLoader.js +285 -160
  112. package/examples/jsm/loaders/VOXLoader.js +660 -117
  113. package/examples/jsm/loaders/VRMLLoader.js +80 -3
  114. package/examples/jsm/loaders/VTKLoader.js +42 -25
  115. package/examples/jsm/loaders/collada/ColladaComposer.js +3044 -0
  116. package/examples/jsm/loaders/collada/ColladaParser.js +1977 -0
  117. package/examples/jsm/loaders/usd/USDAParser.js +504 -344
  118. package/examples/jsm/loaders/usd/USDCParser.js +1867 -6
  119. package/examples/jsm/loaders/usd/USDComposer.js +4627 -0
  120. package/examples/jsm/materials/LDrawConditionalLineNodeMaterial.js +2 -2
  121. package/examples/jsm/materials/WoodNodeMaterial.js +11 -11
  122. package/examples/jsm/math/Octree.js +131 -1
  123. package/examples/jsm/misc/GPUComputationRenderer.js +2 -0
  124. package/examples/jsm/misc/RollerCoaster.js +42 -4
  125. package/examples/jsm/misc/TileCreasedNormalsPlugin.js +270 -0
  126. package/examples/jsm/misc/Volume.js +2 -3
  127. package/examples/jsm/misc/VolumeSlice.js +0 -1
  128. package/examples/jsm/modifiers/TessellateModifier.js +1 -1
  129. package/examples/jsm/objects/GroundedSkybox.js +1 -1
  130. package/examples/jsm/objects/LensflareMesh.js +1 -1
  131. package/examples/jsm/objects/Reflector.js +72 -25
  132. package/examples/jsm/objects/Sky.js +90 -6
  133. package/examples/jsm/objects/SkyMesh.js +150 -16
  134. package/examples/jsm/objects/Water.js +4 -3
  135. package/examples/jsm/objects/Water2.js +5 -3
  136. package/examples/jsm/objects/Water2Mesh.js +1 -1
  137. package/examples/jsm/objects/WaterMesh.js +5 -7
  138. package/examples/jsm/physics/AmmoPhysics.js +27 -15
  139. package/examples/jsm/physics/JoltPhysics.js +10 -6
  140. package/examples/jsm/physics/RapierPhysics.js +36 -7
  141. package/examples/jsm/postprocessing/EffectComposer.js +7 -5
  142. package/examples/jsm/postprocessing/OutputPass.js +9 -0
  143. package/examples/jsm/postprocessing/RenderPass.js +10 -0
  144. package/examples/jsm/postprocessing/RenderTransitionPass.js +1 -1
  145. package/examples/jsm/postprocessing/UnrealBloomPass.js +48 -18
  146. package/examples/jsm/renderers/CSS3DRenderer.js +1 -1
  147. package/examples/jsm/renderers/Projector.js +246 -28
  148. package/examples/jsm/renderers/SVGRenderer.js +174 -60
  149. package/examples/jsm/shaders/GTAOShader.js +19 -6
  150. package/examples/jsm/shaders/HalftoneShader.js +12 -1
  151. package/examples/jsm/shaders/PoissonDenoiseShader.js +6 -2
  152. package/examples/jsm/shaders/SAOShader.js +17 -4
  153. package/examples/jsm/shaders/SSAOShader.js +11 -1
  154. package/examples/jsm/shaders/SSRShader.js +6 -5
  155. package/examples/jsm/shaders/UnpackDepthRGBAShader.js +2 -4
  156. package/examples/jsm/shaders/VignetteShader.js +1 -1
  157. package/examples/jsm/shaders/VolumeShader.js +31 -44
  158. package/examples/jsm/transpiler/AST.js +44 -0
  159. package/examples/jsm/transpiler/GLSLDecoder.js +65 -8
  160. package/examples/jsm/transpiler/Linker.js +1 -1
  161. package/examples/jsm/transpiler/ShaderToyDecoder.js +2 -0
  162. package/examples/jsm/transpiler/TSLEncoder.js +46 -3
  163. package/examples/jsm/transpiler/TranspilerUtils.js +3 -3
  164. package/examples/jsm/transpiler/WGSLEncoder.js +27 -0
  165. package/examples/jsm/tsl/WebGLNodesHandler.js +605 -0
  166. package/examples/jsm/tsl/display/AfterImageNode.js +11 -1
  167. package/examples/jsm/tsl/display/AnaglyphPassNode.js +458 -16
  168. package/examples/jsm/tsl/display/BilateralBlurNode.js +374 -0
  169. package/examples/jsm/tsl/display/BloomNode.js +75 -25
  170. package/examples/jsm/tsl/display/CRT.js +150 -0
  171. package/examples/jsm/tsl/display/ChromaticAberrationNode.js +3 -36
  172. package/examples/jsm/tsl/display/DenoiseNode.js +1 -1
  173. package/examples/jsm/tsl/display/DepthOfFieldNode.js +3 -3
  174. package/examples/jsm/tsl/display/DotScreenNode.js +1 -1
  175. package/examples/jsm/tsl/display/FSR1Node.js +477 -0
  176. package/examples/jsm/tsl/display/FXAANode.js +13 -14
  177. package/examples/jsm/tsl/display/GTAONode.js +40 -17
  178. package/examples/jsm/tsl/display/GaussianBlurNode.js +21 -2
  179. package/examples/jsm/tsl/display/GodraysNode.js +615 -0
  180. package/examples/jsm/tsl/display/ImportanceSampledEnvironment.js +560 -0
  181. package/examples/jsm/tsl/display/LensflareNode.js +1 -1
  182. package/examples/jsm/tsl/display/Lut3DNode.js +1 -1
  183. package/examples/jsm/tsl/display/OutlineNode.js +69 -19
  184. package/examples/jsm/tsl/display/ParallaxBarrierPassNode.js +2 -2
  185. package/examples/jsm/tsl/display/PixelationPassNode.js +9 -8
  186. package/examples/jsm/tsl/display/RGBShiftNode.js +2 -2
  187. package/examples/jsm/tsl/display/RecurrentDenoiseNode.js +912 -0
  188. package/examples/jsm/tsl/display/RetroPassNode.js +263 -0
  189. package/examples/jsm/tsl/display/SMAANode.js +2 -2
  190. package/examples/jsm/tsl/display/SSAAPassNode.js +15 -27
  191. package/examples/jsm/tsl/display/SSGINode.js +96 -62
  192. package/examples/jsm/tsl/display/SSRNode.js +831 -134
  193. package/examples/jsm/tsl/display/SSSNode.js +8 -6
  194. package/examples/jsm/tsl/display/Shape.js +29 -0
  195. package/examples/jsm/tsl/display/SharpenNode.js +283 -0
  196. package/examples/jsm/tsl/display/SobelOperatorNode.js +2 -2
  197. package/examples/jsm/tsl/display/StereoCompositePassNode.js +8 -1
  198. package/examples/jsm/tsl/display/StereoPassNode.js +1 -2
  199. package/examples/jsm/tsl/display/TAAUNode.js +835 -0
  200. package/examples/jsm/tsl/display/TRAANode.js +315 -126
  201. package/examples/jsm/tsl/display/TemporalReprojectNode.js +1023 -0
  202. package/examples/jsm/tsl/display/TransitionNode.js +1 -1
  203. package/examples/jsm/tsl/display/depthAwareBlend.js +80 -0
  204. package/examples/jsm/tsl/display/radialBlur.js +68 -0
  205. package/examples/jsm/tsl/lighting/ClusteredLightsNode.js +622 -0
  206. package/examples/jsm/tsl/lighting/DynamicLightsNode.js +300 -0
  207. package/examples/jsm/tsl/lighting/data/AmbientLightDataNode.js +61 -0
  208. package/examples/jsm/tsl/lighting/data/DirectionalLightDataNode.js +111 -0
  209. package/examples/jsm/tsl/lighting/data/HemisphereLightDataNode.js +99 -0
  210. package/examples/jsm/tsl/lighting/data/PointLightDataNode.js +134 -0
  211. package/examples/jsm/tsl/lighting/data/SpotLightDataNode.js +161 -0
  212. package/examples/jsm/tsl/math/Bayer.js +53 -3
  213. package/examples/jsm/tsl/math/curlNoise.js +107 -0
  214. package/examples/jsm/tsl/shadows/TileShadowNode.js +1 -1
  215. package/examples/jsm/tsl/shadows/TileShadowNodeHelper.js +3 -3
  216. package/examples/jsm/tsl/utils/GroundedSkybox.js +62 -0
  217. package/examples/jsm/tsl/utils/RNoise.js +51 -0
  218. package/examples/jsm/tsl/utils/SpecularHelpers.js +325 -0
  219. package/examples/jsm/utils/BufferGeometryUtils.js +128 -62
  220. package/examples/jsm/utils/ColorUtils.js +76 -0
  221. package/examples/jsm/utils/GeometryCompressionUtils.js +1 -1
  222. package/examples/jsm/utils/LDrawUtils.js +1 -1
  223. package/examples/jsm/utils/SceneOptimizer.js +1 -1
  224. package/examples/jsm/utils/ShadowMapViewer.js +24 -10
  225. package/examples/jsm/utils/ShadowMapViewerGPU.js +1 -1
  226. package/examples/jsm/utils/SkeletonUtils.js +14 -8
  227. package/examples/jsm/utils/WebGPUTextureUtils.js +1 -1
  228. package/examples/jsm/webxr/ARButton.js +1 -1
  229. package/examples/jsm/webxr/WebGLXRFallback.js +89 -0
  230. package/examples/jsm/webxr/XRControllerModelFactory.js +2 -2
  231. package/examples/jsm/webxr/XRHandMeshModel.js +36 -10
  232. package/examples/jsm/webxr/XRHandModelFactory.js +2 -1
  233. package/package.json +28 -34
  234. package/src/Three.Core.js +3 -1
  235. package/src/Three.TSL.js +35 -14
  236. package/src/Three.WebGPU.Nodes.js +5 -0
  237. package/src/Three.WebGPU.js +13 -0
  238. package/src/Three.js +1 -0
  239. package/src/animation/AnimationAction.js +18 -4
  240. package/src/animation/AnimationClip.js +0 -139
  241. package/src/animation/AnimationMixer.js +6 -0
  242. package/src/animation/AnimationUtils.js +1 -12
  243. package/src/animation/KeyframeTrack.js +47 -8
  244. package/src/animation/PropertyBinding.js +2 -2
  245. package/src/animation/PropertyMixer.js +4 -4
  246. package/src/animation/tracks/BooleanKeyframeTrack.js +1 -1
  247. package/src/animation/tracks/ColorKeyframeTrack.js +1 -1
  248. package/src/animation/tracks/NumberKeyframeTrack.js +1 -1
  249. package/src/animation/tracks/QuaternionKeyframeTrack.js +1 -1
  250. package/src/animation/tracks/StringKeyframeTrack.js +1 -1
  251. package/src/animation/tracks/VectorKeyframeTrack.js +1 -1
  252. package/src/audio/Audio.js +1 -1
  253. package/src/audio/AudioContext.js +2 -2
  254. package/src/audio/AudioListener.js +5 -3
  255. package/src/cameras/Camera.js +34 -4
  256. package/src/cameras/CubeCamera.js +20 -0
  257. package/src/cameras/StereoCamera.js +5 -2
  258. package/src/constants.js +90 -5
  259. package/src/core/BufferAttribute.js +13 -1
  260. package/src/core/BufferGeometry.js +43 -9
  261. package/src/core/Clock.js +7 -0
  262. package/src/core/Object3D.js +69 -11
  263. package/src/core/Raycaster.js +3 -3
  264. package/src/core/RenderTarget.js +19 -6
  265. package/src/extras/PMREMGenerator.js +13 -22
  266. package/src/extras/TextureUtils.js +6 -2
  267. package/src/extras/core/ShapePath.js +149 -160
  268. package/src/extras/curves/CatmullRomCurve3.js +3 -2
  269. package/src/geometries/ExtrudeGeometry.js +2 -2
  270. package/src/geometries/PolyhedronGeometry.js +1 -1
  271. package/src/geometries/SphereGeometry.js +8 -3
  272. package/src/geometries/TorusGeometry.js +8 -3
  273. package/src/helpers/CameraHelper.js +3 -0
  274. package/src/helpers/DirectionalLightHelper.js +6 -1
  275. package/src/helpers/HemisphereLightHelper.js +5 -0
  276. package/src/helpers/PointLightHelper.js +3 -25
  277. package/src/helpers/SpotLightHelper.js +4 -1
  278. package/src/lights/DirectionalLight.js +13 -0
  279. package/src/lights/HemisphereLight.js +10 -0
  280. package/src/lights/Light.js +1 -11
  281. package/src/lights/LightProbe.js +0 -15
  282. package/src/lights/LightShadow.js +15 -6
  283. package/src/lights/PointLight.js +15 -0
  284. package/src/lights/PointLightShadow.js +0 -86
  285. package/src/lights/SpotLight.js +22 -1
  286. package/src/lights/webgpu/IESSpotLight.js +2 -1
  287. package/src/loaders/AudioLoader.js +11 -1
  288. package/src/loaders/Cache.js +28 -0
  289. package/src/loaders/DataTextureLoader.js +75 -42
  290. package/src/loaders/FileLoader.js +2 -3
  291. package/src/loaders/ImageBitmapLoader.js +12 -9
  292. package/src/loaders/Loader.js +6 -0
  293. package/src/loaders/LoadingManager.js +5 -0
  294. package/src/loaders/MaterialLoader.js +37 -266
  295. package/src/loaders/ObjectLoader.js +48 -6
  296. package/src/loaders/nodes/NodeLoader.js +2 -2
  297. package/src/loaders/nodes/NodeObjectLoader.js +18 -0
  298. package/src/materials/LineBasicMaterial.js +4 -0
  299. package/src/materials/Material.js +198 -1
  300. package/src/materials/MeshBasicMaterial.js +24 -0
  301. package/src/materials/MeshDepthMaterial.js +10 -0
  302. package/src/materials/MeshDistanceMaterial.js +10 -0
  303. package/src/materials/MeshLambertMaterial.js +49 -1
  304. package/src/materials/MeshMatcapMaterial.js +25 -1
  305. package/src/materials/MeshNormalMaterial.js +9 -1
  306. package/src/materials/MeshPhongMaterial.js +49 -1
  307. package/src/materials/MeshPhysicalMaterial.js +38 -0
  308. package/src/materials/MeshStandardMaterial.js +42 -1
  309. package/src/materials/MeshToonMaterial.js +35 -2
  310. package/src/materials/PointsMaterial.js +7 -0
  311. package/src/materials/ShaderMaterial.js +106 -1
  312. package/src/materials/SpriteMaterial.js +7 -0
  313. package/src/materials/nodes/Line2NodeMaterial.js +380 -297
  314. package/src/materials/nodes/MeshBasicNodeMaterial.js +2 -2
  315. package/src/materials/nodes/MeshNormalNodeMaterial.js +2 -2
  316. package/src/materials/nodes/MeshPhongNodeMaterial.js +0 -9
  317. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +3 -30
  318. package/src/materials/nodes/MeshSSSNodeMaterial.js +0 -13
  319. package/src/materials/nodes/MeshStandardNodeMaterial.js +5 -15
  320. package/src/materials/nodes/NodeMaterial.js +153 -89
  321. package/src/materials/nodes/SpriteNodeMaterial.js +0 -10
  322. package/src/materials/nodes/manager/NodeMaterialObserver.js +234 -100
  323. package/src/math/Box3.js +5 -0
  324. package/src/math/FrustumArray.js +103 -133
  325. package/src/math/Interpolant.js +1 -1
  326. package/src/math/Line3.js +6 -5
  327. package/src/math/MathUtils.js +12 -12
  328. package/src/math/Matrix2.js +13 -9
  329. package/src/math/Matrix3.js +24 -9
  330. package/src/math/Matrix4.js +112 -74
  331. package/src/math/Plane.js +4 -3
  332. package/src/math/Quaternion.js +3 -29
  333. package/src/math/Sphere.js +1 -1
  334. package/src/math/Triangle.js +1 -1
  335. package/src/math/Vector2.js +13 -9
  336. package/src/math/Vector3.js +17 -15
  337. package/src/math/Vector4.js +15 -11
  338. package/src/math/interpolants/BezierInterpolant.js +106 -0
  339. package/src/nodes/Nodes.js +86 -71
  340. package/src/nodes/TSL.js +15 -13
  341. package/src/nodes/accessors/Arrays.js +5 -5
  342. package/src/nodes/accessors/Batch.js +108 -0
  343. package/src/nodes/accessors/Bitangent.js +7 -7
  344. package/src/nodes/accessors/BufferAttributeNode.js +120 -17
  345. package/src/nodes/accessors/BufferNode.js +29 -2
  346. package/src/nodes/accessors/Camera.js +149 -28
  347. package/src/nodes/accessors/ClippingNode.js +5 -5
  348. package/src/nodes/accessors/CubeTextureNode.js +27 -2
  349. package/src/nodes/accessors/Instance.js +264 -0
  350. package/src/nodes/accessors/MaterialNode.js +27 -3
  351. package/src/nodes/accessors/MaterialProperties.js +6 -8
  352. package/src/nodes/accessors/MaterialReferenceNode.js +1 -2
  353. package/src/nodes/accessors/ModelNode.js +1 -1
  354. package/src/nodes/accessors/{MorphNode.js → Morph.js} +99 -112
  355. package/src/nodes/accessors/Normal.js +24 -24
  356. package/src/nodes/accessors/Object3DNode.js +1 -1
  357. package/src/nodes/accessors/Position.js +39 -3
  358. package/src/nodes/accessors/ReferenceBaseNode.js +6 -6
  359. package/src/nodes/accessors/ReferenceNode.js +9 -8
  360. package/src/nodes/accessors/ReflectVector.js +3 -3
  361. package/src/nodes/accessors/RendererReferenceNode.js +1 -2
  362. package/src/nodes/accessors/SceneProperties.js +47 -0
  363. package/src/nodes/accessors/Skinning.js +263 -0
  364. package/src/nodes/accessors/StorageBufferNode.js +16 -27
  365. package/src/nodes/accessors/StorageTexture3DNode.js +100 -0
  366. package/src/nodes/accessors/StorageTextureNode.js +74 -11
  367. package/src/nodes/accessors/Tangent.js +8 -18
  368. package/src/nodes/accessors/Texture3DNode.js +32 -35
  369. package/src/nodes/accessors/TextureNode.js +124 -25
  370. package/src/nodes/accessors/UniformArrayNode.js +6 -4
  371. package/src/nodes/accessors/UserDataNode.js +1 -2
  372. package/src/nodes/accessors/VertexColorNode.js +1 -2
  373. package/src/nodes/code/FunctionCallNode.js +1 -1
  374. package/src/nodes/code/FunctionNode.js +4 -19
  375. package/src/nodes/core/ArrayNode.js +21 -2
  376. package/src/nodes/core/AssignNode.js +3 -3
  377. package/src/nodes/core/AttributeNode.js +3 -3
  378. package/src/nodes/core/BypassNode.js +1 -1
  379. package/src/nodes/core/ContextNode.js +104 -5
  380. package/src/nodes/core/IndexNode.js +2 -1
  381. package/src/nodes/core/InputNode.js +1 -1
  382. package/src/nodes/core/InspectorNode.js +1 -1
  383. package/src/nodes/core/IsolateNode.js +1 -1
  384. package/src/nodes/core/MRTNode.js +55 -4
  385. package/src/nodes/core/Node.js +151 -17
  386. package/src/nodes/core/NodeBuilder.js +479 -101
  387. package/src/nodes/core/NodeError.js +28 -0
  388. package/src/nodes/core/NodeFrame.js +12 -4
  389. package/src/nodes/core/NodeUtils.js +20 -18
  390. package/src/nodes/core/OutputStructNode.js +13 -11
  391. package/src/nodes/core/OverrideContextNode.js +153 -0
  392. package/src/nodes/core/ParameterNode.js +4 -4
  393. package/src/nodes/core/PropertyNode.js +66 -4
  394. package/src/nodes/core/StackNode.js +91 -20
  395. package/src/nodes/core/StackTrace.js +139 -0
  396. package/src/nodes/core/StructNode.js +20 -8
  397. package/src/nodes/core/StructTypeNode.js +17 -23
  398. package/src/nodes/core/SubBuildNode.js +2 -2
  399. package/src/nodes/core/UniformGroupNode.js +36 -6
  400. package/src/nodes/core/UniformNode.js +21 -5
  401. package/src/nodes/core/VarNode.js +56 -23
  402. package/src/nodes/core/VaryingNode.js +14 -21
  403. package/src/nodes/display/BlendModes.js +1 -105
  404. package/src/nodes/display/BumpMapNode.js +6 -1
  405. package/src/nodes/display/ColorAdjustment.js +27 -9
  406. package/src/nodes/display/ColorSpaceNode.js +3 -3
  407. package/src/nodes/display/FrontFacingNode.js +38 -9
  408. package/src/nodes/display/NormalMapNode.js +41 -6
  409. package/src/nodes/display/PassNode.js +157 -56
  410. package/src/nodes/display/PremultiplyAlphaFunctions.js +39 -0
  411. package/src/nodes/display/RenderOutputNode.js +19 -10
  412. package/src/nodes/display/ScreenNode.js +4 -2
  413. package/src/nodes/display/ToneMappingNode.js +1 -1
  414. package/src/nodes/display/ToonOutlinePassNode.js +2 -2
  415. package/src/nodes/display/ViewportDepthNode.js +52 -4
  416. package/src/nodes/display/ViewportDepthTextureNode.js +11 -15
  417. package/src/nodes/display/ViewportTextureNode.js +39 -11
  418. package/src/nodes/fog/Fog.js +18 -35
  419. package/src/nodes/functions/BSDF/BRDF_GGX_Multiscatter.js +3 -3
  420. package/src/nodes/functions/BSDF/DFGLUT.js +56 -0
  421. package/src/nodes/functions/BSDF/EnvironmentBRDF.js +2 -2
  422. package/src/nodes/functions/BSDF/V_GGX_SmithCorrelated_Anisotropic.js +2 -2
  423. package/src/nodes/functions/PhysicalLightingModel.js +126 -45
  424. package/src/nodes/functions/VolumetricLightingModel.js +40 -7
  425. package/src/nodes/geometry/RangeNode.js +5 -3
  426. package/src/nodes/gpgpu/AtomicFunctionNode.js +1 -1
  427. package/src/nodes/gpgpu/BarrierNode.js +9 -0
  428. package/src/nodes/gpgpu/ComputeBuiltinNode.js +2 -3
  429. package/src/nodes/gpgpu/ComputeNode.js +74 -48
  430. package/src/nodes/gpgpu/SubgroupFunctionNode.js +2 -2
  431. package/src/nodes/gpgpu/WorkgroupInfoNode.js +5 -5
  432. package/src/nodes/lighting/AnalyticLightNode.js +53 -0
  433. package/src/nodes/lighting/EnvironmentNode.js +30 -5
  434. package/src/nodes/lighting/IESSpotLightNode.js +40 -2
  435. package/src/nodes/lighting/LightingContextNode.js +10 -2
  436. package/src/nodes/lighting/LightsNode.js +97 -65
  437. package/src/nodes/lighting/PointShadowNode.js +166 -148
  438. package/src/nodes/lighting/ShadowFilterNode.js +74 -117
  439. package/src/nodes/lighting/ShadowNode.js +149 -51
  440. package/src/nodes/materialx/lib/mx_noise.js +2 -2
  441. package/src/nodes/math/BitcastNode.js +1 -1
  442. package/src/nodes/math/BitcountNode.js +433 -0
  443. package/src/nodes/math/ConditionalNode.js +6 -6
  444. package/src/nodes/math/MathNode.js +115 -52
  445. package/src/nodes/math/OperatorNode.js +24 -23
  446. package/src/nodes/math/PackFloatNode.js +98 -0
  447. package/src/nodes/math/UnpackFloatNode.js +96 -0
  448. package/src/nodes/parsers/GLSLNodeFunction.js +1 -1
  449. package/src/nodes/pmrem/PMREMNode.js +34 -3
  450. package/src/nodes/pmrem/PMREMUtils.js +9 -15
  451. package/src/nodes/tsl/TSLBase.js +1 -1
  452. package/src/nodes/tsl/TSLCore.js +99 -33
  453. package/src/nodes/utils/ArrayElementNode.js +14 -1
  454. package/src/nodes/utils/ConvertNode.js +1 -1
  455. package/src/nodes/utils/DebugNode.js +12 -12
  456. package/src/nodes/utils/EquirectUV.js +30 -5
  457. package/src/nodes/utils/EventNode.js +31 -2
  458. package/src/nodes/utils/FlipNode.js +1 -1
  459. package/src/nodes/utils/FunctionOverloadingNode.js +2 -2
  460. package/src/nodes/utils/JoinNode.js +3 -3
  461. package/src/nodes/utils/LoopNode.js +1 -1
  462. package/src/nodes/utils/MemberNode.js +2 -2
  463. package/src/nodes/utils/Packing.js +48 -5
  464. package/src/nodes/utils/PostProcessingUtils.js +33 -1
  465. package/src/nodes/utils/RTTNode.js +41 -25
  466. package/src/nodes/utils/ReflectorNode.js +4 -4
  467. package/src/nodes/utils/Remap.js +48 -0
  468. package/src/nodes/utils/RotateNode.js +1 -1
  469. package/src/nodes/utils/SampleNode.js +1 -1
  470. package/src/nodes/utils/SetNode.js +1 -1
  471. package/src/nodes/utils/SplitNode.js +1 -1
  472. package/src/nodes/utils/SpriteSheetUV.js +35 -0
  473. package/src/nodes/utils/StorageArrayElementNode.js +1 -1
  474. package/src/nodes/utils/UVUtils.js +28 -0
  475. package/src/objects/BatchedMesh.js +66 -30
  476. package/src/objects/InstancedMesh.js +19 -3
  477. package/src/objects/Line.js +1 -1
  478. package/src/objects/Mesh.js +1 -1
  479. package/src/objects/Points.js +1 -1
  480. package/src/objects/SkinnedMesh.js +26 -9
  481. package/src/renderers/WebGLRenderer.js +344 -156
  482. package/src/renderers/common/Animation.js +3 -3
  483. package/src/renderers/common/Attributes.js +15 -1
  484. package/src/renderers/common/Backend.js +78 -13
  485. package/src/renderers/common/Background.js +26 -13
  486. package/src/renderers/common/BindGroup.js +1 -16
  487. package/src/renderers/common/Binding.js +11 -0
  488. package/src/renderers/common/Bindings.js +141 -57
  489. package/src/renderers/common/BlendMode.js +143 -0
  490. package/src/renderers/common/Buffer.js +49 -0
  491. package/src/renderers/common/BundleGroup.js +1 -1
  492. package/src/renderers/common/ChainMap.js +30 -6
  493. package/src/renderers/common/ClippingContext.js +10 -2
  494. package/src/renderers/common/ComputePipeline.js +1 -1
  495. package/src/renderers/common/CubeRenderTarget.js +51 -7
  496. package/src/renderers/common/Geometries.js +29 -3
  497. package/src/renderers/common/Info.js +374 -4
  498. package/src/renderers/common/InspectorBase.js +6 -1
  499. package/src/renderers/common/Lighting.js +51 -19
  500. package/src/renderers/common/Pipelines.js +40 -7
  501. package/src/renderers/common/PostProcessing.js +8 -206
  502. package/src/renderers/common/ReadbackBuffer.js +78 -0
  503. package/src/renderers/common/RenderBundle.js +3 -1
  504. package/src/renderers/common/RenderBundles.js +7 -3
  505. package/src/renderers/common/RenderContext.js +16 -0
  506. package/src/renderers/common/RenderContexts.js +33 -49
  507. package/src/renderers/common/RenderList.js +41 -4
  508. package/src/renderers/common/RenderLists.js +2 -1
  509. package/src/renderers/common/RenderObject.js +88 -16
  510. package/src/renderers/common/RenderObjectPipeline.js +40 -0
  511. package/src/renderers/common/RenderObjects.js +21 -5
  512. package/src/renderers/common/RenderPipeline.js +232 -17
  513. package/src/renderers/common/Renderer.js +700 -163
  514. package/src/renderers/common/Sampler.js +16 -48
  515. package/src/renderers/common/StorageBuffer.js +13 -1
  516. package/src/renderers/common/Textures.js +121 -9
  517. package/src/renderers/common/TimestampQueryPool.js +6 -4
  518. package/src/renderers/common/Uniform.js +8 -0
  519. package/src/renderers/common/UniformsGroup.js +84 -1
  520. package/src/renderers/common/XRManager.js +377 -51
  521. package/src/renderers/common/extras/PMREMGenerator.js +40 -61
  522. package/src/renderers/common/nodes/NodeBuilderState.js +10 -2
  523. package/src/renderers/common/nodes/NodeLibrary.js +4 -4
  524. package/src/renderers/common/nodes/{Nodes.js → NodeManager.js} +298 -106
  525. package/src/renderers/common/nodes/NodeStorageBuffer.js +13 -2
  526. package/src/renderers/common/nodes/NodeUniformBuffer.js +65 -0
  527. package/src/renderers/shaders/DFGLUTData.js +19 -34
  528. package/src/renderers/shaders/ShaderChunk/batching_pars_vertex.glsl.js +2 -2
  529. package/src/renderers/shaders/ShaderChunk/color_fragment.glsl.js +1 -5
  530. package/src/renderers/shaders/ShaderChunk/color_pars_fragment.glsl.js +1 -5
  531. package/src/renderers/shaders/ShaderChunk/color_pars_vertex.glsl.js +1 -5
  532. package/src/renderers/shaders/ShaderChunk/color_vertex.glsl.js +8 -10
  533. package/src/renderers/shaders/ShaderChunk/common.glsl.js +13 -4
  534. package/src/renderers/shaders/ShaderChunk/defaultnormal_vertex.glsl.js +0 -6
  535. package/src/renderers/shaders/ShaderChunk/envmap_common_pars_fragment.glsl.js +0 -1
  536. package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +9 -13
  537. package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +2 -2
  538. package/src/renderers/shaders/ShaderChunk/envmap_vertex.glsl.js +1 -1
  539. package/src/renderers/shaders/ShaderChunk/lightprobes_pars_fragment.glsl.js +80 -0
  540. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +13 -2
  541. package/src/renderers/shaders/ShaderChunk/lights_fragment_end.glsl.js +6 -0
  542. package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +6 -2
  543. package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +3 -1
  544. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +8 -4
  545. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +112 -53
  546. package/src/renderers/shaders/ShaderChunk/normal_fragment_begin.glsl.js +2 -2
  547. package/src/renderers/shaders/ShaderChunk/normal_fragment_maps.glsl.js +7 -0
  548. package/src/renderers/shaders/ShaderChunk/normal_vertex.glsl.js +6 -0
  549. package/src/renderers/shaders/ShaderChunk/packing.glsl.js +20 -4
  550. package/src/renderers/shaders/ShaderChunk/premultiplied_alpha_fragment.glsl.js +0 -1
  551. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +225 -186
  552. package/src/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl.js +12 -2
  553. package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +1 -1
  554. package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +2 -2
  555. package/src/renderers/shaders/ShaderChunk.js +5 -3
  556. package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +1 -2
  557. package/src/renderers/shaders/ShaderLib/depth.glsl.js +3 -0
  558. package/src/renderers/shaders/ShaderLib/{distanceRGBA.glsl.js → distance.glsl.js} +2 -3
  559. package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +2 -1
  560. package/src/renderers/shaders/ShaderLib/meshnormal.glsl.js +1 -2
  561. package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +2 -1
  562. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +4 -9
  563. package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +0 -1
  564. package/src/renderers/shaders/ShaderLib/shadow.glsl.js +1 -1
  565. package/src/renderers/shaders/ShaderLib/vsm.glsl.js +4 -6
  566. package/src/renderers/shaders/ShaderLib.js +7 -6
  567. package/src/renderers/shaders/UniformsLib.js +7 -5
  568. package/src/renderers/shaders/UniformsUtils.js +27 -5
  569. package/src/renderers/webgl/WebGLAnimation.js +2 -1
  570. package/src/renderers/webgl/WebGLBackground.js +15 -15
  571. package/src/renderers/webgl/WebGLBindingStates.js +99 -27
  572. package/src/renderers/webgl/WebGLBufferRenderer.js +0 -32
  573. package/src/renderers/webgl/WebGLCapabilities.js +9 -4
  574. package/src/renderers/webgl/WebGLEnvironments.js +228 -0
  575. package/src/renderers/webgl/WebGLGeometries.js +10 -7
  576. package/src/renderers/webgl/WebGLIndexedBufferRenderer.js +0 -32
  577. package/src/renderers/webgl/WebGLLights.js +18 -1
  578. package/src/renderers/webgl/WebGLMaterials.js +24 -13
  579. package/src/renderers/webgl/WebGLObjects.js +3 -1
  580. package/src/renderers/webgl/WebGLOutput.js +271 -0
  581. package/src/renderers/webgl/WebGLProgram.js +54 -113
  582. package/src/renderers/webgl/WebGLPrograms.js +74 -55
  583. package/src/renderers/webgl/WebGLRenderLists.js +24 -1
  584. package/src/renderers/webgl/WebGLRenderStates.js +13 -2
  585. package/src/renderers/webgl/WebGLShaderCache.js +5 -11
  586. package/src/renderers/webgl/WebGLShadowMap.js +188 -24
  587. package/src/renderers/webgl/WebGLState.js +75 -37
  588. package/src/renderers/webgl/WebGLTextures.js +230 -56
  589. package/src/renderers/webgl/WebGLUniforms.js +40 -3
  590. package/src/renderers/webgl/WebGLUniformsGroups.js +82 -35
  591. package/src/renderers/webgl/WebGLUtils.js +6 -2
  592. package/src/renderers/webgl-fallback/WebGLBackend.js +322 -92
  593. package/src/renderers/webgl-fallback/WebGLBufferRenderer.js +0 -41
  594. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +295 -66
  595. package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +53 -19
  596. package/src/renderers/webgl-fallback/utils/WebGLCapabilities.js +25 -0
  597. package/src/renderers/webgl-fallback/utils/WebGLState.js +223 -6
  598. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +118 -73
  599. package/src/renderers/webgl-fallback/utils/WebGLTimestampQueryPool.js +10 -10
  600. package/src/renderers/webgl-fallback/utils/WebGLUtils.js +9 -3
  601. package/src/renderers/webgpu/WebGPUBackend.js +733 -302
  602. package/src/renderers/webgpu/WebGPURenderer.js +2 -1
  603. package/src/renderers/webgpu/descriptors/GPUBindGroupDescriptor.js +48 -0
  604. package/src/renderers/webgpu/descriptors/GPUBufferDescriptor.js +57 -0
  605. package/src/renderers/webgpu/descriptors/GPUCommandEncoderDescriptor.js +30 -0
  606. package/src/renderers/webgpu/descriptors/GPUComputePassDescriptor.js +38 -0
  607. package/src/renderers/webgpu/descriptors/GPUComputePipelineDescriptor.js +48 -0
  608. package/src/renderers/webgpu/descriptors/GPUCopyExternalImageDestInfo.js +47 -0
  609. package/src/renderers/webgpu/descriptors/GPUCopyExternalImageSourceInfo.js +50 -0
  610. package/src/renderers/webgpu/descriptors/GPUExtent3D.js +51 -0
  611. package/src/renderers/webgpu/descriptors/GPUPipelineLayoutDescriptor.js +39 -0
  612. package/src/renderers/webgpu/descriptors/GPUQuerySetDescriptor.js +47 -0
  613. package/src/renderers/webgpu/descriptors/GPURenderBundleEncoderDescriptor.js +74 -0
  614. package/src/renderers/webgpu/descriptors/GPURenderPassColorAttachment.js +72 -0
  615. package/src/renderers/webgpu/descriptors/GPURenderPassDepthStencilAttachment.js +99 -0
  616. package/src/renderers/webgpu/descriptors/GPURenderPassDescriptor.js +72 -0
  617. package/src/renderers/webgpu/descriptors/GPURenderPassTimestampWrites.js +49 -0
  618. package/src/renderers/webgpu/descriptors/GPURenderPipelineDescriptor.js +130 -0
  619. package/src/renderers/webgpu/descriptors/GPUSamplerDescriptor.js +119 -0
  620. package/src/renderers/webgpu/descriptors/GPUShaderModuleDescriptor.js +46 -0
  621. package/src/renderers/webgpu/descriptors/GPUTexelCopyBufferInfo.js +57 -0
  622. package/src/renderers/webgpu/descriptors/GPUTexelCopyBufferLayout.js +48 -0
  623. package/src/renderers/webgpu/descriptors/GPUTexelCopyTextureInfo.js +61 -0
  624. package/src/renderers/webgpu/descriptors/GPUTextureDescriptor.js +99 -0
  625. package/src/renderers/webgpu/descriptors/GPUTextureViewDescriptor.js +108 -0
  626. package/src/renderers/webgpu/nodes/StandardNodeLibrary.js +0 -1
  627. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +526 -93
  628. package/src/renderers/webgpu/nodes/WGSLNodeFunction.js +1 -1
  629. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +194 -61
  630. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +395 -234
  631. package/src/renderers/webgpu/utils/WebGPUCapabilities.js +48 -0
  632. package/src/renderers/webgpu/utils/WebGPUConstants.js +10 -0
  633. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +224 -91
  634. package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +228 -213
  635. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +428 -175
  636. package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +40 -25
  637. package/src/renderers/webgpu/utils/WebGPUUtils.js +70 -13
  638. package/src/renderers/webxr/WebXRController.js +12 -0
  639. package/src/renderers/webxr/WebXRManager.js +4 -2
  640. package/src/textures/CubeDepthTexture.js +76 -0
  641. package/src/textures/DepthTexture.js +1 -1
  642. package/src/textures/ExternalTexture.js +0 -3
  643. package/src/textures/HTMLTexture.js +74 -0
  644. package/src/textures/Source.js +2 -2
  645. package/src/textures/Texture.js +16 -5
  646. package/src/utils.js +280 -3
  647. package/examples/fonts/LICENSE +0 -13
  648. package/examples/fonts/MPLUSRounded1c/MPLUSRounded1c-Regular.typeface.json.zip +0 -0
  649. package/examples/fonts/MPLUSRounded1c/OFL.txt +0 -91
  650. package/examples/fonts/README.md +0 -11
  651. package/examples/fonts/droid/NOTICE +0 -190
  652. package/examples/fonts/droid/README.txt +0 -18
  653. package/examples/fonts/droid/droid_sans_bold.typeface.json +0 -1
  654. package/examples/fonts/droid/droid_sans_mono_regular.typeface.json +0 -1
  655. package/examples/fonts/droid/droid_sans_regular.typeface.json +0 -1
  656. package/examples/fonts/droid/droid_serif_bold.typeface.json +0 -1
  657. package/examples/fonts/droid/droid_serif_regular.typeface.json +0 -1
  658. package/examples/fonts/gentilis_bold.typeface.json +0 -1
  659. package/examples/fonts/gentilis_regular.typeface.json +0 -1
  660. package/examples/fonts/helvetiker_bold.typeface.json +0 -1
  661. package/examples/fonts/helvetiker_regular.typeface.json +0 -1
  662. package/examples/fonts/optimer_bold.typeface.json +0 -1
  663. package/examples/fonts/optimer_regular.typeface.json +0 -1
  664. package/examples/fonts/ttf/README.md +0 -9
  665. package/examples/fonts/ttf/kenpixel.ttf +0 -0
  666. package/examples/jsm/libs/ammo.wasm.js +0 -822
  667. package/examples/jsm/libs/ammo.wasm.wasm +0 -0
  668. package/examples/jsm/libs/draco/draco_encoder.js +0 -33
  669. package/examples/jsm/libs/draco/gltf/draco_encoder.js +0 -33
  670. package/examples/jsm/libs/lottie_canvas.module.js +0 -14849
  671. package/examples/jsm/libs/opentype.module.js +0 -14506
  672. package/examples/jsm/libs/rhino3dm/rhino3dm.js +0 -21
  673. package/examples/jsm/libs/rhino3dm/rhino3dm.module.js +0 -16
  674. package/examples/jsm/libs/rhino3dm/rhino3dm.wasm +0 -0
  675. package/examples/jsm/lighting/TiledLighting.js +0 -42
  676. package/examples/jsm/materials/MeshGouraudMaterial.js +0 -434
  677. package/examples/jsm/materials/MeshPostProcessingMaterial.js +0 -167
  678. package/examples/jsm/shaders/GodRaysShader.js +0 -333
  679. package/examples/jsm/tsl/display/AnamorphicNode.js +0 -282
  680. package/examples/jsm/tsl/lighting/TiledLightsNode.js +0 -442
  681. package/src/nodes/accessors/BatchNode.js +0 -163
  682. package/src/nodes/accessors/InstanceNode.js +0 -244
  683. package/src/nodes/accessors/InstancedMeshNode.js +0 -50
  684. package/src/nodes/accessors/SceneNode.js +0 -145
  685. package/src/nodes/accessors/SkinningNode.js +0 -327
  686. package/src/nodes/code/ScriptableNode.js +0 -726
  687. package/src/nodes/code/ScriptableValueNode.js +0 -253
  688. package/src/nodes/display/PosterizeNode.js +0 -65
  689. package/src/nodes/functions/BSDF/DFGApprox.js +0 -71
  690. package/src/nodes/utils/RemapNode.js +0 -125
  691. package/src/nodes/utils/SpriteSheetUVNode.js +0 -90
  692. package/src/renderers/webgl/WebGLCubeMaps.js +0 -99
  693. package/src/renderers/webgl/WebGLCubeUVMaps.js +0 -134
@@ -1,653 +1,2053 @@
1
1
  export class Style {
2
2
 
3
- static init() {
4
-
5
- if ( document.getElementById( 'profiler-styles' ) ) return;
6
-
7
- const css = `
8
- :root {
9
- --profiler-bg: #1e1e24f5;
10
- --profiler-header-bg: #2a2a33aa;
11
- --profiler-header: #2a2a33;
12
- --profiler-border: #4a4a5a;
13
- --text-primary: #e0e0e0;
14
- --text-secondary: #9a9aab;
15
- --accent-color: #00aaff;
16
- --color-green: #4caf50;
17
- --color-yellow: #ffc107;
18
- --color-red: #f44336;
19
- --font-family: 'Inter', 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
20
- --font-mono: 'Fira Code', 'Courier New', Courier, monospace;
21
- }
3
+ static init( container ) {
4
+
5
+ const css = /* css */`
6
+ @scope (.three-inspector) {
7
+
8
+ :scope {
9
+ --profiler-background: #1e1e24f5;
10
+ --profiler-header-background: #2a2a33aa;
11
+ --profiler-header: #2a2a33;
12
+ --profiler-border: #4a4a5a;
13
+ --text-primary: #e0e0e0;
14
+ --text-secondary: #9a9aab;
15
+ --color-accent: #00aaff;
16
+ --color-green: #4caf50;
17
+ --color-yellow: #ffc107;
18
+ --color-red: #f44336;
19
+ --color-fps: rgb(63, 81, 181);
20
+ --color-call: rgba(255, 185, 34, 1);
21
+ --font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
22
+ --font-mono: 'Courier New', Courier, monospace;
23
+ }
24
+
25
+ .profiler-panel, .profiler-toggle, .detached-tab-panel,
26
+ .profiler-panel *, .profiler-toggle *, .detached-tab-panel * {
27
+ text-transform: initial;
28
+ line-height: normal;
29
+ box-sizing: border-box;
30
+ -webkit-font-smoothing: antialiased;
31
+ -moz-osx-font-smoothing: grayscale;
32
+ -webkit-tap-highlight-color: transparent;
33
+ }
34
+
35
+ .profiler-toggle {
36
+ position: fixed;
37
+ top: 15px;
38
+ right: 15px;
39
+ background-color: rgba(30, 30, 36, 0.85);
40
+ border: 1px solid #4a4a5a54;
41
+ border-radius: 12px 6px 6px 12px;
42
+ color: var(--text-primary);
43
+ cursor: pointer;
44
+ z-index: 1001;
45
+ transition: all 0.2s ease-in-out;
46
+ /*font-size: 14px;*/
47
+ font-size: 15px;
48
+ backdrop-filter: blur(8px);
49
+ box-shadow: 0 4px 15px rgba(0, 0, 0, 0.3);
50
+ display: flex;
51
+ align-items: stretch;
52
+ padding: 0;
53
+ overflow: hidden;
54
+ font-family: var(--font-family);
55
+ }
56
+
57
+ .profiler-toggle-graph {
58
+ position: absolute;
59
+ bottom: 0;
60
+ left: 0;
61
+ width: 100%;
62
+ height: 100%;
63
+ z-index: 0;
64
+ pointer-events: none;
65
+ background: transparent;
66
+ border: none;
67
+ border-radius: inherit;
68
+ opacity: 0.5;
69
+ }
70
+
71
+ .profiler-toggle.position-right.panel-open {
72
+ right: auto;
73
+ left: 15px;
74
+ border-radius: 6px 12px 12px 6px;
75
+ flex-direction: row-reverse;
76
+ }
77
+
78
+ .profiler-toggle.position-right.panel-open .builtin-tabs-container {
79
+ border-right: none;
80
+ border-left: 1px solid #262636;
81
+ }
82
+
83
+ .profiler-toggle:hover {
84
+ border-color: var(--color-accent);
85
+ }
86
+
87
+ .profiler-toggle.panel-open .toggle-icon {
88
+ background-color: rgba(0, 170, 255, 0.2);
89
+ color: var(--color-accent);
90
+ }
91
+
92
+ .toggle-icon {
93
+ position: relative;
94
+ z-index: 1;
95
+ display: flex;
96
+ align-items: center;
97
+ justify-content: center;
98
+ width: 40px;
99
+ font-size: 20px;
100
+ transition: background-color 0.2s;
101
+ }
102
+
103
+ .console-badge-container {
104
+ position: absolute;
105
+ top: 2px;
106
+ right: 2px;
107
+ display: flex;
108
+ gap: 2px;
109
+ pointer-events: none;
110
+ }
111
+
112
+ .console-badge,
113
+ .tab-badge {
114
+ display: inline-flex;
115
+ align-items: center;
116
+ justify-content: center;
117
+ min-width: 14px;
118
+ height: 14px;
119
+ padding: 0 4px;
120
+ border-radius: 7px;
121
+ font-size: 9px;
122
+ font-weight: bold;
123
+ color: #ffffff;
124
+ line-height: 1;
125
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.4);
126
+ border: 1px solid rgba(0, 0, 0, 0.2);
127
+ }
128
+
129
+ .tab-badge-container {
130
+ position: absolute;
131
+ top: 1px;
132
+ right: 3px;
133
+ display: flex;
134
+ gap: 2px;
135
+ pointer-events: none;
136
+ }
137
+
138
+ .console-badge.error,
139
+ .tab-badge.error {
140
+ background-color: var(--color-red);
141
+ }
142
+
143
+ .console-badge.warn,
144
+ .tab-badge.warn {
145
+ background-color: var(--color-yellow);
146
+ color: #111111;
147
+ }
148
+
149
+ .profiler-toggle:hover .toggle-icon {
150
+ background-color: rgba(255, 255, 255, 0.05);
151
+ }
152
+
153
+ .profiler-toggle.panel-open:hover .toggle-icon {
154
+ background-color: rgba(0, 170, 255, 0.3);
155
+ }
156
+
157
+ .toggle-separator {
158
+ width: 1px;
159
+ background-color: var(--profiler-border);
160
+ }
161
+
162
+ .toggle-text {
163
+ position: relative;
164
+ z-index: 1;
165
+ display: flex;
166
+ align-items: baseline;
167
+ padding: 8px 14px;
168
+ min-width: 80px;
169
+ justify-content: right;
170
+ }
171
+
172
+ .toggle-text .fps-label {
173
+ font-size: 0.7em;
174
+ margin-left: 10px;
175
+ color: #999;
176
+ }
177
+
178
+ .builtin-tabs-container {
179
+ position: relative;
180
+ z-index: 1;
181
+ display: flex;
182
+ align-items: stretch;
183
+ gap: 0;
184
+ border-right: 1px solid #262636;
185
+ order: -1;
186
+ }
187
+
188
+ .builtin-tab-btn {
189
+ background: transparent;
190
+ border: none;
191
+ color: var(--text-secondary);
192
+ cursor: pointer;
193
+ padding: 8px 14px;
194
+ font-family: var(--font-family);
195
+ font-size: 13px;
196
+ font-weight: 600;
197
+ transition: all 0.2s;
198
+ display: flex;
199
+ align-items: center;
200
+ justify-content: center;
201
+ min-width: 32px;
202
+ position: relative;
203
+ }
204
+
205
+ .builtin-tab-btn svg {
206
+ width: 20px;
207
+ height: 20px;
208
+ stroke: currentColor;
209
+ }
210
+
211
+ .builtin-tab-btn:hover {
212
+ background-color: rgba(255, 255, 255, 0.08);
213
+ color: var(--color-accent);
214
+ }
215
+
216
+ .builtin-tab-btn:active {
217
+ background-color: rgba(255, 255, 255, 0.12);
218
+ }
219
+
220
+ .builtin-tab-btn.active {
221
+ background-color: rgba(0, 170, 255, 0.2);
222
+ color: var(--color-accent);
223
+ }
224
+
225
+ .builtin-tab-btn.active:hover {
226
+ background-color: rgba(0, 170, 255, 0.3);
227
+ }
228
+
229
+ .profiler-mini-panel {
230
+ position: fixed;
231
+ top: 60px;
232
+ right: 15px;
233
+ background-color: rgba(30, 30, 36, 0.85);
234
+ border: 1px solid #4a4a5a54;
235
+ border-radius: 8px;
236
+ color: var(--text-primary);
237
+ z-index: 9999;
238
+ backdrop-filter: blur(8px);
239
+ box-shadow: 0 6px 24px rgba(0, 0, 0, 0.5);
240
+ font-family: var(--font-family);
241
+ font-size: 11px;
242
+ width: 350px;
243
+ max-width: calc(100vw - 30px);
244
+ min-width: 170px;
245
+ max-height: calc(100vh - 100px);
246
+ overflow-y: auto;
247
+ overflow-x: hidden;
248
+ display: none;
249
+ opacity: 0;
250
+ transform: translateY(-10px) scale(0.98);
251
+ transition: opacity 0.25s cubic-bezier(0.4, 0, 0.2, 1),
252
+ transform 0.25s cubic-bezier(0.4, 0, 0.2, 1);
253
+ }
254
+
255
+ .profiler-mini-panel.position-right.panel-open {
256
+ right: auto;
257
+ left: 15px;
258
+ }
259
+
260
+ .profiler-mini-panel.visible {
261
+ display: block;
262
+ opacity: 1;
263
+ transform: translateY(0) scale(1);
264
+ }
265
+
266
+ /* Position toggle and mini-panel at the bottom when maximized */
267
+ :scope:has(.profiler-panel.maximized) .profiler-toggle,
268
+ :scope.maximized .profiler-toggle {
269
+ top: auto !important;
270
+ bottom: 15px !important;
271
+ z-index: 10005 !important;
272
+ }
273
+
274
+ :scope:has(.profiler-panel.maximized) .profiler-mini-panel,
275
+ :scope.maximized .profiler-mini-panel {
276
+ top: auto !important;
277
+ bottom: 60px !important;
278
+ max-height: calc(100vh - 120px) !important;
279
+ z-index: 10006 !important;
280
+ }
281
+
282
+ .profiler-mini-panel::-webkit-scrollbar {
283
+ width: 6px;
284
+ }
285
+
286
+ .profiler-mini-panel::-webkit-scrollbar-track {
287
+ background: transparent;
288
+ }
289
+
290
+ .profiler-mini-panel::-webkit-scrollbar-thumb {
291
+ background: rgba(255, 255, 255, 0.15);
292
+ border-radius: 3px;
293
+ transition: background 0.2s;
294
+ }
295
+
296
+ .profiler-mini-panel::-webkit-scrollbar-thumb:hover {
297
+ background: rgba(255, 255, 255, 0.25);
298
+ }
299
+
300
+ .mini-panel-content {
301
+ padding: 0;
302
+ font-size: 11px;
303
+ line-height: 1.5;
304
+ font-family: var(--font-mono);
305
+ letter-spacing: 0.3px;
306
+ user-select: none;
307
+ -webkit-user-select: none;
308
+ }
309
+
310
+ .mini-panel-content .profiler-content {
311
+ display: block !important;
312
+ background: transparent;
313
+ }
314
+
315
+ .mini-panel-content .list-scroll-wrapper {
316
+ max-height: calc(100vh - 120px);
317
+ overflow-y: auto;
318
+ overflow-x: hidden;
319
+ width: 100%;
320
+ }
321
+
322
+ .mini-panel-content .list-scroll-wrapper::-webkit-scrollbar {
323
+ width: 4px;
324
+ }
325
+
326
+ .mini-panel-content .list-scroll-wrapper::-webkit-scrollbar-track {
327
+ background: transparent;
328
+ }
329
+
330
+ .mini-panel-content .list-scroll-wrapper::-webkit-scrollbar-thumb {
331
+ background: rgba(255, 255, 255, 0.1);
332
+ border-radius: 2px;
333
+ }
334
+
335
+ .mini-panel-content .list-scroll-wrapper::-webkit-scrollbar-thumb:hover {
336
+ background: rgba(255, 255, 255, 0.2);
337
+ }
338
+
339
+ .mini-panel-content .parameters {
340
+ background: transparent;
341
+ border: none;
342
+ box-shadow: none;
343
+ padding: 4px;
344
+ }
345
+
346
+ @media screen and (max-width: 340px) {
347
+
348
+ .mini-panel-content .parameters {
349
+ min-width: 0 !important;
350
+ }
351
+
352
+ .mini-panel-content .list-container.parameters .list-item-row,
353
+ .mini-panel-content .list-container.parameters .list-header {
354
+ grid-template-columns: minmax(0, .5fr) minmax(0, 1fr) !important;
355
+ }
356
+
357
+ }
358
+
359
+ .mini-panel-content .list-container.parameters {
360
+ padding: 2px 6px 0px 6px !important;
361
+ }
362
+
363
+ .mini-panel-content .list-header {
364
+ display: none;
365
+ padding: 2px 4px;
366
+ font-size: 11px;
367
+ font-weight: 600;
368
+ text-transform: uppercase;
369
+ letter-spacing: 0.5px;
370
+ }
371
+
372
+ .mini-panel-content .list-item {
373
+ border-bottom: 1px solid rgba(74, 74, 90, 0.2);
374
+ transition: background-color 0.15s;
375
+ }
376
+
377
+ .mini-panel-content .list-item:last-child {
378
+ border-bottom: none;
379
+ }
380
+
381
+ .mini-panel-content .list-item:hover {
382
+ background-color: rgba(255, 255, 255, 0.04);
383
+ }
384
+
385
+ .mini-panel-content .list-item.actionable:hover {
386
+ background-color: rgba(255, 255, 255, 0.06);
387
+ cursor: pointer;
388
+ }
389
+
390
+ .info-icon {
391
+ display: inline-flex;
392
+ align-items: center;
393
+ justify-content: center;
394
+ width: 14px;
395
+ height: 14px;
396
+ border-radius: 50%;
397
+ background-color: rgba(255, 255, 255, 0.1);
398
+ color: var(--text-secondary);
399
+ font-size: 10px;
400
+ font-style: italic;
401
+ margin-left: 6px;
402
+ cursor: help;
403
+ position: relative;
404
+ }
405
+
406
+ .info-icon.active {
407
+ background-color: var(--color-accent);
408
+ color: white;
409
+ }
410
+
411
+ @media (hover: hover) {
412
+ .info-icon:hover {
413
+ background-color: var(--color-accent);
414
+ color: white;
415
+ }
416
+ }
417
+
418
+ .info-tooltip {
419
+ position: fixed;
420
+ transform: translate(-50%, -100%);
421
+ background-color: rgba(30, 30, 36, 0.95);
422
+ border: 1px solid var(--profiler-border);
423
+ border-radius: 6px;
424
+ padding: 10px 14px;
425
+ color: var(--text-primary);
426
+ font-size: 12px;
427
+ width: max-content;
428
+ max-width: 250px;
429
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.4);
430
+ opacity: 0;
431
+ visibility: hidden;
432
+ transition: opacity 0.2s, visibility 0.2s;
433
+ z-index: 999999;
434
+ font-style: normal;
435
+ font-family: var(--font-family);
436
+ text-align: left;
437
+ white-space: normal;
438
+ }
439
+
440
+ .info-tooltip h3 {
441
+ margin: 0 0 6px 0;
442
+ font-size: 13px;
443
+ color: var(--color-accent);
444
+ }
445
+
446
+ .info-tooltip strong {
447
+ font-weight: 600;
448
+ color: white;
449
+ }
450
+
451
+ /* Style adjustments for lil-gui look */
452
+ .mini-panel-content .item-row {
453
+ padding: 3px 8px;
454
+ min-height: 24px;
455
+ }
456
+
457
+ .mini-panel-content .list-item-row {
458
+ padding: 1px 4px;
459
+ gap: 8px;
460
+ min-height: 21px;
461
+ align-items: center;
462
+ }
463
+
464
+ .mini-panel-content input[type="checkbox"] {
465
+ width: 12px;
466
+ height: 12px;
467
+ }
468
+
469
+ .mini-panel-content input[type="range"] {
470
+ height: 18px;
471
+ }
472
+
473
+ .mini-panel-content .value-number input,
474
+ .mini-panel-content .value-slider input {
475
+ background-color: rgba(0, 0, 0, 0.3);
476
+ border: 1px solid rgba(74, 74, 90, 0.5);
477
+ font-size: 10px;
478
+ }
479
+
480
+ .mini-panel-content .value-number input:focus,
481
+ .mini-panel-content .value-slider input:focus {
482
+ border-color: var(--color-accent);
483
+ }
484
+
485
+ .mini-panel-content .value-slider {
486
+ gap: 6px;
487
+ }
488
+
489
+ /* Compact nested items */
490
+ .mini-panel-content .list-item .list-item {
491
+ margin-left: 8px;
492
+ }
493
+
494
+ .mini-panel-content .list-item .list-item .item-row,
495
+ .mini-panel-content .list-item .list-item .list-item-row {
496
+ padding: 2px 6px;
497
+ min-height: 22px;
498
+ }
499
+
500
+ /* Compact collapsible headers */
501
+ .mini-panel-content .collapsible .item-row,
502
+ .mini-panel-content .list-item-row.collapsible {
503
+ padding: 2px 8px;
504
+ font-weight: 600;
505
+ min-height: 16px;
506
+ display: flex;
507
+ align-items: center;
508
+ line-height: 1;
509
+ }
510
+
511
+ .mini-panel-content .collapsible-icon {
512
+ font-size: 10px;
513
+ width: 14px;
514
+ height: 14px;
515
+ }
516
+
517
+ .mini-panel-content .param-control input[type="range"] {
518
+ height: 12px;
519
+ margin-top: 1px;
520
+ padding-top: 5px;
521
+ user-select: none;
522
+ -webkit-user-select: none;
523
+ outline: none;
524
+ }
525
+
526
+ .mini-panel-content .param-control input[type="range"]::-webkit-slider-thumb {
527
+ width: 14px;
528
+ height: 14px;
529
+ margin-top: -5px;
530
+ user-select: none;
531
+ -webkit-user-select: none;
532
+ }
533
+
534
+ .mini-panel-content .param-control input[type="range"]::-moz-range-thumb {
535
+ width: 14px;
536
+ height: 14px;
537
+ user-select: none;
538
+ -moz-user-select: none;
539
+ }
540
+
541
+ .mini-panel-content .list-children-container {
542
+ padding-left: 0;
543
+ }
544
+
545
+ .mini-panel-content .param-control input[type="number"] {
546
+ flex-basis: 60px !important;
547
+ }
548
+
549
+ .mini-panel-content .param-control {
550
+ align-items: center;
551
+ }
552
+
553
+ .mini-panel-content .param-control select {
554
+ font-size: 11px;
555
+ }
556
+
557
+ .mini-panel-content .list-item-wrapper {
558
+ margin-top: 0;
559
+ margin-bottom: 0;
560
+ }
561
+
562
+ .profiler-panel {
563
+ position: fixed;
564
+ z-index: 1001 !important;
565
+ bottom: 0;
566
+ left: 0;
567
+ right: 0;
568
+ height: 350px;
569
+ background-color: var(--profiler-background);
570
+ backdrop-filter: blur(8px);
571
+ border-top: 2px solid var(--profiler-border);
572
+ color: var(--text-primary);
573
+ display: flex;
574
+ flex-direction: column;
575
+ z-index: 1000;
576
+ /*box-shadow: 0 -5px 25px rgba(0, 0, 0, 0.5);*/
577
+ transform: translateY(100%);
578
+ transition: transform 0.35s cubic-bezier(0.25, 0.46, 0.45, 0.94), height 0.3s ease-out, width 0.3s ease-out;
579
+ font-family: var(--font-mono);
580
+ }
581
+
582
+ .profiler-panel.resizing,
583
+ .profiler-panel.dragging {
584
+ transition: none;
585
+ }
586
+
587
+ .profiler-panel.visible {
588
+ transform: translateY(0);
589
+ }
590
+
591
+ .profiler-panel.maximized {
592
+ height: 100vh;
593
+ }
594
+
595
+ /* Position-specific styles */
596
+ .profiler-panel.position-top {
597
+ bottom: auto;
598
+ top: 0;
599
+ border-top: none;
600
+ border-bottom: 2px solid var(--profiler-border);
601
+ transform: translateY(-100%);
602
+ }
603
+
604
+ .profiler-panel.position-top.visible {
605
+ transform: translateY(0);
606
+ }
607
+
608
+ .profiler-panel.position-bottom {
609
+ /* Default position - already defined above */
610
+ }
611
+
612
+ .profiler-panel.position-left {
613
+ top: 0;
614
+ bottom: 0;
615
+ left: 0;
616
+ right: auto;
617
+ width: 350px;
618
+ height: 100%;
619
+ border-top: none;
620
+ border-right: 2px solid var(--profiler-border);
621
+ transform: translateX(-100%);
622
+ }
623
+
624
+ .profiler-panel.position-left.visible {
625
+ transform: translateX(0);
626
+ }
627
+
628
+ .profiler-panel.position-right {
629
+ top: 0;
630
+ bottom: 0;
631
+ left: auto;
632
+ right: 0;
633
+ width: 350px;
634
+ height: 100%;
635
+ border-top: none;
636
+ border-left: 2px solid var(--profiler-border);
637
+ transform: translateX(100%);
638
+ }
639
+
640
+ .profiler-panel.position-right.visible {
641
+ transform: translateX(0);
642
+ }
643
+
644
+ .profiler-panel.position-floating {
645
+ border: 2px solid var(--profiler-border);
646
+ border-radius: 8px;
647
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4);
648
+ transform: none !important;
649
+ overflow: hidden;
650
+ }
651
+
652
+ .profiler-panel.position-floating.visible {
653
+ transform: none !important;
654
+ }
655
+
656
+ .profiler-panel.position-floating .profiler-header {
657
+ border-radius: 6px 6px 0 0;
658
+ }
659
+
660
+ .profiler-panel.position-floating .panel-resizer {
661
+ bottom: 0;
662
+ right: 0;
663
+ top: auto;
664
+ left: auto;
665
+ width: 16px;
666
+ height: 16px;
667
+ cursor: nwse-resize;
668
+ border-radius: 0 0 6px 0;
669
+ }
670
+
671
+ .profiler-panel.position-floating .panel-resizer::after {
672
+ content: '';
673
+ position: absolute;
674
+ right: 2px;
675
+ bottom: 2px;
676
+ width: 10px;
677
+ height: 10px;
678
+ background: linear-gradient(135deg, transparent 0%, transparent 45%, var(--profiler-border) 45%, var(--profiler-border) 55%, transparent 55%);
679
+ }
680
+
681
+
682
+ .panel-resizer {
683
+ position: absolute;
684
+ top: -2px;
685
+ left: 0;
686
+ width: 100%;
687
+ height: 5px;
688
+ cursor: ns-resize;
689
+ z-index: 1001;
690
+ touch-action: none;
691
+ }
692
+
693
+ .profiler-panel.position-top .panel-resizer {
694
+ top: auto;
695
+ bottom: -2px;
696
+ }
697
+
698
+ .profiler-panel.position-left .panel-resizer {
699
+ top: 0;
700
+ left: auto;
701
+ right: -2px;
702
+ width: 5px;
703
+ height: 100%;
704
+ cursor: ew-resize;
705
+ }
706
+
707
+ .profiler-panel.position-right .panel-resizer {
708
+ top: 0;
709
+ left: -2px;
710
+ right: auto;
711
+ width: 5px;
712
+ height: 100%;
713
+ cursor: ew-resize;
714
+ }
715
+
716
+ .profiler-header {
717
+ display: flex;
718
+ background-color: var(--profiler-header-background);
719
+ border-bottom: 1px solid var(--profiler-border);
720
+ flex-shrink: 0;
721
+ justify-content: space-between;
722
+ align-items: stretch;
723
+
724
+ overflow-x: auto;
725
+ overflow-y: hidden;
726
+ width: calc(100% - 120px);
727
+ height: 32px;
728
+ user-select: none;
729
+ -webkit-user-select: none;
730
+ }
731
+
732
+ .profiler-panel.has-horizontal-scroll .profiler-header {
733
+ height: 38px;
734
+ }
735
+
736
+ /* Adjust header width based on panel position */
737
+ .profiler-panel.position-right .profiler-header,
738
+ .profiler-panel.position-left .profiler-header {
739
+ width: calc(100% - 120px);
740
+ }
741
+
742
+ .profiler-panel.position-bottom .profiler-header,
743
+ .profiler-panel.position-top .profiler-header {
744
+ width: calc(100% - 120px);
745
+ }
746
+
747
+ /* Adjust header width when position toggle button is hidden (mobile) */
748
+ .profiler-panel.hide-position-toggle .profiler-header {
749
+ width: calc(100% - 80px);
750
+ }
751
+
752
+ /* Adjust header width when maximized (floating position toggle button is hidden) */
753
+ .profiler-panel.maximized .profiler-header {
754
+ width: calc(100% - 80px);
755
+ }
756
+
757
+ /* ===== RULES FOR WHEN THERE ARE NO TABS ===== */
758
+
759
+ /* Horizontal mode (bottom/top) without tabs */
760
+ .profiler-panel.position-bottom.no-tabs:not(.maximized),
761
+ .profiler-panel.position-top.no-tabs:not(.maximized) {
762
+ height: 32px !important;
763
+ min-height: 32px !important;
764
+ }
765
+
766
+ .profiler-panel.position-bottom.no-tabs .profiler-header,
767
+ .profiler-panel.position-top.no-tabs .profiler-header {
768
+ width: 100%;
769
+ height: 32px;
770
+ border-bottom: none;
771
+ }
772
+
773
+ .profiler-panel.position-bottom.no-tabs .profiler-content-wrapper,
774
+ .profiler-panel.position-top.no-tabs .profiler-content-wrapper {
775
+ display: none;
776
+ }
777
+
778
+ .profiler-panel.position-bottom.no-tabs .panel-resizer,
779
+ .profiler-panel.position-top.no-tabs .panel-resizer {
780
+ display: none;
781
+ }
782
+
783
+ /* Vertical mode (right/left) without tabs */
784
+ .profiler-panel.position-right.no-tabs:not(.maximized),
785
+ .profiler-panel.position-left.no-tabs:not(.maximized) {
786
+ width: 40px !important;
787
+ min-width: 40px !important;
788
+ }
789
+
790
+ /* Vertical layout for header when no tabs */
791
+ .profiler-panel.position-right.no-tabs .profiler-header,
792
+ .profiler-panel.position-left.no-tabs .profiler-header {
793
+ width: 100%;
794
+ flex-direction: column;
795
+ height: 100%;
796
+ border-bottom: none;
797
+ }
798
+
799
+ /* Vertical layout for controls when no tabs */
800
+ .profiler-panel.position-right.no-tabs .profiler-controls,
801
+ .profiler-panel.position-left.no-tabs .profiler-controls {
802
+ position: static;
803
+ flex-direction: column-reverse;
804
+ justify-content: flex-end;
805
+ width: 100%;
806
+ height: 100%;
807
+ border-bottom: none;
808
+ border-left: none;
809
+ background: transparent;
810
+ }
811
+
812
+ .profiler-panel.position-right.no-tabs .profiler-controls button,
813
+ .profiler-panel.position-left.no-tabs .profiler-controls button {
814
+ width: 100%;
815
+ height: 40px;
816
+ border-left: none;
817
+ border-top: none;
818
+ border-bottom: 1px solid var(--profiler-border);
819
+ }
820
+
821
+ .profiler-panel.position-right.no-tabs .profiler-content-wrapper,
822
+ .profiler-panel.position-left.no-tabs .profiler-content-wrapper {
823
+ display: none;
824
+ }
825
+
826
+ .profiler-panel.position-right.no-tabs .profiler-tabs,
827
+ .profiler-panel.position-left.no-tabs .profiler-tabs {
828
+ display: none;
829
+ padding-left: 2px;
830
+ }
831
+
832
+ .profiler-panel.position-right.no-tabs .panel-resizer,
833
+ .profiler-panel.position-left.no-tabs .panel-resizer {
834
+ display: none;
835
+ }
836
+
837
+ /* Hide position toggle on mobile without tabs */
838
+ .profiler-panel.hide-position-toggle.position-right.no-tabs:not(.maximized),
839
+ .profiler-panel.hide-position-toggle.position-left.no-tabs:not(.maximized) {
840
+ width: 40px !important;
841
+ min-width: 40px !important;
842
+ }
843
+
844
+ /* Hide drag indicator on mobile devices */
845
+ .profiler-panel.is-mobile .tab-btn.active::before {
846
+ display: none;
847
+ }
848
+
849
+ .profiler-header::-webkit-scrollbar,
850
+ .profiler-tabs::-webkit-scrollbar,
851
+ .profiler-content::-webkit-scrollbar,
852
+ .detached-tab-content::-webkit-scrollbar,
853
+ .console-log::-webkit-scrollbar,
854
+ .timelineTrack::-webkit-scrollbar,
855
+ .list-scroll-wrapper::-webkit-scrollbar {
856
+ width: 4px;
857
+ height: 4px;
858
+ }
859
+
860
+ .profiler-header::-webkit-scrollbar-track,
861
+ .profiler-tabs::-webkit-scrollbar-track,
862
+ .profiler-content::-webkit-scrollbar-track,
863
+ .detached-tab-content::-webkit-scrollbar-track,
864
+ .console-log::-webkit-scrollbar-track,
865
+ .timelineTrack::-webkit-scrollbar-track,
866
+ .list-scroll-wrapper::-webkit-scrollbar-track {
867
+ background: transparent;
868
+ }
869
+
870
+ .profiler-header::-webkit-scrollbar-thumb,
871
+ .profiler-tabs::-webkit-scrollbar-thumb,
872
+ .profiler-content::-webkit-scrollbar-thumb,
873
+ .detached-tab-content::-webkit-scrollbar-thumb,
874
+ .console-log::-webkit-scrollbar-thumb,
875
+ .timelineTrack::-webkit-scrollbar-thumb,
876
+ .list-scroll-wrapper::-webkit-scrollbar-thumb {
877
+ background-color: rgba(255, 255, 255, 0.15);
878
+ border-radius: 2px;
879
+ }
880
+
881
+ .profiler-header::-webkit-scrollbar-thumb:hover,
882
+ .profiler-tabs::-webkit-scrollbar-thumb:hover,
883
+ .profiler-content::-webkit-scrollbar-thumb:hover,
884
+ .detached-tab-content::-webkit-scrollbar-thumb:hover,
885
+ .console-log::-webkit-scrollbar-thumb:hover,
886
+ .timelineTrack::-webkit-scrollbar-thumb:hover,
887
+ .list-scroll-wrapper::-webkit-scrollbar-thumb:hover {
888
+ background-color: rgba(255, 255, 255, 0.3);
889
+ }
890
+
891
+ .profiler-header::-webkit-scrollbar-corner,
892
+ .profiler-tabs::-webkit-scrollbar-corner,
893
+ .profiler-content::-webkit-scrollbar-corner,
894
+ .detached-tab-content::-webkit-scrollbar-corner,
895
+ .console-log::-webkit-scrollbar-corner,
896
+ .timelineTrack::-webkit-scrollbar-corner,
897
+ .list-scroll-wrapper::-webkit-scrollbar-corner {
898
+ background: transparent;
899
+ }
900
+
901
+ .profiler-header,
902
+ .profiler-tabs,
903
+ .profiler-content,
904
+ .detached-tab-content,
905
+ .console-log,
906
+ .timelineTrack,
907
+ .list-scroll-wrapper {
908
+ scrollbar-width: thin;
909
+ scrollbar-color: rgba(255, 255, 255, 0.15) transparent;
910
+ }
911
+
912
+ .profiler-panel.dragging .profiler-header {
913
+ cursor: grabbing !important;
914
+ }
915
+
916
+ .profiler-panel.dragging {
917
+ opacity: 0.8;
918
+ }
919
+
920
+ .profiler-tabs {
921
+ display: flex;
922
+ cursor: grab;
923
+ position: relative;
924
+ margin-left: 2px;
925
+ }
926
+
927
+ .profiler-tabs:active {
928
+ cursor: grabbing;
929
+ }
930
+
931
+
932
+ .profiler-controls {
933
+ display: flex;
934
+ position: absolute;
935
+ right: 0;
936
+ top: 0;
937
+ height: 32px;
938
+ background: var(--profiler-header-background);
939
+ border-bottom: 1px solid var(--profiler-border);
940
+ }
941
+
942
+ .profiler-panel.has-horizontal-scroll .profiler-controls {
943
+ height: 38px;
944
+ }
945
+
946
+ .tab-btn {
947
+ position: relative;
948
+ background: transparent;
949
+ border: none;
950
+ /*border-right: 1px solid var(--profiler-border);*/
951
+ color: var(--text-secondary);
952
+ padding: 0 15px 2px 15px;
953
+ height: 100%;
954
+ box-sizing: border-box;
955
+ cursor: default;
956
+ display: flex;
957
+ align-items: center;
958
+ font-family: var(--font-family);
959
+ font-weight: 600;
960
+ font-size: 13px;
961
+ user-select: none;
962
+ transition: opacity 0.2s, transform 0.2s;
963
+ touch-action: pan-x;
964
+ white-space: nowrap;
965
+ }
966
+
967
+ .tab-btn.active {
968
+ border-bottom: 2px solid var(--color-accent);
969
+ color: white;
970
+ }
971
+
972
+ .tab-btn.active::before {
973
+ content: '';
974
+ position: absolute;
975
+ left: 2px;
976
+ top: 50%;
977
+ transform: translateY(-50%);
978
+ width: 8px;
979
+ height: 14px;
980
+ background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg width='8' height='14' viewBox='0 0 8 14' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='2' cy='3' r='1' fill='%234a4a5a'/%3E%3Ccircle cx='2' cy='7' r='1' fill='%234a4a5a'/%3E%3Ccircle cx='2' cy='11' r='1' fill='%234a4a5a'/%3E%3Ccircle cx='6' cy='3' r='1' fill='%234a4a5a'/%3E%3Ccircle cx='6' cy='7' r='1' fill='%234a4a5a'/%3E%3Ccircle cx='6' cy='11' r='1' fill='%234a4a5a'/%3E%3C/svg%3E");
981
+ background-repeat: no-repeat;
982
+ background-position: center;
983
+ opacity: 0.6;
984
+ }
985
+
986
+ .tab-btn.no-detach.active::before {
987
+ display: none;
988
+ }
989
+
990
+ .floating-btn,
991
+ .maximize-btn,
992
+ .hide-panel-btn {
993
+ background: transparent;
994
+ border: none;
995
+ border-left: 1px solid var(--profiler-border);
996
+ color: var(--text-secondary);
997
+ width: 40px;
998
+ height: 100%;
999
+ cursor: pointer;
1000
+ transition: all 0.2s;
1001
+ display: flex;
1002
+ align-items: center;
1003
+ justify-content: center;
1004
+ flex-shrink: 0;
1005
+ }
1006
+
1007
+ /* Disable transitions in vertical mode to avoid broken animations */
1008
+ .profiler-panel.position-right .floating-btn,
1009
+ .profiler-panel.position-right .maximize-btn,
1010
+ .profiler-panel.position-right .hide-panel-btn,
1011
+ .profiler-panel.position-left .floating-btn,
1012
+ .profiler-panel.position-left .maximize-btn,
1013
+ .profiler-panel.position-left .hide-panel-btn {
1014
+ transition: background-color 0.2s, color 0.2s;
1015
+ }
1016
+
1017
+ .floating-btn:hover,
1018
+ .maximize-btn:hover,
1019
+ .hide-panel-btn:hover {
1020
+ background-color: rgba(255, 255, 255, 0.1);
1021
+ color: var(--text-primary);
1022
+ }
1023
+
1024
+ /* Hide maximize button when there are no tabs */
1025
+ .profiler-panel.position-right.no-tabs .maximize-btn,
1026
+ .profiler-panel.position-left.no-tabs .maximize-btn,
1027
+ .profiler-panel.position-bottom.no-tabs .maximize-btn,
1028
+ .profiler-panel.position-top.no-tabs .maximize-btn {
1029
+ display: none !important;
1030
+ }
1031
+
1032
+ /* Hide floating button when maximized */
1033
+ .profiler-panel.maximized .floating-btn {
1034
+ display: none !important;
1035
+ }
1036
+
1037
+ .profiler-content-wrapper {
1038
+ flex-grow: 1;
1039
+ overflow: hidden;
1040
+ position: relative;
1041
+ }
1042
+
1043
+ .profiler-content {
1044
+ position: absolute;
1045
+ top: 0;
1046
+ left: 0;
1047
+ width: 100%;
1048
+ height: 100%;
1049
+ overflow-y: auto;
1050
+ font-size: 13px;
1051
+ visibility: hidden;
1052
+ opacity: 0;
1053
+ transition: opacity 0.2s, visibility 0.2s;
1054
+ box-sizing: border-box;
1055
+ display: flex;
1056
+ flex-direction: column;
1057
+ user-select: none;
1058
+ -webkit-user-select: none;
1059
+ }
1060
+
1061
+ .profiler-content.active {
1062
+ visibility: visible;
1063
+ opacity: 1;
1064
+ }
1065
+
1066
+ .profiler-content {
1067
+ overflow: auto; /* make sure scrollbars can appear */
1068
+ }
22
1069
 
23
- @import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;600&family=Fira+Code&display=swap');
24
1070
 
25
- #profiler-panel *, #profiler-toggle * {
26
- text-transform: initial;
27
- line-height: normal;
28
- box-sizing: border-box;
29
- -webkit-font-smoothing: antialiased;
30
- -moz-osx-font-smoothing: grayscale;
31
- }
1071
+ .list-item-row {
1072
+ display: grid;
1073
+ align-items: center;
1074
+ padding: 4px 8px;
1075
+ border-radius: 3px;
1076
+ transition: background-color 0.2s;
1077
+ gap: 10px;
1078
+ border-bottom: none;
1079
+ user-select: none;
1080
+ -webkit-user-select: none;
1081
+ }
32
1082
 
33
- #profiler-toggle {
34
- position: fixed;
35
- top: 15px;
36
- right: 15px;
37
- background-color: rgba(30, 30, 36, 0.85);
38
- border: 1px solid #4a4a5a54;
39
- border-radius: 6px 12px 12px 6px;
40
- color: var(--text-primary);
41
- cursor: pointer;
42
- z-index: 1001;
43
- transition: all 0.2s ease-in-out;
44
- font-size: 14px;
45
- backdrop-filter: blur(8px);
46
- box-shadow: 0 4px 15px rgba(0, 0, 0, 0.3);
47
- display: flex;
48
- align-items: stretch;
49
- padding: 0;
50
- overflow: hidden;
51
- font-family: var(--font-family);
52
- }
1083
+ .parameters .list-item-row {
1084
+ min-height: 23px;
1085
+ }
53
1086
 
54
- #profiler-toggle:hover {
55
- border-color: var(--accent-color);
56
- }
1087
+ .mini-panel-content .parameters .list-item-row {
1088
+ min-height: 21px;
1089
+ }
57
1090
 
58
- #profiler-toggle.hidden {
59
- opacity: 0;
60
- pointer-events: none;
61
- }
1091
+ .list-item-wrapper {
1092
+ margin-top: 2px;
1093
+ margin-bottom: 2px;
1094
+ user-select: none;
1095
+ -webkit-user-select: none;
1096
+ }
62
1097
 
63
- #toggle-icon {
64
- display: flex;
65
- align-items: center;
66
- justify-content: center;
67
- width: 40px;
68
- font-size: 20px;
69
- transition: background-color 0.2s;
70
- }
1098
+ .list-item-wrapper:has(> .list-item-row .graph-container) {
1099
+ margin-left: -1.5em;
1100
+ }
71
1101
 
72
- #profiler-toggle:hover #toggle-icon {
73
- background-color: rgba(255, 255, 255, 0.05);
74
- }
1102
+ .list-item-wrapper:first-child {
1103
+ /*margin-top: 0;*/
1104
+ }
75
1105
 
76
- .toggle-separator {
77
- width: 1px;
78
- background-color: var(--profiler-border);
79
- }
1106
+ .list-item-wrapper:not(.header-wrapper):nth-child(odd) > .list-item-row {
1107
+ background-color: rgba(0,0,0,0.1);
1108
+ }
80
1109
 
81
- #toggle-text {
82
- display: flex;
83
- align-items: baseline;
84
- padding: 8px 14px;
85
- min-width: 80px;
86
- justify-content: right;
87
- }
1110
+ .list-item-wrapper.header-wrapper>.list-item-row {
1111
+ color: var(--color-accent);
1112
+ background-color: rgba(0, 170, 255, 0.1);
1113
+ }
88
1114
 
89
- #toggle-text .fps-label {
90
- font-size: 0.7em;
91
- margin-left: 10px;
92
- color: #999;
93
- }
1115
+ .list-item-wrapper.header-wrapper>.list-item-row>.list-item-cell:first-child {
1116
+ font-weight: 600;
1117
+ }
94
1118
 
95
- #profiler-panel {
96
- position: fixed;
97
- z-index: 1001 !important;
98
- bottom: 0;
99
- left: 0;
100
- right: 0;
101
- height: 350px;
102
- background-color: var(--profiler-bg);
103
- backdrop-filter: blur(8px);
104
- border-top: 2px solid var(--profiler-border);
105
- color: var(--text-primary);
106
- display: flex;
107
- flex-direction: column;
108
- z-index: 1000;
109
- /*box-shadow: 0 -5px 25px rgba(0, 0, 0, 0.5);*/
110
- transform: translateY(100%);
111
- transition: transform 0.35s cubic-bezier(0.25, 0.46, 0.45, 0.94), height 0.3s ease-out;
112
- font-family: var(--font-mono);
113
- }
1119
+ .list-item-row.collapsible,
1120
+ .list-item-row.actionable {
1121
+ cursor: pointer;
1122
+ }
114
1123
 
115
- #profiler-panel.resizing {
116
- transition: none;
117
- }
1124
+ .list-item-row.collapsible {
1125
+ background-color: rgba(0, 170, 255, 0.15) !important;
1126
+ min-height: 23px;
1127
+ }
118
1128
 
119
- #profiler-panel.visible {
120
- transform: translateY(0);
121
- }
1129
+ .list-item-row.collapsible.alert,
1130
+ .list-item-row.alert {
1131
+ background-color: rgba(244, 67, 54, 0.1) !important;
1132
+ }
122
1133
 
123
- #profiler-panel.maximized {
124
- height: 100vh;
125
- }
1134
+ @media (hover: hover) {
126
1135
 
1136
+ .list-item-row:hover:not(.collapsible):not(.no-hover),
1137
+ .list-item-row:hover:not(.no-hover),
1138
+ .list-item-row.actionable:hover,
1139
+ .list-item-row.collapsible.actionable:hover {
1140
+ background-color: rgba(255, 255, 255, 0.05) !important;
1141
+ }
127
1142
 
128
- .panel-resizer {
129
- position: absolute;
130
- top: -2px;
131
- left: 0;
132
- width: 100%;
133
- height: 5px;
134
- cursor: ns-resize;
135
- z-index: 1001;
136
- }
1143
+ .list-item-row.collapsible:hover {
1144
+ background-color: rgba(0, 170, 255, 0.25) !important;
1145
+ }
137
1146
 
138
- .profiler-header {
139
- display: flex;
140
- background-color: var(--profiler-header-bg);
141
- border-bottom: 1px solid var(--profiler-border);
142
- flex-shrink: 0;
143
- justify-content: space-between;
144
- align-items: stretch;
145
-
146
- overflow-x: auto;
147
- overflow-y: hidden;
148
- width: calc(100% - 89px);
149
- height: 38px;
150
- }
1147
+ }
151
1148
 
152
- .profiler-tabs {
153
- display: flex;
154
- }
1149
+ .list-item-cell {
1150
+ white-space: pre;
1151
+ display: flex;
1152
+ align-items: center;
1153
+ user-select: none;
1154
+ -webkit-user-select: none;
1155
+ }
155
1156
 
156
- .profiler-controls {
157
- display: flex;
158
- position: absolute;
159
- right: 0;
160
- top: 0;
161
- height: 38px;
162
- background: var(--profiler-header-bg);
163
- border-bottom: 1px solid var(--profiler-border);
164
- }
1157
+ .list-item-cell:not(:first-child) {
1158
+ justify-content: flex-end;
1159
+ font-weight: 600;
1160
+ }
165
1161
 
166
- .tab-btn {
167
- background: transparent;
168
- border: none;
169
- /*border-right: 1px solid var(--profiler-border);*/
170
- color: var(--text-secondary);
171
- padding: 8px 18px;
172
- cursor: pointer;
173
- display: flex;
174
- align-items: center;
175
- font-family: var(--font-family);
176
- font-weight: 600;
177
- font-size: 14px;
178
- }
1162
+ .list-header {
1163
+ display: grid;
1164
+ align-items: center;
1165
+ padding: 4px 8px;
1166
+ font-weight: 600;
1167
+ color: var(--text-secondary);
1168
+ padding-bottom: 6px;
1169
+ border-bottom: 1px solid var(--profiler-border);
1170
+ margin-bottom: 5px;
1171
+ gap: 10px;
1172
+ user-select: none;
1173
+ -webkit-user-select: none;
1174
+ }
179
1175
 
180
- .tab-btn.active {
181
- border-bottom: 2px solid var(--accent-color);
182
- color: white;
183
- }
1176
+ .list-item-wrapper.section-start {
1177
+ margin-top: 5px;
1178
+ margin-bottom: 5px;
1179
+ }
184
1180
 
185
- #maximize-btn,
186
- #hide-panel-btn {
187
- background: transparent;
188
- border: none;
189
- border-left: 1px solid var(--profiler-border);
190
- color: var(--text-secondary);
191
- width: 45px;
192
- cursor: pointer;
193
- transition: all 0.2s;
194
- display: flex;
195
- align-items: center;
196
- justify-content: center;
197
- }
1181
+ .list-header .list-header-cell:not(:first-child) {
1182
+ text-align: right;
1183
+ }
198
1184
 
199
- #maximize-btn:hover,
200
- #hide-panel-btn:hover {
201
- background-color: rgba(255, 255, 255, 0.1);
202
- color: var(--text-primary);
203
- }
1185
+ .list-children-container {
1186
+ padding-left: 1.5em;
1187
+ overflow: hidden;
1188
+ transition: max-height 0.1s ease-out;
1189
+ margin-top: 2px;
1190
+ }
204
1191
 
205
- .profiler-content-wrapper {
206
- flex-grow: 1;
207
- overflow: hidden;
208
- position: relative;
209
- }
1192
+ .list-children-container.closed {
1193
+ max-height: 0;
1194
+ }
210
1195
 
211
- .profiler-content {
212
- position: absolute;
213
- top: 0;
214
- left: 0;
215
- width: 100%;
216
- height: 100%;
217
- overflow-y: auto;
218
- font-size: 13px;
219
- visibility: hidden;
220
- opacity: 0;
221
- transition: opacity 0.2s, visibility 0.2s;
222
- box-sizing: border-box;
223
- display: flex;
224
- flex-direction: column;
225
- }
1196
+ .item-toggler {
1197
+ display: inline-block;
1198
+ margin-right: 0.8em;
1199
+ text-align: left;
1200
+ }
226
1201
 
227
- .profiler-content.active {
228
- visibility: visible;
229
- opacity: 1;
230
- }
1202
+ .list-item-row.open .item-toggler::before {
1203
+ content: '-';
1204
+ }
231
1205
 
232
- .profiler-content {
233
- overflow: auto; /* make sure scrollbars can appear */
234
- }
1206
+ .list-item-row:not(.open) .item-toggler::before {
1207
+ content: '+';
1208
+ }
235
1209
 
236
- .profiler-content::-webkit-scrollbar {
237
- width: 8px;
238
- height: 8px;
239
- }
1210
+ .list-item-cell .value.good {
1211
+ color: var(--color-green);
1212
+ }
240
1213
 
241
- .profiler-content::-webkit-scrollbar-track {
242
- background: transparent;
243
- }
1214
+ .list-item-cell .value.warn {
1215
+ color: var(--color-yellow);
1216
+ }
244
1217
 
245
- .profiler-content::-webkit-scrollbar-thumb {
246
- background-color: rgba(0, 0, 0, 0.25);
247
- border-radius: 10px;
248
- transition: background 0.3s ease;
249
- }
1218
+ .list-item-cell .value.bad {
1219
+ color: var(--color-red);
1220
+ }
250
1221
 
251
- .profiler-content::-webkit-scrollbar-thumb:hover {
252
- background-color: rgba(0, 0, 0, 0.4);
253
- }
1222
+ .list-scroll-wrapper {
1223
+ width: max-content;
1224
+ min-width: 100%;
1225
+ display: flex;
1226
+ flex-direction: column;
1227
+ min-height: 100%;
1228
+ }
254
1229
 
255
- .profiler-content::-webkit-scrollbar-corner {
256
- background: transparent;
257
- }
1230
+ .list-container.parameters .list-item-row:not(.collapsible) {
1231
+ }
258
1232
 
259
- .profiler-content {
260
- scrollbar-width: thin; /* "auto" | "thin" */
261
- scrollbar-color: rgba(0, 0, 0, 0.25) transparent;
262
- }
1233
+ .graph-container {
1234
+ width: 100%;
1235
+ box-sizing: border-box;
1236
+ padding: 8px 0;
1237
+ position: relative;
1238
+ }
263
1239
 
264
- .list-item-row {
265
- display: grid;
266
- align-items: center;
267
- padding: 4px 8px;
268
- border-radius: 3px;
269
- transition: background-color 0.2s;
270
- gap: 10px;
271
- border-bottom: none;
272
- }
1240
+ .graph-svg, .graph-canvas {
1241
+ width: 0;
1242
+ min-width: 100%;
1243
+ height: 80px;
1244
+ background-color: var(--profiler-header);
1245
+ border: 1px solid var(--profiler-border);
1246
+ border-radius: 4px;
1247
+ display: block;
1248
+ }
273
1249
 
274
- .list-item-wrapper {
275
- margin-top: 2px;
276
- margin-bottom: 2px;
277
- }
1250
+ .graph-path {
1251
+ stroke-width: 2;
1252
+ fill-opacity: 0.4;
1253
+ }
278
1254
 
279
- .list-item-wrapper:first-child {
280
- /*margin-top: 0;*/
281
- }
1255
+ .console-buttons-group {
1256
+ display: flex;
1257
+ gap: 20px;
1258
+ }
282
1259
 
283
- .list-item-wrapper:not(.header-wrapper):nth-child(odd) > .list-item-row {
284
- background-color: rgba(0,0,0,0.1);
285
- }
1260
+ .console-filter-input {
1261
+ background-color: var(--profiler-background);
1262
+ border: 1px solid var(--profiler-border);
1263
+ color: var(--text-primary);
1264
+ border-radius: 4px;
1265
+ padding: 4px 10px 2px 10px;
1266
+ font-family: var(--font-mono);
1267
+ flex-grow: 1;
1268
+ max-width: 300px;
1269
+ border-radius: 15px;
1270
+ }
286
1271
 
287
- .list-item-wrapper.header-wrapper>.list-item-row {
288
- color: var(--accent-color);
289
- background-color: rgba(0, 170, 255, 0.1);
290
- }
1272
+ .console-filter-input:focus {
1273
+ outline: none;
1274
+ border-color: var(--text-secondary);
1275
+ }
291
1276
 
292
- .list-item-wrapper.header-wrapper>.list-item-row>.list-item-cell:first-child {
293
- font-weight: 600;
294
- }
1277
+ .console-copy-button {
1278
+ background: transparent;
1279
+ border: none;
1280
+ color: var(--text-secondary);
1281
+ cursor: pointer;
1282
+ padding: 4px;
1283
+ display: flex;
1284
+ align-items: center;
1285
+ justify-content: center;
1286
+ border-radius: 4px;
1287
+ transition: color 0.2s, background-color 0.2s;
1288
+ }
295
1289
 
296
- .list-item-row.collapsible,
297
- .list-item-row.actionable {
298
- cursor: pointer;
299
- }
1290
+ .console-copy-button:hover {
1291
+ color: var(--text-primary);
1292
+ background-color: var(--profiler-hover);
1293
+ }
300
1294
 
301
- .list-item-row.collapsible {
302
- background-color: rgba(0, 170, 255, 0.15) !important;
303
- }
1295
+ .console-copy-button.copied {
1296
+ color: var(--color-green);
1297
+ }
304
1298
 
305
- .list-item-row.collapsible.alert,
306
- .list-item-row.alert {
307
- background-color: rgba(244, 67, 54, 0.1) !important;
308
- }
1299
+ .console-log {
1300
+ display: flex;
1301
+ flex-direction: column;
1302
+ gap: 4px;
1303
+ padding: 10px;
1304
+ overflow-y: auto;
1305
+ flex-grow: 1;
1306
+ user-select: text;
1307
+ -webkit-user-select: text;
1308
+ }
309
1309
 
310
- @media (hover: hover) {
1310
+ .log-message {
1311
+ display: flex;
1312
+ align-items: flex-start;
1313
+ gap: 6px;
1314
+ padding: 3px 5px;
1315
+ border-radius: 3px;
1316
+ line-height: 1.5 !important;
1317
+ }
311
1318
 
312
- .list-item-row:hover:not(.collapsible):not(.no-hover),
313
- .list-item-row:hover:not(.no-hover),
314
- .list-item-row.actionable:hover,
315
- .list-item-row.collapsible.actionable:hover {
316
- background-color: rgba(255, 255, 255, 0.05) !important;
1319
+ .log-count-badge {
1320
+ display: inline-block;
1321
+ text-align: center;
1322
+ min-width: 14px;
1323
+ height: 14px;
1324
+ border-radius: 7px;
1325
+ padding: 0 3px;
1326
+ font-size: 9px;
1327
+ font-weight: bold;
1328
+ line-height: 14px;
1329
+ box-sizing: border-box;
1330
+ margin-top: 0;
1331
+ flex-shrink: 0;
317
1332
  }
318
1333
 
319
- .list-item-row.collapsible:hover {
320
- background-color: rgba(0, 170, 255, 0.25) !important;
1334
+ .log-icon {
1335
+ display: inline-block;
1336
+ text-align: center;
1337
+ width: 14px;
1338
+ height: 14px;
1339
+ font-size: 11px;
1340
+ line-height: 14px;
1341
+ margin-top: 0;
1342
+ flex-shrink: 0;
321
1343
  }
322
1344
 
323
- }
1345
+ .log-body {
1346
+ flex-grow: 1;
1347
+ white-space: pre-wrap;
1348
+ word-break: break-all;
1349
+ }
324
1350
 
325
- .list-item-cell {
326
- white-space: pre;
327
- display: flex;
328
- align-items: center;
329
- }
1351
+ .log-message.info .log-count-badge {
1352
+ background-color: rgba(255, 255, 255, 0.12);
1353
+ border: 1px solid rgba(255, 255, 255, 0.2);
1354
+ color: var(--text-secondary);
1355
+ }
330
1356
 
331
- .list-item-cell:not(:first-child) {
332
- justify-content: flex-end;
333
- font-weight: 600;
334
- }
1357
+ .log-message.warn .log-count-badge {
1358
+ background-color: rgba(255, 193, 7, 0.18);
1359
+ border: 1px solid rgba(255, 193, 7, 0.35);
1360
+ color: var(--color-yellow);
1361
+ }
335
1362
 
336
- .list-header {
337
- display: grid;
338
- align-items: center;
339
- padding: 4px 8px;
340
- font-weight: 600;
341
- color: var(--text-secondary);
342
- padding-bottom: 6px;
343
- border-bottom: 1px solid var(--profiler-border);
344
- margin-bottom: 5px;
345
- gap: 10px;
346
- }
1363
+ .log-message.error .log-count-badge {
1364
+ background-color: rgba(244, 67, 54, 0.18);
1365
+ border: 1px solid rgba(244, 67, 54, 0.35);
1366
+ color: #ff8a80;
1367
+ }
347
1368
 
348
- .list-item-wrapper.section-start {
349
- margin-top: 5px;
350
- margin-bottom: 5px;
351
- }
1369
+ .log-message.hidden {
1370
+ display: none;
1371
+ }
352
1372
 
353
- .list-header .list-header-cell:not(:first-child) {
354
- text-align: right;
355
- }
1373
+ .log-message.info {
1374
+ color: var(--text-primary);
1375
+ }
356
1376
 
357
- .list-children-container {
358
- padding-left: 1.5em;
359
- overflow: hidden;
360
- transition: max-height 0.1s ease-out;
361
- margin-top: 2px;
362
- }
1377
+ .log-message.warn {
1378
+ color: var(--color-yellow);
1379
+ }
363
1380
 
364
- .list-children-container.closed {
365
- max-height: 0;
366
- }
1381
+ .log-message.error {
1382
+ color: #f9dedc;
1383
+ background-color: rgba(244, 67, 54, 0.1);
1384
+ }
367
1385
 
368
- .item-toggler {
369
- display: inline-block;
370
- margin-right: 0.8em;
371
- text-align: left;
372
- }
1386
+ .log-prefix {
1387
+ color: var(--text-secondary);
1388
+ margin-right: 8px;
1389
+ }
373
1390
 
374
- .list-item-row.open .item-toggler::before {
375
- content: '-';
376
- }
1391
+ .log-code {
1392
+ background-color: rgba(255, 255, 255, 0.1);
1393
+ border-radius: 3px;
1394
+ padding: 1px 4px;
1395
+ }
377
1396
 
378
- .list-item-row:not(.open) .item-toggler::before {
379
- content: '+';
380
- }
1397
+ .thumbnail-container {
1398
+ display: flex;
1399
+ align-items: center;
1400
+ }
381
1401
 
382
- .list-item-cell .value.good {
383
- color: var(--color-green);
384
- }
1402
+ .thumbnail-svg {
1403
+ width: 40px;
1404
+ height: 22.5px;
1405
+ flex-shrink: 0;
1406
+ margin-right: 8px;
1407
+ }
385
1408
 
386
- .list-item-cell .value.warn {
387
- color: var(--color-yellow);
388
- }
1409
+ .param-control {
1410
+ display: flex;
1411
+ align-items: center;
1412
+ justify-content: flex-end;
1413
+ gap: 10px;
1414
+ width: 100%;
1415
+ }
389
1416
 
390
- .list-item-cell .value.bad {
391
- color: var(--color-red);
392
- }
1417
+ .param-control input,
1418
+ .param-control select,
1419
+ .param-control button {
1420
+ background-color: var(--profiler-background);
1421
+ border: 1px solid var(--profiler-border);
1422
+ color: var(--text-primary);
1423
+ border-radius: 4px;
1424
+ padding: 4px 6px;
1425
+ padding-bottom: 2px;
1426
+ font-family: var(--font-mono);
1427
+ width: 100%;
1428
+ box-sizing: border-box;
1429
+ }
393
1430
 
394
- .list-scroll-wrapper {
395
- overflow-x: auto;
396
- width: 100%;
397
- }
1431
+ .param-control input:focus {
1432
+ outline: none;
1433
+ border-color: var(--color-accent);
1434
+ }
398
1435
 
399
- .list-container.parameters .list-item-row:not(.collapsible) {
400
- height: 31px;
401
- }
1436
+ .param-control select {
1437
+ padding-top: 3px;
1438
+ padding-bottom: 1px;
1439
+ }
402
1440
 
403
- .graph-container {
404
- width: 100%;
405
- box-sizing: border-box;
406
- padding: 8px 0;
407
- position: relative;
408
- }
1441
+ .param-control input[type="number"] {
1442
+ cursor: ns-resize;
1443
+ }
409
1444
 
410
- .graph-svg {
411
- width: 100%;
412
- height: 80px;
413
- background-color: var(--profiler-header);
414
- border: 1px solid var(--profiler-border);
415
- border-radius: 4px;
416
- }
1445
+ .param-control input[type="color"] {
1446
+ padding: 2px;
1447
+ }
417
1448
 
418
- .graph-path {
419
- stroke-width: 2;
420
- fill-opacity: 0.4;
421
- }
1449
+ .param-control button {
1450
+ cursor: pointer;
1451
+ transition: background-color 0.2s;
1452
+ }
422
1453
 
423
- .console-header {
424
- padding: 10px;
425
- border-bottom: 1px solid var(--profiler-border);
426
- display: flex;
427
- gap: 20px;
428
- flex-shrink: 0;
429
- align-items: center;
430
- justify-content: space-between;
431
- }
1454
+ .param-control button:hover {
1455
+ background-color: var(--profiler-header);
1456
+ }
432
1457
 
433
- .console-filters-group {
434
- display: flex;
435
- gap: 20px;
436
- }
1458
+ .param-control-vector {
1459
+ display: flex;
1460
+ gap: 5px;
1461
+ }
437
1462
 
438
- .console-filter-input {
439
- background-color: var(--profiler-bg);
440
- border: 1px solid var(--profiler-border);
441
- color: var(--text-primary);
442
- border-radius: 4px;
443
- padding: 4px 8px;
444
- font-family: var(--font-mono);
445
- flex-grow: 1;
446
- max-width: 300px;
447
- border-radius: 15px;
448
- }
1463
+ .custom-checkbox {
1464
+ display: inline-flex;
1465
+ align-items: center;
1466
+ cursor: pointer;
1467
+ gap: 8px;
1468
+ will-change: transform;
1469
+ font-size: 12px;
1470
+ }
449
1471
 
450
- #console-log {
451
- display: flex;
452
- flex-direction: column;
453
- gap: 4px;
454
- padding: 10px;
455
- overflow-y: auto;
456
- flex-grow: 1;
457
- }
1472
+ .custom-checkbox input {
1473
+ display: none;
1474
+ }
458
1475
 
459
- .log-message {
460
- padding: 2px 5px;
461
- white-space: pre-wrap;
462
- word-break: break-all;
463
- border-radius: 3px;
464
- line-height: 1.5 !important;
465
- }
1476
+ .custom-checkbox .checkmark {
1477
+ width: 14px;
1478
+ height: 14px;
1479
+ border: 1px solid var(--color-accent);
1480
+ border-radius: 3px;
1481
+ display: inline-flex;
1482
+ justify-content: center;
1483
+ align-items: center;
1484
+ transition: background-color 0.2s, border-color 0.2s;
1485
+ }
466
1486
 
467
- .log-message.hidden {
468
- display: none;
469
- }
1487
+ .custom-checkbox .checkbox-text {
1488
+ font-size: 12px;
1489
+ margin-top: 1px;
1490
+ color: inherit;
1491
+ }
470
1492
 
471
- .log-message.info {
472
- color: var(--text-primary);
473
- }
1493
+ .custom-checkbox .checkmark::after {
1494
+ content: '';
1495
+ width: 6px;
1496
+ height: 6px;
1497
+ background-color: var(--color-accent);
1498
+ border-radius: 1px;
1499
+ display: block;
1500
+ transform: scale(0);
1501
+ transition: transform 0.2s;
1502
+ }
474
1503
 
475
- .log-message.warn {
476
- color: var(--color-yellow);
477
- }
1504
+ .list-container .custom-checkbox .checkmark {
1505
+ width: 13px;
1506
+ height: 13px;
1507
+ }
478
1508
 
479
- .log-message.error {
480
- color: #f9dedc;
481
- background-color: rgba(244, 67, 54, 0.1);
482
- }
1509
+ .list-container .custom-checkbox .checkmark::after {
1510
+ width: 7px;
1511
+ height: 7px;
1512
+ }
483
1513
 
484
- .log-prefix {
485
- color: var(--text-secondary);
486
- margin-right: 8px;
487
- }
1514
+ .custom-checkbox input:checked+.checkmark {
1515
+ border-color: var(--color-accent);
1516
+ }
488
1517
 
489
- .log-code {
490
- background-color: rgba(255, 255, 255, 0.1);
491
- border-radius: 3px;
492
- padding: 1px 4px;
493
- }
1518
+ .custom-checkbox input:checked+.checkmark::after {
1519
+ transform: scale(1);
1520
+ }
494
1521
 
495
- .thumbnail-container {
496
- display: flex;
497
- align-items: center;
498
- }
1522
+ .param-control input[type="range"] {
1523
+ -webkit-appearance: none;
1524
+ appearance: none;
1525
+ width: 100%;
1526
+ height: 16px;
1527
+ background: var(--profiler-header);
1528
+ border-radius: 5px;
1529
+ border: 1px solid var(--profiler-border);
1530
+ outline: none;
1531
+ padding: 0px;
1532
+ padding-top: 8px;
1533
+ }
499
1534
 
500
- .thumbnail-svg {
501
- width: 40px;
502
- height: 22.5px;
503
- flex-shrink: 0;
504
- margin-right: 8px;
505
- }
1535
+ .param-control input[type="range"]::-webkit-slider-thumb {
1536
+ -webkit-appearance: none;
1537
+ appearance: none;
1538
+ width: 18px;
1539
+ height: 18px;
1540
+ background: var(--profiler-background);
1541
+ border: 1px solid var(--color-accent);
1542
+ border-radius: 3px;
1543
+ cursor: pointer;
1544
+ margin-top: -8px;
1545
+ }
506
1546
 
507
- .param-control {
508
- display: flex;
509
- align-items: center;
510
- justify-content: flex-end;
511
- gap: 10px;
512
- width: 100%;
513
- }
1547
+ .param-control input[type="range"]::-moz-range-thumb {
1548
+ width: 18px;
1549
+ height: 18px;
1550
+ background: var(--profiler-background);
1551
+ border: 2px solid var(--color-accent);
1552
+ border-radius: 3px;
1553
+ cursor: pointer;
1554
+ }
514
1555
 
515
- .param-control input,
516
- .param-control select,
517
- .param-control button {
518
- background-color: var(--profiler-bg);
519
- border: 1px solid var(--profiler-border);
520
- color: var(--text-primary);
521
- border-radius: 4px;
522
- padding: 4px 6px;
523
- padding-bottom: 2px;
524
- font-family: var(--font-mono);
525
- width: 100%;
526
- box-sizing: border-box;
527
- }
1556
+ .param-control input[type="range"]::-moz-range-track {
1557
+ width: 100%;
1558
+ height: 16px;
1559
+ background: var(--profiler-header);
1560
+ border-radius: 5px;
1561
+ border: 1px solid var(--profiler-border);
1562
+ }
528
1563
 
529
- .param-control select {
530
- padding-top: 3px;
531
- padding-bottom: 1px;
532
- }
1564
+ /* Override .param-control styles for mini-panel-content */
1565
+ .mini-panel-content input,
1566
+ .mini-panel-content select,
1567
+ .mini-panel-content button {
1568
+ padding: 2px 4px;
1569
+ height: 21px;
1570
+ line-height: 1.4;
1571
+ padding-top: 4px;
1572
+ }
533
1573
 
534
- .param-control input[type="number"] {
535
- cursor: ns-resize;
536
- }
1574
+ .mini-panel-content .param-control input,
1575
+ .mini-panel-content .param-control select,
1576
+ .mini-panel-content .param-control button {
1577
+ background-color: #1e1e24c2;
1578
+ line-height: 1.0;
1579
+ }
537
1580
 
538
- .param-control input[type="color"] {
539
- padding: 2px;
540
- }
1581
+ .mini-panel-content .param-control select {
1582
+ padding: 2px 2px;
1583
+ padding-top: 3px;
1584
+ }
541
1585
 
542
- .param-control button {
543
- cursor: pointer;
544
- transition: background-color 0.2s;
545
- }
1586
+ .mini-panel-content .param-control input[type="number"]::-webkit-outer-spin-button,
1587
+ .mini-panel-content .param-control input[type="number"]::-webkit-inner-spin-button {
1588
+ -webkit-appearance: none;
1589
+ margin: 0;
1590
+ }
546
1591
 
547
- .param-control button:hover {
548
- background-color: var(--profiler-header);
549
- }
1592
+ .mini-panel-content .param-control input[type="number"] {
1593
+ -moz-appearance: textfield;
1594
+ }
550
1595
 
551
- .param-control-vector {
552
- display: flex;
553
- gap: 5px;
554
- }
1596
+ .mini-panel-content .list-item-cell span {
1597
+ position: relative;
1598
+ top: 1px;
1599
+ margin-left: 2px;
1600
+ }
555
1601
 
556
- .custom-checkbox {
557
- display: inline-flex;
558
- align-items: center;
559
- cursor: pointer;
560
- gap: 8px;
561
- }
1602
+ @media screen and (max-width: 340px) {
562
1603
 
563
- .custom-checkbox input {
564
- display: none;
565
- }
1604
+ .mini-panel-content .list-item-cell:first-child {
1605
+ display: flex;
1606
+ align-items: center;
1607
+ min-width: 0;
1608
+ overflow: hidden;
1609
+ width: 100%;
1610
+ }
566
1611
 
567
- .custom-checkbox .checkmark {
568
- width: 14px;
569
- height: 14px;
570
- border: 1px solid var(--profiler-border);
571
- border-radius: 3px;
572
- display: inline-flex;
573
- justify-content: center;
574
- align-items: center;
575
- transition: background-color 0.2s, border-color 0.2s;
576
- }
1612
+ .mini-panel-content .list-item-cell:first-child .value {
1613
+ overflow: hidden;
1614
+ text-overflow: ellipsis;
1615
+ white-space: nowrap;
1616
+ flex: 1 1 0%;
1617
+ min-width: 0;
1618
+ }
577
1619
 
578
- .custom-checkbox .checkmark::after {
579
- content: '';
580
- width: 8px;
581
- height: 8px;
582
- background-color: var(--accent-color);
583
- border-radius: 1px;
584
- display: block;
585
- transform: scale(0);
586
- transition: transform 0.2s;
587
- }
1620
+ .mini-panel-content .list-item-cell:first-child .info-icon {
1621
+ flex-shrink: 0;
1622
+ }
588
1623
 
589
- .custom-checkbox input:checked+.checkmark {
590
- border-color: var(--accent-color);
591
- }
1624
+ }
592
1625
 
593
- .custom-checkbox input:checked+.checkmark::after {
594
- transform: scale(1);
595
- }
1626
+ .mini-panel-content .custom-checkbox .checkmark {
1627
+ width: 12px;
1628
+ height: 12px;
1629
+ margin-bottom: 2px;
1630
+ will-change: transform;
1631
+ }
596
1632
 
597
- .param-control input[type="range"] {
598
- -webkit-appearance: none;
599
- appearance: none;
600
- width: 100%;
601
- height: 16px;
602
- background: var(--profiler-header);
603
- border-radius: 5px;
604
- border: 1px solid var(--profiler-border);
605
- outline: none;
606
- padding: 0px;
607
- padding-top: 8px;
608
- }
1633
+ .mini-panel-content .list-container.parameters .list-item-row:not(.collapsible) {
1634
+ margin-bottom: 2px;
1635
+ }
609
1636
 
610
- .param-control input[type="range"]::-webkit-slider-thumb {
611
- -webkit-appearance: none;
612
- appearance: none;
613
- width: 18px;
614
- height: 18px;
615
- background: var(--profiler-bg);
616
- border: 1px solid var(--accent-color);
617
- border-radius: 3px;
618
- cursor: pointer;
619
- margin-top: -8px;
620
- }
1637
+ .mini-panel-content .list-container.parameters .list-children-container > .list-item-wrapper:first-child:has(> .list-item-row:not(.collapsible)) {
1638
+ margin-top: 2px;
1639
+ }
621
1640
 
622
- .param-control input[type="range"]::-moz-range-thumb {
623
- width: 18px;
624
- height: 18px;
625
- background: var(--profiler-bg);
626
- border: 2px solid var(--accent-color);
627
- border-radius: 3px;
628
- cursor: pointer;
629
- }
1641
+ .mini-panel-content .list-container.parameters .list-children-container > .list-item-wrapper:last-child:has(> .list-item-row:not(.collapsible)) {
1642
+ margin-bottom: 4px;
1643
+ }
630
1644
 
631
- .param-control input[type="range"]::-moz-range-track {
632
- width: 100%;
633
- height: 16px;
634
- background: var(--profiler-header);
635
- border-radius: 5px;
636
- border: 1px solid var(--profiler-border);
637
- }
1645
+ @media screen and (max-width: 450px) and (orientation: portrait) {
638
1646
 
639
- @media screen and (max-width: 768px) and (orientation: portrait) {
1647
+ .console-filter-input {
1648
+ max-width: 100px;
1649
+ }
640
1650
 
641
- .console-filter-input {
642
- max-width: 100px;
1651
+ }
1652
+
1653
+ /* Touch device optimizations */
1654
+ @media (hover: none) and (pointer: coarse) {
1655
+
1656
+ .panel-resizer {
1657
+ top: -10px !important;
1658
+ height: 20px !important;
1659
+ }
1660
+
1661
+ .profiler-panel.position-top .panel-resizer {
1662
+ top: auto !important;
1663
+ bottom: -10px !important;
1664
+ height: 20px !important;
1665
+ }
1666
+
1667
+ .profiler-panel.position-left .panel-resizer {
1668
+ right: -10px !important;
1669
+ width: 20px !important;
1670
+ height: 100% !important;
1671
+ }
1672
+
1673
+ .profiler-panel.position-right .panel-resizer {
1674
+ left: -10px !important;
1675
+ width: 20px !important;
1676
+ height: 100% !important;
1677
+ }
1678
+
1679
+ .detached-tab-resizer-top,
1680
+ .detached-tab-resizer-bottom {
1681
+ height: 10px !important;
1682
+ }
1683
+
1684
+ .detached-tab-resizer-left,
1685
+ .detached-tab-resizer-right {
1686
+ width: 10px !important;
1687
+ }
1688
+
1689
+ }
1690
+
1691
+ .drag-preview-indicator {
1692
+ position: fixed;
1693
+ background-color: rgba(0, 170, 255, 0.2);
1694
+ border: 2px dashed var(--color-accent);
1695
+ z-index: 999;
1696
+ pointer-events: none;
1697
+ transition: all 0.2s ease-out;
1698
+ }
1699
+
1700
+ /* Detached Tab Windows */
1701
+ .detached-tab-panel {
1702
+ position: fixed;
1703
+ width: 500px;
1704
+ height: 400px;
1705
+ background: var(--profiler-background);
1706
+ border: 1px solid var(--profiler-border);
1707
+ border-radius: 8px;
1708
+ box-shadow: 0 10px 40px rgba(0, 0, 0, 0.5);
1709
+ z-index: 1002;
1710
+ display: flex;
1711
+ flex-direction: column;
1712
+ backdrop-filter: blur(10px);
1713
+ overflow: hidden;
1714
+ opacity: 1;
1715
+ visibility: visible;
1716
+ transition: opacity 0.2s, visibility 0.2s;
1717
+ font-family: var(--font-mono);
1718
+ font-size: 13px;
1719
+ }
1720
+
1721
+
1722
+ .detached-tab-header {
1723
+ background: var(--profiler-header-background);
1724
+ padding: 0 3px 0 10px;
1725
+ font-family: var(--font-family);
1726
+ font-size: 13px;
1727
+ color: var(--text-primary);
1728
+ font-weight: 600;
1729
+ display: flex;
1730
+ justify-content: space-between;
1731
+ align-items: center;
1732
+ border-bottom: 1px solid var(--profiler-border);
1733
+ cursor: grab;
1734
+ user-select: none;
1735
+ height: 32px;
1736
+ flex-shrink: 0;
1737
+ -webkit-font-smoothing: antialiased;
1738
+ -moz-osx-font-smoothing: grayscale;
1739
+ touch-action: none;
1740
+ }
1741
+
1742
+ .detached-tab-header:active {
1743
+ cursor: grabbing;
1744
+ }
1745
+
1746
+ .detached-header-controls {
1747
+ display: flex;
1748
+ gap: 5px;
1749
+ }
1750
+
1751
+ .detached-reattach-btn {
1752
+ background: transparent;
1753
+ border: none;
1754
+ color: var(--text-secondary);
1755
+ font-family: var(--font-family);
1756
+ font-size: 18px;
1757
+ line-height: 1;
1758
+ cursor: pointer;
1759
+ padding: 4px 8px;
1760
+ border-radius: 4px;
1761
+ transition: all 0.2s;
1762
+ display: flex;
1763
+ align-items: center;
1764
+ justify-content: center;
1765
+ -webkit-font-smoothing: antialiased;
1766
+ -moz-osx-font-smoothing: grayscale;
1767
+ }
1768
+
1769
+ .detached-reattach-btn:hover {
1770
+ background: rgba(0, 170, 255, 0.2);
1771
+ color: var(--color-accent);
1772
+ }
1773
+
1774
+ .detached-tab-content {
1775
+ flex: 1;
1776
+ overflow: hidden;
1777
+ position: relative;
1778
+ background: var(--profiler-background);
1779
+ }
1780
+
1781
+
1782
+ .detached-tab-content .profiler-content {
1783
+ display: flex !important;
1784
+ flex-direction: column !important;
1785
+ height: 100%;
1786
+ visibility: visible !important;
1787
+ opacity: 1 !important;
1788
+ position: relative !important;
1789
+ }
1790
+
1791
+ .detached-tab-content .profiler-content > * {
1792
+ font-family: var(--font-mono);
1793
+ color: var(--text-primary);
1794
+ }
1795
+
1796
+ .detached-tab-resizer {
1797
+ position: absolute;
1798
+ bottom: 0;
1799
+ right: 0;
1800
+ width: 20px;
1801
+ height: 20px;
1802
+ cursor: nwse-resize;
1803
+ z-index: 10;
1804
+ touch-action: none;
1805
+ }
1806
+
1807
+ .detached-tab-resizer::after {
1808
+ content: '';
1809
+ position: absolute;
1810
+ bottom: 2px;
1811
+ right: 2px;
1812
+ width: 12px;
1813
+ height: 12px;
1814
+ border-right: 2px solid var(--profiler-border);
1815
+ border-bottom: 2px solid var(--profiler-border);
1816
+ border-bottom-right-radius: 6px;
1817
+ opacity: 0.5;
1818
+ }
1819
+
1820
+ .detached-tab-resizer:hover::after {
1821
+ opacity: 1;
1822
+ border-color: var(--color-accent);
1823
+ }
1824
+
1825
+ /* Edge resizers */
1826
+ .detached-tab-resizer-top {
1827
+ position: absolute;
1828
+ top: 0;
1829
+ left: 0;
1830
+ right: 0;
1831
+ height: 5px;
1832
+ cursor: ns-resize;
1833
+ z-index: 10;
1834
+ touch-action: none;
1835
+ }
1836
+
1837
+ .detached-tab-resizer-right {
1838
+ position: absolute;
1839
+ top: 0;
1840
+ right: 0;
1841
+ bottom: 0;
1842
+ width: 5px;
1843
+ cursor: ew-resize;
1844
+ z-index: 10;
1845
+ touch-action: none;
1846
+ }
1847
+
1848
+ .detached-tab-resizer-bottom {
1849
+ position: absolute;
1850
+ bottom: 0;
1851
+ left: 0;
1852
+ right: 0;
1853
+ height: 5px;
1854
+ cursor: ns-resize;
1855
+ z-index: 10;
1856
+ touch-action: none;
1857
+ }
1858
+
1859
+ .detached-tab-resizer-left {
1860
+ position: absolute;
1861
+ top: 0;
1862
+ left: 0;
1863
+ bottom: 0;
1864
+ width: 5px;
1865
+ cursor: ew-resize;
1866
+ z-index: 10;
1867
+ touch-action: none;
1868
+ }
1869
+
1870
+ /* Input number spin buttons - hide arrows */
1871
+ /* Chrome, Safari, Edge, Opera */
1872
+ .profiler-panel input[type="number"]::-webkit-outer-spin-button,
1873
+ .profiler-panel input[type="number"]::-webkit-inner-spin-button,
1874
+ .detached-tab-content input[type="number"]::-webkit-outer-spin-button,
1875
+ .detached-tab-content input[type="number"]::-webkit-inner-spin-button {
1876
+ -webkit-appearance: none;
1877
+ margin: 0;
1878
+ }
1879
+
1880
+ /* Firefox */
1881
+ .profiler-panel input[type="number"],
1882
+ .detached-tab-content input[type="number"] {
1883
+ -moz-appearance: textfield;
1884
+ }
1885
+
1886
+ .panel-action-btn {
1887
+ background: transparent;
1888
+ color: var(--text-primary);
1889
+ border: 1px solid var(--profiler-border);
1890
+ border-radius: 4px;
1891
+ padding: 6px 12px;
1892
+ cursor: pointer;
1893
+ font-family: var(--font-family);
1894
+ font-size: 12px;
1895
+ transition: background-color 0.2s;
1896
+ display: flex;
1897
+ align-items: center;
1898
+ justify-content: center;
1899
+ }
1900
+
1901
+ .panel-action-btn:hover {
1902
+ background-color: rgba(255, 255, 255, 0.05);
1903
+ }
1904
+
1905
+ .node-canvas-wrapper {
1906
+ touch-action: none;
1907
+ }
1908
+
1909
+ .node-canvas-wrapper .node-canvas-detach-btn {
1910
+ position: absolute;
1911
+ top: 5px;
1912
+ right: 5px;
1913
+ background: rgba(30, 30, 36, 0.85);
1914
+ border: 1px solid var(--profiler-border);
1915
+ color: var(--text-primary);
1916
+ border-radius: 4px;
1917
+ padding: 4px;
1918
+ cursor: pointer;
1919
+ opacity: 1;
1920
+ transition: background-color 0.2s, border-color 0.2s, color 0.2s;
1921
+ display: flex;
1922
+ align-items: center;
1923
+ justify-content: center;
1924
+ z-index: 10;
1925
+ }
1926
+
1927
+ .node-canvas-wrapper .node-canvas-detach-btn:hover {
1928
+ background-color: var(--color-accent);
1929
+ border-color: var(--color-accent);
1930
+ color: white;
1931
+ }
1932
+
1933
+ .node-canvas-wrapper .node-canvas-fullscreen-btn {
1934
+ position: absolute;
1935
+ bottom: 5px;
1936
+ right: 5px;
1937
+ background: rgba(30, 30, 36, 0.85);
1938
+ border: 1px solid var(--profiler-border);
1939
+ color: var(--text-primary);
1940
+ border-radius: 4px;
1941
+ padding: 4px;
1942
+ cursor: pointer;
1943
+ opacity: 1;
1944
+ transition: background-color 0.2s, border-color 0.2s, color 0.2s;
1945
+ display: flex;
1946
+ align-items: center;
1947
+ justify-content: center;
1948
+ z-index: 10;
1949
+ }
1950
+
1951
+ .node-canvas-wrapper .node-canvas-fullscreen-btn:hover {
1952
+ background-color: var(--color-accent);
1953
+ border-color: var(--color-accent);
1954
+ color: white;
1955
+ }
1956
+
1957
+ .profiler-panel.maximized .node-canvas-fullscreen-btn {
1958
+ display: none;
1959
+ }
1960
+
1961
+ .toolbar {
1962
+ display: flex;
1963
+ align-items: center;
1964
+ justify-content: space-between;
1965
+ height: 32px;
1966
+ padding: 4px 6px;
1967
+ border-bottom: 1px solid var(--profiler-border);
1968
+ background: var(--profiler-header-background);
1969
+ flex-shrink: 0;
1970
+ box-sizing: border-box;
1971
+ gap: 16px;
1972
+ }
1973
+
1974
+ .toolbar span {
1975
+ color: var(--text-secondary);
1976
+ font-size: 12px;
1977
+ font-weight: 600;
1978
+ }
1979
+
1980
+ .toolbar .custom-checkbox .checkmark {
1981
+ width: 12px;
1982
+ height: 12px;
1983
+ border-radius: 4px;
1984
+ }
1985
+
1986
+ .viewer-content .toolbar {
1987
+ justify-content: flex-end;
1988
+ }
1989
+
1990
+ .viewer-back-btn {
1991
+ background: transparent;
1992
+ border: none;
1993
+ color: var(--text-secondary);
1994
+ cursor: pointer;
1995
+ font-size: 16px;
1996
+ line-height: 1;
1997
+ padding: 4px 8px;
1998
+ border-radius: 4px;
1999
+ margin-right: auto;
2000
+ transition: color 0.2s, background-color 0.2s;
2001
+ display: flex;
2002
+ align-items: center;
2003
+ justify-content: center;
2004
+ }
2005
+
2006
+ .viewer-back-btn:hover {
2007
+ color: var(--text-primary);
2008
+ background-color: rgba(255, 255, 255, 0.05);
2009
+ }
2010
+
2011
+ .select {
2012
+ background: var(--profiler-background);
2013
+ border: 1px solid var(--profiler-border);
2014
+ color: var(--text-primary);
2015
+ border-radius: 4px;
2016
+ padding: 4px 16px 2px 6px;
2017
+ font-family: var(--font-mono);
2018
+ font-size: 12px;
2019
+ outline: none;
2020
+ cursor: pointer;
2021
+ appearance: none;
2022
+ -webkit-appearance: none;
2023
+ -moz-appearance: none;
2024
+ background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23e0e0e0' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");
2025
+ background-repeat: no-repeat;
2026
+ background-position: right 5px center;
2027
+ background-size: 10px;
2028
+ }
2029
+
2030
+ .select:focus {
2031
+ border-color: var(--color-accent);
2032
+ }
2033
+
2034
+ .full-viewer-container {
2035
+ display: none;
2036
+ flex-grow: 1;
2037
+ width: 100%;
2038
+ height: 100%;
2039
+ overflow: hidden;
2040
+ position: relative;
2041
+ touch-action: none;
643
2042
  }
644
2043
 
645
2044
  }
646
2045
  `;
2046
+
647
2047
  const styleElement = document.createElement( 'style' );
648
- styleElement.id = 'profiler-styles';
649
2048
  styleElement.textContent = css;
650
- document.head.appendChild( styleElement );
2049
+
2050
+ container.appendChild( styleElement );
651
2051
 
652
2052
  }
653
2053