super-three 0.144.0 → 0.147.1
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.
- package/README.md +1 -1
- package/build/three.cjs +737 -388
- package/build/three.js +737 -388
- package/build/three.min.js +1 -1
- package/build/three.module.js +911 -409
- package/examples/js/animation/AnimationClipCreator.js +0 -8
- package/examples/js/animation/CCDIKSolver.js +50 -67
- package/examples/js/animation/MMDAnimationHelper.js +66 -137
- package/examples/js/animation/MMDPhysics.js +70 -134
- package/examples/js/cameras/CinematicCamera.js +33 -22
- package/examples/js/controls/ArcballControls.js +138 -405
- package/examples/js/controls/DragControls.js +8 -33
- package/examples/js/controls/FirstPersonControls.js +32 -54
- package/examples/js/controls/FlyControls.js +29 -55
- package/examples/js/controls/OrbitControls.js +125 -99
- package/examples/js/controls/PointerLockControls.js +5 -14
- package/examples/js/controls/TrackballControls.js +33 -86
- package/examples/js/controls/TransformControls.js +85 -170
- package/examples/js/csm/CSM.js +4 -39
- package/examples/js/csm/CSMFrustum.js +3 -9
- package/examples/js/csm/CSMHelper.js +24 -4
- package/examples/js/csm/CSMShader.js +2 -6
- package/examples/js/curves/CurveExtras.js +27 -27
- package/examples/js/curves/NURBSCurve.js +4 -16
- package/examples/js/curves/NURBSSurface.js +3 -9
- package/examples/js/curves/NURBSUtils.js +8 -45
- package/examples/js/effects/AnaglyphEffect.js +4 -18
- package/examples/js/effects/AsciiEffect.js +32 -31
- package/examples/js/effects/OutlineEffect.js +26 -30
- package/examples/js/effects/ParallaxBarrierEffect.js +0 -13
- package/examples/js/effects/PeppersGhostEffect.js +12 -39
- package/examples/js/effects/StereoEffect.js +0 -4
- package/examples/js/environments/RoomEnvironment.js +12 -10
- package/examples/js/exporters/ColladaExporter.js +48 -65
- package/examples/js/exporters/DRACOExporter.js +22 -22
- package/examples/js/exporters/EXRExporter.js +15 -18
- package/examples/js/exporters/GLTFExporter.js +141 -317
- package/examples/js/exporters/MMDExporter.js +5 -12
- package/examples/js/exporters/OBJExporter.js +42 -33
- package/examples/js/exporters/PLYExporter.js +38 -33
- package/examples/js/exporters/STLExporter.js +5 -7
- package/examples/js/exporters/USDZExporter.js +113 -27
- package/examples/js/geometries/BoxLineGeometry.js +0 -1
- package/examples/js/geometries/ConvexGeometry.js +11 -6
- package/examples/js/geometries/DecalGeometry.js +53 -20
- package/examples/js/geometries/LightningStrike.js +54 -67
- package/examples/js/geometries/ParametricGeometries.js +8 -7
- package/examples/js/geometries/ParametricGeometry.js +25 -12
- package/examples/js/geometries/RoundedBoxGeometry.js +21 -19
- package/examples/js/geometries/TeapotGeometry.js +54 -50
- package/examples/js/geometries/TextGeometry.js +6 -4
- package/examples/js/helpers/LightProbeHelper.js +1 -2
- package/examples/js/helpers/OctreeHelper.js +22 -20
- package/examples/js/helpers/PositionalAudioHelper.js +8 -6
- package/examples/js/helpers/RectAreaLightHelper.js +6 -7
- package/examples/js/helpers/VertexNormalsHelper.js +15 -13
- package/examples/js/helpers/VertexTangentsHelper.js +15 -9
- package/examples/js/helpers/ViewHelper.js +31 -16
- package/examples/js/interactive/HTMLMesh.js +25 -39
- package/examples/js/interactive/InteractiveGroup.js +9 -14
- package/examples/js/interactive/SelectionBox.js +3 -70
- package/examples/js/interactive/SelectionHelper.js +0 -8
- package/examples/js/lights/LightProbeGenerator.js +32 -39
- package/examples/js/lights/RectAreaLightUniformsLib.js +5 -1
- package/examples/js/lines/LineGeometry.js +3 -5
- package/examples/js/lines/LineMaterial.js +4 -11
- package/examples/js/lines/LineSegments2.js +40 -89
- package/examples/js/lines/LineSegmentsGeometry.js +7 -28
- package/examples/js/lines/Wireframe.js +2 -7
- package/examples/js/lines/WireframeGeometry2.js +3 -1
- package/examples/js/loaders/3DMLoader.js +58 -155
- package/examples/js/loaders/3MFLoader.js +72 -106
- package/examples/js/loaders/AMFLoader.js +0 -25
- package/examples/js/loaders/BVHLoader.js +44 -43
- package/examples/js/loaders/BasisTextureLoader.js +16 -46
- package/examples/js/loaders/ColladaLoader.js +228 -359
- package/examples/js/loaders/DDSLoader.js +24 -25
- package/examples/js/loaders/DRACOLoader.js +29 -66
- package/examples/js/loaders/EXRLoader.js +67 -164
- package/examples/js/loaders/FBXLoader.js +287 -441
- package/examples/js/loaders/FontLoader.js +6 -15
- package/examples/js/loaders/GCodeLoader.js +15 -16
- package/examples/js/loaders/GLTFLoader.js +409 -706
- package/examples/js/loaders/HDRCubeTextureLoader.js +0 -6
- package/examples/js/loaders/KMZLoader.js +3 -7
- package/examples/js/loaders/KTXLoader.js +12 -30
- package/examples/js/loaders/LDrawLoader.js +178 -289
- package/examples/js/loaders/LUT3dlLoader.js +7 -11
- package/examples/js/loaders/LUTCubeLoader.js +0 -8
- package/examples/js/loaders/LWOLoader.js +59 -124
- package/examples/js/loaders/LogLuvLoader.js +27 -77
- package/examples/js/loaders/LottieLoader.js +4 -4
- package/examples/js/loaders/MD2Loader.js +26 -27
- package/examples/js/loaders/MDDLoader.js +6 -10
- package/examples/js/loaders/MMDLoader.js +180 -189
- package/examples/js/loaders/MTLLoader.js +18 -47
- package/examples/js/loaders/NRRDLoader.js +44 -84
- package/examples/js/loaders/OBJLoader.js +50 -65
- package/examples/js/loaders/PCDLoader.js +34 -29
- package/examples/js/loaders/PDBLoader.js +17 -13
- package/examples/js/loaders/PLYLoader.js +62 -48
- package/examples/js/loaders/PRWMLoader.js +11 -22
- package/examples/js/loaders/PVRLoader.js +7 -16
- package/examples/js/loaders/RGBELoader.js +36 -61
- package/examples/js/loaders/RGBMLoader.js +26 -87
- package/examples/js/loaders/STLLoader.js +20 -27
- package/examples/js/loaders/SVGLoader.js +361 -233
- package/examples/js/loaders/TDSLoader.js +81 -118
- package/examples/js/loaders/TGALoader.js +39 -41
- package/examples/js/loaders/TIFFLoader.js +0 -1
- package/examples/js/loaders/TTFLoader.js +0 -8
- package/examples/js/loaders/TiltLoader.js +14 -15
- package/examples/js/loaders/VOXLoader.js +8 -16
- package/examples/js/loaders/VRMLLoader.js +243 -340
- package/examples/js/loaders/VTKLoader.js +101 -118
- package/examples/js/loaders/XYZLoader.js +2 -4
- package/examples/js/loaders/lwo/IFFParser.js +55 -136
- package/examples/js/loaders/lwo/LWO2Parser.js +32 -83
- package/examples/js/loaders/lwo/LWO3Parser.js +31 -73
- package/examples/js/materials/MeshGouraudMaterial.js +15 -13
- package/examples/js/math/Capsule.js +0 -17
- package/examples/js/math/ColorConverter.js +3 -3
- package/examples/js/math/ConvexHull.js +185 -141
- package/examples/js/math/ImprovedNoise.js +1 -1
- package/examples/js/math/Lut.js +8 -15
- package/examples/js/math/MeshSurfaceSampler.js +6 -28
- package/examples/js/math/OBB.js +90 -49
- package/examples/js/math/Octree.js +2 -57
- package/examples/js/math/SimplexNoise.js +74 -88
- package/examples/js/misc/ConvexObjectBreaker.js +37 -48
- package/examples/js/misc/GPUComputationRenderer.js +26 -16
- package/examples/js/misc/Gyroscope.js +5 -9
- package/examples/js/misc/MD2Character.js +14 -23
- package/examples/js/misc/MD2CharacterComplex.js +73 -54
- package/examples/js/misc/MorphAnimMesh.js +0 -6
- package/examples/js/misc/MorphBlendMesh.js +3 -30
- package/examples/js/misc/ProgressiveLightMap.js +47 -43
- package/examples/js/misc/RollerCoaster.js +17 -24
- package/examples/js/misc/TubePainter.js +18 -12
- package/examples/js/misc/Volume.js +16 -45
- package/examples/js/misc/VolumeSlice.js +14 -24
- package/examples/js/modifiers/CurveModifier.js +19 -21
- package/examples/js/modifiers/EdgeSplitModifier.js +0 -30
- package/examples/js/modifiers/SimplifyModifier.js +56 -59
- package/examples/js/modifiers/TessellateModifier.js +2 -9
- package/examples/js/objects/GroundProjectedEnv.js +2 -14
- package/examples/js/objects/Lensflare.js +47 -38
- package/examples/js/objects/LightningStorm.js +10 -13
- package/examples/js/objects/MarchingCubes.js +80 -59
- package/examples/js/objects/Reflector.js +22 -20
- package/examples/js/objects/ReflectorForSSRPass.js +19 -23
- package/examples/js/objects/Refractor.js +52 -30
- package/examples/js/objects/ShadowMesh.js +1 -2
- package/examples/js/objects/Sky.js +2 -7
- package/examples/js/objects/Water.js +23 -18
- package/examples/js/objects/Water2.js +20 -19
- package/examples/js/physics/AmmoPhysics.js +23 -20
- package/examples/js/physics/OimoPhysics.js +19 -17
- package/examples/js/postprocessing/AdaptiveToneMappingPass.js +13 -20
- package/examples/js/postprocessing/AfterimagePass.js +19 -12
- package/examples/js/postprocessing/BloomPass.js +38 -17
- package/examples/js/postprocessing/BokehPass.js +29 -12
- package/examples/js/postprocessing/ClearPass.js +1 -6
- package/examples/js/postprocessing/CubeTexturePass.js +12 -9
- package/examples/js/postprocessing/DotScreenPass.js +7 -5
- package/examples/js/postprocessing/EffectComposer.js +25 -32
- package/examples/js/postprocessing/FilmPass.js +7 -5
- package/examples/js/postprocessing/GlitchPass.js +10 -11
- package/examples/js/postprocessing/HalftonePass.js +9 -9
- package/examples/js/postprocessing/LUTPass.js +2 -15
- package/examples/js/postprocessing/MaskPass.js +20 -17
- package/examples/js/postprocessing/OutlinePass.js +45 -36
- package/examples/js/postprocessing/Pass.js +11 -14
- package/examples/js/postprocessing/RenderPass.js +3 -7
- package/examples/js/postprocessing/RenderPixelatedPass.js +215 -0
- package/examples/js/postprocessing/SAOPass.js +40 -32
- package/examples/js/postprocessing/SMAAPass.js +34 -17
- package/examples/js/postprocessing/SSAARenderPass.js +14 -14
- package/examples/js/postprocessing/SSAOPass.js +56 -42
- package/examples/js/postprocessing/SSRPass.js +78 -61
- package/examples/js/postprocessing/SavePass.js +14 -6
- package/examples/js/postprocessing/ShaderPass.js +9 -8
- package/examples/js/postprocessing/TAARenderPass.js +11 -9
- package/examples/js/postprocessing/TexturePass.js +7 -4
- package/examples/js/postprocessing/UnrealBloomPass.js +43 -25
- package/examples/js/renderers/CSS2DRenderer.js +2 -21
- package/examples/js/renderers/CSS3DRenderer.js +3 -24
- package/examples/js/renderers/Projector.js +29 -85
- package/examples/js/renderers/SVGRenderer.js +4 -50
- package/examples/js/shaders/ACESFilmicToneMappingShader.js +3 -6
- package/examples/js/shaders/AfterimageShader.js +3 -6
- package/examples/js/shaders/BasicShader.js +3 -6
- package/examples/js/shaders/BleachBypassShader.js +3 -6
- package/examples/js/shaders/BlendShader.js +3 -6
- package/examples/js/shaders/BokehShader.js +3 -6
- package/examples/js/shaders/BokehShader2.js +4 -13
- package/examples/js/shaders/BrightnessContrastShader.js +3 -6
- package/examples/js/shaders/ColorCorrectionShader.js +2 -6
- package/examples/js/shaders/ColorifyShader.js +2 -6
- package/examples/js/shaders/ConvolutionShader.js +5 -10
- package/examples/js/shaders/CopyShader.js +3 -6
- package/examples/js/shaders/DOFMipMapShader.js +3 -6
- package/examples/js/shaders/DepthLimitedBlurShader.js +2 -9
- package/examples/js/shaders/DigitalGlitch.js +3 -6
- package/examples/js/shaders/DotScreenShader.js +2 -6
- package/examples/js/shaders/FXAAShader.js +1 -3
- package/examples/js/shaders/FilmShader.js +3 -6
- package/examples/js/shaders/FocusShader.js +3 -6
- package/examples/js/shaders/FreiChenShader.js +2 -6
- package/examples/js/shaders/GammaCorrectionShader.js +3 -6
- package/examples/js/shaders/GodRaysShader.js +11 -24
- package/examples/js/shaders/HalftoneShader.js +3 -6
- package/examples/js/shaders/HorizontalBlurShader.js +3 -6
- package/examples/js/shaders/HorizontalTiltShiftShader.js +3 -6
- package/examples/js/shaders/HueSaturationShader.js +3 -6
- package/examples/js/shaders/KaleidoShader.js +3 -6
- package/examples/js/shaders/LuminosityHighPassShader.js +2 -6
- package/examples/js/shaders/LuminosityShader.js +3 -6
- package/examples/js/shaders/MMDToonShader.js +2 -8
- package/examples/js/shaders/MirrorShader.js +3 -6
- package/examples/js/shaders/NormalMapShader.js +2 -6
- package/examples/js/shaders/RGBShiftShader.js +3 -6
- package/examples/js/shaders/SAOShader.js +2 -6
- package/examples/js/shaders/SMAAShader.js +6 -18
- package/examples/js/shaders/SSAOShader.js +2 -6
- package/examples/js/shaders/SSRShader.js +6 -18
- package/examples/js/shaders/SepiaShader.js +3 -6
- package/examples/js/shaders/SobelOperatorShader.js +2 -6
- package/examples/js/shaders/TechnicolorShader.js +3 -6
- package/examples/js/shaders/ToneMapShader.js +3 -6
- package/examples/js/shaders/ToonShader.js +8 -24
- package/examples/js/shaders/TriangleBlurShader.js +2 -6
- package/examples/js/shaders/UnpackDepthRGBAShader.js +3 -6
- package/examples/js/shaders/VelocityShader.js +126 -0
- package/examples/js/shaders/VerticalBlurShader.js +3 -6
- package/examples/js/shaders/VerticalTiltShiftShader.js +3 -6
- package/examples/js/shaders/VignetteShader.js +3 -6
- package/examples/js/shaders/VolumeShader.js +2 -6
- package/examples/js/shaders/WaterRefractionShader.js +2 -6
- package/examples/js/textures/FlakesTexture.js +0 -1
- package/examples/js/utils/BufferGeometryUtils.js +236 -170
- package/examples/js/utils/CameraUtils.js +5 -20
- package/examples/js/utils/GPUStatsPanel.js +3 -12
- package/examples/js/utils/GeometryCompressionUtils.js +19 -44
- package/examples/js/utils/GeometryUtils.js +13 -18
- package/examples/js/utils/LDrawUtils.js +8 -11
- package/examples/js/utils/PackedPhongMaterial.js +6 -4
- package/examples/js/utils/SceneUtils.js +117 -6
- package/examples/js/utils/ShadowMapViewer.js +17 -14
- package/examples/js/utils/SkeletonUtils.js +13 -27
- package/examples/js/utils/UVsDebug.js +20 -12
- package/examples/js/utils/WorkerPool.js +1 -11
- package/examples/jsm/animation/CCDIKSolver.js +27 -3
- package/examples/jsm/animation/MMDPhysics.js +25 -0
- package/examples/jsm/capabilities/WebGPU.js +3 -1
- package/examples/jsm/controls/FirstPersonControls.js +20 -20
- package/examples/jsm/controls/FlyControls.js +16 -17
- package/examples/jsm/controls/OrbitControls.js +44 -4
- package/examples/jsm/controls/TrackballControls.js +14 -2
- package/examples/jsm/controls/TransformControls.js +1 -1
- package/examples/jsm/csm/CSM.js +1 -0
- package/examples/jsm/csm/CSMHelper.js +30 -0
- package/examples/jsm/exporters/GLTFExporter.js +0 -79
- package/examples/jsm/exporters/USDZExporter.js +93 -1
- package/examples/jsm/helpers/OctreeHelper.js +22 -8
- package/examples/jsm/helpers/VertexNormalsHelper.js +7 -1
- package/examples/jsm/helpers/VertexTangentsHelper.js +7 -0
- package/examples/jsm/helpers/ViewHelper.js +24 -0
- package/examples/jsm/interactive/HTMLMesh.js +5 -6
- package/examples/jsm/interactive/InteractiveGroup.js +4 -2
- package/examples/jsm/libs/flow.module.js +610 -160
- package/examples/jsm/libs/lottie_canvas.module.js +14844 -0
- package/examples/jsm/lines/LineSegments2.js +4 -0
- package/examples/jsm/loaders/3DMLoader.js +1 -2
- package/examples/jsm/loaders/ColladaLoader.js +28 -0
- package/examples/jsm/loaders/FBXLoader.js +18 -2
- package/examples/jsm/loaders/GLTFLoader.js +269 -428
- package/examples/jsm/loaders/KTX2Loader.js +68 -29
- package/examples/jsm/loaders/LDrawLoader.js +14 -13
- package/examples/jsm/loaders/LottieLoader.js +4 -2
- package/examples/jsm/loaders/MaterialXLoader.js +728 -0
- package/examples/jsm/loaders/PCDLoader.js +1 -1
- package/examples/jsm/loaders/PLYLoader.js +68 -16
- package/examples/jsm/loaders/SVGLoader.js +227 -14
- package/examples/jsm/loaders/USDZLoader.js +351 -111
- package/examples/jsm/loaders/VRMLLoader.js +13 -1
- package/examples/jsm/math/ConvexHull.js +4 -4
- package/examples/jsm/math/Octree.js +1 -1
- package/examples/jsm/node-editor/NodeEditor.js +91 -12
- package/examples/jsm/node-editor/core/BaseNode.js +10 -3
- package/examples/jsm/node-editor/materials/BasicMaterialEditor.js +6 -9
- package/examples/jsm/node-editor/materials/StandardMaterialEditor.js +6 -9
- package/examples/jsm/node-editor/math/AngleEditor.js +3 -3
- package/examples/jsm/node-editor/math/InvertEditor.js +2 -2
- package/examples/jsm/node-editor/scene/MeshEditor.js +11 -8
- package/examples/jsm/node-editor/utils/PreviewEditor.js +4 -0
- package/examples/jsm/nodes/Nodes.js +30 -3
- package/examples/jsm/nodes/accessors/BitangentNode.js +62 -0
- package/examples/jsm/nodes/accessors/NormalNode.js +6 -6
- package/examples/jsm/nodes/accessors/Object3DNode.js +1 -1
- package/examples/jsm/nodes/accessors/PositionNode.js +6 -0
- package/examples/jsm/nodes/accessors/ReferenceNode.js +1 -1
- package/examples/jsm/nodes/accessors/SkinningNode.js +8 -1
- package/examples/jsm/nodes/accessors/TangentNode.js +95 -0
- package/examples/jsm/nodes/core/AttributeNode.js +31 -8
- package/examples/jsm/nodes/core/Node.js +1 -1
- package/examples/jsm/nodes/core/NodeBuilder.js +55 -6
- package/examples/jsm/nodes/core/NodeFrame.js +2 -2
- package/examples/jsm/nodes/core/NodeVarying.js +7 -4
- package/examples/jsm/nodes/core/VaryingNode.js +6 -4
- package/examples/jsm/nodes/core/constants.js +13 -13
- package/examples/jsm/nodes/display/BlendModeNode.js +85 -0
- package/examples/jsm/nodes/display/ColorAdjustmentNode.js +2 -12
- package/examples/jsm/nodes/display/NormalMapNode.js +19 -12
- package/examples/jsm/nodes/display/PosterizeNode.js +25 -0
- package/examples/jsm/nodes/display/ViewportNode.js +106 -0
- package/examples/jsm/nodes/functions/BSDF/BRDF_GGX.js +5 -5
- package/examples/jsm/nodes/functions/PhysicalLightingModel.js +3 -3
- package/examples/jsm/nodes/functions/light/getDistanceAttenuation.js +2 -2
- package/examples/jsm/nodes/gpgpu/ComputeNode.js +1 -1
- package/examples/jsm/nodes/lighting/AnalyticLightNode.js +1 -1
- package/examples/jsm/nodes/loaders/NodeMaterialLoader.js +3 -1
- package/examples/jsm/nodes/materials/Materials.js +9 -7
- package/examples/jsm/nodes/materials/NodeMaterial.js +9 -1
- package/examples/jsm/nodes/materialx/{Disclaimer.md → DISCLAIMER.md} +1 -1
- package/examples/jsm/nodes/materialx/MaterialXNodes.js +59 -0
- package/examples/jsm/nodes/materialx/{functions/lib → lib}/mx_hsv.js +1 -1
- package/examples/jsm/nodes/materialx/{functions/lib → lib}/mx_noise.js +13 -3
- package/examples/jsm/nodes/materialx/lib/mx_transform_color.js +18 -0
- package/examples/jsm/nodes/math/MathNode.js +5 -5
- package/examples/jsm/nodes/math/OperatorNode.js +16 -3
- package/examples/jsm/nodes/shadernode/ShaderNode.js +35 -20
- package/examples/jsm/nodes/shadernode/ShaderNodeBaseElements.js +87 -63
- package/examples/jsm/nodes/shadernode/ShaderNodeElements.js +29 -0
- package/examples/jsm/nodes/utils/ConvertNode.js +15 -14
- package/examples/jsm/nodes/utils/EquirectUVNode.js +27 -0
- package/examples/jsm/nodes/utils/JoinNode.js +8 -2
- package/examples/jsm/nodes/utils/MatcapUVNode.js +2 -4
- package/examples/jsm/nodes/utils/MaxMipLevelNode.js +1 -1
- package/examples/jsm/nodes/utils/OscNode.js +2 -2
- package/examples/jsm/nodes/utils/RemapNode.js +34 -0
- package/examples/jsm/nodes/utils/SpriteSheetUVNode.js +8 -10
- package/examples/jsm/nodes/utils/TimerNode.js +21 -1
- package/examples/jsm/nodes/utils/TriplanarTexturesNode.js +51 -0
- package/examples/jsm/postprocessing/AfterimagePass.js +17 -4
- package/examples/jsm/postprocessing/BloomPass.js +22 -3
- package/examples/jsm/postprocessing/BokehPass.js +18 -4
- package/examples/jsm/postprocessing/CubeTexturePass.js +12 -5
- package/examples/jsm/postprocessing/DotScreenPass.js +8 -0
- package/examples/jsm/postprocessing/EffectComposer.js +9 -0
- package/examples/jsm/postprocessing/FilmPass.js +8 -0
- package/examples/jsm/postprocessing/GlitchPass.js +13 -1
- package/examples/jsm/postprocessing/HalftonePass.js +8 -0
- package/examples/jsm/postprocessing/OutlinePass.js +21 -1
- package/examples/jsm/postprocessing/Pass.js +2 -0
- package/examples/jsm/postprocessing/RenderPixelatedPass.js +234 -0
- package/examples/jsm/postprocessing/SAOPass.js +20 -0
- package/examples/jsm/postprocessing/SMAAPass.js +16 -0
- package/examples/jsm/postprocessing/SSAARenderPass.js +4 -0
- package/examples/jsm/postprocessing/SavePass.js +17 -1
- package/examples/jsm/postprocessing/ShaderPass.js +8 -0
- package/examples/jsm/postprocessing/TAARenderPass.js +9 -0
- package/examples/jsm/postprocessing/TexturePass.js +8 -0
- package/examples/jsm/postprocessing/UnrealBloomPass.js +16 -0
- package/examples/jsm/renderers/webgl/nodes/WebGLNodeBuilder.js +56 -35
- package/examples/jsm/renderers/webgpu/WebGPUAnimation.js +58 -0
- package/examples/jsm/renderers/webgpu/WebGPUAttributes.js +63 -5
- package/examples/jsm/renderers/webgpu/WebGPUBackground.js +36 -7
- package/examples/jsm/renderers/webgpu/WebGPURenderer.js +47 -12
- package/examples/jsm/renderers/webgpu/nodes/WebGPUNodeBuilder.js +41 -9
- package/examples/jsm/shaders/MMDToonShader.js +0 -2
- package/examples/jsm/shaders/VelocityShader.js +128 -0
- package/examples/jsm/utils/BufferGeometryUtils.js +174 -42
- package/examples/jsm/utils/SceneUtils.js +129 -4
- package/examples/jsm/webxr/OculusHandModel.js +3 -2
- package/examples/jsm/webxr/XRHandMeshModel.js +8 -3
- package/package.json +13 -13
- package/src/Three.js +1 -0
- package/src/animation/PropertyBinding.js +7 -0
- package/src/audio/AudioContext.js +5 -5
- package/src/cameras/CubeCamera.js +14 -14
- package/src/constants.js +1 -1
- package/src/core/InstancedBufferGeometry.js +1 -7
- package/src/core/InterleavedBufferAttribute.js +4 -4
- package/src/extras/Earcut.js +67 -67
- package/src/geometries/PolyhedronGeometry.js +1 -1
- package/src/geometries/ShapeGeometry.js +1 -1
- package/src/helpers/ArrowHelper.js +9 -0
- package/src/helpers/Box3Helper.js +7 -0
- package/src/helpers/BoxHelper.js +7 -1
- package/src/helpers/DirectionalLightHelper.js +5 -1
- package/src/helpers/GridHelper.js +7 -0
- package/src/helpers/HemisphereLightHelper.js +4 -1
- package/src/helpers/PlaneHelper.js +9 -0
- package/src/helpers/PointLightHelper.js +2 -1
- package/src/helpers/PolarGridHelper.js +7 -0
- package/src/helpers/SkeletonHelper.js +7 -0
- package/src/helpers/SpotLightHelper.js +4 -2
- package/src/lights/LightShadow.js +1 -2
- package/src/lights/PointLight.js +2 -2
- package/src/lights/SpotLight.js +2 -2
- package/src/loaders/FileLoader.js +4 -1
- package/src/loaders/ObjectLoader.js +5 -1
- package/src/materials/Material.js +1 -1
- package/src/materials/MeshPhysicalMaterial.js +1 -1
- package/src/math/Color.js +5 -5
- package/src/math/Matrix3.js +53 -18
- package/src/math/Ray.js +2 -5
- package/src/math/Sphere.js +36 -21
- package/src/objects/InstancedMesh.js +7 -0
- package/src/objects/LOD.js +25 -6
- package/src/renderers/WebGL3DRenderTarget.js +1 -1
- package/src/renderers/WebGLArrayRenderTarget.js +1 -1
- package/src/renderers/WebGLCubeRenderTarget.js +1 -1
- package/src/renderers/WebGLMultipleRenderTargets.js +1 -1
- package/src/renderers/WebGLRenderTarget.js +1 -1
- package/src/renderers/WebGLRenderer.js +36 -62
- package/src/renderers/shaders/ShaderChunk/envmap_fragment.glsl.js +0 -4
- package/src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js +0 -1
- package/src/renderers/shaders/ShaderChunk/lights_lambert_pars_fragment.glsl.js +0 -2
- package/src/renderers/shaders/ShaderChunk/lights_phong_pars_fragment.glsl.js +0 -2
- package/src/renderers/shaders/ShaderChunk/lights_toon_pars_fragment.glsl.js +0 -2
- package/src/renderers/shaders/ShaderChunk/normal_fragment_begin.glsl.js +2 -4
- package/src/renderers/shaders/ShaderChunk/packing.glsl.js +8 -0
- package/src/renderers/shaders/ShaderChunk/transmission_pars_fragment.glsl.js +2 -2
- package/src/renderers/shaders/ShaderChunk.js +3 -0
- package/src/renderers/shaders/ShaderLib/background.glsl.js +7 -2
- package/src/renderers/shaders/ShaderLib/backgroundCube.glsl.js +62 -0
- package/src/renderers/shaders/ShaderLib/cube.glsl.js +4 -6
- package/src/renderers/shaders/ShaderLib/vsm.glsl.js +0 -3
- package/src/renderers/shaders/ShaderLib.js +20 -6
- package/src/renderers/shaders/UniformsLib.js +1 -1
- package/src/renderers/shaders/UniformsUtils.js +15 -0
- package/src/renderers/webgl/WebGLAttributes.js +2 -0
- package/src/renderers/webgl/WebGLBackground.js +15 -7
- package/src/renderers/webgl/WebGLLights.js +0 -4
- package/src/renderers/webgl/WebGLMaterials.js +2 -1
- package/src/renderers/webgl/WebGLShadowMap.js +3 -1
- package/src/renderers/webgl/WebGLState.js +78 -41
- package/src/renderers/webgl/WebGLTextures.js +94 -39
- package/src/renderers/webgl/WebGLUniforms.js +152 -24
- package/src/renderers/webgl/WebGLUtils.js +1 -1
- package/src/renderers/webxr/WebXRController.js +46 -13
- package/src/renderers/webxr/WebXRManager.js +71 -3
- package/src/scenes/Scene.js +8 -0
- package/src/textures/CompressedArrayTexture.js +18 -0
- package/src/textures/Texture.js +2 -1
- package/examples/js/libs/lottie_canvas.js +0 -12751
- package/examples/js/shaders/PixelShader.js +0 -51
- package/examples/jsm/shaders/PixelShader.js +0 -44
|
@@ -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.
|
|
131
|
-
this.y = event.
|
|
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,
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
348
|
-
|
|
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 ) :
|
|
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' ] =
|
|
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' ] =
|
|
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' ] =
|
|
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 =
|
|
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 =
|
|
1346
|
-
dom.style.top =
|
|
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 =
|
|
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
|
|
1557
|
-
|
|
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.
|
|
1698
|
+
this.titleDOM = titleDOM;
|
|
1566
1699
|
this.iconDOM = iconDOM;
|
|
1567
1700
|
this.toolbarDOM = toolbarDOM;
|
|
1568
1701
|
|
|
1569
|
-
dom.append(
|
|
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.
|
|
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.
|
|
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
|
-
|
|
1742
|
-
|
|
1743
|
-
|
|
1744
|
-
|
|
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
|
-
|
|
1747
|
-
|
|
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
|
-
|
|
1895
|
+
dom.append( mapCanvas );
|
|
1896
|
+
|
|
1897
|
+
const zoomTo = ( zoom, clientX = this.clientX, clientY = this.clientY ) => {
|
|
1758
1898
|
|
|
1759
|
-
|
|
1899
|
+
zoom = Math.min( Math.max( zoom, .2 ), 1 );
|
|
1760
1900
|
|
|
1761
|
-
|
|
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
|
-
|
|
1907
|
+
let touchData = null;
|
|
1768
1908
|
|
|
1769
|
-
|
|
1909
|
+
const onTouchStart = () => {
|
|
1770
1910
|
|
|
1771
|
-
|
|
1911
|
+
touchData = null;
|
|
1772
1912
|
|
|
1773
|
-
|
|
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
|
-
|
|
1779
|
-
|
|
1780
|
-
|
|
1781
|
-
);
|
|
1915
|
+
const onMouseZoom = ( e ) => {
|
|
1916
|
+
|
|
1917
|
+
e.preventDefault();
|
|
1782
1918
|
|
|
1783
|
-
|
|
1919
|
+
e.stopImmediatePropagation();
|
|
1784
1920
|
|
|
1785
|
-
|
|
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
|
-
|
|
1792
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1797
|
-
else if ( zoom > .98 ) zoom = 1;
|
|
1943
|
+
if ( touchData === null ) {
|
|
1798
1944
|
|
|
1799
|
-
|
|
1800
|
-
|
|
1801
|
-
|
|
1802
|
-
*/
|
|
1945
|
+
touchData = {
|
|
1946
|
+
distance
|
|
1947
|
+
};
|
|
1803
1948
|
|
|
1804
1949
|
}
|
|
1805
1950
|
|
|
1806
|
-
|
|
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
|
-
|
|
1816
|
-
|
|
1817
|
-
|
|
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',
|
|
1825
|
-
dom.addEventListener( 'touchmove',
|
|
1826
|
-
|
|
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 =
|
|
1899
|
-
data.scrollTop =
|
|
2068
|
+
data.scrollLeft = this.scrollLeft;
|
|
2069
|
+
data.scrollTop = this.scrollTop;
|
|
1900
2070
|
|
|
1901
2071
|
}
|
|
1902
2072
|
|
|
1903
|
-
|
|
1904
|
-
|
|
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
|
-
|
|
1929
|
-
|
|
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.
|
|
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
|
|
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
|
-
|
|
2229
|
+
this._scrollTop = val;
|
|
2230
|
+
this.contentDOM.style.top = numberToPX( val );
|
|
1958
2231
|
|
|
1959
2232
|
}
|
|
1960
2233
|
|
|
1961
|
-
get
|
|
2234
|
+
get scrollTop() {
|
|
1962
2235
|
|
|
1963
|
-
return this.
|
|
2236
|
+
return this._scrollTop;
|
|
1964
2237
|
|
|
1965
2238
|
}
|
|
1966
2239
|
|
|
1967
|
-
|
|
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
|
-
|
|
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
|
|
2260
|
+
get focusSelected() {
|
|
1974
2261
|
|
|
1975
|
-
return this.
|
|
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
|
-
|
|
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
|
-
|
|
2450
|
+
updateMap() {
|
|
2152
2451
|
|
|
2153
|
-
|
|
2452
|
+
const { nodes, mapCanvas, mapContext, scrollLeft, scrollTop, canvas, zoom, _mapInfo } = this;
|
|
2154
2453
|
|
|
2155
|
-
|
|
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
|
-
|
|
2523
|
+
mapContext.fillStyle = 'rgba( 200, 200, 200, 0.1 )';
|
|
2524
|
+
mapContext.fillRect( screenMapX, screenMapY, screenMapWidth, screenMapHeight );
|
|
2158
2525
|
|
|
2159
|
-
|
|
2160
|
-
|
|
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 !==
|
|
2546
|
+
if ( canvas.width !== _width || canvas.height !== _height ) {
|
|
2165
2547
|
|
|
2166
|
-
canvas.width =
|
|
2167
|
-
canvas.height =
|
|
2548
|
+
canvas.width = _width;
|
|
2549
|
+
canvas.height = _height;
|
|
2168
2550
|
|
|
2169
|
-
frontCanvas.width =
|
|
2170
|
-
frontCanvas.height =
|
|
2551
|
+
frontCanvas.width = _width;
|
|
2552
|
+
frontCanvas.height = _height;
|
|
2171
2553
|
|
|
2172
2554
|
}
|
|
2173
2555
|
|
|
2174
|
-
context.clearRect( 0, 0,
|
|
2175
|
-
frontContext.clearRect( 0, 0,
|
|
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$
|
|
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$
|
|
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
|
-
|
|
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 =
|
|
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(
|
|
3272
|
+
return super.setValue( numberToHex( value ), dispatch );
|
|
2871
3273
|
|
|
2872
3274
|
}
|
|
2873
3275
|
|
|
2874
3276
|
getValue() {
|
|
2875
3277
|
|
|
2876
|
-
return parseInt( super.getValue().
|
|
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
|
-
|
|
3297
|
+
this.dispatchEvent( new Event( 'blur' ) );
|
|
2894
3298
|
|
|
2895
|
-
|
|
3299
|
+
};
|
|
2896
3300
|
|
|
2897
|
-
|
|
3301
|
+
dom.onchange = () => {
|
|
2898
3302
|
|
|
2899
|
-
|
|
3303
|
+
this.dispatchEvent( new Event( 'change' ) );
|
|
2900
3304
|
|
|
2901
|
-
|
|
3305
|
+
};
|
|
2902
3306
|
|
|
2903
|
-
|
|
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 =
|
|
3337
|
+
this.iconDOM = null;
|
|
2923
3338
|
|
|
2924
|
-
this.labelDOM.append(
|
|
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
|
|
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 =
|
|
3338
|
-
dom.style.top =
|
|
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
|
|
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
|
|
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
|
|