super-three 0.136.0 → 0.141.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 (768) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +24 -26
  3. package/build/three.cjs +35889 -0
  4. package/build/three.js +4837 -6036
  5. package/build/three.min.js +2 -2
  6. package/build/three.module.js +16548 -17930
  7. package/examples/js/animation/CCDIKSolver.js +3 -2
  8. package/examples/js/animation/MMDAnimationHelper.js +3 -1
  9. package/examples/js/animation/MMDPhysics.js +3 -3
  10. package/examples/js/cameras/CinematicCamera.js +2 -7
  11. package/examples/js/controls/ArcballControls.js +3 -1
  12. package/examples/js/controls/PointerLockControls.js +3 -2
  13. package/examples/js/controls/TrackballControls.js +1 -4
  14. package/examples/js/controls/TransformControls.js +5 -6
  15. package/examples/js/controls/experimental/CameraControls.js +8 -4
  16. package/examples/js/csm/CSMFrustum.js +1 -1
  17. package/examples/js/csm/CSMShader.js +51 -35
  18. package/examples/js/curves/CurveExtras.js +14 -18
  19. package/examples/js/effects/AnaglyphEffect.js +7 -4
  20. package/examples/js/effects/AsciiEffect.js +10 -29
  21. package/examples/js/exporters/ColladaExporter.js +29 -7
  22. package/examples/js/exporters/EXRExporter.js +458 -0
  23. package/examples/js/exporters/GLTFExporter.js +233 -105
  24. package/examples/js/exporters/MMDExporter.js +1 -1
  25. package/examples/js/exporters/OBJExporter.js +12 -18
  26. package/examples/js/exporters/PLYExporter.js +15 -20
  27. package/examples/js/exporters/USDZExporter.js +13 -0
  28. package/examples/js/geometries/ConvexGeometry.js +1 -1
  29. package/examples/js/geometries/DecalGeometry.js +0 -7
  30. package/examples/js/geometries/LightningStrike.js +2 -2
  31. package/examples/js/geometries/ParametricGeometries.js +3 -3
  32. package/examples/js/geometries/TextGeometry.js +12 -10
  33. package/examples/js/helpers/OctreeHelper.js +74 -0
  34. package/examples/js/helpers/VertexNormalsHelper.js +4 -23
  35. package/examples/js/helpers/VertexTangentsHelper.js +3 -13
  36. package/examples/js/helpers/ViewHelper.js +266 -0
  37. package/examples/js/interactive/HTMLMesh.js +249 -42
  38. package/examples/js/interactive/SelectionHelper.js +1 -1
  39. package/examples/js/libs/opentype.min.js +1 -118
  40. package/examples/js/lines/Line2.js +1 -2
  41. package/examples/js/lines/LineGeometry.js +10 -21
  42. package/examples/js/lines/LineMaterial.js +2 -3
  43. package/examples/js/lines/LineSegments2.js +214 -140
  44. package/examples/js/lines/LineSegmentsGeometry.js +3 -14
  45. package/examples/js/lines/Wireframe.js +2 -3
  46. package/examples/js/lines/WireframeGeometry2.js +1 -2
  47. package/examples/js/loaders/3MFLoader.js +21 -17
  48. package/examples/js/loaders/AMFLoader.js +1 -1
  49. package/examples/js/loaders/BasisTextureLoader.js +1 -0
  50. package/examples/js/loaders/ColladaLoader.js +33 -12
  51. package/examples/js/loaders/DDSLoader.js +23 -30
  52. package/examples/js/loaders/EXRLoader.js +314 -294
  53. package/examples/js/loaders/FBXLoader.js +11 -0
  54. package/examples/js/loaders/FontLoader.js +1 -2
  55. package/examples/js/loaders/GCodeLoader.js +0 -1
  56. package/examples/js/loaders/GLTFLoader.js +250 -61
  57. package/examples/js/loaders/HDRCubeTextureLoader.js +0 -2
  58. package/examples/js/loaders/KMZLoader.js +1 -1
  59. package/examples/js/loaders/KTX2Loader.js +1 -9
  60. package/examples/js/loaders/LDrawLoader.js +1342 -962
  61. package/examples/js/loaders/LUT3dlLoader.js +18 -11
  62. package/examples/js/loaders/LUTCubeLoader.js +4 -5
  63. package/examples/js/loaders/LWOLoader.js +4 -2
  64. package/examples/js/loaders/LogLuvLoader.js +1 -2
  65. package/examples/js/loaders/MD2Loader.js +5 -5
  66. package/examples/js/loaders/MMDLoader.js +18 -4
  67. package/examples/js/loaders/MTLLoader.js +10 -3
  68. package/examples/js/loaders/NRRDLoader.js +1 -1
  69. package/examples/js/loaders/OBJLoader.js +9 -5
  70. package/examples/js/loaders/PCDLoader.js +24 -15
  71. package/examples/js/loaders/PDBLoader.js +11 -11
  72. package/examples/js/loaders/PLYLoader.js +5 -1
  73. package/examples/js/loaders/RGBELoader.js +9 -17
  74. package/examples/js/loaders/RGBMLoader.js +13 -16
  75. package/examples/js/loaders/STLLoader.js +1 -1
  76. package/examples/js/loaders/SVGLoader.js +21 -11
  77. package/examples/js/loaders/VOXLoader.js +3 -4
  78. package/examples/js/loaders/VRMLLoader.js +9 -21
  79. package/examples/js/loaders/VTKLoader.js +260 -295
  80. package/examples/js/loaders/lwo/LWO2Parser.js +4 -4
  81. package/examples/js/loaders/lwo/LWO3Parser.js +4 -4
  82. package/examples/js/math/ConvexHull.js +13 -28
  83. package/examples/js/math/Lut.js +27 -26
  84. package/examples/js/misc/MorphAnimMesh.js +2 -2
  85. package/examples/js/misc/ProgressiveLightMap.js +1 -1
  86. package/examples/js/misc/Volume.js +39 -48
  87. package/examples/js/misc/VolumeSlice.js +21 -21
  88. package/examples/js/modifiers/CurveModifier.js +8 -7
  89. package/examples/js/modifiers/EdgeSplitModifier.js +0 -13
  90. package/examples/js/modifiers/SimplifyModifier.js +1 -18
  91. package/examples/js/modifiers/TessellateModifier.js +0 -7
  92. package/examples/js/objects/Lensflare.js +4 -4
  93. package/examples/js/objects/LightningStorm.js +4 -5
  94. package/examples/js/objects/MarchingCubes.js +6 -11
  95. package/examples/js/objects/Reflector.js +10 -16
  96. package/examples/js/objects/ReflectorForSSRPass.js +1 -11
  97. package/examples/js/objects/Refractor.js +10 -16
  98. package/examples/js/objects/ShadowMesh.js +1 -2
  99. package/examples/js/objects/Sky.js +1 -1
  100. package/examples/js/objects/Water.js +2 -15
  101. package/examples/js/objects/Water2.js +1 -1
  102. package/examples/js/postprocessing/AdaptiveToneMappingPass.js +6 -10
  103. package/examples/js/postprocessing/AfterimagePass.js +2 -6
  104. package/examples/js/postprocessing/BloomPass.js +50 -19
  105. package/examples/js/postprocessing/DotScreenPass.js +1 -1
  106. package/examples/js/postprocessing/EffectComposer.js +1 -6
  107. package/examples/js/postprocessing/GlitchPass.js +4 -5
  108. package/examples/js/postprocessing/LUTPass.js +2 -2
  109. package/examples/js/postprocessing/OutlinePass.js +8 -17
  110. package/examples/js/postprocessing/SAOPass.js +2 -7
  111. package/examples/js/postprocessing/SMAAPass.js +2 -9
  112. package/examples/js/postprocessing/SSAARenderPass.js +1 -6
  113. package/examples/js/postprocessing/SSAOPass.js +9 -21
  114. package/examples/js/postprocessing/SSRPass.js +3 -8
  115. package/examples/js/postprocessing/SavePass.js +1 -5
  116. package/examples/js/postprocessing/TAARenderPass.js +4 -4
  117. package/examples/js/postprocessing/UnrealBloomPass.js +3 -12
  118. package/examples/js/renderers/CSS2DRenderer.js +20 -19
  119. package/examples/js/renderers/CSS3DRenderer.js +40 -36
  120. package/examples/js/renderers/Projector.js +97 -124
  121. package/examples/js/renderers/SVGRenderer.js +3 -4
  122. package/examples/js/shaders/BlendShader.js +2 -1
  123. package/examples/js/shaders/CopyShader.js +4 -3
  124. package/examples/js/shaders/DigitalGlitch.js +3 -3
  125. package/examples/js/shaders/FXAAShader.js +239 -1069
  126. package/examples/js/shaders/FreiChenShader.js +1 -1
  127. package/examples/js/shaders/HorizontalBlurShader.js +1 -1
  128. package/examples/js/shaders/HorizontalTiltShiftShader.js +1 -1
  129. package/examples/js/shaders/MMDToonShader.js +0 -1
  130. package/examples/js/shaders/SSAOShader.js +1 -1
  131. package/examples/js/shaders/SSRShader.js +3 -3
  132. package/examples/js/shaders/ToneMapShader.js +1 -1
  133. package/examples/js/utils/BufferGeometryUtils.js +282 -22
  134. package/examples/js/utils/GPUStatsPanel.js +1 -1
  135. package/examples/js/utils/LDrawUtils.js +182 -0
  136. package/examples/js/utils/SceneUtils.js +59 -0
  137. package/examples/js/utils/SkeletonUtils.js +1 -1
  138. package/examples/js/utils/UVsDebug.js +23 -33
  139. package/examples/jsm/animation/CCDIKSolver.js +3 -9
  140. package/examples/jsm/animation/MMDPhysics.js +2 -2
  141. package/examples/jsm/cameras/CinematicCamera.js +2 -5
  142. package/examples/jsm/{WebGL.js → capabilities/WebGL.js} +2 -2
  143. package/examples/jsm/{renderers/webgpu → capabilities}/WebGPU.js +7 -1
  144. package/examples/jsm/controls/ArcballControls.js +3 -1
  145. package/examples/jsm/controls/PointerLockControls.js +4 -2
  146. package/examples/jsm/controls/TrackballControls.js +1 -4
  147. package/examples/jsm/controls/TransformControls.js +6 -6
  148. package/examples/jsm/controls/experimental/CameraControls.js +2 -2
  149. package/examples/jsm/csm/CSMFrustum.js +1 -1
  150. package/examples/jsm/csm/CSMShader.js +51 -35
  151. package/examples/jsm/curves/CurveExtras.js +15 -17
  152. package/examples/jsm/effects/AnaglyphEffect.js +4 -4
  153. package/examples/jsm/effects/AsciiEffect.js +9 -22
  154. package/examples/jsm/exporters/ColladaExporter.js +31 -6
  155. package/examples/jsm/exporters/EXRExporter.js +507 -0
  156. package/examples/jsm/exporters/GLTFExporter.js +261 -103
  157. package/examples/jsm/exporters/KTX2Exporter.js +281 -0
  158. package/examples/jsm/exporters/MMDExporter.js +1 -1
  159. package/examples/jsm/exporters/OBJExporter.js +11 -18
  160. package/examples/jsm/exporters/PLYExporter.js +23 -21
  161. package/examples/jsm/exporters/USDZExporter.js +12 -0
  162. package/examples/jsm/geometries/ConvexGeometry.js +1 -1
  163. package/examples/jsm/geometries/DecalGeometry.js +0 -7
  164. package/examples/jsm/geometries/LightningStrike.js +2 -2
  165. package/examples/jsm/geometries/ParametricGeometries.js +3 -3
  166. package/examples/jsm/geometries/TextGeometry.js +13 -13
  167. package/examples/jsm/helpers/OctreeHelper.js +58 -0
  168. package/examples/jsm/helpers/VertexNormalsHelper.js +4 -25
  169. package/examples/jsm/helpers/VertexTangentsHelper.js +3 -15
  170. package/examples/jsm/helpers/ViewHelper.js +295 -0
  171. package/examples/jsm/interactive/HTMLMesh.js +268 -36
  172. package/examples/jsm/interactive/SelectionHelper.js +1 -1
  173. package/examples/jsm/libs/flow.module.js +947 -183
  174. package/examples/jsm/libs/ktx-parse.module.js +1 -1
  175. package/examples/jsm/libs/lil-gui.module.min.js +2 -2
  176. package/examples/jsm/libs/mikktspace.module.js +128 -0
  177. package/examples/jsm/libs/opentype.module.js +14568 -0
  178. package/examples/jsm/lines/Line2.js +2 -2
  179. package/examples/jsm/lines/LineGeometry.js +11 -19
  180. package/examples/jsm/lines/LineMaterial.js +3 -3
  181. package/examples/jsm/lines/LineSegments2.js +210 -145
  182. package/examples/jsm/lines/LineSegmentsGeometry.js +3 -12
  183. package/examples/jsm/lines/Wireframe.js +3 -3
  184. package/examples/jsm/lines/WireframeGeometry2.js +2 -2
  185. package/examples/jsm/loaders/3DMLoader.js +3 -2
  186. package/examples/jsm/loaders/3MFLoader.js +21 -17
  187. package/examples/jsm/loaders/AMFLoader.js +1 -1
  188. package/examples/jsm/loaders/BasisTextureLoader.js +7 -0
  189. package/examples/jsm/loaders/ColladaLoader.js +40 -12
  190. package/examples/jsm/loaders/DDSLoader.js +21 -28
  191. package/examples/jsm/loaders/EXRLoader.js +309 -293
  192. package/examples/jsm/loaders/FBXLoader.js +11 -0
  193. package/examples/jsm/loaders/FontLoader.js +2 -2
  194. package/examples/jsm/loaders/GCodeLoader.js +0 -1
  195. package/examples/jsm/loaders/GLTFLoader.js +263 -68
  196. package/examples/jsm/loaders/HDRCubeTextureLoader.js +1 -4
  197. package/examples/jsm/loaders/KMZLoader.js +1 -1
  198. package/examples/jsm/loaders/KTX2Loader.js +1 -10
  199. package/examples/jsm/loaders/LDrawLoader.js +1335 -988
  200. package/examples/jsm/loaders/LUT3dlLoader.js +19 -14
  201. package/examples/jsm/loaders/LUTCubeLoader.js +5 -7
  202. package/examples/jsm/loaders/LWOLoader.js +5 -3
  203. package/examples/jsm/loaders/LogLuvLoader.js +2 -2
  204. package/examples/jsm/loaders/MD2Loader.js +5 -5
  205. package/examples/jsm/loaders/MMDLoader.js +21 -3
  206. package/examples/jsm/loaders/MTLLoader.js +11 -4
  207. package/examples/jsm/loaders/NRRDLoader.js +1 -2
  208. package/examples/jsm/loaders/OBJLoader.js +11 -7
  209. package/examples/jsm/loaders/PCDLoader.js +25 -17
  210. package/examples/jsm/loaders/PDBLoader.js +11 -11
  211. package/examples/jsm/loaders/PLYLoader.js +10 -2
  212. package/examples/jsm/loaders/RGBELoader.js +11 -20
  213. package/examples/jsm/loaders/RGBMLoader.js +15 -12
  214. package/examples/jsm/loaders/STLLoader.js +1 -1
  215. package/examples/jsm/loaders/SVGLoader.js +26 -11
  216. package/examples/jsm/loaders/TTFLoader.js +1 -1
  217. package/examples/jsm/loaders/VOXLoader.js +5 -5
  218. package/examples/jsm/loaders/VRMLLoader.js +9 -23
  219. package/examples/jsm/loaders/VTKLoader.js +256 -284
  220. package/examples/jsm/loaders/ifc/web-ifc-api.js +9 -8
  221. package/examples/jsm/loaders/lwo/LWO2Parser.js +4 -4
  222. package/examples/jsm/loaders/lwo/LWO3Parser.js +4 -4
  223. package/examples/jsm/math/ConvexHull.js +13 -28
  224. package/examples/jsm/math/Lut.js +35 -25
  225. package/examples/jsm/misc/MorphAnimMesh.js +2 -2
  226. package/examples/jsm/misc/ProgressiveLightMap.js +1 -1
  227. package/examples/jsm/misc/Volume.js +39 -46
  228. package/examples/jsm/misc/VolumeSlice.js +21 -21
  229. package/examples/jsm/modifiers/CurveModifier.js +9 -8
  230. package/examples/jsm/modifiers/EdgeSplitModifier.js +0 -13
  231. package/examples/jsm/modifiers/SimplifyModifier.js +1 -18
  232. package/examples/jsm/modifiers/TessellateModifier.js +0 -7
  233. package/examples/jsm/node-editor/NodeEditor.js +485 -163
  234. package/examples/jsm/node-editor/accessors/MatcapUVEditor.js +14 -0
  235. package/examples/jsm/node-editor/accessors/NormalEditor.js +9 -9
  236. package/examples/jsm/node-editor/accessors/PositionEditor.js +9 -9
  237. package/examples/jsm/node-editor/accessors/UVEditor.js +7 -8
  238. package/examples/jsm/node-editor/core/BaseNode.js +89 -0
  239. package/examples/jsm/node-editor/core/DataFile.js +59 -0
  240. package/examples/jsm/node-editor/core/FileEditor.js +20 -0
  241. package/examples/jsm/node-editor/core/FileURLEditor.js +29 -0
  242. package/examples/jsm/node-editor/display/BlendEditor.js +10 -9
  243. package/examples/jsm/node-editor/display/NormalMapEditor.js +49 -0
  244. package/examples/jsm/node-editor/examples/animate-uv.json +1 -1
  245. package/examples/jsm/node-editor/examples/fake-top-light.json +1 -1
  246. package/examples/jsm/node-editor/examples/matcap.json +1 -0
  247. package/examples/jsm/node-editor/examples/oscillator-color.json +1 -1
  248. package/examples/jsm/node-editor/examples/rim.json +1 -1
  249. package/examples/jsm/node-editor/inputs/ColorEditor.js +18 -13
  250. package/examples/jsm/node-editor/inputs/FloatEditor.js +8 -9
  251. package/examples/jsm/node-editor/inputs/SliderEditor.js +6 -7
  252. package/examples/jsm/node-editor/inputs/TextureEditor.js +155 -0
  253. package/examples/jsm/node-editor/inputs/Vector2Editor.js +9 -9
  254. package/examples/jsm/node-editor/inputs/Vector3Editor.js +11 -11
  255. package/examples/jsm/node-editor/inputs/Vector4Editor.js +12 -12
  256. package/examples/jsm/node-editor/materials/BasicMaterialEditor.js +87 -0
  257. package/examples/jsm/node-editor/materials/PointsMaterialEditor.js +102 -0
  258. package/examples/jsm/node-editor/materials/StandardMaterialEditor.js +31 -18
  259. package/examples/jsm/node-editor/math/AngleEditor.js +40 -0
  260. package/examples/jsm/node-editor/math/DotEditor.js +8 -9
  261. package/examples/jsm/node-editor/math/InvertEditor.js +8 -7
  262. package/examples/jsm/node-editor/math/LimiterEditor.js +28 -14
  263. package/examples/jsm/node-editor/math/NormalizeEditor.js +9 -7
  264. package/examples/jsm/node-editor/math/OperatorEditor.js +29 -16
  265. package/examples/jsm/node-editor/math/PowerEditor.js +20 -10
  266. package/examples/jsm/node-editor/math/TrigonometryEditor.js +15 -9
  267. package/examples/jsm/node-editor/procedural/CheckerEditor.js +7 -6
  268. package/examples/jsm/node-editor/scene/MeshEditor.js +99 -0
  269. package/examples/jsm/node-editor/scene/Object3DEditor.js +160 -0
  270. package/examples/jsm/node-editor/scene/PointsEditor.js +99 -0
  271. package/examples/jsm/node-editor/utils/JoinEditor.js +58 -0
  272. package/examples/jsm/node-editor/utils/OscillatorEditor.js +9 -8
  273. package/examples/jsm/node-editor/utils/PreviewEditor.js +166 -0
  274. package/examples/jsm/node-editor/utils/SplitEditor.js +39 -0
  275. package/examples/jsm/node-editor/utils/TimerEditor.js +7 -6
  276. package/examples/jsm/nodes/Nodes.js +283 -94
  277. package/examples/jsm/nodes/accessors/BufferNode.js +24 -0
  278. package/examples/jsm/nodes/accessors/CameraNode.js +27 -196
  279. package/examples/jsm/nodes/accessors/CubeTextureNode.js +103 -0
  280. package/examples/jsm/nodes/accessors/InstanceNode.js +58 -0
  281. package/examples/jsm/{renderers/nodes → nodes}/accessors/MaterialNode.js +49 -11
  282. package/examples/jsm/{renderers/nodes → nodes}/accessors/MaterialReferenceNode.js +0 -0
  283. package/examples/jsm/{renderers/nodes → nodes}/accessors/ModelNode.js +8 -0
  284. package/examples/jsm/{renderers/nodes → nodes}/accessors/ModelViewProjectionNode.js +0 -0
  285. package/examples/jsm/nodes/accessors/NormalNode.js +39 -99
  286. package/examples/jsm/{renderers/nodes → nodes}/accessors/Object3DNode.js +34 -17
  287. package/examples/jsm/{renderers/nodes → nodes}/accessors/PointUVNode.js +2 -2
  288. package/examples/jsm/nodes/accessors/PositionNode.js +41 -110
  289. package/examples/jsm/nodes/accessors/ReferenceNode.js +65 -0
  290. package/examples/jsm/nodes/accessors/ReflectNode.js +34 -121
  291. package/examples/jsm/nodes/accessors/SkinningNode.js +102 -0
  292. package/examples/jsm/nodes/accessors/StorageBufferNode.js +21 -0
  293. package/examples/jsm/nodes/accessors/TextureNode.js +100 -0
  294. package/examples/jsm/nodes/accessors/UVNode.js +17 -43
  295. package/examples/jsm/nodes/accessors/UserDataNode.js +23 -0
  296. package/examples/jsm/nodes/core/ArrayUniformNode.js +23 -0
  297. package/examples/jsm/nodes/core/AttributeNode.js +33 -30
  298. package/examples/jsm/{renderers/nodes → nodes}/core/BypassNode.js +2 -2
  299. package/examples/jsm/{renderers/nodes → nodes}/core/CodeNode.js +2 -30
  300. package/examples/jsm/nodes/core/ConstNode.js +10 -106
  301. package/examples/jsm/{renderers/nodes → nodes}/core/ContextNode.js +17 -3
  302. package/examples/jsm/nodes/core/ExpressionNode.js +24 -7
  303. package/examples/jsm/nodes/core/FunctionCallNode.js +26 -67
  304. package/examples/jsm/nodes/core/FunctionNode.js +43 -216
  305. package/examples/jsm/nodes/core/InputNode.js +28 -60
  306. package/examples/jsm/nodes/core/InstanceIndexNode.js +21 -0
  307. package/examples/jsm/nodes/core/Node.js +228 -94
  308. package/examples/jsm/{renderers/nodes → nodes}/core/NodeAttribute.js +2 -2
  309. package/examples/jsm/nodes/core/NodeBuilder.js +388 -560
  310. package/examples/jsm/{renderers/nodes → nodes}/core/NodeCode.js +0 -0
  311. package/examples/jsm/nodes/core/NodeFrame.js +30 -23
  312. package/examples/jsm/{renderers/nodes → nodes}/core/NodeFunction.js +0 -0
  313. package/examples/jsm/{renderers/nodes → nodes}/core/NodeFunctionInput.js +0 -0
  314. package/examples/jsm/{renderers/nodes → nodes}/core/NodeKeywords.js +0 -0
  315. package/examples/jsm/{renderers/nodes → nodes}/core/NodeParser.js +0 -0
  316. package/examples/jsm/nodes/core/NodeUniform.js +8 -6
  317. package/examples/jsm/nodes/core/NodeUtils.js +69 -37
  318. package/examples/jsm/{renderers/nodes → nodes}/core/NodeVar.js +2 -2
  319. package/examples/jsm/{renderers/nodes → nodes}/core/NodeVary.js +2 -2
  320. package/examples/jsm/{renderers/nodes → nodes}/core/PropertyNode.js +0 -0
  321. package/examples/jsm/nodes/core/TempNode.js +20 -112
  322. package/examples/jsm/nodes/core/UniformNode.js +46 -0
  323. package/examples/jsm/nodes/core/VarNode.js +58 -27
  324. package/examples/jsm/{renderers/nodes → nodes}/core/VaryNode.js +0 -0
  325. package/examples/jsm/{renderers/nodes → nodes}/core/constants.js +0 -0
  326. package/examples/jsm/nodes/display/ColorSpaceNode.js +95 -0
  327. package/examples/jsm/nodes/display/FrontFacingNode.js +21 -0
  328. package/examples/jsm/nodes/display/NormalMapNode.js +86 -0
  329. package/examples/jsm/nodes/display/ToneMappingNode.js +51 -0
  330. package/examples/jsm/nodes/fog/FogNode.js +31 -0
  331. package/examples/jsm/nodes/fog/FogRangeNode.js +27 -0
  332. package/examples/jsm/nodes/functions/BSDF/BRDF_GGX.js +33 -0
  333. package/examples/jsm/nodes/functions/BSDF/BRDF_Lambert.js +9 -0
  334. package/examples/jsm/nodes/functions/BSDF/DFGApprox.js +27 -0
  335. package/examples/jsm/nodes/functions/BSDF/D_GGX.js +18 -0
  336. package/examples/jsm/nodes/functions/BSDF/F_Schlick.js +18 -0
  337. package/examples/jsm/nodes/functions/BSDF/V_GGX_SmithCorrelated.js +18 -0
  338. package/examples/jsm/nodes/functions/PhysicalLightingModel.js +94 -0
  339. package/examples/jsm/nodes/functions/light/getDistanceAttenuation.js +22 -0
  340. package/examples/jsm/nodes/functions/material/getGeometryRoughness.js +12 -0
  341. package/examples/jsm/nodes/functions/material/getRoughness.js +18 -0
  342. package/examples/jsm/nodes/gpgpu/ComputeNode.js +63 -0
  343. package/examples/jsm/nodes/lighting/AONode.js +25 -0
  344. package/examples/jsm/nodes/lighting/AnalyticLightNode.js +37 -0
  345. package/examples/jsm/nodes/lighting/EnvironmentNode.js +65 -0
  346. package/examples/jsm/nodes/lighting/HemisphereLightNode.js +50 -0
  347. package/examples/jsm/nodes/lighting/LightingContextNode.js +75 -0
  348. package/examples/jsm/nodes/lighting/LightingNode.js +19 -0
  349. package/examples/jsm/nodes/lighting/LightsNode.js +120 -0
  350. package/examples/jsm/nodes/lighting/PunctualLightNode.js +68 -0
  351. package/examples/jsm/nodes/loaders/NodeLoader.js +107 -0
  352. package/examples/jsm/nodes/loaders/NodeMaterialLoader.js +42 -0
  353. package/examples/jsm/nodes/loaders/NodeObjectLoader.js +70 -0
  354. package/examples/jsm/{renderers/nodes → nodes}/materials/LineBasicNodeMaterial.js +11 -4
  355. package/examples/jsm/nodes/materials/Materials.js +65 -0
  356. package/examples/jsm/{renderers/nodes → nodes}/materials/MeshBasicNodeMaterial.js +13 -4
  357. package/examples/jsm/nodes/materials/MeshStandardNodeMaterial.js +162 -22
  358. package/examples/jsm/nodes/materials/NodeMaterial.js +128 -113
  359. package/examples/jsm/{renderers/nodes → nodes}/materials/PointsNodeMaterial.js +13 -4
  360. package/examples/jsm/nodes/materials/SpriteNodeMaterial.js +84 -16
  361. package/examples/jsm/nodes/math/CondNode.js +26 -95
  362. package/examples/jsm/nodes/math/MathNode.js +164 -187
  363. package/examples/jsm/nodes/math/OperatorNode.js +161 -41
  364. package/examples/jsm/{renderers/nodes → nodes}/parsers/GLSLNodeFunction.js +2 -2
  365. package/examples/jsm/{renderers/nodes → nodes}/parsers/GLSLNodeParser.js +0 -0
  366. package/examples/jsm/{renderers/nodes → nodes}/parsers/WGSLNodeFunction.js +20 -5
  367. package/examples/jsm/{renderers/nodes → nodes}/parsers/WGSLNodeParser.js +0 -0
  368. package/examples/jsm/nodes/procedural/CheckerNode.js +16 -57
  369. package/examples/jsm/nodes/shadernode/ShaderNode.js +262 -0
  370. package/examples/jsm/nodes/shadernode/ShaderNodeBaseElements.js +274 -0
  371. package/examples/jsm/nodes/shadernode/ShaderNodeElements.js +106 -0
  372. package/examples/jsm/{renderers/nodes → nodes}/utils/ArrayElementNode.js +3 -3
  373. package/examples/jsm/{renderers/nodes → nodes}/utils/ConvertNode.js +11 -3
  374. package/examples/jsm/nodes/utils/JoinNode.js +17 -89
  375. package/examples/jsm/nodes/utils/MatcapUVNode.js +25 -0
  376. package/examples/jsm/nodes/utils/MaxMipLevelNode.js +32 -0
  377. package/examples/jsm/{renderers/nodes → nodes}/utils/OscNode.js +18 -2
  378. package/examples/jsm/{renderers/nodes → nodes}/utils/SplitNode.js +35 -4
  379. package/examples/jsm/{renderers/nodes → nodes}/utils/SpriteSheetUVNode.js +3 -3
  380. package/examples/jsm/nodes/utils/TimerNode.js +30 -65
  381. package/examples/jsm/objects/Lensflare.js +6 -6
  382. package/examples/jsm/objects/LightningStorm.js +4 -4
  383. package/examples/jsm/objects/MarchingCubes.js +5 -9
  384. package/examples/jsm/objects/Reflector.js +8 -19
  385. package/examples/jsm/objects/ReflectorForSSRPass.js +2 -14
  386. package/examples/jsm/objects/Refractor.js +8 -19
  387. package/examples/jsm/objects/ShadowMesh.js +2 -2
  388. package/examples/jsm/objects/Sky.js +2 -2
  389. package/examples/jsm/objects/Water.js +3 -18
  390. package/examples/jsm/objects/Water2.js +2 -2
  391. package/examples/jsm/offscreen/jank.js +5 -5
  392. package/examples/jsm/offscreen/offscreen.js +1 -1
  393. package/examples/jsm/offscreen/scene.js +11 -11
  394. package/examples/jsm/postprocessing/AdaptiveToneMappingPass.js +5 -7
  395. package/examples/jsm/postprocessing/AfterimagePass.js +0 -10
  396. package/examples/jsm/postprocessing/BloomPass.js +48 -20
  397. package/examples/jsm/postprocessing/DotScreenPass.js +1 -1
  398. package/examples/jsm/postprocessing/EffectComposer.js +1 -9
  399. package/examples/jsm/postprocessing/GlitchPass.js +7 -6
  400. package/examples/jsm/postprocessing/LUTPass.js +2 -2
  401. package/examples/jsm/postprocessing/OutlinePass.js +8 -15
  402. package/examples/jsm/postprocessing/SAOPass.js +2 -9
  403. package/examples/jsm/postprocessing/SMAAPass.js +2 -11
  404. package/examples/jsm/postprocessing/SSAARenderPass.js +1 -4
  405. package/examples/jsm/postprocessing/SSAOPass.js +13 -25
  406. package/examples/jsm/postprocessing/SSRPass.js +3 -9
  407. package/examples/jsm/postprocessing/SavePass.js +1 -3
  408. package/examples/jsm/postprocessing/TAARenderPass.js +4 -4
  409. package/examples/jsm/postprocessing/UnrealBloomPass.js +3 -8
  410. package/examples/jsm/renderers/CSS2DRenderer.js +21 -19
  411. package/examples/jsm/renderers/CSS3DRenderer.js +39 -34
  412. package/examples/jsm/renderers/Projector.js +101 -128
  413. package/examples/jsm/renderers/SVGRenderer.js +4 -4
  414. package/examples/jsm/renderers/webgl/nodes/SlotNode.js +1 -1
  415. package/examples/jsm/renderers/webgl/nodes/WebGLNodeBuilder.js +127 -23
  416. package/examples/jsm/renderers/webgl/nodes/WebGLNodes.js +14 -3
  417. package/examples/jsm/renderers/webgl/nodes/WebGLPhysicalContextNode.js +5 -5
  418. package/examples/jsm/renderers/webgpu/WebGPUAttributes.js +4 -4
  419. package/examples/jsm/renderers/webgpu/WebGPUBackground.js +16 -10
  420. package/examples/jsm/renderers/webgpu/WebGPUBindings.js +8 -7
  421. package/examples/jsm/renderers/webgpu/WebGPUBuffer.js +43 -0
  422. package/examples/jsm/renderers/webgpu/WebGPUComputePipelines.js +14 -7
  423. package/examples/jsm/renderers/webgpu/WebGPUInfo.js +1 -1
  424. package/examples/jsm/renderers/webgpu/WebGPUObjects.js +0 -6
  425. package/examples/jsm/renderers/webgpu/WebGPURenderPipeline.js +20 -20
  426. package/examples/jsm/renderers/webgpu/WebGPURenderPipelines.js +2 -1
  427. package/examples/jsm/renderers/webgpu/WebGPURenderStates.js +66 -0
  428. package/examples/jsm/renderers/webgpu/WebGPURenderer.js +49 -28
  429. package/examples/jsm/renderers/webgpu/WebGPUSampledTexture.js +14 -14
  430. package/examples/jsm/renderers/webgpu/WebGPUSampler.js +2 -2
  431. package/examples/jsm/renderers/webgpu/WebGPUStorageBuffer.js +5 -8
  432. package/examples/jsm/renderers/webgpu/WebGPUTextureUtils.js +23 -20
  433. package/examples/jsm/renderers/webgpu/WebGPUTextures.js +38 -20
  434. package/examples/jsm/renderers/webgpu/WebGPUUniform.js +14 -14
  435. package/examples/jsm/renderers/webgpu/WebGPUUniformBuffer.js +5 -32
  436. package/examples/jsm/renderers/webgpu/WebGPUUniformsGroup.js +2 -2
  437. package/examples/jsm/renderers/webgpu/constants.js +3 -2
  438. package/examples/jsm/renderers/webgpu/nodes/WebGPUNodeBuilder.js +276 -278
  439. package/examples/jsm/renderers/webgpu/nodes/WebGPUNodeSampledTexture.js +20 -2
  440. package/examples/jsm/renderers/webgpu/nodes/WebGPUNodes.js +24 -14
  441. package/examples/jsm/shaders/BlendShader.js +2 -1
  442. package/examples/jsm/shaders/CopyShader.js +4 -3
  443. package/examples/jsm/shaders/DigitalGlitch.js +3 -3
  444. package/examples/jsm/shaders/FXAAShader.js +219 -1051
  445. package/examples/jsm/shaders/FreiChenShader.js +1 -1
  446. package/examples/jsm/shaders/HorizontalBlurShader.js +1 -1
  447. package/examples/jsm/shaders/HorizontalTiltShiftShader.js +1 -1
  448. package/examples/jsm/shaders/MMDToonShader.js +0 -1
  449. package/examples/jsm/shaders/SSAOShader.js +1 -1
  450. package/examples/jsm/shaders/SSRShader.js +3 -3
  451. package/examples/jsm/shaders/ToneMapShader.js +1 -1
  452. package/examples/jsm/utils/BufferGeometryUtils.js +292 -22
  453. package/examples/jsm/utils/GPUStatsPanel.js +1 -1
  454. package/examples/jsm/utils/LDrawUtils.js +202 -0
  455. package/examples/jsm/utils/SceneUtils.js +76 -2
  456. package/examples/jsm/utils/SkeletonUtils.js +1 -1
  457. package/examples/jsm/utils/UVsDebug.js +23 -32
  458. package/examples/jsm/webxr/ARButton.js +14 -4
  459. package/examples/jsm/webxr/OculusHandPointerModel.js +3 -3
  460. package/examples/jsm/webxr/Text2D.js +1 -1
  461. package/examples/jsm/webxr/VRButton.js +39 -1
  462. package/examples/jsm/webxr/XREstimatedLight.js +2 -0
  463. package/examples/jsm/webxr/XRHandMeshModel.js +3 -7
  464. package/examples/jsm/webxr/XRHandModelFactory.js +3 -0
  465. package/package.json +53 -25
  466. package/src/Three.Legacy.js +41 -1912
  467. package/src/Three.js +6 -3
  468. package/src/animation/AnimationClip.js +1 -1
  469. package/src/animation/AnimationMixer.js +6 -3
  470. package/src/animation/AnimationObjectGroup.js +2 -2
  471. package/src/animation/PropertyBinding.js +8 -18
  472. package/src/audio/PositionalAudio.js +8 -0
  473. package/src/cameras/ArrayCamera.js +2 -3
  474. package/src/cameras/Camera.js +2 -2
  475. package/src/cameras/CubeCamera.js +8 -1
  476. package/src/cameras/OrthographicCamera.js +2 -2
  477. package/src/cameras/PerspectiveCamera.js +2 -2
  478. package/src/constants.js +8 -18
  479. package/src/core/BufferAttribute.js +7 -12
  480. package/src/core/BufferGeometry.js +6 -6
  481. package/src/core/GLBufferAttribute.js +2 -2
  482. package/src/core/InstancedBufferAttribute.js +2 -2
  483. package/src/core/InstancedBufferGeometry.js +2 -2
  484. package/src/core/InstancedInterleavedBuffer.js +2 -2
  485. package/src/core/InterleavedBuffer.js +2 -2
  486. package/src/core/InterleavedBufferAttribute.js +5 -11
  487. package/src/core/Object3D.js +6 -3
  488. package/src/core/Raycaster.js +2 -2
  489. package/src/extras/DataUtils.js +127 -40
  490. package/src/extras/Earcut.js +2 -2
  491. package/src/extras/ImageUtils.js +63 -0
  492. package/src/extras/PMREMGenerator.js +152 -174
  493. package/src/extras/core/CurvePath.js +3 -3
  494. package/src/extras/core/ShapePath.js +5 -6
  495. package/src/extras/curves/ArcCurve.js +2 -2
  496. package/src/extras/curves/CatmullRomCurve3.js +2 -2
  497. package/src/extras/curves/CubicBezierCurve.js +2 -2
  498. package/src/extras/curves/CubicBezierCurve3.js +2 -2
  499. package/src/extras/curves/EllipseCurve.js +2 -2
  500. package/src/extras/curves/LineCurve.js +2 -2
  501. package/src/extras/curves/LineCurve3.js +2 -1
  502. package/src/extras/curves/QuadraticBezierCurve.js +2 -2
  503. package/src/extras/curves/QuadraticBezierCurve3.js +2 -2
  504. package/src/extras/curves/SplineCurve.js +2 -2
  505. package/src/geometries/CapsuleGeometry.js +33 -0
  506. package/src/geometries/ExtrudeGeometry.js +2 -0
  507. package/src/geometries/Geometries.js +1 -0
  508. package/src/geometries/LatheGeometry.js +1 -1
  509. package/src/geometries/TorusKnotGeometry.js +2 -2
  510. package/src/geometries/WireframeGeometry.js +3 -2
  511. package/src/helpers/BoxHelper.js +2 -2
  512. package/src/helpers/PointLightHelper.js +1 -1
  513. package/src/helpers/SkeletonHelper.js +3 -2
  514. package/src/lights/AmbientLight.js +2 -2
  515. package/src/lights/AmbientLightProbe.js +2 -2
  516. package/src/lights/DirectionalLight.js +2 -2
  517. package/src/lights/DirectionalLightShadow.js +2 -2
  518. package/src/lights/HemisphereLight.js +4 -4
  519. package/src/lights/HemisphereLightProbe.js +2 -2
  520. package/src/lights/Light.js +4 -4
  521. package/src/lights/LightProbe.js +2 -2
  522. package/src/lights/PointLight.js +4 -4
  523. package/src/lights/PointLightShadow.js +2 -2
  524. package/src/lights/RectAreaLight.js +2 -2
  525. package/src/lights/SpotLight.js +4 -4
  526. package/src/lights/SpotLightShadow.js +2 -2
  527. package/src/loaders/FileLoader.js +23 -4
  528. package/src/loaders/ImageBitmapLoader.js +2 -2
  529. package/src/loaders/ImageLoader.js +1 -1
  530. package/src/loaders/LoaderUtils.js +1 -1
  531. package/src/loaders/MaterialLoader.js +8 -3
  532. package/src/loaders/ObjectLoader.js +23 -25
  533. package/src/materials/LineBasicMaterial.js +6 -13
  534. package/src/materials/LineDashedMaterial.js +2 -15
  535. package/src/materials/Material.js +49 -15
  536. package/src/materials/Materials.js +66 -18
  537. package/src/materials/MeshBasicMaterial.js +6 -31
  538. package/src/materials/MeshDepthMaterial.js +2 -22
  539. package/src/materials/MeshDistanceMaterial.js +2 -22
  540. package/src/materials/MeshLambertMaterial.js +6 -34
  541. package/src/materials/MeshMatcapMaterial.js +6 -28
  542. package/src/materials/MeshNormalMaterial.js +2 -26
  543. package/src/materials/MeshPhongMaterial.js +6 -48
  544. package/src/materials/MeshPhysicalMaterial.js +32 -35
  545. package/src/materials/MeshStandardMaterial.js +6 -54
  546. package/src/materials/MeshToonMaterial.js +6 -38
  547. package/src/materials/PointsMaterial.js +6 -15
  548. package/src/materials/RawShaderMaterial.js +2 -2
  549. package/src/materials/ShaderMaterial.js +3 -17
  550. package/src/materials/ShadowMaterial.js +6 -8
  551. package/src/materials/SpriteMaterial.js +6 -12
  552. package/src/math/Box2.js +2 -2
  553. package/src/math/Box3.js +29 -15
  554. package/src/math/Color.js +85 -36
  555. package/src/math/ColorManagement.js +74 -0
  556. package/src/math/Euler.js +16 -14
  557. package/src/math/Interpolant.js +4 -9
  558. package/src/math/MathUtils.js +76 -7
  559. package/src/math/Matrix3.js +2 -2
  560. package/src/math/Matrix4.js +2 -3
  561. package/src/math/Plane.js +2 -2
  562. package/src/math/Quaternion.js +12 -3
  563. package/src/math/Spherical.js +1 -1
  564. package/src/math/SphericalHarmonics3.js +2 -2
  565. package/src/math/Vector2.js +2 -2
  566. package/src/math/Vector3.js +12 -3
  567. package/src/math/Vector4.js +2 -2
  568. package/src/math/interpolants/DiscreteInterpolant.js +1 -1
  569. package/src/objects/Bone.js +2 -2
  570. package/src/objects/Group.js +2 -2
  571. package/src/objects/InstancedMesh.js +4 -4
  572. package/src/objects/Line.js +76 -107
  573. package/src/objects/LineLoop.js +2 -2
  574. package/src/objects/LineSegments.js +15 -23
  575. package/src/objects/Mesh.js +82 -104
  576. package/src/objects/Points.js +32 -54
  577. package/src/objects/SkinnedMesh.js +5 -8
  578. package/src/objects/Sprite.js +4 -4
  579. package/src/renderers/WebGL3DRenderTarget.js +22 -0
  580. package/src/renderers/WebGLArrayRenderTarget.js +22 -0
  581. package/src/renderers/WebGLCubeRenderTarget.js +7 -16
  582. package/src/renderers/WebGLMultipleRenderTargets.js +8 -5
  583. package/src/renderers/WebGLRenderTarget.js +19 -18
  584. package/src/renderers/WebGLRenderer.js +112 -133
  585. package/src/renderers/shaders/ShaderChunk/bsdfs.glsl.js +46 -0
  586. package/src/renderers/shaders/ShaderChunk/common.glsl.js +1 -0
  587. package/src/renderers/shaders/ShaderChunk/cube_uv_reflection_fragment.glsl.js +12 -13
  588. package/src/renderers/shaders/ShaderChunk/dithering_pars_fragment.glsl.js +1 -1
  589. package/src/renderers/shaders/ShaderChunk/emissivemap_fragment.glsl.js +0 -2
  590. package/src/renderers/shaders/ShaderChunk/encodings_pars_fragment.glsl.js +0 -4
  591. package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +0 -2
  592. package/src/renderers/shaders/ShaderChunk/envmap_physical_pars_fragment.glsl.js +3 -19
  593. package/src/renderers/shaders/ShaderChunk/iridescence_fragment.glsl.js +107 -0
  594. package/src/renderers/shaders/ShaderChunk/iridescence_pars_fragment.glsl.js +14 -0
  595. package/src/renderers/shaders/ShaderChunk/lightmap_fragment.glsl.js +1 -7
  596. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +25 -0
  597. package/src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js +1 -7
  598. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +25 -2
  599. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +43 -5
  600. package/src/renderers/shaders/ShaderChunk/map_fragment.glsl.js +10 -3
  601. package/src/renderers/shaders/ShaderChunk/map_particle_fragment.glsl.js +1 -2
  602. package/src/renderers/shaders/ShaderChunk/morphcolor_vertex.glsl.js +24 -0
  603. package/src/renderers/shaders/ShaderChunk/morphnormal_vertex.glsl.js +1 -1
  604. package/src/renderers/shaders/ShaderChunk/morphtarget_pars_vertex.glsl.js +7 -7
  605. package/src/renderers/shaders/ShaderChunk/morphtarget_vertex.glsl.js +1 -9
  606. package/src/renderers/shaders/ShaderChunk/skinning_pars_vertex.glsl.js +16 -31
  607. package/src/renderers/shaders/ShaderChunk/transmission_pars_fragment.glsl.js +9 -8
  608. package/src/renderers/shaders/ShaderChunk.js +6 -0
  609. package/src/renderers/shaders/ShaderLib/background.glsl.js +8 -2
  610. package/src/renderers/shaders/ShaderLib/equirect.glsl.js +1 -3
  611. package/src/renderers/shaders/ShaderLib/linedashed.glsl.js +1 -0
  612. package/src/renderers/shaders/ShaderLib/meshbasic.glsl.js +3 -2
  613. package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +1 -0
  614. package/src/renderers/shaders/ShaderLib/meshmatcap.glsl.js +2 -2
  615. package/src/renderers/shaders/ShaderLib/meshnormal.glsl.js +6 -0
  616. package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +1 -0
  617. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +10 -0
  618. package/src/renderers/shaders/ShaderLib/meshtoon.glsl.js +1 -0
  619. package/src/renderers/shaders/ShaderLib/points.glsl.js +1 -0
  620. package/src/renderers/shaders/ShaderLib.js +8 -2
  621. package/src/renderers/shaders/UniformsLib.js +2 -2
  622. package/src/renderers/webgl/WebGLAttributes.js +6 -6
  623. package/src/renderers/webgl/WebGLBackground.js +5 -2
  624. package/src/renderers/webgl/WebGLBindingStates.js +57 -29
  625. package/src/renderers/webgl/WebGLCubeMaps.js +0 -4
  626. package/src/renderers/webgl/WebGLCubeUVMaps.js +29 -16
  627. package/src/renderers/webgl/WebGLGeometries.js +2 -2
  628. package/src/renderers/webgl/WebGLLights.js +0 -1
  629. package/src/renderers/webgl/WebGLMaterials.js +72 -187
  630. package/src/renderers/webgl/WebGLMorphtargets.js +59 -23
  631. package/src/renderers/webgl/WebGLProgram.js +56 -30
  632. package/src/renderers/webgl/WebGLPrograms.js +80 -130
  633. package/src/renderers/webgl/WebGLShaderCache.js +4 -3
  634. package/src/renderers/webgl/WebGLShadowMap.js +6 -8
  635. package/src/renderers/webgl/WebGLState.js +83 -2
  636. package/src/renderers/webgl/WebGLTextures.js +618 -375
  637. package/src/renderers/webgl/WebGLUniforms.js +79 -80
  638. package/src/renderers/webgl/WebGLUtils.js +97 -30
  639. package/src/renderers/webxr/WebXRManager.js +64 -47
  640. package/src/scenes/Fog.js +2 -2
  641. package/src/scenes/FogExp2.js +2 -2
  642. package/src/scenes/Scene.js +2 -2
  643. package/src/textures/CanvasTexture.js +2 -2
  644. package/src/textures/CompressedTexture.js +2 -2
  645. package/src/textures/CubeTexture.js +2 -2
  646. package/src/textures/{DataTexture3D.js → Data3DTexture.js} +4 -4
  647. package/src/textures/{DataTexture2DArray.js → DataArrayTexture.js} +4 -4
  648. package/src/textures/DataTexture.js +2 -5
  649. package/src/textures/DepthTexture.js +5 -5
  650. package/src/textures/FramebufferTexture.js +2 -2
  651. package/src/textures/Source.js +123 -0
  652. package/src/textures/Texture.js +29 -98
  653. package/src/textures/VideoTexture.js +2 -4
  654. package/src/utils.js +15 -1
  655. package/examples/js/WebGL.js +0 -90
  656. package/examples/js/csm/Frustum.js +0 -133
  657. package/examples/js/deprecated/Geometry.js +0 -1656
  658. package/examples/js/loaders/VRMLoader.js +0 -72
  659. package/examples/js/objects/ReflectorRTT.js +0 -16
  660. package/examples/js/postprocessing/SSRrPass.js +0 -494
  661. package/examples/js/shaders/SSRrShader.js +0 -336
  662. package/examples/js/utils/RoughnessMipmapper.js +0 -268
  663. package/examples/jsm/deprecated/Geometry.js +0 -1869
  664. package/examples/jsm/libs/opentype.module.min.js +0 -119
  665. package/examples/jsm/loaders/NodeMaterialLoader.js +0 -263
  666. package/examples/jsm/loaders/VRMLoader.js +0 -78
  667. package/examples/jsm/nodes/accessors/ColorsNode.js +0 -56
  668. package/examples/jsm/nodes/accessors/LightNode.js +0 -60
  669. package/examples/jsm/nodes/accessors/ResolutionNode.js +0 -64
  670. package/examples/jsm/nodes/accessors/ScreenUVNode.js +0 -64
  671. package/examples/jsm/nodes/core/NodeLib.js +0 -64
  672. package/examples/jsm/nodes/core/StructNode.js +0 -106
  673. package/examples/jsm/nodes/effects/BlurNode.js +0 -171
  674. package/examples/jsm/nodes/effects/ColorAdjustmentNode.js +0 -140
  675. package/examples/jsm/nodes/effects/LuminanceNode.js +0 -75
  676. package/examples/jsm/nodes/inputs/BoolNode.js +0 -51
  677. package/examples/jsm/nodes/inputs/ColorNode.js +0 -58
  678. package/examples/jsm/nodes/inputs/CubeTextureNode.js +0 -108
  679. package/examples/jsm/nodes/inputs/FloatNode.js +0 -51
  680. package/examples/jsm/nodes/inputs/IntNode.js +0 -51
  681. package/examples/jsm/nodes/inputs/Matrix3Node.js +0 -63
  682. package/examples/jsm/nodes/inputs/Matrix4Node.js +0 -63
  683. package/examples/jsm/nodes/inputs/PropertyNode.js +0 -47
  684. package/examples/jsm/nodes/inputs/RTTNode.js +0 -157
  685. package/examples/jsm/nodes/inputs/ReflectorNode.js +0 -90
  686. package/examples/jsm/nodes/inputs/ScreenNode.js +0 -28
  687. package/examples/jsm/nodes/inputs/TextureNode.js +0 -116
  688. package/examples/jsm/nodes/inputs/Vector2Node.js +0 -57
  689. package/examples/jsm/nodes/inputs/Vector3Node.js +0 -58
  690. package/examples/jsm/nodes/inputs/Vector4Node.js +0 -59
  691. package/examples/jsm/nodes/materials/BasicNodeMaterial.js +0 -26
  692. package/examples/jsm/nodes/materials/PhongNodeMaterial.js +0 -36
  693. package/examples/jsm/nodes/materials/StandardNodeMaterial.js +0 -40
  694. package/examples/jsm/nodes/materials/nodes/BasicNode.js +0 -154
  695. package/examples/jsm/nodes/materials/nodes/MeshStandardNode.js +0 -116
  696. package/examples/jsm/nodes/materials/nodes/PhongNode.js +0 -409
  697. package/examples/jsm/nodes/materials/nodes/RawNode.js +0 -62
  698. package/examples/jsm/nodes/materials/nodes/SpriteNode.js +0 -236
  699. package/examples/jsm/nodes/materials/nodes/StandardNode.js +0 -609
  700. package/examples/jsm/nodes/misc/BumpMapNode.js +0 -163
  701. package/examples/jsm/nodes/misc/NormalMapNode.js +0 -138
  702. package/examples/jsm/nodes/misc/TextureCubeNode.js +0 -86
  703. package/examples/jsm/nodes/misc/TextureCubeUVNode.js +0 -280
  704. package/examples/jsm/nodes/postprocessing/NodePass.js +0 -93
  705. package/examples/jsm/nodes/postprocessing/NodePostProcessing.js +0 -148
  706. package/examples/jsm/nodes/procedural/Fractal3DNode.js +0 -104
  707. package/examples/jsm/nodes/procedural/Noise2DNode.js +0 -149
  708. package/examples/jsm/nodes/procedural/Noise3DNode.js +0 -141
  709. package/examples/jsm/nodes/utils/BypassNode.js +0 -85
  710. package/examples/jsm/nodes/utils/ColorSpaceNode.js +0 -154
  711. package/examples/jsm/nodes/utils/MaxMIPLevelNode.js +0 -56
  712. package/examples/jsm/nodes/utils/RemapNode.js +0 -155
  713. package/examples/jsm/nodes/utils/SpecularMIPLevelNode.js +0 -101
  714. package/examples/jsm/nodes/utils/SubSlotNode.js +0 -77
  715. package/examples/jsm/nodes/utils/SwitchNode.js +0 -103
  716. package/examples/jsm/nodes/utils/UVTransformNode.js +0 -66
  717. package/examples/jsm/nodes/utils/VelocityNode.js +0 -170
  718. package/examples/jsm/objects/ReflectorRTT.js +0 -15
  719. package/examples/jsm/postprocessing/SSRrPass.js +0 -579
  720. package/examples/jsm/renderers/nodes/Nodes.js +0 -164
  721. package/examples/jsm/renderers/nodes/ShaderNode.js +0 -346
  722. package/examples/jsm/renderers/nodes/accessors/CameraNode.js +0 -68
  723. package/examples/jsm/renderers/nodes/accessors/NormalNode.js +0 -63
  724. package/examples/jsm/renderers/nodes/accessors/PositionNode.js +0 -67
  725. package/examples/jsm/renderers/nodes/accessors/ReferenceNode.js +0 -91
  726. package/examples/jsm/renderers/nodes/accessors/SkinningNode.js +0 -107
  727. package/examples/jsm/renderers/nodes/accessors/UVNode.js +0 -25
  728. package/examples/jsm/renderers/nodes/core/ArrayInputNode.js +0 -23
  729. package/examples/jsm/renderers/nodes/core/AttributeNode.js +0 -54
  730. package/examples/jsm/renderers/nodes/core/ExpressionNode.js +0 -32
  731. package/examples/jsm/renderers/nodes/core/FunctionCallNode.js +0 -67
  732. package/examples/jsm/renderers/nodes/core/FunctionNode.js +0 -87
  733. package/examples/jsm/renderers/nodes/core/InputNode.js +0 -66
  734. package/examples/jsm/renderers/nodes/core/Node.js +0 -104
  735. package/examples/jsm/renderers/nodes/core/NodeBuilder.js +0 -633
  736. package/examples/jsm/renderers/nodes/core/NodeFrame.js +0 -59
  737. package/examples/jsm/renderers/nodes/core/NodeUniform.js +0 -28
  738. package/examples/jsm/renderers/nodes/core/TempNode.js +0 -43
  739. package/examples/jsm/renderers/nodes/core/VarNode.js +0 -51
  740. package/examples/jsm/renderers/nodes/display/ColorSpaceNode.js +0 -133
  741. package/examples/jsm/renderers/nodes/display/NormalMapNode.js +0 -87
  742. package/examples/jsm/renderers/nodes/functions/BSDFs.js +0 -122
  743. package/examples/jsm/renderers/nodes/functions/PhysicalMaterialFunctions.js +0 -27
  744. package/examples/jsm/renderers/nodes/inputs/BufferNode.js +0 -25
  745. package/examples/jsm/renderers/nodes/inputs/ColorNode.js +0 -18
  746. package/examples/jsm/renderers/nodes/inputs/FloatNode.js +0 -17
  747. package/examples/jsm/renderers/nodes/inputs/IntNode.js +0 -17
  748. package/examples/jsm/renderers/nodes/inputs/Matrix3Node.js +0 -18
  749. package/examples/jsm/renderers/nodes/inputs/Matrix4Node.js +0 -18
  750. package/examples/jsm/renderers/nodes/inputs/TextureNode.js +0 -79
  751. package/examples/jsm/renderers/nodes/inputs/Vector2Node.js +0 -18
  752. package/examples/jsm/renderers/nodes/inputs/Vector3Node.js +0 -18
  753. package/examples/jsm/renderers/nodes/inputs/Vector4Node.js +0 -18
  754. package/examples/jsm/renderers/nodes/lights/LightContextNode.js +0 -59
  755. package/examples/jsm/renderers/nodes/lights/LightNode.js +0 -79
  756. package/examples/jsm/renderers/nodes/lights/LightsNode.js +0 -44
  757. package/examples/jsm/renderers/nodes/materials/Materials.js +0 -11
  758. package/examples/jsm/renderers/nodes/materials/MeshStandardNodeMaterial.js +0 -63
  759. package/examples/jsm/renderers/nodes/math/CondNode.js +0 -60
  760. package/examples/jsm/renderers/nodes/math/MathNode.js +0 -241
  761. package/examples/jsm/renderers/nodes/math/OperatorNode.js +0 -174
  762. package/examples/jsm/renderers/nodes/procedural/CheckerNode.js +0 -36
  763. package/examples/jsm/renderers/nodes/utils/JoinNode.js +0 -42
  764. package/examples/jsm/renderers/nodes/utils/TimerNode.js +0 -47
  765. package/examples/jsm/renderers/webgpu/nodes/WebGPUNodeUniformsGroup.js +0 -20
  766. package/examples/jsm/shaders/SSRrShader.js +0 -307
  767. package/examples/jsm/utils/RoughnessMipmapper.js +0 -288
  768. package/src/renderers/WebGLMultisampleRenderTarget.js +0 -33
