super-three 0.135.0 → 0.136.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 (175) hide show
  1. package/build/three.js +527 -332
  2. package/build/three.min.js +1 -1
  3. package/build/three.module.js +752 -370
  4. package/examples/fonts/tabler-icons/fonts/tabler-icons.svg +3966 -0
  5. package/examples/js/animation/CCDIKSolver.js +0 -1
  6. package/examples/js/animation/MMDPhysics.js +1 -3
  7. package/examples/js/controls/ArcballControls.js +38 -52
  8. package/examples/js/controls/TransformControls.js +24 -1
  9. package/examples/js/curves/CurveExtras.js +0 -2
  10. package/examples/js/effects/AsciiEffect.js +2 -9
  11. package/examples/js/exporters/GLTFExporter.js +1 -1
  12. package/examples/js/geometries/TeapotGeometry.js +0 -1
  13. package/examples/js/interactive/SelectionBox.js +2 -0
  14. package/examples/js/interactive/SelectionHelper.js +22 -7
  15. package/examples/js/lights/RectAreaLightUniformsLib.js +4 -0
  16. package/examples/js/loaders/AMFLoader.js +0 -2
  17. package/examples/js/loaders/ColladaLoader.js +1 -2
  18. package/examples/js/loaders/EXRLoader.js +185 -262
  19. package/examples/js/loaders/FBXLoader.js +3 -4
  20. package/examples/js/loaders/GLTFLoader.js +2 -2
  21. package/examples/js/loaders/HDRCubeTextureLoader.js +0 -8
  22. package/examples/js/loaders/KTX2Loader.js +11 -2
  23. package/examples/js/loaders/KTXLoader.js +1 -1
  24. package/examples/js/loaders/LDrawLoader.js +26 -30
  25. package/examples/js/loaders/LUT3dlLoader.js +2 -0
  26. package/examples/js/loaders/LUTCubeLoader.js +2 -0
  27. package/examples/js/loaders/MMDLoader.js +0 -1
  28. package/examples/js/loaders/NRRDLoader.js +9 -2
  29. package/examples/js/loaders/OBJLoader.js +0 -2
  30. package/examples/js/loaders/PLYLoader.js +1 -1
  31. package/examples/js/loaders/RGBELoader.js +0 -15
  32. package/examples/js/loaders/RGBMLoader.js +55 -5
  33. package/examples/js/loaders/SVGLoader.js +2 -2
  34. package/examples/js/loaders/VOXLoader.js +1 -0
  35. package/examples/js/loaders/VRMLLoader.js +2 -1
  36. package/examples/js/math/ImprovedNoise.js +1 -1
  37. package/examples/js/misc/GPUComputationRenderer.js +3 -1
  38. package/examples/js/objects/Lensflare.js +2 -10
  39. package/examples/js/objects/Reflector.js +7 -0
  40. package/examples/js/objects/Refractor.js +7 -0
  41. package/examples/js/objects/Sky.js +1 -1
  42. package/examples/js/objects/Water.js +2 -2
  43. package/examples/js/objects/Water2.js +4 -7
  44. package/examples/js/postprocessing/GlitchPass.js +3 -1
  45. package/examples/js/postprocessing/SSAOPass.js +1 -0
  46. package/examples/js/shaders/ConvolutionShader.js +0 -1
  47. package/examples/js/shaders/FXAAShader.js +1 -1
  48. package/examples/js/shaders/FilmShader.js +1 -1
  49. package/examples/js/shaders/GammaCorrectionShader.js +1 -1
  50. package/examples/js/shaders/HorizontalBlurShader.js +1 -2
  51. package/examples/js/shaders/SSRShader.js +1 -1
  52. package/examples/js/shaders/SSRrShader.js +1 -1
  53. package/examples/js/shaders/VerticalBlurShader.js +1 -2
  54. package/examples/js/utils/GeometryUtils.js +1 -1
  55. package/examples/js/utils/RoughnessMipmapper.js +18 -29
  56. package/examples/jsm/animation/CCDIKSolver.js +0 -1
  57. package/examples/jsm/animation/MMDPhysics.js +0 -2
  58. package/examples/jsm/controls/ArcballControls.js +27 -56
  59. package/examples/jsm/controls/TransformControls.js +24 -1
  60. package/examples/jsm/curves/CurveExtras.js +0 -2
  61. package/examples/jsm/effects/AsciiEffect.js +2 -9
  62. package/examples/jsm/exporters/GLTFExporter.js +1 -1
  63. package/examples/jsm/geometries/TeapotGeometry.js +0 -1
  64. package/examples/jsm/interactive/SelectionBox.js +1 -0
  65. package/examples/jsm/interactive/SelectionHelper.js +19 -7
  66. package/examples/jsm/libs/flow.module.js +256 -136
  67. package/examples/jsm/lights/RectAreaLightUniformsLib.js +7 -0
  68. package/examples/jsm/loaders/AMFLoader.js +0 -2
  69. package/examples/jsm/loaders/ColladaLoader.js +1 -2
  70. package/examples/jsm/loaders/EXRLoader.js +184 -293
  71. package/examples/jsm/loaders/FBXLoader.js +3 -4
  72. package/examples/jsm/loaders/GLTFLoader.js +2 -2
  73. package/examples/jsm/loaders/HDRCubeTextureLoader.js +1 -14
  74. package/examples/jsm/loaders/KTX2Loader.js +13 -4
  75. package/examples/jsm/loaders/KTXLoader.js +1 -1
  76. package/examples/jsm/loaders/LDrawLoader.js +23 -24
  77. package/examples/jsm/loaders/LUT3dlLoader.js +2 -0
  78. package/examples/jsm/loaders/LUTCubeLoader.js +2 -0
  79. package/examples/jsm/loaders/MMDLoader.js +0 -1
  80. package/examples/jsm/loaders/NRRDLoader.js +10 -2
  81. package/examples/jsm/loaders/OBJLoader.js +0 -2
  82. package/examples/jsm/loaders/PLYLoader.js +1 -1
  83. package/examples/jsm/loaders/RGBELoader.js +0 -20
  84. package/examples/jsm/loaders/RGBMLoader.js +61 -7
  85. package/examples/jsm/loaders/SVGLoader.js +2 -2
  86. package/examples/jsm/loaders/TDSLoader.js +30 -9
  87. package/examples/jsm/loaders/VOXLoader.js +1 -0
  88. package/examples/jsm/loaders/VRMLLoader.js +2 -1
  89. package/examples/jsm/math/ImprovedNoise.js +1 -1
  90. package/examples/jsm/misc/GPUComputationRenderer.js +3 -1
  91. package/examples/jsm/node-editor/NodeEditor.js +23 -22
  92. package/examples/jsm/node-editor/examples/rim.json +1 -1
  93. package/examples/jsm/node-editor/materials/StandardMaterialEditor.js +48 -9
  94. package/examples/jsm/node-editor/utils/OscillatorEditor.js +1 -1
  95. package/examples/jsm/nodes/core/NodeBuilder.js +2 -2
  96. package/examples/jsm/nodes/materials/nodes/StandardNode.js +1 -0
  97. package/examples/jsm/nodes/math/MathNode.js +12 -0
  98. package/examples/jsm/nodes/misc/BumpMapNode.js +1 -1
  99. package/examples/jsm/nodes/misc/TextureCubeUVNode.js +1 -4
  100. package/examples/jsm/nodes/utils/ColorSpaceNode.js +1 -116
  101. package/examples/jsm/objects/Lensflare.js +3 -14
  102. package/examples/jsm/objects/Reflector.js +7 -0
  103. package/examples/jsm/objects/Refractor.js +7 -0
  104. package/examples/jsm/objects/Sky.js +1 -1
  105. package/examples/jsm/objects/Water.js +2 -2
  106. package/examples/jsm/objects/Water2.js +4 -8
  107. package/examples/jsm/postprocessing/GlitchPass.js +3 -1
  108. package/examples/jsm/postprocessing/SAOPass.js +1 -1
  109. package/examples/jsm/postprocessing/SSAOPass.js +1 -0
  110. package/examples/jsm/renderers/nodes/Nodes.js +1 -0
  111. package/examples/jsm/renderers/nodes/ShaderNode.js +7 -6
  112. package/examples/jsm/renderers/nodes/core/InputNode.js +1 -1
  113. package/examples/jsm/renderers/nodes/core/NodeBuilder.js +1 -1
  114. package/examples/jsm/renderers/nodes/display/ColorSpaceNode.js +26 -31
  115. package/examples/jsm/renderers/nodes/functions/BSDFs.js +2 -2
  116. package/examples/jsm/renderers/nodes/functions/PhysicalMaterialFunctions.js +27 -0
  117. package/examples/jsm/renderers/nodes/inputs/TextureNode.js +1 -1
  118. package/examples/jsm/renderers/nodes/math/MathNode.js +5 -3
  119. package/examples/jsm/renderers/nodes/math/OperatorNode.js +2 -2
  120. package/examples/jsm/renderers/nodes/utils/TimerNode.js +1 -1
  121. package/examples/jsm/renderers/webgl/nodes/WebGLNodeBuilder.js +14 -14
  122. package/examples/jsm/renderers/webgpu/WebGPUBindings.js +7 -6
  123. package/examples/jsm/renderers/webgpu/WebGPURenderPipeline.js +1 -1
  124. package/examples/jsm/renderers/webgpu/WebGPURenderPipelines.js +42 -61
  125. package/examples/jsm/renderers/webgpu/WebGPURenderer.js +2 -2
  126. package/examples/jsm/renderers/webgpu/WebGPUTextureUtils.js +0 -1
  127. package/examples/jsm/renderers/webgpu/nodes/WebGPUNodeBuilder.js +30 -4
  128. package/examples/jsm/shaders/ConvolutionShader.js +0 -1
  129. package/examples/jsm/shaders/FXAAShader.js +1 -1
  130. package/examples/jsm/shaders/FilmShader.js +1 -1
  131. package/examples/jsm/shaders/GammaCorrectionShader.js +1 -1
  132. package/examples/jsm/shaders/HorizontalBlurShader.js +1 -2
  133. package/examples/jsm/shaders/SSRShader.js +1 -1
  134. package/examples/jsm/shaders/SSRrShader.js +1 -1
  135. package/examples/jsm/shaders/VerticalBlurShader.js +1 -2
  136. package/examples/jsm/utils/GeometryUtils.js +1 -1
  137. package/examples/jsm/utils/RoughnessMipmapper.js +19 -32
  138. package/examples/jsm/utils/WorkerPool.js +11 -11
  139. package/package.json +15 -9
  140. package/src/Three.Legacy.js +12 -0
  141. package/src/Three.js +1 -2
  142. package/src/constants.js +1 -7
  143. package/src/core/Object3D.js +1 -1
  144. package/src/extras/PMREMGenerator.js +19 -110
  145. package/src/extras/core/Interpolations.js +1 -1
  146. package/src/geometries/LatheGeometry.js +70 -47
  147. package/src/helpers/CameraHelper.js +1 -1
  148. package/src/loaders/FileLoader.js +23 -6
  149. package/src/math/Color.js +0 -38
  150. package/src/math/Ray.js +2 -2
  151. package/src/math/Sphere.js +10 -1
  152. package/src/objects/Skeleton.js +1 -0
  153. package/src/renderers/WebGLRenderer.js +23 -16
  154. package/src/renderers/shaders/ShaderChunk/bumpmap_pars_fragment.glsl.js +1 -1
  155. package/src/renderers/shaders/ShaderChunk/cube_uv_reflection_fragment.glsl.js +2 -24
  156. package/src/renderers/shaders/ShaderChunk/encodings_pars_fragment.glsl.js +0 -47
  157. package/src/renderers/shaders/ShaderChunk/gradientmap_pars_fragment.glsl.js +1 -1
  158. package/src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js +27 -1
  159. package/src/renderers/shaders/ShaderChunk/tonemapping_pars_fragment.glsl.js +1 -1
  160. package/src/renderers/shaders/ShaderLib/meshphysical.glsl.js +10 -0
  161. package/src/renderers/webgl/WebGLCapabilities.js +0 -2
  162. package/src/renderers/webgl/WebGLMorphtargets.js +1 -0
  163. package/src/renderers/webgl/WebGLProgram.js +2 -19
  164. package/src/renderers/webgl/WebGLPrograms.js +191 -35
  165. package/src/renderers/webgl/WebGLRenderLists.js +4 -14
  166. package/src/renderers/webgl/WebGLShaderCache.js +120 -0
  167. package/src/renderers/webgl/WebGLState.js +45 -0
  168. package/src/renderers/webgl/WebGLTextures.js +195 -26
  169. package/src/renderers/webxr/WebXRManager.js +10 -3
  170. package/src/scenes/Scene.js +1 -1
  171. package/src/textures/DataTexture.js +0 -2
  172. package/src/textures/DataTexture2DArray.js +0 -2
  173. package/src/textures/DataTexture3D.js +0 -2
  174. package/src/textures/FramebufferTexture.js +25 -0
  175. package/src/utils.js +1 -37
