Skip to main content

Movable

Dependencies​

This component does not require any dependencies.

Usage​

import Movable from "@arclockproject/common/components/Movable";

The examples below are live. Edit the code to try your own values.

Moving and zooming​

Drag with the mouse or one finger. Zoom with the mouse wheel or by pinching. Turning a feature off resets its position or zoom.

▶ Show code (click to view and edit)
Live Editor
function MovablePlayground() {
  const [enableMovement, setEnableMovement] = useState(true);
  const [enableZoom, setEnableZoom] = useState(false);

  return (
    <div>
      <label>
        <input type="checkbox" checked={enableMovement} onChange={() => setEnableMovement(!enableMovement)} /> enableMovement
      </label>{" "}
      <label>
        <input type="checkbox" checked={enableZoom} onChange={() => setEnableZoom(!enableZoom)} /> enableZoom
      </label>
      <Movable
        enableMovement={enableMovement}
        enableZoom={enableZoom}
        style={{
          width: "100%",
          height: "160px",
          background: "rgb(52, 11, 55)", // Purple
        }}
      >
        <div
          style={{
            width: "100%",
            height: "100%",
            background: "rgb(3, 70, 3)", // Green
          }}
        >
          <p style={{ color: "white" }}>
            {enableMovement && enableZoom
              ? "Move and zoom me!"
              : enableMovement
                ? "Move me!"
                : enableZoom
                  ? "Zoom me!"
                  : "You can't move or zoom me!"}
          </p>
        </div>
      </Movable>
    </div>
  );
}
Result
Loading...

Movable acts like a div​

It accepts all <div> props. Your onMouseDown and onTouchStart run before the drag logic, even when dragging is off.

▶ Show code (click to view and edit)
Live Editor
function MovableEvents() {
  const [log, setLog] = useState([]);
  const add = (message) => setLog((list) => [message, ...list].slice(0, 4));

  return (
    <div>
      <Movable
        enableMovement
        style={{
          width: "100%",
          height: "120px",
          background: "rgb(52, 11, 55)", // Purple
        }}
        onClick={() => add("onClick")}
        onMouseDown={() => add("onMouseDown (before move logic)")}
      >
        <div
          style={{
            width: "100%",
            height: "100%",
            background: "rgb(3, 70, 3)", // Green
          }}
        >
          <p style={{ color: "white" }}>Click or drag me!</p>
        </div>
      </Movable>
      {log.map((message, i) => (
        <div key={i}><code>{message}</code></div>
      ))}
    </div>
  );
}
Result
Loading...

API​

See the Movable API reference for every prop, method and type.