Getting Started
Components
Device Mocks
Special Effects
Animations
Text Animations
Buttons
Move your mouse aroundTap anywhere to see the cursor
import { SmoothCursor } from "@/registry/magicui/smooth-cursor";
export function SmoothCursorDemo() {
return (
<>
<span className="hidden md:block">Move your mouse around</span>
<span className="block md:hidden">Tap anywhere to see the cursor</span>
<SmoothCursor />
</>
);
}
Features
- 🎯 Smooth physics-based cursor animations
- 🔄 Rotation effects based on movement direction
- ⚡ Performance optimized with RAF
- 🎨 Fully customizable cursor design
- 📦 Lightweight and easy to implement
Installation
pnpm dlx shadcn@latest add @magicui/smooth-cursor
Usage
import { SmoothCursor } from "@/components/ui/smooth-cursor";
<SmoothCursor />
Hiding Default Browser Cursor
To prevent the default browser cursor from overlapping with the custom cursor, add the following CSS globally:
* {
cursor: none !important;
}
Optional: Keep text cursor for inputs
input,
textarea,
select {
cursor: text !important;
}
💡 If you're using Tailwind CSS, you can add cursor-none to your layout wrapper:
<div className="cursor-none">
<SmoothCursor />
{/* your app */}
</div>
Props
Prop | Type | Default | Description |
---|---|---|---|
cursor | React.ReactNode | <DefaultCursorSVG /> | Custom cursor component to replace the default cursor |
springConfig | SpringConfig | See below | Configuration object for the spring animation behavior |
SpringConfig Type
interface SpringConfig {
damping: number; // Controls how quickly the animation settles
stiffness: number; // Controls the spring stiffness
mass: number; // Controls the virtual mass of the animated object
restDelta: number; // Controls the threshold at which animation is considered complete
}
Default Spring Configuration
const defaultSpringConfig = {
damping: 45,
stiffness: 400,
mass: 1,
restDelta: 0.001,
};
Browser Support
Compatible with all modern browsers that support:
requestAnimationFrame
- CSS transforms
- Pointer events
Accessibility
When using this component, consider that:
- Users navigating via keyboard will not see the custom cursor
- You may want to provide alternative visual cues for interactive elements
- Some users may have motion sensitivity, so consider providing a way to disable the animation
Credits
- Credit to @Code_Parth for the original concept and implementation
On This Page
FeaturesInstallationUsageHiding Default Browser CursorOptional: Keep text cursor for inputsPropsSpringConfig TypeDefault Spring ConfigurationBrowser SupportAccessibilityCreditsLimited Time Offer
Ship Faster with Magic UI ProMagic UI Pro
Stop building from scratch.
Get 8 production-ready templates and 50+ premium components that your users will love.
✓
Next.js 15 + TypeScript ready✓
Copy, paste, customize in minutes✓
Save 100+ hours of development