'use client';
import { useState, useMemo } from 'react';
import * as Icons from '@zen/core/shared/icons';
import { useToast } from '@zen/core/toast';
import AdminHeader from '../components/AdminHeader.js';
const ALL_ICONS = Object.entries(Icons);
export default function IconsPage() {
const [query, setQuery] = useState('');
const [selectedCategory, setSelectedCategory] = useState(null);
const toast = useToast();
const categories = useMemo(() => {
const map = new Map();
for (const [, Icon] of ALL_ICONS) {
const cat = Icon.category;
if (!cat) continue;
if (!map.has(cat)) map.set(cat, { count: 0, FirstIcon: Icon });
map.get(cat).count += 1;
}
return Array.from(map.entries()).sort(([a], [b]) => a.localeCompare(b));
}, []);
const filtered = useMemo(() => {
let list = ALL_ICONS;
if (selectedCategory) list = list.filter(([, Icon]) => Icon.category === selectedCategory);
if (!query.trim()) return list;
const q = query.trim().toLowerCase();
return list.filter(([name, Icon]) =>
name.toLowerCase().includes(q) ||
Icon.keywords?.some(k => k.toLowerCase().includes(q))
);
}, [query, selectedCategory]);
const handleCopy = (name) => {
navigator.clipboard.writeText(`<${name} className="w-5 h-5" />`);
toast.success(`${name} copié`);
};
const hasSidebar = categories.length > 0;
return (
setQuery(e.target.value)}
placeholder="Rechercher une icône..."
className="w-full rounded-lg border border-neutral-200 dark:border-neutral-800 bg-white dark:bg-neutral-900 px-4 py-2.5 text-sm text-neutral-900 dark:text-white placeholder-neutral-400 dark:placeholder-neutral-500 focus:outline-none focus:ring-2 focus:ring-blue-700/40"
/>
{query && (
)}
{filtered.length === 0 ? (
Aucune icône trouvée pour “{query}”
) : (
{filtered.map(([name, IconComponent]) => (
))}
)}
{hasSidebar && (
Catégories
{categories.map(([cat, { count, FirstIcon }]) => (
))}
)}
);
}