super-three 0.141.0 → 0.147.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 (646) hide show
  1. package/README.md +9 -9
  2. package/build/three.cjs +2441 -1569
  3. package/build/three.js +2441 -1569
  4. package/build/three.min.js +1 -1
  5. package/build/three.module.js +2847 -1576
  6. package/examples/js/animation/AnimationClipCreator.js +0 -8
  7. package/examples/js/animation/CCDIKSolver.js +50 -67
  8. package/examples/js/animation/MMDAnimationHelper.js +66 -137
  9. package/examples/js/animation/MMDPhysics.js +71 -150
  10. package/examples/js/cameras/CinematicCamera.js +33 -22
  11. package/examples/js/controls/ArcballControls.js +149 -403
  12. package/examples/js/controls/DragControls.js +8 -33
  13. package/examples/js/controls/FirstPersonControls.js +32 -61
  14. package/examples/js/controls/FlyControls.js +29 -63
  15. package/examples/js/controls/OrbitControls.js +125 -103
  16. package/examples/js/controls/PointerLockControls.js +5 -22
  17. package/examples/js/controls/TrackballControls.js +33 -88
  18. package/examples/js/controls/TransformControls.js +101 -182
  19. package/examples/js/csm/CSM.js +4 -39
  20. package/examples/js/csm/CSMFrustum.js +3 -9
  21. package/examples/js/csm/CSMHelper.js +24 -4
  22. package/examples/js/csm/CSMShader.js +2 -6
  23. package/examples/js/curves/CurveExtras.js +27 -27
  24. package/examples/js/curves/NURBSCurve.js +4 -16
  25. package/examples/js/curves/NURBSSurface.js +3 -9
  26. package/examples/js/curves/NURBSUtils.js +8 -45
  27. package/examples/js/effects/AnaglyphEffect.js +6 -20
  28. package/examples/js/effects/AsciiEffect.js +32 -31
  29. package/examples/js/effects/OutlineEffect.js +30 -54
  30. package/examples/js/effects/ParallaxBarrierEffect.js +2 -15
  31. package/examples/js/effects/PeppersGhostEffect.js +14 -41
  32. package/examples/js/effects/StereoEffect.js +2 -6
  33. package/examples/js/environments/RoomEnvironment.js +32 -8
  34. package/examples/js/exporters/ColladaExporter.js +52 -78
  35. package/examples/js/exporters/DRACOExporter.js +22 -34
  36. package/examples/js/exporters/EXRExporter.js +15 -18
  37. package/examples/js/exporters/GLTFExporter.js +168 -345
  38. package/examples/js/exporters/MMDExporter.js +5 -12
  39. package/examples/js/exporters/OBJExporter.js +40 -52
  40. package/examples/js/exporters/PLYExporter.js +50 -57
  41. package/examples/js/exporters/STLExporter.js +5 -14
  42. package/examples/js/exporters/USDZExporter.js +119 -27
  43. package/examples/js/geometries/BoxLineGeometry.js +0 -1
  44. package/examples/js/geometries/ConvexGeometry.js +12 -7
  45. package/examples/js/geometries/DecalGeometry.js +53 -20
  46. package/examples/js/geometries/LightningStrike.js +54 -67
  47. package/examples/js/geometries/ParametricGeometries.js +8 -7
  48. package/examples/js/geometries/ParametricGeometry.js +23 -17
  49. package/examples/js/geometries/RoundedBoxGeometry.js +21 -19
  50. package/examples/js/geometries/TeapotGeometry.js +54 -50
  51. package/examples/js/geometries/TextGeometry.js +6 -4
  52. package/examples/js/helpers/LightProbeHelper.js +1 -2
  53. package/examples/js/helpers/OctreeHelper.js +22 -20
  54. package/examples/js/helpers/PositionalAudioHelper.js +8 -6
  55. package/examples/js/helpers/RectAreaLightHelper.js +6 -7
  56. package/examples/js/helpers/VertexNormalsHelper.js +15 -13
  57. package/examples/js/helpers/VertexTangentsHelper.js +15 -9
  58. package/examples/js/helpers/ViewHelper.js +31 -16
  59. package/examples/js/interactive/HTMLMesh.js +25 -39
  60. package/examples/js/interactive/InteractiveGroup.js +9 -14
  61. package/examples/js/interactive/SelectionBox.js +3 -70
  62. package/examples/js/interactive/SelectionHelper.js +2 -8
  63. package/examples/js/libs/ktx-parse.umd.js +1 -0
  64. package/examples/js/libs/meshopt_decoder.js +98 -32
  65. package/examples/js/lights/LightProbeGenerator.js +32 -39
  66. package/examples/js/lights/RectAreaLightUniformsLib.js +5 -1
  67. package/examples/js/lines/LineGeometry.js +3 -5
  68. package/examples/js/lines/LineMaterial.js +4 -11
  69. package/examples/js/lines/LineSegments2.js +40 -89
  70. package/examples/js/lines/LineSegmentsGeometry.js +7 -28
  71. package/examples/js/lines/Wireframe.js +2 -7
  72. package/examples/js/lines/WireframeGeometry2.js +3 -1
  73. package/examples/js/loaders/3DMLoader.js +58 -155
  74. package/examples/js/loaders/3MFLoader.js +72 -106
  75. package/examples/js/loaders/AMFLoader.js +0 -25
  76. package/examples/js/loaders/BVHLoader.js +44 -43
  77. package/examples/js/loaders/BasisTextureLoader.js +16 -46
  78. package/examples/js/loaders/ColladaLoader.js +229 -359
  79. package/examples/js/loaders/DDSLoader.js +24 -25
  80. package/examples/js/loaders/DRACOLoader.js +30 -90
  81. package/examples/js/loaders/EXRLoader.js +69 -177
  82. package/examples/js/loaders/FBXLoader.js +294 -441
  83. package/examples/js/loaders/FontLoader.js +9 -31
  84. package/examples/js/loaders/GCodeLoader.js +15 -16
  85. package/examples/js/loaders/GLTFLoader.js +458 -739
  86. package/examples/js/loaders/HDRCubeTextureLoader.js +0 -17
  87. package/examples/js/loaders/KMZLoader.js +3 -7
  88. package/examples/js/loaders/KTXLoader.js +12 -30
  89. package/examples/js/loaders/LDrawLoader.js +309 -355
  90. package/examples/js/loaders/LUT3dlLoader.js +7 -11
  91. package/examples/js/loaders/LUTCubeLoader.js +0 -8
  92. package/examples/js/loaders/LWOLoader.js +59 -124
  93. package/examples/js/loaders/LogLuvLoader.js +27 -77
  94. package/examples/js/loaders/LottieLoader.js +4 -4
  95. package/examples/js/loaders/MD2Loader.js +26 -27
  96. package/examples/js/loaders/MDDLoader.js +6 -10
  97. package/examples/js/loaders/MMDLoader.js +180 -189
  98. package/examples/js/loaders/MTLLoader.js +18 -47
  99. package/examples/js/loaders/NRRDLoader.js +44 -84
  100. package/examples/js/loaders/OBJLoader.js +56 -77
  101. package/examples/js/loaders/PCDLoader.js +92 -42
  102. package/examples/js/loaders/PDBLoader.js +17 -13
  103. package/examples/js/loaders/PLYLoader.js +65 -51
  104. package/examples/js/loaders/PRWMLoader.js +11 -22
  105. package/examples/js/loaders/PVRLoader.js +7 -16
  106. package/examples/js/loaders/RGBELoader.js +36 -61
  107. package/examples/js/loaders/RGBMLoader.js +26 -87
  108. package/examples/js/loaders/STLLoader.js +20 -27
  109. package/examples/js/loaders/SVGLoader.js +365 -236
  110. package/examples/js/loaders/TDSLoader.js +81 -118
  111. package/examples/js/loaders/TGALoader.js +39 -41
  112. package/examples/js/loaders/TIFFLoader.js +30 -0
  113. package/examples/js/loaders/TTFLoader.js +0 -8
  114. package/examples/js/loaders/TiltLoader.js +14 -15
  115. package/examples/js/loaders/VOXLoader.js +8 -16
  116. package/examples/js/loaders/VRMLLoader.js +266 -354
  117. package/examples/js/loaders/VTKLoader.js +102 -119
  118. package/examples/js/loaders/XYZLoader.js +2 -4
  119. package/examples/js/loaders/lwo/IFFParser.js +55 -136
  120. package/examples/js/loaders/lwo/LWO2Parser.js +39 -89
  121. package/examples/js/loaders/lwo/LWO3Parser.js +38 -79
  122. package/examples/js/materials/MeshGouraudMaterial.js +387 -0
  123. package/examples/js/math/Capsule.js +0 -17
  124. package/examples/js/math/ColorConverter.js +3 -53
  125. package/examples/js/math/ConvexHull.js +185 -141
  126. package/examples/js/math/ImprovedNoise.js +1 -1
  127. package/examples/js/math/Lut.js +8 -15
  128. package/examples/js/math/MeshSurfaceSampler.js +6 -28
  129. package/examples/js/math/OBB.js +90 -49
  130. package/examples/js/math/Octree.js +2 -57
  131. package/examples/js/math/SimplexNoise.js +74 -88
  132. package/examples/js/misc/ConvexObjectBreaker.js +37 -48
  133. package/examples/js/misc/GPUComputationRenderer.js +47 -14
  134. package/examples/js/misc/Gyroscope.js +5 -9
  135. package/examples/js/misc/MD2Character.js +14 -23
  136. package/examples/js/misc/MD2CharacterComplex.js +73 -54
  137. package/examples/js/misc/MorphAnimMesh.js +0 -6
  138. package/examples/js/misc/MorphBlendMesh.js +3 -30
  139. package/examples/js/misc/ProgressiveLightMap.js +47 -43
  140. package/examples/js/misc/RollerCoaster.js +17 -24
  141. package/examples/js/misc/TubePainter.js +18 -12
  142. package/examples/js/misc/Volume.js +173 -194
  143. package/examples/js/misc/VolumeSlice.js +91 -99
  144. package/examples/js/modifiers/CurveModifier.js +19 -21
  145. package/examples/js/modifiers/EdgeSplitModifier.js +0 -30
  146. package/examples/js/modifiers/SimplifyModifier.js +57 -60
  147. package/examples/js/modifiers/TessellateModifier.js +2 -9
  148. package/examples/js/objects/GroundProjectedEnv.js +181 -0
  149. package/examples/js/objects/Lensflare.js +47 -38
  150. package/examples/js/objects/LightningStorm.js +10 -13
  151. package/examples/js/objects/MarchingCubes.js +80 -59
  152. package/examples/js/objects/Reflector.js +31 -22
  153. package/examples/js/objects/ReflectorForSSRPass.js +20 -25
  154. package/examples/js/objects/Refractor.js +61 -33
  155. package/examples/js/objects/ShadowMesh.js +6 -3
  156. package/examples/js/objects/Sky.js +2 -7
  157. package/examples/js/objects/Water.js +23 -18
  158. package/examples/js/objects/Water2.js +20 -19
  159. package/examples/js/physics/AmmoPhysics.js +23 -20
  160. package/examples/js/physics/OimoPhysics.js +19 -17
  161. package/examples/js/postprocessing/AdaptiveToneMappingPass.js +13 -20
  162. package/examples/js/postprocessing/AfterimagePass.js +19 -12
  163. package/examples/js/postprocessing/BloomPass.js +38 -17
  164. package/examples/js/postprocessing/BokehPass.js +29 -12
  165. package/examples/js/postprocessing/ClearPass.js +1 -6
  166. package/examples/js/postprocessing/CubeTexturePass.js +12 -9
  167. package/examples/js/postprocessing/DotScreenPass.js +7 -5
  168. package/examples/js/postprocessing/EffectComposer.js +25 -32
  169. package/examples/js/postprocessing/FilmPass.js +7 -5
  170. package/examples/js/postprocessing/GlitchPass.js +10 -11
  171. package/examples/js/postprocessing/HalftonePass.js +9 -9
  172. package/examples/js/postprocessing/LUTPass.js +2 -15
  173. package/examples/js/postprocessing/MaskPass.js +20 -17
  174. package/examples/js/postprocessing/OutlinePass.js +49 -38
  175. package/examples/js/postprocessing/Pass.js +11 -14
  176. package/examples/js/postprocessing/RenderPass.js +3 -7
  177. package/examples/js/postprocessing/RenderPixelatedPass.js +215 -0
  178. package/examples/js/postprocessing/SAOPass.js +40 -32
  179. package/examples/js/postprocessing/SMAAPass.js +34 -17
  180. package/examples/js/postprocessing/SSAARenderPass.js +14 -14
  181. package/examples/js/postprocessing/SSAOPass.js +56 -42
  182. package/examples/js/postprocessing/SSRPass.js +78 -61
  183. package/examples/js/postprocessing/SavePass.js +14 -6
  184. package/examples/js/postprocessing/ShaderPass.js +9 -8
  185. package/examples/js/postprocessing/TAARenderPass.js +11 -9
  186. package/examples/js/postprocessing/TexturePass.js +7 -4
  187. package/examples/js/postprocessing/UnrealBloomPass.js +43 -25
  188. package/examples/js/renderers/CSS2DRenderer.js +4 -23
  189. package/examples/js/renderers/CSS3DRenderer.js +5 -26
  190. package/examples/js/renderers/Projector.js +31 -108
  191. package/examples/js/renderers/SVGRenderer.js +4 -50
  192. package/examples/js/shaders/ACESFilmicToneMappingShader.js +3 -6
  193. package/examples/js/shaders/AfterimageShader.js +3 -6
  194. package/examples/js/shaders/BasicShader.js +3 -6
  195. package/examples/js/shaders/BleachBypassShader.js +3 -6
  196. package/examples/js/shaders/BlendShader.js +3 -6
  197. package/examples/js/shaders/BokehShader.js +3 -6
  198. package/examples/js/shaders/BokehShader2.js +4 -13
  199. package/examples/js/shaders/BrightnessContrastShader.js +3 -6
  200. package/examples/js/shaders/ColorCorrectionShader.js +2 -6
  201. package/examples/js/shaders/ColorifyShader.js +2 -6
  202. package/examples/js/shaders/ConvolutionShader.js +5 -10
  203. package/examples/js/shaders/CopyShader.js +3 -6
  204. package/examples/js/shaders/DOFMipMapShader.js +3 -6
  205. package/examples/js/shaders/DepthLimitedBlurShader.js +2 -9
  206. package/examples/js/shaders/DigitalGlitch.js +3 -6
  207. package/examples/js/shaders/DotScreenShader.js +2 -6
  208. package/examples/js/shaders/FXAAShader.js +1 -3
  209. package/examples/js/shaders/FilmShader.js +3 -6
  210. package/examples/js/shaders/FocusShader.js +3 -6
  211. package/examples/js/shaders/FreiChenShader.js +2 -6
  212. package/examples/js/shaders/GammaCorrectionShader.js +3 -6
  213. package/examples/js/shaders/GodRaysShader.js +11 -24
  214. package/examples/js/shaders/HalftoneShader.js +3 -6
  215. package/examples/js/shaders/HorizontalBlurShader.js +3 -6
  216. package/examples/js/shaders/HorizontalTiltShiftShader.js +3 -6
  217. package/examples/js/shaders/HueSaturationShader.js +3 -6
  218. package/examples/js/shaders/KaleidoShader.js +3 -6
  219. package/examples/js/shaders/LuminosityHighPassShader.js +2 -6
  220. package/examples/js/shaders/LuminosityShader.js +4 -7
  221. package/examples/js/shaders/MMDToonShader.js +2 -4
  222. package/examples/js/shaders/MirrorShader.js +3 -6
  223. package/examples/js/shaders/NormalMapShader.js +2 -6
  224. package/examples/js/shaders/RGBShiftShader.js +3 -6
  225. package/examples/js/shaders/SAOShader.js +2 -6
  226. package/examples/js/shaders/SMAAShader.js +6 -18
  227. package/examples/js/shaders/SSAOShader.js +2 -6
  228. package/examples/js/shaders/SSRShader.js +6 -18
  229. package/examples/js/shaders/SepiaShader.js +3 -6
  230. package/examples/js/shaders/SobelOperatorShader.js +2 -6
  231. package/examples/js/shaders/TechnicolorShader.js +3 -6
  232. package/examples/js/shaders/ToneMapShader.js +4 -7
  233. package/examples/js/shaders/ToonShader.js +8 -24
  234. package/examples/js/shaders/TriangleBlurShader.js +2 -6
  235. package/examples/js/shaders/UnpackDepthRGBAShader.js +3 -6
  236. package/examples/js/shaders/VelocityShader.js +126 -0
  237. package/examples/js/shaders/VerticalBlurShader.js +3 -6
  238. package/examples/js/shaders/VerticalTiltShiftShader.js +3 -6
  239. package/examples/js/shaders/VignetteShader.js +3 -6
  240. package/examples/js/shaders/VolumeShader.js +2 -6
  241. package/examples/js/shaders/WaterRefractionShader.js +2 -6
  242. package/examples/js/textures/FlakesTexture.js +0 -1
  243. package/examples/js/utils/BufferGeometryUtils.js +237 -171
  244. package/examples/js/utils/CameraUtils.js +5 -20
  245. package/examples/js/utils/GPUStatsPanel.js +3 -12
  246. package/examples/js/utils/GeometryCompressionUtils.js +19 -44
  247. package/examples/js/utils/GeometryUtils.js +15 -36
  248. package/examples/js/utils/LDrawUtils.js +8 -11
  249. package/examples/js/utils/PackedPhongMaterial.js +6 -4
  250. package/examples/js/utils/SceneUtils.js +109 -14
  251. package/examples/js/utils/ShadowMapViewer.js +17 -14
  252. package/examples/js/utils/SkeletonUtils.js +13 -27
  253. package/examples/js/utils/UVsDebug.js +20 -12
  254. package/examples/js/utils/WorkerPool.js +1 -11
  255. package/examples/jsm/animation/CCDIKSolver.js +27 -3
  256. package/examples/jsm/animation/MMDPhysics.js +28 -22
  257. package/examples/jsm/capabilities/WebGPU.js +3 -1
  258. package/examples/jsm/controls/ArcballControls.js +17 -2
  259. package/examples/jsm/controls/FirstPersonControls.js +20 -27
  260. package/examples/jsm/controls/FlyControls.js +16 -24
  261. package/examples/jsm/controls/OrbitControls.js +44 -9
  262. package/examples/jsm/controls/PointerLockControls.js +0 -7
  263. package/examples/jsm/controls/TrackballControls.js +14 -5
  264. package/examples/jsm/controls/TransformControls.js +18 -16
  265. package/examples/jsm/csm/CSM.js +1 -0
  266. package/examples/jsm/csm/CSMHelper.js +30 -0
  267. package/examples/jsm/effects/AnaglyphEffect.js +2 -2
  268. package/examples/jsm/effects/OutlineEffect.js +4 -25
  269. package/examples/jsm/effects/ParallaxBarrierEffect.js +2 -2
  270. package/examples/jsm/effects/PeppersGhostEffect.js +2 -2
  271. package/examples/jsm/effects/StereoEffect.js +2 -2
  272. package/examples/jsm/environments/RoomEnvironment.js +23 -0
  273. package/examples/jsm/exporters/ColladaExporter.js +4 -13
  274. package/examples/jsm/exporters/DRACOExporter.js +0 -13
  275. package/examples/jsm/exporters/GLTFExporter.js +29 -110
  276. package/examples/jsm/exporters/KTX2Exporter.js +29 -29
  277. package/examples/jsm/exporters/OBJExporter.js +0 -18
  278. package/examples/jsm/exporters/PLYExporter.js +14 -22
  279. package/examples/jsm/exporters/STLExporter.js +1 -9
  280. package/examples/jsm/exporters/USDZExporter.js +107 -4
  281. package/examples/jsm/geometries/ConvexGeometry.js +1 -1
  282. package/examples/jsm/geometries/ParametricGeometry.js +0 -6
  283. package/examples/jsm/helpers/OctreeHelper.js +22 -8
  284. package/examples/jsm/helpers/VertexNormalsHelper.js +7 -1
  285. package/examples/jsm/helpers/VertexTangentsHelper.js +7 -0
  286. package/examples/jsm/helpers/ViewHelper.js +24 -0
  287. package/examples/jsm/interactive/HTMLMesh.js +14 -15
  288. package/examples/jsm/interactive/InteractiveGroup.js +4 -2
  289. package/examples/jsm/interactive/SelectionHelper.js +5 -3
  290. package/examples/jsm/libs/flow.module.js +610 -160
  291. package/examples/jsm/libs/lottie_canvas.module.js +14844 -0
  292. package/examples/jsm/libs/meshopt_decoder.module.js +97 -32
  293. package/examples/jsm/libs/utif.module.js +1579 -0
  294. package/examples/jsm/libs/zstddec.module.js +1 -0
  295. package/examples/jsm/lines/LineSegments2.js +4 -0
  296. package/examples/jsm/loaders/3DMLoader.js +1 -2
  297. package/examples/jsm/loaders/ColladaLoader.js +29 -0
  298. package/examples/jsm/loaders/DRACOLoader.js +2 -28
  299. package/examples/jsm/loaders/EXRLoader.js +3 -13
  300. package/examples/jsm/loaders/FBXLoader.js +26 -3
  301. package/examples/jsm/loaders/FontLoader.js +3 -16
  302. package/examples/jsm/loaders/GLTFLoader.js +321 -464
  303. package/examples/jsm/loaders/HDRCubeTextureLoader.js +0 -13
  304. package/examples/jsm/loaders/KTX2Loader.js +254 -53
  305. package/examples/jsm/loaders/LDrawLoader.js +149 -87
  306. package/examples/jsm/loaders/LottieLoader.js +4 -2
  307. package/examples/jsm/loaders/MaterialXLoader.js +728 -0
  308. package/examples/jsm/loaders/OBJLoader.js +6 -14
  309. package/examples/jsm/loaders/PCDLoader.js +60 -14
  310. package/examples/jsm/loaders/PLYLoader.js +71 -19
  311. package/examples/jsm/loaders/RGBELoader.js +1 -1
  312. package/examples/jsm/loaders/SVGLoader.js +231 -17
  313. package/examples/jsm/loaders/TIFFLoader.js +36 -0
  314. package/examples/jsm/loaders/USDZLoader.js +633 -0
  315. package/examples/jsm/loaders/VRMLLoader.js +36 -26
  316. package/examples/jsm/loaders/VTKLoader.js +1 -1
  317. package/examples/jsm/loaders/lwo/LWO2Parser.js +6 -8
  318. package/examples/jsm/loaders/lwo/LWO3Parser.js +6 -8
  319. package/examples/jsm/materials/MeshGouraudMaterial.js +423 -0
  320. package/examples/jsm/math/ColorConverter.js +1 -49
  321. package/examples/jsm/math/ConvexHull.js +4 -4
  322. package/examples/jsm/math/Octree.js +1 -1
  323. package/examples/jsm/misc/GPUComputationRenderer.js +43 -0
  324. package/examples/jsm/misc/Volume.js +169 -171
  325. package/examples/jsm/misc/VolumeSlice.js +78 -80
  326. package/examples/jsm/modifiers/SimplifyModifier.js +1 -1
  327. package/examples/jsm/node-editor/NodeEditor.js +91 -12
  328. package/examples/jsm/node-editor/accessors/MatcapUVEditor.js +1 -1
  329. package/examples/jsm/node-editor/accessors/NormalEditor.js +1 -1
  330. package/examples/jsm/node-editor/accessors/PositionEditor.js +1 -1
  331. package/examples/jsm/node-editor/accessors/UVEditor.js +1 -1
  332. package/examples/jsm/node-editor/core/BaseNode.js +10 -3
  333. package/examples/jsm/node-editor/display/BlendEditor.js +1 -1
  334. package/examples/jsm/node-editor/display/NormalMapEditor.js +1 -1
  335. package/examples/jsm/node-editor/inputs/ColorEditor.js +1 -1
  336. package/examples/jsm/node-editor/inputs/FloatEditor.js +1 -1
  337. package/examples/jsm/node-editor/inputs/SliderEditor.js +1 -1
  338. package/examples/jsm/node-editor/inputs/TextureEditor.js +1 -1
  339. package/examples/jsm/node-editor/inputs/Vector2Editor.js +1 -1
  340. package/examples/jsm/node-editor/inputs/Vector3Editor.js +1 -1
  341. package/examples/jsm/node-editor/inputs/Vector4Editor.js +1 -1
  342. package/examples/jsm/node-editor/materials/BasicMaterialEditor.js +7 -10
  343. package/examples/jsm/node-editor/materials/PointsMaterialEditor.js +1 -1
  344. package/examples/jsm/node-editor/materials/StandardMaterialEditor.js +7 -10
  345. package/examples/jsm/node-editor/math/AngleEditor.js +4 -4
  346. package/examples/jsm/node-editor/math/DotEditor.js +1 -1
  347. package/examples/jsm/node-editor/math/InvertEditor.js +3 -3
  348. package/examples/jsm/node-editor/math/LimiterEditor.js +1 -1
  349. package/examples/jsm/node-editor/math/NormalizeEditor.js +1 -1
  350. package/examples/jsm/node-editor/math/OperatorEditor.js +1 -1
  351. package/examples/jsm/node-editor/math/PowerEditor.js +1 -1
  352. package/examples/jsm/node-editor/math/TrigonometryEditor.js +1 -1
  353. package/examples/jsm/node-editor/procedural/CheckerEditor.js +1 -1
  354. package/examples/jsm/node-editor/scene/MeshEditor.js +11 -8
  355. package/examples/jsm/node-editor/utils/JoinEditor.js +1 -1
  356. package/examples/jsm/node-editor/utils/OscillatorEditor.js +1 -1
  357. package/examples/jsm/node-editor/utils/PreviewEditor.js +7 -3
  358. package/examples/jsm/node-editor/utils/SplitEditor.js +1 -1
  359. package/examples/jsm/node-editor/utils/TimerEditor.js +1 -1
  360. package/examples/jsm/nodes/Nodes.js +70 -13
  361. package/examples/jsm/nodes/accessors/BitangentNode.js +62 -0
  362. package/examples/jsm/nodes/accessors/CubeTextureNode.js +9 -5
  363. package/examples/jsm/nodes/accessors/NormalNode.js +8 -8
  364. package/examples/jsm/nodes/accessors/Object3DNode.js +1 -1
  365. package/examples/jsm/nodes/accessors/PositionNode.js +11 -5
  366. package/examples/jsm/nodes/accessors/ReferenceNode.js +1 -1
  367. package/examples/jsm/nodes/accessors/ReflectVectorNode.js +31 -0
  368. package/examples/jsm/nodes/accessors/SkinningNode.js +8 -1
  369. package/examples/jsm/nodes/accessors/TangentNode.js +95 -0
  370. package/examples/jsm/nodes/core/AttributeNode.js +32 -9
  371. package/examples/jsm/nodes/core/CodeNode.js +3 -3
  372. package/examples/jsm/nodes/core/FunctionCallNode.js +20 -5
  373. package/examples/jsm/nodes/core/FunctionNode.js +2 -2
  374. package/examples/jsm/nodes/core/Node.js +15 -13
  375. package/examples/jsm/nodes/core/NodeBuilder.js +67 -18
  376. package/examples/jsm/nodes/core/NodeFrame.js +2 -2
  377. package/examples/jsm/nodes/core/NodeUtils.js +23 -1
  378. package/examples/jsm/nodes/core/NodeVarying.js +17 -0
  379. package/examples/jsm/nodes/core/VaryingNode.js +56 -0
  380. package/examples/jsm/nodes/core/constants.js +13 -13
  381. package/examples/jsm/nodes/display/BlendModeNode.js +85 -0
  382. package/examples/jsm/nodes/display/ColorAdjustmentNode.js +84 -0
  383. package/examples/jsm/nodes/display/NormalMapNode.js +19 -12
  384. package/examples/jsm/nodes/display/PosterizeNode.js +25 -0
  385. package/examples/jsm/nodes/display/ViewportNode.js +106 -0
  386. package/examples/jsm/nodes/functions/BSDF/BRDF_GGX.js +5 -5
  387. package/examples/jsm/nodes/functions/PhysicalLightingModel.js +3 -3
  388. package/examples/jsm/nodes/functions/light/getDistanceAttenuation.js +2 -2
  389. package/examples/jsm/nodes/geometry/RangeNode.js +109 -0
  390. package/examples/jsm/nodes/gpgpu/ComputeNode.js +3 -1
  391. package/examples/jsm/nodes/lighting/AnalyticLightNode.js +1 -1
  392. package/examples/jsm/nodes/lighting/EnvironmentNode.js +8 -7
  393. package/examples/jsm/nodes/lighting/LightingContextNode.js +4 -4
  394. package/examples/jsm/nodes/loaders/NodeLoader.js +2 -2
  395. package/examples/jsm/nodes/loaders/NodeMaterialLoader.js +33 -0
  396. package/examples/jsm/nodes/materials/Materials.js +21 -31
  397. package/examples/jsm/nodes/materials/MeshPhysicalNodeMaterial.js +70 -0
  398. package/examples/jsm/nodes/materials/MeshStandardNodeMaterial.js +4 -7
  399. package/examples/jsm/nodes/materials/NodeMaterial.js +11 -3
  400. package/examples/jsm/nodes/materials/SpriteNodeMaterial.js +28 -17
  401. package/examples/jsm/nodes/materialx/DISCLAIMER.md +199 -0
  402. package/examples/jsm/nodes/materialx/MaterialXNodes.js +59 -0
  403. package/examples/jsm/nodes/materialx/lib/mx_hsv.js +56 -0
  404. package/examples/jsm/nodes/materialx/lib/mx_noise.js +617 -0
  405. package/examples/jsm/nodes/materialx/lib/mx_transform_color.js +18 -0
  406. package/examples/jsm/nodes/math/MathNode.js +7 -17
  407. package/examples/jsm/nodes/math/OperatorNode.js +16 -3
  408. package/examples/jsm/nodes/parsers/GLSLNodeFunction.js +21 -6
  409. package/examples/jsm/nodes/procedural/CheckerNode.js +2 -2
  410. package/examples/jsm/nodes/shadernode/ShaderNode.js +40 -25
  411. package/examples/jsm/nodes/shadernode/ShaderNodeBaseElements.js +95 -68
  412. package/examples/jsm/nodes/shadernode/ShaderNodeElements.js +49 -6
  413. package/examples/jsm/nodes/utils/ConvertNode.js +18 -12
  414. package/examples/jsm/nodes/utils/EquirectUVNode.js +27 -0
  415. package/examples/jsm/nodes/utils/JoinNode.js +15 -9
  416. package/examples/jsm/nodes/utils/MatcapUVNode.js +2 -4
  417. package/examples/jsm/nodes/utils/MaxMipLevelNode.js +3 -2
  418. package/examples/jsm/nodes/utils/OscNode.js +2 -2
  419. package/examples/jsm/nodes/utils/RemapNode.js +34 -0
  420. package/examples/jsm/nodes/utils/RotateUVNode.js +32 -0
  421. package/examples/jsm/nodes/utils/SplitNode.js +21 -5
  422. package/examples/jsm/nodes/utils/SpriteSheetUVNode.js +8 -10
  423. package/examples/jsm/nodes/utils/TimerNode.js +23 -3
  424. package/examples/jsm/nodes/utils/TriplanarTexturesNode.js +51 -0
  425. package/examples/jsm/objects/GroundProjectedEnv.js +186 -0
  426. package/examples/jsm/objects/Reflector.js +12 -5
  427. package/examples/jsm/objects/ReflectorForSSRPass.js +3 -5
  428. package/examples/jsm/objects/Refractor.js +12 -6
  429. package/examples/jsm/objects/ShadowMesh.js +8 -2
  430. package/examples/jsm/postprocessing/AfterimagePass.js +17 -4
  431. package/examples/jsm/postprocessing/BloomPass.js +22 -3
  432. package/examples/jsm/postprocessing/BokehPass.js +18 -4
  433. package/examples/jsm/postprocessing/CubeTexturePass.js +12 -5
  434. package/examples/jsm/postprocessing/DotScreenPass.js +8 -0
  435. package/examples/jsm/postprocessing/EffectComposer.js +9 -0
  436. package/examples/jsm/postprocessing/FilmPass.js +8 -0
  437. package/examples/jsm/postprocessing/GlitchPass.js +13 -1
  438. package/examples/jsm/postprocessing/HalftonePass.js +8 -0
  439. package/examples/jsm/postprocessing/OutlinePass.js +25 -3
  440. package/examples/jsm/postprocessing/Pass.js +2 -0
  441. package/examples/jsm/postprocessing/RenderPixelatedPass.js +234 -0
  442. package/examples/jsm/postprocessing/SAOPass.js +20 -0
  443. package/examples/jsm/postprocessing/SMAAPass.js +16 -0
  444. package/examples/jsm/postprocessing/SSAARenderPass.js +4 -0
  445. package/examples/jsm/postprocessing/SavePass.js +17 -1
  446. package/examples/jsm/postprocessing/ShaderPass.js +8 -0
  447. package/examples/jsm/postprocessing/TAARenderPass.js +9 -0
  448. package/examples/jsm/postprocessing/TexturePass.js +8 -0
  449. package/examples/jsm/postprocessing/UnrealBloomPass.js +16 -0
  450. package/examples/jsm/renderers/CSS2DRenderer.js +2 -2
  451. package/examples/jsm/renderers/CSS3DRenderer.js +2 -2
  452. package/examples/jsm/renderers/Projector.js +2 -24
  453. package/examples/jsm/renderers/webgl/nodes/SlotNode.js +9 -5
  454. package/examples/jsm/renderers/webgl/nodes/WebGLNodeBuilder.js +363 -231
  455. package/examples/jsm/renderers/webgl/nodes/WebGLNodes.js +7 -3
  456. package/examples/jsm/renderers/webgpu/WebGPUAnimation.js +58 -0
  457. package/examples/jsm/renderers/webgpu/WebGPUAttributes.js +63 -5
  458. package/examples/jsm/renderers/webgpu/WebGPUBackground.js +68 -3
  459. package/examples/jsm/renderers/webgpu/WebGPUComputePipelines.js +6 -0
  460. package/examples/jsm/renderers/webgpu/WebGPUGeometries.js +6 -0
  461. package/examples/jsm/renderers/webgpu/WebGPUObjects.js +1 -1
  462. package/examples/jsm/renderers/webgpu/WebGPURenderPipeline.js +17 -19
  463. package/examples/jsm/renderers/webgpu/WebGPURenderPipelines.js +16 -14
  464. package/examples/jsm/renderers/webgpu/WebGPURenderStates.js +2 -2
  465. package/examples/jsm/renderers/webgpu/WebGPURenderer.js +113 -93
  466. package/examples/jsm/renderers/webgpu/WebGPUTextureUtils.js +5 -3
  467. package/examples/jsm/renderers/webgpu/WebGPUTextures.js +2 -2
  468. package/examples/jsm/renderers/webgpu/WebGPUUtils.js +81 -0
  469. package/examples/jsm/renderers/webgpu/nodes/WebGPUNodeBuilder.js +63 -36
  470. package/examples/jsm/renderers/webgpu/nodes/WebGPUNodes.js +1 -1
  471. package/examples/jsm/shaders/LuminosityShader.js +1 -1
  472. package/examples/jsm/shaders/MMDToonShader.js +2 -4
  473. package/examples/jsm/shaders/ToneMapShader.js +1 -1
  474. package/examples/jsm/shaders/VelocityShader.js +128 -0
  475. package/examples/jsm/utils/BufferGeometryUtils.js +176 -43
  476. package/examples/jsm/utils/GeometryUtils.js +17 -25
  477. package/examples/jsm/utils/PackedPhongMaterial.js +0 -1
  478. package/examples/jsm/utils/SceneUtils.js +117 -12
  479. package/examples/jsm/webxr/OculusHandModel.js +3 -2
  480. package/examples/jsm/webxr/OculusHandPointerModel.js +6 -1
  481. package/examples/jsm/webxr/VRButton.js +1 -7
  482. package/examples/jsm/webxr/XRHandMeshModel.js +8 -3
  483. package/package.json +22 -18
  484. package/src/Three.Legacy.js +262 -36
  485. package/src/Three.js +4 -2
  486. package/src/animation/AnimationAction.js +6 -5
  487. package/src/animation/AnimationClip.js +1 -1
  488. package/src/animation/AnimationMixer.js +1 -1
  489. package/src/animation/AnimationUtils.js +204 -199
  490. package/src/animation/KeyframeTrack.js +1 -1
  491. package/src/animation/PropertyBinding.js +31 -5
  492. package/src/audio/AudioContext.js +5 -5
  493. package/src/cameras/CubeCamera.js +14 -21
  494. package/src/constants.js +2 -4
  495. package/src/core/BufferAttribute.js +81 -111
  496. package/src/core/BufferGeometry.js +3 -41
  497. package/src/core/InstancedBufferAttribute.js +0 -10
  498. package/src/core/InstancedBufferGeometry.js +1 -7
  499. package/src/core/InterleavedBuffer.js +1 -1
  500. package/src/core/InterleavedBufferAttribute.js +57 -8
  501. package/src/core/Object3D.js +22 -5
  502. package/src/core/Uniform.js +0 -7
  503. package/src/core/UniformsGroup.js +92 -0
  504. package/src/extras/DataUtils.js +104 -88
  505. package/src/extras/Earcut.js +67 -67
  506. package/src/extras/core/Path.js +1 -0
  507. package/src/extras/core/ShapePath.js +1 -4
  508. package/src/extras/curves/CatmullRomCurve3.js +4 -2
  509. package/src/geometries/BoxGeometry.js +1 -1
  510. package/src/geometries/CapsuleGeometry.js +1 -1
  511. package/src/geometries/CircleGeometry.js +1 -1
  512. package/src/geometries/ConeGeometry.js +1 -1
  513. package/src/geometries/CylinderGeometry.js +2 -1
  514. package/src/geometries/DodecahedronGeometry.js +1 -1
  515. package/src/geometries/EdgesGeometry.js +5 -4
  516. package/src/geometries/ExtrudeGeometry.js +2 -11
  517. package/src/geometries/IcosahedronGeometry.js +1 -1
  518. package/src/geometries/LatheGeometry.js +2 -2
  519. package/src/geometries/OctahedronGeometry.js +1 -1
  520. package/src/geometries/PlaneGeometry.js +2 -1
  521. package/src/geometries/PolyhedronGeometry.js +2 -2
  522. package/src/geometries/RingGeometry.js +1 -1
  523. package/src/geometries/ShapeGeometry.js +3 -2
  524. package/src/geometries/SphereGeometry.js +2 -1
  525. package/src/geometries/TetrahedronGeometry.js +1 -1
  526. package/src/geometries/TorusGeometry.js +2 -1
  527. package/src/geometries/TorusKnotGeometry.js +2 -1
  528. package/src/geometries/TubeGeometry.js +2 -1
  529. package/src/geometries/WireframeGeometry.js +1 -0
  530. package/src/helpers/ArrowHelper.js +9 -0
  531. package/src/helpers/Box3Helper.js +7 -0
  532. package/src/helpers/BoxHelper.js +7 -1
  533. package/src/helpers/CameraHelper.js +97 -38
  534. package/src/helpers/DirectionalLightHelper.js +6 -1
  535. package/src/helpers/GridHelper.js +7 -0
  536. package/src/helpers/HemisphereLightHelper.js +5 -1
  537. package/src/helpers/PlaneHelper.js +15 -9
  538. package/src/helpers/PointLightHelper.js +2 -1
  539. package/src/helpers/PolarGridHelper.js +25 -14
  540. package/src/helpers/SkeletonHelper.js +7 -0
  541. package/src/helpers/SpotLightHelper.js +5 -2
  542. package/src/lights/LightShadow.js +1 -2
  543. package/src/lights/PointLight.js +2 -2
  544. package/src/lights/SpotLight.js +4 -2
  545. package/src/loaders/FileLoader.js +16 -2
  546. package/src/loaders/LoadingManager.js +1 -1
  547. package/src/loaders/MaterialLoader.js +49 -7
  548. package/src/loaders/ObjectLoader.js +9 -42
  549. package/src/materials/Material.js +2 -34
  550. package/src/materials/Materials.js +0 -27
  551. package/src/materials/MeshLambertMaterial.js +28 -1
  552. package/src/materials/MeshPhysicalMaterial.js +1 -1
  553. package/src/materials/ShaderMaterial.js +3 -7
  554. package/src/math/Color.js +8 -18
  555. package/src/math/MathUtils.js +1 -7
  556. package/src/math/Matrix3.js +54 -25
  557. package/src/math/Matrix4.js +3 -27
  558. package/src/math/Quaternion.js +1 -21
  559. package/src/math/Ray.js +2 -5
  560. package/src/math/Sphere.js +36 -21
  561. package/src/math/Vector2.js +4 -24
  562. package/src/math/Vector3.js +7 -46
  563. package/src/math/Vector4.js +4 -24
  564. package/src/objects/InstancedMesh.js +7 -0
  565. package/src/objects/LOD.js +25 -6
  566. package/src/renderers/WebGL3DRenderTarget.js +1 -1
  567. package/src/renderers/WebGLArrayRenderTarget.js +1 -1
  568. package/src/renderers/WebGLCubeRenderTarget.js +1 -1
  569. package/src/renderers/WebGLMultipleRenderTargets.js +1 -1
  570. package/src/renderers/WebGLRenderTarget.js +1 -1
  571. package/src/renderers/WebGLRenderer.js +119 -69
  572. package/src/renderers/shaders/ShaderChunk/bsdfs.glsl.js +12 -12
  573. package/src/renderers/shaders/ShaderChunk/bumpmap_pars_fragment.glsl.js +3 -5
  574. package/src/renderers/shaders/ShaderChunk/common.glsl.js +6 -5
  575. package/src/renderers/shaders/ShaderChunk/cube_uv_reflection_fragment.glsl.js +24 -24
  576. package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +0 -4
  577. package/src/renderers/shaders/ShaderChunk/envmap_pars_fragment.glsl.js +1 -1
  578. package/src/renderers/shaders/ShaderChunk/envmap_pars_vertex.glsl.js +1 -1
  579. package/src/renderers/shaders/ShaderChunk/gradientmap_pars_fragment.glsl.js +2 -1
  580. package/src/renderers/shaders/ShaderChunk/iridescence_fragment.glsl.js +113 -99
  581. package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +34 -13
  582. package/src/renderers/shaders/ShaderChunk/lights_lambert_fragment.glsl.js +5 -0
  583. package/src/renderers/shaders/ShaderChunk/lights_lambert_pars_fragment.glsl.js +28 -0
  584. package/src/renderers/shaders/ShaderChunk/lights_phong_pars_fragment.glsl.js +0 -2
  585. package/src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js +3 -1
  586. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +13 -1
  587. package/src/renderers/shaders/ShaderChunk/lights_toon_pars_fragment.glsl.js +0 -2
  588. package/src/renderers/shaders/ShaderChunk/normal_fragment_begin.glsl.js +2 -4
  589. package/src/renderers/shaders/ShaderChunk/normalmap_pars_fragment.glsl.js +2 -4
  590. package/src/renderers/shaders/ShaderChunk/output_fragment.glsl.js +1 -1
  591. package/src/renderers/shaders/ShaderChunk/packing.glsl.js +8 -0
  592. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_fragment.glsl.js +18 -7
  593. package/src/renderers/shaders/ShaderChunk/shadowmap_pars_vertex.glsl.js +8 -3
  594. package/src/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl.js +9 -6
  595. package/src/renderers/shaders/ShaderChunk/shadowmask_pars_fragment.glsl.js +1 -1
  596. package/src/renderers/shaders/ShaderChunk/transmission_fragment.glsl.js +14 -10
  597. package/src/renderers/shaders/ShaderChunk/transmission_pars_fragment.glsl.js +2 -2
  598. package/src/renderers/shaders/ShaderChunk/worldpos_vertex.glsl.js +1 -1
  599. package/src/renderers/shaders/ShaderChunk.js +7 -2
  600. package/src/renderers/shaders/ShaderLib/background.glsl.js +7 -2
  601. package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +62 -0
  602. package/src/renderers/shaders/ShaderLib/cube.glsl.js +4 -6
  603. package/src/renderers/shaders/ShaderLib/meshbasic.glsl.js +0 -1
  604. package/src/renderers/shaders/ShaderLib/meshlambert.glsl.js +22 -50
  605. package/src/renderers/shaders/ShaderLib/meshphong.glsl.js +0 -1
  606. package/src/renderers/shaders/ShaderLib/vsm.glsl.js +0 -3
  607. package/src/renderers/shaders/ShaderLib.js +50 -36
  608. package/src/renderers/shaders/UniformsLib.js +13 -12
  609. package/src/renderers/shaders/UniformsUtils.js +29 -0
  610. package/src/renderers/webgl/WebGLAttributes.js +2 -0
  611. package/src/renderers/webgl/WebGLBackground.js +17 -9
  612. package/src/renderers/webgl/WebGLLights.js +37 -17
  613. package/src/renderers/webgl/WebGLMaterials.js +2 -1
  614. package/src/renderers/webgl/WebGLMorphtargets.js +0 -20
  615. package/src/renderers/webgl/WebGLProgram.js +6 -11
  616. package/src/renderers/webgl/WebGLPrograms.js +30 -26
  617. package/src/renderers/webgl/WebGLRenderLists.js +5 -4
  618. package/src/renderers/webgl/WebGLRenderStates.js +5 -4
  619. package/src/renderers/webgl/WebGLShaderCache.js +9 -6
  620. package/src/renderers/webgl/WebGLShadowMap.js +13 -16
  621. package/src/renderers/webgl/WebGLState.js +125 -41
  622. package/src/renderers/webgl/WebGLTextures.js +94 -39
  623. package/src/renderers/webgl/WebGLUniforms.js +156 -28
  624. package/src/renderers/webgl/WebGLUniformsGroups.js +372 -0
  625. package/src/renderers/webgl/WebGLUtils.js +3 -1
  626. package/src/renderers/webvr/WebVRManager.js +42 -9
  627. package/src/renderers/webvr/WebVRUtils.js +1 -1
  628. package/src/renderers/webxr/WebXRController.js +91 -50
  629. package/src/renderers/webxr/WebXRManager.js +127 -34
  630. package/src/scenes/Scene.js +24 -3
  631. package/src/textures/CompressedArrayTexture.js +18 -0
  632. package/src/textures/Source.js +1 -1
  633. package/src/textures/Texture.js +2 -1
  634. package/src/utils.js +1 -1
  635. package/examples/js/controls/experimental/CameraControls.js +0 -1048
  636. package/examples/js/libs/lottie_canvas.js +0 -12751
  637. package/examples/js/loaders/KTX2Loader.js +0 -558
  638. package/examples/js/shaders/PixelShader.js +0 -51
  639. package/examples/jsm/controls/experimental/CameraControls.js +0 -1248
  640. package/examples/jsm/nodes/accessors/ReflectNode.js +0 -70
  641. package/examples/jsm/nodes/core/NodeVary.js +0 -14
  642. package/examples/jsm/nodes/core/VaryNode.js +0 -54
  643. package/examples/jsm/package.json +0 -3
  644. package/examples/jsm/renderers/webgl/nodes/WebGLPhysicalContextNode.js +0 -45
  645. package/examples/jsm/shaders/PixelShader.js +0 -44
  646. package/src/renderers/shaders/ShaderChunk/lights_lambert_vertex.glsl.js +0 -122
