super-three 0.184.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 (366) hide show
  1. package/build/three.cjs +1260 -927
  2. package/build/three.core.js +1104 -829
  3. package/build/three.core.min.js +1 -1
  4. package/build/three.module.js +156 -98
  5. package/build/three.module.min.js +1 -1
  6. package/build/three.tsl.js +11 -4
  7. package/build/three.tsl.min.js +1 -1
  8. package/build/three.webgpu.js +7538 -3367
  9. package/build/three.webgpu.min.js +1 -1
  10. package/build/three.webgpu.nodes.js +7538 -3366
  11. package/build/three.webgpu.nodes.min.js +1 -1
  12. package/examples/jsm/Addons.js +3 -0
  13. package/examples/jsm/controls/ArcballControls.js +6 -2
  14. package/examples/jsm/controls/FirstPersonControls.js +79 -42
  15. package/examples/jsm/controls/TransformControls.js +68 -15
  16. package/examples/jsm/csm/CSMFrustum.js +31 -6
  17. package/examples/jsm/csm/CSMShadowNode.js +4 -1
  18. package/examples/jsm/effects/AsciiEffect.js +14 -1
  19. package/examples/jsm/exporters/DRACOExporter.js +27 -6
  20. package/examples/jsm/exporters/GLTFExporter.js +114 -12
  21. package/examples/jsm/exporters/PLYExporter.js +286 -73
  22. package/examples/jsm/exporters/USDZExporter.js +347 -112
  23. package/examples/jsm/generators/CityGenerator.js +346 -0
  24. package/examples/jsm/generators/ForestGenerator.js +347 -0
  25. package/examples/jsm/generators/TerrainGenerator.js +504 -0
  26. package/examples/jsm/generators/TreeGenerator.js +377 -0
  27. package/examples/jsm/generators/city/SidewalkGenerator.js +253 -0
  28. package/examples/jsm/generators/city/SkyscraperGenerator.js +1357 -0
  29. package/examples/jsm/geometries/LoftGeometry.js +355 -0
  30. package/examples/jsm/helpers/LightProbeGridHelper.js +1 -1
  31. package/examples/jsm/helpers/LightProbeHelper.js +5 -4
  32. package/examples/jsm/helpers/ViewHelper.js +16 -6
  33. package/examples/jsm/inspector/Inspector.js +53 -15
  34. package/examples/jsm/inspector/RendererInspector.js +152 -36
  35. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphEditor.js +1 -1
  36. package/examples/jsm/inspector/extensions/tsl-graph/TSLGraphLoader.js +1 -1
  37. package/examples/jsm/inspector/tabs/Console.js +200 -18
  38. package/examples/jsm/inspector/tabs/Memory.js +8 -0
  39. package/examples/jsm/inspector/tabs/Parameters.js +64 -4
  40. package/examples/jsm/inspector/tabs/Performance.js +21 -6
  41. package/examples/jsm/inspector/tabs/Settings.js +51 -9
  42. package/examples/jsm/inspector/tabs/Timeline.js +178 -93
  43. package/examples/jsm/inspector/tabs/Viewer.js +628 -16
  44. package/examples/jsm/inspector/ui/Graph.js +162 -25
  45. package/examples/jsm/inspector/ui/Item.js +92 -13
  46. package/examples/jsm/inspector/ui/List.js +1 -1
  47. package/examples/jsm/inspector/ui/Profiler.js +90 -45
  48. package/examples/jsm/inspector/ui/Style.js +1788 -1401
  49. package/examples/jsm/inspector/ui/Tab.js +5 -3
  50. package/examples/jsm/inspector/ui/Values.js +71 -6
  51. package/examples/jsm/inspector/ui/utils.js +130 -10
  52. package/examples/jsm/libs/basis/README.md +0 -1
  53. package/examples/jsm/libs/demuxer_mp4.js +3 -3
  54. package/examples/jsm/libs/draco/README.md +0 -1
  55. package/examples/jsm/libs/meshopt_clusterizer.module.js +421 -0
  56. package/examples/jsm/libs/meshopt_simplifier.module.js +627 -0
  57. package/examples/jsm/libs/mikktspace.module.js +34 -9
  58. package/examples/jsm/lighting/ClusteredLighting.js +55 -0
  59. package/examples/jsm/lighting/LightProbeGrid.js +106 -76
  60. package/examples/jsm/lines/LineMaterial.js +38 -15
  61. package/examples/jsm/lines/LineSegments2.js +8 -0
  62. package/examples/jsm/lines/webgpu/LineSegments2.js +8 -0
  63. package/examples/jsm/loaders/3DMLoader.js +1 -1
  64. package/examples/jsm/loaders/DRACOLoader.js +46 -13
  65. package/examples/jsm/loaders/EXRLoader.js +27 -55
  66. package/examples/jsm/loaders/HDRLoader.js +6 -28
  67. package/examples/jsm/loaders/KTX2Loader.js +31 -12
  68. package/examples/jsm/loaders/LDrawLoader.js +8 -8
  69. package/examples/jsm/loaders/LUT3dlLoader.js +2 -2
  70. package/examples/jsm/loaders/LUTCubeLoader.js +2 -2
  71. package/examples/jsm/loaders/LWOLoader.js +4 -0
  72. package/examples/jsm/loaders/LottieLoader.js +1 -1
  73. package/examples/jsm/loaders/MaterialXLoader.js +31 -9
  74. package/examples/jsm/loaders/NRRDLoader.js +3 -3
  75. package/examples/jsm/loaders/PCDLoader.js +7 -7
  76. package/examples/jsm/loaders/PLYLoader.js +218 -55
  77. package/examples/jsm/loaders/SVGLoader.js +547 -495
  78. package/examples/jsm/loaders/TTFLoader.js +1 -1
  79. package/examples/jsm/loaders/USDLoader.js +33 -9
  80. package/examples/jsm/loaders/VRMLLoader.js +1 -1
  81. package/examples/jsm/loaders/usd/USDAParser.js +93 -20
  82. package/examples/jsm/loaders/usd/USDCParser.js +1 -1
  83. package/examples/jsm/loaders/usd/USDComposer.js +52 -19
  84. package/examples/jsm/misc/TileCreasedNormalsPlugin.js +270 -0
  85. package/examples/jsm/misc/Volume.js +2 -2
  86. package/examples/jsm/objects/GroundedSkybox.js +1 -1
  87. package/examples/jsm/objects/Reflector.js +2 -3
  88. package/examples/jsm/objects/Water2Mesh.js +1 -1
  89. package/examples/jsm/physics/AmmoPhysics.js +15 -8
  90. package/examples/jsm/physics/RapierPhysics.js +27 -2
  91. package/examples/jsm/shaders/VolumeShader.js +31 -44
  92. package/examples/jsm/transpiler/GLSLDecoder.js +6 -6
  93. package/examples/jsm/transpiler/Linker.js +1 -1
  94. package/examples/jsm/tsl/display/BloomNode.js +59 -19
  95. package/examples/jsm/tsl/display/DepthOfFieldNode.js +2 -2
  96. package/examples/jsm/tsl/display/FXAANode.js +11 -12
  97. package/examples/jsm/tsl/display/GTAONode.js +34 -13
  98. package/examples/jsm/tsl/display/GodraysNode.js +1 -1
  99. package/examples/jsm/tsl/display/ImportanceSampledEnvironment.js +560 -0
  100. package/examples/jsm/tsl/display/PixelationPassNode.js +2 -2
  101. package/examples/jsm/tsl/display/RecurrentDenoiseNode.js +912 -0
  102. package/examples/jsm/tsl/display/SSAAPassNode.js +13 -25
  103. package/examples/jsm/tsl/display/SSGINode.js +89 -39
  104. package/examples/jsm/tsl/display/SSRNode.js +829 -132
  105. package/examples/jsm/tsl/display/SSSNode.js +2 -2
  106. package/examples/jsm/tsl/display/TemporalReprojectNode.js +1023 -0
  107. package/examples/jsm/tsl/lighting/ClusteredLightsNode.js +622 -0
  108. package/examples/jsm/tsl/lighting/DynamicLightsNode.js +1 -1
  109. package/examples/jsm/tsl/math/curlNoise.js +107 -0
  110. package/examples/jsm/tsl/shadows/TileShadowNode.js +1 -1
  111. package/examples/jsm/tsl/shadows/TileShadowNodeHelper.js +3 -3
  112. package/examples/jsm/tsl/utils/GroundedSkybox.js +62 -0
  113. package/examples/jsm/tsl/utils/RNoise.js +51 -0
  114. package/examples/jsm/tsl/utils/SpecularHelpers.js +325 -0
  115. package/examples/jsm/utils/BufferGeometryUtils.js +126 -59
  116. package/examples/jsm/utils/GeometryCompressionUtils.js +1 -1
  117. package/examples/jsm/utils/SceneOptimizer.js +1 -1
  118. package/examples/jsm/webxr/ARButton.js +1 -1
  119. package/examples/jsm/webxr/WebGLXRFallback.js +89 -0
  120. package/examples/jsm/webxr/XRControllerModelFactory.js +2 -2
  121. package/package.json +7 -7
  122. package/src/Three.TSL.js +10 -3
  123. package/src/Three.WebGPU.js +4 -0
  124. package/src/animation/AnimationAction.js +15 -11
  125. package/src/animation/AnimationClip.js +0 -139
  126. package/src/animation/KeyframeTrack.js +2 -2
  127. package/src/animation/PropertyBinding.js +2 -2
  128. package/src/cameras/Camera.js +2 -2
  129. package/src/cameras/StereoCamera.js +5 -2
  130. package/src/constants.js +1 -1
  131. package/src/core/BufferGeometry.js +29 -7
  132. package/src/core/Object3D.js +17 -7
  133. package/src/core/Raycaster.js +1 -1
  134. package/src/core/RenderTarget.js +15 -2
  135. package/src/extras/PMREMGenerator.js +6 -4
  136. package/src/extras/TextureUtils.js +1 -1
  137. package/src/extras/core/ShapePath.js +149 -160
  138. package/src/geometries/SphereGeometry.js +8 -3
  139. package/src/helpers/DirectionalLightHelper.js +2 -0
  140. package/src/helpers/HemisphereLightHelper.js +2 -0
  141. package/src/helpers/PointLightHelper.js +2 -0
  142. package/src/helpers/SpotLightHelper.js +1 -1
  143. package/src/loaders/DataTextureLoader.js +69 -38
  144. package/src/loaders/LoadingManager.js +5 -0
  145. package/src/loaders/MaterialLoader.js +36 -266
  146. package/src/loaders/ObjectLoader.js +3 -1
  147. package/src/materials/LineBasicMaterial.js +4 -0
  148. package/src/materials/Material.js +196 -1
  149. package/src/materials/MeshBasicMaterial.js +24 -0
  150. package/src/materials/MeshDepthMaterial.js +10 -0
  151. package/src/materials/MeshDistanceMaterial.js +10 -0
  152. package/src/materials/MeshLambertMaterial.js +40 -1
  153. package/src/materials/MeshMatcapMaterial.js +25 -1
  154. package/src/materials/MeshNormalMaterial.js +9 -1
  155. package/src/materials/MeshPhongMaterial.js +40 -1
  156. package/src/materials/MeshPhysicalMaterial.js +38 -0
  157. package/src/materials/MeshStandardMaterial.js +42 -1
  158. package/src/materials/MeshToonMaterial.js +34 -1
  159. package/src/materials/PointsMaterial.js +7 -0
  160. package/src/materials/ShaderMaterial.js +86 -0
  161. package/src/materials/SpriteMaterial.js +7 -0
  162. package/src/materials/nodes/Line2NodeMaterial.js +378 -322
  163. package/src/materials/nodes/MeshBasicNodeMaterial.js +2 -2
  164. package/src/materials/nodes/MeshNormalNodeMaterial.js +2 -2
  165. package/src/materials/nodes/MeshPhongNodeMaterial.js +0 -9
  166. package/src/materials/nodes/MeshPhysicalNodeMaterial.js +0 -30
  167. package/src/materials/nodes/MeshSSSNodeMaterial.js +0 -13
  168. package/src/materials/nodes/MeshStandardNodeMaterial.js +0 -11
  169. package/src/materials/nodes/NodeMaterial.js +115 -71
  170. package/src/materials/nodes/SpriteNodeMaterial.js +0 -10
  171. package/src/materials/nodes/manager/NodeMaterialObserver.js +49 -20
  172. package/src/math/Box3.js +5 -0
  173. package/src/math/FrustumArray.js +103 -133
  174. package/src/math/Interpolant.js +1 -1
  175. package/src/math/MathUtils.js +2 -2
  176. package/src/math/Matrix3.js +11 -0
  177. package/src/math/Matrix4.js +28 -3
  178. package/src/math/Vector2.js +2 -2
  179. package/src/math/Vector3.js +2 -2
  180. package/src/math/Vector4.js +2 -2
  181. package/src/math/interpolants/BezierInterpolant.js +4 -6
  182. package/src/nodes/Nodes.js +2 -5
  183. package/src/nodes/TSL.js +8 -6
  184. package/src/nodes/accessors/Arrays.js +4 -4
  185. package/src/nodes/accessors/Batch.js +108 -0
  186. package/src/nodes/accessors/Bitangent.js +2 -2
  187. package/src/nodes/accessors/BufferAttributeNode.js +13 -2
  188. package/src/nodes/accessors/Camera.js +7 -7
  189. package/src/nodes/accessors/ClippingNode.js +1 -1
  190. package/src/nodes/accessors/Instance.js +264 -0
  191. package/src/nodes/accessors/MaterialNode.js +18 -2
  192. package/src/nodes/accessors/MaterialProperties.js +4 -3
  193. package/src/nodes/accessors/{MorphNode.js → Morph.js} +99 -112
  194. package/src/nodes/accessors/Normal.js +13 -13
  195. package/src/nodes/accessors/Position.js +5 -1
  196. package/src/nodes/accessors/ReferenceNode.js +1 -0
  197. package/src/nodes/accessors/ReflectVector.js +3 -3
  198. package/src/nodes/accessors/SceneProperties.js +1 -1
  199. package/src/nodes/accessors/Skinning.js +263 -0
  200. package/src/nodes/accessors/StorageBufferNode.js +2 -2
  201. package/src/nodes/accessors/StorageTexture3DNode.js +100 -0
  202. package/src/nodes/accessors/StorageTextureNode.js +39 -7
  203. package/src/nodes/accessors/Tangent.js +4 -4
  204. package/src/nodes/accessors/TextureNode.js +60 -5
  205. package/src/nodes/code/FunctionNode.js +2 -16
  206. package/src/nodes/core/MRTNode.js +7 -2
  207. package/src/nodes/core/Node.js +39 -2
  208. package/src/nodes/core/NodeBuilder.js +201 -41
  209. package/src/nodes/core/NodeUtils.js +13 -13
  210. package/src/nodes/core/OutputStructNode.js +1 -1
  211. package/src/nodes/core/OverrideContextNode.js +153 -0
  212. package/src/nodes/core/PropertyNode.js +51 -5
  213. package/src/nodes/core/StackNode.js +56 -34
  214. package/src/nodes/core/StructNode.js +4 -6
  215. package/src/nodes/core/StructTypeNode.js +6 -6
  216. package/src/nodes/core/VarNode.js +8 -0
  217. package/src/nodes/core/VaryingNode.js +12 -2
  218. package/src/nodes/display/BlendModes.js +1 -41
  219. package/src/nodes/display/BumpMapNode.js +6 -1
  220. package/src/nodes/display/ColorAdjustment.js +10 -9
  221. package/src/nodes/display/FrontFacingNode.js +38 -9
  222. package/src/nodes/display/NormalMapNode.js +2 -2
  223. package/src/nodes/display/PassNode.js +35 -43
  224. package/src/nodes/display/PremultiplyAlphaFunctions.js +39 -0
  225. package/src/nodes/display/RenderOutputNode.js +12 -3
  226. package/src/nodes/functions/VolumetricLightingModel.js +40 -7
  227. package/src/nodes/gpgpu/WorkgroupInfoNode.js +1 -1
  228. package/src/nodes/lighting/EnvironmentNode.js +2 -2
  229. package/src/nodes/lighting/IESSpotLightNode.js +40 -2
  230. package/src/nodes/lighting/LightingContextNode.js +10 -2
  231. package/src/nodes/lighting/LightsNode.js +90 -37
  232. package/src/nodes/lighting/PointShadowNode.js +6 -1
  233. package/src/nodes/lighting/ShadowFilterNode.js +21 -52
  234. package/src/nodes/lighting/ShadowNode.js +34 -14
  235. package/src/nodes/materialx/lib/mx_noise.js +2 -2
  236. package/src/nodes/math/ConditionalNode.js +3 -3
  237. package/src/nodes/math/MathNode.js +39 -11
  238. package/src/nodes/math/OperatorNode.js +23 -23
  239. package/src/nodes/parsers/GLSLNodeFunction.js +1 -1
  240. package/src/nodes/pmrem/PMREMNode.js +33 -2
  241. package/src/nodes/tsl/TSLCore.js +63 -18
  242. package/src/nodes/utils/EquirectUV.js +30 -5
  243. package/src/nodes/utils/FunctionOverloadingNode.js +1 -1
  244. package/src/nodes/utils/Packing.js +35 -4
  245. package/src/nodes/utils/RTTNode.js +40 -24
  246. package/src/nodes/utils/ReflectorNode.js +1 -0
  247. package/src/nodes/utils/StorageArrayElementNode.js +1 -1
  248. package/src/objects/BatchedMesh.js +22 -14
  249. package/src/objects/InstancedMesh.js +0 -11
  250. package/src/objects/Skeleton.js +0 -9
  251. package/src/renderers/WebGLRenderer.js +19 -15
  252. package/src/renderers/common/Backend.js +49 -5
  253. package/src/renderers/common/Bindings.js +114 -45
  254. package/src/renderers/common/Buffer.js +9 -0
  255. package/src/renderers/common/ClippingContext.js +10 -2
  256. package/src/renderers/common/Info.js +63 -22
  257. package/src/renderers/common/Lighting.js +53 -5
  258. package/src/renderers/common/RenderList.js +41 -4
  259. package/src/renderers/common/RenderObject.js +73 -13
  260. package/src/renderers/common/Renderer.js +281 -108
  261. package/src/renderers/common/Sampler.js +16 -48
  262. package/src/renderers/common/Textures.js +32 -5
  263. package/src/renderers/common/TimestampQueryPool.js +1 -1
  264. package/src/renderers/common/UniformsGroup.js +31 -9
  265. package/src/renderers/common/XRManager.js +340 -22
  266. package/src/renderers/common/extras/PMREMGenerator.js +15 -38
  267. package/src/renderers/common/nodes/NodeBuilderState.js +9 -1
  268. package/src/renderers/common/nodes/NodeLibrary.js +4 -4
  269. package/src/renderers/common/nodes/NodeManager.js +63 -14
  270. package/src/renderers/common/nodes/NodeUniformBuffer.js +13 -0
  271. package/src/renderers/shaders/ShaderChunk/common.glsl.js +13 -4
  272. package/src/renderers/shaders/ShaderChunk/defaultnormal_vertex.glsl.js +0 -6
  273. package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +1 -1
  274. package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +2 -2
  275. package/src/renderers/shaders/ShaderChunk/envmap_vertex.glsl.js +1 -1
  276. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +1 -1
  277. package/src/renderers/shaders/ShaderChunk/lights_pars_begin.glsl.js +1 -1
  278. package/src/renderers/shaders/ShaderChunk/normal_fragment_begin.glsl.js +2 -2
  279. package/src/renderers/shaders/ShaderChunk/normal_vertex.glsl.js +6 -0
  280. package/src/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl.js +1 -1
  281. package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +1 -1
  282. package/src/renderers/shaders/ShaderLib/distance.glsl.js +1 -1
  283. package/src/renderers/webgl/WebGLOutput.js +2 -1
  284. package/src/renderers/webgl/WebGLProgram.js +5 -4
  285. package/src/renderers/webgl/WebGLPrograms.js +12 -5
  286. package/src/renderers/webgl/WebGLRenderLists.js +9 -1
  287. package/src/renderers/webgl/WebGLShaderCache.js +5 -11
  288. package/src/renderers/webgl/WebGLTextures.js +20 -7
  289. package/src/renderers/webgl/WebGLUniformsGroups.js +66 -38
  290. package/src/renderers/webgl-fallback/WebGLBackend.js +84 -25
  291. package/src/renderers/webgl-fallback/nodes/GLSLNodeBuilder.js +138 -8
  292. package/src/renderers/webgl-fallback/utils/WebGLAttributeUtils.js +1 -1
  293. package/src/renderers/webgl-fallback/utils/WebGLTextureUtils.js +52 -22
  294. package/src/renderers/webgl-fallback/utils/WebGLUtils.js +4 -2
  295. package/src/renderers/webgpu/WebGPUBackend.js +480 -169
  296. package/src/renderers/webgpu/descriptors/GPUBindGroupDescriptor.js +48 -0
  297. package/src/renderers/webgpu/descriptors/GPUBufferDescriptor.js +57 -0
  298. package/src/renderers/webgpu/descriptors/GPUCommandEncoderDescriptor.js +30 -0
  299. package/src/renderers/webgpu/descriptors/GPUComputePassDescriptor.js +38 -0
  300. package/src/renderers/webgpu/descriptors/GPUComputePipelineDescriptor.js +48 -0
  301. package/src/renderers/webgpu/descriptors/GPUCopyExternalImageDestInfo.js +47 -0
  302. package/src/renderers/webgpu/descriptors/GPUCopyExternalImageSourceInfo.js +50 -0
  303. package/src/renderers/webgpu/descriptors/GPUExtent3D.js +51 -0
  304. package/src/renderers/webgpu/descriptors/GPUPipelineLayoutDescriptor.js +39 -0
  305. package/src/renderers/webgpu/descriptors/GPUQuerySetDescriptor.js +47 -0
  306. package/src/renderers/webgpu/descriptors/GPURenderBundleEncoderDescriptor.js +74 -0
  307. package/src/renderers/webgpu/descriptors/GPURenderPassColorAttachment.js +72 -0
  308. package/src/renderers/webgpu/descriptors/GPURenderPassDepthStencilAttachment.js +99 -0
  309. package/src/renderers/webgpu/descriptors/GPURenderPassDescriptor.js +72 -0
  310. package/src/renderers/webgpu/descriptors/GPURenderPassTimestampWrites.js +49 -0
  311. package/src/renderers/webgpu/descriptors/GPURenderPipelineDescriptor.js +130 -0
  312. package/src/renderers/webgpu/descriptors/GPUSamplerDescriptor.js +119 -0
  313. package/src/renderers/webgpu/descriptors/GPUShaderModuleDescriptor.js +46 -0
  314. package/src/renderers/webgpu/descriptors/GPUTexelCopyBufferInfo.js +57 -0
  315. package/src/renderers/webgpu/descriptors/GPUTexelCopyBufferLayout.js +48 -0
  316. package/src/renderers/webgpu/descriptors/GPUTexelCopyTextureInfo.js +61 -0
  317. package/src/renderers/webgpu/descriptors/GPUTextureDescriptor.js +99 -0
  318. package/src/renderers/webgpu/descriptors/GPUTextureViewDescriptor.js +108 -0
  319. package/src/renderers/webgpu/nodes/StandardNodeLibrary.js +0 -1
  320. package/src/renderers/webgpu/nodes/WGSLNodeBuilder.js +164 -7
  321. package/src/renderers/webgpu/nodes/WGSLNodeFunction.js +1 -1
  322. package/src/renderers/webgpu/utils/WebGPUAttributeUtils.js +98 -38
  323. package/src/renderers/webgpu/utils/WebGPUBindingUtils.js +72 -68
  324. package/src/renderers/webgpu/utils/WebGPUPipelineUtils.js +164 -69
  325. package/src/renderers/webgpu/utils/WebGPUTexturePassUtils.js +158 -95
  326. package/src/renderers/webgpu/utils/WebGPUTextureUtils.js +297 -141
  327. package/src/renderers/webgpu/utils/WebGPUTimestampQueryPool.js +33 -18
  328. package/src/renderers/webgpu/utils/WebGPUUtils.js +38 -3
  329. package/src/textures/DepthTexture.js +1 -1
  330. package/src/textures/ExternalTexture.js +0 -3
  331. package/examples/fonts/LICENSE +0 -13
  332. package/examples/fonts/MPLUSRounded1c/MPLUSRounded1c-Regular.typeface.json.zip +0 -0
  333. package/examples/fonts/MPLUSRounded1c/OFL.txt +0 -91
  334. package/examples/fonts/README.md +0 -11
  335. package/examples/fonts/droid/NOTICE +0 -190
  336. package/examples/fonts/droid/README.txt +0 -18
  337. package/examples/fonts/droid/droid_sans_bold.typeface.json +0 -1
  338. package/examples/fonts/droid/droid_sans_mono_regular.typeface.json +0 -1
  339. package/examples/fonts/droid/droid_sans_regular.typeface.json +0 -1
  340. package/examples/fonts/droid/droid_serif_bold.typeface.json +0 -1
  341. package/examples/fonts/droid/droid_serif_regular.typeface.json +0 -1
  342. package/examples/fonts/gentilis_bold.typeface.json +0 -1
  343. package/examples/fonts/gentilis_regular.typeface.json +0 -1
  344. package/examples/fonts/helvetiker_bold.typeface.json +0 -1
  345. package/examples/fonts/helvetiker_regular.typeface.json +0 -1
  346. package/examples/fonts/optimer_bold.typeface.json +0 -1
  347. package/examples/fonts/optimer_regular.typeface.json +0 -1
  348. package/examples/fonts/ttf/README.md +0 -9
  349. package/examples/fonts/ttf/kenpixel.ttf +0 -0
  350. package/examples/jsm/inspector/extensions/extensions.json +0 -6
  351. package/examples/jsm/libs/ammo.wasm.js +0 -822
  352. package/examples/jsm/libs/ammo.wasm.wasm +0 -0
  353. package/examples/jsm/libs/draco/draco_encoder.js +0 -33
  354. package/examples/jsm/libs/draco/gltf/draco_encoder.js +0 -33
  355. package/examples/jsm/libs/lottie_canvas.module.js +0 -14849
  356. package/examples/jsm/libs/opentype.module.js +0 -14506
  357. package/examples/jsm/libs/rhino3dm/rhino3dm.js +0 -21
  358. package/examples/jsm/libs/rhino3dm/rhino3dm.module.js +0 -16
  359. package/examples/jsm/libs/rhino3dm/rhino3dm.wasm +0 -0
  360. package/examples/jsm/lighting/TiledLighting.js +0 -42
  361. package/examples/jsm/tsl/display/AnamorphicNode.js +0 -293
  362. package/examples/jsm/tsl/lighting/TiledLightsNode.js +0 -442
  363. package/src/nodes/accessors/BatchNode.js +0 -163
  364. package/src/nodes/accessors/InstanceNode.js +0 -349
  365. package/src/nodes/accessors/InstancedMeshNode.js +0 -50
  366. package/src/nodes/accessors/SkinningNode.js +0 -328
