Spaces:
Build error
Build error
File size: 3,354 Bytes
0bfe2e3 |
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 99 100 101 102 103 104 105 106 |
import {
Card,
CardContent,
CardDescription,
CardHeader,
CardTitle,
} from '@/components/ui/card';
import { cn } from '@/components/ui/core/styling';
import React, { useRef, useState } from 'react';
type SettingsCardProps = {
title?: string;
description?: string;
children: React.ReactNode;
};
export function SettingsNavCard({ title, children }: SettingsCardProps) {
const [position, setPosition] = useState({ x: 0, y: 0 });
const cardRef = useRef<HTMLDivElement>(null);
const handleMouseMove = (e: React.MouseEvent<HTMLDivElement>) => {
if (!cardRef.current) return;
const rect = cardRef.current.getBoundingClientRect();
const x = e.clientX - rect.left;
const y = e.clientY - rect.top;
setPosition({ x, y });
};
return (
<div className="pb-4">
<div
ref={cardRef}
onMouseMove={handleMouseMove}
className="lg:p-2 lg:border lg:rounded-[--radius] lg:bg-[--paper] contents lg:block relative group/settings-nav overflow-hidden"
>
{/* <div
className="pointer-events-none absolute -inset-px transition-opacity duration-300 opacity-0 group-hover/settings-nav:opacity-100 hidden lg:block"
style={{
background: `radial-gradient(250px circle at ${position.x}px ${position.y}px, rgb(255 255 255 / 0.025), transparent 40%)`,
}}
/> */}
{children}
</div>
</div>
);
}
export function SettingsCard({
title,
description,
children,
className,
}: SettingsCardProps & { className?: string }) {
const [position, setPosition] = useState({ x: 0, y: 0 });
const cardRef = useRef<HTMLDivElement>(null);
const handleMouseMove = (e: React.MouseEvent<HTMLDivElement>) => {
if (!cardRef.current) return;
const rect = cardRef.current.getBoundingClientRect();
const x = e.clientX - rect.left;
const y = e.clientY - rect.top;
setPosition({ x, y });
};
// If the card is set to h-full or flex, make CardContent stretch
const stretchContent =
className?.includes('h-full') || className?.includes('flex');
return (
<>
<Card
ref={cardRef}
className={cn(
'group/settings-card relative overflow-hidden bg-[--paper]',
className
)}
onMouseMove={handleMouseMove}
>
{/* <div
className="pointer-events-none absolute -inset-px transition-opacity duration-300 opacity-0 group-hover/settings-card:opacity-100"
style={{
background: `radial-gradient(700px circle at ${position.x}px ${position.y}px, rgb(255 255 255 / 0.025), transparent 40%)`,
}}
/> */}
{title && (
<CardHeader>
<CardTitle className="font-semibold text-xl text-[--muted] transition-colors group-hover/settings-card:text-[--brand]">
{title}
</CardTitle>
{description && <CardDescription>{description}</CardDescription>}
</CardHeader>
)}
<CardContent
className={cn(
!title && 'pt-4',
'space-y-3 flex-wrap',
stretchContent && 'flex-1 h-full flex flex-col'
)}
>
{children}
</CardContent>
</Card>
</>
);
}
|