"use client" import { useRef, useEffect, useState } from "react" import type React from "react" import { Button } from "@/components/ui/button" import { Input } from "@/components/ui/input" import { Badge } from "@/components/ui/badge" import { Card, CardContent, CardHeader, CardTitle, CardDescription, CardFooter } from "@/components/ui/card" import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs" import { Checkbox } from "@/components/ui/checkbox" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select" import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar" import { Label } from "@/components/ui/label" import { Separator } from "@/components/ui/separator" import { Switch } from "@/components/ui/switch" import { RadioGroup, RadioGroupItem } from "@/components/ui/radio-group" import { MagnifyingGlassIcon, PaperAirplaneIcon, FaceSmileIcon, PaperClipIcon, EllipsisHorizontalIcon, CheckIcon, EnvelopeIcon, LockClosedIcon, UserIcon, BellIcon, ShieldCheckIcon, MoonIcon, CreditCardIcon, BanknotesIcon, ArrowRightIcon, ShoppingCartIcon, } from "@heroicons/react/24/outline" import { useMaterial } from "@/contexts/material-context" import { useColorPalette } from "@/contexts/color-context" import { cn } from "@/lib/utils" // Embedded Glass Shader Component function BannerGlassShader() { const { selectedMaterial } = useMaterial() const { primaryColor, systemColors, currentTheme } = useColorPalette() const canvasRef = useRef(null) const animationRef = useRef(0) const [isGlass, setIsGlass] = useState(false) // Enhanced color utility functions const hexToRgb = (hex: string) => { const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex) return result ? { r: Number.parseInt(result[1], 16), g: Number.parseInt(result[2], 16), b: Number.parseInt(result[3], 16), } : { r: 59, g: 130, b: 246 } } const rgbToHsl = (r: number, g: number, b: number) => { r /= 255 g /= 255 b /= 255 const max = Math.max(r, g, b) const min = Math.min(r, g, b) let h = 0, s = 0, l = (max + min) / 2 if (max !== min) { const d = max - min s = l > 0.5 ? d / (2 - max - min) : d / (max + min) switch (max) { case r: h = (g - b) / d + (g < b ? 6 : 0) break case g: h = (b - r) / d + 2 break case b: h = (r - g) / d + 4 break } h /= 6 } return { h: h * 360, s: s * 100, l: l * 100 } } const hslToRgb = (h: number, s: number, l: number) => { h /= 360 s /= 100 l /= 100 const a = s * Math.min(l, 1 - l) const f = (n: number) => { const k = (n + h * 12) % 12 return l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1) } return { r: Math.round(f(0) * 255), g: Math.round(f(8) * 255), b: Math.round(f(4) * 255), } } // Generate harmonious gradient colors based on primary color and theme const generateGradientColors = () => { const primaryRgb = hexToRgb(primaryColor) const primaryHsl = rgbToHsl(primaryRgb.r, primaryRgb.g, primaryRgb.b) // Get background color for context const bgColor = systemColors.backgroundPrimary || (currentTheme === "dark" ? "#0f0f0f" : "#fafafa") const bgRgb = hexToRgb(bgColor) const bgHsl = rgbToHsl(bgRgb.r, bgRgb.g, bgRgb.b) const isDarkTheme = currentTheme === "dark" // Create complementary and analogous colors const colors = [] // Primary color (center of gradient) colors.push({ ...primaryRgb, opacity: isDarkTheme ? 0.3 : 0.25, }) // Analogous color 1 (30 degrees clockwise) const analogous1Hsl = { h: (primaryHsl.h + 30) % 360, s: Math.max(primaryHsl.s * 0.8, 20), // Slightly desaturated l: isDarkTheme ? Math.min(primaryHsl.l + 10, 70) : Math.max(primaryHsl.l - 5, 30), } const analogous1Rgb = hslToRgb(analogous1Hsl.h, analogous1Hsl.s, analogous1Hsl.l) colors.push({ ...analogous1Rgb, opacity: isDarkTheme ? 0.2 : 0.18, }) // Analogous color 2 (30 degrees counter-clockwise) const analogous2Hsl = { h: (primaryHsl.h - 30 + 360) % 360, s: Math.max(primaryHsl.s * 0.8, 20), l: isDarkTheme ? Math.min(primaryHsl.l + 10, 70) : Math.max(primaryHsl.l - 5, 30), } const analogous2Rgb = hslToRgb(analogous2Hsl.h, analogous2Hsl.s, analogous2Hsl.l) colors.push({ ...analogous2Rgb, opacity: isDarkTheme ? 0.15 : 0.12, }) // Triadic color (120 degrees) const triadicHsl = { h: (primaryHsl.h + 120) % 360, s: Math.max(primaryHsl.s * 0.6, 15), // More desaturated l: isDarkTheme ? Math.min(primaryHsl.l + 15, 65) : Math.max(primaryHsl.l - 10, 35), } const triadicRgb = hslToRgb(triadicHsl.h, triadicHsl.s, triadicHsl.l) colors.push({ ...triadicRgb, opacity: isDarkTheme ? 0.1 : 0.08, }) // Background-influenced color (blend with background) const blendedHsl = { h: primaryHsl.h, s: Math.max(primaryHsl.s * 0.4, 10), // Very desaturated l: isDarkTheme ? Math.min(bgHsl.l + 20, 50) : Math.max(bgHsl.l - 15, 20), } const blendedRgb = hslToRgb(blendedHsl.h, blendedHsl.s, blendedHsl.l) colors.push({ ...blendedRgb, opacity: isDarkTheme ? 0.05 : 0.04, }) return colors } // Update isGlass state when material changes useEffect(() => { setIsGlass(selectedMaterial?.id === "glass") }, [selectedMaterial]) // Canvas animation effect useEffect(() => { if (!canvasRef.current || !isGlass) return const canvas = canvasRef.current const ctx = canvas.getContext("2d") if (!ctx) return // Set canvas size to match parent const resizeCanvas = () => { const parent = canvas.parentElement if (parent) { canvas.width = parent.offsetWidth canvas.height = parent.offsetHeight } } resizeCanvas() window.addEventListener("resize", resizeCanvas) // Generate dynamic colors const gradientColors = generateGradientColors() // Animation variables let time = 0 const speed = 0.001 // Slightly slower for more elegant movement // Animation function const animate = () => { if (!isGlass) return time += speed // Create multiple animated gradients for layered effect ctx.clearRect(0, 0, canvas.width, canvas.height) // Create multiple gradient layers gradientColors.forEach((color, index) => { const phase = index * Math.PI * 0.5 + time * (2 + index * 0.5) const radiusMultiplier = 0.4 + index * 0.1 const gradient = ctx.createRadialGradient( canvas.width / 2 + Math.sin(phase) * canvas.width * 0.15, canvas.height / 2 + Math.cos(phase * 0.8) * canvas.height * 0.15, 0, canvas.width / 2 + Math.sin(phase * 0.6) * canvas.width * 0.05, canvas.height / 2 + Math.cos(phase * 0.4) * canvas.height * 0.05, Math.max(canvas.width, canvas.height) * radiusMultiplier, ) // Create gradient with dynamic colors gradient.addColorStop(0, `rgba(${color.r}, ${color.g}, ${color.b}, ${color.opacity})`) gradient.addColorStop(0.4, `rgba(${color.r}, ${color.g}, ${color.b}, ${color.opacity * 0.6})`) gradient.addColorStop(1, `rgba(${color.r}, ${color.g}, ${color.b}, ${color.opacity * 0.1})`) // Apply gradient with blend mode ctx.globalCompositeOperation = index === 0 ? "source-over" : "soft-light" ctx.fillStyle = gradient ctx.fillRect(0, 0, canvas.width, canvas.height) }) // Continue animation animationRef.current = requestAnimationFrame(animate) } // Start animation animate() // Cleanup return () => { cancelAnimationFrame(animationRef.current) window.removeEventListener("resize", resizeCanvas) } }, [isGlass, primaryColor, systemColors, currentTheme]) if (!isGlass) return null return (