{ "$schema": "https://ui.shadcn.com/schema/registry-item.json", "name": "spinning-text", "title": "Spinning Text", "description": "A spinning text component", "dependencies": [ "framer-motion" ], "files": [ { "path": "registry/pioneerui/spinning-text.tsx", "content": "\"use client\"\n\nimport { cn } from \"@/lib/utils\"\nimport { motion, type Transition, type Variants } from \"framer-motion\"\nimport type React from \"react\"\nimport type { CSSProperties } from \"react\"\n\ntype SpinningTextProps = {\n children: string | string[]\n style?: CSSProperties\n duration?: number\n className?: string\n reverse?: boolean\n fontSize?: number\n radius?: number\n transition?: Transition\n variants?: {\n container?: Variants\n item?: Variants\n }\n}\n\nconst BASE_TRANSITION = {\n repeat: Number.POSITIVE_INFINITY,\n ease: \"linear\",\n}\n\nconst BASE_ITEM_VARIANTS = {\n hidden: {\n opacity: 1,\n },\n visible: {\n opacity: 1,\n },\n}\n\nexport function SpinningText({\n children,\n duration = 10,\n style,\n className,\n reverse = false,\n radius = 5,\n transition,\n variants,\n}: SpinningTextProps) {\n if (typeof children !== \"string\" && !Array.isArray(children)) {\n throw new Error(\"children must be a string or an array of strings\")\n }\n\n if (Array.isArray(children)) {\n // Validate all elements are strings\n if (!children.every((child) => typeof child === \"string\")) {\n throw new Error(\"all elements in children array must be strings\")\n }\n children = children.join(\"\")\n }\n\n const letters = children.split(\"\")\n letters.push(\" \")\n\n const finalTransition = {\n ...BASE_TRANSITION,\n ...transition,\n duration: (transition as { duration?: number })?.duration ?? duration,\n }\n\n const containerVariants = {\n visible: { rotate: reverse ? -360 : 360 },\n ...variants?.container,\n }\n\n const itemVariants = {\n ...BASE_ITEM_VARIANTS,\n ...variants?.item,\n }\n\n return (\n \n {letters.map((letter, index) => (\n \n {letter}\n \n ))}\n {children}\n \n )\n}\n\n", "type": "registry:ui", "target": "components/pioneerui/spinning-text.tsx" } ], "type": "registry:ui" }