UNPKG

reactbits-mcp-server

Version:

MCP Server for React Bits - Access 99+ React components with animations, backgrounds, and UI elements

163 lines (145 loc) 4.97 kB
import { useRef, useState, useEffect } from "react"; import { CodeTab, PreviewTab, CliTab, TabbedLayout } from "../../components/common/TabbedLayout"; import { Box, Text } from "@chakra-ui/react"; import { gsap } from "gsap"; import useForceRerender from "../../hooks/useForceRerender"; import CodeExample from "../../components/code/CodeExample"; import CliInstallation from "../../components/code/CliInstallation"; import PropTable from "../../components/common/Preview/PropTable"; import Dependencies from '../../components/code/Dependencies'; import PreviewSlider from "../../components/common/Preview/PreviewSlider"; import ScrollFloat from "../../content/TextAnimations/ScrollFloat/ScrollFloat"; import { scrollFloat } from "../../constants/code/TextAnimations/scrollFloatCode"; const ScrollFloatDemo = () => { const containerRef = useRef(null); const [stagger, setStagger] = useState(0.03); const [duration, setDuration] = useState(1); const [key, forceRerender] = useForceRerender(); useEffect(() => { const container = containerRef.current; if (!container) return; const smoothScroll = (e) => { e.preventDefault(); const delta = e.deltaY || e.detail || e.wheelDelta; const scrollAmount = delta * 2; gsap.to(container, { scrollTop: container.scrollTop + scrollAmount, duration: 2, ease: "power3.out", overwrite: "auto" }); }; container.addEventListener('wheel', smoothScroll, { passive: false }); return () => { container.removeEventListener('wheel', smoothScroll); }; }, []); const propData = [ { name: "children", type: "ReactNode", default: "—", description: "The content to animate. If a string, it will be split into individual characters." }, { name: "scrollContainerRef", type: "RefObject<HTMLElement>", default: "window", description: "Optional ref to the scroll container. Defaults to window if not provided." }, { name: "containerClassName", type: "string", default: '""', description: "Additional Tailwind classes for the container element." }, { name: "textClassName", type: "string", default: '""', description: "Additional Tailwind classes for the text element." }, { name: "animationDuration", type: "number", default: "1", description: "Duration (in seconds) of the animation." }, { name: "ease", type: "string", default: '"back.inOut(2)"', description: "Easing function used for the animation." }, { name: "scrollStart", type: "string", default: '"center bottom+=50%"', description: "The scroll trigger start position." }, { name: "scrollEnd", type: "string", default: '"bottom bottom-=40%"', description: "The scroll trigger end position." }, { name: "stagger", type: "number", default: "0.03", description: "Delay between the animation start of each character." } ]; return ( <TabbedLayout> <PreviewTab> <Box className="demo-container" style={{ height: '500px', maxHeight: '500px' }} overflowY='scroll' overflowX='hidden' ref={containerRef} position='relative'> <Text textAlign="center" color='#271E37' fontSize="clamp(4rem, 6vw, 4rem)" fontWeight={900} position="absolute" top='50%' transform='translateY(-50%)'>Scroll Down</Text> <Box position="relative" pt={1600} pb={600} px='3rem'> <ScrollFloat stagger={stagger} animationDuration={duration} key={key} scrollContainerRef={containerRef}> React Bits </ScrollFloat> </Box> </Box> <div className="preview-options"> <h2 className="demo-title-extra">Customize</h2> <PreviewSlider title="Stagger" min={0.01} max={0.1} step={0.01} value={stagger} onChange={(val) => { containerRef.current.scrollTo({ top: 0, behavior: 'smooth' }); setStagger(val); forceRerender(); }} width={150} /> <PreviewSlider title="Duration" min={1} max={10} step={0.1} value={duration} onChange={(val) => { containerRef.current.scrollTo({ top: 0, behavior: 'smooth' }); setDuration(val); forceRerender(); }} width={150} /> </div> <PropTable data={propData} /> <Dependencies dependencyList={['gsap']} /> </PreviewTab> <CodeTab> <CodeExample codeObject={scrollFloat} /> </CodeTab> <CliTab> <CliInstallation {...scrollFloat} /> </CliTab> </TabbedLayout> ); }; export default ScrollFloatDemo;