@@ -16,10 +16,17 @@ function __flow__addCSS( css ) {
16
16
 
17
17
  }
18
18
 
19
- __flow__addCSS( `f-canvas,f-canvas canvas { position: absolute; top: 0; left: 0; margin: 0; padding: 0; width: 100%; height: 100%; -webkit-touch-callout: none; }f-canvas { overflow: auto; cursor: grab;}f-canvas canvas.front { z-index: 10;}body.dragging f-canvas,body.connecting f-canvas { overflow: hidden !important;}body.dragging *:not(.drag) { pointer-events: none !important;}f-canvas.grabbing * { cursor: grabbing; user-select: none;}f-canvas canvas { position: fixed; overflow: hidden; pointer-events: none;}f-canvas::-webkit-scrollbar { width: 8px; height: 8px;}f-canvas::-webkit-scrollbar-thumb:hover{ background: #014fc5;}f-canvas::-webkit-scrollbar-track { background: #363636;}f-canvas::-webkit-scrollbar-thumb { background-color: #666666; border-radius: 10px; border: 0;}f-canvas f-content,f-canvas f-area { position: absolute; display: block;}f-node { position: absolute; margin: 0; padding: 0; user-select: none; width: 320px; z-index: 1; cursor: auto; filter: drop-shadow(0 0 10px #00000061); backdrop-filter: blur(4px);}f-node.selected { z-index: 2;}f-node.selected,f-canvas.dragging-rio f-node:hover,f-canvas.dragging-lio f-node:hover { filter: drop-shadow(0 0 10px #00000061) drop-shadow(0 0 8px #4444dd);}f-node.closed f-element:not(:first-child) { display: none;}f-node.center { top: 50%; left: 50%; transform: translate( -50%, -50% );}f-node.top-right { top: 0; right: 0;}f-node.top-center { top: 0; left: 50%; transform: translateX( -50% );}f-node.top-left { top: 0; left: 0;}f-node { transition: filter 0.2s ease;}@keyframes f-open { 0% { transform: scale(.5); filter: blur(30px); } 100% { transform: scale(1); filter: unset }}f-node { animation: .2s f-open 1 alternate ease-out;}f-menu,f-menu button,f-element,f-element input,f-element select,f-element button,f-element textarea { font-family: 'Open Sans', sans-serif; font-size: 13px; text-transform: capitalize; color: #eeeeee; outline: solid 0px #000; letter-spacing: .2px; margin: 0; padding: 0; border: 0; user-select: none; -webkit-tap-highlight-color: transparent; transition: background 0.2s ease;}f-element input { transition: background 0.1s ease;}f-element input,f-element select,f-element button,f-element textarea { background-color: #242427;}f-element { position: relative; width: calc( 100% - 14px ); background: rgba(45, 45, 48, 0.95); pointer-events: auto; border-bottom: 2px solid #232323; display: flex; padding-left: 7px; padding-right: 7px; padding-top: 2px; padding-bottom: 2px;}f-element { height: 24px;}f-element input { margin-top: 2px; margin-bottom: 2px; box-shadow: inset 0px 1px 1px rgb(0 0 0 / 20%), 0px 1px 0px rgb(255 255 255 / 5%); margin-left: 2px; margin-right: 2px; width: 100%; padding-left: 4px; padding-right: 4px;}f-element input.number { cursor: col-resize;}f-element input:focus[type='text'], f-element input:focus[type='range'], f-element input:focus[type='color'] { background: rgba( 0, 0, 0, 0.6 ); outline: solid 1px rgba( 0, 80, 200, 0.98 );}f-element input[type='color'] { appearance: none; padding: 0; margin-left: 2px; margin-right: 2px; height: calc( 100% - 4px ); margin-top: 2px; border: none; }f-element input[type='color']::-webkit-color-swatch-wrapper { padding: 2px;}f-element input[type='color']::-webkit-color-swatch { border: none; cursor: alias;}f-element input[type='range'] { appearance: none; width: 100%; overflow: hidden; padding: 0; cursor: ew-resize;}f-element input[type='range']::-webkit-slider-runnable-track { appearance: none; height: 10px; color: #13bba4; margin: 0;}f-element input[type='range']::-webkit-slider-thumb { appearance: none; width: 0; background: #434343; box-shadow: -500px 0 0 500px rgba( 0, 120, 255, 0.98 ); border-radius: 50%; border: 0 !important;}f-element input[type='range']::-webkit-slider-runnable-track { margin-left: -4px; margin-right: -5px;}f-element input[type='checkbox'] { appearance: none; cursor: pointer;}f-element input[type='checkbox'].toggle { height: 20px; width: 45px; border-radius: 16px; display: inline-block; position: relative; margin: 0; margin-top: 2px; background: linear-gradient( 0deg, #292929 0%, #0a0a0ac2 100% ); transition: all 0.2s ease;}f-element input[type='checkbox'].toggle:after { content: ""; position: absolute; top: 2px; left: 2px; width: 16px; height: 16px; border-radius: 50%; background: white; box-shadow: 0 1px 2px rgba(44, 44, 44, 0.2); transition: all 0.2s cubic-bezier(0.5, 0.1, 0.75, 1.35);}f-element input[type='checkbox'].toggle:checked { background: linear-gradient( 0deg, #0177fb 0%, #0177fb 100% );}f-element input[type='checkbox'].toggle:checked:after { transform: translatex(25px);}f-element.auto-height { display: table;}f-element textarea { width: calc( 100% - 18px ); padding-top: 1px; padding-bottom: 3px; padding-left: 3px; padding-right: 8px; margin-top: 2px; margin-left: 2px; height: calc( 100% - 8px ); max-height: 300px; border-radius: 2px; resize: none; box-shadow: inset 0px 1px 1px rgb(0 0 0 / 20%), 0px 1px 0px rgb(255 255 255 / 5%);}f-element.auto-height textarea { resize: auto;}f-element select { width: 100%; margin-top: 2px; margin-bottom: 2px; margin-left: 2px; margin-right: 2px; padding-left: 5px; cursor: pointer; box-shadow: inset 0px 1px 1px rgb(0 0 0 / 20%), 0px 1px 0px rgb(255 255 255 / 5%);}f-element f-toolbar { position: absolute; display: flex; top: 0; width: 100%; height: 100%; align-content: space-around;}f-element.output-right f-toolbar { right: 7px; float: right; justify-content: end;}f-element f-toolbar { margin-top: auto; margin-bottom: auto; margin-left: 3px; margin-right: 3px; font-size: 18px; line-height: 18px;}f-element f-toolbar button { opacity: .7; cursor: pointer; font-size: 14px; width: unset; height: unset; border-radius: unset; border: unset; outline: 0; background-color: unset; box-shadow: unset;}f-element f-toolbar button:hover,f-element f-toolbar button:active { opacity: 1; border: 0; background-color: unset;}f-element input.range-value { width: 60px; text-align: center;}f-menu.context button,f-element button { width: 100%; height: calc( 100% - 4px ); margin-left: 2px; margin-right: 2px; margin-top: 2px; border-radius: 3px; cursor: pointer;}f-element button { box-shadow: inset 1px 1px 1px 0 rgb(255 255 255 / 17%), inset -2px -2px 2px 0 rgb(0 0 0 / 26%);}f-element button:hover { color: #fff; background-color: #2a2a2a;}f-element button:active { border: 1px solid rgba( 0, 120, 255, 0.98 );}f-element f-inputs,f-element f-subinputs { display: flex; width: 100%;}f-element f-inputs { left: 100px; top: 50%; transform: translateY(-50%); position: absolute; width: calc( 100% - 106px ); height: calc( 100% - 4px ); z-index: 1;}f-element f-label,f-element span { margin: auto; text-shadow: 1px 1px 0px #0007;}f-element f-label { padding-left: 4px; white-space: nowrap; position: absolute; top: 50%; transform: translateY(-50%); width: calc( 100% - 20px );}f-element.right f-label { text-align: right;}f-element f-label i { float: left; font-size: 18px; margin-right: 6px;}f-element f-label.center { width: 100%; text-align: center; display: block;}f-element.title { height: 29px; background-color: #3a3a3ab0; background-color: #3b3b43ed; cursor: all-scroll; border-top-left-radius: 6px; border-top-right-radius: 6px;}f-element.blue { background-color: #014fc5;}f-element.red { background-color: #bd0b0b;}f-element.green { background-color: #148d05;}f-element.yellow { background-color: #d6b100;}f-element.title.left { text-align: left; display: inline-grid; justify-content: start;}f-element.title span { text-align: center; font-size: 15px; padding-top: 2px;}f-element.title i { font-size: 18px; position: absolute; right: 10px; top: 50%; transform: translateY(-50%); opacity: .5;}f-element.output-right.title i { left: 10px; right: unset;}f-element.title.left span { text-align: left;}f-element f-io { border: 2px solid #dadada; width: 7px; height: 7px; position: absolute; background: #242427; border-radius: 8px; float: left; left: -7px; top: calc( 50% - 5px ); cursor: alias; box-shadow: 0 0 3px 2px #0000005e; z-index: 1;}f-element f-io.connect,f-canvas.dragging-rio f-element:hover f-io.lio,f-canvas.dragging-lio f-element:hover f-io.rio { border: 2px solid #0177fb; zoom: 1.4;}f-node.io-connect f-io:not(.connect) { border: 2px solid #dadada !important; zoom: 1 !important;}f-element f-io.rio { float: right; right: -7px; left: unset;}f-element f-disconnect { position: absolute; left: -35px; top: 50%; font-size: 22px; transform: translateY( -50% ); filter: drop-shadow(0 0 5px #000); text-shadow: 0px 0px 5px black; cursor: pointer;}f-element.output-right f-disconnect { right: -35px; left: unset;}f-element f-disconnect:hover { color: #ff3300;}f-element textarea::-webkit-scrollbar { width: 6px;}f-element textarea::-webkit-scrollbar-track { background: #111; } f-element textarea::-webkit-scrollbar-thumb { background: #0177fb; }f-element textarea::-webkit-scrollbar-thumb:hover { background: #1187ff; }f-element.small { height: 18px;}f-element.large { height: 36px;}body.connecting f-node:not(.io-connect) f-element:hover,f-element.select { background-color: rgba(61, 70, 82, 0.98);}f-tooltip { pointer-events: none;}f-tooltip { position: absolute; left: 0; top: 0; background: rgba(0,0,0,.8); backdrop-filter: blur(4px); font-size: 14px; padding: 7px; border-radius: 10px; top: 50%; transform: translateY(-50%); visibility: hidden; pointer-events: none; opacity: 0; transition: all 0.3s ease; z-index: 150; white-space: nowrap;}f-menu.context { position: absolute; width: 170px; padding: 2px; margin: 0; background: #17171794; z-index: 110; font-size: 12px; border-radius: 6px; backdrop-filter: blur(6px); border: 1px solid #7e7e7e45; box-shadow: 3px 3px 6px rgba(0,0,0,.2); transition: opacity 0.2s ease, transform 0.1s ease;}f-menu.context.hidden { visibility: hidden; opacity: 0;}f-menu.context f-item { display: block; position: relative; margin: 0; padding: 0; white-space: nowrap;}f-menu.context f-item.submenu::after { content: ""; position: absolute; right: 6px; top: 50%; -webkit-transform: translateY(-50%); transform: translateY(-50%); border: 5px solid transparent; border-left-color: #808080;}f-menu.context f-item:hover > f-menu,f-menu.context f-item.active > f-menu { visibility: unset; transform: unset; opacity: unset;}f-menu.context f-menu { top: 0px; left: calc( 100% - 4px );}f-menu.context f-item button { overflow: visible; display: block; width: calc( 100% - 6px ); text-align: left; cursor: pointer; white-space: nowrap; padding: 6px 8px; border-radius: 3px; background: #2d2d32; border: 0; color: #ddd; margin: 3px; text-shadow: 1px 1px 0px #0007;}f-menu.context f-item button i { float: left; font-size: 16px;}f-menu.context f-item button span { margin-left: 6px;}f-menu.context f-item:hover > button,f-menu.context f-item.active > button { color: #fff; background: #313136;}f-menu.context f-item button:active { outline: solid 1px rgba( 0, 80, 200, 0.98 );}f-menu.context f-item f-tooltip { margin-left: 120px;}f-menu.circle { position: absolute; left: 30px; top: 30px; z-index: 100;}f-menu.circle f-item { display: flex; justify-content: end; align-content: space-around; margin-bottom: 12px;}f-menu.circle f-item button { width: 50px; height: 50px; font-size: 26px; background: #17171794; border-radius: 50%; backdrop-filter: blur(6px); border: 1px solid #7e7e7e45; line-height: 100%; cursor: pointer; box-shadow: 3px 3px 6px rgba(0,0,0,.2);}f-menu.circle f-item f-tooltip { margin-left: 50px;}.f-rounded f-node f-element,.f-rounded f-node f-element.title.left { border-radius: 10px 5px 10px 5px;}.f-rounded f-node f-element input, .f-rounded f-node f-element select,.f-rounded f-node f-element button,.f-rounded f-node f-element textarea,.f-rounded f-node f-element input[type='checkbox'].toggle,.f-rounded f-node f-element input[type='checkbox'].toggle:after { border-radius: 20px 10px;}.f-rounded f-node f-element input { padding-left: 7px; padding-right: 7px;}.f-rounded f-menu.context,.f-rounded f-menu.context f-item button { border-radius: 20px 10px;}@media (hover: hover) and (pointer: fine) { f-element f-io:hover { border: 2px solid #0177fb; zoom: 1.4; } f-menu.circle f-item button:hover { background-color: #2a2a2a; } f-menu.circle f-item button:hover > f-tooltip, f-menu.context f-item button:hover > f-tooltip { visibility: visible; transform: translate(10px, -50%); opacity: 1; } f-menu.circle f-item button:focus > f-tooltip, f-menu.context f-item button:focus > f-tooltip { visibility: hidden; opacity: 0; }}f-canvas { will-change: top, left;}f-node { will-change: transform !important;}` );
19
+ __flow__addCSS( `@keyframes f-animation-open { 0% { transform: scale(.5); opacity: 0; } 100% { transform: scale(1); opacity: 1; }}f-canvas,f-canvas canvas { position: absolute; top: 0; left: 0; margin: 0; padding: 0; width: 100%; height: 100%; -webkit-touch-callout: none; }f-canvas { overflow: auto; cursor: grab;}f-canvas canvas.front { z-index: 10;}body.dragging f-canvas,body.connecting f-canvas { overflow: hidden !important;}body.dragging *:not(.drag) { pointer-events: none !important;}f-canvas.grabbing * { cursor: grabbing; user-select: none;}f-canvas canvas { position: fixed; overflow: hidden; pointer-events: none;}f-canvas::-webkit-scrollbar { width: 8px; height: 8px;}f-canvas::-webkit-scrollbar-thumb:hover{ background: #014fc5;}f-canvas::-webkit-scrollbar-track { background: #363636;}f-canvas::-webkit-scrollbar-thumb { background-color: #666666; border-radius: 10px; border: 0;}f-canvas f-content,f-canvas f-area { position: absolute; display: block;}f-node { position: absolute; margin: 0; padding: 0; user-select: none; width: 320px; z-index: 1; cursor: auto; filter: drop-shadow(0 0 10px #00000061); backdrop-filter: blur(4px);}f-node.selected { z-index: 2;}f-node.selected,f-canvas.dragging-rio f-node:hover,f-canvas.dragging-lio f-node:hover { filter: drop-shadow(0 0 10px #00000061) drop-shadow(0 0 8px #4444dd);}f-node.closed f-element:not(:first-child) { display: none;}f-node.center { top: 50%; left: 50%; transform: translate( -50%, -50% );}f-node.top-right { top: 0; right: 0;}f-node.top-center { top: 0; left: 50%; transform: translateX( -50% );}f-node.top-left { top: 0; left: 0;}f-node { transition: filter 0.2s ease;}f-node { animation: .2s f-animation-open 1 alternate ease-out;}f-drop,f-menu,f-menu button,f-element,f-element input,f-element select,f-element button,f-element textarea { font-family: 'Open Sans', sans-serif; font-size: 13px; text-transform: capitalize; color: #eeeeee; outline: solid 0px #000; letter-spacing: .2px; margin: 0; padding: 0; border: 0; user-select: none; -webkit-tap-highlight-color: transparent; transition: background 0.2s ease;}f-element input { transition: background 0.1s ease;}f-element input,f-element select,f-element button,f-element textarea { background-color: #242427;}f-element { position: relative; width: calc( 100% - 14px ); background: rgba(45, 45, 48, 0.95); pointer-events: auto; border-bottom: 2px solid #232323; display: flex; padding-left: 7px; padding-right: 7px; padding-top: 2px; padding-bottom: 2px;}f-element { height: 24px;}f-element input { margin-top: 2px; margin-bottom: 2px; box-shadow: inset 0px 1px 1px rgb(0 0 0 / 20%), 0px 1px 0px rgb(255 255 255 / 5%); margin-left: 2px; margin-right: 2px; width: 100%; padding-left: 4px; padding-right: 4px;}f-element input.number { cursor: col-resize;}f-element input:focus[type='text'], f-element input:focus[type='range'], f-element input:focus[type='color'] { background: rgba( 0, 0, 0, 0.6 ); outline: solid 1px rgba( 0, 80, 200, 0.98 );}f-element input[type='color'] { appearance: none; padding: 0; margin-left: 2px; margin-right: 2px; height: calc( 100% - 4px ); margin-top: 2px; border: none; }f-element input[type='color']::-webkit-color-swatch-wrapper { padding: 2px;}f-element input[type='color']::-webkit-color-swatch { border: none; cursor: alias;}f-element input[type='range'] { appearance: none; width: 100%; overflow: hidden; padding: 0; cursor: ew-resize;}f-element input[type='range']::-webkit-slider-runnable-track { appearance: none; height: 10px; color: #13bba4; margin: 0;}f-element input[type='range']::-webkit-slider-thumb { appearance: none; width: 0; background: #434343; box-shadow: -500px 0 0 500px rgba( 0, 120, 255, 0.98 ); border-radius: 50%; border: 0 !important;}f-element input[type='range']::-webkit-slider-runnable-track { margin-left: -4px; margin-right: -5px;}f-element input[type='checkbox'] { appearance: none; cursor: pointer;}f-element input[type='checkbox'].toggle { height: 20px; width: 45px; border-radius: 16px; display: inline-block; position: relative; margin: 0; margin-top: 2px; background: linear-gradient( 0deg, #292929 0%, #0a0a0ac2 100% ); transition: all 0.2s ease;}f-element input[type='checkbox'].toggle:after { content: ""; position: absolute; top: 2px; left: 2px; width: 16px; height: 16px; border-radius: 50%; background: white; box-shadow: 0 1px 2px rgba(44, 44, 44, 0.2); transition: all 0.2s cubic-bezier(0.5, 0.1, 0.75, 1.35);}f-element input[type='checkbox'].toggle:checked { background: linear-gradient( 0deg, #0177fb 0%, #0177fb 100% );}f-element input[type='checkbox'].toggle:checked:after { transform: translatex(25px);}f-element.auto-height { display: table;}f-element textarea { width: calc( 100% - 18px ); padding-top: 1px; padding-bottom: 3px; padding-left: 3px; padding-right: 8px; margin-top: 2px; margin-left: 2px; height: calc( 100% - 8px ); max-height: 300px; border-radius: 2px; resize: none; box-shadow: inset 0px 1px 1px rgb(0 0 0 / 20%), 0px 1px 0px rgb(255 255 255 / 5%);}f-element.auto-height textarea { resize: auto;}f-element select { width: 100%; margin-top: 2px; margin-bottom: 2px; margin-left: 2px; margin-right: 2px; padding-left: 5px; cursor: pointer; box-shadow: inset 0px 1px 1px rgb(0 0 0 / 20%), 0px 1px 0px rgb(255 255 255 / 5%);}f-element f-toolbar { position: absolute; display: flex; top: 0; width: 100%; height: 100%; align-content: space-around;}f-element.output-right f-toolbar { right: 7px; float: right; justify-content: end;}f-element f-toolbar { margin-top: auto; margin-bottom: auto; margin-left: 3px; margin-right: 3px; font-size: 18px; line-height: 18px;}f-element f-toolbar button { opacity: .7; cursor: pointer; font-size: 14px; width: unset; height: unset; border-radius: unset; border: unset; outline: 0; background-color: unset; box-shadow: unset;}f-element f-toolbar button:hover,f-element f-toolbar button:active { opacity: 1; border: 0; background-color: unset;}f-element input.range-value { width: 60px; text-align: center;}f-menu.context button,f-element button { width: 100%; height: calc( 100% - 4px ); margin-left: 2px; margin-right: 2px; margin-top: 2px; border-radius: 3px; cursor: pointer;}f-element button { box-shadow: inset 1px 1px 1px 0 rgb(255 255 255 / 17%), inset -2px -2px 2px 0 rgb(0 0 0 / 26%);}f-element button:hover { color: #fff; background-color: #2a2a2a;}f-element button:active { border: 1px solid rgba( 0, 120, 255, 0.98 );}f-element f-inputs,f-element f-subinputs { display: flex; width: 100%;}f-element f-inputs { left: 100px; top: 50%; transform: translateY(-50%); position: absolute; width: calc( 100% - 106px ); height: calc( 100% - 4px ); z-index: 1;}f-element.inputs-disable f-inputs { filter: grayscale(100%); opacity: .5;}f-element.inputs-disable f-inputs input { pointer-events: none;}f-element f-label,f-element span { margin: auto; text-shadow: 1px 1px 0px #0007;}f-element f-label { padding-left: 4px; white-space: nowrap; position: absolute; top: 50%; transform: translateY(-50%); width: calc( 100% - 20px );}f-element.right f-label { text-align: right;}f-element f-label i { float: left; font-size: 18px; margin-right: 6px;}f-element f-label.center { width: 100%; text-align: center; display: block;}f-element.title { height: 29px; background-color: #3a3a3ab0; background-color: #3b3b43ed; cursor: all-scroll; border-top-left-radius: 6px; border-top-right-radius: 6px;}f-element.blue { background-color: #014fc5;}f-element.red { background-color: #bd0b0b;}f-element.green { background-color: #148d05;}f-element.yellow { background-color: #d6b100;}f-element.title.left { text-align: left; display: inline-grid; justify-content: start;}f-element.title span { text-align: center; font-size: 15px; padding-top: 2px;}f-element.title i { font-size: 18px; position: absolute; right: 10px; top: 50%; transform: translateY(-50%); opacity: .5;}f-element.output-right.title i { left: 10px; right: unset;}f-element.title.left span { text-align: left;}f-element f-io { border: 2px solid #dadada; width: 7px; height: 7px; position: absolute; background: #242427; border-radius: 8px; float: left; left: -7px; top: calc( 50% - 5px ); cursor: alias; box-shadow: 0 0 3px 2px #0000005e; z-index: 1;}f-element f-io.connect,f-canvas.dragging-rio f-element:hover f-io.lio,f-canvas.dragging-lio f-element:hover f-io.rio { border: 2px solid #0177fb; zoom: 1.4;}f-node.io-connect f-io:not(.connect) { border: 2px solid #dadada !important; zoom: 1 !important;}f-element f-io.rio { float: right; right: -7px; left: unset;}f-element f-disconnect { position: absolute; left: -35px; top: 50%; font-size: 22px; transform: translateY( -50% ); filter: drop-shadow(0 0 5px #000); text-shadow: 0px 0px 5px black; cursor: pointer;}f-element.output-right f-disconnect { right: -35px; left: unset;}f-element f-disconnect:hover { color: #ff3300;}f-element textarea::-webkit-scrollbar { width: 6px;}f-element textarea::-webkit-scrollbar-track { background: #111; } f-element textarea::-webkit-scrollbar-thumb { background: #0177fb; }f-element textarea::-webkit-scrollbar-thumb:hover { background: #1187ff; }f-element.small { height: 18px;}f-element.large { height: 36px;}body.connecting f-node:not(.io-connect) f-element:hover,f-element.select { background-color: rgba(61, 70, 82, 0.98);}f-drop { width: 100%; height: 100%; position: sticky; left: 0; top: 0; background: #02358417; text-align: center; justify-content: center; align-items: center; display: flex; box-shadow: inset 0 0 20px 10px #464ace17; pointer-events: none; transition: all .07s; opacity: 0; visibility: hidden;}f-drop.visible { visibility: unset; opacity: unset; transition: all .23s;}f-drop span { opacity: .5; font-size: 40px; text-shadow: 0px 0px 5px #000; font-weight: bold;}f-tooltip { pointer-events: none;}f-tooltip { position: absolute; left: 0; top: 0; background: rgba(0,0,0,.8); backdrop-filter: blur(4px); font-size: 14px; padding: 7px; border-radius: 10px; top: 50%; transform: translateY(-50%); visibility: hidden; pointer-events: none; opacity: 0; transition: all 0.3s ease; z-index: 150; white-space: nowrap;}f-menu.context { position: absolute; width: 170px; padding: 2px; margin: 0; background: #17171794; z-index: 110; font-size: 12px; border-radius: 6px; backdrop-filter: blur(6px); border: 1px solid #7e7e7e45; box-shadow: 3px 3px 6px rgba(0,0,0,.2); transition: opacity 0.2s ease, transform 0.1s ease;}f-menu.context.hidden { visibility: hidden; opacity: 0;}f-menu.context f-item { display: block; position: relative; margin: 0; padding: 0; white-space: nowrap;}f-menu.context f-item.submenu::after { content: ""; position: absolute; right: 6px; top: 50%; -webkit-transform: translateY(-50%); transform: translateY(-50%); border: 5px solid transparent; border-left-color: #808080;}f-menu.context f-item:hover > f-menu,f-menu.context f-item.active > f-menu { visibility: unset; transform: unset; opacity: unset;}f-menu.context f-menu { top: 0px; left: calc( 100% - 4px );}f-menu.context f-item button { overflow: visible; display: block; width: calc( 100% - 6px ); text-align: left; cursor: pointer; white-space: nowrap; padding: 6px 8px; border-radius: 3px; background: #2d2d32; border: 0; color: #ddd; margin: 3px; text-shadow: 1px 1px 0px #0007;}f-menu.context f-item button i { float: left; font-size: 16px;}f-menu.context f-item button span { margin-left: 6px;}f-menu.context f-item:hover > button,f-menu.context f-item.active > button { color: #fff; background: #313136;}f-menu.context f-item button:active { outline: solid 1px rgba( 0, 80, 200, 0.98 );}f-menu.context f-item f-tooltip { margin-left: 120px;}f-menu.circle { position: absolute; left: 30px; top: 30px; z-index: 100;}f-menu.circle f-item { display: flex; justify-content: end; align-content: space-around; margin-bottom: 12px;}f-menu.circle f-item button { width: 50px; height: 50px; font-size: 26px; background: #17171794; border-radius: 50%; backdrop-filter: blur(6px); border: 1px solid #7e7e7e45; line-height: 100%; cursor: pointer; box-shadow: 3px 3px 6px rgba(0,0,0,.2);}f-menu.circle f-item f-tooltip { margin-left: 50px;}.f-rounded f-node f-element,.f-rounded f-node f-element.title.left { border-radius: 10px 5px 10px 5px;}.f-rounded f-node f-element input, .f-rounded f-node f-element select,.f-rounded f-node f-element button,.f-rounded f-node f-element textarea,.f-rounded f-node f-element input[type='checkbox'].toggle,.f-rounded f-node f-element input[type='checkbox'].toggle:after { border-radius: 20px 10px;}.f-rounded f-node f-element input { padding-left: 7px; padding-right: 7px;}.f-rounded f-menu.context,.f-rounded f-menu.context f-item button { border-radius: 20px 10px;}@media (hover: hover) and (pointer: fine) { f-node:not(.selected):hover { filter: drop-shadow(0 0 6px #66666630); } f-element f-toolbar { visibility: hidden; opacity: 0; transition: opacity 0.2s ease; } f-node:hover > f-element f-toolbar { visibility: visible; opacity: 1; } f-element f-io:hover { border: 2px solid #0177fb; zoom: 1.4; } f-menu.circle f-item button:hover { background-color: #2a2a2a; } f-menu.circle f-item button:hover > f-tooltip, f-menu.context f-item button:hover > f-tooltip { visibility: visible; transform: translate(10px, -50%); opacity: 1; } f-menu.circle f-item button:focus > f-tooltip, f-menu.context f-item button:focus > f-tooltip { visibility: hidden; opacity: 0; }}f-canvas { will-change: top, left;}f-node { will-change: transform !important;}` );
20
20
 
