From 1b7f30d181de52b7263ddfdb46bc4b0c337c7fb0 Mon Sep 17 00:00:00 2001 From: bender Date: Mon, 9 Mar 2026 21:42:37 +0000 Subject: [PATCH] Add src/components/ui/liquid-glass-button.tsx --- src/components/ui/liquid-glass-button.tsx | 154 ++++++++++++++++++++++ 1 file changed, 154 insertions(+) create mode 100644 src/components/ui/liquid-glass-button.tsx diff --git a/src/components/ui/liquid-glass-button.tsx b/src/components/ui/liquid-glass-button.tsx new file mode 100644 index 0000000..1933216 --- /dev/null +++ b/src/components/ui/liquid-glass-button.tsx @@ -0,0 +1,154 @@ +'use client'; + +import React, { useState, useRef, useEffect } from 'react'; + +export interface LiquidButtonProps { + text: string; + onClick?: () => void; + className?: string; + disabled?: boolean; + children?: React.ReactNode; +} + +export const LiquidButton: React.FC = ({ + text, + onClick, + className = '', + disabled = false, + children, +}) => { + const [isHovered, setIsHovered] = useState(false); + + return ( + + ); +}; + +export interface ButtonProps extends LiquidButtonProps { + variant?: 'primary' | 'secondary' | 'outline'; + size?: 'sm' | 'md' | 'lg'; +} + +export const Button: React.FC = ({ + text, + onClick, + variant = 'primary', + size = 'md', + className = '', + disabled = false, + children, +}) => { + const baseClass = + 'relative font-medium rounded-lg transition-all duration-200 focus:outline-none focus:ring-2 focus:ring-offset-2'; + const sizeClasses = { + sm: 'px-3 py-2 text-sm', + md: 'px-6 py-3 text-base', + lg: 'px-8 py-4 text-lg', + }; + const variantClasses = { + primary: 'bg-blue-600 text-white hover:bg-blue-700 disabled:bg-gray-400', + secondary: 'bg-gray-200 text-gray-800 hover:bg-gray-300 disabled:bg-gray-100', + outline: 'border-2 border-blue-600 text-blue-600 hover:bg-blue-50 disabled:border-gray-400 disabled:text-gray-400', + }; + + return ( + + ); +}; + +export interface GlassFilterProps { + children: React.ReactNode; + intensity?: number; + className?: string; +} + +export const GlassFilter: React.FC = ({ + children, + intensity = 0.1, + className = '', +}) => { + return ( +
+ {children} +
+ ); +}; + +export interface MetalButtonProps extends ButtonProps { + shine?: boolean; +} + +export const MetalButton: React.FC = ({ + text, + onClick, + className = '', + disabled = false, + shine = true, + children, +}) => { + const [mousePosition, setMousePosition] = useState({ x: 0, y: 0 }); + const buttonRef = useRef(null); + + const handleMouseMove = (e: React.MouseEvent) => { + if (!buttonRef.current) return; + const rect = buttonRef.current.getBoundingClientRect(); + setMousePosition({ + x: e.clientX - rect.left, + y: e.clientY - rect.top, + }); + }; + + return ( + + ); +}; + +export default { + LiquidButton, + Button, + GlassFilter, + MetalButton, +};