Drag Elements
fancy/drag-elementsFreeComponent
A ui component.
Install it
npx shadcn@latest add https://www.fancycomponents.dev/r/drag-elements.jsonSource
1"use client"23import React, { useEffect, useRef, useState } from "react"4import { InertiaOptions, motion } from "motion/react"56type DragElementsProps = {7 children: React.ReactNode8 dragElastic?:9 | number10 | { top?: number; left?: number; right?: number; bottom?: number }11 | boolean12 dragConstraints?:13 | { top?: number; left?: number; right?: number; bottom?: number }14 | React.RefObject<Element | null>15 dragMomentum?: boolean16 dragTransition?: InertiaOptions17 dragPropagation?: boolean18 selectedOnTop?: boolean19 className?: string20}2122const DragElements: React.FC<DragElementsProps> = ({23 children,24 dragElastic = 0.5,25 dragConstraints,26 dragMomentum = true,27 dragTransition = { bounceStiffness: 200, bounceDamping: 300 },28 dragPropagation = true,29 selectedOnTop = true,30 className,31}) => {32 const constraintsRef = useRef<HTMLDivElement>(null)33 const [zIndices, setZIndices] = useState<number[]>([])3435 const [isDragging, setIsDragging] = useState(false)3637 useEffect(() => {38 setZIndices(39 Array.from({ length: React.Children.count(children) }, (_, i) => i)40 )41 }, [children])4243 const bringToFront = (index: number) => {44 if (selectedOnTop) {45 setZIndices((prevIndices) => {46 const newIndices = [...prevIndices]47 const currentIndex = newIndices.indexOf(index)48 newIndices.splice(currentIndex, 1)49 newIndices.push(index)50 return newIndices51 })52 }53 }5455 return (56 <div ref={constraintsRef} className={`relative w-full h-full ${className}`}>57 {React.Children.map(children, (child, index) => (58 <motion.div59 key={index}60 drag61 dragElastic={dragElastic}62 dragConstraints={dragConstraints || constraintsRef}63 dragMomentum={dragMomentum}64 dragTransition={dragTransition}65 dragPropagation={dragPropagation}66 style={{67 zIndex: zIndices.indexOf(index),6869 cursor: isDragging ? "grabbing" : "grab",70 }}71 onDragStart={() => {72 bringToFront(index)73 setIsDragging(true)74 }}75 onDragEnd={() => setIsDragging(false)}76 whileDrag={{ cursor: "grabbing" }}77 className={"absolute"}78 >79 {child}80 </motion.div>81 ))}82 </div>83 )84}8586export default DragElements
What it pulls in
npm packages
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 | |
| Elastic Lineelastic-line | fancy | Components | Free | 1 dep |
