'use client'; import { useState, useCallback, createContext, useContext, type ReactNode, } from 'react'; import { cn } from '@/lib/utils'; const FilterContext = createContext(''); function slugify(text: string): string { return text .toLowerCase() .replace(/[^a-z0-9]+/g, '-') .replace(/^-|-$/g, ''); } export function Glossary({ children }: { children: ReactNode }) { const [filter, setFilter] = useState(''); return (
Glossary Term
Definition
setFilter(e.target.value)} className="w-full pl-9 pr-3 py-1.5 text-sm border border-fd-border rounded-md bg-fd-background text-fd-foreground placeholder:text-fd-muted-foreground focus:outline-none focus:ring-2 focus:ring-fd-ring" />
{children}
); } export function GlossaryTerm({ name, children, }: { name: string; children: ReactNode; }) { const filter = useContext(FilterContext); const [definitionText, setDefinitionText] = useState(''); const id = slugify(name); const definitionRef = useCallback((node: HTMLDivElement | null) => { if (node) { setDefinitionText(node.textContent?.toLowerCase() || ''); } }, []); const matches = !filter || name.toLowerCase().includes(filter) || definitionText.includes(filter); if (!matches) return null; return (
{name}
{children}
); }