@@ -1,1666 +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
- --color-fps: rgb(63, 81, 181);
20
- --color-call: rgba(255, 185, 34, 1);
21
- --font-family: 'Inter', 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
22
- --font-mono: 'Fira Code', 'Courier New', Courier, monospace;
23
- }
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
24
 
25
- @import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;600&family=Fira+Code&display=swap');
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
+ }
26
34
 
27
- #profiler-panel *, #profiler-toggle * {
28
- text-transform: initial;
29
- line-height: normal;
30
- box-sizing: border-box;
31
- -webkit-font-smoothing: antialiased;
32
- -moz-osx-font-smoothing: grayscale;
33
- }
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
+ }
34
56
 
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
- }
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
+ }
56
70
 
57
- #profiler-toggle.position-right.panel-open {
58
- right: auto;
59
- left: 15px;
60
- border-radius: 6px 12px 12px 6px;
61
- flex-direction: row-reverse;
62
- }
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
+ }
63
77
 
64
- #profiler-toggle.position-right.panel-open #builtin-tabs-container {
65
- border-right: none;
66
- border-left: 1px solid #262636;
67
- }
78
+ .profiler-toggle.position-right.panel-open .builtin-tabs-container {
79
+ border-right: none;
80
+ border-left: 1px solid #262636;
81
+ }
68
82
 
