{
"$schema": "https://ui.shadcn.com/schema/registry-item.json",
"name": "drag-to-confirm-slider-shadcnui",
"type": "registry:component",
"title": "Drag-to-Confirm Slider",
"description": "Slider that activates action only when fully dragged to end",
"registryDependencies": [
"button"
],
"dependencies": [
"framer-motion",
"react"
],
"files": [
{
"path": "@uitripled/react-shadcn/src/components/motion-core/drag-to-confirm-slider.tsx",
"content": "\"use client\";\n\nimport { motion, PanInfo, useMotionValue, useTransform } from \"framer-motion\";\nimport { Check } from \"lucide-react\";\nimport { useState } from \"react\";\n\ntype DragToConfirmSliderProps = {\n onConfirm?: () => void;\n label?: string;\n confirmText?: string;\n};\n\nexport function DragToConfirmSlider({\n onConfirm,\n label = \"Drag to confirm\",\n confirmText = \"Confirmed!\",\n}: DragToConfirmSliderProps) {\n const [isConfirmed, setIsConfirmed] = useState(false);\n const [isDragging, setIsDragging] = useState(false);\n const x = useMotionValue(0);\n\n const progress = useTransform(x, [0, 200], [0, 100]);\n const opacity = useTransform(x, [0, 200], [1, 0]);\n const labelOpacity = useTransform(progress, [0, 100], [1, 0]);\n const width = useTransform(x, [0, 200], [48, 248]);\n\n const handleDragEnd = (\n _: MouseEvent | TouchEvent | PointerEvent,\n info: PanInfo\n ) => {\n const currentX = x.get();\n if (currentX >= 180) {\n setIsConfirmed(true);\n if (onConfirm) {\n setTimeout(() => onConfirm(), 300);\n }\n } else {\n x.set(0);\n }\n setIsDragging(false);\n };\n\n if (isConfirmed) {\n return (\n