21
21
  const REVISION = '1';
22
22
 
23
+ const Styles = {
24
+ icons: {
25
+ close: '',
26
+ unlink: ''
27
+ }
28
+ };
29
+
23
30
  let _id = 0;
24
31
 
25
32
  class Serializer extends EventTarget {
@@ -400,6 +407,8 @@ class Element extends Serializer {
400
407
 
401
408
  this.extra = null;
402
409
 
410
+ this.enabledInputs = true;
411
+
403
412
  this.visible = true;
404
413
 
405
414
  this.inputsDOM = dom;
@@ -472,6 +481,26 @@ class Element extends Serializer {
472
481
 
473
482
  }
474
483
 
484
+ setEnabledInputs( value ) {
485
+
486
+ const dom = this.dom;
487
+
488
+ if ( !this.enabledInputs ) dom.classList.remove( 'inputs-disable');
489
+
490
+ if ( !value ) dom.classList.add( 'inputs-disable' );
491
+
492
+ this.enabledInputs = value;
493
+
494
+ return this;
495
+
496
+ }
497
+
498
+ getEnabledInputs() {
499
+
500
+ return this.enabledInputs;
501
+
502
+ }
503
+
475
504
  setStyle( style ) {
476
505
 
477
506
  const dom = this.dom;
@@ -607,7 +636,8 @@ class Element extends Serializer {
607
636
  if ( this.disconnectDOM === null ) {
608
637
 
609
638
  this.disconnectDOM = document.createElement( 'f-disconnect' );
610
- this.disconnectDOM.innerText = '✖';
639
+ this.disconnectDOM.innerHTML = Styles.icons.unlink ? `<i class='${ Styles.icons.unlink }'></i>` : '✖';
640
+
611
641
  this.dom.appendChild( this.disconnectDOM );
612
642
 
613
643
  const onDisconnect = () => {
@@ -618,6 +648,7 @@ class Element extends Serializer {
618
648
  this.disconnectDOM.removeEventListener( 'mousedown', onClick, true );
619
649
  this.disconnectDOM.removeEventListener( 'touchstart', onClick, true );
620
650
  this.disconnectDOM.removeEventListener( 'disconnect', onDisconnect, true );
651
+
621
652
  element.removeEventListener( 'connect', onConnect );
622
653
  element.removeEventListener( 'connectChildren', onConnect );
623
654
  element.removeEventListener( 'nodeConnect', onConnect );
@@ -1052,7 +1083,7 @@ class Node extends Serializer {
1052
1083
  'blur': []
1053
1084
  };
1054
1085
 
1055
- this.setPosition( 0, 0 );
1086
+ this.setWidth( 300 ).setPosition( 0, 0 );
1056
1087
 
1057
1088
  }
1058
1089
 
@@ -1118,7 +1149,7 @@ class Node extends Serializer {
1118
1149
 
1119
1150
  getWidth() {
1120
1151
 
1121
- return this.dom.style.width;
1152
+ return parseInt( this.dom.style.width );
1122
1153
 
1123
1154
  }
1124
1155
 
@@ -1264,6 +1295,135 @@ class Node extends Serializer {
1264
1295
 
1265
1296
  Node.prototype.isNode = true;
1266
1297
 
1298
+ class DraggableElement extends Element {
1299
+
1300
+ constructor( draggable = true ) {
1301
+
1302
+ super( true );
1303
+
1304
+ this.draggable = draggable;
1305
+
1306
+ const onDrag = ( e ) => {
1307
+
1308
+ e.preventDefault();
1309
+
1310
+ if ( this.draggable === true ) {
1311
+
1312
+ draggableDOM( this.node.dom );
1313
+
1314
+ }
1315
+
1316
+ };
1317
+
1318
+ const { dom } = this;
1319
+
1320
+ dom.addEventListener( 'mousedown', onDrag, true );
1321
+ dom.addEventListener( 'touchstart', onDrag, true );
1322
+
1323
+ }
1324
+
1325
+ }
1326
+
1327
+ class TitleElement extends DraggableElement {
1328
+
1329
+ constructor( title, draggable = true ) {
1330
+
1331
+ super( draggable );
1332
+
1333
+ const { dom } = this;
1334
+
1335
+ dom.className = 'title';
1336
+
1337
+ const spanDOM = document.createElement( 'span' );
1338
+ spanDOM.innerText = title;
1339
+
1340
+ const iconDOM = document.createElement( 'i' );
1341
+
1342
+ const toolbarDOM = document.createElement( 'f-toolbar' );
1343
+
1344
+ this.buttons = [];
1345
+
1346
+ this.spanDOM = spanDOM;
1347
+ this.iconDOM = iconDOM;
1348
+ this.toolbarDOM = toolbarDOM;
1349
+
1350
+ dom.appendChild( spanDOM );
1351
+ dom.appendChild( iconDOM );
1352
+ dom.appendChild( toolbarDOM );
1353
+
1354
+ }
1355
+
1356
+ setIcon( value ) {
1357
+
1358
+ this.iconDOM.className = value;
1359
+
1360
+ return this;
1361
+
1362
+ }
1363
+
1364
+ getIcon() {
1365
+
1366
+ return this.iconDOM.className;
1367
+
1368
+ }
1369
+
1370
+ setTitle( value ) {
1371
+
1372
+ this.spanDOM.innerText = value;
1373
+
1374
+ return this;
1375
+
1376
+ }
1377
+
1378
+ getTitle() {
1379
+
1380
+ return this.spanDOM.innerText;
1381
+
1382
+ }
1383
+
1384
+ addButton( button ) {
1385
+
1386
+ this.buttons.push( button );
1387
+
1388
+ this.toolbarDOM.appendChild( button.dom );
1389
+
1390
+ return this;
1391
+
1392
+ }
1393
+
1394
+ serialize( data ) {
1395
+
1396
+ super.serialize( data );
1397
+
1398
+ const title = this.getTitle();
1399
+ const icon = this.getIcon();
1400
+
1401
+ data.title = title;
1402
+
1403
+ if ( icon !== '' ) {
1404
+
1405
+ data.icon = icon;
1406
+
1407
+ }
1408
+
1409
+ }
1410
+
1411
+ deserialize( data ) {
1412
+
1413
+ super.deserialize( data );
1414
+
1415
+ this.setTitle( data.title );
1416
+
1417
+ if ( data.icon !== undefined ) {
1418
+
1419
+ this.setIcon( data.icon );
1420
+
1421
+ }
1422
+
1423
+ }
1424
+
1425
+ }
1426
+
1267
1427
  const drawLine = ( p1x, p1y, p2x, p2y, invert, size, color, ctx ) => {
1268
1428
 
1269
1429
  const offset = 100 * ( invert ? - 1 : 1 );
@@ -1290,6 +1450,8 @@ const colors = [
1290
1450
  '#4444ff'
1291
1451
  ];
1292
1452
 
1453
+ const dropNode = new Node().add( new TitleElement( 'File' ) ).setWidth( 250 );
1454
+
1293
1455
  class Canvas extends Serializer {
1294
1456
 
1295
1457
  constructor() {
@@ -1299,6 +1461,8 @@ class Canvas extends Serializer {
1299
1461
  const dom = document.createElement( 'f-canvas' );
1300
1462
  const contentDOM = document.createElement( 'f-content' );
1301
1463
  const areaDOM = document.createElement( 'f-area' );
1464
+ const dropDOM = document.createElement( 'f-drop' );
1465
+
1302
1466
  const canvas = document.createElement( 'canvas' );
1303
1467
  const frontCanvas = document.createElement( 'canvas' );
1304
1468
 
@@ -1309,6 +1473,7 @@ class Canvas extends Serializer {
1309
1473
 
1310
1474
  this.contentDOM = contentDOM;
1311
1475
  this.areaDOM = areaDOM;
1476
+ this.dropDOM = dropDOM;
1312
1477
 
1313
1478
  this.canvas = canvas;
1314
1479
  this.frontCanvas = frontCanvas;
@@ -1333,6 +1498,12 @@ class Canvas extends Serializer {
1333
1498
 
1334
1499
  this.updating = false;
1335
1500
 
1501
+ this.droppedItems = [];
1502
+
1503
+ this.events = {
1504
+ 'drop': []
1505
+ };
1506
+
1336
1507
  frontCanvas.className = 'front';
1337
1508
 
1338
1509
  contentDOM.style.left = toPX( this.centerX );
@@ -1341,6 +1512,9 @@ class Canvas extends Serializer {
1341
1512
  areaDOM.style.width = `calc( 100% + ${ this.width }px )`;
1342
1513
  areaDOM.style.height = `calc( 100% + ${ this.height }px )`;
1343
1514
 
1515
+ dropDOM.innerHTML = '<span>drop your file</span>';
1516
+
1517
+ dom.appendChild( dropDOM );
1344
1518
  dom.appendChild( canvas );
1345
1519
  dom.appendChild( frontCanvas );
1346
1520
  dom.appendChild( contentDOM );
@@ -1417,6 +1591,68 @@ class Canvas extends Serializer {
1417
1591
  dom.addEventListener( 'touchmove', onZoom );
1418
1592
  //dom.addEventListener( 'touchstart', onZoomStart );
1419
1593
 
1594
+ let dropEnterCount = 0;
1595
+
1596
+ const dragState = ( enter ) => {
1597
+
1598
+ if ( enter ) {
1599
+
1600
+ if ( dropEnterCount ++ === 0 ) {
1601
+
1602
+ this.droppedItems = [];
1603
+
1604
+ dropDOM.classList.add( 'visible' );
1605
+
1606
+ this.add( dropNode );
1607
+
1608
+ }
1609
+
1610
+ } else if ( -- dropEnterCount === 0 ) {
1611
+
1612
+ dropDOM.classList.remove( 'visible' );
1613
+
1614
+ this.remove( dropNode );
1615
+
1616
+ }
1617
+
1618
+ };
1619
+
1620
+ dom.addEventListener( 'dragenter', () => {
1621
+
1622
+ dragState( true );
1623
+
1624
+ } );
1625
+
1626
+ dom.addEventListener( 'dragleave', () => {
1627
+
1628
+ dragState( false );
1629
+
1630
+ } );
1631
+
1632
+ dom.addEventListener( 'dragover', ( e ) => {
1633
+
1634
+ e.preventDefault();
1635
+
1636
+ const { relativeClientX, relativeClientY } = this;
1637
+
1638
+ const centerNodeX = dropNode.getWidth() / 2;
1639
+
1640
+ dropNode.setPosition( relativeClientX - centerNodeX, relativeClientY - 20 );
1641
+
1642
+ } );
1643
+
1644
+ dom.addEventListener( 'drop', ( e ) => {
1645
+
1646
+ e.preventDefault();
1647
+
1648
+ dragState( false );
1649
+
1650
+ this.droppedItems = e.dataTransfer.items;
1651
+
1652
+ dispatchEventList( this.events.drop, this );
1653
+
1654
+ } );
1655
+
1420
1656
  draggableDOM( dom, ( data ) => {
1421
1657
 
1422
1658
  const { delta, isTouch } = data;
@@ -1506,6 +1742,14 @@ class Canvas extends Serializer {
1506
1742
 
1507
1743
  }
1508
1744
 
1745
+ onDrop( callback ) {
1746
+
1747
+ this.events.drop.push( callback );
1748
+
1749
+ return this;
1750
+
1751
+ }
1752
+
1509
1753
  start() {
1510
1754
 
1511
1755
  this.updating = true;
@@ -1518,6 +1762,8 @@ class Canvas extends Serializer {
1518
1762
  document.addEventListener( 'mousemove', this._onMoveEvent, true );
1519
1763
  document.addEventListener( 'touchmove', this._onMoveEvent, true );
1520
1764
 
1765
+ document.addEventListener( 'dragover', this._onMoveEvent, true );
1766
+
1521
1767
  document.addEventListener( 'DOMContentLoaded', this._onContentLoaded );
1522
1768
 
1523
1769
  requestAnimationFrame( this._onUpdate );
@@ -1536,6 +1782,8 @@ class Canvas extends Serializer {
1536
1782
  document.removeEventListener( 'mousemove', this._onMoveEvent, true );
1537
1783
  document.removeEventListener( 'touchmove', this._onMoveEvent, true );
1538
1784
 
1785
+ document.removeEventListener( 'dragover', this._onMoveEvent, true );
1786
+
1539
1787
  document.removeEventListener( 'DOMContentLoaded', this._onContentLoaded );
1540
1788
 
1541
1789
  }
@@ -1899,135 +2147,6 @@ class ButtonInput extends Input {
1899
2147
 
1900
2148
  }
1901
2149
 
1902
- class DraggableElement extends Element {
1903
-
1904
- constructor( draggable = true ) {
1905
-
1906
- super( true );
1907
-
1908
- this.draggable = draggable;
1909
-
1910
- const onDrag = ( e ) => {
1911
-
1912
- e.preventDefault();
1913
-
1914
- if ( this.draggable === true ) {
1915
-
1916
- draggableDOM( this.node.dom );
1917
-
1918
- }
1919
-
1920
- };
1921
-
1922
- const { dom } = this;
1923
-
1924
- dom.addEventListener( 'mousedown', onDrag, true );
1925
- dom.addEventListener( 'touchstart', onDrag, true );
1926
-
1927
- }
1928
-
1929
- }
1930
-
1931
- class TitleElement extends DraggableElement {
1932
-
1933
- constructor( title, draggable = true ) {
1934
-
1935
- super( draggable );
1936
-
1937
- const { dom } = this;
1938
-
1939
- dom.className = 'title';
1940
-
1941
- const spanDOM = document.createElement( 'span' );
1942
- spanDOM.innerText = title;
1943
-
1944
- const iconDOM = document.createElement( 'i' );
1945
-
1946
- const toolbarDOM = document.createElement( 'f-toolbar' );
1947
-
1948
- this.buttons = [];
1949
-
1950
- this.spanDOM = spanDOM;
1951
- this.iconDOM = iconDOM;
1952
- this.toolbarDOM = toolbarDOM;
1953
-
1954
- dom.appendChild( spanDOM );
1955
- dom.appendChild( iconDOM );
1956
- dom.appendChild( toolbarDOM );
1957
-
1958
- }
1959
-
1960
- setIcon( value ) {
1961
-
1962
- this.iconDOM.className = value;
1963
-
1964
- return this;
1965
-
1966
- }
1967
-
1968
- getIcon() {
1969
-
1970
- return this.iconDOM.className;
1971
-
1972
- }
1973
-
1974
- setTitle( value ) {
1975
-
1976
- this.spanDOM.innerText = value;
1977
-
1978
- return this;
1979
-
1980
- }
1981
-
1982
- getTitle() {
1983
-
1984
- return this.spanDOM.innerText;
1985
-
1986
- }
1987
-
1988
- addButton( button ) {
1989
-
1990
- this.buttons.push( button );
1991
-
1992
- this.toolbarDOM.appendChild( button.dom );
1993
-
1994
- return this;
1995
-
1996
- }
1997
-
1998
- serialize( data ) {
1999
-
2000
- super.serialize( data );
2001
-
2002
- const title = this.getTitle();
2003
- const icon = this.getIcon();
2004
-
2005
- data.title = title;
2006
-
2007
- if ( icon !== '' ) {
2008
-
2009
- data.icon = icon;
2010
-
2011
- }
2012
-
2013
- }
2014
-
2015
- deserialize( data ) {
2016
-
2017
- super.deserialize( data );
2018
-
2019
- this.setTitle( data.title );
2020
-
2021
- if ( data.icon !== undefined ) {
2022
-
2023
- this.setIcon( data.icon );
2024
-
2025
- }
2026
-
2027
- }
2028
-
2029
- }
2030
-
2031
2150
  class ObjectNode extends Node {
2032
2151
 
2033
2152
  constructor( name, inputLength, extra = null, width = 300 ) {
@@ -2040,11 +2159,11 @@ class ObjectNode extends Node {
2040
2159
  .setExtra( extra )
2041
2160
  .setOutput( inputLength );
2042
2161
 
2043
- const closeButton = new ButtonInput( '' ).onClick( () => {
2162
+ const closeButton = new ButtonInput( Styles.icons.close || '' ).onClick( () => {
2044
2163
 
2045
2164
  this.dispose();
2046
2165
 
2047
- } );
2166
+ } ).setIcon( Styles.icons.close );
2048
2167
 
2049
2168
  title.addButton( closeButton );
2050
2169
 
@@ -3057,6 +3176,7 @@ var Flow = /*#__PURE__*/Object.freeze({
3057
3176
  Node: Node,
3058
3177
  Canvas: Canvas,
3059
3178
  Serializer: Serializer,
3179
+ Styles: Styles,
3060
3180
  ObjectNode: ObjectNode,
3061
3181
  PanelNode: PanelNode,
3062
3182
  Menu: Menu,
@@ -3215,4 +3335,4 @@ class Loader extends EventTarget {
3215
3335
  Loader.DEFAULT = 'default';
3216
3336
  Loader.OBJECTS = 'objects';
3217
3337
 
3218
- export { ButtonInput, Canvas, CircleMenu, ColorInput, ContextMenu, DraggableElement, Element, Input, LabelElement, Loader, Menu, Node, NumberInput, ObjectNode, PanelNode, REVISION, SelectInput, Serializer, SliderInput, StringInput, TextInput, TitleElement, ToggleInput, Utils };
3338
+ export { ButtonInput, Canvas, CircleMenu, ColorInput, ContextMenu, DraggableElement, Element, Input, LabelElement, Loader, Menu, Node, NumberInput, ObjectNode, PanelNode, REVISION, SelectInput, Serializer, SliderInput, StringInput, Styles, TextInput, TitleElement, ToggleInput, Utils };
@@ -46,6 +46,9 @@ class RectAreaLightUniformsLib {
46
46
  UniformsLib.LTC_FLOAT_1 = new DataTexture( ltc_float_1, 64, 64, RGBAFormat, FloatType, UVMapping, ClampToEdgeWrapping, ClampToEdgeWrapping, LinearFilter, NearestFilter, 1 );
47
47
  UniformsLib.LTC_FLOAT_2 = new DataTexture( ltc_float_2, 64, 64, RGBAFormat, FloatType, UVMapping, ClampToEdgeWrapping, ClampToEdgeWrapping, LinearFilter, NearestFilter, 1 );
48
48
 
49
+ UniformsLib.LTC_FLOAT_1.needsUpdate = true;
50
+ UniformsLib.LTC_FLOAT_2.needsUpdate = true;
51
+
49
52
  const ltc_half_1 = new Uint16Array( LTC_MAT_1.length );
50
53
 
51
54
  LTC_MAT_1.forEach( function ( x, index ) {
@@ -65,6 +68,10 @@ class RectAreaLightUniformsLib {
65
68
  UniformsLib.LTC_HALF_1 = new DataTexture( ltc_half_1, 64, 64, RGBAFormat, HalfFloatType, UVMapping, ClampToEdgeWrapping, ClampToEdgeWrapping, LinearFilter, NearestFilter, 1 );
66
69
  UniformsLib.LTC_HALF_2 = new DataTexture( ltc_half_2, 64, 64, RGBAFormat, HalfFloatType, UVMapping, ClampToEdgeWrapping, ClampToEdgeWrapping, LinearFilter, NearestFilter, 1 );
67
70
 
71
+ UniformsLib.LTC_HALF_1.needsUpdate = true;
72
+ UniformsLib.LTC_HALF_2.needsUpdate = true;
73
+
74
+
68
75
  }
69
76
 
70
77
  }
@@ -15,8 +15,6 @@ import * as fflate from '../libs/fflate.module.js';
15
15
  * Description: Early release of an AMF Loader following the pattern of the
16
16
  * example loaders in the three.js project.
17
17
  *
18
- * More information about the AMF format: http://amf.wikispaces.com
19
- *
20
18
  * Usage:
21
19
  * const loader = new AMFLoader();
22
20
  * loader.load('/path/to/project.amf', function(objecttree) {
@@ -1276,7 +1276,7 @@ class ColladaLoader extends Loader {
1276
1276
  break;
1277
1277
  case 'transparent':
1278
1278
  data[ child.nodeName ] = {
1279
- opaque: child.getAttribute( 'opaque' ),
1279
+ opaque: child.hasAttribute( 'opaque' ) ? child.getAttribute( 'opaque' ) : 'A_ONE',
1280
1280
  data: parseEffectParameter( child )
1281
1281
  };
1282
1282
  break;
@@ -1737,7 +1737,6 @@ class ColladaLoader extends Loader {
1737
1737
  material.opacity = color[ 0 ] * transparency.float;
1738
1738
  break;
1739
1739
  default:
1740
- material.opacity = 1 - transparency.float;
1741
1740
  console.warn( 'THREE.ColladaLoader: Invalid opaque type "%s" of transparent tag.', transparent.opaque );
1742
1741
 
1743
1742
  }