69
- #profiler-toggle:hover {
70
- border-color: var(--accent-color);
71
- }
83
+ .profiler-toggle:hover {
84
+ border-color: var(--color-accent);
85
+ }
72
86
 
73
- #profiler-toggle.panel-open #toggle-icon {
74
- background-color: rgba(0, 170, 255, 0.2);
75
- color: var(--accent-color);
76
- }
87
+ .profiler-toggle.panel-open .toggle-icon {
88
+ background-color: rgba(0, 170, 255, 0.2);
89
+ color: var(--color-accent);
90
+ }
77
91
 
78
- #toggle-icon {
79
- display: flex;
80
- align-items: center;
81
- justify-content: center;
82
- width: 40px;
83
- font-size: 20px;
84
- transition: background-color 0.2s;
85
- }
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
+ }
86
102
 
87
- #profiler-toggle:hover #toggle-icon {
88
- background-color: rgba(255, 255, 255, 0.05);
89
- }
103
+ .console-badge-container {
104
+ position: absolute;
105
+ top: 2px;
106
+ right: 2px;
107
+ display: flex;
108
+ gap: 2px;
109
+ pointer-events: none;
110
+ }
90
111
 
91
- #profiler-toggle.panel-open:hover #toggle-icon {
92
- background-color: rgba(0, 170, 255, 0.3);
93
- }
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
+ }
94
128
 
95
- .toggle-separator {
96
- width: 1px;
97
- background-color: var(--profiler-border);
98
- }
129
+ .tab-badge-container {
130
+ position: absolute;
131
+ top: 1px;
132
+ right: 3px;
133
+ display: flex;
134
+ gap: 2px;
135
+ pointer-events: none;
136
+ }
99
137
 
100
- #toggle-text {
101
- display: flex;
102
- align-items: baseline;
103
- padding: 8px 14px;
104
- min-width: 80px;
105
- justify-content: right;
106
- }
138
+ .console-badge.error,
139
+ .tab-badge.error {
140
+ background-color: var(--color-red);
141
+ }
107
142
 
108
- #toggle-text .fps-label {
109
- font-size: 0.7em;
110
- margin-left: 10px;
111
- color: #999;
112
- }
143
+ .console-badge.warn,
144
+ .tab-badge.warn {
145
+ background-color: var(--color-yellow);
146
+ color: #111111;
147
+ }
113
148
 
114
- #builtin-tabs-container {
115
- display: flex;
116
- align-items: stretch;
117
- gap: 0;
118
- border-right: 1px solid #262636;
119
- order: -1;
120
- }
149
+ .profiler-toggle:hover .toggle-icon {
150
+ background-color: rgba(255, 255, 255, 0.05);
151
+ }
121
152
 
122
- .builtin-tab-btn {
123
- background: transparent;
124
- border: none;
125
- color: var(--text-secondary);
126
- cursor: pointer;
127
- padding: 8px 14px;
128
- font-family: var(--font-family);
129
- font-size: 13px;
130
- font-weight: 600;
131
- transition: all 0.2s;
132
- display: flex;
133
- align-items: center;
134
- justify-content: center;
135
- min-width: 32px;
136
- position: relative;
137
- }
153
+ .profiler-toggle.panel-open:hover .toggle-icon {
154
+ background-color: rgba(0, 170, 255, 0.3);
155
+ }
138
156
 
139
- .builtin-tab-btn svg {
140
- width: 20px;
141
- height: 20px;
142
- stroke: currentColor;
143
- }
157
+ .toggle-separator {
158
+ width: 1px;
159
+ background-color: var(--profiler-border);
160
+ }
144
161
 
145
- .builtin-tab-btn:hover {
146
- background-color: rgba(255, 255, 255, 0.08);
147
- color: var(--accent-color);
148
- }
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
+ }
149
171
 
150
- .builtin-tab-btn:active {
151
- background-color: rgba(255, 255, 255, 0.12);
152
- }
172
+ .toggle-text .fps-label {
173
+ font-size: 0.7em;
174
+ margin-left: 10px;
175
+ color: #999;
176
+ }
153
177
 
154
- .builtin-tab-btn.active {
155
- background-color: rgba(0, 170, 255, 0.2);
156
- color: var(--accent-color);
157
- }
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
+ }
158
187
 
159
- .builtin-tab-btn.active:hover {
160
- background-color: rgba(0, 170, 255, 0.3);
161
- }
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
+ }
162
204
 
163
- #profiler-mini-panel {
164
- position: fixed;
165
- top: 60px;
166
- right: 15px;
167
- background-color: rgba(30, 30, 36, 0.85);
168
- border: 1px solid #4a4a5a54;
169
- border-radius: 8px;
170
- color: var(--text-primary);
171
- z-index: 9999;
172
- backdrop-filter: blur(8px);
173
- box-shadow: 0 6px 24px rgba(0, 0, 0, 0.5);
174
- font-family: var(--font-family);
175
- font-size: 11px;
176
- width: 350px;
177
- max-height: calc(100vh - 100px);
178
- overflow-y: auto;
179
- overflow-x: hidden;
180
- display: none;
181
- opacity: 0;
182
- transform: translateY(-10px) scale(0.98);
183
- transition: opacity 0.25s cubic-bezier(0.4, 0, 0.2, 1),
184
- transform 0.25s cubic-bezier(0.4, 0, 0.2, 1);
185
- }
205
+ .builtin-tab-btn svg {
206
+ width: 20px;
207
+ height: 20px;
208
+ stroke: currentColor;
209
+ }
186
210
 
187
- #profiler-mini-panel.position-right.panel-open {
188
- right: auto;
189
- left: 15px;
190
- }
211
+ .builtin-tab-btn:hover {
212
+ background-color: rgba(255, 255, 255, 0.08);
213
+ color: var(--color-accent);
214
+ }
191
215
 
192
- #profiler-mini-panel.visible {
193
- display: block;
194
- opacity: 1;
195
- transform: translateY(0) scale(1);
196
- }
216
+ .builtin-tab-btn:active {
217
+ background-color: rgba(255, 255, 255, 0.12);
218
+ }
197
219
 
198
- #profiler-mini-panel::-webkit-scrollbar {
199
- width: 6px;
200
- }
220
+ .builtin-tab-btn.active {
221
+ background-color: rgba(0, 170, 255, 0.2);
222
+ color: var(--color-accent);
223
+ }
201
224
 
202
- #profiler-mini-panel::-webkit-scrollbar-track {
203
- background: transparent;
204
- }
225
+ .builtin-tab-btn.active:hover {
226
+ background-color: rgba(0, 170, 255, 0.3);
227
+ }
205
228
 
206
- #profiler-mini-panel::-webkit-scrollbar-thumb {
207
- background: rgba(255, 255, 255, 0.15);
208
- border-radius: 3px;
209
- transition: background 0.2s;
210
- }
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
+ }
211
254
 
212
- #profiler-mini-panel::-webkit-scrollbar-thumb:hover {
213
- background: rgba(255, 255, 255, 0.25);
214
- }
255
+ .profiler-mini-panel.position-right.panel-open {
256
+ right: auto;
257
+ left: 15px;
258
+ }
215
259
 
216
- .mini-panel-content {
217
- padding: 0;
218
- font-size: 11px;
219
- line-height: 1.5;
220
- font-family: var(--font-mono);
221
- letter-spacing: 0.3px;
222
- user-select: none;
223
- -webkit-user-select: none;
224
- }
260
+ .profiler-mini-panel.visible {
261
+ display: block;
262
+ opacity: 1;
263
+ transform: translateY(0) scale(1);
264
+ }
225
265
 
226
- .mini-panel-content .profiler-content {
227
- display: block !important;
228
- background: transparent;
229
- }
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
+ }
230
273
 
231
- .mini-panel-content .list-scroll-wrapper {
232
- max-height: calc(100vh - 120px);
233
- overflow-y: auto;
234
- overflow-x: hidden;
235
- width: 100%;
236
- }
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
+ }
237
281
 
238
- .mini-panel-content .list-scroll-wrapper::-webkit-scrollbar {
239
- width: 4px;
240
- }
282
+ .profiler-mini-panel::-webkit-scrollbar {
283
+ width: 6px;
284
+ }
241
285
 
242
- .mini-panel-content .list-scroll-wrapper::-webkit-scrollbar-track {
243
- background: transparent;
244
- }
286
+ .profiler-mini-panel::-webkit-scrollbar-track {
287
+ background: transparent;
288
+ }
245
289
 
246
- .mini-panel-content .list-scroll-wrapper::-webkit-scrollbar-thumb {
247
- background: rgba(255, 255, 255, 0.1);
248
- border-radius: 2px;
249
- }
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
+ }
250
295
 
251
- .mini-panel-content .list-scroll-wrapper::-webkit-scrollbar-thumb:hover {
252
- background: rgba(255, 255, 255, 0.2);
253
- }
296
+ .profiler-mini-panel::-webkit-scrollbar-thumb:hover {
297
+ background: rgba(255, 255, 255, 0.25);
298
+ }
254
299
 
