import { useEffect, useRef, useState } from 'react'; import tutorial from '../../docs/needlescript-tutorial.md?raw'; import { AboutContent } from './reference-dialog/AboutContent'; import { GlossaryContent } from './reference-dialog/GlossaryContent'; import { LanguageReferenceContent } from './reference-dialog/LanguageReferenceContent'; import { MarkdownContent } from './reference-dialog/MarkdownContent'; import { Dialog, DialogClose, DialogContent } from '@/components/ui/dialog.tsx'; import { Input } from '@/components/ui/input.tsx'; import { ScrollArea } from '@/components/ui/scroll-area.tsx'; import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs.tsx'; import { cn } from '@/utils.ts'; type TabId = 'reference' | 'glossary' | 'tutorial' | 'about'; const TAB_LABELS: Record = { reference: 'Language Reference', glossary: 'Glossary', tutorial: 'Tutorial', about: 'About', }; interface ReferenceDialogProps { open: boolean; onClose: () => void; } function GithubIcon({ className }: { className?: string }) { return ( ); } export default function ReferenceDialog({ open, onClose }: ReferenceDialogProps) { const [tab, setTab] = useState('reference'); const [query, setQuery] = useState(''); const inputRef = useRef(null); const searchable = tab === 'reference' || tab === 'glossary'; useEffect(() => { if (open && searchable) { const timeout = window.setTimeout(() => inputRef.current?.focus(), 40); return () => window.clearTimeout(timeout); } }, [open, searchable]); const triggerClassName = cn( 'font-mono text-[11px] tracking-[0.07em] px-2.5 py-1.5 h-auto whitespace-nowrap', 'rounded-[5px] border-transparent shadow-none bg-transparent', 'text-muted-foreground hover:text-foreground transition-colors', 'data-active:bg-[var(--gold-10)] data-active:text-gold', 'data-active:border-transparent data-active:shadow-none after:hidden', 'focus-visible:ring-2 focus-visible:ring-ring/50', ); return ( { if (!isOpen) { setQuery(''); onClose(); } }} >
✣ NeedleScript
value && setTab(value as TabId)} className="flex-1 min-h-0 gap-0 overflow-hidden" >
{(Object.keys(TAB_LABELS) as TabId[]).map((tabId) => ( {TAB_LABELS[tabId]} ))} {searchable && ( setQuery(event.target.value)} spellCheck={false} aria-label={tab === 'glossary' ? 'Filter glossary' : 'Search language reference'} className="h-7 text-[12.5px] font-mono flex-1 min-w-[120px] w-full sm:w-auto bg-secondary border-border text-foreground placeholder:text-muted-foreground" /> )}
); }