@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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cursor/CursorFollower/CursorFollower.tsx"],"names":[],"mappings":"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","file":"index.mjs","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","jsx","jsxs","motion","defaultImages"],"mappings":"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","file":"index.mjs","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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webenza/ui",
3
- "version": "0.0.2",
3
+ "version": "0.0.4",
4
4
  "description": "Internal UI and animation components for Webenza",
5
5
  "private": false,
6
6
  "sideEffects": false,
@@ -31,14 +31,31 @@
31
31
  },
32
32
  "homepage": "https://github.com/tech-webenza/webenza-ui#readme",
33
33
  "peerDependencies": {
34
- "gsap": ">=3",
35
34
  "react": ">=18",
36
- "react-dom": ">=18"
35
+ "react-dom": ">=18",
36
+ "gsap": ">=3",
37
+ "react-icons": "^5",
38
+ "framer-motion": ">=10 <13"
39
+ },
40
+ "peerDependenciesMeta": {
41
+ "gsap": {
42
+ "optional": true
43
+ },
44
+ "react-icons": {
45
+ "optional": true
46
+ },
47
+ "framer-motion": {
48
+ "optional": true
49
+ }
37
50
  },
38
51
  "devDependencies": {
39
52
  "@types/react": "^19.2.10",
40
53
  "@types/react-dom": "^19.2.3",
41
54
  "tsup": "^8.5.1",
42
- "typescript": "^5.9.3"
43
- }
55
+ "typescript": "^5.9.3",
56
+ "gsap": "^3.12.5",
57
+ "react-icons": "^5.4.0",
58
+ "framer-motion": "^11.16.0"
59
+ },
60
+ "dependencies": {}
44
61
  }