diff --git a/src/components/tiles/ProjectsTile.tsx b/src/components/tiles/ProjectsTile.tsx index ee1cef7..61de304 100644 --- a/src/components/tiles/ProjectsTile.tsx +++ b/src/components/tiles/ProjectsTile.tsx @@ -14,11 +14,11 @@ const statusColorMap: Record = { interface ProjectItemProps { project: Investigation - slideBasis: string + slideWidth: string onClick: () => void } -function ProjectItem({ project, slideBasis, onClick }: ProjectItemProps) { +function ProjectItem({ project, slideWidth, onClick }: ProjectItemProps) { const dotColor = statusColorMap[project.status] || '#0D6E6E' const isLive = project.status === 'Live' @@ -35,9 +35,8 @@ function ProjectItem({ project, slideBasis, onClick }: ProjectItemProps) { return (
{ + e.currentTarget.style.borderColor = 'var(--accent-border)' + e.currentTarget.style.boxShadow = '0 2px 8px rgba(26,43,42,0.08)' + }} + onBlur={(e) => { + e.currentTarget.style.borderColor = 'var(--border-light)' + e.currentTarget.style.boxShadow = 'none' + }} >
[autoplayPlugin.current], []), ) @@ -222,27 +230,33 @@ export function ProjectsTile() { return () => mediaQuery.removeEventListener('change', syncMotionPreference) }, []) - const slideBasis = useMemo(() => { + const cardsPerView = useMemo(() => { if (viewportWidth < 768) { - return '100%' + return 1 } if (viewportWidth < 1200) { - return '50%' + return 2 } - return '33.3333%' + return 3 }, [viewportWidth]) + const slideWidth = useMemo(() => { + const gap = 12 + const totalGap = (cardsPerView - 1) * gap + return `calc((100% - ${totalGap}px) / ${cardsPerView})` + }, [cardsPerView]) + return (
-
+
{investigations.map((project) => ( openPanel({ type: 'project', investigation: project })} /> ))}