@@ -16,7 +16,7 @@ function __flow__addCSS( css ) {
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 *: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;}` );
19
+ __flow__addCSS( `@keyframes f-animation-open { 0% { transform: scale(.5); opacity: 0; } 100% { transform: scale(1); opacity: 1; }}f-canvas,f-canvas canvas.background,f-canvas canvas.frontground { position: absolute; top: 0; left: 0; margin: 0; padding: 0; width: 100%; height: 100%; -webkit-touch-callout: none; transition: opacity .17s;}f-canvas { cursor: grab;}f-canvas canvas.frontground { z-index: 10;}body.dragging *:not(.drag) { pointer-events: none !important;}f-canvas.grabbing * { cursor: grabbing; user-select: none;}f-canvas canvas.background,f-canvas canvas.frontground { position: fixed; overflow: hidden;}f-canvas canvas.frontground { 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 { left: 0; top: 0;}f-canvas f-content,f-canvas f-area { position: absolute; display: block;}f-canvas canvas.map { position: absolute; top: 10px; right: 10px; z-index: 50; backdrop-filter: blur( 10px ); background-color: rgba( 45, 45, 48, .8 );}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-canvas.focusing canvas.background,f-canvas.focusing f-node:not(.selected),f-canvas.focusing f-element f-disconnect:not(.selected) { opacity: 0; pointer-events: none;}.dragging f-canvas f-element f-disconnect { opacity: 0;}.dragging.node f-canvas.focusing canvas.background,.dragging.node f-canvas.focusing f-node:not(.selected) { opacity: .5;}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, opacity 0.12s 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 { font-size: 18px; margin-right: 6px; vertical-align: sub;}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 f-title { text-align: center; font-size: 15px; padding-top: 2px; position: absolute; top: 50%; transform: translateY( -50% ); width: 100%;}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;}f-canvas.dragging-lio f-node:not(.io-connect) f-element.rio:hover,f-canvas.dragging-rio f-node:not(.io-connect) f-element.lio: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-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; z-index: 100;}f-menu.circle.top { top: 40px;}f-menu.circle.left { left: 40px;}f-menu.circle.bottom { bottom: 40px;}f-menu.circle.right { right: 40px;}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-menu.circle.top f-item f-tooltip { margin-top: 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; } body:not(.connecting) 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.circle.top f-item button:hover > f-tooltip { margin-top: 60px; } 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-element.invalid > f-inputs,f-element.invalid > f-label,f-element.invalid > f-title,f-element.invalid > f-toolbar,f-element.invalid > input,f-element.invalid > select { opacity: .1 !important;}f-canvas { will-change: top, left;}f-node { will-change: transform !important;}` );
20
20
 
21
21
  const REVISION = '1';
22
22
 
@@ -127,8 +127,8 @@ class PointerMonitor {
127
127
 
128
128
  const event = e.touches ? e.touches[ 0 ] : e;
129
129
 
130
- this.x = event.x;
131
- this.y = event.y;
130
+ this.x = event.clientX;
131
+ this.y = event.clientY;
132
132
 
133
133
  };
134
134
 
@@ -158,10 +158,18 @@ class PointerMonitor {
158
158
 
159
159
  const pointer = new PointerMonitor().start();
160
160
 
161
- const draggableDOM = ( dom, callback = null, className = 'dragging' ) => {
161
+ const draggableDOM = ( dom, callback = null, settings = {} ) => {
162
+
163
+ settings = Object.assign( {
164
+ className: 'dragging',
165
+ click: false,
166
+ bypass: false
167
+ }, settings );
162
168
 
163
169
  let dragData = null;
164
170
 
171
+ const { className, click, bypass } = settings;
172
+
165
173
  const getZoom = () => {
166
174
 
167
175
  let zoomDOM = dom;
@@ -188,16 +196,26 @@ const draggableDOM = ( dom, callback = null, className = 'dragging' ) => {
188
196
 
189
197
  const event = e.touches ? e.touches[ 0 ] : e;
190
198
 
191
- e.stopImmediatePropagation();
199
+ if ( bypass === false ) e.stopImmediatePropagation();
192
200
 
193
201
  dragData = {
194
202
  client: { x: event.clientX, y: event.clientY },
195
203
  delta: { x: 0, y: 0 },
196
204
  start: { x: dom.offsetLeft, y: dom.offsetTop },
205
+ frame: 0,
206
+ isDown: true,
197
207
  dragging: false,
198
208
  isTouch: !! e.touches
199
209
  };
200
210
 
211
+ if ( click === true ) {
212
+
213
+ callback( dragData );
214
+
215
+ dragData.frame ++;
216
+
217
+ }
218
+
201
219
  window.addEventListener( 'mousemove', onGlobalMouseMove );
202
220
  window.addEventListener( 'mouseup', onGlobalMouseUp );
203
221
 
@@ -226,13 +244,15 @@ const draggableDOM = ( dom, callback = null, className = 'dragging' ) => {
226
244
 
227
245
  callback( dragData );
228
246
 
247
+ dragData.frame ++;
248
+
229
249
  } else {
230
250
 
231
251
  dom.style.cssText += `; left: ${ dragData.x }px; top: ${ dragData.y }px;`;
232
252
 
233
253
  }
234
254
 
235
- e.stopImmediatePropagation();
255
+ if ( bypass === false ) e.stopImmediatePropagation();
236
256
 
237
257
  } else {
238
258
 
@@ -242,9 +262,9 @@ const draggableDOM = ( dom, callback = null, className = 'dragging' ) => {
242
262
 
243
263
  dom.classList.add( 'drag' );
244
264
 
245
- if ( className ) document.body.classList.add( className );
265
+ if ( className ) document.body.classList.add( ...className.split( ' ' ) );
246
266
 
247
- e.stopImmediatePropagation();
267
+ if ( bypass === false ) e.stopImmediatePropagation();
248
268
 
249
269
  }
250
270
 
@@ -254,11 +274,11 @@ const draggableDOM = ( dom, callback = null, className = 'dragging' ) => {
254
274
 
255
275
  const onGlobalMouseUp = ( e ) => {
256
276
 
257
- e.stopImmediatePropagation();
277
+ if ( bypass === false ) e.stopImmediatePropagation();
258
278
 
259
279
  dom.classList.remove( 'drag' );
260
280
 
261
- if ( className ) document.body.classList.remove( className );
281
+ if ( className ) document.body.classList.remove( ...className.split( ' ' ) );
262
282
 
263
283
  window.removeEventListener( 'mousemove', onGlobalMouseMove );
264
284
  window.removeEventListener( 'mouseup', onGlobalMouseUp );
@@ -274,11 +294,14 @@ const draggableDOM = ( dom, callback = null, className = 'dragging' ) => {
274
294
  }
275
295
 
276
296
  dragData.dragging = false;
297
+ dragData.isDown = false;
277
298
 
278
299
  if ( callback !== null ) {
279
300
 
280
301
  callback( dragData );
281
302
 
303
+ dragData.frame ++;
304
+
282
305
  }
283
306
 
284
307
  };
@@ -315,7 +338,7 @@ const dispatchEventList = ( list, ...params ) => {
315
338
 
316
339
  };
317
340
 
318
- const toPX = ( val ) => {
341
+ const numberToPX = ( val ) => {
319
342
 
320
343
  if ( isNaN( val ) === false ) {
321
344
 
@@ -327,7 +350,7 @@ const toPX = ( val ) => {
327
350
 
328
351
  };
329
352
 
330
- const toHex = ( val ) => {
353
+ const numberToHex = ( val ) => {
331
354
 
332
355
  if ( isNaN( val ) === false ) {
333
356
 
@@ -339,14 +362,39 @@ const toHex = ( val ) => {
339
362
 
340
363
  };
341
364
 
342
- var Utils = /*#__PURE__*/Object.freeze( {
365
+ const rgbaToArray = ( rgba ) => {
366
+
367
+ const values = rgba.substring( rgba.indexOf( '(' ) + 1, rgba.indexOf( ')' ) )
368
+ .split( ',' )
369
+ .map( num => parseInt( num.trim() ) );
370
+
371
+ return values;
372
+
373
+ };
374
+
375
+ const removeDOMClass = ( dom, classList ) => {
376
+
377
+ if ( classList ) classList.split( ' ' ).forEach( alignClass => dom.classList.remove( alignClass ) );
378
+
379
+ };
380
+
381
+ const addDOMClass = ( dom, classList ) => {
382
+
383
+ if ( classList ) classList.split( ' ' ).forEach( alignClass => dom.classList.add( alignClass ) );
384
+
385
+ };
386
+
387
+ var Utils = /*#__PURE__*/Object.freeze({
343
388
  __proto__: null,
344
389
  pointer: pointer,
345
390
  draggableDOM: draggableDOM,
346
391
  dispatchEventList: dispatchEventList,
347
- toPX: toPX,
348
- toHex: toHex
349
- } );
392
+ numberToPX: numberToPX,
393
+ numberToHex: numberToHex,
394
+ rgbaToArray: rgbaToArray,
395
+ removeDOMClass: removeDOMClass,
396
+ addDOMClass: addDOMClass
397
+ });
350
398
 
351
399
  class Link {
352
400
 
@@ -398,8 +446,6 @@ class Element extends Serializer {
398
446
 
399
447
  super();
400
448
 
401
- this.isElement = true;
402
-
403
449
  const dom = document.createElement( 'f-element' );
404
450
  dom.element = this;
405
451
 
@@ -471,7 +517,9 @@ class Element extends Serializer {
471
517
  this.node = null;
472
518
 
473
519
  this.style = '';
520
+ this.color = null;
474
521
 
522
+ this.object = null;
475
523
  this.objectCallback = null;
476
524
 
477
525
  this.enabledInputs = true;
@@ -487,9 +535,6 @@ class Element extends Serializer {
487
535
 
488
536
  this.dom.classList.add( `input-${ Link.InputDirection }` );
489
537
 
490
- this.dom.append( this.lioDOM );
491
- this.dom.append( this.rioDOM );
492
-
493
538
  this.addEventListener( 'connect', ( ) => {
494
539
 
495
540
  dispatchEventList( this.events.connect, this );
@@ -542,9 +587,17 @@ class Element extends Serializer {
542
587
 
543
588
  }
544
589
 
590
+ setObject( value ) {
591
+
592
+ this.object = value;
593
+
594
+ return this;
595
+
596
+ }
597
+
545
598
  getObject( output = null ) {
546
599
 
547
- return this.objectCallback ? this.objectCallback( output ) : null;
600
+ return this.objectCallback ? this.objectCallback( output ) : this.object;
548
601
 
549
602
  }
550
603
 
@@ -586,12 +639,27 @@ class Element extends Serializer {
586
639
 
587
640
  setColor( color ) {
588
641
 
589
- this.dom.style[ 'background-color' ] = toHex( color );
642
+ this.dom.style[ 'background-color' ] = numberToHex( color );
643
+ this.color = null;
590
644
 
591
645
  return this;
592
646
 
593
647
  }
594
648
 
649
+ getColor() {
650
+
651
+ if ( this.color === null ) {
652
+
653
+ const css = window.getComputedStyle( this.dom );
654
+
655
+ this.color = css.getPropertyValue( 'background-color' );
656
+
657
+ }
658
+
659
+ return this.color;
660
+
661
+ }
662
+
595
663
  setStyle( style ) {
596
664
 
597
665
  const dom = this.dom;
@@ -601,6 +669,7 @@ class Element extends Serializer {
601
669
  if ( style ) dom.classList.add( style );
602
670
 
603
671
  this.style = style;
672
+ this.color = null;
604
673
 
605
674
  return this;
606
675
 
@@ -692,7 +761,7 @@ class Element extends Serializer {
692
761
 
693
762
  setLIOColor( color ) {
694
763
 
695
- this.lioDOM.style[ 'border-color' ] = toHex( color );
764
+ this.lioDOM.style[ 'border-color' ] = numberToHex( color );
696
765
 
697
766
  return this;
698
767
 
@@ -704,6 +773,18 @@ class Element extends Serializer {
704
773
 
705
774
  this.lioDOM.style.visibility = length > 0 ? '' : 'hidden';
706
775
 
776
+ if ( length > 0 ) {
777
+
778
+ this.dom.classList.add( 'lio' );
779
+ this.dom.prepend( this.lioDOM );
780
+
781
+ } else {
782
+
783
+ this.dom.classList.remove( 'lio' );
784
+ this.lioDOM.remove();
785
+
786
+ }
787
+
707
788
  return this;
708
789
 
709
790
  }
@@ -716,7 +797,7 @@ class Element extends Serializer {
716
797
 
717
798
  setRIOColor( color ) {
718
799
 
719
- this.rioDOM.style[ 'border-color' ] = toHex( color );
800
+ this.rioDOM.style[ 'border-color' ] = numberToHex( color );
720
801
 
721
802
  return this;
722
803
 
@@ -734,6 +815,18 @@ class Element extends Serializer {
734
815
 
735
816
  this.rioDOM.style.visibility = length > 0 ? '' : 'hidden';
736
817
 
818
+ if ( length > 0 ) {
819
+
820
+ this.dom.classList.add( 'rio' );
821
+ this.dom.prepend( this.rioDOM );
822
+
823
+ } else {
824
+
825
+ this.dom.classList.remove( 'rio' );
826
+ this.rioDOM.remove();
827
+
828
+ }
829
+
737
830
  return this;
738
831
 
739
832
  }
@@ -752,7 +845,7 @@ class Element extends Serializer {
752
845
 
753
846
  setHeight( val ) {
754
847
 
755
- this.dom.style.height = toPX( val );
848
+ this.dom.style.height = numberToPX( val );
756
849
 
757
850
  return this;
758
851
 
@@ -776,6 +869,8 @@ class Element extends Serializer {
776
869
 
777
870
  if ( element !== null ) {
778
871
 
872
+ element = element.baseElement || element;
873
+
779
874
  if ( dispatchEventList( this.events.valid, this, element, 'connect' ) === false ) {
780
875
 
781
876
  return false;
@@ -1085,7 +1180,7 @@ class Element extends Serializer {
1085
1180
 
1086
1181
  }
1087
1182
 
1088
- }, 'connecting' );
1183
+ }, { className: 'connecting' } );
1089
1184
 
1090
1185
  };
1091
1186
 
@@ -1098,14 +1193,14 @@ class Element extends Serializer {
1098
1193
 
1099
1194
  }
1100
1195
 
1196
+ Element.prototype.isElement = true;
1197
+
1101
1198
  class Input extends Serializer {
1102
1199
 
1103
1200
  constructor( dom ) {
1104
1201
 
1105
1202
  super();
1106
1203
 
1107
- this.isInput = true;
1108
-
1109
1204
  this.dom = dom;
1110
1205
 
1111
1206
  this.element = null;
@@ -1234,14 +1329,14 @@ class Input extends Serializer {
1234
1329
 
1235
1330
  }
1236
1331
 
1332
+ Input.prototype.isInput = true;
1333
+
1237
1334
  class Node extends Serializer {
1238
1335
 
1239
1336
  constructor() {
1240
1337
 
1241
1338
  super();
1242
1339
 
1243
- this.isNode = true;
1244
-
1245
1340
  const dom = document.createElement( 'f-node' );
1246
1341
 
1247
1342
  const onDown = () => {
@@ -1308,6 +1403,12 @@ class Node extends Serializer {
1308
1403
 
1309
1404
  }
1310
1405
 
1406
+ get baseElement() {
1407
+
1408
+ return this.elements[ 0 ];
1409
+
1410
+ }
1411
+
1311
1412
  onFocus( callback ) {
1312
1413
 
1313
1414
  this.events.focus.push( callback );
@@ -1342,8 +1443,8 @@ class Node extends Serializer {
1342
1443
 
1343
1444
  const dom = this.dom;
1344
1445
 
1345
- dom.style.left = toPX( x );
1346
- dom.style.top = toPX( y );
1446
+ dom.style.left = numberToPX( x );
1447
+ dom.style.top = numberToPX( y );
1347
1448
 
1348
1449
  return this;
1349
1450
 
@@ -1362,7 +1463,7 @@ class Node extends Serializer {
1362
1463
 
1363
1464
  setWidth( val ) {
1364
1465
 
1365
- this.dom.style.width = toPX( val );
1466
+ this.dom.style.width = numberToPX( val );
1366
1467
 
1367
1468
  return this;
1368
1469
 
@@ -1374,6 +1475,22 @@ class Node extends Serializer {
1374
1475
 
1375
1476
  }
1376
1477
 
1478
+ getHeight() {
1479
+
1480
+ return this.dom.offsetHeight;
1481
+
1482
+ }
1483
+
1484
+ getBound() {
1485
+
1486
+ const { x, y } = this.getPosition();
1487
+ const width = this.getWidth();
1488
+ const height = this.getHeight();
1489
+
1490
+ return { x, y, width, height };
1491
+
1492
+ }
1493
+
1377
1494
  add( element ) {
1378
1495
 
1379
1496
  this.elements.push( element );
@@ -1452,6 +1569,12 @@ class Node extends Serializer {
1452
1569
 
1453
1570
  }
1454
1571
 
1572
+ getColor() {
1573
+
1574
+ return this.elements[ 0 ]?.getColor();
1575
+
1576
+ }
1577
+
1455
1578
  serialize( data ) {
1456
1579
 
1457
1580
  const { x, y } = this.getPosition();
@@ -1514,6 +1637,8 @@ class Node extends Serializer {
1514
1637
 
1515
1638
  }
1516
1639
 
1640
+ Node.prototype.isNode = true;
1641
+
1517
1642
  class DraggableElement extends Element {
1518
1643
 
1519
1644
  constructor( draggable = true ) {
@@ -1528,7 +1653,7 @@ class DraggableElement extends Element {
1528
1653
 
1529
1654
  if ( this.draggable === true ) {
1530
1655
 
1531
- draggableDOM( this.node.dom );
1656
+ draggableDOM( this.node.dom, null, { className: 'dragging node' } );
1532
1657
 
1533
1658
  }
1534
1659
 
@@ -1553,8 +1678,16 @@ class TitleElement extends DraggableElement {
1553
1678
 
1554
1679
  dom.className = 'title';
1555
1680
 
1556
- const spanDOM = document.createElement( 'span' );
1557
- spanDOM.innerText = title;
1681
+ const dbClick = () => {
1682
+
1683
+ this.node.canvas.focusSelected = ! this.node.canvas.focusSelected;
1684
+
1685
+ };
1686
+
1687
+ dom.addEventListener( 'dblclick', dbClick );
1688
+
1689
+ const titleDOM = document.createElement( 'f-title' );
1690
+ titleDOM.innerText = title;
1558
1691
 
1559
1692
  const iconDOM = document.createElement( 'i' );
1560
1693
 
@@ -1562,11 +1695,11 @@ class TitleElement extends DraggableElement {
1562
1695
 
1563
1696
  this.buttons = [];
1564
1697
 
1565
- this.spanDOM = spanDOM;
1698
+ this.titleDOM = titleDOM;
1566
1699
  this.iconDOM = iconDOM;
1567
1700
  this.toolbarDOM = toolbarDOM;
1568
1701
 
1569
- dom.append( spanDOM );
1702
+ dom.append( titleDOM );
1570
1703
  dom.append( iconDOM );
1571
1704
  dom.append( toolbarDOM );
1572
1705
 
@@ -1588,7 +1721,7 @@ class TitleElement extends DraggableElement {
1588
1721
 
1589
1722
  setTitle( value ) {
1590
1723
 
1591
- this.spanDOM.innerText = value;
1724
+ this.titleDOM.innerText = value;
1592
1725
 
1593
1726
  return this;
1594
1727
 
@@ -1596,7 +1729,7 @@ class TitleElement extends DraggableElement {
1596
1729
 
1597
1730
  getTitle() {
1598
1731
 
1599
- return this.spanDOM.innerText;
1732
+ return this.titleDOM.innerText;
1600
1733
 
1601
1734
  }
1602
1735
 
@@ -1699,9 +1832,11 @@ class Canvas extends Serializer {
1699
1832
 
1700
1833
  const canvas = document.createElement( 'canvas' );
1701
1834
  const frontCanvas = document.createElement( 'canvas' );
1835
+ const mapCanvas = document.createElement( 'canvas' );
1702
1836
 
1703
1837
  const context = canvas.getContext( '2d' );
1704
1838
  const frontContext = frontCanvas.getContext( '2d' );
1839
+ const mapContext = mapCanvas.getContext( '2d' );
1705
1840
 
1706
1841
  this.dom = dom;
1707
1842
 
@@ -1711,12 +1846,11 @@ class Canvas extends Serializer {
1711
1846
 
1712
1847
  this.canvas = canvas;
1713
1848
  this.frontCanvas = frontCanvas;
1849
+ this.mapCanvas = mapCanvas;
1714
1850
 
1715
1851
  this.context = context;
1716
1852
  this.frontContext = frontContext;
1717
-
1718
- this.width = 10000;
1719
- this.height = 10000;
1853
+ this.mapContext = mapContext;
1720
1854
 
1721
1855
  this.clientX = 0;
1722
1856
  this.clientY = 0;
@@ -1724,8 +1858,6 @@ class Canvas extends Serializer {
1724
1858
  this.relativeClientX = 0;
1725
1859
  this.relativeClientY = 0;
1726
1860
 
1727
- this.zoom = 1;
1728
-
1729
1861
  this.nodes = [];
1730
1862
 
1731
1863
  this.selected = null;
@@ -1738,13 +1870,20 @@ class Canvas extends Serializer {
1738
1870
  'drop': []
1739
1871
  };
1740
1872
 
1741
- frontCanvas.className = 'front';
1742
-
1743
- contentDOM.style.left = toPX( this.centerX );
1744
- contentDOM.style.top = toPX( this.centerY );
1873
+ this._scrollLeft = 0;
1874
+ this._scrollTop = 0;
1875
+ this._zoom = 1;
1876
+ this._width = 0;
1877
+ this._height = 0;
1878
+ this._focusSelected = false;
1879
+ this._mapInfo = {
1880
+ scale: 1,
1881
+ screen: {}
1882
+ };
1745
1883
 
1746
- areaDOM.style.width = `calc( 100% + ${ this.width }px )`;
1747
- areaDOM.style.height = `calc( 100% + ${ this.height }px )`;
1884
+ canvas.className = 'background';
1885
+ frontCanvas.className = 'frontground';
1886
+ mapCanvas.className = 'map';
1748
1887
 
1749
1888
  dropDOM.innerHTML = '<span>drop your file</span>';
1750
1889
 
@@ -1753,77 +1892,108 @@ class Canvas extends Serializer {
1753
1892
  dom.append( frontCanvas );
1754
1893
  dom.append( contentDOM );
1755
1894
  dom.append( areaDOM );
1756
- /*
1757
- let zoomTouchData = null;
1895
+ dom.append( mapCanvas );
1896
+
1897
+ const zoomTo = ( zoom, clientX = this.clientX, clientY = this.clientY ) => {
1758
1898
 
1759
- const onZoomStart = () => {
1899
+ zoom = Math.min( Math.max( zoom, .2 ), 1 );
1760
1900
 
1761
- zoomTouchData = null;
1901
+ this.scrollLeft -= ( clientX / this.zoom ) - ( clientX / zoom );
1902
+ this.scrollTop -= ( clientY / this.zoom ) - ( clientY / zoom );
1903
+ this.zoom = zoom;
1762
1904
 
1763
1905
  };
1764
- */
1765
- const onZoom = ( e ) => {
1766
1906
 
1767
- if ( e.touches ) {
1907
+ let touchData = null;
1768
1908
 
1769
- if ( e.touches.length === 2 ) {
1909
+ const onTouchStart = () => {
1770
1910
 
1771
- e.preventDefault();
1911
+ touchData = null;
1772
1912
 
1773
- e.stopImmediatePropagation();
1774
- /*
1775
- const clientX = ( e.touches[ 0 ].clientX + e.touches[ 1 ].clientX ) / 2;
1776
- const clientY = ( e.touches[ 0 ].clientY + e.touches[ 1 ].clientY ) / 2;
1913
+ };
1777
1914
 
1778
- const distance = Math.hypot(
1779
- e.touches[ 0 ].clientX - e.touches[ 1 ].clientX,
1780
- e.touches[ 0 ].clientY - e.touches[ 1 ].clientY
1781
- );
1915
+ const onMouseZoom = ( e ) => {
1916
+
1917
+ e.preventDefault();
1782
1918
 
1783
- if ( zoomTouchData === null ) {
1919
+ e.stopImmediatePropagation();
1784
1920
 
1785
- zoomTouchData = {
1786
- distance
1787
- };
1921
+ const delta = e.deltaY * .003;
1788
1922
 
1789
- }
1923
+ zoomTo( this.zoom - delta );
1924
+
1925
+ };
1926
+
1927
+ const onTouchZoom = ( e ) => {
1928
+
1929
+ if ( e.touches && e.touches.length === 2 ) {
1930
+
1931
+ e.preventDefault();
1932
+
1933
+ e.stopImmediatePropagation();
1790
1934
 
1791
- const delta = ( zoomTouchData.distance - distance );
1792
- zoomTouchData.distance = distance;
1935
+ const clientX = ( e.touches[ 0 ].clientX + e.touches[ 1 ].clientX ) / 2;
1936
+ const clientY = ( e.touches[ 0 ].clientY + e.touches[ 1 ].clientY ) / 2;
1793
1937
 
1794
- let zoom = Math.min( Math.max( this.zoom - delta * .01, .5 ), 1.2 );
1938
+ const distance = Math.hypot(
1939
+ e.touches[ 0 ].clientX - e.touches[ 1 ].clientX,
1940
+ e.touches[ 0 ].clientY - e.touches[ 1 ].clientY
1941
+ );
1795
1942
 
1796
- if ( zoom < .52 ) zoom = .5;
1797
- else if ( zoom > .98 ) zoom = 1;
1943
+ if ( touchData === null ) {
1798
1944
 
1799
- contentDOM.style.left = toPX( this.centerX / zoom );
1800
- contentDOM.style.top = toPX( this.centerY / zoom );
1801
- contentDOM.style.zoom = this.zoom = zoom;
1802
- */
1945
+ touchData = {
1946
+ distance
1947
+ };
1803
1948
 
1804
1949
  }
1805
1950
 
1806
- } else {
1951
+ const delta = ( touchData.distance - distance ) * .003;
1952
+ touchData.distance = distance;
1953
+
1954
+ zoomTo( this.zoom - delta, clientX, clientY );
1955
+
1956
+ }
1957
+
1958
+ };
1959
+
1960
+ const onTouchMove = ( e ) => {
1961
+
1962
+ if ( e.touches && e.touches.length === 1 ) {
1807
1963
 
1808
1964
  e.preventDefault();
1809
1965
 
1810
1966
  e.stopImmediatePropagation();
1811
- /*
1812
- const delta = e.deltaY / 100;
1813
- const zoom = Math.min( Math.max( this.zoom - delta * .1, .5 ), 1 );
1814
1967
 
1815
- contentDOM.style.left = toPX( this.centerX / zoom );
1816
- contentDOM.style.top = toPX( this.centerY / zoom );
1817
- contentDOM.style.zoom = this.zoom = zoom;
1818
- */
1968
+ const clientX = e.touches[ 0 ].clientX;
1969
+ const clientY = e.touches[ 0 ].clientY;
1970
+
1971
+ if ( touchData === null ) {
1972
+
1973
+ const { scrollLeft, scrollTop } = this;
1974
+
1975
+ touchData = {
1976
+ scrollLeft,
1977
+ scrollTop,
1978
+ clientX,
1979
+ clientY
1980
+ };
1981
+
1982
+ }
1983
+
1984
+ const zoom = this.zoom;
1985
+
1986
+ this.scrollLeft = touchData.scrollLeft + ( ( clientX - touchData.clientX ) / zoom );
1987
+ this.scrollTop = touchData.scrollTop + ( ( clientY - touchData.clientY ) / zoom );
1819
1988
 
1820
1989
  }
1821
1990
 
1822
1991
  };
1823
1992
 
1824
- dom.addEventListener( 'wheel', onZoom );
1825
- dom.addEventListener( 'touchmove', onZoom );
1826
- //dom.addEventListener( 'touchstart', onZoomStart );
1993
+ dom.addEventListener( 'wheel', onMouseZoom );
1994
+ dom.addEventListener( 'touchmove', onTouchZoom );
1995
+ dom.addEventListener( 'touchstart', onTouchStart );
1996
+ canvas.addEventListener( 'touchmove', onTouchMove );
1827
1997
 
1828
1998
  let dropEnterCount = 0;
1829
1999
 
@@ -1895,13 +2065,15 @@ class Canvas extends Serializer {
1895
2065
 
1896
2066
  if ( data.scrollTop === undefined ) {
1897
2067
 
1898
- data.scrollLeft = dom.scrollLeft;
1899
- data.scrollTop = dom.scrollTop;
2068
+ data.scrollLeft = this.scrollLeft;
2069
+ data.scrollTop = this.scrollTop;
1900
2070
 
1901
2071
  }
1902
2072
 
1903
- dom.scrollLeft = data.scrollLeft - delta.x;
1904
- dom.scrollTop = data.scrollTop - delta.y;
2073
+ const zoom = this.zoom;
2074
+
2075
+ this.scrollLeft = data.scrollLeft + ( delta.x / zoom );
2076
+ this.scrollTop = data.scrollTop + ( delta.y / zoom );
1905
2077
 
1906
2078
  }
1907
2079
 
@@ -1915,7 +2087,48 @@ class Canvas extends Serializer {
1915
2087
 
1916
2088
  }
1917
2089
 
1918
- }, 'dragging-canvas' );
2090
+ }, { className: 'dragging-canvas' } );
2091
+
2092
+
2093
+ draggableDOM( mapCanvas, ( data ) => {
2094
+
2095
+ const { scale, screen } = this._mapInfo;
2096
+
2097
+ if ( data.scrollLeft === undefined ) {
2098
+
2099
+ const rect = this.mapCanvas.getBoundingClientRect();
2100
+
2101
+ const clientMapX = data.client.x - rect.left;
2102
+ const clientMapY = data.client.y - rect.top;
2103
+
2104
+ const overMapScreen =
2105
+ clientMapX > screen.x && clientMapY > screen.y &&
2106
+ clientMapX < screen.x + screen.width && clientMapY < screen.y + screen.height;
2107
+
2108
+ if ( overMapScreen === false ) {
2109
+
2110
+ const scaleX = this._mapInfo.width / this.mapCanvas.width;
2111
+
2112
+ let scrollLeft = - this._mapInfo.left - ( clientMapX * scaleX );
2113
+ let scrollTop = - this._mapInfo.top - ( clientMapY * ( this._mapInfo.height / this.mapCanvas.height ) );
2114
+
2115
+ scrollLeft += ( screen.width / 2 ) / scale;
2116
+ scrollTop += ( screen.height / 2 ) / scale;
2117
+
2118
+ this.scrollLeft = scrollLeft;
2119
+ this.scrollTop = scrollTop;
2120
+
2121
+ }
2122
+
2123
+ data.scrollLeft = this.scrollLeft;
2124
+ data.scrollTop = this.scrollTop;
2125
+
2126
+ }
2127
+
2128
+ this.scrollLeft = data.scrollLeft - ( data.delta.x / scale );
2129
+ this.scrollTop = data.scrollTop - ( data.delta.y / scale );
2130
+
2131
+ }, { click: true } );
1919
2132
 
1920
2133
  this._onMoveEvent = ( e ) => {
1921
2134
 
@@ -1925,14 +2138,11 @@ class Canvas extends Serializer {
1925
2138
  this.clientX = event.clientX;
1926
2139
  this.clientY = event.clientY;
1927
2140
 
1928
- this.relativeClientX = ( ( ( dom.scrollLeft - this.centerX ) + event.clientX ) - rect.left ) / zoom;
1929
- this.relativeClientY = ( ( ( dom.scrollTop - this.centerY ) + event.clientY ) - rect.top ) / zoom;
1930
-
1931
- };
1932
-
1933
- this._onContentLoaded = () => {
2141
+ const rectClientX = ( this.clientX - rect.left ) / zoom;
2142
+ const rectClientY = ( this.clientY - rect.top ) / zoom;
1934
2143
 
1935
- this.centralize();
2144
+ this.relativeClientX = rectClientX - this.scrollLeft;
2145
+ this.relativeClientY = rectClientY - this.scrollTop;
1936
2146
 
1937
2147
  };
1938
2148
 
@@ -1946,33 +2156,110 @@ class Canvas extends Serializer {
1946
2156
 
1947
2157
  }
1948
2158
 
2159
+ getBounds() {
2160
+
2161
+ const bounds = { x: Infinity, y: Infinity, width: - Infinity, height: - Infinity };
2162
+
2163
+ for ( const node of this.nodes ) {
2164
+
2165
+ const { x, y, width, height } = node.getBound();
2166
+
2167
+ bounds.x = Math.min( bounds.x, x );
2168
+ bounds.y = Math.min( bounds.y, y );
2169
+ bounds.width = Math.max( bounds.width, x + width );
2170
+ bounds.height = Math.max( bounds.height, y + height );
2171
+
2172
+ }
2173
+
2174
+ bounds.x = Math.round( bounds.x );
2175
+ bounds.y = Math.round( bounds.y );
2176
+ bounds.width = Math.round( bounds.width );
2177
+ bounds.height = Math.round( bounds.height );
2178
+
2179
+ return bounds;
2180
+
2181
+ }
2182
+
2183
+ get width() {
2184
+
2185
+ return this._width;
2186
+
2187
+ }
2188
+
2189
+ get height() {
2190
+
2191
+ return this._height;
2192
+
2193
+ }
2194
+
1949
2195
  get rect() {
1950
2196
 
1951
2197
  return this.dom.getBoundingClientRect();
1952
2198
 
1953
2199
  }
1954
2200
 
1955
- get relativeX() {
2201
+ get zoom() {
2202
+
2203
+ return this._zoom;
2204
+
2205
+ }
2206
+
2207
+ set zoom( val ) {
2208
+
2209
+ this._zoom = val;
2210
+ this.contentDOM.style.zoom = val;
2211
+
2212
+ }
2213
+
2214
+ set scrollLeft( val ) {
2215
+
2216
+ this._scrollLeft = val;
2217
+ this.contentDOM.style.left = numberToPX( val );
2218
+
2219
+ }
2220
+
2221
+ get scrollLeft() {
2222
+
2223
+ return this._scrollLeft;
2224
+
2225
+ }
2226
+
2227
+ set scrollTop( val ) {
1956
2228
 
1957
- return this.dom.scrollLeft - this.centerX;
2229
+ this._scrollTop = val;
2230
+ this.contentDOM.style.top = numberToPX( val );
1958
2231
 
1959
2232
  }
1960
2233
 
1961
- get relativeY() {
2234
+ get scrollTop() {
1962
2235
 
1963
- return this.dom.scrollTop - this.centerY;
2236
+ return this._scrollTop;
1964
2237
 
1965
2238
  }
1966
2239
 
1967
- get centerX() {
2240
+ set focusSelected( value ) {
2241
+
2242
+ if ( this._focusSelected === value ) return;
2243
+
2244
+ const classList = this.dom.classList;
2245
+
2246
+ this._focusSelected = value;
1968
2247
 
1969
- return this.width / 2;
2248
+ if ( value ) {
2249
+
2250
+ classList.add( 'focusing' );
2251
+
2252
+ } else {
2253
+
2254
+ classList.remove( 'focusing' );
2255
+
2256
+ }
1970
2257
 
1971
2258
  }
1972
2259
 
1973
- get centerY() {
2260
+ get focusSelected() {
1974
2261
 
1975
- return this.height / 2;
2262
+ return this._focusSelected;
1976
2263
 
1977
2264
  }
1978
2265
 
@@ -1998,8 +2285,6 @@ class Canvas extends Serializer {
1998
2285
 
1999
2286
  document.addEventListener( 'dragover', this._onMoveEvent, true );
2000
2287
 
2001
- document.addEventListener( 'DOMContentLoaded', this._onContentLoaded );
2002
-
2003
2288
  requestAnimationFrame( this._onUpdate );
2004
2289
 
2005
2290
  }
@@ -2018,8 +2303,6 @@ class Canvas extends Serializer {
2018
2303
 
2019
2304
  document.removeEventListener( 'dragover', this._onMoveEvent, true );
2020
2305
 
2021
- document.removeEventListener( 'DOMContentLoaded', this._onContentLoaded );
2022
-
2023
2306
  }
2024
2307
 
2025
2308
  add( node ) {
@@ -2114,7 +2397,21 @@ class Canvas extends Serializer {
2114
2397
 
2115
2398
  centralize() {
2116
2399
 
2117
- this.dom.scroll( this.centerX, this.centerY );
2400
+ const bounds = this.getBounds();
2401
+
2402
+ this.scrollLeft = ( this.canvas.width / 2 ) - ( ( - bounds.x + bounds.width ) / 2 );
2403
+ this.scrollTop = ( this.canvas.height / 2 ) - ( ( - bounds.y + bounds.height ) / 2 );
2404
+
2405
+ return this;
2406
+
2407
+ }
2408
+
2409
+ setSize( width, height ) {
2410
+
2411
+ this._width = width;
2412
+ this._height = height;
2413
+
2414
+ this.update();
2118
2415
 
2119
2416
  return this;
2120
2417
 
@@ -2128,6 +2425,8 @@ class Canvas extends Serializer {
2128
2425
 
2129
2426
  if ( previousNode !== null ) {
2130
2427
 
2428
+ this.focusSelected = false;
2429
+
2131
2430
  previousNode.dom.classList.remove( 'selected' );
2132
2431
 
2133
2432
  this.selected = null;
@@ -2148,31 +2447,116 @@ class Canvas extends Serializer {
2148
2447
 
2149
2448
  }
2150
2449
 
2151
- update() {
2450
+ updateMap() {
2152
2451
 
2153
- if ( this.updating === false ) return;
2452
+ const { nodes, mapCanvas, mapContext, scrollLeft, scrollTop, canvas, zoom, _mapInfo } = this;
2154
2453
 
2155
- requestAnimationFrame( this._onUpdate );
2454
+ const bounds = this.getBounds();
2455
+
2456
+ mapCanvas.width = 300;
2457
+ mapCanvas.height = 200;
2458
+
2459
+ mapContext.clearRect( 0, 0, mapCanvas.width, mapCanvas.height );
2460
+
2461
+ mapContext.fillStyle = 'rgba( 0, 0, 0, 0 )';
2462
+ mapContext.fillRect( 0, 0, mapCanvas.width, mapCanvas.height );
2463
+
2464
+ const boundsWidth = - bounds.x + bounds.width;
2465
+ const boundsHeight = - bounds.y + bounds.height;
2466
+
2467
+ const mapScale = Math.min( mapCanvas.width / boundsWidth, mapCanvas.height / boundsHeight ) * .5;
2468
+
2469
+ const boundsMapWidth = boundsWidth * mapScale;
2470
+ const boundsMapHeight = boundsHeight * mapScale;
2471
+
2472
+ const boundsOffsetX = ( mapCanvas.width / 2 ) - ( boundsMapWidth / 2 );
2473
+ const boundsOffsetY = ( mapCanvas.height / 2 ) - ( boundsMapHeight / 2 );
2474
+
2475
+ let selectedNode = null;
2476
+
2477
+ for ( const node of nodes ) {
2478
+
2479
+ const nodeBound = node.getBound();
2480
+ const nodeColor = node.getColor();
2481
+
2482
+ nodeBound.x += - bounds.x;
2483
+ nodeBound.y += - bounds.y;
2484
+
2485
+ nodeBound.x *= mapScale;
2486
+ nodeBound.y *= mapScale;
2487
+ nodeBound.width *= mapScale;
2488
+ nodeBound.height *= mapScale;
2489
+
2490
+ nodeBound.x += boundsOffsetX;
2491
+ nodeBound.y += boundsOffsetY;
2492
+
2493
+ if ( node !== this.selected ) {
2494
+
2495
+ mapContext.fillStyle = nodeColor;
2496
+ mapContext.fillRect( nodeBound.x, nodeBound.y, nodeBound.width, nodeBound.height );
2497
+
2498
+ } else {
2499
+
2500
+ selectedNode = {
2501
+ nodeBound,
2502
+ nodeColor
2503
+ };
2504
+
2505
+ }
2506
+
2507
+ }
2508
+
2509
+ if ( selectedNode !== null ) {
2510
+
2511
+ const { nodeBound, nodeColor } = selectedNode;
2512
+
2513
+ mapContext.fillStyle = nodeColor;
2514
+ mapContext.fillRect( nodeBound.x, nodeBound.y, nodeBound.width, nodeBound.height );
2515
+
2516
+ }
2517
+
2518
+ const screenMapX = ( - ( scrollLeft + bounds.x ) * mapScale ) + boundsOffsetX;
2519
+ const screenMapY = ( - ( scrollTop + bounds.y ) * mapScale ) + boundsOffsetY;
2520
+ const screenMapWidth = ( canvas.width * mapScale ) / zoom;
2521
+ const screenMapHeight = ( canvas.height * mapScale ) / zoom;
2156
2522
 
2157
- const { dom, zoom, canvas, frontCanvas, frontContext, context } = this;
2523
+ mapContext.fillStyle = 'rgba( 200, 200, 200, 0.1 )';
2524
+ mapContext.fillRect( screenMapX, screenMapY, screenMapWidth, screenMapHeight );
2158
2525
 
2159
- const width = window.innerWidth;
2160
- const height = window.innerHeight;
2526
+ //
2527
+
2528
+ _mapInfo.scale = mapScale;
2529
+ _mapInfo.left = ( - boundsOffsetX / mapScale ) + bounds.x;
2530
+ _mapInfo.top = ( - boundsOffsetY / mapScale ) + bounds.y;
2531
+ _mapInfo.width = mapCanvas.width / mapScale;
2532
+ _mapInfo.height = mapCanvas.height / mapScale;
2533
+ _mapInfo.screen.x = screenMapX;
2534
+ _mapInfo.screen.y = screenMapY;
2535
+ _mapInfo.screen.width = screenMapWidth;
2536
+ _mapInfo.screen.height = screenMapHeight;
2537
+
2538
+ }
2539
+
2540
+ updateLines() {
2541
+
2542
+ const { dom, zoom, canvas, frontCanvas, frontContext, context, _width, _height } = this;
2161
2543
 
2162
2544
  const domRect = this.rect;
2163
2545
 
2164
- if ( canvas.width !== width || canvas.height !== height ) {
2546
+ if ( canvas.width !== _width || canvas.height !== _height ) {
2165
2547
 
2166
- canvas.width = width;
2167
- canvas.height = height;
2548
+ canvas.width = _width;
2549
+ canvas.height = _height;
2168
2550
 
2169
- frontCanvas.width = width;
2170
- frontCanvas.height = height;
2551
+ frontCanvas.width = _width;
2552
+ frontCanvas.height = _height;
2171
2553
 
2172
2554
  }
2173
2555
 
2174
- context.clearRect( 0, 0, width, height );
2175
- frontContext.clearRect( 0, 0, width, height );
2556
+ context.clearRect( 0, 0, _width, _height );
2557
+ frontContext.clearRect( 0, 0, _width, _height );
2558
+
2559
+ //
2176
2560
 
2177
2561
  context.globalCompositeOperation = 'lighter';
2178
2562
  frontContext.globalCompositeOperation = 'source-over';
@@ -2321,6 +2705,18 @@ class Canvas extends Serializer {
2321
2705
 
2322
2706
  }
2323
2707
 
2708
+
2709
+ update() {
2710
+
2711
+ if ( this.updating === false ) return;
2712
+
2713
+ requestAnimationFrame( this._onUpdate );
2714
+
2715
+ this.updateLines();
2716
+ this.updateMap();
2717
+
2718
+ }
2719
+
2324
2720
  serialize( data ) {
2325
2721
 
2326
2722
  const nodes = [];
@@ -2484,7 +2880,7 @@ class ObjectNode extends Node {
2484
2880
 
2485
2881
  }
2486
2882
 
2487
- const ENTER_KEY$1 = 13;
2883
+ const ENTER_KEY$2 = 13;
2488
2884
 
2489
2885
  class StringInput extends Input {
2490
2886
 
@@ -2512,7 +2908,7 @@ class StringInput extends Input {
2512
2908
 
2513
2909
  dom.onkeyup = ( e ) => {
2514
2910
 
2515
- if ( e.keyCode === ENTER_KEY$1 ) {
2911
+ if ( e.keyCode === ENTER_KEY$2 ) {
2516
2912
 
2517
2913
  e.target.blur();
2518
2914
 
@@ -2528,7 +2924,7 @@ class StringInput extends Input {
2528
2924
 
2529
2925
  }
2530
2926
 
2531
- const ENTER_KEY = 13;
2927
+ const ENTER_KEY$1 = 13;
2532
2928
 
2533
2929
  class NumberInput extends Input {
2534
2930
 
@@ -2565,6 +2961,8 @@ class NumberInput extends Input {
2565
2961
 
2566
2962
  dom.onblur = () => {
2567
2963
 
2964
+ this.dom.value = this._getString( this.dom.value );
2965
+
2568
2966
  this.dispatchEvent( new Event( 'blur' ) );
2569
2967
 
2570
2968
  };
@@ -2583,7 +2981,7 @@ class NumberInput extends Input {
2583
2981
 
2584
2982
  }
2585
2983
 
2586
- if ( e.keyCode === ENTER_KEY ) {
2984
+ if ( e.keyCode === ENTER_KEY$1 ) {
2587
2985
 
2588
2986
  e.target.blur();
2589
2987
 
@@ -2597,6 +2995,8 @@ class NumberInput extends Input {
2597
2995
 
2598
2996
  const { delta } = data;
2599
2997
 
2998
+ if ( dom.readOnly === true ) return;
2999
+
2600
3000
  if ( data.value === undefined ) {
2601
3001
 
2602
3002
  data.value = this.getValue();
@@ -2607,7 +3007,7 @@ class NumberInput extends Input {
2607
3007
 
2608
3008
  const value = data.value + ( diff * this.step );
2609
3009
 
2610
- this.dom.value = this._getString( value.toFixed( this.precision ) );
3010
+ dom.value = this._getString( value.toFixed( this.precision ) );
2611
3011
 
2612
3012
  this.dispatchEvent( new Event( 'change' ) );
2613
3013
 
@@ -2737,6 +3137,8 @@ class SliderInput extends Input {
2737
3137
 
2738
3138
  rangeDOM.value = field.getValue();
2739
3139
 
3140
+ this.dispatchEvent( new Event( 'change' ) );
3141
+
2740
3142
  } );
2741
3143
 
2742
3144
  field.addEventListener( 'range', () => {
@@ -2776,7 +3178,7 @@ class SliderInput extends Input {
2776
3178
 
2777
3179
  this.dispatchEvent( new Event( 'change' ) );
2778
3180
 
2779
- }, '' );
3181
+ }, { className: '' } );
2780
3182
 
2781
3183
  }
2782
3184
 
@@ -2855,7 +3257,7 @@ class ColorInput extends Input {
2855
3257
  super( dom );
2856
3258
 
2857
3259
  dom.type = 'color';
2858
- dom.value = toHex( value );
3260
+ dom.value = numberToHex( value );
2859
3261
 
2860
3262
  dom.oninput = () => {
2861
3263
 
@@ -2867,18 +3269,20 @@ class ColorInput extends Input {
2867
3269
 
2868
3270
  setValue( value, dispatch = true ) {
2869
3271
 
2870
- return super.setValue( toHex( value ), dispatch );
3272
+ return super.setValue( numberToHex( value ), dispatch );
2871
3273
 
2872
3274
  }
2873
3275
 
2874
3276
  getValue() {
2875
3277
 
2876
- return parseInt( super.getValue().slice( 1 ), 16 );
3278
+ return parseInt( super.getValue().substr( 1 ), 16 );
2877
3279
 
2878
3280
  }
2879
3281
 
2880
3282
  }
2881
3283
 
3284
+ const ENTER_KEY = 13;
3285
+
2882
3286
  class TextInput extends Input {
2883
3287
 
2884
3288
  constructor( innerText = '' ) {
@@ -2888,19 +3292,31 @@ class TextInput extends Input {
2888
3292
 
2889
3293
  dom.innerText = innerText;
2890
3294
 
2891
- }
3295
+ dom.onblur = () => {
2892
3296
 
2893
- setValue( val ) {
3297
+ this.dispatchEvent( new Event( 'blur' ) );
2894
3298
 
2895
- this.dom.innerText = val;
3299
+ };
2896
3300
 
2897
- return this;
3301
+ dom.onchange = () => {
2898
3302
 
2899
- }
3303
+ this.dispatchEvent( new Event( 'change' ) );
2900
3304
 
2901
- getValue() {
3305
+ };
2902
3306
 
2903
- return this.dom.innerText;
3307
+ dom.onkeyup = ( e ) => {
3308
+
3309
+ if ( e.keyCode === ENTER_KEY ) {
3310
+
3311
+ e.target.blur();
3312
+
3313
+ }
3314
+
3315
+ e.stopPropagation();
3316
+
3317
+ this.dispatchEvent( new Event( 'change' ) );
3318
+
3319
+ };
2904
3320
 
2905
3321
  }
2906
3322
 
@@ -2916,13 +3332,11 @@ class LabelElement extends Element {
2916
3332
  this.inputsDOM = document.createElement( 'f-inputs' );
2917
3333
 
2918
3334
  const spanDOM = document.createElement( 'span' );
2919
- const iconDOM = document.createElement( 'i' );
2920
3335
 
2921
3336
  this.spanDOM = spanDOM;
2922
- this.iconDOM = iconDOM;
3337
+ this.iconDOM = null;
2923
3338
 
2924
- this.labelDOM.append( this.spanDOM );
2925
- this.labelDOM.append( this.iconDOM );
3339
+ this.labelDOM.append( spanDOM );
2926
3340
 
2927
3341
  this.dom.append( this.labelDOM );
2928
3342
  this.dom.append( this.inputsDOM );
@@ -2936,15 +3350,19 @@ class LabelElement extends Element {
2936
3350
 
2937
3351
  setIcon( value ) {
2938
3352
 
3353
+ this.iconDOM = this.iconDOM || document.createElement( 'i' );
2939
3354
  this.iconDOM.className = value;
2940
3355
 
3356
+ if ( value ) this.labelDOM.prepend( this.iconDOM );
3357
+ else this.iconDOM.remove();
3358
+
2941
3359
  return this;
2942
3360
 
2943
3361
  }
2944
3362
 
2945
3363
  getIcon() {
2946
3364
 
2947
- return this.iconDOM.className;
3365
+ return this.iconDOM?.className;
2948
3366
 
2949
3367
  }
2950
3368
 
@@ -3135,7 +3553,7 @@ class Menu extends EventTarget {
3135
3553
  super();
3136
3554
 
3137
3555
  const dom = document.createElement( 'f-menu' );
3138
- dom.className = className + ' hidden';
3556
+ dom.className = className + ' bottom left hidden';
3139
3557
 
3140
3558
  const listDOM = document.createElement( 'f-list' );
3141
3559
 
@@ -3146,6 +3564,8 @@ class Menu extends EventTarget {
3146
3564
 
3147
3565
  this.visible = false;
3148
3566
 
3567
+ this.align = 'bottom left';
3568
+
3149
3569
  this.subMenus = new WeakMap();
3150
3570
  this.domButtons = new WeakMap();
3151
3571
 
@@ -3163,6 +3583,25 @@ class Menu extends EventTarget {
3163
3583
 
3164
3584
  }
3165
3585
 
3586
+ setAlign( align ) {
3587
+
3588
+ const dom = this.dom;
3589
+
3590
+ removeDOMClass( dom, this.align );
3591
+ addDOMClass( dom, align );
3592
+
3593
+ this.align = align;
3594
+
3595
+ return this;
3596
+
3597
+ }
3598
+
3599
+ getAlign() {
3600
+
3601
+ return this.align;
3602
+
3603
+ }
3604
+
3166
3605
  show() {
3167
3606
 
3168
3607
  this.dom.classList.remove( 'hidden' );
@@ -3334,8 +3773,8 @@ class ContextMenu extends Menu {
3334
3773
 
3335
3774
  const dom = this.dom;
3336
3775
 
3337
- dom.style.left = toPX( x );
3338
- dom.style.top = toPX( y );
3776
+ dom.style.left = numberToPX( x );
3777
+ dom.style.top = numberToPX( y );
3339
3778
 
3340
3779
  return this;
3341
3780
 
@@ -3481,7 +3920,7 @@ class Tips extends EventTarget {
3481
3920
 
3482
3921
  setTimeout( () => {
3483
3922
 
3484
- this.time -= this.duration;
3923
+ this.time = Math.max( this.time - this.duration, 0 );
3485
3924
 
3486
3925
  dom.style.opacity = 0;
3487
3926
 
@@ -3510,6 +3949,8 @@ class Search extends Menu {
3510
3949
  this.events.submit = [];
3511
3950
  this.events.filter = [];
3512
3951
 
3952
+ this.tags = new WeakMap();
3953
+
3513
3954
  const inputDOM = document.createElement( 'input' );
3514
3955
  inputDOM.placeholder = 'Type here';
3515
3956
 
@@ -3741,10 +4182,17 @@ class Search extends Menu {
3741
4182
 
3742
4183
  }
3743
4184
 
4185
+ setTag( button, tags ) {
4186
+
4187
+ this.tags.set( button, tags );
4188
+
4189
+ }
4190
+
3744
4191
  filter( text ) {
3745
4192
 
3746
4193
  text = filterString( text );
3747
4194
 
4195
+ const tags = this.tags;
3748
4196
  const filtered = [];
3749
4197
 
3750
4198
  for ( const button of this.buttons ) {
@@ -3753,7 +4201,9 @@ class Search extends Menu {
3753
4201
 
3754
4202
  buttonDOM.remove();
3755
4203
 
3756
- const label = filterString( button.getValue() );
4204
+ const buttonTags = tags.has( button ) ? ' ' + tags.get( button ) : '';
4205
+
4206
+ const label = filterString( button.getValue() + buttonTags );
3757
4207
 
3758
4208
  if ( text && label.includes( text ) === true ) {
3759
4209
 
@@ -3925,7 +4375,7 @@ class ToggleInput extends Input {
3925
4375
 
3926
4376
  }
3927
4377
 
3928
- var Flow = /*#__PURE__*/Object.freeze( {
4378
+ var Flow = /*#__PURE__*/Object.freeze({
3929
4379
  __proto__: null,
3930
4380
  Element: Element,
3931
4381
  Input: Input,
@@ -3951,7 +4401,7 @@ var Flow = /*#__PURE__*/Object.freeze( {
3951
4401
  StringInput: StringInput,
3952
4402
  TextInput: TextInput,
3953
4403
  ToggleInput: ToggleInput
3954
- } );
4404
+ });
3955
4405
 
3956
4406
  class Loader extends EventTarget {
3957
4407