Port.tsx 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. import { PlusOutlined } from "@ant-design/icons";
  2. import React from "react";
  3. export default function Port(props: {
  4. hovered: boolean;
  5. out?: boolean;
  6. style?: React.CSSProperties;
  7. }) {
  8. const { hovered, style = {}, out = true } = props;
  9. const [canAdd, setCanAdd] = React.useState(false);
  10. const handleSetCanAdd = (value: boolean) => {
  11. out && setCanAdd(value);
  12. };
  13. const extraStyle = React.useMemo(() => {
  14. if (out && canAdd) {
  15. return {
  16. transform: "scale(2) translateY(-50%)"
  17. };
  18. }
  19. return {};
  20. }, [canAdd]);
  21. return (
  22. <div
  23. className="node-port flex items-center justify-center"
  24. style={{
  25. transform: hovered ? "scale(1.5) translateY(-50%)" : "scale(1) translateY(-50%)",
  26. opacity: hovered ? 1 : 0.5,
  27. ...style,
  28. ...extraStyle
  29. }}
  30. onMouseEnter={() => handleSetCanAdd(true)}
  31. onMouseLeave={() => handleSetCanAdd(false)}
  32. >
  33. { out && <PlusOutlined
  34. className="transform scale-0 transition duration-300 color-#fff text-8px"
  35. style={{ transform: canAdd ? "scale(1)" : "scale(0)" }}
  36. />}
  37. </div>
  38. );
  39. }