255
- .mini-panel-content .parameters {
256
- background: transparent;
257
- border: none;
258
- box-shadow: none;
259
- padding: 4px;
260
- }
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
+ }
261
309
 
262
- .mini-panel-content .list-container.parameters {
263
- padding: 2px 6px 0px 6px !important;
264
- }
310
+ .mini-panel-content .profiler-content {
311
+ display: block !important;
312
+ background: transparent;
313
+ }
265
314
 
266
- .mini-panel-content .list-header {
267
- display: none;
268
- padding: 2px 4px;
269
- font-size: 11px;
270
- font-weight: 600;
271
- text-transform: uppercase;
272
- letter-spacing: 0.5px;
273
- }
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
+ }
274
321
 
275
- .mini-panel-content .list-item {
276
- border-bottom: 1px solid rgba(74, 74, 90, 0.2);
277
- transition: background-color 0.15s;
278
- }
322
+ .mini-panel-content .list-scroll-wrapper::-webkit-scrollbar {
323
+ width: 4px;
324
+ }
279
325
 
280
- .mini-panel-content .list-item:last-child {
281
- border-bottom: none;
282
- }
326
+ .mini-panel-content .list-scroll-wrapper::-webkit-scrollbar-track {
327
+ background: transparent;
328
+ }
283
329
 
284
- .mini-panel-content .list-item:hover {
285
- background-color: rgba(255, 255, 255, 0.04);
286
- }
330
+ .mini-panel-content .list-scroll-wrapper::-webkit-scrollbar-thumb {
331
+ background: rgba(255, 255, 255, 0.1);
332
+ border-radius: 2px;
333
+ }
287
334
 
288
- .mini-panel-content .list-item.actionable:hover {
289
- background-color: rgba(255, 255, 255, 0.06);
290
- cursor: pointer;
291
- }
335
+ .mini-panel-content .list-scroll-wrapper::-webkit-scrollbar-thumb:hover {
336
+ background: rgba(255, 255, 255, 0.2);
337
+ }
292
338
 
293
- /* Style adjustments for lil-gui look */
294
- .mini-panel-content .item-row {
295
- padding: 3px 8px;
296
- min-height: 24px;
297
- }
339
+ .mini-panel-content .parameters {
340
+ background: transparent;
341
+ border: none;
342
+ box-shadow: none;
343
+ padding: 4px;
344
+ }
298
345
 
299
- .mini-panel-content .list-item-row {
300
- padding: 1px 4px;
301
- gap: 8px;
302
- min-height: 21px;
303
- align-items: center;
304
- }
346
+ @media screen and (max-width: 340px) {
305
347
 
306
- .mini-panel-content input[type="checkbox"] {
307
- width: 12px;
308
- height: 12px;
309
- }
348
+ .mini-panel-content .parameters {
349
+ min-width: 0 !important;
350
+ }
310
351
 
311
- .mini-panel-content input[type="range"] {
312
- height: 18px;
313
- }
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
+ }
314
356
 
315
- .mini-panel-content .value-number input,
316
- .mini-panel-content .value-slider input {
317
- background-color: rgba(0, 0, 0, 0.3);
318
- border: 1px solid rgba(74, 74, 90, 0.5);
319
- font-size: 10px;
320
- }
357
+ }
321
358
 
322
- .mini-panel-content .value-number input:focus,
323
- .mini-panel-content .value-slider input:focus {
324
- border-color: var(--accent-color);
325
- }
359
+ .mini-panel-content .list-container.parameters {
360
+ padding: 2px 6px 0px 6px !important;
361
+ }
326
362
 
327
- .mini-panel-content .value-slider {
328
- gap: 6px;
329
- }
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
+ }
330
371
 
331
- /* Compact nested items */
332
- .mini-panel-content .list-item .list-item {
333
- margin-left: 8px;
334
- }
372
+ .mini-panel-content .list-item {
373
+ border-bottom: 1px solid rgba(74, 74, 90, 0.2);
374
+ transition: background-color 0.15s;
375
+ }
335
376
 
336
- .mini-panel-content .list-item .list-item .item-row,
337
- .mini-panel-content .list-item .list-item .list-item-row {
338
- padding: 2px 6px;
339
- min-height: 22px;
340
- }
377
+ .mini-panel-content .list-item:last-child {
378
+ border-bottom: none;
379
+ }
341
380
 
342
- /* Compact collapsible headers */
343
- .mini-panel-content .collapsible .item-row,
344
- .mini-panel-content .list-item-row.collapsible {
345
- padding: 2px 8px;
346
- font-weight: 600;
347
- min-height: 16px;
348
- display: flex;
349
- align-items: center;
350
- }
381
+ .mini-panel-content .list-item:hover {
382
+ background-color: rgba(255, 255, 255, 0.04);
383
+ }
351
384
 
352
- .mini-panel-content .collapsible-icon {
353
- font-size: 10px;
354
- width: 14px;
355
- height: 14px;
356
- }
385
+ .mini-panel-content .list-item.actionable:hover {
386
+ background-color: rgba(255, 255, 255, 0.06);
387
+ cursor: pointer;
388
+ }
357
389
 
358
- .mini-panel-content .param-control input[type="range"] {
359
- height: 12px;
360
- margin-top: 1px;
361
- padding-top: 5px;
362
- user-select: none;
363
- -webkit-user-select: none;
364
- outline: none;
365
- }
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
+ }
366
405
 
367
- .mini-panel-content .param-control input[type="range"]::-webkit-slider-thumb {
368
- width: 14px;
369
- height: 14px;
370
- margin-top: -5px;
371
- user-select: none;
372
- -webkit-user-select: none;
373
- }
406
+ .info-icon.active {
407
+ background-color: var(--color-accent);
408
+ color: white;
409
+ }
374
410
 
375
- .mini-panel-content .param-control input[type="range"]::-moz-range-thumb {
376
- width: 14px;
377
- height: 14px;
378
- user-select: none;
379
- -moz-user-select: none;
380
- }
411
+ @media (hover: hover) {
412
+ .info-icon:hover {
413
+ background-color: var(--color-accent);
414
+ color: white;
415
+ }
416
+ }
381
417
 
382
- .mini-panel-content .list-children-container {
383
- padding-left: 0;
384
- }
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
+ }
385
439
 
386
- .mini-panel-content .param-control input[type="number"] {
387
- flex-basis: 60px !important;
388
- }
440
+ .info-tooltip h3 {
441
+ margin: 0 0 6px 0;
442
+ font-size: 13px;
443
+ color: var(--color-accent);
444
+ }
389
445
 
390
- .mini-panel-content .param-control {
391
- align-items: center;
392
- }
446
+ .info-tooltip strong {
447
+ font-weight: 600;
448
+ color: white;
449
+ }
393
450
 
394
- .mini-panel-content .param-control select {
395
- font-size: 11px;
396
- }
451
+ /* Style adjustments for lil-gui look */
452
+ .mini-panel-content .item-row {
453
+ padding: 3px 8px;
454
+ min-height: 24px;
455
+ }
397
456
 
398
- .mini-panel-content .list-item-wrapper {
399
- margin-top: 0;
400
- margin-bottom: 0;
401
- }
457
+ .mini-panel-content .list-item-row {
458
+ padding: 1px 4px;
459
+ gap: 8px;
460
+ min-height: 21px;
461
+ align-items: center;
462
+ }
402
463
 
403
- #profiler-panel {
404
- position: fixed;
405
- z-index: 1001 !important;
406
- bottom: 0;
407
- left: 0;
408
- right: 0;
409
- height: 350px;
410
- background-color: var(--profiler-bg);
411
- backdrop-filter: blur(8px);
412
- border-top: 2px solid var(--profiler-border);
413
- color: var(--text-primary);
414
- display: flex;
415
- flex-direction: column;
416
- z-index: 1000;
417
- /*box-shadow: 0 -5px 25px rgba(0, 0, 0, 0.5);*/
418
- transform: translateY(100%);
419
- transition: transform 0.35s cubic-bezier(0.25, 0.46, 0.45, 0.94), height 0.3s ease-out, width 0.3s ease-out;
420
- font-family: var(--font-mono);
421
- }
464
+ .mini-panel-content input[type="checkbox"] {
465
+ width: 12px;
466
+ height: 12px;
467
+ }
422
468
 
423
- #profiler-panel.resizing,
424
- #profiler-panel.dragging {
425
- transition: none;
426
- }
469
+ .mini-panel-content input[type="range"] {
470
+ height: 18px;
471
+ }
427
472
 
428
- #profiler-panel.visible {
429
- transform: translateY(0);
430
- }
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
+ }
431
479
 
432
- #profiler-panel.maximized {
433
- height: 100vh;
434
- }
480
+ .mini-panel-content .value-number input:focus,
481
+ .mini-panel-content .value-slider input:focus {
482
+ border-color: var(--color-accent);
483
+ }
435
484
 
436
- /* Position-specific styles */
437
- #profiler-panel.position-top {
438
- bottom: auto;
439
- top: 0;
440
- border-top: none;
441
- border-bottom: 2px solid var(--profiler-border);
442
- transform: translateY(-100%);
443
- }
485
+ .mini-panel-content .value-slider {
486
+ gap: 6px;
487
+ }
444
488
 
445
- #profiler-panel.position-top.visible {
446
- transform: translateY(0);
447
- }
489
+ /* Compact nested items */
490
+ .mini-panel-content .list-item .list-item {
491
+ margin-left: 8px;
492
+ }
448
493
 
449
- #profiler-panel.position-bottom {
450
- /* Default position - already defined above */
451
- }
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
+ }
452
499
 
453
- #profiler-panel.position-left {
454
- top: 0;
455
- bottom: 0;
456
- left: 0;
457
- right: auto;
458
- width: 350px;
459
- height: 100%;
460
- border-top: none;
461
- border-right: 2px solid var(--profiler-border);
462
- transform: translateX(-100%);
463
- }
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
+ }
464
510
 
465
- #profiler-panel.position-left.visible {
466
- transform: translateX(0);
467
- }
511
+ .mini-panel-content .collapsible-icon {
512
+ font-size: 10px;
513
+ width: 14px;
514
+ height: 14px;
515
+ }
468
516
 
469
- #profiler-panel.position-right {
470
- top: 0;
471
- bottom: 0;
472
- left: auto;
473
- right: 0;
474
- width: 350px;
475
- height: 100%;
476
- border-top: none;
477
- border-left: 2px solid var(--profiler-border);
478
- transform: translateX(100%);
479
- }
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
+ }
480
525
 
481
- #profiler-panel.position-right.visible {
482
- transform: translateX(0);
483
- }
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
+ }
484
533
 
485
- #profiler-panel.position-floating {
486
- border: 2px solid var(--profiler-border);
487
- border-radius: 8px;
488
- box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4);
489
- transform: none !important;
490
- overflow: hidden;
491
- }
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
+ }
492
540
 
493
- #profiler-panel.position-floating.visible {
494
- transform: none !important;
495
- }
541
+ .mini-panel-content .list-children-container {
542
+ padding-left: 0;
543
+ }
496
544
 
497
- #profiler-panel.position-floating .profiler-header {
498
- border-radius: 6px 6px 0 0;
499
- }
545
+ .mini-panel-content .param-control input[type="number"] {
546
+ flex-basis: 60px !important;
547
+ }
500
548
 
501
- #profiler-panel.position-floating .panel-resizer {
502
- bottom: 0;
503
- right: 0;
504
- top: auto;
505
- left: auto;
506
- width: 16px;
507
- height: 16px;
508
- cursor: nwse-resize;
509
- border-radius: 0 0 6px 0;
510
- }
549
+ .mini-panel-content .param-control {
550
+ align-items: center;
551
+ }
511
552
 
512
- #profiler-panel.position-floating .panel-resizer::after {
513
- content: '';
514
- position: absolute;
515
- right: 2px;
516
- bottom: 2px;
517
- width: 10px;
518
- height: 10px;
519
- background: linear-gradient(135deg, transparent 0%, transparent 45%, var(--profiler-border) 45%, var(--profiler-border) 55%, transparent 55%);
520
- }
553
+ .mini-panel-content .param-control select {
554
+ font-size: 11px;
555
+ }
521
556
 
557
+ .mini-panel-content .list-item-wrapper {
558
+ margin-top: 0;
559
+ margin-bottom: 0;
560
+ }
522
561
 
