From 749c0e6996311cc6bf86052b449bc92d6f5e614f Mon Sep 17 00:00:00 2001 From: Marc Mintel Date: Thu, 29 Jan 2026 01:45:29 +0100 Subject: [PATCH] design --- app/globals.css | 9 +++++ components/Button.tsx | 76 +++++++++++++++++++++++--------------- components/HomeContent.tsx | 6 +-- components/Layout.tsx | 17 +++++---- components/TileGrid.tsx | 47 ++++++++++++++--------- 5 files changed, 97 insertions(+), 58 deletions(-) diff --git a/app/globals.css b/app/globals.css index c3de8bb..dee03c6 100644 --- a/app/globals.css +++ b/app/globals.css @@ -51,6 +51,15 @@ @apply absolute h-px bg-accent/20; } + .mesh-gradient { + background-color: #ffffff; + background-image: + radial-gradient(at 0% 0%, rgba(16, 185, 129, 0.05) 0px, transparent 50%), + radial-gradient(at 100% 0%, rgba(15, 23, 42, 0.05) 0px, transparent 50%), + radial-gradient(at 100% 100%, rgba(16, 185, 129, 0.05) 0px, transparent 50%), + radial-gradient(at 0% 100%, rgba(15, 23, 42, 0.05) 0px, transparent 50%); + } + .tech-dot { @apply absolute w-1 h-1 bg-accent/30 rounded-full; } diff --git a/components/Button.tsx b/components/Button.tsx index de4cd3f..a4e3f9d 100644 --- a/components/Button.tsx +++ b/components/Button.tsx @@ -1,6 +1,6 @@ 'use client'; -import React from 'react'; +import React, { useRef, useState } from 'react'; import { motion } from 'framer-motion'; import Link from 'next/link'; import { ArrowRight } from 'lucide-react'; @@ -26,52 +26,68 @@ export const Button = ({ type = 'button', disabled = false }: ButtonProps) => { - const baseStyles = "inline-flex items-center justify-center px-8 py-4 rounded-xl font-bold uppercase tracking-widest text-xs transition-all duration-300 relative overflow-hidden group disabled:opacity-50 disabled:cursor-not-allowed"; + const [mousePosition, setMousePosition] = useState({ x: 0, y: 0 }); + const [isHovered, setIsHovered] = useState(false); + + const handleMouseMove = (e: React.MouseEvent) => { + const rect = e.currentTarget.getBoundingClientRect(); + setMousePosition({ + x: e.clientX - rect.left, + y: e.clientY - rect.top, + }); + }; + + const baseStyles = "inline-flex items-center justify-center px-10 py-5 rounded-2xl font-bold uppercase tracking-[0.2em] text-[10px] transition-all duration-500 relative group disabled:opacity-50 disabled:cursor-not-allowed select-none overflow-hidden"; const variants = { - primary: "bg-primary text-white hover:bg-primary-light hover:shadow-[0_0_20px_rgba(15,23,42,0.3)]", - accent: "bg-accent text-white hover:bg-accent-hover hover:shadow-[0_0_20px_rgba(16,185,129,0.3)]", + primary: "bg-primary text-white shadow-lg", + accent: "bg-accent text-white shadow-lg", outline: "border-2 border-primary text-primary hover:bg-primary hover:text-white", ghost: "bg-slate-100 text-primary hover:bg-slate-200" }; const content = ( - <> - - {children} - {showArrow && ( - - - - )} - - - + + {children} + {showArrow && ( + + )} + ); + const spotlight = ( + + ); + + const buttonProps = { + onMouseMove: handleMouseMove, + onMouseEnter: () => setIsHovered(true), + onMouseLeave: () => setIsHovered(false), + className: `${baseStyles} ${variants[variant]} ${className}`, + }; + if (href) { return ( - + + {spotlight} {content} ); } return ( - ); diff --git a/components/HomeContent.tsx b/components/HomeContent.tsx index 8d2b10a..71f1b2c 100644 --- a/components/HomeContent.tsx +++ b/components/HomeContent.tsx @@ -59,14 +59,14 @@ export default function Home() { {/* Hero Section */}
-
-
- +
+
diff --git a/components/Layout.tsx b/components/Layout.tsx index 037e12d..5a07bc4 100644 --- a/components/Layout.tsx +++ b/components/Layout.tsx @@ -6,6 +6,7 @@ import Link from 'next/link'; import { usePathname } from 'next/navigation'; import { motion, AnimatePresence } from 'framer-motion'; import { Reveal } from './Reveal'; +import { Button } from './Button'; const Layout = ({ children }: { children: React.ReactNode }) => { const pathname = usePathname(); @@ -78,12 +79,12 @@ const Layout = ({ children }: { children: React.ReactNode }) => { ))} - Projekt anfragen - + {/* Mobile Menu Toggle */} @@ -122,12 +123,12 @@ const Layout = ({ children }: { children: React.ReactNode }) => { {link.label} ))} - Projekt anfragen - + )} diff --git a/components/TileGrid.tsx b/components/TileGrid.tsx index e462560..5effbde 100644 --- a/components/TileGrid.tsx +++ b/components/TileGrid.tsx @@ -12,25 +12,38 @@ export const TileGrid = () => { if (!mounted) return null; + const rows = 15; + const cols = 20; + return ( -
- {/* The lighting tiles (actual squares) */} -
- {[...Array(144)].map((_, i) => ( - 0.92 ? 0.4 : 0, 0], +
+
+ {[...Array(rows)].map((_, rowIndex) => ( +
+ > + {[...Array(cols)].map((_, colIndex) => ( + 0.9 ? 0.25 : 0.05, 0.05], + scale: [1, Math.random() > 0.9 ? 1.05 : 1, 1] + }} + transition={{ + duration: 5 + Math.random() * 5, + repeat: Infinity, + delay: Math.random() * 20, + ease: "easeInOut" + }} + className="w-32 h-32 md:w-40 md:h-40 bg-white/10 backdrop-blur-[2px] rounded-3xl border border-white/20 shadow-[0_8px_32px_0_rgba(31,38,135,0.07)] shrink-0" + /> + ))} +
))}