Cursor Attractor And Gravity
fancy/cursor-attractor-and-gravityFreeComponent
A ui component.
Install it
npx shadcn@latest add https://www.fancycomponents.dev/r/cursor-attractor-and-gravity.jsonSource
1"use client"23import {4 createContext,5 forwardRef,6 ReactNode,7 useCallback,8 useContext,9 useEffect,10 useImperativeHandle,11 useRef,12 useState,13} from "react"14import { calculatePosition } from "@/utils/calculate-position"15import { parsePathToVertices } from "@/utils/svg-path-to-vertices"16import { debounce } from "lodash"17import Matter, {18 Bodies,19 Common,20 Engine,21 Events,22 Render,23 Runner,24 World,25 Body,26} from "matter-js"2728import { cn } from "@/lib/utils"29import { useMousePositionRef } from "@/hooks/use-mouse-position-ref"3031type GravityProps = {32 children: ReactNode33 debug?: boolean34 attractorPoint?: { x: number | string; y: number | string }35 attractorStrength?: number36 cursorStrength?: number37 cursorFieldRadius?: number38 resetOnResize?: boolean39 addTopWall?: boolean40 autoStart?: boolean41 className?: string42}4344type PhysicsBody = {45 element: HTMLElement46 body: Matter.Body47 props: MatterBodyProps48}4950type MatterBodyProps = {51 children: ReactNode52 matterBodyOptions?: Matter.IBodyDefinition53 isDraggable?: boolean54 bodyType?: "rectangle" | "circle" | "svg"55 sampleLength?: number56 x?: number | string57 y?: number | string58 angle?: number59 className?: string60}6162export type GravityRef = {63 start: () => void64 stop: () => void65 reset: () => void66}6768const GravityContext = createContext<{69 registerElement: (70 id: string,71 element: HTMLElement,72 props: MatterBodyProps73 ) => void74 unregisterElement: (id: string) => void75} | null>(null)7677export const MatterBody = ({78 children,79 className,80 matterBodyOptions = {81 friction: 0.1,82 restitution: 0.1,83 density: 0.001,84 isStatic: false,85 },86 bodyType = "rectangle",87 isDraggable = true,88 sampleLength = 15,89 x = 0,90 y = 0,91 angle = 0,92 ...props93}: MatterBodyProps) => {94 const elementRef = useRef<HTMLDivElement>(null)95 const idRef = useRef(Math.random().toString(36).substring(7))96 const context = useContext(GravityContext)9798 useEffect(() => {99 if (!elementRef.current || !context) return100 context.registerElement(idRef.current, elementRef.current, {101 children,102 matterBodyOptions,103 bodyType,104 sampleLength,105 isDraggable,106 x,107 y,108 angle,109 ...props,110 })111112 return () => context.unregisterElement(idRef.current)113 }, [props, children, matterBodyOptions, isDraggable])114115 return (116 <div117 ref={elementRef}118 className={cn(119 "absolute",120 className,121 )}122 >123 {children}124// … truncated
What it pulls in
npm packages
Other registry items
Files it writes
More from fancy
All 158 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| Animated Gradient With Svganimated-gradient-with-svg | fancy | Components | Free | no deps | |
| Basic Number Tickerbasic-number-ticker | fancy | Components | Free | 1 dep | |
| Box Carouselbox-carousel | fancy | Components | Free | 1 dep | |
| Breathing Textbreathing-text | fancy | Components | Free | 1 dep | |
| Circling Elementscircling-elements | fancy | Components | Free | 1 dep | |
| Css Boxcss-box | fancy | Components | Free | 1 dep | |
| Drag Elementsdrag-elements | fancy | Components | Free | 1 dep | |
| Elastic Lineelastic-line | fancy | Components | Free | 1 dep |