523
- .panel-resizer {
524
- position: absolute;
525
- top: -2px;
526
- left: 0;
527
- width: 100%;
528
- height: 5px;
529
- cursor: ns-resize;
530
- z-index: 1001;
531
- touch-action: none;
532
- }
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
+ }
533
581
 
534
- #profiler-panel.position-top .panel-resizer {
535
- top: auto;
536
- bottom: -2px;
537
- }
582
+ .profiler-panel.resizing,
583
+ .profiler-panel.dragging {
584
+ transition: none;
585
+ }
538
586
 
539
- #profiler-panel.position-left .panel-resizer {
540
- top: 0;
541
- left: auto;
542
- right: -2px;
543
- width: 5px;
544
- height: 100%;
545
- cursor: ew-resize;
546
- }
587
+ .profiler-panel.visible {
588
+ transform: translateY(0);
589
+ }
547
590
 
548
- #profiler-panel.position-right .panel-resizer {
549
- top: 0;
550
- left: -2px;
551
- right: auto;
552
- width: 5px;
553
- height: 100%;
554
- cursor: ew-resize;
555
- }
591
+ .profiler-panel.maximized {
592
+ height: 100vh;
593
+ }
556
594
 
557
- .profiler-header {
558
- display: flex;
559
- background-color: var(--profiler-header-bg);
560
- border-bottom: 1px solid var(--profiler-border);
561
- flex-shrink: 0;
562
- justify-content: space-between;
563
- align-items: stretch;
564
-
565
- overflow-x: auto;
566
- overflow-y: hidden;
567
- width: calc(100% - 134px);
568
- height: 38px;
569
- user-select: none;
570
- -webkit-user-select: none;
571
- }
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
+ }
572
603
 
573
- /* Adjust header width based on panel position */
574
- #profiler-panel.position-right .profiler-header,
575
- #profiler-panel.position-left .profiler-header {
576
- width: calc(100% - 134px);
577
- }
604
+ .profiler-panel.position-top.visible {
605
+ transform: translateY(0);
606
+ }
578
607
 
579
- #profiler-panel.position-bottom .profiler-header,
580
- #profiler-panel.position-top .profiler-header {
581
- width: calc(100% - 134px);
582
- }
608
+ .profiler-panel.position-bottom {
609
+ /* Default position - already defined above */
610
+ }
583
611
 
584
- /* Adjust header width when position toggle button is hidden (mobile) */
585
- #profiler-panel.hide-position-toggle .profiler-header {
586
- width: calc(100% - 90px);
587
- }
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
+ }
588
623
 
589
- /* ===== RULES FOR WHEN THERE ARE NO TABS ===== */
624
+ .profiler-panel.position-left.visible {
625
+ transform: translateX(0);
626
+ }
590
627
 
591
- /* Horizontal mode (bottom/top) without tabs */
592
- #profiler-panel.position-bottom.no-tabs:not(.maximized),
593
- #profiler-panel.position-top.no-tabs:not(.maximized) {
594
- height: 38px !important;
595
- min-height: 38px !important;
596
- }
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
+ }
597
639
 
598
- #profiler-panel.position-bottom.no-tabs .profiler-header,
599
- #profiler-panel.position-top.no-tabs .profiler-header {
600
- width: 100%;
601
- height: 38px;
602
- border-bottom: none;
603
- }
640
+ .profiler-panel.position-right.visible {
641
+ transform: translateX(0);
642
+ }
604
643
 
605
- #profiler-panel.position-bottom.no-tabs .profiler-content-wrapper,
606
- #profiler-panel.position-top.no-tabs .profiler-content-wrapper {
607
- display: none;
608
- }
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
+ }
609
651
 
610
- #profiler-panel.position-bottom.no-tabs .panel-resizer,
611
- #profiler-panel.position-top.no-tabs .panel-resizer {
612
- display: none;
613
- }
652
+ .profiler-panel.position-floating.visible {
653
+ transform: none !important;
654
+ }
614
655
 
615
- /* Vertical mode (right/left) without tabs */
616
- #profiler-panel.position-right.no-tabs:not(.maximized),
617
- #profiler-panel.position-left.no-tabs:not(.maximized) {
618
- width: 45px !important;
619
- min-width: 45px !important;
620
- }
656
+ .profiler-panel.position-floating .profiler-header {
657
+ border-radius: 6px 6px 0 0;
658
+ }
621
659
 
622
- /* Vertical layout for header when no tabs */
623
- #profiler-panel.position-right.no-tabs .profiler-header,
624
- #profiler-panel.position-left.no-tabs .profiler-header {
625
- width: 100%;
626
- flex-direction: column;
627
- height: 100%;
628
- border-bottom: none;
629
- }
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
+ }
630
670
 
631
- /* Vertical layout for controls when no tabs */
632
- #profiler-panel.position-right.no-tabs .profiler-controls,
633
- #profiler-panel.position-left.no-tabs .profiler-controls {
634
- position: static;
635
- flex-direction: column-reverse;
636
- justify-content: flex-end;
637
- width: 100%;
638
- height: 100%;
639
- border-bottom: none;
640
- border-left: none;
641
- background: transparent;
642
- }
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
+ }
643
680
 
644
- #profiler-panel.position-right.no-tabs .profiler-controls button,
645
- #profiler-panel.position-left.no-tabs .profiler-controls button {
646
- width: 100%;
647
- height: 45px;
648
- border-left: none;
649
- border-top: none;
650
- border-bottom: 1px solid var(--profiler-border);
651
- }
652
681
 
653
- #profiler-panel.position-right.no-tabs .profiler-content-wrapper,
654
- #profiler-panel.position-left.no-tabs .profiler-content-wrapper {
655
- display: none;
656
- }
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
+ }
657
692
 
658
- #profiler-panel.position-right.no-tabs .profiler-tabs,
659
- #profiler-panel.position-left.no-tabs .profiler-tabs {
660
- display: none;
661
- }
693
+ .profiler-panel.position-top .panel-resizer {
694
+ top: auto;
695
+ bottom: -2px;
696
+ }
662
697
 
663
- #profiler-panel.position-right.no-tabs .panel-resizer,
664
- #profiler-panel.position-left.no-tabs .panel-resizer {
665
- display: none;
666
- }
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
+ }
667
706
 
668
- /* Hide position toggle on mobile without tabs */
669
- #profiler-panel.hide-position-toggle.position-right.no-tabs:not(.maximized),
670
- #profiler-panel.hide-position-toggle.position-left.no-tabs:not(.maximized) {
671
- width: 45px !important;
672
- min-width: 45px !important;
673
- }
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
+ }
674
715
 
675
- /* Hide drag indicator on mobile devices */
676
- #profiler-panel.is-mobile .tab-btn.active::before {
677
- display: none;
678
- }
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
+ }
679
731
 
680
- .profiler-header::-webkit-scrollbar {
681
- width: 8px;
682
- height: 8px;
683
- }
732
+ .profiler-panel.has-horizontal-scroll .profiler-header {
733
+ height: 38px;
734
+ }
684
735
 
685
- .profiler-header::-webkit-scrollbar-track {
686
- background: transparent;
687
- }
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
+ }
688
741
 
689
- .profiler-header::-webkit-scrollbar-thumb {
690
- background-color: rgba(0, 0, 0, 0.25);
691
- border-radius: 10px;
692
- transition: background 0.3s ease;
693
- }
742
+ .profiler-panel.position-bottom .profiler-header,
743
+ .profiler-panel.position-top .profiler-header {
744
+ width: calc(100% - 120px);
745
+ }
694
746
 
695
- .profiler-header::-webkit-scrollbar-thumb:hover {
696
- background-color: rgba(0, 0, 0, 0.4);
697
- }
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
+ }
698
751
 
699
- .profiler-header::-webkit-scrollbar-corner {
700
- background: transparent;
701
- }
752
+ /* Adjust header width when maximized (floating position toggle button is hidden) */
753
+ .profiler-panel.maximized .profiler-header {
754
+ width: calc(100% - 80px);
755
+ }
702
756
 
703
- #profiler-panel.dragging .profiler-header {
704
- cursor: grabbing !important;
705
- }
757
+ /* ===== RULES FOR WHEN THERE ARE NO TABS ===== */
706
758
 
707
- #profiler-panel.dragging {
708
- opacity: 0.8;
709
- }
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
+ }
710
765
 
711
- .profiler-tabs {
712
- display: flex;
713
- cursor: grab;
714
- position: relative;
715
- }
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
+ }
716
1042
 
717
- .profiler-tabs:active {
718
- cursor: grabbing;
719
- }
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
+ }
720
1060
 
721
- .profiler-tabs::-webkit-scrollbar {
722
- width: 8px;
723
- height: 8px;
724
- }
1061
+ .profiler-content.active {
1062
+ visibility: visible;
1063
+ opacity: 1;
1064
+ }
725
1065
 
726
- .profiler-tabs::-webkit-scrollbar-track {
727
- background: transparent;
728
- }
1066
+ .profiler-content {
1067
+ overflow: auto; /* make sure scrollbars can appear */
1068
+ }
729
1069
 
730
- .profiler-tabs::-webkit-scrollbar-thumb {
731
- background-color: rgba(0, 0, 0, 0.25);
732
- border-radius: 10px;
733
- transition: background 0.3s ease;
734
- }
735
1070
 
736
- .profiler-tabs::-webkit-scrollbar-thumb:hover {
737
- background-color: rgba(0, 0, 0, 0.4);
738
- }
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
+ }
739
1082
 
740
- .profiler-tabs::-webkit-scrollbar-corner {
741
- background: transparent;
742
- }
1083
+ .parameters .list-item-row {
1084
+ min-height: 23px;
1085
+ }
743
1086
 
744
- .profiler-controls {
745
- display: flex;
746
- position: absolute;
747
- right: 0;
748
- top: 0;
749
- height: 38px;
750
- background: var(--profiler-header-bg);
751
- border-bottom: 1px solid var(--profiler-border);
752
- }
1087
+ .mini-panel-content .parameters .list-item-row {
1088
+ min-height: 21px;
1089
+ }
753
1090
 
754
- .tab-btn {
755
- position: relative;
756
- background: transparent;
757
- border: none;
758
- /*border-right: 1px solid var(--profiler-border);*/
759
- color: var(--text-secondary);
760
- padding: 8px 18px;
761
- cursor: default;
762
- display: flex;
763
- align-items: center;
764
- font-family: var(--font-family);
765
- font-weight: 600;
766
- font-size: 14px;
767
- user-select: none;
768
- transition: opacity 0.2s, transform 0.2s;
769
- touch-action: pan-x;
770
- }
1091
+ .list-item-wrapper {
1092
+ margin-top: 2px;
1093
+ margin-bottom: 2px;
1094
+ user-select: none;
1095
+ -webkit-user-select: none;
1096
+ }
771
1097
 
772
- .tab-btn.active {
773
- border-bottom: 2px solid var(--accent-color);
774
- color: white;
775
- }
1098
+ .list-item-wrapper:has(> .list-item-row .graph-container) {
1099
+ margin-left: -1.5em;
1100
+ }
776
1101
 
777
- .tab-btn.active::before {
778
- content: '⋮⋮';
779
- position: absolute;
780
- left: 3px;
781
- top: calc(50% - .1rem);
782
- transform: translateY(-50%);
783
- color: var(--profiler-border);
784
- font-size: 18px;
785
- letter-spacing: -2px;
786
- opacity: 0.6;
787
- }
1102
+ .list-item-wrapper:first-child {
1103
+ /*margin-top: 0;*/
1104
+ }
788
1105
 
789
- .tab-btn.no-detach.active::before {
790
- display: none;
791
- }
1106
+ .list-item-wrapper:not(.header-wrapper):nth-child(odd) > .list-item-row {
1107
+ background-color: rgba(0,0,0,0.1);
1108
+ }
792
1109
 
793
- #floating-btn,
794
- #maximize-btn,
795
- #hide-panel-btn {
796
- background: transparent;
797
- border: none;
798
- border-left: 1px solid var(--profiler-border);
799
- color: var(--text-secondary);
800
- width: 45px;
801
- height: 100%;
802
- cursor: pointer;
803
- transition: all 0.2s;
804
- display: flex;
805
- align-items: center;
806
- justify-content: center;
807
- flex-shrink: 0;
808
- }
1110
+ .list-item-wrapper.header-wrapper>.list-item-row {
1111
+ color: var(--color-accent);
1112
+ background-color: rgba(0, 170, 255, 0.1);
1113
+ }
809
1114
 
