Magnetic Button

A magnetic button that is pulled toward the cursor on hover and springs back on leave.

Installation

Adds the component and everything it depends on to your project.

npx shadcn add https://ui.beste.co/component/r-base/button20

New here? Read the installation guide.

Usage

The import and the props worth knowing about, in one place.

import { Button20 } from "@/components/beste/component/button20";
import { ArrowRight } from "lucide-react";
import Link from "next/link";

// Compose the link with the render prop: your Link becomes the rendered
// element and the button content stays as its children.
<Button20 label="Let's talk" render={<Link href="/contact" />} />

<Button20
  label="See the work"
  icon={ArrowRight}   // optional leading icon
  tone="primary"      // "dark" (default) | "primary"
  strength={0.4}      // cursor pull, 0–1 (default 0.25)
  onClick={() => console.log("see the work")}
/>

Playground

Turn the props on the right; the snippet under them is what you would write to get what you see.

Usage
import { Button20 } from "@/components/beste/component/button20";

<Button20
  label="Let's talk"
/>

Keyboard and gestures

Every one of these is in the component already. They are listed because a props table cannot mention a gesture, so nothing else on this page can tell you they exist.

Move the pointer near itThe button leans towards the cursor; `strength` is how far it is willing to go.

Props

Read from the component's own type, so this cannot drift from what it accepts.

PropTypeDefaultDescription
label*stringButton label
asChildbooleanCompose the rendered element shadcn-style (radix asChild): your element (e.g. a router Link) becomes the root and the button content is injected as its children. Pass the element without children of its own.
childrenReact.ReactElementThe element to render when `asChild` is set (e.g. your framework's Link)
hrefstringFallback link: renders a plain `<a>`. Prefer `asChild` with your framework's Link component for client-side navigation.
iconLucideIconOptional leading icon
tone"dark" | "primary"Surface tone: solid dark (default) or primary
strengthnumberHow strongly the button follows the cursor (0–1, defaults to 0.25)
onClickReact.MouseEventHandler<HTMLButtonElement>Click handler (used when there is no href and no asChild)
classNamestringAdditional classes merged onto the button

More Button components

View all Button

Corner Brackets Button

A monospace button framed by corner brackets that spring outward on hover.

Pressable Button

A neobrutalist button with a hard offset shadow that lifts on hover and presses in on click.

Letter Roll Button

A pill button whose label rolls up letter by letter with a staggered hover animation.

Scramble Button

A scramble text button that cycles random glyphs on hover for developer and tech landings.

Expanding Reveal Button

An expanding icon button that reveals its label on hover or focus for compact layouts.

Shine Sweep Button

A premium pill button with a diagonal shine sweep on hover for pricing and upgrade actions.

Markdown version