reactbits-mcp-server
Version:
MCP Server for React Bits - Access 99+ React components with animations, backgrounds, and UI elements
154 lines (137 loc) • 4.49 kB
JSX
import { useEffect, useState } from "react";
import { CodeTab, PreviewTab, CliTab, TabbedLayout } from "../../components/common/TabbedLayout";
import { Box } from "@chakra-ui/react";
import Customize from "../../components/common/Preview/Customize";
import PreviewSlider from "../../components/common/Preview/PreviewSlider";
import logo from '../../assets/logos/react-bits-logo-small-black.svg';
import CodeExample from "../../components/code/CodeExample";
import useForceRerender from "../../hooks/useForceRerender";
import CliInstallation from "../../components/code/CliInstallation";
import PropTable from "../../components/common/Preview/PropTable";
import MetallicPaint, { parseLogoImage } from "../../content/Animations/MetallicPaint/MetallicPaint";
import { metallicPaint } from "../../constants/code/Animations/metallicPaintCode";
const LiquidPaperDemo = () => {
const [imageData, setImageData] = useState(null);
const [edge, setEdge] = useState(0);
const [patternScale, setPatternScale] = useState(2);
const [refraction, setRefraction] = useState(0.015);
const [patternBlur, setPatternBlur] = useState(0.005);
const [liquid, setLiquid] = useState(0.07);
const [speed, setSpeed] = useState(0.3);
const [key, forceRerender] = useForceRerender();
useEffect(() => {
async function loadDefaultImage() {
try {
const response = await fetch(logo);
const blob = await response.blob();
const file = new File([blob], "default.png", { type: blob.type });
const { imageData } = await parseLogoImage(file);
setImageData(imageData);
} catch (err) {
console.error("Error loading default image:", err);
}
}
loadDefaultImage();
}, []);
const propData = [
{
name: "imageData",
type: "ImageData",
default: "none (required)",
description:
"The processed image data generated from parseLogoImage. This image data is used by the shader to create the liquid paper effect."
},
{
name: "params",
type: "ShaderParams",
default: "",
description:
"An object to configure the shader effect. Properties include: patternScale, refraction, edge, patternBlur, liquid, speed"
}
];
return (
<TabbedLayout>
<PreviewTab>
<Box position="relative" className="demo-container" h={500} overflow="hidden">
<MetallicPaint key={key} imageData={imageData} params={{ edge, patternBlur, patternScale, refraction, speed, liquid }} />
</Box>
<Customize>
<PreviewSlider
title="Edge"
min={0}
max={2}
step={0.1}
value={edge}
onChange={(val) => {
setEdge(val);
forceRerender();
}}
/>
<PreviewSlider
title="Pattern Scale"
min={1}
max={5}
step={0.1}
value={patternScale}
onChange={(val) => {
setPatternScale(val);
forceRerender();
}}
/>
<PreviewSlider
title="Pattern Blur"
min={0}
max={0.1}
step={0.001}
value={patternBlur}
onChange={(val) => {
setPatternBlur(val);
forceRerender();
}}
/>
<PreviewSlider
title="Refraction"
min={0}
max={0.1}
step={0.01}
value={refraction}
onChange={(val) => {
setRefraction(val);
forceRerender();
}}
/>
<PreviewSlider
title="Liquid"
min={0}
max={1}
step={0.01}
value={liquid}
onChange={(val) => {
setLiquid(val);
forceRerender();
}}
/>
<PreviewSlider
title="Speed"
min={0}
max={1}
step={0.01}
value={speed}
onChange={(val) => {
setSpeed(val);
forceRerender();
}}
/>
</Customize>
<PropTable data={propData} />
</PreviewTab>
<CodeTab>
<CodeExample codeObject={metallicPaint} />
</CodeTab>
<CliTab>
<CliInstallation {...metallicPaint} />
</CliTab>
</TabbedLayout>
);
};
export default LiquidPaperDemo;