810
- /* Disable transitions in vertical mode to avoid broken animations */
811
- #profiler-panel.position-right #floating-btn,
812
- #profiler-panel.position-right #maximize-btn,
813
- #profiler-panel.position-right #hide-panel-btn,
814
- #profiler-panel.position-left #floating-btn,
815
- #profiler-panel.position-left #maximize-btn,
816
- #profiler-panel.position-left #hide-panel-btn {
817
- transition: background-color 0.2s, color 0.2s;
818
- }
1115
+ .list-item-wrapper.header-wrapper>.list-item-row>.list-item-cell:first-child {
1116
+ font-weight: 600;
1117
+ }
819
1118
 
820
- #floating-btn:hover,
821
- #maximize-btn:hover,
822
- #hide-panel-btn:hover {
823
- background-color: rgba(255, 255, 255, 0.1);
824
- color: var(--text-primary);
825
- }
1119
+ .list-item-row.collapsible,
1120
+ .list-item-row.actionable {
1121
+ cursor: pointer;
1122
+ }
826
1123
 
827
- /* Hide maximize button when there are no tabs */
828
- #profiler-panel.position-right.no-tabs #maximize-btn,
829
- #profiler-panel.position-left.no-tabs #maximize-btn,
830
- #profiler-panel.position-bottom.no-tabs #maximize-btn,
831
- #profiler-panel.position-top.no-tabs #maximize-btn {
832
- display: none !important;
833
- }
1124
+ .list-item-row.collapsible {
1125
+ background-color: rgba(0, 170, 255, 0.15) !important;
1126
+ min-height: 23px;
1127
+ }
834
1128
 
835
- .profiler-content-wrapper {
836
- flex-grow: 1;
837
- overflow: hidden;
838
- position: relative;
839
- }
1129
+ .list-item-row.collapsible.alert,
1130
+ .list-item-row.alert {
1131
+ background-color: rgba(244, 67, 54, 0.1) !important;
1132
+ }
840
1133
 
841
- .profiler-content {
842
- position: absolute;
843
- top: 0;
844
- left: 0;
845
- width: 100%;
846
- height: 100%;
847
- overflow-y: auto;
848
- font-size: 13px;
849
- visibility: hidden;
850
- opacity: 0;
851
- transition: opacity 0.2s, visibility 0.2s;
852
- box-sizing: border-box;
853
- display: flex;
854
- flex-direction: column;
855
- user-select: none;
856
- -webkit-user-select: none;
857
- }
1134
+ @media (hover: hover) {
858
1135
 
859
- .profiler-content.active {
860
- visibility: visible;
861
- opacity: 1;
862
- }
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
+ }
863
1142
 
864
- .profiler-content {
865
- overflow: auto; /* make sure scrollbars can appear */
866
- }
1143
+ .list-item-row.collapsible:hover {
1144
+ background-color: rgba(0, 170, 255, 0.25) !important;
1145
+ }
867
1146
 
868
- .profiler-content::-webkit-scrollbar {
869
- width: 8px;
870
- height: 8px;
871
- }
1147
+ }
872
1148
 
873
- .profiler-content::-webkit-scrollbar-track {
874
- background: transparent;
875
- }
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
+ }
876
1156
 
877
- .profiler-content::-webkit-scrollbar-thumb {
878
- background-color: rgba(0, 0, 0, 0.25);
879
- border-radius: 10px;
880
- transition: background 0.3s ease;
881
- }
1157
+ .list-item-cell:not(:first-child) {
1158
+ justify-content: flex-end;
1159
+ font-weight: 600;
1160
+ }
882
1161
 
883
- .profiler-content::-webkit-scrollbar-thumb:hover {
884
- background-color: rgba(0, 0, 0, 0.4);
885
- }
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
+ }
886
1175
 
887
- .profiler-content::-webkit-scrollbar-corner {
888
- background: transparent;
889
- }
1176
+ .list-item-wrapper.section-start {
1177
+ margin-top: 5px;
1178
+ margin-bottom: 5px;
1179
+ }
890
1180
 
891
- .profiler-content {
892
- scrollbar-width: thin; /* "auto" | "thin" */
893
- scrollbar-color: rgba(0, 0, 0, 0.25) transparent;
894
- }
1181
+ .list-header .list-header-cell:not(:first-child) {
1182
+ text-align: right;
1183
+ }
895
1184
 
896
- .list-item-row {
897
- display: grid;
898
- align-items: center;
899
- padding: 4px 8px;
900
- border-radius: 3px;
901
- transition: background-color 0.2s;
902
- gap: 10px;
903
- border-bottom: none;
904
- user-select: none;
905
- -webkit-user-select: none;
906
- }
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
+ }
907
1191
 
908
- .parameters .list-item-row {
909
- min-height: 31px;
910
- }
1192
+ .list-children-container.closed {
1193
+ max-height: 0;
1194
+ }
911
1195
 
912
- .mini-panel-content .parameters .list-item-row {
913
- min-height: 21px;
914
- }
1196
+ .item-toggler {
1197
+ display: inline-block;
1198
+ margin-right: 0.8em;
1199
+ text-align: left;
1200
+ }
915
1201
 
916
- .list-item-wrapper {
917
- margin-top: 2px;
918
- margin-bottom: 2px;
919
- user-select: none;
920
- -webkit-user-select: none;
921
- }
1202
+ .list-item-row.open .item-toggler::before {
1203
+ content: '-';
1204
+ }
922
1205
 
923
- .list-item-wrapper:first-child {
924
- /*margin-top: 0;*/
925
- }
1206
+ .list-item-row:not(.open) .item-toggler::before {
1207
+ content: '+';
1208
+ }
926
1209
 
927
- .list-item-wrapper:not(.header-wrapper):nth-child(odd) > .list-item-row {
928
- background-color: rgba(0,0,0,0.1);
929
- }
1210
+ .list-item-cell .value.good {
1211
+ color: var(--color-green);
1212
+ }
930
1213
 
931
- .list-item-wrapper.header-wrapper>.list-item-row {
932
- color: var(--accent-color);
933
- background-color: rgba(0, 170, 255, 0.1);
934
- }
1214
+ .list-item-cell .value.warn {
1215
+ color: var(--color-yellow);
1216
+ }
935
1217
 
936
- .list-item-wrapper.header-wrapper>.list-item-row>.list-item-cell:first-child {
937
- font-weight: 600;
938
- line-height: 1;
939
- }
1218
+ .list-item-cell .value.bad {
1219
+ color: var(--color-red);
1220
+ }
940
1221
 
941
- .list-item-row.collapsible,
942
- .list-item-row.actionable {
943
- cursor: pointer;
944
- }
1222
+ .list-scroll-wrapper {
1223
+ width: max-content;
1224
+ min-width: 100%;
1225
+ display: flex;
1226
+ flex-direction: column;
1227
+ min-height: 100%;
1228
+ }
945
1229
 
946
- .list-item-row.collapsible {
947
- background-color: rgba(0, 170, 255, 0.15) !important;
948
- min-height: 23px;
949
- }
1230
+ .list-container.parameters .list-item-row:not(.collapsible) {
1231
+ }
950
1232
 
951
- .list-item-row.collapsible.alert,
952
- .list-item-row.alert {
953
- background-color: rgba(244, 67, 54, 0.1) !important;
954
- }
1233
+ .graph-container {
1234
+ width: 100%;
1235
+ box-sizing: border-box;
1236
+ padding: 8px 0;
1237
+ position: relative;
1238
+ }
955
1239
 
956
- @media (hover: hover) {
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
+ }
957
1249
 
958
- .list-item-row:hover:not(.collapsible):not(.no-hover),
959
- .list-item-row:hover:not(.no-hover),
960
- .list-item-row.actionable:hover,
961
- .list-item-row.collapsible.actionable:hover {
962
- background-color: rgba(255, 255, 255, 0.05) !important;
1250
+ .graph-path {
1251
+ stroke-width: 2;
1252
+ fill-opacity: 0.4;
963
1253
  }
964
1254
 
965
- .list-item-row.collapsible:hover {
966
- background-color: rgba(0, 170, 255, 0.25) !important;
1255
+ .console-buttons-group {
1256
+ display: flex;
1257
+ gap: 20px;
967
1258
  }
968
1259
 
969
- }
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
+ }
970
1271
 
971
- .list-item-cell {
972
- white-space: pre;
973
- display: flex;
974
- align-items: center;
975
- user-select: none;
976
- -webkit-user-select: none;
977
- }
1272
+ .console-filter-input:focus {
1273
+ outline: none;
1274
+ border-color: var(--text-secondary);
1275
+ }
978
1276
 
979
- .list-item-cell:not(:first-child) {
980
- justify-content: flex-end;
981
- font-weight: 600;
982
- }
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
+ }
983
1289
 
984
- .list-header {
985
- display: grid;
986
- align-items: center;
987
- padding: 4px 8px;
988
- font-weight: 600;
989
- color: var(--text-secondary);
990
- padding-bottom: 6px;
991
- border-bottom: 1px solid var(--profiler-border);
992
- margin-bottom: 5px;
993
- gap: 10px;
994
- user-select: none;
995
- -webkit-user-select: none;
996
- }
1290
+ .console-copy-button:hover {
1291
+ color: var(--text-primary);
1292
+ background-color: var(--profiler-hover);
1293
+ }
997
1294
 
998
- .list-item-wrapper.section-start {
999
- margin-top: 5px;
1000
- margin-bottom: 5px;
1001
- }
1295
+ .console-copy-button.copied {
1296
+ color: var(--color-green);
1297
+ }
1002
1298
 
1003
- .list-header .list-header-cell:not(:first-child) {
1004
- text-align: right;
1005
- }
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
+ }
1006
1309
 
1007
- .list-children-container {
1008
- padding-left: 1.5em;
1009
- overflow: hidden;
1010
- transition: max-height 0.1s ease-out;
1011
- margin-top: 2px;
1012
- }
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
+ }
1013
1318
 
1014
- .list-children-container.closed {
1015
- max-height: 0;
1016
- }
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;
1332
+ }
1017
1333
 
1018
- .item-toggler {
1019
- display: inline-block;
1020
- margin-right: 0.8em;
1021
- text-align: left;
1022
- }
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;
1343
+ }
1023
1344
 
1024
- .list-item-row.open .item-toggler::before {
1025
- content: '-';
1026
- }
1345
+ .log-body {
1346
+ flex-grow: 1;
1347
+ white-space: pre-wrap;
1348
+ word-break: break-all;
1349
+ }
1027
1350
 
1028
- .list-item-row:not(.open) .item-toggler::before {
1029
- content: '+';
1030
- }
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
+ }
1031
1356
 
1032
- .list-item-cell .value.good {
1033
- color: var(--color-green);
1034
- }
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
+ }
1035
1362
 
1036
- .list-item-cell .value.warn {
1037
- color: var(--color-yellow);
1038
- }
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
+ }
1039
1368
 
1040
- .list-item-cell .value.bad {
1041
- color: var(--color-red);
1042
- }
1369
+ .log-message.hidden {
1370
+ display: none;
1371
+ }
1043
1372
 
1044
- .list-scroll-wrapper {
1045
- width: max-content;
1046
- min-width: 100%;
1047
- display: flex;
1048
- flex-direction: column;
1049
- min-height: 100%;
1050
- }
1373
+ .log-message.info {
1374
+ color: var(--text-primary);
1375
+ }
1051
1376
 
1052
- .list-container.parameters .list-item-row:not(.collapsible) {
1053
- }
1377
+ .log-message.warn {
1378
+ color: var(--color-yellow);
1379
+ }
1054
1380
 
1055
- .graph-container {
1056
- width: 100%;
1057
- box-sizing: border-box;
1058
- padding: 8px 0;
1059
- position: relative;
1060
- }
1381
+ .log-message.error {
1382
+ color: #f9dedc;
1383
+ background-color: rgba(244, 67, 54, 0.1);
1384
+ }
1061
1385
 
1062
- .graph-svg {
1063
- width: 100%;
1064
- height: 80px;
1065
- background-color: var(--profiler-header);
1066
- border: 1px solid var(--profiler-border);
1067
- border-radius: 4px;
1068
- }
1386
+ .log-prefix {
1387
+ color: var(--text-secondary);
1388
+ margin-right: 8px;
1389
+ }
1069
1390
 
1070
- .graph-path {
1071
- stroke-width: 2;
1072
- fill-opacity: 0.4;
1073
- }
1391
+ .log-code {
1392
+ background-color: rgba(255, 255, 255, 0.1);
1393
+ border-radius: 3px;
1394
+ padding: 1px 4px;
1395
+ }
1074
1396
 
