// "use client";
// import { cn } from "@/lib/utils";
// import { Canvas, useFrame, useThree } from "@react-three/fiber";
// import React, { useMemo, useRef } from "react";
// import * as THREE from "three";
// export const CanvasRevealEffect = ({
// animationSpeed = 0.4,
// opacities = [0.3, 0.3, 0.3, 0.5, 0.5, 0.5, 0.8, 0.8, 0.8, 1],
// colors = [[0, 255, 255]],
// containerClassName,
// dotSize,
// showGradient = false,
// }: {
// /**
// * 0.1 - slower
// * 1.0 - faster
// */
// animationSpeed?: number;
// opacities?: number[];
// colors?: number[][];
// containerClassName?: string;
// dotSize?: number;
// showGradient?: boolean;
// }) => {
// return (
//
//
//
//
// {showGradient && (
//
// )}
//
// );
// };
// interface DotMatrixProps {
// colors?: number[][];
// opacities?: number[];
// totalSize?: number;
// dotSize?: number;
// shader?: string;
// center?: ("x" | "y")[];
// }
// const DotMatrix: React.FC = ({
// colors = [[0, 0, 0]],
// opacities = [0.04, 0.04, 0.04, 0.04, 0.04, 0.08, 0.08, 0.08, 0.08, 0.14],
// totalSize = 4,
// dotSize = 2,
// shader = "",
// center = ["x", "y"],
// }) => {
// const uniforms = React.useMemo(() => {
// let colorsArray = [
// colors[0],
// colors[0],
// colors[0],
// colors[0],
// colors[0],
// colors[0],
// ];
// if (colors.length === 2) {
// colorsArray = [
// colors[0],
// colors[0],
// colors[0],
// colors[1],
// colors[1],
// colors[1],
// ];
// } else if (colors.length === 3) {
// colorsArray = [
// colors[0],
// colors[0],
// colors[1],
// colors[1],
// colors[2],
// colors[2],
// ];
// }
// return {
// u_colors: {
// value: colorsArray.map((color) => [
// color[0] / 255,
// color[1] / 255,
// color[2] / 255,
// ]),
// type: "uniform3fv",
// },
// u_opacities: {
// value: opacities,
// type: "uniform1fv",
// },
// u_total_size: {
// value: totalSize,
// type: "uniform1f",
// },
// u_dot_size: {
// value: dotSize,
// type: "uniform1f",
// },
// };
// }, [colors, opacities, totalSize, dotSize]);
// return (
//
// );
// };
// type Uniforms = {
// [key: string]: {
// value: number[] | number[][] | number;
// type: string;
// };
// };
// const ShaderMaterial = ({
// source,
// uniforms,
// maxFps = 60,
// }: {
// source: string;
// hovered?: boolean;
// maxFps?: number;
// uniforms: Uniforms;
// }) => {
// const { size } = useThree();
// const ref = useRef(null);
// let lastFrameTime = 0;
// useFrame(({ clock }) => {
// if (!ref.current) return;
// const timestamp = clock.getElapsedTime();
// if (timestamp - lastFrameTime < 1 / maxFps) {
// return;
// }
// lastFrameTime = timestamp;
// const material: any = ref.current.material;
// const timeLocation = material.uniforms.u_time;
// timeLocation.value = timestamp;
// });
// const getUniforms = () => {
// const preparedUniforms: any = {};
// for (const uniformName in uniforms) {
// const uniform: any = uniforms[uniformName];
// switch (uniform.type) {
// case "uniform1f":
// preparedUniforms[uniformName] = { value: uniform.value, type: "1f" };
// break;
// case "uniform3f":
// preparedUniforms[uniformName] = {
// value: new THREE.Vector3().fromArray(uniform.value),
// type: "3f",
// };
// break;
// case "uniform1fv":
// preparedUniforms[uniformName] = { value: uniform.value, type: "1fv" };
// break;
// case "uniform3fv":
// preparedUniforms[uniformName] = {
// value: uniform.value.map((v: number[]) =>
// new THREE.Vector3().fromArray(v)
// ),
// type: "3fv",
// };
// break;
// case "uniform2f":
// preparedUniforms[uniformName] = {
// value: new THREE.Vector2().fromArray(uniform.value),
// type: "2f",
// };
// break;
// default:
// console.error(`Invalid uniform type for '${uniformName}'.`);
// break;
// }
// }
// preparedUniforms["u_time"] = { value: 0, type: "1f" };
// preparedUniforms["u_resolution"] = {
// value: new THREE.Vector2(size.width * 2, size.height * 2),
// }; // Initialize u_resolution
// return preparedUniforms;
// };
// // Shader material
// const material = useMemo(() => {
// const materialObject = new THREE.ShaderMaterial({
// vertexShader: `
// precision mediump float;
// in vec2 coordinates;
// uniform vec2 u_resolution;
// out vec2 fragCoord;
// void main(){
// float x = position.x;
// float y = position.y;
// gl_Position = vec4(x, y, 0.0, 1.0);
// fragCoord = (position.xy + vec2(1.0)) * 0.5 * u_resolution;
// fragCoord.y = u_resolution.y - fragCoord.y;
// }
// `,
// fragmentShader: source,
// uniforms: getUniforms(),
// glslVersion: THREE.GLSL3,
// blending: THREE.CustomBlending,
// blendSrc: THREE.SrcAlphaFactor,
// blendDst: THREE.OneFactor,
// });
// return materialObject;
// }, [size.width, size.height, source]);
// return (
//
//
//
//
// );
// };
// const Shader: React.FC = ({ source, uniforms, maxFps = 60 }) => {
// return (
//
// );
// };
// interface ShaderProps {
// source: string;
// uniforms: {
// [key: string]: {
// value: number[] | number[][] | number;
// type: string;
// };
// };
// maxFps?: number;
// }