liquid-metal-button
jolyui-ui/liquid-metal-buttonFreeComponent
jolyui/ui publishes no description for this item.
Live preview
live · rendered by the registry
Rendered by jolyui/ui on their own page — this is the component running, not a screenshot of it.Install it
npx shadcn@latest add https://jolyui.dev/r/liquid-metal-button.jsonSource
1"use client";23import { Sparkles } from "lucide-react";4import type React from "react";5import { useEffect, useMemo, useRef, useState } from "react";67interface LiquidMetalButtonProps {8 label?: string;9 onClick?: () => void;10 viewMode?: "text" | "icon";11}1213export function LiquidMetalButton({14 label = "Get Started",15 onClick,16 viewMode = "text",17}: LiquidMetalButtonProps) {18 const [isHovered, setIsHovered] = useState(false);19 const [isPressed, setIsPressed] = useState(false);20 const [ripples, setRipples] = useState<21 Array<{ x: number; y: number; id: number }>22 >([]);23 const shaderRef = useRef<HTMLDivElement>(null);24 // biome-ignore lint/suspicious/noExplicitAny: External library without types25 const shaderMount = useRef<any>(null);26 const buttonRef = useRef<HTMLButtonElement>(null);27 const rippleId = useRef(0);2829 const dimensions = useMemo(() => {30 if (viewMode === "icon") {31 return {32 width: 46,33 height: 46,34 innerWidth: 42,35 innerHeight: 42,36 shaderWidth: 46,37 shaderHeight: 46,38 };39 } else {40 return {41 width: 142,42 height: 46,43 innerWidth: 138,44 innerHeight: 42,45 shaderWidth: 142,46 shaderHeight: 46,47 };48 }49 }, [viewMode]);5051 useEffect(() => {52 const styleId = "shader-canvas-style-exploded";53 if (!document.getElementById(styleId)) {54 const style = document.createElement("style");55 style.id = styleId;56 style.textContent = `57 .shader-container-exploded canvas {58 width: 100% !important;59 height: 100% !important;60 display: block !important;61 position: absolute !important;62 top: 0 !important;63 left: 0 !important;64 border-radius: 100px !important;65 }66 @keyframes ripple-animation {67 0% {68 transform: translate(-50%, -50%) scale(0);69 opacity: 0.6;70 }71 100% {72 transform: translate(-50%, -50%) scale(4);73 opacity: 0;74 }75 }76 `;77 document.head.appendChild(style);78 }7980 const loadShader = async () => {81 try {82 const { liquidMetalFragmentShader, ShaderMount } = await import(83 "@paper-design/shaders"84 );8586 if (shaderRef.current) {87 if (shaderMount.current?.destroy) {88 shaderMount.current.destroy();89 }9091 shaderMount.current = new ShaderMount(92// … truncated
What it pulls in
npm packages
Files it writes
More from jolyui/ui
All 199 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| ai-prompt-boxai-prompt-box | jolyui/ui | Components | Free | 4 deps | |
| animated-beamanimated-beam | jolyui/ui | Components | Free | 1 dep | |
| animated-tableanimated-table | jolyui/ui | Components | Free | 2 deps | |
| animated-theme-toggleanimated-theme-toggle | jolyui/ui | Components | Free | 2 deps | |
| animated-toastanimated-toast | jolyui/ui | Components | Free | 2 deps | |
| animated-tooltipanimated-tooltip | jolyui/ui | Components | Free | 1 dep | |
| bento-gridbento-grid | jolyui/ui | Components | Free | no deps | |
| buttonbutton | jolyui/ui | Components | Free | 3 deps |
