@phazr/custom-cursor
Version:
A lightweight and highly customizable React component for creating unique and interactive cursor experiences.
1 lines • 11.1 kB
Source Map (JSON)
{"version":3,"file":"index.mjs","sources":["../src/CursorProvider.tsx","../src/Cursor.tsx"],"sourcesContent":["'use client';\n\nimport {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useState,\n type ReactNode,\n} from 'react';\nimport type {\n CursorContextType,\n CursorVariant,\n CustomCursorConfig,\n} from './types';\n\ninterface CursorProviderProps {\n children: ReactNode;\n className?: string;\n enableOnTouch?: boolean;\n}\n\nconst CursorContext = createContext<CursorContextType | null>(null);\n\nexport const useCursor = () => {\n const context = useContext(CursorContext);\n if (!context) {\n throw new Error('useCursor must be used within a CursorProvider');\n }\n return context;\n};\n\nexport function CursorProvider({\n children,\n className = '',\n enableOnTouch = false,\n}: CursorProviderProps) {\n const [variant, setVariant] = useState<CursorVariant>('default');\n const [customConfig, setCustomConfig] = useState<CustomCursorConfig>();\n const [isTouchDevice, setIsTouchDevice] = useState(false);\n\n useEffect(() => {\n const checkTouchDevice = () => {\n setIsTouchDevice(\n 'ontouchstart' in window || navigator.maxTouchPoints > 0,\n );\n };\n\n checkTouchDevice();\n window.addEventListener('resize', checkTouchDevice);\n\n return () => window.removeEventListener('resize', checkTouchDevice);\n }, []);\n\n useEffect(() => {\n if (isTouchDevice && !enableOnTouch) {\n return;\n }\n\n if (variant !== 'input') {\n document.body.classList.add('phazr-cursor-none');\n } else {\n document.body.classList.remove('phazr-cursor-none');\n }\n\n return () => {\n document.body.classList.remove('phazr-cursor-none');\n };\n }, [variant, isTouchDevice, enableOnTouch]);\n\n const setVariantCallback = useCallback((newVariant: CursorVariant) => {\n setVariant(newVariant);\n }, []);\n\n const setCustomConfigCallback = useCallback((config: CustomCursorConfig) => {\n setCustomConfig(config);\n }, []);\n\n if (isTouchDevice && !enableOnTouch) {\n return <div className={className}>{children}</div>;\n }\n\n return (\n <CursorContext.Provider\n value={{\n variant,\n setVariant: setVariantCallback,\n customConfig,\n setCustomConfig: setCustomConfigCallback,\n }}\n >\n <div className={className}>{children}</div>\n </CursorContext.Provider>\n );\n}\n","'use client';\n\nimport { useEffect, useState } from 'react';\nimport { motion, useMotionValue, useSpring } from 'motion/react';\nimport { useCursor } from './CursorProvider';\n\ninterface CursorProps {\n className?: string;\n springConfig?: {\n damping?: number;\n stiffness?: number;\n };\n}\n\nexport default function Cursor({\n className = '',\n springConfig = { damping: 28, stiffness: 500 },\n}: CursorProps) {\n const { variant, customConfig } = useCursor();\n const [isTouchDevice, setIsTouchDevice] = useState(false);\n\n const cursorX = useMotionValue(-100);\n const cursorY = useMotionValue(-100);\n\n const cursorXSpring = useSpring(cursorX, springConfig);\n const cursorYSpring = useSpring(cursorY, springConfig);\n\n useEffect(() => {\n setIsTouchDevice('ontouchstart' in window || navigator.maxTouchPoints > 0);\n }, []);\n\n useEffect(() => {\n if (isTouchDevice) return;\n\n const mouseMove = (e: MouseEvent) => {\n cursorX.set(e.clientX);\n cursorY.set(e.clientY);\n };\n\n window.addEventListener('mousemove', mouseMove);\n\n return () => {\n window.removeEventListener('mousemove', mouseMove);\n };\n }, [cursorX, cursorY, isTouchDevice]);\n\n if (isTouchDevice) {\n return null;\n }\n\n const cursorVariants = {\n default: {\n height: 16,\n width: 16,\n backgroundColor: '#fff',\n mixBlendMode: 'difference' as const,\n },\n link: {\n height: 64,\n width: 64,\n backgroundColor: '#fff',\n mixBlendMode: 'difference' as const,\n },\n text: {\n height: 8,\n width: 8,\n backgroundColor: '#fff',\n mixBlendMode: 'difference' as const,\n },\n input: {\n height: 0,\n width: 0,\n opacity: 0,\n },\n sayHi: {\n height: 90,\n width: 90,\n backgroundColor: '#fff',\n mixBlendMode: 'difference' as const,\n },\n custom: {\n height: customConfig?.size || 32,\n width: customConfig?.size || 32,\n backgroundColor: customConfig?.backgroundColor || '#fff',\n mixBlendMode: customConfig?.mixBlendMode || 'difference',\n },\n };\n\n const textVariants = {\n default: { opacity: 0, transition: { duration: 0.1 } },\n link: { opacity: 0, transition: { duration: 0.1 } },\n text: { opacity: 0, transition: { duration: 0.1 } },\n input: { opacity: 0, transition: { duration: 0.1 } },\n sayHi: { opacity: 1, transition: { delay: 0.1 } },\n custom: {\n opacity: customConfig?.text ? 1 : 0,\n transition: { delay: customConfig?.text ? 0.1 : 0 },\n },\n };\n\n return (\n <motion.div\n variants={cursorVariants}\n animate={variant}\n style={{\n left: cursorXSpring,\n top: cursorYSpring,\n x: '-50%',\n y: '-50%',\n }}\n className={`phazr-cursor-container ${className}`}\n >\n <motion.div\n variants={textVariants}\n animate={variant}\n className=\"phazr-cursor-text\"\n style={{\n color: customConfig?.textColor || '#000',\n fontSize: customConfig?.fontSize || '16px',\n fontFamily: customConfig?.fontFamily || 'inherit',\n }}\n >\n {variant === 'sayHi' && (\n <div className=\"phazr-cursor-sayhi\">\n <span>Say</span>\n <span>Hi</span>\n </div>\n )}\n {variant === 'custom' && customConfig?.text && (\n <span>{customConfig.text}</span>\n )}\n </motion.div>\n </motion.div>\n );\n}\n"],"names":["_jsx","_jsxs"],"mappings":"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"}