1075
- .console-header {
1076
- padding: 10px;
1077
- border-bottom: 1px solid var(--profiler-border);
1078
- display: flex;
1079
- gap: 20px;
1080
- flex-shrink: 0;
1081
- align-items: center;
1082
- justify-content: space-between;
1083
- }
1397
+ .thumbnail-container {
1398
+ display: flex;
1399
+ align-items: center;
1400
+ }
1084
1401
 
1085
- .console-buttons-group {
1086
- display: flex;
1087
- gap: 20px;
1088
- }
1402
+ .thumbnail-svg {
1403
+ width: 40px;
1404
+ height: 22.5px;
1405
+ flex-shrink: 0;
1406
+ margin-right: 8px;
1407
+ }
1089
1408
 
1090
- .console-filter-input {
1091
- background-color: var(--profiler-bg);
1092
- border: 1px solid var(--profiler-border);
1093
- color: var(--text-primary);
1094
- border-radius: 4px;
1095
- padding: 4px 8px;
1096
- font-family: var(--font-mono);
1097
- flex-grow: 1;
1098
- max-width: 300px;
1099
- border-radius: 15px;
1100
- }
1409
+ .param-control {
1410
+ display: flex;
1411
+ align-items: center;
1412
+ justify-content: flex-end;
1413
+ gap: 10px;
1414
+ width: 100%;
1415
+ }
1101
1416
 
1102
- .console-filter-input:focus {
1103
- outline: none;
1104
- border-color: var(--text-secondary);
1105
- }
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
+ }
1106
1430
 
1107
- .console-copy-button {
1108
- background: transparent;
1109
- border: none;
1110
- color: var(--text-secondary);
1111
- cursor: pointer;
1112
- padding: 4px;
1113
- display: flex;
1114
- align-items: center;
1115
- justify-content: center;
1116
- border-radius: 4px;
1117
- transition: color 0.2s, background-color 0.2s;
1118
- }
1431
+ .param-control input:focus {
1432
+ outline: none;
1433
+ border-color: var(--color-accent);
1434
+ }
1119
1435
 
1120
- .console-copy-button:hover {
1121
- color: var(--text-primary);
1122
- background-color: var(--profiler-hover);
1123
- }
1436
+ .param-control select {
1437
+ padding-top: 3px;
1438
+ padding-bottom: 1px;
1439
+ }
1124
1440
 
1125
- .console-copy-button.copied {
1126
- color: var(--color-green);
1127
- }
1441
+ .param-control input[type="number"] {
1442
+ cursor: ns-resize;
1443
+ }
1128
1444
 
1129
- #console-log {
1130
- display: flex;
1131
- flex-direction: column;
1132
- gap: 4px;
1133
- padding: 10px;
1134
- overflow-y: auto;
1135
- flex-grow: 1;
1136
- user-select: text;
1137
- -webkit-user-select: text;
1138
- }
1445
+ .param-control input[type="color"] {
1446
+ padding: 2px;
1447
+ }
1139
1448
 
1140
- .log-message {
1141
- padding: 2px 5px;
1142
- white-space: pre-wrap;
1143
- word-break: break-all;
1144
- border-radius: 3px;
1145
- line-height: 1.5 !important;
1146
- }
1449
+ .param-control button {
1450
+ cursor: pointer;
1451
+ transition: background-color 0.2s;
1452
+ }
1147
1453
 
1148
- .log-message.hidden {
1149
- display: none;
1150
- }
1454
+ .param-control button:hover {
1455
+ background-color: var(--profiler-header);
1456
+ }
1151
1457
 
1152
- .log-message.info {
1153
- color: var(--text-primary);
1154
- }
1458
+ .param-control-vector {
1459
+ display: flex;
1460
+ gap: 5px;
1461
+ }
1155
1462
 
1156
- .log-message.warn {
1157
- color: var(--color-yellow);
1158
- }
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
+ }
1159
1471
 
1160
- .log-message.error {
1161
- color: #f9dedc;
1162
- background-color: rgba(244, 67, 54, 0.1);
1163
- }
1472
+ .custom-checkbox input {
1473
+ display: none;
1474
+ }
1164
1475
 
1165
- .log-prefix {
1166
- color: var(--text-secondary);
1167
- margin-right: 8px;
1168
- }
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
+ }
1169
1486
 
1170
- .log-code {
1171
- background-color: rgba(255, 255, 255, 0.1);
1172
- border-radius: 3px;
1173
- padding: 1px 4px;
1174
- }
1487
+ .custom-checkbox .checkbox-text {
1488
+ font-size: 12px;
1489
+ margin-top: 1px;
1490
+ color: inherit;
1491
+ }
1175
1492
 
1176
- .thumbnail-container {
1177
- display: flex;
1178
- align-items: center;
1179
- }
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
+ }
1180
1503
 
1181
- .thumbnail-svg {
1182
- width: 40px;
1183
- height: 22.5px;
1184
- flex-shrink: 0;
1185
- margin-right: 8px;
1186
- }
1504
+ .list-container .custom-checkbox .checkmark {
1505
+ width: 13px;
1506
+ height: 13px;
1507
+ }
1187
1508
 
1188
- .param-control {
1189
- display: flex;
1190
- align-items: center;
1191
- justify-content: flex-end;
1192
- gap: 10px;
1193
- width: 100%;
1194
- }
1509
+ .list-container .custom-checkbox .checkmark::after {
1510
+ width: 7px;
1511
+ height: 7px;
1512
+ }
1195
1513
 
1196
- .param-control input,
1197
- .param-control select,
1198
- .param-control button {
1199
- background-color: var(--profiler-bg);
1200
- border: 1px solid var(--profiler-border);
1201
- color: var(--text-primary);
1202
- border-radius: 4px;
1203
- padding: 4px 6px;
1204
- padding-bottom: 2px;
1205
- font-family: var(--font-mono);
1206
- width: 100%;
1207
- box-sizing: border-box;
1208
- }
1514
+ .custom-checkbox input:checked+.checkmark {
1515
+ border-color: var(--color-accent);
1516
+ }
1209
1517
 
1210
- .param-control input:focus {
1211
- outline: none;
1212
- border-color: var(--accent-color);
1213
- }
1518
+ .custom-checkbox input:checked+.checkmark::after {
1519
+ transform: scale(1);
1520
+ }
1214
1521
 
1215
- .param-control select {
1216
- padding-top: 3px;
1217
- padding-bottom: 1px;
1218
- }
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
+ }
1219
1534
 
1220
- .param-control input[type="number"] {
1221
- cursor: ns-resize;
1222
- }
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
+ }
1223
1546
 
1224
- .param-control input[type="color"] {
1225
- padding: 2px;
1226
- }
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
+ }
1227
1555
 
1228
- .param-control button {
1229
- cursor: pointer;
1230
- transition: background-color 0.2s;
1231
- }
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
+ }
1232
1563
 
1233
- .param-control button:hover {
1234
- background-color: var(--profiler-header);
1235
- }
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
+ }
1236
1573
 
1237
- .param-control-vector {
1238
- display: flex;
1239
- gap: 5px;
1240
- }
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
+ }
1241
1580
 
1242
- .custom-checkbox {
1243
- display: inline-flex;
1244
- align-items: center;
1245
- cursor: pointer;
1246
- gap: 8px;
1247
- will-change: transform;
1248
- }
1581
+ .mini-panel-content .param-control select {
1582
+ padding: 2px 2px;
1583
+ padding-top: 3px;
1584
+ }
1249
1585
 
1250
- .custom-checkbox input {
1251
- display: none;
1252
- }
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
+ }
1253
1591
 
1254
- .custom-checkbox .checkmark {
1255
- width: 14px;
1256
- height: 14px;
1257
- border: 1px solid var(--accent-color);
1258
- border-radius: 3px;
1259
- display: inline-flex;
1260
- justify-content: center;
1261
- align-items: center;
1262
- transition: background-color 0.2s, border-color 0.2s;
1263
- }
1592
+ .mini-panel-content .param-control input[type="number"] {
1593
+ -moz-appearance: textfield;
1594
+ }
1264
1595
 
1265
- .custom-checkbox .checkmark::after {
1266
- content: '';
1267
- width: 6px;
1268
- height: 6px;
1269
- background-color: var(--accent-color);
1270
- border-radius: 1px;
1271
- display: block;
1272
- transform: scale(0);
1273
- transition: transform 0.2s;
1274
- }
1596
+ .mini-panel-content .list-item-cell span {
1597
+ position: relative;
1598
+ top: 1px;
1599
+ margin-left: 2px;
1600
+ }
1275
1601
 
1276
- .custom-checkbox input:checked+.checkmark {
1277
- border-color: var(--accent-color);
1278
- }
1602
+ @media screen and (max-width: 340px) {
1279
1603
 
1280
- .custom-checkbox input:checked+.checkmark::after {
1281
- transform: scale(1);
1282
- }
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
+ }
1283
1611
 
1284
- .param-control input[type="range"] {
1285
- -webkit-appearance: none;
1286
- appearance: none;
1287
- width: 100%;
1288
- height: 16px;
1289
- background: var(--profiler-header);
1290
- border-radius: 5px;
1291
- border: 1px solid var(--profiler-border);
1292
- outline: none;
1293
- padding: 0px;
1294
- padding-top: 8px;
1295
- }
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
+ }
1296
1619
 
1297
- .param-control input[type="range"]::-webkit-slider-thumb {
1298
- -webkit-appearance: none;
1299
- appearance: none;
1300
- width: 18px;
1301
- height: 18px;
1302
- background: var(--profiler-bg);
1303
- border: 1px solid var(--accent-color);
1304
- border-radius: 3px;
1305
- cursor: pointer;
1306
- margin-top: -8px;
1307
- }
1620
+ .mini-panel-content .list-item-cell:first-child .info-icon {
1621
+ flex-shrink: 0;
1622
+ }
1308
1623
 
1309
- .param-control input[type="range"]::-moz-range-thumb {
1310
- width: 18px;
1311
- height: 18px;
1312
- background: var(--profiler-bg);
1313
- border: 2px solid var(--accent-color);
1314
- border-radius: 3px;
1315
- cursor: pointer;
1316
- }
1624
+ }
1317
1625
 
1318
- .param-control input[type="range"]::-moz-range-track {
1319
- width: 100%;
1320
- height: 16px;
1321
- background: var(--profiler-header);
1322
- border-radius: 5px;
1323
- border: 1px solid var(--profiler-border);
1324
- }
1626
+ .mini-panel-content .custom-checkbox .checkmark {
1627
+ width: 12px;
1628
+ height: 12px;
1629
+ margin-bottom: 2px;
1630
+ will-change: transform;
1631
+ }
1325
1632
 
1326
- /* Override .param-control styles for mini-panel-content */
1327
- .mini-panel-content input,
1328
- .mini-panel-content select,
1329
- .mini-panel-content button {
1330
- padding: 2px 4px;
1331
- height: 21px;
1332
- line-height: 1.4;
1333
- padding-top: 4px;
1334
- }
1633
+ .mini-panel-content .list-container.parameters .list-item-row:not(.collapsible) {
1634
+ margin-bottom: 2px;
1635
+ }
1335
1636
 
1336
- .mini-panel-content .param-control input,
1337
- .mini-panel-content .param-control select,
1338
- .mini-panel-content .param-control button {
1339
- background-color: #1e1e24c2;
1340
- line-height: 1.0;
1341
- }
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
+ }
1342
1640
 
1343
- .mini-panel-content .param-control select {
1344
- padding: 2px 2px;
1345
- padding-top: 3px;
1346
- }
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
+ }
1347
1644
 
1348
- .mini-panel-content .param-control input[type="number"]::-webkit-outer-spin-button,
1349
- .mini-panel-content .param-control input[type="number"]::-webkit-inner-spin-button {
1350
- -webkit-appearance: none;
1351
- margin: 0;
1352
- }
1645
+ @media screen and (max-width: 450px) and (orientation: portrait) {
1353
1646
 
1354
- .mini-panel-content .param-control input[type="number"] {
1355
- -moz-appearance: textfield;
1356
- }
1647
+ .console-filter-input {
1648
+ max-width: 100px;
1649
+ }
1357
1650
 
1358
- .mini-panel-content .list-item-cell span {
1359
- position: relative;
1360
- top: 1px;
1361
- margin-left: 2px;
1362
- }
1651
+ }
1363
1652
 
