@webenza/ui 0.0.2 → 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +45 -7
- package/dist/index.d.mts +49 -1
- package/dist/index.d.ts +49 -1
- package/dist/index.js +417 -6
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +416 -9
- package/dist/index.mjs.map +1 -1
- package/package.json +22 -5
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cursor/CursorFollower/CursorFollower.tsx"],"names":["useRef","useEffect","gsap","jsx"],"mappings":"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","file":"index.js","sourcesContent":["import { useEffect, useRef } from \"react\";\r\nimport gsap from \"gsap\";\r\n\r\nexport type CursorFollowerProps = {\r\n text?: string;\r\n\r\n size?: number;\r\n borderWidth?: number;\r\n borderColor?: string;\r\n background?: string;\r\n\r\n fontFamily?: string;\r\n fontSize?: number;\r\n fontWeight?: number | string;\r\n letterSpacing?: number;\r\n\r\n lerp?: number;\r\n showScale?: number;\r\n hideScale?: number;\r\n\r\n enabled?: boolean;\r\n blockSelectors?: string[];\r\n containerRef?: React.RefObject<HTMLElement>;\r\n};\r\n\r\nexport const CursorFollower = ({\r\n text = \"\", // Changed from \"PLAY\" to empty string for generic usage\r\n\r\n size = 90,\r\n borderWidth = 2,\r\n borderColor = \"#fff\",\r\n background = \"transparent\",\r\n\r\n fontFamily = \"inherit\",\r\n fontSize = 12,\r\n fontWeight = 400,\r\n letterSpacing = 2,\r\n\r\n lerp = 0.035,\r\n showScale = 1,\r\n hideScale = 0,\r\n\r\n enabled = true,\r\n blockSelectors = [\"button\", \"a\"], // Added sensible defaults\r\n containerRef,\r\n}: CursorFollowerProps) => {\r\n const cursorRef = useRef<HTMLDivElement>(null);\r\n\r\n useEffect(() => {\r\n if (!enabled) return;\r\n\r\n const cursor = cursorRef.current;\r\n if (!cursor) return;\r\n\r\n let targetX = 0;\r\n let targetY = 0;\r\n let currentX = 0;\r\n let currentY = 0;\r\n let visible = false;\r\n let blocked = false;\r\n\r\n const show = () => {\r\n if (visible || blocked) return;\r\n visible = true;\r\n gsap.to(cursor, { scale: showScale, opacity: 1, duration: 0.25 });\r\n };\r\n\r\n const hide = () => {\r\n if (!visible) return;\r\n visible = false;\r\n gsap.to(cursor, { scale: hideScale, opacity: 0, duration: 0.25 });\r\n };\r\n\r\n const move = (e: MouseEvent) => {\r\n if (containerRef?.current) {\r\n const bounds = containerRef.current.getBoundingClientRect();\r\n // Calculate relative coordinates\r\n targetX = e.clientX - bounds.left;\r\n targetY = e.clientY - bounds.top;\r\n } else {\r\n targetX = e.clientX;\r\n targetY = e.clientY;\r\n }\r\n };\r\n\r\n const update = () => {\r\n currentX += (targetX - currentX) * lerp;\r\n currentY += (targetY - currentY) * lerp;\r\n\r\n gsap.set(cursor, {\r\n x: currentX - size / 2,\r\n y: currentY - size / 2,\r\n });\r\n };\r\n\r\n // Event Listeners Source\r\n const target = containerRef?.current || window;\r\n\r\n target.addEventListener(\"mousemove\", move as any);\r\n target.addEventListener(\"mouseenter\", show as any);\r\n target.addEventListener(\"mouseleave\", hide as any);\r\n\r\n gsap.ticker.add(update);\r\n\r\n // Handle blocked selectors\r\n const cleanupFns: (() => void)[] = [];\r\n\r\n blockSelectors.forEach((selector) => {\r\n const elements = document.querySelectorAll(selector);\r\n elements.forEach((el) => {\r\n const enter = () => {\r\n blocked = true;\r\n hide();\r\n };\r\n const leave = () => {\r\n blocked = false;\r\n show();\r\n };\r\n\r\n el.addEventListener(\"mouseenter\", enter);\r\n el.addEventListener(\"mouseleave\", leave);\r\n\r\n cleanupFns.push(() => {\r\n el.removeEventListener(\"mouseenter\", enter);\r\n el.removeEventListener(\"mouseleave\", leave);\r\n });\r\n });\r\n });\r\n\r\n return () => {\r\n target.removeEventListener(\"mousemove\", move as any);\r\n target.removeEventListener(\"mouseenter\", show as any);\r\n target.removeEventListener(\"mouseleave\", hide as any);\r\n gsap.ticker.remove(update);\r\n cleanupFns.forEach((fn) => fn());\r\n };\r\n }, [\r\n enabled,\r\n size,\r\n lerp,\r\n showScale,\r\n hideScale,\r\n blockSelectors,\r\n containerRef\r\n ]);\r\n\r\n if (!enabled) return null;\r\n\r\n return (\r\n <div\r\n ref={cursorRef}\r\n style={{\r\n position: containerRef ? \"absolute\" : \"fixed\",\r\n top: 0,\r\n left: 0,\r\n width: size,\r\n height: size,\r\n border: `${borderWidth}px solid ${borderColor}`,\r\n background,\r\n borderRadius: \"50%\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n pointerEvents: \"none\",\r\n zIndex: 9999,\r\n opacity: 0,\r\n transform: \"scale(0)\",\r\n fontFamily,\r\n fontSize,\r\n fontWeight,\r\n letterSpacing,\r\n textTransform: \"uppercase\",\r\n color: borderColor,\r\n }}\r\n >\r\n {text}\r\n </div>\r\n );\r\n};\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/cursor/CursorFollower/CursorFollower.tsx","../src/cursor/ImageTrail/ImageTrail.tsx","../src/Button/HoverFillButton/HoverFillButton.tsx","../src/Other/ImageMarquee/ImageMarquee.tsx","../src/Text/CircularText/CircularText.tsx"],"names":["useRef","useLayoutEffect","gsap","jsx","useState","useEffect","jsxs","AnimatePresence","motion","FiArrowRight","defaultImages","LuMouse"],"mappings":"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","file":"index.js","sourcesContent":["import { useLayoutEffect, useRef } from \"react\";\r\nimport gsap from \"gsap\";\r\n\r\nexport type CursorFollowerProps = {\r\n text?: string;\r\n\r\n size?: number;\r\n borderWidth?: number;\r\n borderColor?: string;\r\n background?: string;\r\n\r\n fontFamily?: string;\r\n fontSize?: number;\r\n fontWeight?: number | string;\r\n letterSpacing?: number;\r\n\r\n lerp?: number;\r\n showScale?: number;\r\n hideScale?: number;\r\n\r\n enabled?: boolean;\r\n blockSelectors?: string[];\r\n containerRef?: React.RefObject<HTMLElement>;\r\n};\r\n\r\nexport const CursorFollower = ({\r\n text = \"PLAY\",\r\n size = 90,\r\n borderWidth = 2,\r\n borderColor = \"#ffffff\",\r\n background = \"transparent\",\r\n\r\n fontFamily = \"inherit\",\r\n fontSize = 12,\r\n fontWeight = 400,\r\n letterSpacing = 2,\r\n\r\n lerp = 0.035,\r\n showScale = 1,\r\n hideScale = 0,\r\n\r\n enabled = true,\r\n blockSelectors = [\"button\", \"a\"],\r\n containerRef,\r\n}: CursorFollowerProps) => {\r\n const cursorRef = useRef<HTMLDivElement>(null);\r\n\r\n useLayoutEffect(() => {\r\n if (!enabled) return;\r\n\r\n const cursor = cursorRef.current;\r\n if (!cursor) return;\r\n\r\n let targetX = 0;\r\n let targetY = 0;\r\n let currentX = 0;\r\n let currentY = 0;\r\n let visible = false;\r\n let blocked = false;\r\n\r\n const show = () => {\r\n if (visible || blocked) return;\r\n visible = true;\r\n gsap.to(cursor, { scale: showScale, opacity: 1, duration: 0.25 });\r\n };\r\n\r\n const hide = () => {\r\n if (!visible) return;\r\n visible = false;\r\n gsap.to(cursor, { scale: hideScale, opacity: 0, duration: 0.25 });\r\n };\r\n\r\n const move = (e: MouseEvent) => {\r\n if (containerRef?.current) {\r\n const bounds = containerRef.current.getBoundingClientRect();\r\n targetX = e.clientX - bounds.left;\r\n targetY = e.clientY - bounds.top;\r\n } else {\r\n targetX = e.clientX;\r\n targetY = e.clientY;\r\n }\r\n\r\n // Ensure cursor is visible if it moves\r\n if (!visible && !blocked) {\r\n show();\r\n }\r\n };\r\n\r\n const update = () => {\r\n currentX += (targetX - currentX) * lerp;\r\n currentY += (targetY - currentY) * lerp;\r\n\r\n gsap.set(cursor, {\r\n x: currentX - size / 2,\r\n y: currentY - size / 2,\r\n });\r\n };\r\n\r\n // Event Listeners Source\r\n const target = containerRef?.current || window;\r\n\r\n target.addEventListener(\"mousemove\", move as any);\r\n target.addEventListener(\"mouseenter\", show as any);\r\n target.addEventListener(\"mouseleave\", hide as any);\r\n\r\n gsap.ticker.add(update);\r\n\r\n // Force initial visibility and positioning\r\n requestAnimationFrame(() => {\r\n if (containerRef?.current) {\r\n const bounds = containerRef.current.getBoundingClientRect();\r\n targetX = bounds.width / 2;\r\n targetY = bounds.height / 2;\r\n } else {\r\n targetX = window.innerWidth / 2;\r\n targetY = window.innerHeight / 2;\r\n }\r\n\r\n // Set current position immediately to avoid lerp from 0,0\r\n currentX = targetX;\r\n currentY = targetY;\r\n\r\n gsap.set(cursor, {\r\n x: currentX - size / 2,\r\n y: currentY - size / 2\r\n });\r\n\r\n show();\r\n });\r\n\r\n // Handle blocked selectors\r\n const cleanupFns: (() => void)[] = [];\r\n\r\n blockSelectors.forEach((selector) => {\r\n const elements = document.querySelectorAll(selector);\r\n elements.forEach((el) => {\r\n const enter = () => {\r\n blocked = true;\r\n hide();\r\n };\r\n const leave = () => {\r\n blocked = false;\r\n show();\r\n };\r\n\r\n el.addEventListener(\"mouseenter\", enter);\r\n el.addEventListener(\"mouseleave\", leave);\r\n\r\n cleanupFns.push(() => {\r\n el.removeEventListener(\"mouseenter\", enter);\r\n el.removeEventListener(\"mouseleave\", leave);\r\n });\r\n });\r\n });\r\n\r\n return () => {\r\n target.removeEventListener(\"mousemove\", move as any);\r\n target.removeEventListener(\"mouseenter\", show as any);\r\n target.removeEventListener(\"mouseleave\", hide as any);\r\n gsap.ticker.remove(update);\r\n cleanupFns.forEach((fn) => fn());\r\n };\r\n }, [\r\n enabled,\r\n size,\r\n lerp,\r\n showScale,\r\n hideScale,\r\n // Stabilize dependency: only re-run if the joined string changes\r\n blockSelectors.join(\",\"),\r\n containerRef\r\n ]);\r\n\r\n if (!enabled) return null;\r\n\r\n return (\r\n <div\r\n ref={cursorRef}\r\n style={{\r\n position: containerRef ? \"absolute\" : \"fixed\",\r\n top: 0,\r\n left: 0,\r\n width: size,\r\n height: size,\r\n border: `${borderWidth}px solid ${borderColor}`,\r\n background,\r\n borderRadius: \"50%\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n pointerEvents: \"none\",\r\n zIndex: 9999,\r\n opacity: 0,\r\n transform: \"scale(0)\",\r\n fontFamily,\r\n fontSize,\r\n fontWeight,\r\n letterSpacing,\r\n textTransform: \"uppercase\",\r\n color: borderColor,\r\n }}\r\n >\r\n {text}\r\n </div>\r\n );\r\n};\r\n","import React, { useRef, useState, useEffect } from 'react';\r\nimport { motion, AnimatePresence } from 'framer-motion';\r\n\r\nexport interface ImageTrailProps {\r\n images?: string[];\r\n size?: number;\r\n rotationRange?: number;\r\n interval?: number; // Distance in px required to spawn next image\r\n fadeDuration?: number;\r\n className?: string;\r\n}\r\n\r\nconst defaultImages = [\r\n \"https://picsum.photos/id/237/200/200\",\r\n \"https://picsum.photos/id/10/200/200\",\r\n \"https://picsum.photos/id/20/200/200\",\r\n \"https://picsum.photos/id/28/200/200\",\r\n \"https://picsum.photos/id/29/200/200\",\r\n \"https://picsum.photos/id/35/200/200\",\r\n \"https://picsum.photos/id/40/200/200\",\r\n \"https://picsum.photos/id/55/200/200\",\r\n \"https://picsum.photos/id/60/200/200\",\r\n \"https://picsum.photos/id/70/200/200\"\r\n];\r\n\r\ninterface TrailItem {\r\n id: number;\r\n src: string;\r\n x: number;\r\n y: number;\r\n rotation: number;\r\n}\r\n\r\nexport const ImageTrail: React.FC<ImageTrailProps> = ({\r\n images = defaultImages,\r\n size = 100,\r\n rotationRange = 15,\r\n interval = 30, // Default to fairly dense for smooth \"train\" effect\r\n fadeDuration = 0.5,\r\n className\r\n}) => {\r\n const [trail, setTrail] = useState<TrailItem[]>([]);\r\n const lastPosRef = useRef<{ x: number, y: number } | null>(null);\r\n const indexRef = useRef(0);\r\n const idCounterRef = useRef(0);\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n\r\n // Time-based cleanup\r\n useEffect(() => {\r\n const cleanupInterval = setInterval(() => {\r\n // Assuming IDs are roughly chronological if we used Date.now(), \r\n // but we switched to counter. \r\n // Actually, let's switch back to a safer cleanup that doesn't rely on ID being timestamp\r\n // BUT, for simplicity and since we want a \"fade out\" effect managed by AnimatePresence,\r\n // we really just need to trim the list if it gets too long, or let them expire.\r\n // Let's use a timestamp property for cleanup to be safe.\r\n setTrail(prev => {\r\n // If we want purely time-based expiration, we need a created timestamp.\r\n // However, simply limiting the valid set by time is tricky if we use counter IDs.\r\n // Let's rely on AnimatePresence for the visual fade, and just strictly limit count or use a parallel timestamp.\r\n // Reverting to the simpler \"limit count\" strategy might be more robust for now to avoid complexity,\r\n // but the user specifically asked for \"fade when stop\".\r\n // So let's add a 'created' field to the item state implicitly.\r\n // Actually, let's just use Date.now() for ID again but ensuring uniqueness?\r\n // No, let's stick to counter ID + created timestamp.\r\n return prev.filter(item => Date.now() - (item as any).created < fadeDuration * 1000);\r\n });\r\n }, 100);\r\n\r\n return () => clearInterval(cleanupInterval);\r\n }, [fadeDuration]);\r\n\r\n const handleMouseMove = (e: React.MouseEvent<HTMLDivElement>) => {\r\n if (!containerRef.current) return;\r\n\r\n const rect = containerRef.current.getBoundingClientRect();\r\n const x = e.clientX - rect.left;\r\n const y = e.clientY - rect.top;\r\n const currentPos = { x, y };\r\n\r\n if (!lastPosRef.current) {\r\n lastPosRef.current = currentPos;\r\n return;\r\n }\r\n\r\n const dx = currentPos.x - lastPosRef.current.x;\r\n const dy = currentPos.y - lastPosRef.current.y;\r\n const distance = Math.sqrt(dx * dx + dy * dy);\r\n\r\n // Spawn a new image if we've moved enough\r\n if (distance > interval) {\r\n const newImage: TrailItem & { created: number } = {\r\n id: idCounterRef.current++,\r\n created: Date.now(),\r\n src: images[indexRef.current % images.length] || \"\",\r\n x: currentPos.x,\r\n y: currentPos.y,\r\n rotation: Math.random() * (rotationRange * 2) - rotationRange\r\n };\r\n\r\n setTrail(prev => [...prev, newImage]);\r\n\r\n lastPosRef.current = currentPos;\r\n indexRef.current++;\r\n }\r\n };\r\n\r\n const handleMouseLeave = () => {\r\n lastPosRef.current = null; // Break the path trace\r\n };\r\n\r\n return (\r\n <div\r\n ref={containerRef}\r\n className={className}\r\n onMouseMove={handleMouseMove}\r\n onMouseLeave={handleMouseLeave}\r\n style={{\r\n position: 'relative',\r\n width: '100%',\r\n height: '100%',\r\n minHeight: '400px',\r\n overflow: 'hidden',\r\n background: '#111',\r\n cursor: 'none',\r\n borderRadius: '12px'\r\n }}\r\n >\r\n <div style={{\r\n pointerEvents: 'none',\r\n position: 'absolute',\r\n top: 0,\r\n left: 0,\r\n width: '100%',\r\n height: '100%',\r\n }}>\r\n <AnimatePresence mode='popLayout'>\r\n {trail.map((item) => (\r\n <motion.img\r\n key={item.id}\r\n src={item.src}\r\n initial={{\r\n opacity: 0,\r\n scale: 0.8,\r\n x: item.x - size / 2,\r\n y: item.y - size / 2,\r\n rotate: item.rotation\r\n }}\r\n animate={{\r\n opacity: 1,\r\n scale: 1,\r\n x: item.x - size / 2,\r\n y: item.y - size / 2\r\n }}\r\n exit={{\r\n opacity: 0,\r\n scale: 0.5,\r\n transition: { duration: fadeDuration }\r\n }}\r\n transition={{ duration: 0.1 }}\r\n style={{\r\n position: 'absolute',\r\n width: size,\r\n height: size,\r\n objectFit: 'cover',\r\n borderRadius: '8px',\r\n boxShadow: '0 4px 12px rgba(0,0,0,0.3)',\r\n pointerEvents: 'none',\r\n left: 0,\r\n top: 0\r\n }}\r\n />\r\n ))}\r\n </AnimatePresence>\r\n </div>\r\n\r\n <div style={{\r\n position: 'absolute',\r\n top: '50%',\r\n left: '50%',\r\n transform: 'translate(-50%, -50%)',\r\n color: '#444',\r\n pointerEvents: 'none',\r\n fontWeight: 500,\r\n textAlign: 'center'\r\n }}>\r\n Hover to see trail\r\n </div>\r\n </div>\r\n );\r\n};\r\n","import React from 'react';\r\nimport { motion, type HTMLMotionProps } from 'framer-motion';\r\nimport { FiArrowRight } from 'react-icons/fi';\r\n\r\nexport interface HoverFillButtonProps extends HTMLMotionProps<\"button\"> {\r\n label?: string;\r\n direction?: 'left' | 'right' | 'top' | 'bottom';\r\n fillColor?: string;\r\n textColor?: string;\r\n hoverTextColor?: string;\r\n padding?: string;\r\n paddingHorizontal?: string;\r\n paddingVertical?: string;\r\n borderRadius?: string;\r\n backgroundColor?: string;\r\n borderColor?: string;\r\n}\r\n\r\nexport const HoverFillButton: React.FC<HoverFillButtonProps> = ({\r\n label = 'Hover Me',\r\n direction = 'left',\r\n fillColor = '#e9590c',\r\n textColor = '#ffffff',\r\n hoverTextColor = '#ffffff',\r\n padding = '12px 24px',\r\n paddingHorizontal,\r\n paddingVertical,\r\n borderRadius = '50px',\r\n backgroundColor = '#000000',\r\n borderColor = '#000000',\r\n style,\r\n ...props\r\n}) => {\r\n // Determine initial position of the fill layer based on direction\r\n const getInitialPosition = () => {\r\n switch (direction) {\r\n case 'left': return { x: '-100%', y: '0%' };\r\n case 'right': return { x: '100%', y: '0%' };\r\n case 'top': return { x: '0%', y: '-100%' };\r\n case 'bottom': return { x: '0%', y: '100%' };\r\n default: return { x: '-100%', y: '0%' };\r\n }\r\n };\r\n\r\n // Construct final padding\r\n const finalPadding = (paddingHorizontal || paddingVertical)\r\n ? `${paddingVertical || '12px'} ${paddingHorizontal || '24px'}`\r\n : padding;\r\n\r\n return (\r\n <motion.button\r\n initial=\"initial\"\r\n whileHover=\"hover\"\r\n style={{\r\n position: 'relative',\r\n padding: finalPadding,\r\n background: backgroundColor,\r\n border: `1px solid ${borderColor}`,\r\n color: textColor,\r\n borderRadius,\r\n cursor: 'pointer',\r\n overflow: 'hidden',\r\n fontSize: '16px',\r\n fontWeight: 500,\r\n ...style\r\n }}\r\n {...props}\r\n >\r\n {/* Fill Layer */}\r\n <motion.div\r\n key={direction} // Force re-mount when direction changes to apply new initial state\r\n variants={{\r\n initial: getInitialPosition(),\r\n hover: { x: '0%', y: '0%' }\r\n }}\r\n transition={{ duration: 0.3, ease: 'easeInOut' }}\r\n style={{\r\n position: 'absolute',\r\n top: 0,\r\n left: 0,\r\n right: 0,\r\n bottom: 0,\r\n background: fillColor,\r\n zIndex: 0\r\n }}\r\n />\r\n\r\n {/* Text Layer - Needs to change color on hover? */}\r\n <motion.span\r\n variants={{\r\n initial: { color: textColor },\r\n hover: { color: hoverTextColor }\r\n }}\r\n transition={{ duration: 0.2 }}\r\n style={{\r\n position: 'relative',\r\n zIndex: 1,\r\n display: 'flex',\r\n alignItems: 'center',\r\n gap: '12px',\r\n lineHeight: 1\r\n }}\r\n >\r\n {label}\r\n\r\n {/* Arrow in Circle */}\r\n <span style={{\r\n display: 'flex',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n width: '24px',\r\n height: '24px',\r\n borderRadius: '50%',\r\n border: '2px solid currentColor', // Increased thickness\r\n fontSize: '16px' // Slightly larger container for icon\r\n }}>\r\n <FiArrowRight strokeWidth={3} />\r\n </span>\r\n </motion.span>\r\n </motion.button>\r\n );\r\n};\r\n","import React from 'react';\r\nimport { motion } from 'framer-motion';\r\n\r\nexport interface ImageMarqueeProps {\r\n images?: string[];\r\n direction?: 'left' | 'right';\r\n speed?: number; // duration for one full loop\r\n gap?: string;\r\n size?: number;\r\n className?: string;\r\n}\r\n\r\nconst defaultImages = [\r\n \"/logos/Airbnb.png\",\r\n \"/logos/Amazon.png\",\r\n \"/logos/Apple.png\",\r\n \"/logos/Bookmyshow.png\",\r\n \"/logos/FedEx.png\",\r\n \"/logos/Google.png\",\r\n \"/logos/Microsoft.png\",\r\n \"/logos/OLA.png\",\r\n \"/logos/OYO.png\",\r\n \"/logos/Walmart.png\"\r\n];\r\n\r\nexport const ImageMarquee: React.FC<ImageMarqueeProps> = ({\r\n images = defaultImages,\r\n direction = 'left',\r\n speed = 20,\r\n gap = '2rem',\r\n size = 60,\r\n className\r\n}) => {\r\n // Determine the translation direction\r\n // For 'left', we move from 0 to -100% (partially) or similar math\r\n // A simple way for infinite marquee is to duplicate the content\r\n\r\n return (\r\n <div\r\n className={className}\r\n style={{\r\n overflow: 'hidden',\r\n whiteSpace: 'nowrap',\r\n display: 'flex',\r\n width: '100%'\r\n }}\r\n >\r\n <MarqueeContent images={images} direction={direction} speed={speed} gap={gap} size={size} />\r\n <MarqueeContent images={images} direction={direction} speed={speed} gap={gap} size={size} />\r\n <MarqueeContent images={images} direction={direction} speed={speed} gap={gap} size={size} />\r\n <MarqueeContent images={images} direction={direction} speed={speed} gap={gap} size={size} />\r\n </div>\r\n );\r\n};\r\n\r\nconst MarqueeContent = ({ images, direction, speed, gap, size }: { images: string[], direction: 'left' | 'right', speed: number, gap: string, size: number }) => {\r\n return (\r\n <motion.div\r\n key={`${direction}-${speed}`}\r\n initial={{ x: direction === 'left' ? \"0%\" : \"-100%\" }}\r\n animate={{ x: direction === 'left' ? \"-100%\" : \"0%\" }}\r\n transition={{\r\n duration: speed,\r\n ease: \"linear\",\r\n repeat: Infinity\r\n }}\r\n style={{\r\n display: 'flex',\r\n gap: gap,\r\n minWidth: 'max-content',\r\n flexShrink: 0,\r\n alignItems: 'center',\r\n paddingRight: gap // Ensure spacing at the end matches the gap for seamlessness\r\n }}\r\n >\r\n {images.map((src, index) => (\r\n <img\r\n key={index}\r\n src={src}\r\n alt={`marquee-item-${index}`}\r\n style={{\r\n height: `${size}px`,\r\n width: 'auto',\r\n objectFit: 'contain',\r\n borderRadius: '0px'\r\n }}\r\n />\r\n ))}\r\n </motion.div>\r\n );\r\n};\r\n","import React from 'react';\r\nimport { motion } from 'framer-motion';\r\nimport { LuMouse } from 'react-icons/lu';\r\n\r\nexport interface CircularTextProps {\r\n text?: string;\r\n radius?: number;\r\n fontSize?: string;\r\n iconSize?: number;\r\n color?: string;\r\n spinDuration?: number;\r\n className?: string;\r\n}\r\n\r\nexport const CircularText: React.FC<CircularTextProps> = ({\r\n text = \"SCROLL DOWN • SCROLL DOWN • \",\r\n radius = 50,\r\n fontSize = \"12px\",\r\n iconSize = 24,\r\n color = \"#ffffff\",\r\n spinDuration = 10,\r\n className\r\n}) => {\r\n // Determine the circumference to space text properly if needed, \r\n // but textPath usually handles it well. \r\n // We'll use a viewBox that accommodates the radius.\r\n // Box size = (radius * 2) + padding for text height\r\n const size = radius * 2 + 40;\r\n\r\n return (\r\n <div\r\n className={className}\r\n style={{\r\n position: 'relative',\r\n width: size,\r\n height: size,\r\n display: 'flex',\r\n justifyContent: 'center',\r\n alignItems: 'center'\r\n }}\r\n >\r\n {/* Rotating Text Ring */}\r\n <motion.div\r\n animate={{ rotate: 360 }}\r\n transition={{\r\n duration: spinDuration,\r\n repeat: Infinity,\r\n ease: \"linear\"\r\n }}\r\n style={{\r\n width: '100%',\r\n height: '100%',\r\n position: 'absolute',\r\n top: 0,\r\n left: 0\r\n }}\r\n >\r\n <svg viewBox={`0 0 ${size} ${size}`} width=\"100%\" height=\"100%\">\r\n <defs>\r\n <path\r\n id=\"circlePath\"\r\n d={`\r\n M ${size / 2}, ${size / 2}\r\n m -${radius}, 0\r\n a ${radius},${radius} 0 1,1 ${radius * 2},0\r\n a ${radius},${radius} 0 1,1 -${radius * 2},0\r\n `}\r\n />\r\n </defs>\r\n <text fill={color} fontSize={fontSize} fontWeight=\"bold\" letterSpacing=\"2px\">\r\n <textPath href=\"#circlePath\" startOffset=\"0%\">\r\n {text}\r\n </textPath>\r\n </text>\r\n </svg>\r\n </motion.div>\r\n\r\n {/* Static Icon */}\r\n <div style={{ position: 'relative', color: color, display: 'flex' }}>\r\n <LuMouse size={iconSize} />\r\n </div>\r\n </div>\r\n );\r\n};\r\n"]}
|
package/dist/index.mjs
CHANGED
|
@@ -1,14 +1,16 @@
|
|
|
1
|
-
import { useRef, useEffect } from 'react';
|
|
1
|
+
import { useRef, useLayoutEffect, useState, useEffect } from 'react';
|
|
2
2
|
import gsap from 'gsap';
|
|
3
|
-
import { jsx } from 'react/jsx-runtime';
|
|
3
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
4
|
+
import { AnimatePresence, motion } from 'framer-motion';
|
|
5
|
+
import { FiArrowRight } from 'react-icons/fi';
|
|
6
|
+
import { LuMouse } from 'react-icons/lu';
|
|
4
7
|
|
|
5
8
|
// src/cursor/CursorFollower/CursorFollower.tsx
|
|
6
9
|
var CursorFollower = ({
|
|
7
|
-
text = "",
|
|
8
|
-
// Changed from "PLAY" to empty string for generic usage
|
|
10
|
+
text = "PLAY",
|
|
9
11
|
size = 90,
|
|
10
12
|
borderWidth = 2,
|
|
11
|
-
borderColor = "#
|
|
13
|
+
borderColor = "#ffffff",
|
|
12
14
|
background = "transparent",
|
|
13
15
|
fontFamily = "inherit",
|
|
14
16
|
fontSize = 12,
|
|
@@ -19,11 +21,10 @@ var CursorFollower = ({
|
|
|
19
21
|
hideScale = 0,
|
|
20
22
|
enabled = true,
|
|
21
23
|
blockSelectors = ["button", "a"],
|
|
22
|
-
// Added sensible defaults
|
|
23
24
|
containerRef
|
|
24
25
|
}) => {
|
|
25
26
|
const cursorRef = useRef(null);
|
|
26
|
-
|
|
27
|
+
useLayoutEffect(() => {
|
|
27
28
|
if (!enabled) return;
|
|
28
29
|
const cursor = cursorRef.current;
|
|
29
30
|
if (!cursor) return;
|
|
@@ -52,6 +53,9 @@ var CursorFollower = ({
|
|
|
52
53
|
targetX = e.clientX;
|
|
53
54
|
targetY = e.clientY;
|
|
54
55
|
}
|
|
56
|
+
if (!visible && !blocked) {
|
|
57
|
+
show();
|
|
58
|
+
}
|
|
55
59
|
};
|
|
56
60
|
const update = () => {
|
|
57
61
|
currentX += (targetX - currentX) * lerp;
|
|
@@ -66,6 +70,23 @@ var CursorFollower = ({
|
|
|
66
70
|
target.addEventListener("mouseenter", show);
|
|
67
71
|
target.addEventListener("mouseleave", hide);
|
|
68
72
|
gsap.ticker.add(update);
|
|
73
|
+
requestAnimationFrame(() => {
|
|
74
|
+
if (containerRef?.current) {
|
|
75
|
+
const bounds = containerRef.current.getBoundingClientRect();
|
|
76
|
+
targetX = bounds.width / 2;
|
|
77
|
+
targetY = bounds.height / 2;
|
|
78
|
+
} else {
|
|
79
|
+
targetX = window.innerWidth / 2;
|
|
80
|
+
targetY = window.innerHeight / 2;
|
|
81
|
+
}
|
|
82
|
+
currentX = targetX;
|
|
83
|
+
currentY = targetY;
|
|
84
|
+
gsap.set(cursor, {
|
|
85
|
+
x: currentX - size / 2,
|
|
86
|
+
y: currentY - size / 2
|
|
87
|
+
});
|
|
88
|
+
show();
|
|
89
|
+
});
|
|
69
90
|
const cleanupFns = [];
|
|
70
91
|
blockSelectors.forEach((selector) => {
|
|
71
92
|
const elements = document.querySelectorAll(selector);
|
|
@@ -99,7 +120,8 @@ var CursorFollower = ({
|
|
|
99
120
|
lerp,
|
|
100
121
|
showScale,
|
|
101
122
|
hideScale,
|
|
102
|
-
|
|
123
|
+
// Stabilize dependency: only re-run if the joined string changes
|
|
124
|
+
blockSelectors.join(","),
|
|
103
125
|
containerRef
|
|
104
126
|
]);
|
|
105
127
|
if (!enabled) return null;
|
|
@@ -134,7 +156,392 @@ var CursorFollower = ({
|
|
|
134
156
|
}
|
|
135
157
|
);
|
|
136
158
|
};
|
|
159
|
+
var defaultImages = [
|
|
160
|
+
"https://picsum.photos/id/237/200/200",
|
|
161
|
+
"https://picsum.photos/id/10/200/200",
|
|
162
|
+
"https://picsum.photos/id/20/200/200",
|
|
163
|
+
"https://picsum.photos/id/28/200/200",
|
|
164
|
+
"https://picsum.photos/id/29/200/200",
|
|
165
|
+
"https://picsum.photos/id/35/200/200",
|
|
166
|
+
"https://picsum.photos/id/40/200/200",
|
|
167
|
+
"https://picsum.photos/id/55/200/200",
|
|
168
|
+
"https://picsum.photos/id/60/200/200",
|
|
169
|
+
"https://picsum.photos/id/70/200/200"
|
|
170
|
+
];
|
|
171
|
+
var ImageTrail = ({
|
|
172
|
+
images = defaultImages,
|
|
173
|
+
size = 100,
|
|
174
|
+
rotationRange = 15,
|
|
175
|
+
interval = 30,
|
|
176
|
+
// Default to fairly dense for smooth "train" effect
|
|
177
|
+
fadeDuration = 0.5,
|
|
178
|
+
className
|
|
179
|
+
}) => {
|
|
180
|
+
const [trail, setTrail] = useState([]);
|
|
181
|
+
const lastPosRef = useRef(null);
|
|
182
|
+
const indexRef = useRef(0);
|
|
183
|
+
const idCounterRef = useRef(0);
|
|
184
|
+
const containerRef = useRef(null);
|
|
185
|
+
useEffect(() => {
|
|
186
|
+
const cleanupInterval = setInterval(() => {
|
|
187
|
+
setTrail((prev) => {
|
|
188
|
+
return prev.filter((item) => Date.now() - item.created < fadeDuration * 1e3);
|
|
189
|
+
});
|
|
190
|
+
}, 100);
|
|
191
|
+
return () => clearInterval(cleanupInterval);
|
|
192
|
+
}, [fadeDuration]);
|
|
193
|
+
const handleMouseMove = (e) => {
|
|
194
|
+
if (!containerRef.current) return;
|
|
195
|
+
const rect = containerRef.current.getBoundingClientRect();
|
|
196
|
+
const x = e.clientX - rect.left;
|
|
197
|
+
const y = e.clientY - rect.top;
|
|
198
|
+
const currentPos = { x, y };
|
|
199
|
+
if (!lastPosRef.current) {
|
|
200
|
+
lastPosRef.current = currentPos;
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
const dx = currentPos.x - lastPosRef.current.x;
|
|
204
|
+
const dy = currentPos.y - lastPosRef.current.y;
|
|
205
|
+
const distance = Math.sqrt(dx * dx + dy * dy);
|
|
206
|
+
if (distance > interval) {
|
|
207
|
+
const newImage = {
|
|
208
|
+
id: idCounterRef.current++,
|
|
209
|
+
created: Date.now(),
|
|
210
|
+
src: images[indexRef.current % images.length] || "",
|
|
211
|
+
x: currentPos.x,
|
|
212
|
+
y: currentPos.y,
|
|
213
|
+
rotation: Math.random() * (rotationRange * 2) - rotationRange
|
|
214
|
+
};
|
|
215
|
+
setTrail((prev) => [...prev, newImage]);
|
|
216
|
+
lastPosRef.current = currentPos;
|
|
217
|
+
indexRef.current++;
|
|
218
|
+
}
|
|
219
|
+
};
|
|
220
|
+
const handleMouseLeave = () => {
|
|
221
|
+
lastPosRef.current = null;
|
|
222
|
+
};
|
|
223
|
+
return /* @__PURE__ */ jsxs(
|
|
224
|
+
"div",
|
|
225
|
+
{
|
|
226
|
+
ref: containerRef,
|
|
227
|
+
className,
|
|
228
|
+
onMouseMove: handleMouseMove,
|
|
229
|
+
onMouseLeave: handleMouseLeave,
|
|
230
|
+
style: {
|
|
231
|
+
position: "relative",
|
|
232
|
+
width: "100%",
|
|
233
|
+
height: "100%",
|
|
234
|
+
minHeight: "400px",
|
|
235
|
+
overflow: "hidden",
|
|
236
|
+
background: "#111",
|
|
237
|
+
cursor: "none",
|
|
238
|
+
borderRadius: "12px"
|
|
239
|
+
},
|
|
240
|
+
children: [
|
|
241
|
+
/* @__PURE__ */ jsx("div", { style: {
|
|
242
|
+
pointerEvents: "none",
|
|
243
|
+
position: "absolute",
|
|
244
|
+
top: 0,
|
|
245
|
+
left: 0,
|
|
246
|
+
width: "100%",
|
|
247
|
+
height: "100%"
|
|
248
|
+
}, children: /* @__PURE__ */ jsx(AnimatePresence, { mode: "popLayout", children: trail.map((item) => /* @__PURE__ */ jsx(
|
|
249
|
+
motion.img,
|
|
250
|
+
{
|
|
251
|
+
src: item.src,
|
|
252
|
+
initial: {
|
|
253
|
+
opacity: 0,
|
|
254
|
+
scale: 0.8,
|
|
255
|
+
x: item.x - size / 2,
|
|
256
|
+
y: item.y - size / 2,
|
|
257
|
+
rotate: item.rotation
|
|
258
|
+
},
|
|
259
|
+
animate: {
|
|
260
|
+
opacity: 1,
|
|
261
|
+
scale: 1,
|
|
262
|
+
x: item.x - size / 2,
|
|
263
|
+
y: item.y - size / 2
|
|
264
|
+
},
|
|
265
|
+
exit: {
|
|
266
|
+
opacity: 0,
|
|
267
|
+
scale: 0.5,
|
|
268
|
+
transition: { duration: fadeDuration }
|
|
269
|
+
},
|
|
270
|
+
transition: { duration: 0.1 },
|
|
271
|
+
style: {
|
|
272
|
+
position: "absolute",
|
|
273
|
+
width: size,
|
|
274
|
+
height: size,
|
|
275
|
+
objectFit: "cover",
|
|
276
|
+
borderRadius: "8px",
|
|
277
|
+
boxShadow: "0 4px 12px rgba(0,0,0,0.3)",
|
|
278
|
+
pointerEvents: "none",
|
|
279
|
+
left: 0,
|
|
280
|
+
top: 0
|
|
281
|
+
}
|
|
282
|
+
},
|
|
283
|
+
item.id
|
|
284
|
+
)) }) }),
|
|
285
|
+
/* @__PURE__ */ jsx("div", { style: {
|
|
286
|
+
position: "absolute",
|
|
287
|
+
top: "50%",
|
|
288
|
+
left: "50%",
|
|
289
|
+
transform: "translate(-50%, -50%)",
|
|
290
|
+
color: "#444",
|
|
291
|
+
pointerEvents: "none",
|
|
292
|
+
fontWeight: 500,
|
|
293
|
+
textAlign: "center"
|
|
294
|
+
}, children: "Hover to see trail" })
|
|
295
|
+
]
|
|
296
|
+
}
|
|
297
|
+
);
|
|
298
|
+
};
|
|
299
|
+
var HoverFillButton = ({
|
|
300
|
+
label = "Hover Me",
|
|
301
|
+
direction = "left",
|
|
302
|
+
fillColor = "#e9590c",
|
|
303
|
+
textColor = "#ffffff",
|
|
304
|
+
hoverTextColor = "#ffffff",
|
|
305
|
+
padding = "12px 24px",
|
|
306
|
+
paddingHorizontal,
|
|
307
|
+
paddingVertical,
|
|
308
|
+
borderRadius = "50px",
|
|
309
|
+
backgroundColor = "#000000",
|
|
310
|
+
borderColor = "#000000",
|
|
311
|
+
style,
|
|
312
|
+
...props
|
|
313
|
+
}) => {
|
|
314
|
+
const getInitialPosition = () => {
|
|
315
|
+
switch (direction) {
|
|
316
|
+
case "left":
|
|
317
|
+
return { x: "-100%", y: "0%" };
|
|
318
|
+
case "right":
|
|
319
|
+
return { x: "100%", y: "0%" };
|
|
320
|
+
case "top":
|
|
321
|
+
return { x: "0%", y: "-100%" };
|
|
322
|
+
case "bottom":
|
|
323
|
+
return { x: "0%", y: "100%" };
|
|
324
|
+
default:
|
|
325
|
+
return { x: "-100%", y: "0%" };
|
|
326
|
+
}
|
|
327
|
+
};
|
|
328
|
+
const finalPadding = paddingHorizontal || paddingVertical ? `${paddingVertical || "12px"} ${paddingHorizontal || "24px"}` : padding;
|
|
329
|
+
return /* @__PURE__ */ jsxs(
|
|
330
|
+
motion.button,
|
|
331
|
+
{
|
|
332
|
+
initial: "initial",
|
|
333
|
+
whileHover: "hover",
|
|
334
|
+
style: {
|
|
335
|
+
position: "relative",
|
|
336
|
+
padding: finalPadding,
|
|
337
|
+
background: backgroundColor,
|
|
338
|
+
border: `1px solid ${borderColor}`,
|
|
339
|
+
color: textColor,
|
|
340
|
+
borderRadius,
|
|
341
|
+
cursor: "pointer",
|
|
342
|
+
overflow: "hidden",
|
|
343
|
+
fontSize: "16px",
|
|
344
|
+
fontWeight: 500,
|
|
345
|
+
...style
|
|
346
|
+
},
|
|
347
|
+
...props,
|
|
348
|
+
children: [
|
|
349
|
+
/* @__PURE__ */ jsx(
|
|
350
|
+
motion.div,
|
|
351
|
+
{
|
|
352
|
+
variants: {
|
|
353
|
+
initial: getInitialPosition(),
|
|
354
|
+
hover: { x: "0%", y: "0%" }
|
|
355
|
+
},
|
|
356
|
+
transition: { duration: 0.3, ease: "easeInOut" },
|
|
357
|
+
style: {
|
|
358
|
+
position: "absolute",
|
|
359
|
+
top: 0,
|
|
360
|
+
left: 0,
|
|
361
|
+
right: 0,
|
|
362
|
+
bottom: 0,
|
|
363
|
+
background: fillColor,
|
|
364
|
+
zIndex: 0
|
|
365
|
+
}
|
|
366
|
+
},
|
|
367
|
+
direction
|
|
368
|
+
),
|
|
369
|
+
/* @__PURE__ */ jsxs(
|
|
370
|
+
motion.span,
|
|
371
|
+
{
|
|
372
|
+
variants: {
|
|
373
|
+
initial: { color: textColor },
|
|
374
|
+
hover: { color: hoverTextColor }
|
|
375
|
+
},
|
|
376
|
+
transition: { duration: 0.2 },
|
|
377
|
+
style: {
|
|
378
|
+
position: "relative",
|
|
379
|
+
zIndex: 1,
|
|
380
|
+
display: "flex",
|
|
381
|
+
alignItems: "center",
|
|
382
|
+
gap: "12px",
|
|
383
|
+
lineHeight: 1
|
|
384
|
+
},
|
|
385
|
+
children: [
|
|
386
|
+
label,
|
|
387
|
+
/* @__PURE__ */ jsx("span", { style: {
|
|
388
|
+
display: "flex",
|
|
389
|
+
alignItems: "center",
|
|
390
|
+
justifyContent: "center",
|
|
391
|
+
width: "24px",
|
|
392
|
+
height: "24px",
|
|
393
|
+
borderRadius: "50%",
|
|
394
|
+
border: "2px solid currentColor",
|
|
395
|
+
// Increased thickness
|
|
396
|
+
fontSize: "16px"
|
|
397
|
+
// Slightly larger container for icon
|
|
398
|
+
}, children: /* @__PURE__ */ jsx(FiArrowRight, { strokeWidth: 3 }) })
|
|
399
|
+
]
|
|
400
|
+
}
|
|
401
|
+
)
|
|
402
|
+
]
|
|
403
|
+
}
|
|
404
|
+
);
|
|
405
|
+
};
|
|
406
|
+
var defaultImages2 = [
|
|
407
|
+
"/logos/Airbnb.png",
|
|
408
|
+
"/logos/Amazon.png",
|
|
409
|
+
"/logos/Apple.png",
|
|
410
|
+
"/logos/Bookmyshow.png",
|
|
411
|
+
"/logos/FedEx.png",
|
|
412
|
+
"/logos/Google.png",
|
|
413
|
+
"/logos/Microsoft.png",
|
|
414
|
+
"/logos/OLA.png",
|
|
415
|
+
"/logos/OYO.png",
|
|
416
|
+
"/logos/Walmart.png"
|
|
417
|
+
];
|
|
418
|
+
var ImageMarquee = ({
|
|
419
|
+
images = defaultImages2,
|
|
420
|
+
direction = "left",
|
|
421
|
+
speed = 20,
|
|
422
|
+
gap = "2rem",
|
|
423
|
+
size = 60,
|
|
424
|
+
className
|
|
425
|
+
}) => {
|
|
426
|
+
return /* @__PURE__ */ jsxs(
|
|
427
|
+
"div",
|
|
428
|
+
{
|
|
429
|
+
className,
|
|
430
|
+
style: {
|
|
431
|
+
overflow: "hidden",
|
|
432
|
+
whiteSpace: "nowrap",
|
|
433
|
+
display: "flex",
|
|
434
|
+
width: "100%"
|
|
435
|
+
},
|
|
436
|
+
children: [
|
|
437
|
+
/* @__PURE__ */ jsx(MarqueeContent, { images, direction, speed, gap, size }),
|
|
438
|
+
/* @__PURE__ */ jsx(MarqueeContent, { images, direction, speed, gap, size }),
|
|
439
|
+
/* @__PURE__ */ jsx(MarqueeContent, { images, direction, speed, gap, size }),
|
|
440
|
+
/* @__PURE__ */ jsx(MarqueeContent, { images, direction, speed, gap, size })
|
|
441
|
+
]
|
|
442
|
+
}
|
|
443
|
+
);
|
|
444
|
+
};
|
|
445
|
+
var MarqueeContent = ({ images, direction, speed, gap, size }) => {
|
|
446
|
+
return /* @__PURE__ */ jsx(
|
|
447
|
+
motion.div,
|
|
448
|
+
{
|
|
449
|
+
initial: { x: direction === "left" ? "0%" : "-100%" },
|
|
450
|
+
animate: { x: direction === "left" ? "-100%" : "0%" },
|
|
451
|
+
transition: {
|
|
452
|
+
duration: speed,
|
|
453
|
+
ease: "linear",
|
|
454
|
+
repeat: Infinity
|
|
455
|
+
},
|
|
456
|
+
style: {
|
|
457
|
+
display: "flex",
|
|
458
|
+
gap,
|
|
459
|
+
minWidth: "max-content",
|
|
460
|
+
flexShrink: 0,
|
|
461
|
+
alignItems: "center",
|
|
462
|
+
paddingRight: gap
|
|
463
|
+
// Ensure spacing at the end matches the gap for seamlessness
|
|
464
|
+
},
|
|
465
|
+
children: images.map((src, index) => /* @__PURE__ */ jsx(
|
|
466
|
+
"img",
|
|
467
|
+
{
|
|
468
|
+
src,
|
|
469
|
+
alt: `marquee-item-${index}`,
|
|
470
|
+
style: {
|
|
471
|
+
height: `${size}px`,
|
|
472
|
+
width: "auto",
|
|
473
|
+
objectFit: "contain",
|
|
474
|
+
borderRadius: "0px"
|
|
475
|
+
}
|
|
476
|
+
},
|
|
477
|
+
index
|
|
478
|
+
))
|
|
479
|
+
},
|
|
480
|
+
`${direction}-${speed}`
|
|
481
|
+
);
|
|
482
|
+
};
|
|
483
|
+
var CircularText = ({
|
|
484
|
+
text = "SCROLL DOWN \u2022 SCROLL DOWN \u2022 ",
|
|
485
|
+
radius = 50,
|
|
486
|
+
fontSize = "12px",
|
|
487
|
+
iconSize = 24,
|
|
488
|
+
color = "#ffffff",
|
|
489
|
+
spinDuration = 10,
|
|
490
|
+
className
|
|
491
|
+
}) => {
|
|
492
|
+
const size = radius * 2 + 40;
|
|
493
|
+
return /* @__PURE__ */ jsxs(
|
|
494
|
+
"div",
|
|
495
|
+
{
|
|
496
|
+
className,
|
|
497
|
+
style: {
|
|
498
|
+
position: "relative",
|
|
499
|
+
width: size,
|
|
500
|
+
height: size,
|
|
501
|
+
display: "flex",
|
|
502
|
+
justifyContent: "center",
|
|
503
|
+
alignItems: "center"
|
|
504
|
+
},
|
|
505
|
+
children: [
|
|
506
|
+
/* @__PURE__ */ jsx(
|
|
507
|
+
motion.div,
|
|
508
|
+
{
|
|
509
|
+
animate: { rotate: 360 },
|
|
510
|
+
transition: {
|
|
511
|
+
duration: spinDuration,
|
|
512
|
+
repeat: Infinity,
|
|
513
|
+
ease: "linear"
|
|
514
|
+
},
|
|
515
|
+
style: {
|
|
516
|
+
width: "100%",
|
|
517
|
+
height: "100%",
|
|
518
|
+
position: "absolute",
|
|
519
|
+
top: 0,
|
|
520
|
+
left: 0
|
|
521
|
+
},
|
|
522
|
+
children: /* @__PURE__ */ jsxs("svg", { viewBox: `0 0 ${size} ${size}`, width: "100%", height: "100%", children: [
|
|
523
|
+
/* @__PURE__ */ jsx("defs", { children: /* @__PURE__ */ jsx(
|
|
524
|
+
"path",
|
|
525
|
+
{
|
|
526
|
+
id: "circlePath",
|
|
527
|
+
d: `
|
|
528
|
+
M ${size / 2}, ${size / 2}
|
|
529
|
+
m -${radius}, 0
|
|
530
|
+
a ${radius},${radius} 0 1,1 ${radius * 2},0
|
|
531
|
+
a ${radius},${radius} 0 1,1 -${radius * 2},0
|
|
532
|
+
`
|
|
533
|
+
}
|
|
534
|
+
) }),
|
|
535
|
+
/* @__PURE__ */ jsx("text", { fill: color, fontSize, fontWeight: "bold", letterSpacing: "2px", children: /* @__PURE__ */ jsx("textPath", { href: "#circlePath", startOffset: "0%", children: text }) })
|
|
536
|
+
] })
|
|
537
|
+
}
|
|
538
|
+
),
|
|
539
|
+
/* @__PURE__ */ jsx("div", { style: { position: "relative", color, display: "flex" }, children: /* @__PURE__ */ jsx(LuMouse, { size: iconSize }) })
|
|
540
|
+
]
|
|
541
|
+
}
|
|
542
|
+
);
|
|
543
|
+
};
|
|
137
544
|
|
|
138
|
-
export { CursorFollower };
|
|
545
|
+
export { CircularText, CursorFollower, HoverFillButton, ImageMarquee, ImageTrail };
|
|
139
546
|
//# sourceMappingURL=index.mjs.map
|
|
140
547
|
//# sourceMappingURL=index.mjs.map
|