'use client' import { useState, useMemo, useEffect, useCallback } from 'react' import { BookText, Menu, Info } from 'lucide-react' import DocsSidebar from '@/components/docs/DocsSidebar' import DocsSearch from '@/components/docs/DocsSearch' import FunctionDoc from '@/components/docs/FunctionDoc' import TypeDoc from '@/components/docs/TypeDoc' import { searchDocs } from '@/lib/docs/search' import { cn } from '@/lib/utils' import { surfaces, colors, effects } from '@/lib/theme' import type { DocNavigation, DocItem } from '@/lib/docs/types' interface DocsPageClientProps { navigation: DocNavigation allItems: DocItem[] } type ViewMode = 'parsed' | 'html' const ITEMS_PER_PAGE = 20 export default function DocsPageClient({ navigation, allItems, }: DocsPageClientProps) { const [viewMode, setViewMode] = useState('parsed') const [searchQuery, setSearchQuery] = useState('') const [isMobileSidebarOpen, setIsMobileSidebarOpen] = useState(false) const [visibleItems, setVisibleItems] = useState(ITEMS_PER_PAGE) const [isLoading, setIsLoading] = useState(false) // Create a set of all available type IDs for validation const availableTypeIds = useMemo(() => { return new Set(allItems.map(item => item.name)) }, [allItems]) useEffect(() => { const saved = localStorage.getItem('docs-view-mode') if (saved === 'parsed' || saved === 'html') { setViewMode(saved) } }, []) const handleViewModeChange = (mode: ViewMode) => { setViewMode(mode) localStorage.setItem('docs-view-mode', mode) } const filteredItems = useMemo(() => { let items = allItems if (searchQuery) { items = searchDocs(items, searchQuery) } return items }, [allItems, searchQuery]) const displayedItems = useMemo(() => { return filteredItems.slice(0, visibleItems) }, [filteredItems, visibleItems]) const hasMoreItems = visibleItems < filteredItems.length const loadMoreItems = useCallback(() => { setIsLoading(true) setTimeout(() => { setVisibleItems(prev => Math.min(prev + ITEMS_PER_PAGE, filteredItems.length)) setIsLoading(false) }, 300) }, [filteredItems.length]) useEffect(() => { setVisibleItems(ITEMS_PER_PAGE) }, [searchQuery]) useEffect(() => { if (!hasMoreItems || isLoading) return const observer = new IntersectionObserver( (entries) => { if (entries[0].isIntersecting) { loadMoreItems() } }, { threshold: 0.1 } ) const sentinel = document.getElementById('scroll-sentinel') if (sentinel) observer.observe(sentinel) return () => observer.disconnect() }, [hasMoreItems, isLoading, loadMoreItems]) return (

Documentation

Complete API reference for aidxnCC

Parsed HTML
{viewMode === 'html' ? (