@@ -12,11 +12,11 @@ function __flow__addCSS( css ) {
12
12
  style.innerHTML = css;
13
13
  document.head.appendChild( style );
14
14
 
15
- } catch( e ) {}
15
+ } catch ( e ) {}
16
16
 
17
17
  }
18
18
 
19
- __flow__addCSS( `@keyframes f-animation-open { 0% { transform: scale(.5); opacity: 0; } 100% { transform: scale(1); opacity: 1; }}f-canvas,f-canvas canvas { position: absolute; top: 0; left: 0; margin: 0; padding: 0; width: 100%; height: 100%; -webkit-touch-callout: none; }f-canvas { overflow: auto; cursor: grab;}f-canvas canvas.front { z-index: 10;}body.dragging f-canvas,body.connecting f-canvas { overflow: hidden !important;}body.dragging *:not(.drag) { pointer-events: none !important;}f-canvas.grabbing * { cursor: grabbing; user-select: none;}f-canvas canvas { position: fixed; overflow: hidden; pointer-events: none;}f-canvas::-webkit-scrollbar { width: 8px; height: 8px;}f-canvas::-webkit-scrollbar-thumb:hover{ background: #014fc5;}f-canvas::-webkit-scrollbar-track { background: #363636;}f-canvas::-webkit-scrollbar-thumb { background-color: #666666; border-radius: 10px; border: 0;}f-canvas f-content,f-canvas f-area { position: absolute; display: block;}f-node { position: absolute; margin: 0; padding: 0; user-select: none; width: 320px; z-index: 1; cursor: auto; filter: drop-shadow(0 0 10px #00000061); backdrop-filter: blur(4px);}f-node.selected { z-index: 2;}f-node.selected,f-canvas.dragging-rio f-node:hover,f-canvas.dragging-lio f-node:hover { filter: drop-shadow(0 0 10px #00000061) drop-shadow(0 0 8px #4444dd);}f-node.closed f-element:not(:first-child) { display: none;}f-node.center { top: 50%; left: 50%; transform: translate( -50%, -50% );}f-node.top-right { top: 0; right: 0;}f-node.top-center { top: 0; left: 50%; transform: translateX( -50% );}f-node.top-left { top: 0; left: 0;}f-node { transition: filter 0.2s ease;}f-node { animation: .2s f-animation-open 1 alternate ease-out;}f-drop,f-menu,f-menu button,f-element,f-element input,f-element select,f-element button,f-element textarea { font-family: 'Open Sans', sans-serif; font-size: 13px; text-transform: capitalize; color: #eeeeee; outline: solid 0px #000; letter-spacing: .2px; margin: 0; padding: 0; border: 0; user-select: none; -webkit-tap-highlight-color: transparent; transition: background 0.2s ease;}f-element input { transition: background 0.1s ease;}f-element input,f-element select,f-element button,f-element textarea { background-color: #242427;}f-element { position: relative; width: calc( 100% - 14px ); background: rgba(45, 45, 48, 0.95); pointer-events: auto; border-bottom: 2px solid #232323; display: flex; padding-left: 7px; padding-right: 7px; padding-top: 2px; padding-bottom: 2px;}f-element { height: 24px;}f-element input { margin-top: 2px; margin-bottom: 2px; box-shadow: inset 0px 1px 1px rgb(0 0 0 / 20%), 0px 1px 0px rgb(255 255 255 / 5%); margin-left: 2px; margin-right: 2px; width: 100%; padding-left: 4px; padding-right: 4px;}f-element input.number { cursor: col-resize;}f-element input:focus[type='text'], f-element input:focus[type='range'], f-element input:focus[type='color'] { background: rgba( 0, 0, 0, 0.6 ); outline: solid 1px rgba( 0, 80, 200, 0.98 );}f-element input[type='color'] { appearance: none; padding: 0; margin-left: 2px; margin-right: 2px; height: calc( 100% - 4px ); margin-top: 2px; border: none; }f-element input[type='color']::-webkit-color-swatch-wrapper { padding: 2px;}f-element input[type='color']::-webkit-color-swatch { border: none; cursor: alias;}f-element input[type='range'] { appearance: none; width: 100%; overflow: hidden; padding: 0; cursor: ew-resize;}f-element input[type='range']::-webkit-slider-runnable-track { appearance: none; height: 10px; color: #13bba4; margin: 0;}f-element input[type='range']::-webkit-slider-thumb { appearance: none; width: 0; background: #434343; box-shadow: -500px 0 0 500px rgba( 0, 120, 255, 0.98 ); border-radius: 50%; border: 0 !important;}f-element input[type='range']::-webkit-slider-runnable-track { margin-left: -4px; margin-right: -5px;}f-element input[type='checkbox'] { appearance: none; cursor: pointer;}f-element input[type='checkbox'].toggle { height: 20px; width: 45px; border-radius: 16px; display: inline-block; position: relative; margin: 0; margin-top: 2px; background: linear-gradient( 0deg, #292929 0%, #0a0a0ac2 100% ); transition: all 0.2s ease;}f-element input[type='checkbox'].toggle:after { content: ""; position: absolute; top: 2px; left: 2px; width: 16px; height: 16px; border-radius: 50%; background: white; box-shadow: 0 1px 2px rgba(44, 44, 44, 0.2); transition: all 0.2s cubic-bezier(0.5, 0.1, 0.75, 1.35);}f-element input[type='checkbox'].toggle:checked { background: linear-gradient( 0deg, #0177fb 0%, #0177fb 100% );}f-element input[type='checkbox'].toggle:checked:after { transform: translatex(25px);}f-element.auto-height { display: table;}f-element textarea { width: calc( 100% - 18px ); padding-top: 1px; padding-bottom: 3px; padding-left: 3px; padding-right: 8px; margin-top: 2px; margin-left: 2px; height: calc( 100% - 8px ); max-height: 300px; border-radius: 2px; resize: none; box-shadow: inset 0px 1px 1px rgb(0 0 0 / 20%), 0px 1px 0px rgb(255 255 255 / 5%);}f-element.auto-height textarea { resize: auto;}f-element select { width: 100%; margin-top: 2px; margin-bottom: 2px; margin-left: 2px; margin-right: 2px; padding-left: 5px; cursor: pointer; box-shadow: inset 0px 1px 1px rgb(0 0 0 / 20%), 0px 1px 0px rgb(255 255 255 / 5%);}f-element f-toolbar { position: absolute; display: flex; top: 0; width: 100%; height: 100%; align-content: space-around;}f-element.output-right f-toolbar { right: 7px; float: right; justify-content: end;}f-element f-toolbar { margin-top: auto; margin-bottom: auto; margin-left: 3px; margin-right: 3px; font-size: 18px; line-height: 18px;}f-element f-toolbar button { opacity: .7; cursor: pointer; font-size: 14px; width: unset; height: unset; border-radius: unset; border: unset; outline: 0; background-color: unset; box-shadow: unset;}f-element f-toolbar button:hover,f-element f-toolbar button:active { opacity: 1; border: 0; background-color: unset;}f-element input.range-value { width: 60px; text-align: center;}f-menu.context button,f-element button { width: 100%; height: calc( 100% - 4px ); margin-left: 2px; margin-right: 2px; margin-top: 2px; border-radius: 3px; cursor: pointer;}f-element button { box-shadow: inset 1px 1px 1px 0 rgb(255 255 255 / 17%), inset -2px -2px 2px 0 rgb(0 0 0 / 26%);}f-element button:hover { color: #fff; background-color: #2a2a2a;}f-element button:active { border: 1px solid rgba( 0, 120, 255, 0.98 );}f-element f-inputs,f-element f-subinputs { display: flex; width: 100%;}f-element f-inputs { left: 100px; top: 50%; transform: translateY(-50%); position: absolute; width: calc( 100% - 106px ); height: calc( 100% - 4px ); z-index: 1;}f-element.inputs-disable f-inputs { filter: grayscale(100%); opacity: .5;}f-element.inputs-disable f-inputs input { pointer-events: none;}f-element f-label,f-element span { margin: auto; text-shadow: 1px 1px 0px #0007;}f-element f-label { padding-left: 4px; white-space: nowrap; position: absolute; top: 50%; transform: translateY(-50%); width: calc( 100% - 20px );}f-element.right f-label { text-align: right;}f-element f-label i { float: left; font-size: 18px; margin-right: 6px;}f-element f-label.center { width: 100%; text-align: center; display: block;}f-element.title { height: 29px; background-color: #3a3a3ab0; background-color: #3b3b43ed; cursor: all-scroll; border-top-left-radius: 6px; border-top-right-radius: 6px;}f-element.blue { background-color: #014fc5;}f-element.red { background-color: #bd0b0b;}f-element.green { background-color: #148d05;}f-element.yellow { background-color: #d6b100;}f-element.title.left { text-align: left; display: inline-grid; justify-content: start;}f-element.title span { text-align: center; font-size: 15px; padding-top: 2px;}f-element.title i { font-size: 18px; position: absolute; right: 10px; top: 50%; transform: translateY(-50%); opacity: .5;}f-element.output-right.title i { left: 10px; right: unset;}f-element.title.left span { text-align: left;}f-element f-io { border: 2px solid #dadada; width: 7px; height: 7px; position: absolute; background: #242427; border-radius: 8px; float: left; left: -7px; top: calc( 50% - 5px ); cursor: alias; box-shadow: 0 0 3px 2px #0000005e; z-index: 1;}f-element f-io.connect,f-canvas.dragging-rio f-element:hover f-io.lio,f-canvas.dragging-lio f-element:hover f-io.rio { border: 2px solid #0177fb; zoom: 1.4;}f-node.io-connect f-io:not(.connect) { border: 2px solid #dadada !important; zoom: 1 !important;}f-element f-io.rio { float: right; right: -7px; left: unset;}f-element f-disconnect { position: absolute; left: -35px; top: 50%; font-size: 22px; transform: translateY( -50% ); filter: drop-shadow(0 0 5px #000); text-shadow: 0px 0px 5px black; cursor: pointer;}f-element.output-right f-disconnect { right: -35px; left: unset;}f-element f-disconnect:hover { color: #ff3300;}f-element textarea::-webkit-scrollbar { width: 6px;}f-element textarea::-webkit-scrollbar-track { background: #111; } f-element textarea::-webkit-scrollbar-thumb { background: #0177fb; }f-element textarea::-webkit-scrollbar-thumb:hover { background: #1187ff; }f-element.small { height: 18px;}f-element.large { height: 36px;}body.connecting f-node:not(.io-connect) f-element:hover,f-element.select { background-color: rgba(61, 70, 82, 0.98);}f-drop { width: 100%; height: 100%; position: sticky; left: 0; top: 0; background: #02358417; text-align: center; justify-content: center; align-items: center; display: flex; box-shadow: inset 0 0 20px 10px #464ace17; pointer-events: none; transition: all .07s; opacity: 0; visibility: hidden;}f-drop.visible { visibility: unset; opacity: unset; transition: all .23s;}f-drop span { opacity: .5; font-size: 40px; text-shadow: 0px 0px 5px #000; font-weight: bold;}f-tooltip { pointer-events: none;}f-tooltip { position: absolute; left: 0; top: 0; background: rgba(0,0,0,.8); backdrop-filter: blur(4px); font-size: 14px; padding: 7px; border-radius: 10px; top: 50%; transform: translateY(-50%); visibility: hidden; pointer-events: none; opacity: 0; transition: all 0.3s ease; z-index: 150; white-space: nowrap;}f-menu.context { position: absolute; width: 170px; padding: 2px; margin: 0; background: #17171794; z-index: 110; font-size: 12px; border-radius: 6px; backdrop-filter: blur(6px); border: 1px solid #7e7e7e45; box-shadow: 3px 3px 6px rgba(0,0,0,.2); transition: opacity 0.2s ease, transform 0.1s ease;}f-menu.context.hidden { visibility: hidden; opacity: 0;}f-menu.context f-item { display: block; position: relative; margin: 0; padding: 0; white-space: nowrap;}f-menu.context f-item.submenu::after { content: ""; position: absolute; right: 6px; top: 50%; -webkit-transform: translateY(-50%); transform: translateY(-50%); border: 5px solid transparent; border-left-color: #808080;}f-menu.context f-item:hover > f-menu,f-menu.context f-item.active > f-menu { visibility: unset; transform: unset; opacity: unset;}f-menu.context f-menu { top: 0px; left: calc( 100% - 4px );}f-menu.context f-item button { overflow: visible; display: block; width: calc( 100% - 6px ); text-align: left; cursor: pointer; white-space: nowrap; padding: 6px 8px; border-radius: 3px; background: #2d2d32; border: 0; color: #ddd; margin: 3px; text-shadow: 1px 1px 0px #0007;}f-menu.context f-item button i { float: left; font-size: 16px;}f-menu.context f-item button span { margin-left: 6px;}f-menu.context f-item:hover > button,f-menu.context f-item.active > button { color: #fff; background: #313136;}f-menu.context f-item button:active { outline: solid 1px rgba( 0, 80, 200, 0.98 );}f-menu.context f-item f-tooltip { margin-left: 120px;}f-menu.circle { position: absolute; left: 30px; top: 30px; z-index: 100;}f-menu.circle f-item { display: flex; justify-content: end; align-content: space-around; margin-bottom: 12px;}f-menu.circle f-item button { width: 50px; height: 50px; font-size: 26px; background: #17171794; border-radius: 50%; backdrop-filter: blur(6px); border: 1px solid #7e7e7e45; line-height: 100%; cursor: pointer; box-shadow: 3px 3px 6px rgba(0,0,0,.2);}f-menu.circle f-item f-tooltip { margin-left: 50px;}.f-rounded f-node f-element,.f-rounded f-node f-element.title.left { border-radius: 10px 5px 10px 5px;}.f-rounded f-node f-element input, .f-rounded f-node f-element select,.f-rounded f-node f-element button,.f-rounded f-node f-element textarea,.f-rounded f-node f-element input[type='checkbox'].toggle,.f-rounded f-node f-element input[type='checkbox'].toggle:after { border-radius: 20px 10px;}.f-rounded f-node f-element input { padding-left: 7px; padding-right: 7px;}.f-rounded f-menu.context,.f-rounded f-menu.context f-item button { border-radius: 20px 10px;}@media (hover: hover) and (pointer: fine) { f-node:not(.selected):hover { filter: drop-shadow(0 0 6px #66666630); } f-element f-toolbar { visibility: hidden; opacity: 0; transition: opacity 0.2s ease; } f-node:hover > f-element f-toolbar { visibility: visible; opacity: 1; } f-element f-io:hover { border: 2px solid #0177fb; zoom: 1.4; } f-menu.circle f-item button:hover { background-color: #2a2a2a; } f-menu.circle f-item button:hover > f-tooltip, f-menu.context f-item button:hover > f-tooltip { visibility: visible; transform: translate(10px, -50%); opacity: 1; } f-menu.circle f-item button:focus > f-tooltip, f-menu.context f-item button:focus > f-tooltip { visibility: hidden; opacity: 0; }}f-canvas { will-change: top, left;}f-node { will-change: transform !important;}` );
19
+ __flow__addCSS( `@keyframes f-animation-open { 0% { transform: scale(.5); opacity: 0; } 100% { transform: scale(1); opacity: 1; }}f-canvas,f-canvas canvas { position: absolute; top: 0; left: 0; margin: 0; padding: 0; width: 100%; height: 100%; -webkit-touch-callout: none; }f-canvas { overflow: auto; cursor: grab;}f-canvas canvas.front { z-index: 10;}body.dragging *:not(.drag) { pointer-events: none !important;}f-canvas.grabbing * { cursor: grabbing; user-select: none;}f-canvas canvas { position: fixed; overflow: hidden; pointer-events: none;}f-canvas::-webkit-scrollbar { width: 8px; height: 8px;}f-canvas::-webkit-scrollbar-thumb:hover{ background: #014fc5;}f-canvas::-webkit-scrollbar-track { background: #363636;}f-canvas::-webkit-scrollbar-thumb { background-color: #666666; border-radius: 10px; border: 0;}f-canvas f-content,f-canvas f-area { position: absolute; display: block;}f-node { position: absolute; margin: 0; padding: 0; user-select: none; width: 320px; z-index: 1; cursor: auto; filter: drop-shadow(0 0 10px #00000061); backdrop-filter: blur(4px);}f-node.selected { z-index: 2;}f-node.selected,f-canvas.dragging-rio f-node:hover,f-canvas.dragging-lio f-node:hover { filter: drop-shadow(0 0 10px #00000061) drop-shadow(0 0 8px #4444dd);}f-node.closed f-element:not(:first-child) { display: none;}f-node.center { top: 50%; left: 50%; transform: translate( -50%, -50% );}f-node.top-right { top: 0; right: 0;}f-node.top-center { top: 0; left: 50%; transform: translateX( -50% );}f-node.top-left { top: 0; left: 0;}f-node { transition: filter 0.2s ease;}f-node { animation: .2s f-animation-open 1 alternate ease-out;}f-tips,f-drop,f-menu,f-menu input,f-menu button,f-element,f-element input,f-element select,f-element button,f-element textarea { font-family: 'Open Sans', sans-serif; font-size: 13px; text-transform: capitalize; color: #eeeeee; outline: solid 0px #000; margin: 0; padding: 0; border: 0; user-select: none; -webkit-tap-highlight-color: transparent; transition: background 0.2s ease, filter 0.2s ease;}f-element input:read-only { color: #666;}f-element input,f-element textarea { text-transform: initial;}f-element input { transition: background 0.1s ease;}f-element input,f-element select,f-element button,f-element textarea { background-color: #232324d1;}f-element { position: relative; width: calc( 100% - 14px ); background: rgba(45, 45, 48, 0.95); pointer-events: auto; border-bottom: 2px solid #232323; display: flex; padding-left: 7px; padding-right: 7px; padding-top: 2px; padding-bottom: 2px;}f-element:after,f-element:before { transition: opacity .17s; opacity: 0; content: '';}f-element[tooltip]:hover:after,f-element[tooltip]:focus-within:after { font-size: 14px !important; display: flex; justify-content: center; position: fixed; margin-left: -7px; width: calc( 100% ); background: #1d1d1de8; border: 1px solid #444444a1; border-radius: 6px; color: #dadada; content: attr( tooltip ); margin-top: -41px; font-size: 16px; padding-top: 3px; padding-bottom: 3px; z-index: 10; opacity: 1; backdrop-filter: blur(4px); white-space: nowrap; overflow: hidden; text-shadow: 1px 1px 0px #0007;}f-element[tooltip]:hover:before,f-element[tooltip]:focus-within:before { border: solid; border-color: #1d1d1de8 transparent; border-width: 12px 6px 0 6px; left: calc( 50% - 6px ); bottom: 30px; position: absolute; opacity: 1; z-index: 11;}f-element[error] { background-color: #ff0000;}f-element[error]:hover:after,f-element[error]:focus-within:after { border: none; background-color: #ff0000bb; filter: drop-shadow( 2px 2px 5px #000 ); color: #fff;}f-element[error]:hover:before,f-element[error]:focus-within:before { border-color: #ff0000bb transparent;}f-element { height: 24px;}f-element input { margin-top: 2px; margin-bottom: 2px; box-shadow: inset 0px 1px 1px rgb(0 0 0 / 20%), 0px 1px 0px rgb(255 255 255 / 5%); margin-left: 2px; margin-right: 2px; width: 100%; padding-left: 4px; padding-right: 4px;}f-element input.number { cursor: col-resize;}f-element input:focus[type='text'], f-element input:focus[type='range'], f-element input:focus[type='color'] { background: rgba( 0, 0, 0, 0.6 ); outline: solid 1px rgba( 0, 80, 200, 0.98 );}f-element input[type='color'] { appearance: none; padding: 0; margin-left: 2px; margin-right: 2px; height: calc( 100% - 4px ); margin-top: 2px; border: none;}f-element input[type='color']::-webkit-color-swatch-wrapper { padding: 2px;}f-element input[type='color']::-webkit-color-swatch { border: none; cursor: alias;}f-element input[type='range'] { appearance: none; width: 100%; overflow: hidden; padding: 0; cursor: ew-resize;}f-element input[type='range']::-webkit-slider-runnable-track { appearance: none; height: 10px; color: #13bba4; margin: 0;}f-element input[type='range']::-webkit-slider-thumb { appearance: none; width: 0; background: #434343; box-shadow: -500px 0 0 500px rgba( 0, 120, 255, 0.98 ); border-radius: 50%; border: 0 !important;}f-element input[type='range']::-webkit-slider-runnable-track { margin-left: -4px; margin-right: -5px;}f-element input[type='checkbox'] { appearance: none; cursor: pointer;}f-element input[type='checkbox'].toggle { height: 20px; width: 45px; border-radius: 16px; display: inline-block; position: relative; margin: 0; margin-top: 2px; background: linear-gradient( 0deg, #292929 0%, #0a0a0ac2 100% ); transition: all 0.2s ease;}f-element input[type='checkbox'].toggle:after { content: ""; position: absolute; top: 2px; left: 2px; width: 16px; height: 16px; border-radius: 50%; background: white; box-shadow: 0 1px 2px rgba(44, 44, 44, 0.2); transition: all 0.2s cubic-bezier(0.5, 0.1, 0.75, 1.35);}f-element input[type='checkbox'].toggle:checked { background: linear-gradient( 0deg, #0177fb 0%, #0177fb 100% );}f-element input[type='checkbox'].toggle:checked:after { transform: translatex(25px);}f-element.auto-height { display: table;}f-element textarea { width: calc( 100% - 18px ); padding-top: 1px; padding-bottom: 3px; padding-left: 3px; padding-right: 8px; margin-top: 2px; margin-left: 2px; height: calc( 100% - 8px ); max-height: 300px; border-radius: 2px; resize: none; box-shadow: inset 0px 1px 1px rgb(0 0 0 / 20%), 0px 1px 0px rgb(255 255 255 / 5%);}f-element.auto-height textarea { resize: auto;}f-element select { width: 100%; margin-top: 2px; margin-bottom: 2px; margin-left: 2px; margin-right: 2px; cursor: pointer; box-shadow: inset 0px 1px 1px rgb(0 0 0 / 20%), 0px 1px 0px rgb(255 255 255 / 5%);}f-element f-toolbar { position: absolute; display: flex; top: 0; width: 100%; height: 100%; align-content: space-around;}f-element.input-right f-toolbar { right: 7px; float: right; justify-content: end;}f-element f-toolbar { margin-top: auto; margin-bottom: auto; margin-left: 3px; margin-right: 3px; font-size: 18px; line-height: 18px;}f-element f-toolbar button { opacity: .7; cursor: pointer; font-size: 14px; width: unset; height: unset; border-radius: unset; border: unset; outline: 0; background-color: unset; box-shadow: unset;}f-element f-toolbar button:hover,f-element f-toolbar button:active { opacity: 1; border: 0; background-color: unset;}f-element input.range-value { width: 60px; text-align: center;}f-menu.context button,f-element button { width: 100%; height: calc( 100% - 4px ); margin-left: 2px; margin-right: 2px; margin-top: 2px; border-radius: 3px; cursor: pointer;}f-element button { box-shadow: inset 1px 1px 1px 0 rgb(255 255 255 / 17%), inset -2px -2px 2px 0 rgb(0 0 0 / 26%);}f-element button:hover { color: #fff; background-color: #2a2a2a;}f-element button:active { border: 1px solid rgba( 0, 120, 255, 0.98 );}f-element f-inputs,f-element f-subinputs { display: flex; justify-content: flex-end; width: 100%;}f-element f-inputs { left: 100px; top: 50%; transform: translateY(-50%); position: absolute; width: calc( 100% - 106px ); height: calc( 100% - 4px ); z-index: 1;}f-element.inputs-disable f-inputs { filter: grayscale(100%); opacity: .5;}f-element.inputs-disable f-inputs input { pointer-events: none;}f-element f-label,f-element span { margin: auto; text-shadow: 1px 1px 0px #0007;}f-element f-label { padding-left: 4px; white-space: nowrap; position: absolute; top: 50%; transform: translateY(-50%); width: calc( 100% - 20px );}f-element.right f-label { text-align: right;}f-element.center f-label { text-align: center;}f-element f-label i { float: left; font-size: 18px; margin-right: 6px;}f-element f-label.center { width: 100%; text-align: center; display: block;}f-element.title { height: 29px; background-color: #3a3a3ab0; background-color: #3b3b43ed; cursor: all-scroll; border-top-left-radius: 6px; border-top-right-radius: 6px;}f-element.blue { background-color: #014fc5;}f-element.red { background-color: #bd0b0b;}f-element.green { background-color: #148d05;}f-element.yellow { background-color: #d6b100;}f-element.title.left { text-align: left; display: inline-grid; justify-content: start;}f-element.title span { text-align: center; font-size: 15px; padding-top: 2px;}f-element.title i { font-size: 18px; position: absolute; right: 10px; top: 50%; transform: translateY(-50%); opacity: .5;}f-element.title f-toolbar i { font-size: 20px; right: unset; left: 0px;}f-element.input-right.title i { left: 10px; right: unset;}f-element.title.left span { text-align: left;}f-element f-io { border: 2px solid #dadada; width: 7px; height: 7px; position: absolute; background: #242427; border-radius: 8px; float: left; left: -7px; top: calc( 50% - 5px ); cursor: alias; box-shadow: 0 0 3px 2px #0000005e; z-index: 1;}f-element f-io.connect,f-canvas.dragging-rio f-element:hover f-io.lio,f-canvas.dragging-lio f-element:hover f-io.rio { zoom: 1.4;}f-node.io-connect f-io:not(.connect) { border: 2px solid #dadada !important; zoom: 1 !important;}f-element f-io.rio { float: right; right: -7px; left: unset;}f-element f-disconnect { position: absolute; left: -35px; top: 50%; font-size: 22px; transform: translateY( -50% ); filter: drop-shadow(0 0 5px #000); text-shadow: 0px 0px 5px black; cursor: pointer; transition: all .2s;}f-element.input-right f-disconnect { right: -35px; left: unset;}f-element f-disconnect:hover { color: #ff3300;}f-element textarea::-webkit-scrollbar { width: 6px;}f-element textarea::-webkit-scrollbar-track { background: #111; } f-element textarea::-webkit-scrollbar-thumb { background: #0177fb; }f-element textarea::-webkit-scrollbar-thumb:hover { background: #1187ff; }f-element.small { height: 18px;}f-element.large { height: 36px;}body.connecting f-node:not(.io-connect) f-element:hover,f-element.select { background-color: rgba(61, 70, 82, 0.98);}f-element.invalid > f-io { zoom: 1 !important;}f-element.invalid::after { font-size: 14px !important; display: flex; justify-content: center; align-items:center; margin: auto; position: absolute; width: 100%; height: 100%; background: #bd0b0b77; vertical-align: middle; color: #fff; content: 'Not Compatible'; opacity: .95; backdrop-filter: grayscale(100%); white-space: nowrap; overflow: hidden; left: 0; top: 0; text-transform: initial;}f-element.invalid > f-inputs,f-element.invalid > f-label { opacity: .1;}f-drop { width: 100%; height: 100%; position: sticky; left: 0; top: 0; background: #02358417; text-align: center; justify-content: center; align-items: center; display: flex; box-shadow: inset 0 0 20px 10px #464ace17; pointer-events: none; transition: all .07s; opacity: 0; visibility: hidden;}f-drop.visible { visibility: unset; opacity: unset; transition: all .23s;}f-drop span { opacity: .5; font-size: 40px; text-shadow: 0px 0px 5px #000; font-weight: bold;}f-tooltip { pointer-events: none;}f-tooltip { position: absolute; left: 0; top: 0; background: rgba(0,0,0,.8); backdrop-filter: blur(4px); font-size: 14px; padding: 7px; left: 50%; border-radius: 10px; transform: translateX(-50%); visibility: hidden; pointer-events: none; opacity: 0; transition: all 0.3s ease; z-index: 150; white-space: nowrap;}f-menu.context,f-menu.search { position: absolute;}f-menu.context { width: 170px; z-index: 110;}f-menu.search { bottom: 85px; left: 50%; transform: translateX(-50%); z-index: 10; width: 300px;}f-menu.context f-list { display: block; margin: 0; background: #171717e6; font-size: 12px; border-radius: 6px; backdrop-filter: blur(6px); border: 1px solid #7e7e7e45; box-shadow: 3px 3px 6px rgba(0,0,0,.2); transition: opacity 0.2s ease, transform 0.1s ease;}f-menu.search f-list { margin: 0 6px 0 6px; display: flex; flex-direction: column-reverse; margin-bottom: 5px;}f-menu.context.hidden { visibility: hidden; opacity: 0;}f-menu.context f-item,f-menu.search f-item { display: block; position: relative; margin: 0; padding: 0; white-space: nowrap;}f-menu.search f-item { opacity: 0;}f-menu.context f-item.submenu::after { content: ""; position: absolute; right: 6px; top: 50%; -webkit-transform: translateY(-50%); transform: translateY(-50%); border: 5px solid transparent; border-left-color: #808080;}f-menu.context f-item:hover > f-menu,f-menu.context f-item.active > f-menu { visibility: unset; transform: unset; opacity: unset;}f-menu.context f-menu { top: 0px; left: calc( 100% - 4px );}f-menu.context f-item button,f-menu.search f-item button { overflow: visible; display: block; width: calc( 100% - 6px ); text-align: left; cursor: pointer; white-space: nowrap; padding: 6px 8px; border-radius: 3px; background: rgba(45, 45, 48, 0.95); border: 0; color: #ddd; margin: 3px; text-shadow: 1px 1px 0px #0007;}f-menu.context f-item button i,f-menu.search f-item button i { float: left; font-size: 16px;}f-menu.context f-item button span,f-menu.search f-item button span { margin-left: 6px;}f-menu.context f-item:hover > button,f-menu.search f-item:hover > button,f-menu.search f-item.active > button { color: #fff; background-color: rgba(61, 70, 82, 0.98);}f-menu.search f-item:hover,f-menu.search f-item.active { opacity: 1 !important;}f-menu.context f-item button:active { outline: solid 1px rgba( 0, 80, 200, 0.98 );}f-menu.context f-item f-tooltip { margin-left: 85px; top: -50px;}f-menu.search f-item { display: none;}f-menu.search f-item:nth-child(1) { opacity: 1; display: unset;}f-menu.search f-item:nth-child(2) { opacity: .8; display: unset;}f-menu.search f-item:nth-child(3) { opacity: .6; display: unset;}f-menu.search f-item:nth-child(4) { opacity: .4; display: unset;}f-menu.search f-item button { border-radius: 14px;}f-tips { right: 10px; top: 10px; position: absolute; z-index: 100; pointer-events: none; display: flex; flex-direction: column;}f-tips f-tip { width: 450px; font-size: 13px; border-radius: 6px; text-align: center; display: block; height: auto; color: #ffffffe0; margin: 4px; padding: 4px; background: #17171794; border: 1px solid #7e7e7e38; line-height: 100%; backdrop-filter: blur(6px); transition: all 0.2s ease; text-transform: initial; opacity: 0;}f-tips f-tip:nth-child(1) { opacity: 1;}f-tips f-tip:nth-child(2) { opacity: .75;}f-tips f-tip:nth-child(3) { opacity: .25;}f-tips f-tip:nth-child(4) { opacity: .1;}f-tips f-tip.error { background: #b900005e;}f-menu.search input { width: calc( 100% - 28px ); height: 41px; position: absolute; z-index: 10; border-radius: 20px; padding-left: 14px; padding-right: 14px; font-size: 15px; background-color: #17171794; border: 1px solid #7e7e7e45; backdrop-filter: blur(6px); box-shadow: 3px 3px 6px rgb(0 0 0 / 20%); text-transform: initial;}f-menu.circle { position: absolute; left: 40px; bottom: 40px; z-index: 100;}f-menu.circle f-item { align-content: space-around; margin-right: 20px;}f-menu.circle f-item button { width: 47px; height: 47px; font-size: 22px; background: #17171794; border-radius: 50%; backdrop-filter: blur(6px); border: 1px solid #7e7e7e45; line-height: 100%; cursor: pointer; box-shadow: 3px 3px 6px rgba(0,0,0,.2);}f-menu.circle f-item f-tooltip { margin-top: -60px;}.f-rounded f-node f-element,.f-rounded f-node f-element.title.left { border-radius: 10px 5px 10px 5px;}.f-rounded f-node f-element input, .f-rounded f-node f-element select,.f-rounded f-node f-element button,.f-rounded f-node f-element textarea,.f-rounded f-node f-element input[type='checkbox'].toggle,.f-rounded f-node f-element input[type='checkbox'].toggle:after { border-radius: 20px 10px;}.f-rounded f-node f-element input { padding-left: 7px; padding-right: 7px;}.f-rounded f-menu.context,.f-rounded f-menu.context f-item button { border-radius: 20px 10px;}@media (hover: hover) and (pointer: fine) { f-node:not(.selected):hover { filter: drop-shadow(0 0 6px #66666630); } f-element f-toolbar { visibility: hidden; opacity: 0; transition: opacity 0.2s ease; } f-node:hover > f-element f-toolbar { visibility: visible; opacity: 1; } f-element f-io:hover { zoom: 1.4; } f-menu.circle f-item button:hover { background-color: #2a2a2a; } f-menu.search input:hover, f-menu.search input:focus { background-color: #1a1a1a; filter: drop-shadow(0 0 6px #66666630); } f-menu.search input:focus { filter: drop-shadow(0 0 8px #4444dd); } f-menu.circle f-item button:hover > f-tooltip, f-menu.context f-item button:hover > f-tooltip { visibility: visible; opacity: 1; } f-menu.circle f-item button:hover > f-tooltip { margin-top: -50px; } f-menu.context f-item button:hover > f-tooltip { top: -30px; } f-menu.circle f-item button:focus > f-tooltip, f-menu.context f-item button:focus > f-tooltip { visibility: hidden; opacity: 0; }}@media (hover: none) and (pointer: coarse) { body.dragging f-canvas, body.connecting f-canvas { overflow: hidden !important; }}f-canvas { will-change: top, left;}f-node { will-change: transform !important;}` );
20
20
 