1364
- .mini-panel-content .custom-checkbox .checkmark {
1365
- width: 12px;
1366
- height: 12px;
1367
- margin-bottom: 2px;
1368
- will-change: transform;
1369
- }
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
+ }
1370
1688
 
1371
- .mini-panel-content .list-container.parameters .list-item-row:not(.collapsible) {
1372
- margin-bottom: 2px;
1373
- }
1689
+ }
1374
1690
 
1375
- @media screen and (max-width: 450px) and (orientation: portrait) {
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
+ }
1376
1699
 
1377
- .console-filter-input {
1378
- max-width: 100px;
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;
1379
1719
  }
1380
1720
 
1381
- }
1382
1721
 
1383
- /* Touch device optimizations */
1384
- @media (hover: none) and (pointer: coarse) {
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
+ }
1385
1741
 
1386
- .panel-resizer {
1387
- top: -10px !important;
1388
- height: 20px !important;
1742
+ .detached-tab-header:active {
1743
+ cursor: grabbing;
1389
1744
  }
1390
1745
 
1391
- #profiler-panel.position-top .panel-resizer {
1392
- top: auto !important;
1393
- bottom: -10px !important;
1394
- height: 20px !important;
1746
+ .detached-header-controls {
1747
+ display: flex;
1748
+ gap: 5px;
1395
1749
  }
1396
1750
 
1397
- #profiler-panel.position-left .panel-resizer {
1398
- right: -10px !important;
1399
- width: 20px !important;
1400
- height: 100% !important;
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;
1401
1767
  }
1402
1768
 
1403
- #profiler-panel.position-right .panel-resizer {
1404
- left: -10px !important;
1405
- width: 20px !important;
1406
- height: 100% !important;
1769
+ .detached-reattach-btn:hover {
1770
+ background: rgba(0, 170, 255, 0.2);
1771
+ color: var(--color-accent);
1407
1772
  }
1408
1773
 
1409
- .detached-tab-resizer-top,
1410
- .detached-tab-resizer-bottom {
1411
- height: 10px !important;
1774
+ .detached-tab-content {
1775
+ flex: 1;
1776
+ overflow: hidden;
1777
+ position: relative;
1778
+ background: var(--profiler-background);
1412
1779
  }
1413
1780
 
1414
- .detached-tab-resizer-left,
1415
- .detached-tab-resizer-right {
1416
- width: 10px !important;
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;
1417
1789
  }
1418
1790
 
1419
- }
1791
+ .detached-tab-content .profiler-content > * {
1792
+ font-family: var(--font-mono);
1793
+ color: var(--text-primary);
1794
+ }
1420
1795
 
1421
- .drag-preview-indicator {
1422
- position: fixed;
1423
- background-color: rgba(0, 170, 255, 0.2);
1424
- border: 2px dashed var(--accent-color);
1425
- z-index: 999;
1426
- pointer-events: none;
1427
- transition: all 0.2s ease-out;
1428
- }
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
+ }
1429
1806
 
1430
- /* Detached Tab Windows */
1431
- .detached-tab-panel {
1432
- position: fixed;
1433
- width: 500px;
1434
- height: 400px;
1435
- background: var(--profiler-bg);
1436
- border: 1px solid var(--profiler-border);
1437
- border-radius: 8px;
1438
- box-shadow: 0 10px 40px rgba(0, 0, 0, 0.5);
1439
- z-index: 1002;
1440
- display: flex;
1441
- flex-direction: column;
1442
- backdrop-filter: blur(10px);
1443
- overflow: hidden;
1444
- opacity: 1;
1445
- visibility: visible;
1446
- transition: opacity 0.2s, visibility 0.2s;
1447
- }
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
+ }
1448
1819
 
1449
- #profiler-panel:not(.visible) ~ * .detached-tab-panel,
1450
- body:has(#profiler-panel:not(.visible)) .detached-tab-panel {
1451
- opacity: 0;
1452
- visibility: hidden;
1453
- pointer-events: none;
1454
- }
1820
+ .detached-tab-resizer:hover::after {
1821
+ opacity: 1;
1822
+ border-color: var(--color-accent);
1823
+ }
1455
1824
 
1456
- .detached-tab-header {
1457
- background: var(--profiler-header-bg);
1458
- padding: 0 7px 0 15px;
1459
- font-family: var(--font-family);
1460
- font-size: 14px;
1461
- color: var(--text-primary);
1462
- font-weight: 600;
1463
- display: flex;
1464
- justify-content: space-between;
1465
- align-items: center;
1466
- border-bottom: 1px solid var(--profiler-border);
1467
- cursor: grab;
1468
- user-select: none;
1469
- height: 38px;
1470
- flex-shrink: 0;
1471
- -webkit-font-smoothing: antialiased;
1472
- -moz-osx-font-smoothing: grayscale;
1473
- touch-action: none;
1474
- }
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
+ }
1475
1836
 
1476
- .detached-tab-header:active {
1477
- cursor: grabbing;
1478
- }
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
+ }
1479
1847
 
1480
- .detached-header-controls {
1481
- display: flex;
1482
- gap: 5px;
1483
- }
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
+ }
1484
1858
 
1485
- .detached-reattach-btn {
1486
- background: transparent;
1487
- border: none;
1488
- color: var(--text-secondary);
1489
- font-family: var(--font-family);
1490
- font-size: 18px;
1491
- line-height: 1;
1492
- cursor: pointer;
1493
- padding: 4px 8px;
1494
- border-radius: 4px;
1495
- transition: all 0.2s;
1496
- display: flex;
1497
- align-items: center;
1498
- justify-content: center;
1499
- -webkit-font-smoothing: antialiased;
1500
- -moz-osx-font-smoothing: grayscale;
1501
- }
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
+ }
1502
1869
 
1503
- .detached-reattach-btn:hover {
1504
- background: rgba(0, 170, 255, 0.2);
1505
- color: var(--accent-color);
1506
- }
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
+ }
1507
1879
 
1508
- .detached-tab-content {
1509
- flex: 1;
1510
- overflow: auto;
1511
- position: relative;
1512
- background: var(--profiler-bg);
1513
- }
1880
+ /* Firefox */
1881
+ .profiler-panel input[type="number"],
1882
+ .detached-tab-content input[type="number"] {
1883
+ -moz-appearance: textfield;
1884
+ }
1514
1885
 
1515
- .detached-tab-content::-webkit-scrollbar {
1516
- width: 8px;
1517
- height: 8px;
1518
- }
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
+ }
1519
1900
 
1520
- .detached-tab-content::-webkit-scrollbar-track {
1521
- background: transparent;
1522
- }
1901
+ .panel-action-btn:hover {
1902
+ background-color: rgba(255, 255, 255, 0.05);
1903
+ }
1523
1904
 
1524
- .detached-tab-content::-webkit-scrollbar-thumb {
1525
- background-color: rgba(0, 0, 0, 0.25);
1526
- border-radius: 10px;
1527
- transition: background 0.3s ease;
1528
- }
1905
+ .node-canvas-wrapper {
1906
+ touch-action: none;
1907
+ }
1529
1908
 
1530
- .detached-tab-content::-webkit-scrollbar-thumb:hover {
1531
- background-color: rgba(0, 0, 0, 0.4);
1532
- }
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
+ }
1533
1926
 
1534
- .detached-tab-content::-webkit-scrollbar-corner {
1535
- background: transparent;
1536
- }
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
+ }
1537
1932
 
1538
- .detached-tab-content .profiler-content {
1539
- display: block !important;
1540
- height: 100%;
1541
- visibility: visible !important;
1542
- opacity: 1 !important;
1543
- position: relative !important;
1544
- }
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
+ }
1545
1950
 
1546
- .detached-tab-content .profiler-content > * {
1547
- font-family: var(--font-mono);
1548
- color: var(--text-primary);
1549
- }
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
+ }
1550
1956
 
1551
- .detached-tab-resizer {
1552
- position: absolute;
1553
- bottom: 0;
1554
- right: 0;
1555
- width: 20px;
1556
- height: 20px;
1557
- cursor: nwse-resize;
1558
- z-index: 10;
1559
- touch-action: none;
1560
- }
1957
+ .profiler-panel.maximized .node-canvas-fullscreen-btn {
1958
+ display: none;
1959
+ }
1561
1960
 
1562
- .detached-tab-resizer::after {
1563
- content: '';
1564
- position: absolute;
1565
- bottom: 2px;
1566
- right: 2px;
1567
- width: 12px;
1568
- height: 12px;
1569
- border-right: 2px solid var(--profiler-border);
1570
- border-bottom: 2px solid var(--profiler-border);
1571
- border-bottom-right-radius: 6px;
1572
- opacity: 0.5;
1573
- }
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
+ }
1574
1973
 
1575
- .detached-tab-resizer:hover::after {
1576
- opacity: 1;
1577
- border-color: var(--accent-color);
1578
- }
1974
+ .toolbar span {
1975
+ color: var(--text-secondary);
1976
+ font-size: 12px;
1977
+ font-weight: 600;
1978
+ }
1579
1979
 
1580
- /* Edge resizers */
1581
- .detached-tab-resizer-top {
1582
- position: absolute;
1583
- top: 0;
1584
- left: 0;
1585
- right: 0;
1586
- height: 5px;
1587
- cursor: ns-resize;
1588
- z-index: 10;
1589
- touch-action: none;
1590
- }
1980
+ .toolbar .custom-checkbox .checkmark {
1981
+ width: 12px;
1982
+ height: 12px;
1983
+ border-radius: 4px;
1984
+ }
1591
1985
 
1592
- .detached-tab-resizer-right {
1593
- position: absolute;
1594
- top: 0;
1595
- right: 0;
1596
- bottom: 0;
1597
- width: 5px;
1598
- cursor: ew-resize;
1599
- z-index: 10;
1600
- touch-action: none;
1601
- }
1986
+ .viewer-content .toolbar {
1987
+ justify-content: flex-end;
1988
+ }
1602
1989
 
1603
- .detached-tab-resizer-bottom {
1604
- position: absolute;
1605
- bottom: 0;
1606
- left: 0;
1607
- right: 0;
1608
- height: 5px;
1609
- cursor: ns-resize;
1610
- z-index: 10;
1611
- touch-action: none;
1612
- }
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
+ }
1613
2005
 
1614
- .detached-tab-resizer-left {
1615
- position: absolute;
1616
- top: 0;
1617
- left: 0;
1618
- bottom: 0;
1619
- width: 5px;
1620
- cursor: ew-resize;
1621
- z-index: 10;
1622
- touch-action: none;
1623
- }
2006
+ .viewer-back-btn:hover {
2007
+ color: var(--text-primary);
2008
+ background-color: rgba(255, 255, 255, 0.05);
2009
+ }
1624
2010
 
1625
- /* Input number spin buttons - hide arrows */
1626
- /* Chrome, Safari, Edge, Opera */
1627
- #profiler-panel input[type="number"]::-webkit-outer-spin-button,
1628
- #profiler-panel input[type="number"]::-webkit-inner-spin-button,
1629
- .detached-tab-content input[type="number"]::-webkit-outer-spin-button,
1630
- .detached-tab-content input[type="number"]::-webkit-inner-spin-button {
1631
- -webkit-appearance: none;
1632
- margin: 0;
1633
- }
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
+ }
1634
2029
 
1635
- /* Firefox */
1636
- #profiler-panel input[type="number"],
1637
- .detached-tab-content input[type="number"] {
1638
- -moz-appearance: textfield;
1639
- }
2030
+ .select:focus {
2031
+ border-color: var(--color-accent);
2032
+ }
1640
2033
 
1641
- .panel-action-btn {
1642
- background: transparent;
1643
- color: var(--text-primary);
1644
- border: 1px solid var(--profiler-border);
1645
- border-radius: 4px;
1646
- padding: 6px 12px;
1647
- cursor: pointer;
1648
- font-family: var(--font-family);
1649
- font-size: 12px;
1650
- transition: background-color 0.2s;
1651
- display: flex;
1652
- align-items: center;
1653
- justify-content: center;
1654
- }
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;
2042
+ }
1655
2043
 
1656
- .panel-action-btn:hover {
1657
- background-color: rgba(255, 255, 255, 0.05);
1658
2044
  }
1659
2045
  `;
2046
+
1660
2047
  const styleElement = document.createElement( 'style' );
1661
- styleElement.id = 'profiler-styles';
1662
2048
  styleElement.textContent = css;
1663
- document.head.appendChild( styleElement );
2049
+
2050
+ container.appendChild( styleElement );
1664
2051
 
1665
2052
  }
1666
2053