Gravity
fancy/gravityFreeComponent
A ui component.
Install it
npx shadcn@latest add https://www.fancycomponents.dev/r/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 Mouse,23 MouseConstraint,24 Query,25 Render,26 Runner,27 World,28} from "matter-js"2930import { cn } from "@/lib/utils"3132type GravityProps = {33 children: ReactNode34 debug?: boolean35 gravity?: { x: number; y: number }36 resetOnResize?: boolean37 grabCursor?: boolean38 addTopWall?: boolean39 autoStart?: boolean40 className?: string41}4243type PhysicsBody = {44 element: HTMLElement45 body: Matter.Body46 props: MatterBodyProps47}4849type MatterBodyProps = {50 children: ReactNode51 matterBodyOptions?: Matter.IBodyDefinition52 isDraggable?: boolean53 bodyType?: "rectangle" | "circle" | "svg"54 sampleLength?: number55 x?: number | string56 y?: number | string57 angle?: number58 className?: string59}6061export type GravityRef = {62 start: () => void63 stop: () => void64 reset: () => void65}6667const GravityContext = createContext<{68 registerElement: (69 id: string,70 element: HTMLElement,71 props: MatterBodyProps72 ) => void73 unregisterElement: (id: string) => void74} | null>(null)7576export const MatterBody = ({77 children,78 className,79 matterBodyOptions = {80 friction: 0.1,81 restitution: 0.1,82 density: 0.001,83 isStatic: false,84 },85 bodyType = "rectangle",86 isDraggable = true,87 sampleLength = 15,88 x = 0,89 y = 0,90 angle = 0,91 ...props92}: MatterBodyProps) => {93 const elementRef = useRef<HTMLDivElement>(null)94 const idRef = useRef(Math.random().toString(36).substring(7))95 const context = useContext(GravityContext)9697 useEffect(() => {98 if (!elementRef.current || !context) return99 context.registerElement(idRef.current, elementRef.current, {100 children,101 matterBodyOptions,102 bodyType,103 sampleLength,104 isDraggable,105 x,106 y,107 angle,108 ...props,109 })110111 return () => context.unregisterElement(idRef.current)112 }, [props, children, matterBodyOptions, isDraggable])113114 return (115 <div116 ref={elementRef}117 className={cn(118 "absolute",119 className,120 isDraggable && "pointer-events-none"121 )}122 >123 {children}124 </div>125 )126}127128const Gravity = forwardRef<GravityRef, GravityProps>(129 (130 {131// … 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 | |
| Cursor Attractor And Gravitycursor-attractor-and-gravity | fancy | Components | Free | 5 deps | |
| Drag Elementsdrag-elements | fancy | Components | Free | 1 dep |
