Contactless position sensing
Halden designs magnetic encoders for robot joints, surgical arms and satellite gimbals. No contact, no wear, and a fresh reading every 12 microseconds.
A minimal hero over the magnetic-field background component: a Canvas 2D field of iron filings that turn along the curved lines between two drifting magnetic poles. The cursor takes over one pole, spring physics pull the filings toward it, and every click sends a radial shockwave through the grid. An oversized headline sits beside a short intro and two Turn Arrow block buttons. Every field setting passes through the field prop; the ink follows the theme, the field pulses on its own when idle, it pauses offscreen, and reduced motion gets one settled frame.
A full-height hero over the magnetic-field background, a Canvas 2D grid of iron filings that swing along the lines between two drifting poles while the cursor takes over one pole and clicks send shockwaves, with an oversized headline, an intro and two Turn Arrow block buttons rising in at the bottom.
Upgrade to Pro
Pro blocks install through the shadcn CLI with your license key and ship their full source. Docs and live previews stay open to everyone, so you can read every block's details first.
Swap YOUR_EMAIL and YOUR_KEY for the email and license key on your account. Find your license key on your account page.
Radix flavor
npx shadcn add "https://ui.beste.co/r/hero211?email=YOUR_EMAIL&license_key=YOUR_KEY"Base UI flavor
npx shadcn add "https://ui.beste.co/r-base/hero211?email=YOUR_EMAIL&license_key=YOUR_KEY"This installs the block to components/beste/block/hero211.tsx plus the magnetic-field background and the button24 Turn Arrow button it uses.
The installed file exports hero211Demo alongside the block: the exact props behind the preview above. Spread it to get a working hero in one line.
import { Hero211, hero211Demo } from "@/components/beste/block/hero211";
export default function Page() {
return <Hero211 {...hero211Demo} />;
}Then replace the demo with your own props. Written out, a trimmed setup looks like this:
import { Hero211 } from "@/components/beste/block/hero211";
export default function Page() {
return (
<Hero211
eyebrow="Contactless position sensing"
heading="Read the field."
description="Magnetic encoders for robot joints, surgical arms and satellite gimbals."
buttons={[
{ label: "Order a sample kit", href: "/samples" },
{ label: "Browse datasheets", href: "/datasheets" },
]}
field={{
inkColor: "var(--foreground)",
paperColor: "var(--background)",
spacing: 24,
secondPole: true,
shockwave: 0.5,
pulseInterval: 6.5,
}}
/>
);
}| Prop | Type | Default | Description |
|---|---|---|---|
eyebrow | string | – | Muted line above the headline |
heading | string | – | Oversized headline, rendered as the page h1 |
description | string | – | Intro in the right column from md |
buttons | ActionButton[] | [] | Turn Arrow block buttons (Button24): the first dark, the rest light with a hairline border |
field | Omit<MagneticFieldProps, "className" | "children"> | – | Forwards the MagneticField props from the magnetic-field component (colors, spacing, filing length and weight, contrast, stiffness, pole strength, second pole, shockwave, pulse interval, speed, interactive, paused) |
className | string | – | Extra classes for the outer <section> |
type ActionButton = {
label: string;
href: string;
};var(--foreground) and var(--background), so it follows the theme when field is left out.pulseInterval seconds. The whole section shows a crosshair cursor.