auto-claude: subtask-1-2 - Create CategoryFilter component
This commit is contained in:
@@ -0,0 +1,74 @@
|
||||
'use client';
|
||||
|
||||
import { useTranslations } from 'next-intl';
|
||||
import { useRouter, useSearchParams } from 'next/navigation';
|
||||
|
||||
const categories = [
|
||||
'AI Development',
|
||||
'IoT',
|
||||
'Full-Stack',
|
||||
'Enterprise Software',
|
||||
'E-Commerce',
|
||||
'Developer Tools',
|
||||
] as const;
|
||||
|
||||
export function CategoryFilter() {
|
||||
const t = useTranslations('portfolio.filters');
|
||||
const router = useRouter();
|
||||
const searchParams = useSearchParams();
|
||||
const selectedCategory = searchParams.get('category');
|
||||
|
||||
const handleCategoryClick = (category: string | null) => {
|
||||
if (category === null) {
|
||||
// Remove category param to show all
|
||||
router.push(window.location.pathname);
|
||||
} else {
|
||||
// Set category param
|
||||
const params = new URLSearchParams(searchParams.toString());
|
||||
params.set('category', category);
|
||||
router.push(`${window.location.pathname}?${params.toString()}`);
|
||||
}
|
||||
};
|
||||
|
||||
return (
|
||||
<div className="mb-12">
|
||||
<div className="flex items-center gap-3 overflow-x-auto pb-4 scrollbar-hide">
|
||||
{/* All button */}
|
||||
<button
|
||||
onClick={() => handleCategoryClick(null)}
|
||||
className={`
|
||||
relative whitespace-nowrap rounded-full py-2 px-4
|
||||
transition-all duration-200 ease-in-out text-sm tracking-wide
|
||||
${!selectedCategory
|
||||
? 'text-white bg-zinc-700/60'
|
||||
: 'text-zinc-400 hover:text-white hover:bg-zinc-800/30'
|
||||
}
|
||||
`}
|
||||
>
|
||||
{t('all')}
|
||||
</button>
|
||||
|
||||
{/* Category buttons */}
|
||||
{categories.map((category) => {
|
||||
const isActive = selectedCategory === category;
|
||||
return (
|
||||
<button
|
||||
key={category}
|
||||
onClick={() => handleCategoryClick(category)}
|
||||
className={`
|
||||
relative whitespace-nowrap rounded-full py-2 px-4
|
||||
transition-all duration-200 ease-in-out text-sm tracking-wide
|
||||
${isActive
|
||||
? 'text-white bg-zinc-700/60'
|
||||
: 'text-zinc-400 hover:text-white hover:bg-zinc-800/30'
|
||||
}
|
||||
`}
|
||||
>
|
||||
{t(`categories.${category}`)}
|
||||
</button>
|
||||
);
|
||||
})}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user