Refactor Card component to use 'hoverable' prop instead of 'hover'; simplify class handling in Badge, Button, and Card components for cleaner code; update Home page cards for consistency and improved styling.

This commit is contained in:
Mike Karl 2025-10-28 15:23:18 +01:00
parent 97061f2353
commit 0beb20635f
4 changed files with 19 additions and 48 deletions

View file

@ -4,14 +4,12 @@ interface BadgeProps {
children: ReactNode; children: ReactNode;
variant?: 'gray' | 'green' | 'yellow' | 'red' | 'blue' | 'glass'; variant?: 'gray' | 'green' | 'yellow' | 'red' | 'blue' | 'glass';
border?: boolean; border?: boolean;
className?: string;
} }
export default function Badge({ export default function Badge({
children, children,
variant = 'gray', variant = 'gray',
border = false, border = false,
className = ''
}: BadgeProps) { }: BadgeProps) {
const baseClasses = "rounded-full px-2 py-0.5 text-sm"; const baseClasses = "rounded-full px-2 py-0.5 text-sm";
@ -26,7 +24,7 @@ export default function Badge({
return ( return (
<span <span
className={` ${border?"border":""} ${baseClasses} ${variantClasses[variant]} ${className}`} className={` ${border?"border":""} ${baseClasses} ${variantClasses[variant]}`}
> >
{children} {children}
</span> </span>

View file

@ -4,15 +4,12 @@ interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
children: ReactNode; children: ReactNode;
variant?: 'primary' | 'secondary' | 'ghost' | 'outline' | 'glass'; variant?: 'primary' | 'secondary' | 'ghost' | 'outline' | 'glass';
size?: 'sm' | 'md' | 'lg'; size?: 'sm' | 'md' | 'lg';
className?: string;
} }
export default function Button({ export default function Button({
children, children,
variant = 'primary', variant = 'primary',
size = 'md', size = 'md',
className = '',
...props
}: ButtonProps) { }: ButtonProps) {
const baseClasses = "cursor-pointer font-medium rounded-lg transition-all duration-300 ease-out focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-offset-gray-900 disabled:opacity-50 disabled:cursor-not-allowed"; const baseClasses = "cursor-pointer font-medium rounded-lg transition-all duration-300 ease-out focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-offset-gray-900 disabled:opacity-50 disabled:cursor-not-allowed";
@ -32,8 +29,7 @@ export default function Button({
return ( return (
<button <button
className={`${baseClasses} ${sizeClasses[size]} ${variantClasses[variant]} ${className}`} className={`${baseClasses} ${sizeClasses[size]} ${variantClasses[variant]}`}
{...props}
> >
{children} {children}
</button> </button>

View file

@ -2,18 +2,13 @@ import { ReactNode } from 'react';
interface CardProps { interface CardProps {
children: ReactNode; children: ReactNode;
className?: string;
variant?: 'default' | 'glass' | 'outlined'; variant?: 'default' | 'glass' | 'outlined';
hover?: boolean; hoverable?: boolean;
style?: React.CSSProperties;
} }
export default function Card({ export default function Card({
children, children,
className = '',
variant = 'default', variant = 'default',
hover = false,
style
}: CardProps) { }: CardProps) {
const baseClasses = "relative overflow-hidden rounded-xl transition-all duration-300 ease-out"; const baseClasses = "relative overflow-hidden rounded-xl transition-all duration-300 ease-out";
@ -23,17 +18,9 @@ export default function Card({
outlined: "bg-transparent border-2 border-gray-700/50" outlined: "bg-transparent border-2 border-gray-700/50"
}; };
const hoverClasses = hover
? "hover:scale-[1.02] hover:shadow-2xl hover:shadow-blue-500/10 hover:border-blue-500/30"
: "";
return ( return (
<div <div
className={`${baseClasses} ${variantClasses[variant]} ${hoverClasses} ${className}`} className={`${baseClasses} ${variantClasses[variant]}`}
style={{
willChange: 'transform',
...style
}}
> >
{children} {children}
</div> </div>
@ -42,12 +29,11 @@ export default function Card({
interface CardHeaderProps { interface CardHeaderProps {
children: ReactNode; children: ReactNode;
className?: string;
} }
export function CardHeader({ children, className = '' }: CardHeaderProps) { export function CardHeader({ children }: CardHeaderProps) {
return ( return (
<div className={`p-6 pb-0 ${className}`}> <div className={`p-6 pb-0`}>
{children} {children}
</div> </div>
); );
@ -55,12 +41,11 @@ export function CardHeader({ children, className = '' }: CardHeaderProps) {
interface CardContentProps { interface CardContentProps {
children: ReactNode; children: ReactNode;
className?: string;
} }
export function CardContent({ children, className = '' }: CardContentProps) { export function CardContent({ children }: CardContentProps) {
return ( return (
<div className={`p-6 pb-4 ${className}`}> <div className={`p-6 pb-4`}>
{children} {children}
</div> </div>
); );
@ -68,12 +53,11 @@ export function CardContent({ children, className = '' }: CardContentProps) {
interface CardFooterProps { interface CardFooterProps {
children: ReactNode; children: ReactNode;
className?: string;
} }
export function CardFooter({ children, className = '' }: CardFooterProps) { export function CardFooter({ children }: CardFooterProps) {
return ( return (
<div className={`p-6 pt-8 ${className}`}> <div className={`p-6 pt-8`}>
{children} {children}
</div> </div>
); );

View file

@ -8,47 +8,42 @@ export default function Home() {
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6"> <div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
<Card <Card
variant="glass" variant="glass"
className="float" hoverable
hover
> >
<CardHeader> <CardHeader>
<h3 className="text-xl font-semibold text-white mb-2">Über mich</h3> <h3 className="text-xl font-semibold text-white mb-2">Über mich</h3>
</CardHeader> </CardHeader>
<CardContent> <CardContent>
<p className="text-gray-300"> <p className="text-gray-300">
Lorem ipsum dolor sit amet consectetur adipisicing elit. Ut ex, labore deleniti fuga repellendus maiores rerum, voluptates dicta accusamus nihil quibusdam dolorum dolor illo et corrupti doloremque velit itaque repudiandae! Lorem ipsum dolor sit amet consectetur adipisicing elit. Ut ex, labore deleniti fuga repellendus maiores rerum, voluptates dicta accusamus nihil quibusdam dolorum dolor illo et corrupti doloremque velit itaque repudiandae!
</p> </p>
</CardContent> </CardContent>
</Card> </Card>
<Card <Card
variant="default" variant="default"
className="float" hoverable
hover
style={{ animationDelay: '1s' }}
> >
<CardHeader> <CardHeader>
<h3 className="text-xl font-semibold text-white mb-2">Aktuelle Beschäftigung</h3> <h3 className="text-xl font-semibold text-white mb-2">Aktuelle Beschäftigung</h3>
</CardHeader> </CardHeader>
<CardContent> <CardContent>
<p className="text-gray-300"> <p className="text-gray-300">
Lorem ipsum dolor sit amet consectetur adipisicing elit. Facere similique iusto beatae minima ea. Explicabo voluptatem itaque unde sequi, aperiam, dicta nulla nobis maiores, debitis aliquam corrupti quam earum dolor! Lorem ipsum dolor sit amet consectetur adipisicing elit. Facere similique iusto beatae minima ea. Explicabo voluptatem itaque unde sequi, aperiam, dicta nulla nobis maiores, debitis aliquam corrupti quam earum dolor!
</p></CardContent> </p></CardContent>
</Card> </Card>
<Card <Card
variant="outlined" variant="outlined"
className="float" hoverable
hover
style={{ animationDelay: '2s' }}
> >
<CardHeader> <CardHeader>
<h3 className="text-xl font-semibold text-white mb-2">Erfahrung</h3> <h3 className="text-xl font-semibold text-white mb-2">Erfahrung</h3>
</CardHeader> </CardHeader>
<CardContent> <CardContent>
<p className="text-gray-300"> <p className="text-gray-300">
Lorem ipsum dolor sit amet consectetur adipisicing elit. Nisi distinctio neque natus quibusdam? Corrupti reprehenderit nisi repellendus facere, reiciendis, rerum, error iusto doloribus asperiores sapiente alias repellat autem? Earum, possimus? Lorem ipsum dolor sit amet consectetur adipisicing elit. Nisi distinctio neque natus quibusdam? Corrupti reprehenderit nisi repellendus facere, reiciendis, rerum, error iusto doloribus asperiores sapiente alias repellat autem? Earum, possimus?
</p></CardContent> </p></CardContent>
</Card> </Card>
</div> </div>
</Section> </Section>
@ -150,7 +145,6 @@ export default function Home() {
<div className="grid grid-cols-1 md:grid-cols-2 gap-6"> <div className="grid grid-cols-1 md:grid-cols-2 gap-6">
<Card <Card
variant="glass" variant="glass"
className="hover:neon-glow"
> >
<CardHeader> <CardHeader>
<h3 className="text-lg font-semibold text-white">Raytracing in a Weekend</h3> <h3 className="text-lg font-semibold text-white">Raytracing in a Weekend</h3>
@ -173,7 +167,6 @@ export default function Home() {
<Card <Card
variant="glass" variant="glass"
className="hover:neon-glow"
> >
<CardHeader> <CardHeader>
<h3 className="text-lg font-semibold text-white">6502 Emulator</h3> <h3 className="text-lg font-semibold text-white">6502 Emulator</h3>