21
21
  const REVISION = '1';
22
22
 
@@ -114,6 +114,50 @@ class Serializer extends EventTarget {
114
114
 
115
115
  }
116
116
 
117
+ class PointerMonitor {
118
+
119
+ started = false;
120
+
121
+ constructor() {
122
+
123
+ this.x = 0;
124
+ this.y = 0;
125
+
126
+ this._onMoveEvent = ( e ) => {
127
+
128
+ const event = e.touches ? e.touches[ 0 ] : e;
129
+
130
+ this.x = event.x;
131
+ this.y = event.y;
132
+
133
+ };
134
+
135
+ }
136
+
137
+ start() {
138
+
139
+ if ( this.started ) return;
140
+
141
+ this.started = true;
142
+
143
+ window.addEventListener( 'wheel', this._onMoveEvent, true );
144
+
145
+ window.addEventListener( 'mousedown', this._onMoveEvent, true );
146
+ window.addEventListener( 'touchstart', this._onMoveEvent, true );
147
+
148
+ window.addEventListener( 'mousemove', this._onMoveEvent, true );
149
+ window.addEventListener( 'touchmove', this._onMoveEvent, true );
150
+
151
+ window.addEventListener( 'dragover', this._onMoveEvent, true );
152
+
153
+ return this;
154
+
155
+ }
156
+
157
+ }
158
+
159
+ const pointer = new PointerMonitor().start();
160
+
117
161
  const draggableDOM = ( dom, callback = null, className = 'dragging' ) => {
118
162
 
119
163
  let dragData = null;
@@ -259,10 +303,16 @@ const dispatchEventList = ( list, ...params ) => {
259
303
 
260
304
  for ( const callback of list ) {
261
305
 
262
- callback( ...params );
306
+ if ( callback( ...params ) === false ) {
307
+
308
+ return false;
309
+
310
+ }
263
311
 
264
312
  }
265
313
 
314
+ return true;
315
+
266
316
  };
267
317
 
268
318
  const toPX = ( val ) => {
@@ -289,13 +339,14 @@ const toHex = ( val ) => {
289
339
 
290
340
  };
291
341
 
292
- var Utils = /*#__PURE__*/Object.freeze({
342
+ var Utils = /*#__PURE__*/Object.freeze( {
293
343
  __proto__: null,
344
+ pointer: pointer,
294
345
  draggableDOM: draggableDOM,
295
346
  dispatchEventList: dispatchEventList,
296
347
  toPX: toPX,
297
348
  toHex: toHex
298
- });
349
+ } );
299
350
 
300
351
  class Link {
301
352
 
@@ -347,6 +398,8 @@ class Element extends Serializer {
347
398
 
348
399
  super();
349
400
 
401
+ this.isElement = true;
402
+
350
403
  const dom = document.createElement( 'f-element' );
351
404
  dom.element = this;
352
405
 
@@ -370,7 +423,17 @@ class Element extends Serializer {
370
423
 
371
424
  }
372
425
 
373
- selected = element;
426
+ const type = e.type;
427
+
428
+ if ( ( type === 'mouseout' ) && selected === element ) {
429
+
430
+ selected = null;
431
+
432
+ } else {
433
+
434
+ selected = element;
435
+
436
+ }
374
437
 
375
438
  };
376
439
 
@@ -385,6 +448,9 @@ class Element extends Serializer {
385
448
  }
386
449
 
387
450
  dom.addEventListener( 'mouseup', onSelect, true );
451
+ dom.addEventListener( 'mouseover', onSelect );
452
+ dom.addEventListener( 'mouseout', onSelect );
453
+ dom.addEventListener( 'touchmove', onSelect );
388
454
  dom.addEventListener( 'touchend', onSelect );
389
455
 
390
456
  this.inputs = [];
@@ -398,14 +464,15 @@ class Element extends Serializer {
398
464
 
399
465
  this.events = {
400
466
  'connect': [],
401
- 'connectChildren': []
467
+ 'connectChildren': [],
468
+ 'valid': []
402
469
  };
403
470
 
404
471
  this.node = null;
405
472
 
406
473
  this.style = '';
407
474
 
408
- this.extra = null;
475
+ this.objectCallback = null;
409
476
 
410
477
  this.enabledInputs = true;
411
478
 
@@ -418,10 +485,10 @@ class Element extends Serializer {
418
485
  this.lioDOM = this._createIO( 'lio' );
419
486
  this.rioDOM = this._createIO( 'rio' );
420
487
 
421
- this.dom.classList.add( `output-${ Link.InputDirection }` );
488
+ this.dom.classList.add( `input-${ Link.InputDirection }` );
422
489
 
423
- this.dom.appendChild( this.lioDOM );
424
- this.dom.appendChild( this.rioDOM );
490
+ this.dom.append( this.lioDOM );
491
+ this.dom.append( this.rioDOM );
425
492
 
426
493
  this.addEventListener( 'connect', ( ) => {
427
494
 
@@ -437,6 +504,22 @@ class Element extends Serializer {
437
504
 
438
505
  }
439
506
 
507
+ setAttribute( name, value ) {
508
+
509
+ this.dom.setAttribute( name, value );
510
+
511
+ return this;
512
+
513
+ }
514
+
515
+ onValid( callback ) {
516
+
517
+ this.events.valid.push( callback );
518
+
519
+ return this;
520
+
521
+ }
522
+
440
523
  onConnect( callback, childrens = false ) {
441
524
 
442
525
  this.events.connect.push( callback );
@@ -451,17 +534,17 @@ class Element extends Serializer {
451
534
 
452
535
  }
453
536
 
454
- setExtra( value ) {
537
+ setObjectCallback( callback ) {
455
538
 
456
- this.extra = value;
539
+ this.objectCallback = callback;
457
540
 
458
541
  return this;
459
542
 
460
543
  }
461
544
 
462
- getExtra() {
545
+ getObject( output = null ) {
463
546
 
464
- return this.extra;
547
+ return this.objectCallback ? this.objectCallback( output ) : null;
465
548
 
466
549
  }
467
550
 
@@ -485,9 +568,9 @@ class Element extends Serializer {
485
568
 
486
569
  const dom = this.dom;
487
570
 
488
- if ( !this.enabledInputs ) dom.classList.remove( 'inputs-disable');
571
+ if ( ! this.enabledInputs ) dom.classList.remove( 'inputs-disable' );
489
572
 
490
- if ( !value ) dom.classList.add( 'inputs-disable' );
573
+ if ( ! value ) dom.classList.add( 'inputs-disable' );
491
574
 
492
575
  this.enabledInputs = value;
493
576
 
@@ -501,6 +584,14 @@ class Element extends Serializer {
501
584
 
502
585
  }
503
586
 
587
+ setColor( color ) {
588
+
589
+ this.dom.style[ 'background-color' ] = toHex( color );
590
+
591
+ return this;
592
+
593
+ }
594
+
504
595
  setStyle( style ) {
505
596
 
506
597
  const dom = this.dom;
@@ -529,6 +620,20 @@ class Element extends Serializer {
529
620
 
530
621
  }
531
622
 
623
+ setInputColor( color ) {
624
+
625
+ if ( Link.InputDirection === 'left' ) {
626
+
627
+ return this.setLIOColor( color );
628
+
629
+ } else {
630
+
631
+ return this.setRIOColor( color );
632
+
633
+ }
634
+
635
+ }
636
+
532
637
  setOutput( length ) {
533
638
 
534
639
  if ( Link.InputDirection === 'left' ) {
@@ -543,6 +648,20 @@ class Element extends Serializer {
543
648
 
544
649
  }
545
650
 
651
+ setOutputColor( color ) {
652
+
653
+ if ( Link.InputDirection === 'left' ) {
654
+
655
+ return this.setRIOColor( color );
656
+
657
+ } else {
658
+
659
+ return this.setLIOColor( color );
660
+
661
+ }
662
+
663
+ }
664
+
546
665
  get inputLength() {
547
666
 
548
667
  if ( Link.InputDirection === 'left' ) {
@@ -571,6 +690,14 @@ class Element extends Serializer {
571
690
 
572
691
  }
573
692
 
693
+ setLIOColor( color ) {
694
+
695
+ this.lioDOM.style[ 'border-color' ] = toHex( color );
696
+
697
+ return this;
698
+
699
+ }
700
+
574
701
  setLIO( length ) {
575
702
 
576
703
  this.lioLength = length;
@@ -581,6 +708,26 @@ class Element extends Serializer {
581
708
 
582
709
  }
583
710
 
711
+ getLIOColor() {
712
+
713
+ return this.lioDOM.style[ 'border-color' ];
714
+
715
+ }
716
+
717
+ setRIOColor( color ) {
718
+
719
+ this.rioDOM.style[ 'border-color' ] = toHex( color );
720
+
721
+ return this;
722
+
723
+ }
724
+
725
+ getRIOColor() {
726
+
727
+ return this.rioDOM.style[ 'border-color' ];
728
+
729
+ }
730
+
584
731
  setRIO( length ) {
585
732
 
586
733
  this.rioLength = length;
@@ -597,7 +744,7 @@ class Element extends Serializer {
597
744
 
598
745
  input.element = this;
599
746
 
600
- this.inputsDOM.appendChild( input.dom );
747
+ this.inputsDOM.append( input.dom );
601
748
 
602
749
  return this;
603
750
 
@@ -629,6 +776,12 @@ class Element extends Serializer {
629
776
 
630
777
  if ( element !== null ) {
631
778
 
779
+ if ( dispatchEventList( this.events.valid, this, element, 'connect' ) === false ) {
780
+
781
+ return false;
782
+
783
+ }
784
+
632
785
  const link = new Link( this, element );
633
786
 
634
787
  this.links.push( link );
@@ -638,7 +791,7 @@ class Element extends Serializer {
638
791
  this.disconnectDOM = document.createElement( 'f-disconnect' );
639
792
  this.disconnectDOM.innerHTML = Styles.icons.unlink ? `<i class='${ Styles.icons.unlink }'></i>` : '✖';
640
793
 
641
- this.dom.appendChild( this.disconnectDOM );
794
+ this.dom.append( this.disconnectDOM );
642
795
 
643
796
  const onDisconnect = () => {
644
797
 
@@ -659,7 +812,7 @@ class Element extends Serializer {
659
812
 
660
813
  };
661
814
 
662
- const onConnect = ( e ) => {
815
+ const onConnect = () => {
663
816
 
664
817
  this.dispatchEvent( new Event( 'connectChildren' ) );
665
818
 
@@ -682,6 +835,7 @@ class Element extends Serializer {
682
835
  this.disconnectDOM.addEventListener( 'mousedown', onClick, true );
683
836
  this.disconnectDOM.addEventListener( 'touchstart', onClick, true );
684
837
  this.disconnectDOM.addEventListener( 'disconnect', onDisconnect, true );
838
+
685
839
  element.addEventListener( 'connect', onConnect );
686
840
  element.addEventListener( 'connectChildren', onConnect );
687
841
  element.addEventListener( 'nodeConnect', onConnect );
@@ -694,7 +848,7 @@ class Element extends Serializer {
694
848
 
695
849
  this.dispatchEvent( new Event( 'connect' ) );
696
850
 
697
- return this;
851
+ return true;
698
852
 
699
853
  }
700
854
 
@@ -802,23 +956,23 @@ class Element extends Serializer {
802
956
 
803
957
  }
804
958
 
805
- get linkedExtra() {
959
+ getLinkedObject( output = null ) {
806
960
 
807
- const linkedElement = this.linkedElement;
961
+ const linkedElement = this.getLinkedElement();
808
962
 
809
- return linkedElement ? linkedElement.getExtra() : null;
963
+ return linkedElement ? linkedElement.getObject( output ) : null;
810
964
 
811
965
  }
812
966
 
813
- get linkedElement() {
967
+ getLinkedElement() {
814
968
 
815
- const link = this.link;
969
+ const link = this.getLink();
816
970
 
817
971
  return link ? link.outputElement : null;
818
972
 
819
973
  }
820
974
 
821
- get link() {
975
+ getLink() {
822
976
 
823
977
  return this.links[ 0 ];
824
978
 
@@ -850,31 +1004,66 @@ class Element extends Serializer {
850
1004
  const defaultOutput = Link.InputDirection === 'left' ? 'lio' : 'rio';
851
1005
 
852
1006
  const link = type === defaultOutput ? new Link( this ) : new Link( null, this );
1007
+ const previewLink = new Link( link.inputElement, link.outputElement );
853
1008
 
854
1009
  this.links.push( link );
855
1010
 
856
1011
  draggableDOM( e, ( data ) => {
857
1012
 
858
- if ( data.dragging === false ) {
1013
+ if ( previewLink.outputElement )
1014
+ previewLink.outputElement.dom.classList.remove( 'invalid' );
859
1015
 
860
- nodeDOM.classList.remove( 'io-connect' );
1016
+ if ( previewLink.inputElement )
1017
+ previewLink.inputElement.dom.classList.remove( 'invalid' );
861
1018
 
862
- ioDOM.classList.remove( 'connect' );
863
- dom.classList.remove( 'select' );
1019
+ previewLink.inputElement = link.inputElement;
1020
+ previewLink.outputElement = link.outputElement;
864
1021
 
865
- this.links.splice( this.links.indexOf( link ), 1 );
1022
+ if ( type === defaultOutput ) {
1023
+
1024
+ previewLink.outputElement = selected;
866
1025
 
867
- if ( selected !== null ) {
1026
+ } else {
868
1027
 
869
- if ( type === defaultOutput ) {
1028
+ previewLink.inputElement = selected;
870
1029
 
871
- link.outputElement = selected;
1030
+ }
872
1031
 
873
- } else {
1032
+ const isInvalid = previewLink.inputElement !== null && previewLink.outputElement !== null &&
1033
+ previewLink.inputElement.inputLength > 0 && previewLink.outputElement.outputLength > 0 &&
1034
+ dispatchEventList( previewLink.inputElement.events.valid, previewLink.inputElement, previewLink.outputElement, data.dragging ? 'dragging' : 'dragged' ) === false;
874
1035
 
875
- link.inputElement = selected;
1036
+ if ( data.dragging && isInvalid ) {
876
1037
 
877
- }
1038
+ if ( type === defaultOutput ) {
1039
+
1040
+ if ( previewLink.outputElement )
1041
+ previewLink.outputElement.dom.classList.add( 'invalid' );
1042
+
1043
+ } else {
1044
+
1045
+ if ( previewLink.inputElement )
1046
+ previewLink.inputElement.dom.classList.add( 'invalid' );
1047
+
1048
+ }
1049
+
1050
+ return;
1051
+
1052
+ }
1053
+
1054
+ if ( ! data.dragging ) {
1055
+
1056
+ nodeDOM.classList.remove( 'io-connect' );
1057
+
1058
+ ioDOM.classList.remove( 'connect' );
1059
+ dom.classList.remove( 'select' );
1060
+
1061
+ this.links.splice( this.links.indexOf( link ), 1 );
1062
+
1063
+ if ( selected !== null && ! isInvalid ) {
1064
+
1065
+ link.inputElement = previewLink.inputElement;
1066
+ link.outputElement = previewLink.outputElement;
878
1067
 
879
1068
  // check if is an is circular link
880
1069
 
@@ -909,20 +1098,22 @@ class Element extends Serializer {
909
1098
 
910
1099
  }
911
1100
 
912
- Element.prototype.isElement = true;
913
-
914
1101
  class Input extends Serializer {
915
1102
 
916
1103
  constructor( dom ) {
917
1104
 
918
1105
  super();
919
1106
 
1107
+ this.isInput = true;
1108
+
920
1109
  this.dom = dom;
921
1110
 
922
1111
  this.element = null;
923
1112
 
924
1113
  this.extra = null;
925
1114
 
1115
+ this.tagColor = null;
1116
+
926
1117
  this.events = {
927
1118
  'change': [],
928
1119
  'click': []
@@ -956,12 +1147,28 @@ class Input extends Serializer {
956
1147
 
957
1148
  }
958
1149
 
1150
+ setTagColor( color ) {
1151
+
1152
+ this.tagColor = color;
1153
+
1154
+ this.dom.style[ 'border-left' ] = `2px solid ${color}`;
1155
+
1156
+ return this;
1157
+
1158
+ }
1159
+
1160
+ getTagColor() {
1161
+
1162
+ return this.tagColor;
1163
+
1164
+ }
1165
+
959
1166
  setToolTip( text ) {
960
1167
 
961
1168
  const div = document.createElement( 'f-tooltip' );
962
1169
  div.innerText = text;
963
1170
 
964
- this.dom.appendChild( div );
1171
+ this.dom.append( div );
965
1172
 
966
1173
  return this;
967
1174
 
@@ -983,6 +1190,20 @@ class Input extends Serializer {
983
1190
 
984
1191
  }
985
1192
 
1193
+ setReadOnly( value ) {
1194
+
1195
+ this.dom.readOnly = value;
1196
+
1197
+ return this;
1198
+
1199
+ }
1200
+
1201
+ getReadOnly() {
1202
+
1203
+ return this.dom.readOnly;
1204
+
1205
+ }
1206
+
986
1207
  setValue( value, dispatch = true ) {
987
1208
 
988
1209
  this.dom.value = value;
@@ -1013,14 +1234,14 @@ class Input extends Serializer {
1013
1234
 
1014
1235
  }
1015
1236
 
1016
- Input.prototype.isInput = true;
1017
-
1018
1237
  class Node extends Serializer {
1019
1238
 
1020
1239
  constructor() {
1021
1240
 
1022
1241
  super();
1023
1242
 
1243
+ this.isNode = true;
1244
+
1024
1245
  const dom = document.createElement( 'f-node' );
1025
1246
 
1026
1247
  const onDown = () => {
@@ -1161,7 +1382,7 @@ class Node extends Serializer {
1161
1382
  element.addEventListener( 'connect', this._onConnect );
1162
1383
  element.addEventListener( 'connectChildren', this._onConnectChildren );
1163
1384
 
1164
- this.dom.appendChild( element.dom );
1385
+ this.dom.append( element.dom );
1165
1386
 
1166
1387
  return this;
1167
1388
 
@@ -1233,7 +1454,7 @@ class Node extends Serializer {
1233
1454
 
1234
1455
  serialize( data ) {
1235
1456
 
1236
- const { x, y, style } = this.getPosition();
1457
+ const { x, y } = this.getPosition();
1237
1458
 
1238
1459
  const elements = [];
1239
1460
 
@@ -1248,9 +1469,9 @@ class Node extends Serializer {
1248
1469
  data.width = this.getWidth();
1249
1470
  data.elements = elements;
1250
1471
 
1251
- if ( style !== '' ) {
1472
+ if ( this.style !== '' ) {
1252
1473
 
1253
- data.style = style;
1474
+ data.style = this.style;
1254
1475
 
1255
1476
  }
1256
1477
 
@@ -1293,8 +1514,6 @@ class Node extends Serializer {
1293
1514
 
1294
1515
  }
1295
1516
 
1296
- Node.prototype.isNode = true;
1297
-
1298
1517
  class DraggableElement extends Element {
1299
1518
 
1300
1519
  constructor( draggable = true ) {
@@ -1347,9 +1566,9 @@ class TitleElement extends DraggableElement {
1347
1566
  this.iconDOM = iconDOM;
1348
1567
  this.toolbarDOM = toolbarDOM;
1349
1568
 
1350
- dom.appendChild( spanDOM );
1351
- dom.appendChild( iconDOM );
1352
- dom.appendChild( toolbarDOM );
1569
+ dom.append( spanDOM );
1570
+ dom.append( iconDOM );
1571
+ dom.append( toolbarDOM );
1353
1572
 
1354
1573
  }
1355
1574
 
@@ -1385,7 +1604,7 @@ class TitleElement extends DraggableElement {
1385
1604
 
1386
1605
  this.buttons.push( button );
1387
1606
 
1388
- this.toolbarDOM.appendChild( button.dom );
1607
+ this.toolbarDOM.append( button.dom );
1389
1608
 
1390
1609
  return this;
1391
1610
 
@@ -1424,9 +1643,11 @@ class TitleElement extends DraggableElement {
1424
1643
 
1425
1644
  }
1426
1645
 
1427
- const drawLine = ( p1x, p1y, p2x, p2y, invert, size, color, ctx ) => {
1646
+ const drawLine = ( p1x, p1y, p2x, p2y, invert, size, colorA, ctx, colorB = null ) => {
1428
1647
 
1429
- const offset = 100 * ( invert ? - 1 : 1 );
1648
+ const dx = p2x - p1x;
1649
+ const dy = p2y - p1y;
1650
+ const offset = Math.sqrt( ( dx * dx ) + ( dy * dy ) ) * ( invert ? - .3 : .3 );
1430
1651
 
1431
1652
  ctx.beginPath();
1432
1653
 
@@ -1438,8 +1659,21 @@ const drawLine = ( p1x, p1y, p2x, p2y, invert, size, color, ctx ) => {
1438
1659
  p2x, p2y
1439
1660
  );
1440
1661
 
1662
+ if ( colorB !== null && colorA !== colorB ) {
1663
+
1664
+ const gradient = ctx.createLinearGradient( p1x, p1y, p2x, p2y );
1665
+ gradient.addColorStop( 0, colorA );
1666
+ gradient.addColorStop( 1, colorB );
1667
+
1668
+ ctx.strokeStyle = gradient;
1669
+
1670
+ } else {
1671
+
1672
+ ctx.strokeStyle = colorA;
1673
+
1674
+ }
1675
+
1441
1676
  ctx.lineWidth = size;
1442
- ctx.strokeStyle = color;
1443
1677
  ctx.stroke();
1444
1678
 
1445
1679
  };
@@ -1514,11 +1748,11 @@ class Canvas extends Serializer {
1514
1748
 
1515
1749
  dropDOM.innerHTML = '<span>drop your file</span>';
1516
1750
 
1517
- dom.appendChild( dropDOM );
1518
- dom.appendChild( canvas );
1519
- dom.appendChild( frontCanvas );
1520
- dom.appendChild( contentDOM );
1521
- dom.appendChild( areaDOM );
1751
+ dom.append( dropDOM );
1752
+ dom.append( canvas );
1753
+ dom.append( frontCanvas );
1754
+ dom.append( contentDOM );
1755
+ dom.append( areaDOM );
1522
1756
  /*
1523
1757
  let zoomTouchData = null;
1524
1758
 
@@ -1790,11 +2024,13 @@ class Canvas extends Serializer {
1790
2024
 
1791
2025
  add( node ) {
1792
2026
 
2027
+ if ( node.canvas === this ) return;
2028
+
1793
2029
  this.nodes.push( node );
1794
2030
 
1795
2031
  node.canvas = this;
1796
2032
 
1797
- this.contentDOM.appendChild( node.dom );
2033
+ this.contentDOM.append( node.dom );
1798
2034
 
1799
2035
  return this;
1800
2036
 
@@ -1818,6 +2054,8 @@ class Canvas extends Serializer {
1818
2054
 
1819
2055
  this.contentDOM.removeChild( node.dom );
1820
2056
 
2057
+ node.dispatchEvent( new Event( 'remove' ) );
2058
+
1821
2059
  return this;
1822
2060
 
1823
2061
  }
@@ -1842,9 +2080,17 @@ class Canvas extends Serializer {
1842
2080
 
1843
2081
  for ( const link of links ) {
1844
2082
 
1845
- if ( link.outputElement && link.outputElement.node === node ) {
2083
+ if ( link.inputElement && link.outputElement ) {
2084
+
2085
+ if ( link.inputElement.node === node ) {
2086
+
2087
+ link.inputElement.connect();
2088
+
2089
+ } else if ( link.outputElement.node === node ) {
1846
2090
 
1847
- link.inputElement.connect();
2091
+ link.inputElement.connect();
2092
+
2093
+ }
1848
2094
 
1849
2095
  }
1850
2096
 
@@ -1989,24 +2235,36 @@ class Canvas extends Serializer {
1989
2235
 
1990
2236
  if ( draggingLink || length === 1 ) {
1991
2237
 
2238
+ let colorA = null,
2239
+ colorB = null;
2240
+
1992
2241
  if ( draggingLink === 'rio' ) {
1993
2242
 
2243
+ colorA = colorB = lioElement.getRIOColor();
2244
+
1994
2245
  aPos.x += offsetIORadius;
1995
2246
  bPos.x /= zoom;
1996
2247
  bPos.y /= zoom;
1997
2248
 
1998
2249
  } else if ( draggingLink === 'lio' ) {
1999
2250
 
2251
+ colorA = colorB = rioElement.getLIOColor();
2252
+
2000
2253
  bPos.x -= offsetIORadius;
2001
2254
  aPos.x /= zoom;
2002
2255
  aPos.y /= zoom;
2003
2256
 
2257
+ } else {
2258
+
2259
+ colorA = lioElement.getRIOColor();
2260
+ colorB = rioElement.getLIOColor();
2261
+
2004
2262
  }
2005
2263
 
2006
2264
  drawLine(
2007
2265
  aPos.x * zoom, aPos.y * zoom,
2008
2266
  bPos.x * zoom, bPos.y * zoom,
2009
- false, 2, '#ffffff', drawContext
2267
+ false, 2, colorA || '#ffffff', drawContext, colorB || '#ffffff'
2010
2268
  );
2011
2269
 
2012
2270
  } else {
@@ -2022,19 +2280,22 @@ class Canvas extends Serializer {
2022
2280
  const rioLength = Math.min( lioElement.rioLength, length );
2023
2281
  const lioLength = Math.min( rioElement.lioLength, length );
2024
2282
 
2283
+ const colorA = lioElement.getRIOColor() || color;
2284
+ const colorB = rioElement.getLIOColor() || color;
2285
+
2025
2286
  const aCenterY = ( ( rioLength * marginY ) * .5 ) - ( marginY / 2 );
2026
2287
  const bCenterY = ( ( lioLength * marginY ) * .5 ) - ( marginY / 2 );
2027
2288
 
2028
2289
  const aIndex = Math.min( i, rioLength - 1 );
2029
2290
  const bIndex = Math.min( i, lioLength - 1 );
2030
2291
 
2031
- const aPosY = aIndex * marginY;
2032
- const bPosY = bIndex * marginY;
2292
+ const aPosY = ( aIndex * marginY ) - 1;
2293
+ const bPosY = ( bIndex * marginY ) - 1;
2033
2294
 
2034
2295
  drawLine(
2035
2296
  aPos.x * zoom, ( ( aPos.y + aPosY ) - aCenterY ) * zoom,
2036
2297
  bPos.x * zoom, ( ( bPos.y + bPosY ) - bCenterY ) * zoom,
2037
- false, 2, color, drawContext
2298
+ false, 2, colorA, drawContext, colorB
2038
2299
  );
2039
2300
 
2040
2301
  }
@@ -2093,10 +2354,10 @@ class ButtonInput extends Input {
2093
2354
  const dom = document.createElement( 'button' );
2094
2355
 
2095
2356
  const spanDOM = document.createElement( 'span' );
2096
- dom.appendChild( spanDOM );
2357
+ dom.append( spanDOM );
2097
2358
 
2098
2359
  const iconDOM = document.createElement( 'i' );
2099
- dom.appendChild( iconDOM );
2360
+ dom.append( iconDOM );
2100
2361
 
2101
2362
  super( dom );
2102
2363
 
@@ -2149,14 +2410,15 @@ class ButtonInput extends Input {
2149
2410
 
2150
2411
  class ObjectNode extends Node {
2151
2412
 
2152
- constructor( name, inputLength, extra = null, width = 300 ) {
2413
+ constructor( name, inputLength, callback = null, width = 300 ) {
2153
2414
 
2154
2415
  super();
2155
2416
 
2156
2417
  this.setWidth( width );
2157
2418
 
2158
2419
  const title = new TitleElement( name )
2159
- .setExtra( extra )
2420
+ .setObjectCallback( callback )
2421
+ .setSerializable( false )
2160
2422
  .setOutput( inputLength );
2161
2423
 
2162
2424
  const closeButton = new ButtonInput( Styles.icons.close || '✕' ).onClick( () => {
@@ -2174,17 +2436,43 @@ class ObjectNode extends Node {
2174
2436
 
2175
2437
  }
2176
2438
 
2177
- setExtra( value ) {
2439
+ setName( value ) {
2440
+
2441
+ this.title.setTitle( value );
2442
+
2443
+ return this;
2178
2444
 
2179
- this.title.setExtra( value );
2445
+ }
2446
+
2447
+ getName() {
2448
+
2449
+ return this.title.getTitle();
2450
+
2451
+ }
2452
+
2453
+ setObjectCallback( callback ) {
2454
+
2455
+ this.title.setObjectCallback( callback );
2180
2456
 
2181
2457
  return this;
2182
2458
 
2183
2459
  }
2184
2460
 
2185
- getExtra( value ) {
2461
+ getObject( callback ) {
2462
+
2463
+ return this.title.getObject( callback );
2464
+
2465
+ }
2466
+
2467
+ setColor( color ) {
2468
+
2469
+ return this.title.setColor( color );
2470
+
2471
+ }
2472
+
2473
+ setOutputColor( color ) {
2186
2474
 
2187
- return this.title.getExtra();
2475
+ return this.title.setOutputColor( color );
2188
2476
 
2189
2477
  }
2190
2478
 
@@ -2327,6 +2615,14 @@ class NumberInput extends Input {
2327
2615
 
2328
2616
  }
2329
2617
 
2618
+ setStep( step ) {
2619
+
2620
+ this.step = step;
2621
+
2622
+ return this;
2623
+
2624
+ }
2625
+
2330
2626
  setRange( min, max, step ) {
2331
2627
 
2332
2628
  this.min = min;
@@ -2393,7 +2689,7 @@ class NumberInput extends Input {
2393
2689
 
2394
2690
  _getString( value ) {
2395
2691
 
2396
- let num = Math.min( Math.max( Number( value ), this.min ), this.max );
2692
+ const num = Math.min( Math.max( Number( value ), this.min ), this.max );
2397
2693
 
2398
2694
  if ( this.integer === true ) {
2399
2695
 
@@ -2452,8 +2748,8 @@ class SliderInput extends Input {
2452
2748
 
2453
2749
  } );
2454
2750
 
2455
- dom.appendChild( rangeDOM );
2456
- dom.appendChild( field.dom );
2751
+ dom.append( rangeDOM );
2752
+ dom.append( field.dom );
2457
2753
 
2458
2754
  this.rangeDOM = rangeDOM;
2459
2755
  this.field = field;
@@ -2577,7 +2873,7 @@ class ColorInput extends Input {
2577
2873
 
2578
2874
  getValue() {
2579
2875
 
2580
- return parseInt( super.getValue().substr( 1 ), 16 );
2876
+ return parseInt( super.getValue().slice( 1 ), 16 );
2581
2877
 
2582
2878
  }
2583
2879
 
@@ -2625,11 +2921,13 @@ class LabelElement extends Element {
2625
2921
  this.spanDOM = spanDOM;
2626
2922
  this.iconDOM = iconDOM;
2627
2923
 
2628
- this.labelDOM.appendChild( this.spanDOM );
2629
- this.labelDOM.appendChild( this.iconDOM );
2924
+ this.labelDOM.append( this.spanDOM );
2925
+ this.labelDOM.append( this.iconDOM );
2630
2926
 
2631
- this.dom.appendChild( this.labelDOM );
2632
- this.dom.appendChild( this.inputsDOM );
2927
+ this.dom.append( this.labelDOM );
2928
+ this.dom.append( this.inputsDOM );
2929
+
2930
+ this.serializeLabel = false;
2633
2931
 
2634
2932
  this.setLabel( label );
2635
2933
  this.setAlign( align );
@@ -2672,14 +2970,18 @@ class LabelElement extends Element {
2672
2970
 
2673
2971
  super.serialize( data );
2674
2972
 
2675
- const label = this.getLabel();
2676
- const icon = this.getIcon();
2973
+ if ( this.serializeLabel ) {
2677
2974
 
2678
- data.label = label;
2975
+ const label = this.getLabel();
2976
+ const icon = this.getIcon();
2679
2977
 
2680
- if ( icon !== '' ) {
2978
+ data.label = label;
2681
2979
 
2682
- data.icon = icon;
2980
+ if ( icon !== '' ) {
2981
+
2982
+ data.icon = icon;
2983
+
2984
+ }
2683
2985
 
2684
2986
  }
2685
2987
 
@@ -2689,11 +2991,15 @@ class LabelElement extends Element {
2689
2991
 
2690
2992
  super.deserialize( data );
2691
2993
 
2692
- this.setLabel( data.label );
2994
+ if ( this.serializeLabel ) {
2693
2995
 
2694
- if ( data.icon !== undefined ) {
2996
+ this.setLabel( data.label );
2695
2997
 
2696
- this.setIcon( data.icon );
2998
+ if ( data.icon !== undefined ) {
2999
+
3000
+ this.setIcon( data.icon );
3001
+
3002
+ }
2697
3003
 
2698
3004
  }
2699
3005
 
@@ -2824,51 +3130,151 @@ class PanelNode extends Node {
2824
3130
 
2825
3131
  class Menu extends EventTarget {
2826
3132
 
2827
- constructor( className, target = null ) {
3133
+ constructor( className ) {
2828
3134
 
2829
3135
  super();
2830
3136
 
2831
3137
  const dom = document.createElement( 'f-menu' );
2832
3138
  dom.className = className + ' hidden';
2833
3139
 
3140
+ const listDOM = document.createElement( 'f-list' );
3141
+
3142
+ dom.append( listDOM );
3143
+
2834
3144
  this.dom = dom;
3145
+ this.listDOM = listDOM;
2835
3146
 
2836
3147
  this.visible = false;
2837
3148
 
2838
3149
  this.subMenus = new WeakMap();
2839
3150
  this.domButtons = new WeakMap();
2840
3151
 
2841
- this.events = {
2842
- 'context': []
2843
- };
3152
+ this.buttons = [];
2844
3153
 
2845
- this.addEventListener( 'context', ( ) => {
3154
+ this.events = {};
2846
3155
 
2847
- dispatchEventList( this.events.context, this );
3156
+ }
2848
3157
 
2849
- } );
3158
+ onContext( callback ) {
2850
3159
 
2851
- this._lastButtonClick = null;
3160
+ this.events.context.push( callback );
2852
3161
 
2853
- this._onButtonClick = ( e = null ) => {
3162
+ return this;
2854
3163
 
2855
- const button = e ? e.target : null;
3164
+ }
2856
3165
 
2857
- if ( this._lastButtonClick ) {
3166
+ show() {
2858
3167
 
2859
- this._lastButtonClick.dom.parentElement.classList.remove( 'active' );
3168
+ this.dom.classList.remove( 'hidden' );
2860
3169
 
2861
- }
3170
+ this.visible = true;
2862
3171
 
2863
- this._lastButtonClick = button;
3172
+ this.dispatchEvent( new Event( 'show' ) );
2864
3173
 
2865
- if ( button ) {
3174
+ return this;
2866
3175
 
2867
- if ( this.subMenus.has( button ) ) {
3176
+ }
2868
3177
 
2869
- this.subMenus.get( button )._onButtonClick();
3178
+ hide() {
2870
3179
 
2871
- }
3180
+ this.dom.classList.add( 'hidden' );
3181
+
3182
+ this.dispatchEvent( new Event( 'hide' ) );
3183
+
3184
+ this.visible = false;
3185
+
3186
+ }
3187
+
3188
+ add( button, submenu = null ) {
3189
+
3190
+ const liDOM = document.createElement( 'f-item' );
3191
+
3192
+ if ( submenu !== null ) {
3193
+
3194
+ liDOM.classList.add( 'submenu' );
3195
+
3196
+ liDOM.append( submenu.dom );
3197
+
3198
+ this.subMenus.set( button, submenu );
3199
+
3200
+ button.dom.addEventListener( 'mouseover', () => submenu.show() );
3201
+ button.dom.addEventListener( 'mouseout', () => submenu.hide() );
3202
+
3203
+ }
3204
+
3205
+ liDOM.append( button.dom );
3206
+
3207
+ this.buttons.push( button );
3208
+
3209
+ this.listDOM.append( liDOM );
3210
+
3211
+ this.domButtons.set( button, liDOM );
3212
+
3213
+ return this;
3214
+
3215
+ }
3216
+
3217
+ clear() {
3218
+
3219
+ this.buttons = [];
3220
+
3221
+ this.subMenus = new WeakMap();
3222
+ this.domButtons = new WeakMap();
3223
+
3224
+ while ( this.listDOM.firstChild ) {
3225
+
3226
+ this.listDOM.firstChild.remove();
3227
+
3228
+ }
3229
+
3230
+ }
3231
+
3232
+ }
3233
+
3234
+ let lastContext = null;
3235
+
3236
+ const onCloseLastContext = ( e ) => {
3237
+
3238
+ if ( lastContext && lastContext.visible === true && e.target.closest( 'f-menu.context' ) === null ) {
3239
+
3240
+ lastContext.hide();
3241
+
3242
+ }
3243
+
3244
+ };
3245
+
3246
+ document.body.addEventListener( 'mousedown', onCloseLastContext, true );
3247
+ document.body.addEventListener( 'touchstart', onCloseLastContext, true );
3248
+
3249
+ class ContextMenu extends Menu {
3250
+
3251
+ constructor( target = null ) {
3252
+
3253
+ super( 'context', target );
3254
+
3255
+ this.events.context = [];
3256
+
3257
+ this._lastButtonClick = null;
3258
+
3259
+ this._onButtonClick = ( e = null ) => {
3260
+
3261
+ const button = e ? e.target : null;
3262
+
3263
+ if ( this._lastButtonClick ) {
3264
+
3265
+ this._lastButtonClick.dom.parentElement.classList.remove( 'active' );
3266
+
3267
+ }
3268
+
3269
+ this._lastButtonClick = button;
3270
+
3271
+ if ( button ) {
3272
+
3273
+ if ( this.subMenus.has( button ) ) {
3274
+
3275
+ this.subMenus.get( button )._onButtonClick();
3276
+
3277
+ }
2872
3278
 
2873
3279
  button.dom.parentElement.classList.add( 'active' );
2874
3280
 
@@ -2888,45 +3294,50 @@ class Menu extends EventTarget {
2888
3294
 
2889
3295
  };
2890
3296
 
3297
+ this.addEventListener( 'context', ( ) => {
3298
+
3299
+ dispatchEventList( this.events.context, this );
3300
+
3301
+ } );
3302
+
2891
3303
  this.setTarget( target );
2892
3304
 
2893
3305
  }
2894
3306
 
2895
- onContext( callback ) {
3307
+ openFrom( dom ) {
2896
3308
 
2897
- this.events.context.push( callback );
3309
+ const rect = dom.getBoundingClientRect();
2898
3310
 
2899
- return this;
3311
+ return this.open( rect.x + ( rect.width / 2 ), rect.y + ( rect.height / 2 ) );
2900
3312
 
2901
3313
  }
2902
3314
 
2903
- show( x = null, y = null ) {
3315
+ open( x = pointer.x, y = pointer.y ) {
2904
3316
 
2905
- this._onButtonClick();
2906
-
2907
- if ( x !== null && y !== null ) {
3317
+ if ( lastContext !== null ) {
2908
3318
 
2909
- this.setPosition( x, y );
3319
+ lastContext.hide();
2910
3320
 
2911
3321
  }
2912
3322
 
2913
- this.dom.classList.remove( 'hidden' );
3323
+ lastContext = this;
2914
3324
 
2915
- this.visible = true;
3325
+ this.setPosition( x, y );
2916
3326
 
2917
- this.dispatchEvent( new Event( 'show' ) );
3327
+ document.body.append( this.dom );
2918
3328
 
2919
- return this;
3329
+ return this.show();
2920
3330
 
2921
3331
  }
2922
3332
 
2923
- hide() {
3333
+ setPosition( x, y ) {
2924
3334
 
2925
- this.dom.classList.add( 'hidden' );
3335
+ const dom = this.dom;
2926
3336
 
2927
- this.dispatchEvent( new Event( 'hide' ) );
3337
+ dom.style.left = toPX( x );
3338
+ dom.style.top = toPX( y );
2928
3339
 
2929
- this.visible = false;
3340
+ return this;
2930
3341
 
2931
3342
  }
2932
3343
 
@@ -2940,72 +3351,143 @@ class Menu extends EventTarget {
2940
3351
 
2941
3352
  if ( e.pointerType !== 'mouse' || ( e.pageX === 0 && e.pageY === 0 ) ) return;
2942
3353
 
2943
- const rect = this.target.getBoundingClientRect();
2944
-
2945
3354
  this.dispatchEvent( new Event( 'context' ) );
2946
3355
 
2947
- this.show( e.pageX - rect.left, e.pageY - rect.top );
3356
+ this.open();
2948
3357
 
2949
3358
  };
2950
3359
 
2951
- const onDown = ( e ) => {
2952
-
2953
- if ( this.visible === true && e.target.closest( 'f-menu' ) === null ) {
3360
+ this.target = target;
2954
3361
 
2955
- this.hide();
3362
+ target.addEventListener( 'contextmenu', onContextMenu, false );
2956
3363
 
2957
- }
3364
+ }
2958
3365
 
2959
- };
3366
+ return this;
2960
3367
 
2961
- this.target = target;
3368
+ }
2962
3369
 
2963
- target.addEventListener( 'mousedown', onDown, true );
2964
- target.addEventListener( 'touchstart', onDown, true );
3370
+ show() {
2965
3371
 
2966
- target.addEventListener( 'contextmenu', onContextMenu, false );
3372
+ if ( ! this.opened ) {
2967
3373
 
2968
- target.appendChild( this.dom );
3374
+ this.dom.style.left = '';
3375
+ this.dom.style.transform = '';
2969
3376
 
2970
3377
  }
2971
3378
 
2972
- return this;
3379
+ const domRect = this.dom.getBoundingClientRect();
2973
3380
 
2974
- }
3381
+ let offsetX = Math.min( window.innerWidth - ( domRect.x + domRect.width + 10 ), 0 );
3382
+ let offsetY = Math.min( window.innerHeight - ( domRect.y + domRect.height + 10 ), 0 );
2975
3383
 
2976
- add( button, submenu = null ) {
3384
+ if ( this.opened ) {
2977
3385
 
2978
- const liDOM = document.createElement( 'f-item' );
3386
+ if ( offsetX < 0 ) offsetX = - domRect.width;
3387
+ if ( offsetY < 0 ) offsetY = - domRect.height;
2979
3388
 
2980
- if ( submenu !== null ) {
3389
+ this.setPosition( domRect.x + offsetX, domRect.y + offsetY );
2981
3390
 
2982
- liDOM.classList.add( 'submenu' );
3391
+ } else {
2983
3392
 
2984
- liDOM.appendChild( submenu.dom );
3393
+ // flip submenus
2985
3394
 
2986
- this.subMenus.set( button, submenu );
3395
+ if ( offsetX < 0 ) this.dom.style.left = '-100%';
3396
+ if ( offsetY < 0 ) this.dom.style.transform = 'translateY( calc( 32px - 100% ) )';
3397
+
3398
+ }
3399
+
3400
+ return super.show();
3401
+
3402
+ }
3403
+
3404
+ hide() {
3405
+
3406
+ if ( this.opened ) {
3407
+
3408
+ lastContext = null;
2987
3409
 
2988
3410
  }
2989
3411
 
2990
- liDOM.appendChild( button.dom );
3412
+ return super.hide();
3413
+
3414
+ }
3415
+
3416
+ add( button, submenu = null ) {
2991
3417
 
2992
3418
  button.addEventListener( 'click', this._onButtonClick );
2993
3419
  button.addEventListener( 'mouseover', this._onButtonMouseOver );
2994
3420
 
2995
- this.dom.appendChild( liDOM );
3421
+ return super.add( button, submenu );
2996
3422
 
2997
- this.domButtons.set( liDOM, button );
3423
+ }
2998
3424
 
2999
- return this;
3425
+ get opened() {
3426
+
3427
+ return lastContext === this;
3000
3428
 
3001
3429
  }
3002
3430
 
3003
- setPosition( x, y ) {
3431
+ }
3004
3432
 
3005
- const dom = this.dom;
3433
+ class CircleMenu extends Menu {
3006
3434
 
3007
- dom.style.left = toPX( x );
3008
- dom.style.top = toPX( y );
3435
+ constructor( target = null ) {
3436
+
3437
+ super( 'circle', target );
3438
+
3439
+ }
3440
+
3441
+ }
3442
+
3443
+ class Tips extends EventTarget {
3444
+
3445
+ constructor() {
3446
+
3447
+ super();
3448
+
3449
+ const dom = document.createElement( 'f-tips' );
3450
+
3451
+ this.dom = dom;
3452
+
3453
+ this.time = 0;
3454
+ this.duration = 3000;
3455
+
3456
+ }
3457
+
3458
+ message( str ) {
3459
+
3460
+ return this.tip( str );
3461
+
3462
+ }
3463
+
3464
+ error( str ) {
3465
+
3466
+ return this.tip( str, 'error' );
3467
+
3468
+ }
3469
+
3470
+ tip( html, className = '' ) {
3471
+
3472
+ const dom = document.createElement( 'f-tip' );
3473
+ dom.className = className;
3474
+ dom.innerHTML = html;
3475
+
3476
+ this.dom.prepend( dom );
3477
+
3478
+ //requestAnimationFrame( () => dom.style.opacity = 1 );
3479
+
3480
+ this.time = Math.min( this.time + this.duration, this.duration );
3481
+
3482
+ setTimeout( () => {
3483
+
3484
+ this.time -= this.duration;
3485
+
3486
+ dom.style.opacity = 0;
3487
+
3488
+ setTimeout( () => dom.remove(), 250 );
3489
+
3490
+ }, this.time );
3009
3491
 
3010
3492
  return this;
3011
3493
 
@@ -3013,57 +3495,312 @@ class Menu extends EventTarget {
3013
3495
 
3014
3496
  }
3015
3497
 
3016
- let lastContext = null;
3498
+ const filterString = ( str ) => {
3017
3499
 
3018
- class ContextMenu extends Menu {
3500
+ return str.trim().toLowerCase().replace( /\s\s+/g, ' ' );
3019
3501
 
3020
- constructor( target = null ) {
3502
+ };
3021
3503
 
3022
- super( 'context', target );
3504
+ class Search extends Menu {
3505
+
3506
+ constructor() {
3507
+
3508
+ super( 'search' );
3509
+
3510
+ this.events.submit = [];
3511
+ this.events.filter = [];
3512
+
3513
+ const inputDOM = document.createElement( 'input' );
3514
+ inputDOM.placeholder = 'Type here';
3515
+
3516
+ let filter = true;
3517
+ let filterNeedUpdate = true;
3518
+
3519
+ inputDOM.addEventListener( 'focusout', () => {
3520
+
3521
+ filterNeedUpdate = true;
3522
+
3523
+ this.setValue( '' );
3524
+
3525
+ } );
3526
+
3527
+ inputDOM.onkeydown = ( e ) => {
3528
+
3529
+ const keyCode = e.keyCode;
3530
+
3531
+ if ( keyCode === 38 ) {
3532
+
3533
+ const index = this.filteredIndex;
3534
+
3535
+ if ( this.forceAutoComplete ) {
3536
+
3537
+ this.filteredIndex = index !== null ? ( index + 1 ) % ( this.filtered.length || 1 ) : 0;
3538
+
3539
+ } else {
3540
+
3541
+ this.filteredIndex = index !== null ? Math.min( index + 1, this.filtered.length - 1 ) : 0;
3542
+
3543
+ }
3544
+
3545
+ e.preventDefault();
3546
+
3547
+ filter = false;
3548
+
3549
+ } else if ( keyCode === 40 ) {
3550
+
3551
+ const index = this.filteredIndex;
3552
+
3553
+ if ( this.forceAutoComplete ) {
3554
+
3555
+ this.filteredIndex = index - 1;
3556
+
3557
+ if ( this.filteredIndex === null ) this.filteredIndex = this.filtered.length - 1;
3558
+
3559
+ } else {
3560
+
3561
+ this.filteredIndex = index !== null ? index - 1 : null;
3562
+
3563
+ }
3564
+
3565
+ e.preventDefault();
3566
+
3567
+ filter = false;
3568
+
3569
+ } else if ( keyCode === 13 ) {
3570
+
3571
+ this.value = this.currentFiltered ? this.currentFiltered.button.getValue() : inputDOM.value;
3572
+
3573
+ this.submit();
3574
+
3575
+ e.preventDefault();
3576
+
3577
+ filter = false;
3578
+
3579
+ } else {
3580
+
3581
+ filter = true;
3582
+
3583
+ }
3584
+
3585
+ };
3586
+
3587
+ inputDOM.onkeyup = () => {
3588
+
3589
+ if ( filter ) {
3590
+
3591
+ if ( filterNeedUpdate ) {
3592
+
3593
+ this.dispatchEvent( new Event( 'filter' ) );
3594
+
3595
+ filterNeedUpdate = false;
3596
+
3597
+ }
3598
+
3599
+ this.filter( inputDOM.value );
3600
+
3601
+ }
3602
+
3603
+ };
3604
+
3605
+ this.filtered = [];
3606
+ this.currentFiltered = null;
3607
+
3608
+ this.value = '';
3609
+
3610
+ this.forceAutoComplete = false;
3611
+
3612
+ this.dom.append( inputDOM );
3613
+
3614
+ this.inputDOM = inputDOM;
3615
+
3616
+ this.addEventListener( 'filter', ( ) => {
3617
+
3618
+ dispatchEventList( this.events.filter, this );
3619
+
3620
+ } );
3621
+
3622
+ this.addEventListener( 'submit', ( ) => {
3623
+
3624
+ dispatchEventList( this.events.submit, this );
3625
+
3626
+ } );
3023
3627
 
3024
3628
  }
3025
3629
 
3026
- show( x, y ) {
3630
+ submit() {
3027
3631
 
3028
- if ( lastContext !== null ) {
3632
+ this.dispatchEvent( new Event( 'submit' ) );
3029
3633
 
3030
- lastContext.hide();
3634
+ return this.setValue( '' );
3635
+
3636
+ }
3637
+
3638
+ setValue( value ) {
3639
+
3640
+ this.inputDOM.value = value;
3641
+
3642
+ this.filter( value );
3643
+
3644
+ return this;
3645
+
3646
+ }
3647
+
3648
+ getValue() {
3649
+
3650
+ return this.value;
3651
+
3652
+ }
3653
+
3654
+ onFilter( callback ) {
3655
+
3656
+ this.events.filter.push( callback );
3657
+
3658
+ return this;
3659
+
3660
+ }
3661
+
3662
+ onSubmit( callback ) {
3663
+
3664
+ this.events.submit.push( callback );
3665
+
3666
+ return this;
3667
+
3668
+ }
3669
+
3670
+ getFilterByButton( button ) {
3671
+
3672
+ for ( const filter of this.filtered ) {
3673
+
3674
+ if ( filter.button === button ) {
3675
+
3676
+ return filter;
3677
+
3678
+ }
3031
3679
 
3032
3680
  }
3033
3681
 
3034
- lastContext = this;
3682
+ return null;
3683
+
3684
+ }
3685
+
3686
+ add( button ) {
3687
+
3688
+ super.add( button );
3689
+
3690
+ const onDown = () => {
3035
3691
 
3036
- return super.show( x, y );
3692
+ const filter = this.getFilterByButton( button );
3693
+
3694
+ this.filteredIndex = this.filtered.indexOf( filter );
3695
+ this.value = button.getValue();
3696
+
3697
+ this.submit();
3698
+
3699
+ };
3700
+
3701
+ button.dom.addEventListener( 'mousedown', onDown );
3702
+ button.dom.addEventListener( 'touchstart', onDown );
3703
+
3704
+ this.domButtons.get( button ).remove();
3705
+
3706
+ return this;
3037
3707
 
3038
3708
  }
3039
3709
 
3040
- hide() {
3710
+ set filteredIndex( index ) {
3041
3711
 
3042
- if ( lastContext === this ) {
3712
+ if ( this.currentFiltered ) {
3043
3713
 
3044
- lastContext = null;
3714
+ const buttonDOM = this.domButtons.get( this.currentFiltered.button );
3715
+
3716
+ buttonDOM.classList.remove( 'active' );
3717
+
3718
+ this.currentFiltered = null;
3045
3719
 
3046
3720
  }
3047
3721
 
3048
- return super.hide();
3722
+ const filteredItem = this.filtered[ index ];
3723
+
3724
+ if ( filteredItem ) {
3725
+
3726
+ const buttonDOM = this.domButtons.get( filteredItem.button );
3727
+
3728
+ buttonDOM.classList.add( 'active' );
3729
+
3730
+ this.currentFiltered = filteredItem;
3731
+
3732
+ }
3733
+
3734
+ this.updateFilter();
3049
3735
 
3050
3736
  }
3051
3737
 
3052
- }
3738
+ get filteredIndex() {
3053
3739
 
3054
- class CircleMenu extends Menu {
3740
+ return this.currentFiltered ? this.filtered.indexOf( this.currentFiltered ) : null;
3055
3741
 
3056
- constructor( target = null ) {
3742
+ }
3057
3743
 
3058
- super( 'circle', target );
3744
+ filter( text ) {
3745
+
3746
+ text = filterString( text );
3747
+
3748
+ const filtered = [];
3749
+
3750
+ for ( const button of this.buttons ) {
3751
+
3752
+ const buttonDOM = this.domButtons.get( button );
3753
+
3754
+ buttonDOM.remove();
3755
+
3756
+ const label = filterString( button.getValue() );
3757
+
3758
+ if ( text && label.includes( text ) === true ) {
3759
+
3760
+ const score = text.length / label.length;
3761
+
3762
+ filtered.push( {
3763
+ button,
3764
+ score
3765
+ } );
3766
+
3767
+ }
3768
+
3769
+ }
3770
+
3771
+ filtered.sort( ( a, b ) => b.score - a.score );
3772
+
3773
+ this.filtered = filtered;
3774
+ this.filteredIndex = this.forceAutoComplete ? 0 : null;
3059
3775
 
3060
3776
  }
3061
-
3777
+
3778
+ updateFilter() {
3779
+
3780
+ const filteredIndex = Math.min( this.filteredIndex, this.filteredIndex - 3 );
3781
+
3782
+ for ( let i = 0; i < this.filtered.length; i ++ ) {
3783
+
3784
+ const button = this.filtered[ i ].button;
3785
+ const buttonDOM = this.domButtons.get( button );
3786
+
3787
+ buttonDOM.remove();
3788
+
3789
+ if ( i >= filteredIndex ) {
3790
+
3791
+ this.listDOM.append( buttonDOM );
3792
+
3793
+ }
3794
+
3795
+ }
3796
+
3797
+ }
3798
+
3062
3799
  }
3063
3800
 
3064
3801
  class SelectInput extends Input {
3065
3802
 
3066
- constructor( options = [] ) {
3803
+ constructor( options = [], value = null ) {
3067
3804
 
3068
3805
  const dom = document.createElement( 'select' );
3069
3806
  super( dom );
@@ -3074,16 +3811,24 @@ class SelectInput extends Input {
3074
3811
 
3075
3812
  };
3076
3813
 
3077
- this.setOptions( options );
3814
+ dom.onmousedown = dom.ontouchstart = () => {
3815
+
3816
+ this.dispatchEvent( new Event( 'click' ) );
3817
+
3818
+ };
3819
+
3820
+ this.setOptions( options, value );
3078
3821
 
3079
3822
  }
3080
3823
 
3081
- setOptions( options ) {
3824
+ setOptions( options, value = null ) {
3082
3825
 
3083
3826
  const dom = this.dom;
3827
+ const defaultValue = dom.value;
3084
3828
 
3085
- this.options = options;
3829
+ let containsDefaultValue = false;
3086
3830
 
3831
+ this.options = options;
3087
3832
  dom.innerHTML = '';
3088
3833
 
3089
3834
  for ( let index = 0; index < options.length; index ++ ) {
@@ -3100,10 +3845,18 @@ class SelectInput extends Input {
3100
3845
  option.innerText = opt.name;
3101
3846
  option.value = opt.value;
3102
3847
 
3103
- dom.appendChild( option );
3848
+ if ( containsDefaultValue === false && defaultValue === opt.value ) {
3849
+
3850
+ containsDefaultValue = true;
3851
+
3852
+ }
3853
+
3854
+ dom.append( option );
3104
3855
 
3105
3856
  }
3106
3857
 
3858
+ dom.value = value !== null ? value : containsDefaultValue ? defaultValue : '';
3859
+
3107
3860
  return this;
3108
3861
 
3109
3862
  }
@@ -3126,7 +3879,7 @@ class SelectInput extends Input {
3126
3879
 
3127
3880
  const currentOptions = this.options;
3128
3881
 
3129
- if ( currentOptions.length > 0 ) {
3882
+ if ( currentOptions.length === 0 ) {
3130
3883
 
3131
3884
  this.setOptions( data.options );
3132
3885
 
@@ -3149,6 +3902,9 @@ class ToggleInput extends Input {
3149
3902
  dom.className = 'toggle';
3150
3903
  dom.checked = value;
3151
3904
 
3905
+ dom.onclick = () => this.dispatchEvent( new Event( 'click' ) );
3906
+ dom.onchange = () => this.dispatchEvent( new Event( 'change' ) );
3907
+
3152
3908
  }
3153
3909
 
3154
3910
  setValue( val ) {
@@ -3169,7 +3925,7 @@ class ToggleInput extends Input {
3169
3925
 
3170
3926
  }
3171
3927
 
3172
- var Flow = /*#__PURE__*/Object.freeze({
3928
+ var Flow = /*#__PURE__*/Object.freeze( {
3173
3929
  __proto__: null,
3174
3930
  Element: Element,
3175
3931
  Input: Input,
@@ -3182,6 +3938,8 @@ var Flow = /*#__PURE__*/Object.freeze({
3182
3938
  Menu: Menu,
3183
3939
  ContextMenu: ContextMenu,
3184
3940
  CircleMenu: CircleMenu,
3941
+ Tips: Tips,
3942
+ Search: Search,
3185
3943
  DraggableElement: DraggableElement,
3186
3944
  LabelElement: LabelElement,
3187
3945
  TitleElement: TitleElement,
@@ -3193,7 +3951,7 @@ var Flow = /*#__PURE__*/Object.freeze({
3193
3951
  StringInput: StringInput,
3194
3952
  TextInput: TextInput,
3195
3953
  ToggleInput: ToggleInput
3196
- });
3954
+ } );
3197
3955
 
3198
3956
  class Loader extends EventTarget {
3199
3957
 
@@ -3291,6 +4049,12 @@ class Loader extends EventTarget {
3291
4049
 
3292
4050
  const Class = lib && lib[ obj.type ] ? lib[ obj.type ] : Flow[ obj.type ];
3293
4051
 
4052
+ if ( ! Class ) {
4053
+
4054
+ console.error( `Class "${ obj.type }" not found!` );
4055
+
4056
+ }
4057
+
3294
4058
  objects[ id ] = new Class();
3295
4059
 
3296
4060
  }
@@ -3335,4 +4099,4 @@ class Loader extends EventTarget {
3335
4099
  Loader.DEFAULT = 'default';
3336
4100
  Loader.OBJECTS = 'objects';
3337
4101
 
3338
- export { ButtonInput, Canvas, CircleMenu, ColorInput, ContextMenu, DraggableElement, Element, Input, LabelElement, Loader, Menu, Node, NumberInput, ObjectNode, PanelNode, REVISION, SelectInput, Serializer, SliderInput, StringInput, Styles, TextInput, TitleElement, ToggleInput, Utils };
4102
+ export { ButtonInput, Canvas, CircleMenu, ColorInput, ContextMenu, DraggableElement, Element, Input, LabelElement, Loader, Menu, Node, NumberInput, ObjectNode, PanelNode, REVISION, Search, SelectInput, Serializer, SliderInput, StringInput, Styles, TextInput, Tips, TitleElement, ToggleInput, Utils };