File size: 2,677 Bytes
1a9c884
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
import { useRef, useCallback, type ReactNode } from "react";
import type { GlassEffectProps } from "../types";
import GlassFilters from "./GlassFilters";

interface GlassContainerProps extends GlassEffectProps {
  children: ReactNode;
  className?: string;
  onClick?: (e: React.MouseEvent) => void;
  onMouseDown?: (e: React.MouseEvent) => void;
  role?: string;
  "aria-label"?: string;
  "aria-labelledby"?: string;
  style?: React.CSSProperties;
}

export default function GlassContainer({

  children,

  className = "",

  bgColor = "rgba(0, 0, 0, 0.25)",

  highlight = "rgba(255, 255, 255, 0.15)",

  onClick,

  onMouseDown,

  role,

  style,

  ...ariaProps

}: GlassContainerProps) {
  const specularRef = useRef<HTMLDivElement>(null);

  const handleMouseMove = useCallback((e: React.MouseEvent) => {
    if (!specularRef.current) return;

    const rect = e.currentTarget.getBoundingClientRect();
    const x = e.clientX - rect.left;
    const y = e.clientY - rect.top;

    specularRef.current.style.background = `radial-gradient(

      circle at ${x}px ${y}px,

      rgba(255,255,255,0.15) 0%,

      rgba(255,255,255,0.05) 30%,

      rgba(255,255,255,0) 60%

    )`;
  }, []);

  const handleMouseLeave = useCallback(() => {
    if (specularRef.current) {
      specularRef.current.style.background = "none";
    }
  }, []);

  return (
    <div

      className={`glass-container relative overflow-hidden ${className}`}

      onMouseMove={handleMouseMove}

      onMouseLeave={handleMouseLeave}

      onClick={onClick}

      onMouseDown={onMouseDown}

      role={role}

      style={

        {

          "--bg-color": bgColor,

          "--highlight": highlight,

          "--text": "#ffffff",

          ...style,

        } as React.CSSProperties

      }

      {...ariaProps}

    >

      <GlassFilters />

      {/* Glass layers */}

      <div

        className="glass-filter absolute inset-0 backdrop-blur-md z-10"

        style={{

          filter: "url(#glass-distortion) saturate(120%) brightness(1.15)",

          borderRadius: "inherit",

        }}

      />

      <div

        className="glass-overlay absolute inset-0 z-20"

        style={{

          background: "var(--bg-color)",

          borderRadius: "inherit",

        }}

      />

      <div

        ref={specularRef}

        className="glass-specular absolute inset-0 z-30"

        style={{

          boxShadow: "inset 1px 1px 1px var(--highlight)",

          borderRadius: "inherit",

        }}

      />



      {/* Content */}

      <div className="glass-content relative z-40">{children}</div>

    </div>
  );
}