@usecross/docs 0.11.0 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/CodeBlock.tsx","../src/lib/utils.ts","../src/lib/shiki.ts","../src/components/DocSetSelector.tsx","../src/components/DocsLayout.tsx","../src/components/Sidebar.tsx","../src/components/TableOfContents.tsx","../src/components/ThemeToggle.tsx","../src/components/ThemeProvider.tsx","../src/components/Markdown.tsx","../src/context/ComponentsContext.tsx","../src/components/DocsPage.tsx","../src/components/EmojiConfetti.tsx","../src/components/HomePage.tsx","../src/app.tsx"],"sourcesContent":["import { useEffect, useState } from 'react'\nimport { cn } from '../lib/utils'\nimport { getHighlighter } from '../lib/shiki'\nimport type { CodeBlockProps } from '../types'\n\n/**\n * Syntax-highlighted code block component using Shiki.\n */\nexport function CodeBlock({\n code,\n language = 'python',\n filename,\n showLineNumbers = false,\n theme = 'github-dark-dimmed',\n className,\n}: CodeBlockProps) {\n const [html, setHtml] = useState<string>('')\n const [copied, setCopied] = useState(false)\n\n useEffect(() => {\n async function highlight() {\n const highlighter = await getHighlighter()\n const langs = highlighter.getLoadedLanguages()\n const lang = langs.includes(language) ? language : 'text'\n const highlighted = highlighter.codeToHtml(code.trim(), {\n lang,\n theme,\n })\n setHtml(highlighted)\n }\n highlight()\n }, [code, language, theme])\n\n const copyToClipboard = async () => {\n await navigator.clipboard.writeText(code.trim())\n setCopied(true)\n setTimeout(() => setCopied(false), 2000)\n }\n\n return (\n <div className={cn('group relative overflow-hidden rounded-lg bg-[#24292f] not-prose mb-6', className)}>\n {filename && (\n <div className=\"flex items-center gap-2 border-b border-slate-700 bg-slate-900 px-4 py-2 text-sm text-slate-400\">\n <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\"\n />\n </svg>\n {filename}\n </div>\n )}\n <button\n onClick={copyToClipboard}\n className=\"absolute right-2 top-2 z-10 rounded-md bg-slate-700/50 px-2 py-1 text-xs text-slate-400 opacity-0 transition-opacity hover:bg-slate-600 hover:text-white group-hover:opacity-100\"\n >\n {copied ? 'Copied!' : 'Copy'}\n </button>\n {html ? (\n <div\n className={cn(\n 'overflow-x-auto text-sm [&_pre]:m-0 [&_pre]:bg-transparent [&_code]:p-4',\n showLineNumbers && '[&_code]:grid [&_code]:grid-cols-[auto_1fr]'\n )}\n dangerouslySetInnerHTML={{ __html: html }}\n />\n ) : (\n <pre className=\"shiki overflow-x-auto m-0 bg-transparent\">\n <code className=\"block p-4 text-sm leading-relaxed text-gray-300\">{code.trim()}</code>\n </pre>\n )}\n </div>\n )\n}\n\n/**\n * Simple inline code component.\n */\nexport function InlineCode({ children }: { children: React.ReactNode }) {\n return (\n <code className=\"rounded bg-slate-100 px-1.5 py-0.5 text-sm font-medium text-slate-800\">\n {children}\n </code>\n )\n}\n","import { clsx, type ClassValue } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\n\n/**\n * Merge Tailwind CSS classes with clsx\n */\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","import { createHighlighterCore, type HighlighterCore } from 'shiki/core'\nimport { createJavaScriptRegexEngine } from 'shiki/engine/javascript'\n\nlet highlighterPromise: Promise<HighlighterCore> | null = null\n\n// Default languages to load\nconst defaultLangs = [\n import('shiki/langs/python.mjs'),\n import('shiki/langs/javascript.mjs'),\n import('shiki/langs/typescript.mjs'),\n import('shiki/langs/tsx.mjs'),\n import('shiki/langs/jsx.mjs'),\n import('shiki/langs/bash.mjs'),\n import('shiki/langs/shellscript.mjs'),\n import('shiki/langs/json.mjs'),\n import('shiki/langs/html.mjs'),\n import('shiki/langs/css.mjs'),\n import('shiki/langs/yaml.mjs'),\n import('shiki/langs/toml.mjs'),\n import('shiki/langs/markdown.mjs'),\n]\n\n// Default theme\nconst defaultTheme = import('shiki/themes/github-dark-dimmed.mjs')\n\n/**\n * Get or create a Shiki highlighter instance.\n * Uses a singleton pattern to avoid creating multiple highlighters.\n */\nexport function getHighlighter(): Promise<HighlighterCore> {\n if (!highlighterPromise) {\n highlighterPromise = createHighlighterCore({\n themes: [defaultTheme],\n langs: defaultLangs,\n engine: createJavaScriptRegexEngine(),\n })\n }\n return highlighterPromise\n}\n\n/**\n * Configure the highlighter with custom themes and languages.\n * Must be called before getHighlighter() is first called.\n */\nexport function configureHighlighter(options: {\n theme?: Promise<any>\n langs?: Promise<any>[]\n}): void {\n if (highlighterPromise) {\n console.warn('configureHighlighter called after highlighter was created')\n return\n }\n\n highlighterPromise = createHighlighterCore({\n themes: [options.theme ?? defaultTheme],\n langs: options.langs ?? defaultLangs,\n engine: createJavaScriptRegexEngine(),\n })\n}\n","import { useState, useRef, useEffect } from 'react'\nimport { router } from '@inertiajs/react'\nimport { cn } from '../lib/utils'\nimport type { DocSetMeta } from '../types'\n\ninterface DocSetSelectorProps {\n docSets: DocSetMeta[]\n currentDocSet: string\n className?: string\n}\n\n// Chevron icon with up/down indicators like Fumadocs\nconst ChevronUpDownIcon = ({ className }: { className?: string }) => (\n <svg\n className={className}\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M5 6l3-3 3 3M5 10l3 3 3-3\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n)\n\n// Checkmark for selected state\nconst CheckIcon = ({ className }: { className?: string }) => (\n <svg\n className={className}\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M3.5 8.5l3 3 6-6.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.75\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n)\n\n// Default package/docs icon when no iconUrl is provided\nconst PackageIcon = ({ className }: { className?: string }) => (\n <svg\n className={className}\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M10 2L17 6v8l-7 4-7-4V6l7-4z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M10 10v8M10 10l7-4M10 10L3 6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n)\n\n/**\n * Dropdown selector for switching between documentation sets.\n * Inspired by Fumadocs design - clean and minimal.\n */\nexport function DocSetSelector({ docSets, currentDocSet, className }: DocSetSelectorProps) {\n const [isOpen, setIsOpen] = useState(false)\n const dropdownRef = useRef<HTMLDivElement>(null)\n\n const current = docSets.find((ds) => ds.slug === currentDocSet) || docSets[0]\n\n // Close dropdown when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {\n setIsOpen(false)\n }\n }\n\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside)\n return () => document.removeEventListener('mousedown', handleClickOutside)\n }\n }, [isOpen])\n\n // Close on escape key\n useEffect(() => {\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key === 'Escape') setIsOpen(false)\n }\n\n if (isOpen) {\n document.addEventListener('keydown', handleEscape)\n return () => document.removeEventListener('keydown', handleEscape)\n }\n }, [isOpen])\n\n const handleSelect = (docSet: DocSetMeta) => {\n setIsOpen(false)\n if (docSet.slug !== currentDocSet) {\n router.visit(`${docSet.prefix}/`)\n }\n }\n\n return (\n <div className={cn('relative', className)} ref={dropdownRef}>\n {/* Trigger Button - Clean, flat design like Fumadocs */}\n <button\n onClick={() => setIsOpen(!isOpen)}\n className={cn(\n 'w-full flex items-center gap-2.5 px-3 py-2',\n 'bg-gray-100/80 dark:bg-white/5',\n 'border border-gray-200 dark:border-white/10',\n 'rounded-lg',\n 'hover:bg-gray-200/80 dark:hover:bg-white/10',\n 'transition-colors duration-150',\n 'focus:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50'\n )}\n aria-label=\"Select documentation\"\n aria-expanded={isOpen}\n aria-haspopup=\"listbox\"\n >\n {/* Icon */}\n <div className=\"flex-shrink-0 w-5 h-5 flex items-center justify-center text-gray-600 dark:text-gray-400\">\n {current.icon ? (\n <span className=\"text-base leading-none\">{current.icon}</span>\n ) : current.iconUrl ? (\n <img src={current.iconUrl} alt=\"\" className=\"w-5 h-5\" />\n ) : (\n <PackageIcon className=\"w-5 h-5\" />\n )}\n </div>\n\n {/* Text */}\n <span className=\"flex-1 text-left text-sm font-medium text-gray-900 dark:text-white truncate\">\n {current.name}\n </span>\n\n {/* Chevron */}\n <ChevronUpDownIcon className=\"flex-shrink-0 w-4 h-4 text-gray-400 dark:text-gray-500\" />\n </button>\n\n {/* Dropdown Menu */}\n <div\n className={cn(\n 'absolute left-0 right-0 mt-1.5',\n 'py-1',\n 'bg-white dark:bg-[#1a1a1a]',\n 'border border-gray-200 dark:border-white/10',\n 'rounded-lg',\n 'shadow-lg shadow-black/5 dark:shadow-black/30',\n 'z-50',\n 'transition-all duration-150 ease-out origin-top',\n isOpen\n ? 'opacity-100 scale-100'\n : 'opacity-0 scale-95 pointer-events-none'\n )}\n role=\"listbox\"\n aria-label=\"Select documentation set\"\n >\n {docSets.map((docSet) => {\n const isSelected = docSet.slug === currentDocSet\n\n return (\n <button\n key={docSet.slug || '_root'}\n onClick={() => handleSelect(docSet)}\n className={cn(\n 'w-full flex items-center gap-2.5 px-3 py-2',\n 'transition-colors duration-100',\n 'focus:outline-none',\n isSelected\n ? 'bg-primary-50 dark:bg-primary-500/10'\n : 'hover:bg-gray-50 dark:hover:bg-white/5'\n )}\n role=\"option\"\n aria-selected={isSelected}\n >\n {/* Icon */}\n <div className={cn(\n 'flex-shrink-0 w-5 h-5 flex items-center justify-center',\n isSelected\n ? 'text-primary-600 dark:text-primary-400'\n : 'text-gray-500 dark:text-gray-400'\n )}>\n {docSet.icon ? (\n <span className=\"text-base leading-none\">{docSet.icon}</span>\n ) : docSet.iconUrl ? (\n <img src={docSet.iconUrl} alt=\"\" className=\"w-5 h-5\" />\n ) : (\n <PackageIcon className=\"w-5 h-5\" />\n )}\n </div>\n\n {/* Text Content */}\n <div className=\"flex-1 text-left min-w-0\">\n <div\n className={cn(\n 'text-sm font-medium truncate',\n isSelected\n ? 'text-primary-700 dark:text-primary-300'\n : 'text-gray-900 dark:text-white'\n )}\n >\n {docSet.name}\n </div>\n {docSet.description && (\n <div className={cn(\n 'text-xs truncate',\n isSelected\n ? 'text-primary-600/70 dark:text-primary-400/70'\n : 'text-gray-500 dark:text-gray-400'\n )}>\n {docSet.description}\n </div>\n )}\n </div>\n\n {/* Checkmark indicator */}\n {isSelected && (\n <CheckIcon className=\"flex-shrink-0 w-4 h-4 text-primary-600 dark:text-primary-400\" />\n )}\n </button>\n )\n })}\n </div>\n </div>\n )\n}\n","import { Head, Link, usePage } from '@inertiajs/react'\nimport { useState } from 'react'\nimport { Sidebar } from './Sidebar'\nimport { TableOfContents } from './TableOfContents'\nimport { ThemeToggle } from './ThemeToggle'\nimport { useTheme } from './ThemeProvider'\nimport type { DocsLayoutProps, SharedProps } from '../types'\n\nexport function MobileMenuButton({ onClick, isOpen }: { onClick: () => void; isOpen: boolean }) {\n return (\n <button\n onClick={onClick}\n className=\"inline-flex items-center justify-center p-2 -ml-2 text-gray-700 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-400 lg:hidden transition-colors\"\n aria-expanded={isOpen}\n >\n <span className=\"sr-only\">{isOpen ? 'Close menu' : 'Open menu'}</span>\n {isOpen ? (\n <svg className=\"h-6 w-6\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n ) : (\n <svg className=\"h-6 w-6\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 6h16M4 12h16M4 18h16\" />\n </svg>\n )}\n </button>\n )\n}\n\nfunction GitHubIcon() {\n return (\n <svg className=\"w-6 h-6\" fill=\"currentColor\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path\n fillRule=\"evenodd\"\n d=\"M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z\"\n clipRule=\"evenodd\"\n />\n </svg>\n )\n}\n\n/**\n * Full-featured documentation layout with sidebar, mobile menu, and header.\n */\nexport function DocsLayout({\n children,\n title,\n description: _description,\n logo,\n logoInverted,\n logoUrl: propLogoUrl,\n logoInvertedUrl: propLogoInvertedUrl,\n githubUrl: propGithubUrl,\n navLinks: propNavLinks,\n header,\n headerHeight = 64,\n footer,\n toc,\n}: DocsLayoutProps) {\n const sharedProps = usePage<{ props: SharedProps }>().props as unknown as SharedProps\n const { nav, currentPath, docSets, currentDocSet } = sharedProps\n const [mobileMenuOpen, setMobileMenuOpen] = useState(false)\n const { resolvedTheme } = useTheme()\n\n // Merge props - component props take precedence over shared props from Python\n const logoUrl = propLogoUrl ?? sharedProps.logoUrl\n const logoInvertedUrl = propLogoInvertedUrl ?? sharedProps.logoInvertedUrl\n const githubUrl = propGithubUrl ?? sharedProps.githubUrl\n const navLinks = propNavLinks ?? sharedProps.navLinks ?? []\n\n // Determine which logo to display in header (prefer inverted/dark version)\n const headerLogo = logoInverted || logo || (logoInvertedUrl ? (\n <img src={logoInvertedUrl} alt=\"Logo\" className=\"h-8\" />\n ) : logoUrl ? (\n <img src={logoUrl} alt=\"Logo\" className=\"h-8\" />\n ) : null)\n\n // Determine which logo to display in footer (theme-aware)\n const footerLogoUrl = sharedProps.footerLogoUrl || logoUrl\n const footerLogoInvertedUrl = sharedProps.footerLogoInvertedUrl || logoInvertedUrl\n const currentFooterLogoUrl = resolvedTheme === 'dark' ? (footerLogoInvertedUrl || footerLogoUrl) : footerLogoUrl\n const footerLogo = logo || (currentFooterLogoUrl ? (\n <img src={currentFooterLogoUrl} alt=\"Logo\" className=\"h-6\" />\n ) : null)\n\n return (\n <div className=\"min-h-screen bg-white dark:bg-[#0f0f0f] flex flex-col transition-colors duration-200\">\n <Head title={title} />\n\n {/* Fixed navigation */}\n {(typeof header === 'function'\n ? header({ mobileMenuOpen, toggleMobileMenu: () => setMobileMenuOpen(!mobileMenuOpen) })\n : header) || (\n <nav className=\"fixed w-full z-50 bg-white/95 dark:bg-[#0f0f0f]/95 backdrop-blur-sm border-b border-gray-200 dark:border-gray-800 transition-colors\">\n <div className=\"px-4 lg:px-10\">\n <div className=\"flex justify-between h-16 items-center\">\n <div className=\"flex items-center gap-2\">\n <MobileMenuButton onClick={() => setMobileMenuOpen(!mobileMenuOpen)} isOpen={mobileMenuOpen} />\n {headerLogo ? (\n <Link href=\"/\" className=\"flex items-center\">\n {headerLogo}\n </Link>\n ) : (\n <Link href=\"/\" className=\"font-bold text-lg text-gray-900 dark:text-white\">\n Docs\n </Link>\n )}\n </div>\n <div className=\"flex items-center gap-6\">\n <div className=\"-mr-2\">\n <ThemeToggle size=\"sm\" />\n </div>\n\n {navLinks.map((link) => (\n <Link\n key={link.href}\n href={link.href}\n className=\"hidden sm:block text-gray-700 dark:text-gray-300 font-medium hover:text-primary-600 dark:hover:text-primary-400 transition-colors\"\n >\n {link.label}\n </Link>\n ))}\n {githubUrl && (\n <a\n href={githubUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-gray-700 dark:text-gray-300 hover:text-primary-600 dark:hover:text-primary-400 transition-colors\"\n >\n <GitHubIcon />\n </a>\n )}\n </div>\n </div>\n </div>\n </nav>\n )}\n\n {/* Mobile sidebar */}\n {mobileMenuOpen && (\n <div className=\"fixed inset-0 z-40 lg:hidden\">\n <div className=\"fixed inset-0 bg-black/50 dark:bg-black/70\" onClick={() => setMobileMenuOpen(false)} />\n <div\n className=\"fixed inset-y-0 left-0 w-72 overflow-y-auto bg-white dark:bg-[#0f0f0f] px-4 py-6 border-r border-gray-200 dark:border-gray-800 transition-colors\"\n style={{ paddingTop: headerHeight + 16 }}\n >\n <Sidebar nav={nav} currentPath={currentPath} docSets={docSets} currentDocSet={currentDocSet} />\n </div>\n </div>\n )}\n\n {/* Main content area */}\n <div className=\"bg-white dark:bg-[#0f0f0f] w-full flex-1 transition-colors\" style={{ paddingTop: headerHeight }}>\n <div className=\"flex\">\n {/* Desktop sidebar - fixed width */}\n <aside\n className=\"hidden lg:block w-[24rem] shrink-0 border-r border-gray-200 dark:border-gray-800 transition-colors\"\n style={{ minHeight: `calc(100vh - ${headerHeight}px)` }}\n >\n <nav\n className=\"sticky px-4 lg:px-10 py-6 overflow-y-auto\"\n style={{ top: headerHeight, maxHeight: `calc(100vh - ${headerHeight}px)` }}\n >\n <Sidebar nav={nav} currentPath={currentPath} docSets={docSets} currentDocSet={currentDocSet} />\n </nav>\n </aside>\n\n {/* Right section: content + TOC + footer (not under left sidebar) */}\n <div className=\"flex-1 min-w-0 flex flex-col\">\n <div className=\"flex-1 p-4 lg:px-10 lg:py-6\">\n <div className=\"flex gap-5\">\n {/* Main content */}\n <main className=\"min-w-0 w-full max-w-4xl\">\n <article className=\"prose prose-lg max-w-none prose-headings:font-bold prose-headings:tracking-tight prose-h1:text-3xl prose-h1:mb-4 prose-h2:text-2xl prose-h2:mt-10 first:prose-h2:mt-0 prose-h3:text-xl prose-a:text-primary-600 dark:prose-a:text-primary-400 prose-a:no-underline hover:prose-a:underline prose-code:bg-gray-100 dark:prose-code:bg-gray-800 prose-code:px-1.5 prose-code:py-0.5 prose-code:rounded prose-code:before:content-none prose-code:after:content-none dark:prose-headings:text-white dark:prose-strong:text-white dark:text-gray-300\">\n {children}\n </article>\n </main>\n\n {/* Table of Contents - desktop only */}\n {toc && toc.length > 0 && (\n <aside className=\"hidden xl:block w-56 shrink-0 transition-colors\">\n <TableOfContents items={toc} className=\"sticky overflow-y-auto\"\n style={{ top: headerHeight + 24, maxHeight: `calc(100vh - ${headerHeight + 24}px)` }} />\n </aside>\n )}\n </div>\n </div>\n\n {/* Footer - spans from after sidebar to right edge */}\n {footer || (\n <footer className=\"border-t border-gray-200 dark:border-gray-800 py-8 px-4 lg:px-10 transition-colors\">\n <div className=\"flex flex-col md:flex-row justify-between items-center gap-6\">\n {footerLogo && <Link href=\"/\">{footerLogo}</Link>}\n <div className=\"flex gap-8 text-sm text-gray-600 dark:text-gray-400\">\n {navLinks.map((link) => (\n <Link key={link.href} href={link.href} className=\"hover:text-black dark:hover:text-white transition-colors\">\n {link.label}\n </Link>\n ))}\n {githubUrl && (\n <a\n href={githubUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"hover:text-black dark:hover:text-white transition-colors\"\n >\n GitHub\n </a>\n )}\n </div>\n </div>\n </footer>\n )}\n </div>\n </div>\n </div>\n </div>\n )\n}\n","import { Link } from '@inertiajs/react'\nimport { cn } from '../lib/utils'\nimport { DocSetSelector } from './DocSetSelector'\nimport type { SidebarProps } from '../types'\n\n/**\n * Documentation sidebar with section-based navigation.\n * In multi-docs mode, includes a dropdown selector at the top.\n */\nexport function Sidebar({ nav, currentPath, className, docSets, currentDocSet }: SidebarProps) {\n return (\n <nav className={cn('space-y-6', className)}>\n {/* Doc Set Selector - only shown in multi-docs mode */}\n {docSets && docSets.length > 1 && (\n <DocSetSelector docSets={docSets} currentDocSet={currentDocSet ?? ''} className=\"mb-6\" />\n )}\n\n {/* Navigation Sections */}\n <div className=\"space-y-8\">\n {nav.map((section) => (\n <div key={section.title}>\n <h3 className=\"mb-3 text-sm font-mono uppercase tracking-widest text-gray-500 dark:text-gray-400\">\n {section.title}\n </h3>\n <ul className=\"space-y-1.5 border-l-2 border-gray-200 dark:border-gray-700\">\n {section.items.map((item) => (\n <li key={item.href}>\n <Link\n href={item.href}\n className={cn(\n 'block border-l-2 py-1 pl-4 text-[17px] leading-snug transition-colors -ml-0.5',\n currentPath === item.href\n ? 'border-primary-500 text-gray-900 dark:text-white font-bold'\n : 'border-transparent text-gray-600 dark:text-gray-300 hover:border-primary-300 dark:hover:border-primary-400 hover:text-gray-900 dark:hover:text-white'\n )}\n >\n {item.title}\n </Link>\n </li>\n ))}\n </ul>\n </div>\n ))}\n </div>\n </nav>\n )\n}\n","import { useEffect, useState, useRef } from 'react'\nimport type { TableOfContentsProps } from '../types'\n\n/**\n * Table of contents component with scroll spy functionality.\n * Displays \"ON THIS PAGE\" sidebar with heading links.\n */\nexport function TableOfContents({ items, className = '', ...props }: TableOfContentsProps) {\n const [activeId, setActiveId] = useState<string>(() => {\n // Initialize with hash from URL if present\n if (typeof window !== 'undefined' && window.location.hash) {\n return window.location.hash.slice(1)\n }\n return ''\n })\n\n // Track if we're currently scrolling from a click\n const isClickScrolling = useRef(false)\n\n useEffect(() => {\n if (items.length === 0) return\n\n // Listen for hash changes\n const handleHashChange = () => {\n const hash = window.location.hash.slice(1)\n if (hash) {\n setActiveId(hash)\n }\n }\n window.addEventListener('hashchange', handleHashChange)\n\n // Scroll-based detection - find the heading closest to top of viewport\n const handleScroll = () => {\n // Skip if we're in the middle of a click-initiated scroll\n if (isClickScrolling.current) return\n\n const headerOffset = 100\n let currentId = ''\n\n // Check if we're at the bottom of the page\n const scrollTop = window.scrollY\n const scrollHeight = document.documentElement.scrollHeight\n const clientHeight = document.documentElement.clientHeight\n const isAtBottom = scrollTop + clientHeight >= scrollHeight - 50\n\n if (isAtBottom) {\n // At bottom of page - find the last heading that's visible in viewport\n for (let i = items.length - 1; i >= 0; i--) {\n const element = document.getElementById(items[i].id)\n if (element) {\n const rect = element.getBoundingClientRect()\n // If this heading is visible in the viewport\n if (rect.top < clientHeight && rect.bottom > 0) {\n currentId = items[i].id\n break\n }\n }\n }\n } else {\n // Normal scroll detection\n for (const item of items) {\n const element = document.getElementById(item.id)\n if (element) {\n const rect = element.getBoundingClientRect()\n // If the heading is at or above the threshold, it's the current section\n if (rect.top <= headerOffset) {\n currentId = item.id\n } else {\n // Once we find a heading below the threshold, stop\n break\n }\n }\n }\n }\n\n // If no heading is above threshold, use the first one\n if (!currentId && items.length > 0) {\n currentId = items[0].id\n }\n\n if (currentId) {\n setActiveId(currentId)\n }\n }\n\n // Throttle scroll handler\n let ticking = false\n const scrollListener = () => {\n if (!ticking) {\n requestAnimationFrame(() => {\n handleScroll()\n ticking = false\n })\n ticking = true\n }\n }\n\n window.addEventListener('scroll', scrollListener, { passive: true })\n\n // Initial check (only if no hash in URL)\n if (!window.location.hash) {\n handleScroll()\n }\n\n return () => {\n window.removeEventListener('scroll', scrollListener)\n window.removeEventListener('hashchange', handleHashChange)\n }\n }, [items])\n\n const handleClick = (e: React.MouseEvent<HTMLAnchorElement>, id: string) => {\n e.preventDefault()\n const element = document.getElementById(id)\n if (element) {\n // Mark that we're click-scrolling to prevent scroll handler from overriding\n isClickScrolling.current = true\n setActiveId(id)\n\n const top = element.getBoundingClientRect().top + window.scrollY - 80\n window.scrollTo({ top, behavior: 'smooth' })\n\n // Update URL hash without jumping\n window.history.pushState(null, '', `#${id}`)\n\n // Re-enable scroll detection after scroll settles\n // Use requestAnimationFrame loop to wait for scroll to stabilize\n let lastScrollY = window.scrollY\n let stableCount = 0\n const checkScrollEnd = () => {\n if (window.scrollY === lastScrollY) {\n stableCount++\n if (stableCount >= 5) {\n // Scroll has been stable for ~5 frames, animation is done\n isClickScrolling.current = false\n return\n }\n } else {\n stableCount = 0\n lastScrollY = window.scrollY\n }\n requestAnimationFrame(checkScrollEnd)\n }\n requestAnimationFrame(checkScrollEnd)\n }\n }\n\n if (items.length === 0) {\n return null\n }\n\n return (\n <nav className={className} {...props}>\n <h3 className=\"mb-3 text-sm font-mono uppercase tracking-widest text-gray-500 dark:text-gray-400\">\n On this page\n </h3>\n <ul className=\"space-y-1.5 border-l-2 border-gray-200 dark:border-gray-700\">\n {items.map((item) => {\n const isActive = activeId === item.id\n const indent = item.level === 3 ? 'pl-6' : 'pl-4'\n\n return (\n <li key={item.id}>\n <a\n href={`#${item.id}`}\n onClick={(e) => handleClick(e, item.id)}\n className={`block border-l-2 py-1 ${indent} -ml-0.5 text-base leading-snug transition-colors ${\n isActive\n ? 'border-primary-500 text-gray-900 dark:text-white font-bold'\n : 'border-transparent text-gray-600 dark:text-gray-300 hover:border-primary-300 dark:hover:border-primary-400 hover:text-gray-900 dark:hover:text-white'\n }`}\n >\n {item.text}\n </a>\n </li>\n )\n })}\n </ul>\n </nav>\n )\n}\n","import { useState, useRef, useEffect } from 'react'\nimport { useTheme, type Theme } from './ThemeProvider'\nimport { cn } from '../lib/utils'\n\ninterface ThemeToggleProps {\n /** Additional CSS classes */\n className?: string\n /** Size variant */\n size?: 'sm' | 'md' | 'lg'\n}\n\n// Refined sun icon with balanced proportions\nconst SunIcon = ({ className }: { className?: string }) => (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"12\" cy=\"12\" r=\"4\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M12 5V3M12 21v-2M5 12H3m18 0h-2M7.05 7.05 5.636 5.636m12.728 12.728L16.95 16.95M7.05 16.95l-1.414 1.414M18.364 5.636 16.95 7.05\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n)\n\n// Refined moon icon - elegant crescent\nconst MoonIcon = ({ className }: { className?: string }) => (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M21.752 15.002A9.718 9.718 0 0 1 18 15.75c-5.385 0-9.75-4.365-9.75-9.75 0-1.33.266-2.597.748-3.752A9.753 9.753 0 0 0 3 11.25C3 16.635 7.365 21 12.75 21a9.753 9.753 0 0 0 9.002-5.998Z\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n)\n\n// Refined monitor icon - clean display shape\nconst MonitorIcon = ({ className }: { className?: string }) => (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"2\" y=\"3\" width=\"20\" height=\"14\" rx=\"2\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M8 21h8m-4-4v4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n)\n\nconst themeOptions: { value: Theme; label: string; icon: typeof SunIcon }[] = [\n { value: 'light', label: 'Light', icon: SunIcon },\n { value: 'dark', label: 'Dark', icon: MoonIcon },\n { value: 'system', label: 'System', icon: MonitorIcon },\n]\n\n/**\n * Theme toggle dropdown with Light, Dark, and System options.\n * Refined design with smooth animations and premium feel.\n */\nexport function ThemeToggle({ className, size = 'md' }: ThemeToggleProps) {\n const { theme, resolvedTheme, setTheme } = useTheme()\n const [isOpen, setIsOpen] = useState(false)\n const dropdownRef = useRef<HTMLDivElement>(null)\n\n // Close dropdown when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {\n setIsOpen(false)\n }\n }\n\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside)\n return () => document.removeEventListener('mousedown', handleClickOutside)\n }\n }, [isOpen])\n\n // Close on escape key\n useEffect(() => {\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key === 'Escape') setIsOpen(false)\n }\n\n if (isOpen) {\n document.addEventListener('keydown', handleEscape)\n return () => document.removeEventListener('keydown', handleEscape)\n }\n }, [isOpen])\n\n const iconSizes = {\n sm: 'w-[18px] h-[18px]',\n md: 'w-5 h-5',\n lg: 'w-[22px] h-[22px]',\n }\n\n return (\n <div className=\"relative\" ref={dropdownRef}>\n {/* Toggle Button */}\n <button\n onClick={() => setIsOpen(!isOpen)}\n className={cn(\n 'relative inline-flex items-center justify-center',\n 'rounded-full p-4',\n 'text-gray-500 hover:text-gray-900 dark:text-gray-400 dark:hover:text-white',\n 'hover:bg-gray-100 dark:hover:bg-white/10',\n 'transition-all duration-200 ease-out',\n 'focus:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50 focus-visible:ring-offset-2 dark:focus-visible:ring-offset-[#0f0f0f]',\n iconSizes[size],\n className\n )}\n aria-label=\"Toggle theme\"\n aria-expanded={isOpen}\n aria-haspopup=\"listbox\"\n >\n {/* Sun icon - visible in light mode */}\n <SunIcon\n className={cn(\n iconSizes[size],\n 'absolute inset-0 m-auto transition-all duration-300 ease-out',\n resolvedTheme === 'light'\n ? 'rotate-0 scale-100 opacity-100'\n : 'rotate-90 scale-75 opacity-0'\n )}\n />\n\n {/* Moon icon - visible in dark mode */}\n <MoonIcon\n className={cn(\n iconSizes[size],\n 'absolute inset-0 m-auto transition-all duration-300 ease-out',\n resolvedTheme === 'dark'\n ? 'rotate-0 scale-100 opacity-100'\n : '-rotate-90 scale-75 opacity-0'\n )}\n />\n </button>\n\n {/* Dropdown Menu */}\n <div\n className={cn(\n 'absolute right-0 mt-2 min-w-[140px]',\n 'p-1',\n 'bg-white dark:bg-[#171717]',\n 'border border-gray-200 dark:border-[#262626]',\n 'rounded-xl',\n 'shadow-lg shadow-black/5 dark:shadow-black/40',\n 'z-50',\n 'transition-all duration-200 ease-out origin-top-right',\n isOpen\n ? 'opacity-100 scale-100 translate-y-0'\n : 'opacity-0 scale-95 -translate-y-1 pointer-events-none'\n )}\n role=\"listbox\"\n aria-label=\"Select theme\"\n >\n {themeOptions.map((option, index) => {\n const Icon = option.icon\n const isSelected = theme === option.value\n\n return (\n <button\n key={option.value}\n onClick={() => {\n setTheme(option.value)\n setIsOpen(false)\n }}\n className={cn(\n 'w-full flex items-center gap-2.5 px-3 py-2',\n 'rounded-lg',\n 'text-[13px] font-medium',\n 'transition-all duration-150 ease-out',\n 'focus:outline-none',\n isSelected\n ? 'text-gray-900 dark:text-white bg-gray-100 dark:bg-[#262626]'\n : 'text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-white hover:bg-gray-50 dark:hover:bg-[#1f1f1f]'\n )}\n role=\"option\"\n aria-selected={isSelected}\n style={{\n animationDelay: isOpen ? `${index * 25}ms` : '0ms'\n }}\n >\n <Icon className={cn(\n 'w-4 h-4 flex-shrink-0',\n 'transition-transform duration-150',\n isSelected ? 'scale-110' : 'scale-100'\n )} />\n <span className=\"flex-1 text-left\">{option.label}</span>\n <div className={cn(\n 'w-1.5 h-1.5 rounded-full',\n 'transition-all duration-200',\n isSelected\n ? 'bg-primary-500 scale-100 opacity-100'\n : 'bg-transparent scale-0 opacity-0'\n )} />\n </button>\n )\n })}\n </div>\n </div>\n )\n}\n","import { createContext, useContext, useEffect, useState, type ReactNode } from 'react'\n\nexport type Theme = 'light' | 'dark' | 'system'\nexport type ResolvedTheme = 'light' | 'dark'\n\ninterface ThemeContextValue {\n theme: Theme\n resolvedTheme: ResolvedTheme\n setTheme: (theme: Theme) => void\n}\n\nconst ThemeContext = createContext<ThemeContextValue | null>(null)\n\nconst STORAGE_KEY = 'cross-docs-theme'\n\nfunction getSystemTheme(): ResolvedTheme {\n if (typeof window === 'undefined') return 'light'\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'\n}\n\nfunction getStoredTheme(): Theme | null {\n if (typeof window === 'undefined') return null\n const stored = localStorage.getItem(STORAGE_KEY)\n if (stored === 'light' || stored === 'dark' || stored === 'system') {\n return stored\n }\n return null\n}\n\ninterface ThemeProviderProps {\n children: ReactNode\n /** Default theme if no preference is stored. Defaults to 'system'. */\n defaultTheme?: Theme\n /** Force a specific theme, ignoring user preference */\n forcedTheme?: ResolvedTheme\n}\n\nexport function ThemeProvider({\n children,\n defaultTheme = 'system',\n forcedTheme,\n}: ThemeProviderProps) {\n const [theme, setThemeState] = useState<Theme>(() => {\n // During SSR, use defaultTheme\n if (typeof window === 'undefined') return defaultTheme\n return getStoredTheme() ?? defaultTheme\n })\n\n const [resolvedTheme, setResolvedTheme] = useState<ResolvedTheme>(() => {\n if (forcedTheme) return forcedTheme\n if (typeof window === 'undefined') return 'light'\n if (theme === 'system') return getSystemTheme()\n return theme\n })\n\n // Update resolved theme when theme changes or system preference changes\n useEffect(() => {\n if (forcedTheme) {\n setResolvedTheme(forcedTheme)\n return\n }\n\n const updateResolvedTheme = () => {\n if (theme === 'system') {\n setResolvedTheme(getSystemTheme())\n } else {\n setResolvedTheme(theme)\n }\n }\n\n updateResolvedTheme()\n\n // Listen for system preference changes\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)')\n const handleChange = () => {\n if (theme === 'system') {\n setResolvedTheme(getSystemTheme())\n }\n }\n\n mediaQuery.addEventListener('change', handleChange)\n return () => mediaQuery.removeEventListener('change', handleChange)\n }, [theme, forcedTheme])\n\n // Apply theme class to document\n useEffect(() => {\n const root = document.documentElement\n root.classList.remove('light', 'dark')\n root.classList.add(resolvedTheme)\n }, [resolvedTheme])\n\n const setTheme = (newTheme: Theme) => {\n setThemeState(newTheme)\n localStorage.setItem(STORAGE_KEY, newTheme)\n }\n\n return (\n <ThemeContext.Provider value={{ theme, resolvedTheme, setTheme }}>\n {children}\n </ThemeContext.Provider>\n )\n}\n\nexport function useTheme(): ThemeContextValue {\n const context = useContext(ThemeContext)\n if (!context) {\n throw new Error('useTheme must be used within a ThemeProvider')\n }\n return context\n}\n\n/**\n * Script to prevent flash of unstyled content (FOUC) during page load.\n * Include this in your HTML <head> before any stylesheets.\n */\nexport const themeInitScript = `\n(function() {\n try {\n var stored = localStorage.getItem('${STORAGE_KEY}');\n var theme = stored === 'light' || stored === 'dark' ? stored :\n (stored === 'system' || !stored) && window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n document.documentElement.classList.add(theme);\n } catch (e) {}\n})();\n`.trim()\n","import ReactMarkdown from 'react-markdown'\nimport remarkGfm from 'remark-gfm'\nimport remarkEmoji from 'remark-emoji'\nimport { remarkAlert } from 'remark-github-blockquote-alert'\nimport rehypeRaw from 'rehype-raw'\nimport { CodeBlock } from './CodeBlock'\nimport type { MarkdownProps } from '../types'\n\n/**\n * Convert heading text to URL-safe slug.\n * Must match the Python slugify function in markdown.py.\n */\nfunction slugify(text: string): string {\n return text\n .toLowerCase()\n .replace(/[\\s_]+/g, '-')\n .replace(/[^a-z0-9-]/g, '')\n .replace(/-+/g, '-')\n .replace(/^-|-$/g, '')\n}\n\n/**\n * Extract text content from React children.\n */\nfunction getTextContent(children: React.ReactNode): string {\n if (typeof children === 'string') return children\n if (typeof children === 'number') return String(children)\n if (Array.isArray(children)) return children.map(getTextContent).join('')\n if (children && typeof children === 'object' && 'props' in children) {\n return getTextContent((children as React.ReactElement).props.children)\n }\n return ''\n}\n\n/**\n * Markdown renderer with syntax highlighting and GFM support.\n */\nexport function Markdown({ content, components }: MarkdownProps) {\n // Create lowercase mappings for custom components\n // HTML tag names are case-insensitive, so <TerminalExample> becomes <terminalexample>\n const lowercaseComponents = components\n ? Object.entries(components).reduce(\n (acc, [name, Component]) => {\n acc[name.toLowerCase()] = Component\n return acc\n },\n {} as Record<string, React.ComponentType<any>>\n )\n : {}\n\n return (\n <ReactMarkdown\n remarkPlugins={[remarkGfm, remarkEmoji, remarkAlert]}\n rehypePlugins={[rehypeRaw]}\n components={{\n ...lowercaseComponents,\n // Override pre to avoid double wrapping with CodeBlock\n pre({ children }) {\n return <>{children}</>\n },\n // Custom code block rendering with syntax highlighting\n code({ node, className, children, ...props }) {\n const match = /language-(\\w+)/.exec(className || '')\n const isInline = !match && !className\n\n if (isInline) {\n return (\n <code\n className=\"rounded bg-gray-100 px-1.5 py-0.5 text-sm font-medium text-gray-800 dark:bg-gray-800 dark:text-gray-200\"\n {...props}\n >\n {children}\n </code>\n )\n }\n\n // Parse meta string from the code fence (e.g., ```python title=\"app.py\" showLineNumbers)\n const meta = (node?.data?.meta as string) || ''\n const titleMatch = /title=\"([^\"]+)\"/.exec(meta)\n const filename = titleMatch ? titleMatch[1] : undefined\n const showLineNumbers = meta.includes('showLineNumbers')\n\n return (\n <CodeBlock\n code={String(children).replace(/\\n$/, '')}\n language={match ? match[1] : 'text'}\n filename={filename}\n showLineNumbers={showLineNumbers}\n />\n )\n },\n // Custom link styling\n a({ href, children, node, ...props }) {\n const isExternal = href?.startsWith('http')\n return (\n <a\n href={href}\n className=\"text-primary-600 hover:text-primary-700 dark:text-primary-400 dark:hover:text-primary-300\"\n {...(isExternal ? { target: '_blank', rel: 'noopener noreferrer' } : {})}\n {...props}\n >\n {children}\n </a>\n )\n },\n // Tables\n table({ children }) {\n return (\n <div className=\"overflow-x-auto\">\n <table className=\"w-full text-left text-sm\">{children}</table>\n </div>\n )\n },\n th({ children }) {\n return (\n <th className=\"border-b border-gray-200 bg-gray-50 px-4 py-2 font-semibold dark:border-gray-700 dark:bg-gray-800\">\n {children}\n </th>\n )\n },\n td({ children }) {\n return (\n <td className=\"border-b border-gray-200 px-4 py-2 dark:border-gray-700\">\n {children}\n </td>\n )\n },\n // Headings with anchor IDs for TOC\n h2({ children }) {\n const text = getTextContent(children)\n const id = slugify(text)\n return (\n <h2 id={id}>\n {children}\n </h2>\n )\n },\n h3({ children }) {\n const text = getTextContent(children)\n const id = slugify(text)\n return (\n <h3 id={id}>\n {children}\n </h3>\n )\n },\n // Task list checkbox styling\n input({ type, checked, disabled, ...props }) {\n if (type === 'checkbox') {\n return (\n <input\n type=\"checkbox\"\n checked={checked}\n disabled={disabled}\n className=\"mr-2 h-4 w-4 rounded border-gray-300 text-primary-600 focus:ring-primary-500 dark:border-gray-600 dark:bg-gray-700\"\n {...props}\n />\n )\n }\n return <input type={type} checked={checked} disabled={disabled} {...props} />\n },\n // Footnote section styling\n section({ className, children, ...props }) {\n if (className?.includes('footnotes')) {\n return (\n <section\n className=\"mt-8 border-t border-gray-200 pt-6 text-sm text-gray-600 dark:border-gray-700 dark:text-gray-400\"\n {...props}\n >\n {children}\n </section>\n )\n }\n return <section className={className} {...props}>{children}</section>\n },\n }}\n >\n {content}\n </ReactMarkdown>\n )\n}\n","import React, { createContext, useContext } from 'react'\n\ninterface ComponentsContextValue {\n components?: Record<string, React.ComponentType<any>>\n}\n\nconst ComponentsContext = createContext<ComponentsContextValue>({})\n\nexport function ComponentsProvider({\n children,\n components,\n}: {\n children: React.ReactNode\n components?: Record<string, React.ComponentType<any>>\n}) {\n return (\n <ComponentsContext.Provider value={{ components }}>\n {children}\n </ComponentsContext.Provider>\n )\n}\n\nexport function useComponents() {\n return useContext(ComponentsContext)\n}\n","import { DocsLayout } from './DocsLayout'\nimport { Markdown } from './Markdown'\nimport type { DocContent, DocsLayoutProps } from '../types'\nimport { useComponents } from '../context/ComponentsContext'\n\ninterface DocsPageProps extends Omit<DocsLayoutProps, 'children' | 'title'> {\n content: DocContent\n}\n\n/**\n * Default documentation page component.\n * Renders markdown content within the DocsLayout.\n */\nexport function DocsPage({ content, ...layoutProps }: DocsPageProps) {\n const { components } = useComponents()\n\n return (\n <DocsLayout\n title={content?.title ?? ''}\n description={content?.description}\n toc={content?.toc}\n {...layoutProps}\n >\n <Markdown content={content?.body ?? ''} components={components} />\n </DocsLayout>\n )\n}\n","import { useState, useCallback } from 'react'\n\ninterface ConfettiParticle {\n id: number\n x: number\n y: number\n angle: number\n velocity: number\n spin: number\n scale: number\n}\n\nexport function EmojiConfetti({ children, emoji }: { children: React.ReactNode; emoji: string }) {\n const [particles, setParticles] = useState<ConfettiParticle[]>([])\n const [isActive, setIsActive] = useState(false)\n\n const triggerBurst = useCallback(() => {\n if (isActive) return\n setIsActive(true)\n\n const newParticles: ConfettiParticle[] = []\n const count = 15\n\n for (let i = 0; i < count; i++) {\n // Burst in all directions from center\n const angle = (i / count) * Math.PI * 2 + (Math.random() - 0.5) * 0.5\n newParticles.push({\n id: Date.now() + i,\n x: 50, // Start from center\n y: 50,\n angle,\n velocity: 80 + Math.random() * 60, // Distance to travel\n spin: (Math.random() - 0.5) * 720, // Random rotation\n scale: 0.7 + Math.random() * 0.6,\n })\n }\n setParticles(newParticles)\n\n setTimeout(() => {\n setParticles([])\n setIsActive(false)\n }, 1000)\n }, [isActive])\n\n return (\n <span\n className=\"relative inline-block\"\n onMouseEnter={triggerBurst}\n >\n {children}\n <span className=\"absolute inset-0 pointer-events-none overflow-visible\">\n {particles.map((p) => {\n const endX = p.x + Math.cos(p.angle) * p.velocity\n const endY = p.y + Math.sin(p.angle) * p.velocity\n\n return (\n <span\n key={p.id}\n className=\"absolute\"\n style={{\n left: '50%',\n top: '50%',\n fontSize: `${p.scale}rem`,\n transform: 'translate(-50%, -50%)',\n animation: `emojiConfettiBurst 0.8s cubic-bezier(0.25, 0.46, 0.45, 0.94) forwards`,\n '--end-x': `${(endX - 50)}px`,\n '--end-y': `${(endY - 50)}px`,\n '--spin': `${p.spin}deg`,\n } as React.CSSProperties}\n >\n {emoji}\n </span>\n )\n })}\n </span>\n </span>\n )\n}\n","import { Head, Link } from '@inertiajs/react'\nimport { createContext, useContext, useState, type ReactNode } from 'react'\nimport { ThemeToggle } from './ThemeToggle'\nimport { useTheme } from './ThemeProvider'\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface HomeFeature {\n title: string\n description: ReactNode\n}\n\nexport interface HomePageContextValue {\n title: string\n tagline: string\n description: string\n installCommand: string\n ctaText: string\n ctaHref: string\n features: HomeFeature[]\n logoUrl?: string\n heroLogoUrl?: string\n footerLogoUrl?: string\n footerLogoInvertedUrl?: string\n githubUrl?: string\n navLinks: Array<{ label: string; href: string }>\n}\n\nexport interface HomePageProps extends Omit<HomePageContextValue, 'navLinks'> {\n navLinks?: Array<{ label: string; href: string }>\n children?: ReactNode\n}\n\nexport interface HomeHeaderProps {\n renderLogo?: () => ReactNode\n}\n\nexport interface HomeFeaturesProps {\n renderFeature?: (\n feature: HomeFeature,\n index: number,\n DefaultFeature: typeof HomeFeatureItem\n ) => ReactNode\n}\n\nexport interface HomeFeatureItemProps {\n feature: HomeFeature\n index: number\n totalFeatures: number\n}\n\n// ============================================================================\n// Context\n// ============================================================================\n\nconst HomePageContext = createContext<HomePageContextValue | null>(null)\n\nfunction useHomePage(): HomePageContextValue {\n const context = useContext(HomePageContext)\n if (!context) {\n throw new Error('HomePage sub-components must be used within <HomePage>')\n }\n return context\n}\n\n// ============================================================================\n// Utility Components\n// ============================================================================\n\nfunction InstallCommand({ command }: { command: string }) {\n const [copied, setCopied] = useState(false)\n\n const copyToClipboard = async () => {\n await navigator.clipboard.writeText(command)\n setCopied(true)\n setTimeout(() => setCopied(false), 2000)\n }\n\n return (\n <button\n onClick={copyToClipboard}\n className=\"group relative flex items-center bg-gray-900 dark:bg-white border border-gray-900 dark:border-white px-4 h-14 font-mono text-sm text-white dark:text-gray-900 hover:bg-white dark:hover:bg-gray-900 hover:text-gray-900 dark:hover:text-white transition-colors cursor-pointer\"\n >\n <span className=\"text-primary-500 dark:text-primary-600 mr-2\">$</span>\n <span>{command}</span>\n <svg\n className={`ml-4 w-4 h-4 transition ${copied ? 'text-green-400' : 'opacity-50 group-hover:opacity-100'}`}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\"\n />\n </svg>\n <span\n className={`absolute -top-8 left-1/2 -translate-x-1/2 bg-gray-900 dark:bg-white text-white dark:text-gray-900 text-xs py-1 px-2 rounded transition-opacity duration-300 whitespace-nowrap ${\n copied ? 'opacity-100' : 'opacity-0'\n }`}\n >\n Copied!\n </span>\n </button>\n )\n}\n\nfunction GitHubIcon() {\n return (\n <svg className=\"w-6 h-6\" fill=\"currentColor\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path\n fillRule=\"evenodd\"\n d=\"M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z\"\n clipRule=\"evenodd\"\n />\n </svg>\n )\n}\n\n// ============================================================================\n// Sub-Components\n// ============================================================================\n\n/**\n * Default logo component that renders an image or text.\n */\nfunction DefaultLogo() {\n const { title, logoUrl } = useHomePage()\n\n if (logoUrl) {\n return (\n <Link href=\"/\" className=\"flex items-center\">\n <img src={logoUrl} alt={title} className=\"h-8\" />\n </Link>\n )\n }\n\n return (\n <Link href=\"/\" className=\"font-bold text-lg text-gray-900 dark:text-white\">\n {title}\n </Link>\n )\n}\n\n/**\n * Navigation header for the homepage.\n * Accepts an optional renderLogo prop for custom logo rendering.\n */\nexport function HomeHeader({ renderLogo }: HomeHeaderProps = {}) {\n const { navLinks, githubUrl } = useHomePage()\n\n return (\n <nav className=\"fixed w-full z-50 bg-white/95 dark:bg-[#0f0f0f]/95 backdrop-blur-sm border-b border-gray-200 dark:border-gray-800 transition-colors\">\n <div className=\"px-4 lg:px-10\">\n <div className=\"flex justify-between h-16 items-center\">\n {renderLogo ? renderLogo() : <DefaultLogo />}\n <div className=\"flex items-center gap-6\">\n <div className=\"-mr-2\">\n <ThemeToggle size=\"sm\" />\n </div>\n\n {navLinks.map((link) => (\n <Link\n key={link.href}\n href={link.href}\n className=\"hidden sm:block text-gray-700 dark:text-gray-300 font-medium hover:text-primary-600 dark:hover:text-primary-400 transition-colors\"\n >\n {link.label}\n </Link>\n ))}\n {githubUrl && (\n <a\n href={githubUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-gray-700 dark:text-gray-300 hover:text-primary-600 dark:hover:text-primary-400 transition-colors\"\n >\n <GitHubIcon />\n </a>\n )}\n </div>\n </div>\n </div>\n </nav>\n )\n}\n\n/**\n * Hero section with title, tagline, description, and CTA.\n * If heroLogoUrl is provided, displays an image instead of text title.\n */\nexport function HomeHero() {\n const { title, tagline, description, ctaText, ctaHref, installCommand, heroLogoUrl } = useHomePage()\n\n return (\n <section className=\"pt-16\">\n <div className=\"px-4 lg:px-10 py-16 lg:py-24\">\n <div className=\"max-w-4xl\">\n <div className=\"mb-4 text-sm font-mono uppercase tracking-widest text-gray-500 dark:text-gray-400\">\n {tagline}\n </div>\n {heroLogoUrl ? (\n <h1 className=\"mb-6 lg:mb-8\">\n <img\n src={heroLogoUrl}\n alt={title}\n className=\"h-auto w-auto max-w-[580px]\"\n />\n </h1>\n ) : (\n <h1 className=\"text-5xl lg:text-7xl font-bold tracking-tight mb-6 text-gray-900 dark:text-white\">\n {title}\n </h1>\n )}\n <p className=\"text-xl lg:text-2xl text-gray-600 dark:text-gray-300 max-w-2xl leading-relaxed mb-8\">\n {description}\n </p>\n\n <div className=\"flex flex-col sm:flex-row gap-3\">\n <Link\n href={ctaHref}\n className=\"inline-flex items-center justify-center px-8 h-14 bg-gray-900 dark:bg-white text-white dark:text-gray-900 font-bold text-lg hover:bg-primary-500 dark:hover:bg-primary-500 dark:hover:text-white transition-colors border border-gray-900 dark:border-white hover:border-primary-500 dark:hover:border-primary-500\"\n >\n {ctaText}\n </Link>\n {installCommand && <InstallCommand command={installCommand} />}\n </div>\n </div>\n </div>\n </section>\n )\n}\n\n/**\n * Single feature item within the features grid.\n */\nexport function HomeFeatureItem({ feature, index, totalFeatures }: HomeFeatureItemProps) {\n return (\n <div\n className={`p-4 lg:p-10 border-b sm:border-b border-gray-200 dark:border-gray-800 ${\n index % 2 === 0 ? 'sm:border-r' : ''\n } ${index >= totalFeatures - 2 ? 'sm:border-b-0' : ''} ${\n index === totalFeatures - 1 && totalFeatures % 2 === 1 ? 'border-b-0' : ''\n } transition-colors`}\n >\n <div className=\"text-5xl font-bold text-primary-500 dark:text-primary-400 mb-4\">\n {String(index + 1).padStart(2, '0')}\n </div>\n <h3 className=\"text-xl font-bold mb-2 text-gray-900 dark:text-white\">{feature.title}</h3>\n <p className=\"text-gray-600 dark:text-gray-300\">{feature.description}</p>\n </div>\n )\n}\n\n/**\n * Features section with customizable feature rendering.\n */\nexport function HomeFeatures({ renderFeature }: HomeFeaturesProps = {}) {\n const { title, features } = useHomePage()\n\n if (features.length === 0) {\n return null\n }\n\n return (\n <section className=\"border-t border-gray-200 dark:border-gray-800 transition-colors\">\n <div className=\"grid grid-cols-12\">\n <div className=\"col-span-12 lg:col-span-4 p-4 lg:p-10 border-b lg:border-b-0 lg:border-r border-gray-200 dark:border-gray-800 transition-colors\">\n <div className=\"text-sm font-mono uppercase tracking-widest text-gray-500 dark:text-gray-400 mb-4\">\n Features\n </div>\n <h2 className=\"text-4xl lg:text-5xl font-bold tracking-tight text-gray-900 dark:text-white\">\n Why {title}?\n </h2>\n </div>\n\n <div className=\"col-span-12 lg:col-span-8 grid grid-cols-1 sm:grid-cols-2\">\n {features.map((feature, index) =>\n renderFeature ? (\n <div key={index}>\n {renderFeature(feature, index, HomeFeatureItem)}\n </div>\n ) : (\n <HomeFeatureItem\n key={index}\n feature={feature}\n index={index}\n totalFeatures={features.length}\n />\n )\n )}\n </div>\n </div>\n </section>\n )\n}\n\n/**\n * Call-to-action section.\n */\nexport function HomeCTA() {\n const { ctaHref } = useHomePage()\n\n return (\n <section className=\"border-t border-gray-200 dark:border-gray-800 transition-colors\">\n <div className=\"grid grid-cols-12 items-center\">\n <div className=\"col-span-12 lg:col-span-8 p-4 lg:p-10\">\n <h2 className=\"text-4xl lg:text-6xl font-bold tracking-tight mb-4 text-gray-900 dark:text-white\">\n Ready to start?\n </h2>\n <p className=\"text-xl text-gray-600 dark:text-gray-300 mb-8 max-w-2xl\">\n Get up and running in minutes. Check out our documentation to learn more.\n </p>\n <Link\n href={ctaHref}\n className=\"inline-flex items-center justify-center px-8 py-4 bg-primary-500 text-white font-bold text-lg hover:bg-gray-900 dark:hover:bg-white dark:hover:text-gray-900 transition-colors border border-primary-500 hover:border-gray-900 dark:hover:border-white\"\n >\n Read the Docs\n </Link>\n </div>\n <Link\n href={ctaHref}\n className=\"col-span-12 lg:col-span-4 h-full bg-primary-500 hidden lg:flex items-center justify-center p-4 lg:p-10 hover:bg-gray-900 dark:hover:bg-white transition-colors min-h-[200px] group\"\n >\n <div className=\"text-white group-hover:text-white dark:group-hover:text-gray-900 text-8xl font-bold transition-colors\">&rarr;</div>\n </Link>\n </div>\n </section>\n )\n}\n\n/**\n * Footer section.\n */\nexport function HomeFooter() {\n const { title, logoUrl, footerLogoUrl, footerLogoInvertedUrl, navLinks, githubUrl } = useHomePage()\n const { resolvedTheme } = useTheme()\n\n // Select appropriate logo based on theme\n const currentLogoUrl = resolvedTheme === 'dark'\n ? (footerLogoInvertedUrl || footerLogoUrl || logoUrl)\n : (footerLogoUrl || logoUrl)\n\n return (\n <footer className=\"border-t border-gray-200 dark:border-gray-800 py-8 bg-white dark:bg-[#0f0f0f] transition-colors\">\n <div className=\"px-4 lg:px-10 flex flex-col md:flex-row justify-between items-center gap-6\">\n {currentLogoUrl && (\n <Link href=\"/\">\n <img src={currentLogoUrl} alt={title} className=\"h-6\" />\n </Link>\n )}\n <div className=\"flex gap-8 text-sm text-gray-600 dark:text-gray-300\">\n {navLinks.map((link) => (\n <Link key={link.href} href={link.href} className=\"hover:text-black dark:hover:text-white transition-colors\">\n {link.label}\n </Link>\n ))}\n {githubUrl && (\n <a\n href={githubUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"hover:text-black dark:hover:text-white transition-colors\"\n >\n GitHub\n </a>\n )}\n </div>\n </div>\n </footer>\n )\n}\n\n/**\n * Spacer that fills remaining vertical space.\n * Shows a top border (via gradient) only when it has height.\n */\nfunction HomeSpacer() {\n return (\n <div\n className=\"grow dark:hidden\"\n style={{ backgroundImage: 'linear-gradient(rgb(229, 231, 235) 1px, transparent 1px)' }}\n />\n )\n}\n\nfunction HomeSpacerDark() {\n return (\n <div\n className=\"grow hidden dark:block\"\n style={{ backgroundImage: 'linear-gradient(rgb(38, 38, 38) 1px, transparent 1px)' }}\n />\n )\n}\n\nfunction DefaultHomeLayout() {\n return (\n <>\n <HomeHeader />\n <HomeHero />\n <HomeFeatures />\n <HomeCTA />\n <HomeSpacer />\n <HomeSpacerDark />\n <HomeFooter />\n </>\n )\n}\n\n// ============================================================================\n// Main Component\n// ============================================================================\n\n/**\n * Homepage component for documentation sites.\n *\n * Can be used in two ways:\n *\n * 1. Simple - everything from config:\n * ```tsx\n * <HomePage {...props} />\n * ```\n *\n * 2. Composable - full control via children:\n * ```tsx\n * <HomePage {...props}>\n * <HomePage.Header />\n * <HomePage.Hero />\n * <MyCustomSection />\n * <HomePage.Features renderFeature={(feature, i, Default) => (\n * <Default feature={feature} index={i} totalFeatures={4} />\n * )} />\n * <HomePage.CTA />\n * <HomePage.Footer />\n * </HomePage>\n * ```\n */\nexport function HomePage({\n children,\n navLinks = [],\n ...props\n}: HomePageProps) {\n const contextValue: HomePageContextValue = {\n ...props,\n navLinks,\n }\n\n return (\n <HomePageContext.Provider value={contextValue}>\n <div className=\"min-h-screen bg-white dark:bg-[#0f0f0f] flex flex-col transition-colors duration-200\">\n <Head title={props.title} />\n {children || <DefaultHomeLayout />}\n </div>\n </HomePageContext.Provider>\n )\n}\n\n// Attach sub-components for compound component pattern\nHomePage.Header = HomeHeader\nHomePage.Hero = HomeHero\nHomePage.Features = HomeFeatures\nHomePage.Feature = HomeFeatureItem\nHomePage.CTA = HomeCTA\nHomePage.Footer = HomeFooter\n","import { createInertiaApp } from '@inertiajs/react'\nimport { createRoot, hydrateRoot } from 'react-dom/client'\nimport type { DocsAppConfig } from './types'\nimport { ComponentsProvider } from './context/ComponentsContext'\nimport { ThemeProvider } from './components/ThemeProvider'\n\n/**\n * Create and mount an Inertia.js documentation app.\n *\n * @example\n * ```tsx\n * import { createDocsApp, DocsPage } from '@usecross/docs'\n *\n * createDocsApp({\n * pages: {\n * 'docs/DocsPage': DocsPage,\n * },\n * title: (title) => `${title} - My Docs`,\n * })\n * ```\n */\nexport function createDocsApp(config: DocsAppConfig): void {\n const { pages, title, components } = config\n\n // Disable scroll restoration on initial page load\n if (typeof window !== 'undefined') {\n window.history.scrollRestoration = 'manual'\n window.scrollTo(0, 0)\n }\n\n createInertiaApp({\n title: title ?? ((pageTitle) => (pageTitle ? `${pageTitle}` : 'Documentation')),\n resolve: (name) => {\n const page = pages[name]\n if (!page) {\n throw new Error(`Page component \"${name}\" not found`)\n }\n return page\n },\n setup({ el, App, props }) {\n const appElement = (\n <ThemeProvider>\n <ComponentsProvider components={components}>\n <App {...props} />\n </ComponentsProvider>\n </ThemeProvider>\n )\n\n if (el.hasChildNodes()) {\n hydrateRoot(el, appElement)\n } else {\n createRoot(el).render(appElement)\n }\n },\n })\n}\n"],"mappings":"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","names":["useState","useEffect","jsx","jsxs","useState","useEffect","Link","useState","jsx","jsxs","useEffect","useState","useRef","jsx","jsxs","useState","useRef","useEffect","useEffect","useState","jsx","defaultTheme","jsx","jsxs","useState","useRef","useEffect","jsx","jsxs","useState","Link","jsx","createContext","useContext","jsx","jsx","useState","jsx","jsxs","Head","Link","createContext","useContext","useState","Fragment","jsx","jsxs","createContext","useContext","useState","GitHubIcon","Link","Head","jsx"]}
1
+ {"version":3,"sources":["../src/components/CodeBlock.tsx","../src/lib/utils.ts","../src/lib/shiki.ts","../src/components/DocSetSelector.tsx","../src/components/DocsLayout.tsx","../src/components/Sidebar.tsx","../src/components/TableOfContents.tsx","../src/components/ThemeToggle.tsx","../src/components/ThemeProvider.tsx","../src/components/Markdown.tsx","../src/context/ComponentsContext.tsx","../src/components/DocsPage.tsx","../src/components/EmojiConfetti.tsx","../src/components/HomePage.tsx","../src/components/api/APILayout.tsx","../src/components/api/ModuleDoc.tsx","../src/components/api/Docstring.tsx","../src/components/api/ClassDoc.tsx","../src/components/api/Signature.tsx","../src/components/api/CodeSpan.tsx","../src/components/api/ParameterTable.tsx","../src/components/api/FunctionDoc.tsx","../src/components/api/TableOfContents.tsx","../src/components/api/APIPage.tsx","../src/components/api/Breadcrumb.tsx","../src/app.tsx"],"sourcesContent":["import { useEffect, useState } from 'react'\nimport { cn } from '../lib/utils'\nimport { getHighlighter } from '../lib/shiki'\nimport type { CodeBlockProps } from '../types'\n\n/**\n * Syntax-highlighted code block component using Shiki.\n */\nexport function CodeBlock({\n code,\n language = 'python',\n filename,\n showLineNumbers = false,\n theme = 'github-dark-dimmed',\n className,\n}: CodeBlockProps) {\n const [html, setHtml] = useState<string>('')\n const [copied, setCopied] = useState(false)\n\n useEffect(() => {\n async function highlight() {\n const highlighter = await getHighlighter()\n const langs = highlighter.getLoadedLanguages()\n const lang = langs.includes(language) ? language : 'text'\n const highlighted = highlighter.codeToHtml(code.trim(), {\n lang,\n theme,\n })\n setHtml(highlighted)\n }\n highlight()\n }, [code, language, theme])\n\n const copyToClipboard = async () => {\n await navigator.clipboard.writeText(code.trim())\n setCopied(true)\n setTimeout(() => setCopied(false), 2000)\n }\n\n return (\n <div className={cn('group relative overflow-hidden rounded-lg bg-[#24292f] not-prose mb-6', className)}>\n {filename && (\n <div className=\"flex items-center gap-2 border-b border-slate-700 bg-slate-900 px-4 py-2 text-sm text-slate-400\">\n <svg className=\"h-4 w-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\"\n />\n </svg>\n {filename}\n </div>\n )}\n <button\n onClick={copyToClipboard}\n className=\"absolute right-2 top-2 z-10 rounded-md bg-slate-700/50 px-2 py-1 text-xs text-slate-400 opacity-0 transition-opacity hover:bg-slate-600 hover:text-white group-hover:opacity-100\"\n >\n {copied ? 'Copied!' : 'Copy'}\n </button>\n {html ? (\n <div\n className={cn(\n 'overflow-x-auto text-sm [&_pre]:m-0 [&_pre]:bg-transparent [&_code]:p-4',\n showLineNumbers && '[&_code]:grid [&_code]:grid-cols-[auto_1fr]'\n )}\n dangerouslySetInnerHTML={{ __html: html }}\n />\n ) : (\n <pre className=\"shiki overflow-x-auto m-0 bg-transparent\">\n <code className=\"block p-4 text-sm leading-relaxed text-gray-300\">{code.trim()}</code>\n </pre>\n )}\n </div>\n )\n}\n\n/**\n * Simple inline code component.\n */\nexport function InlineCode({ children }: { children: React.ReactNode }) {\n return (\n <code className=\"rounded bg-slate-100 px-1.5 py-0.5 text-sm font-medium text-slate-800\">\n {children}\n </code>\n )\n}\n","import { clsx, type ClassValue } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\n\n/**\n * Merge Tailwind CSS classes with clsx\n */\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","import { createHighlighterCore, type HighlighterCore } from 'shiki/core'\nimport { createJavaScriptRegexEngine } from 'shiki/engine/javascript'\n\nlet highlighterPromise: Promise<HighlighterCore> | null = null\n\n// Default languages to load\nconst defaultLangs = [\n import('shiki/langs/python.mjs'),\n import('shiki/langs/javascript.mjs'),\n import('shiki/langs/typescript.mjs'),\n import('shiki/langs/tsx.mjs'),\n import('shiki/langs/jsx.mjs'),\n import('shiki/langs/bash.mjs'),\n import('shiki/langs/shellscript.mjs'),\n import('shiki/langs/json.mjs'),\n import('shiki/langs/html.mjs'),\n import('shiki/langs/css.mjs'),\n import('shiki/langs/yaml.mjs'),\n import('shiki/langs/toml.mjs'),\n import('shiki/langs/markdown.mjs'),\n]\n\n// Default theme\nconst defaultTheme = import('shiki/themes/github-dark-dimmed.mjs')\n\n/**\n * Get or create a Shiki highlighter instance.\n * Uses a singleton pattern to avoid creating multiple highlighters.\n */\nexport function getHighlighter(): Promise<HighlighterCore> {\n if (!highlighterPromise) {\n highlighterPromise = createHighlighterCore({\n themes: [defaultTheme],\n langs: defaultLangs,\n engine: createJavaScriptRegexEngine(),\n })\n }\n return highlighterPromise\n}\n\n/**\n * Configure the highlighter with custom themes and languages.\n * Must be called before getHighlighter() is first called.\n */\nexport function configureHighlighter(options: {\n theme?: Promise<any>\n langs?: Promise<any>[]\n}): void {\n if (highlighterPromise) {\n console.warn('configureHighlighter called after highlighter was created')\n return\n }\n\n highlighterPromise = createHighlighterCore({\n themes: [options.theme ?? defaultTheme],\n langs: options.langs ?? defaultLangs,\n engine: createJavaScriptRegexEngine(),\n })\n}\n","import { useState, useRef, useEffect } from 'react'\nimport { router } from '@inertiajs/react'\nimport { cn } from '../lib/utils'\nimport type { DocSetMeta } from '../types'\n\ninterface DocSetSelectorProps {\n docSets: DocSetMeta[]\n currentDocSet: string\n className?: string\n}\n\n// Chevron icon with up/down indicators like Fumadocs\nconst ChevronUpDownIcon = ({ className }: { className?: string }) => (\n <svg\n className={className}\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M5 6l3-3 3 3M5 10l3 3 3-3\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n)\n\n// Checkmark for selected state\nconst CheckIcon = ({ className }: { className?: string }) => (\n <svg\n className={className}\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M3.5 8.5l3 3 6-6.5\"\n stroke=\"currentColor\"\n strokeWidth=\"1.75\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n)\n\n// Default package/docs icon when no iconUrl is provided\nconst PackageIcon = ({ className }: { className?: string }) => (\n <svg\n className={className}\n viewBox=\"0 0 20 20\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M10 2L17 6v8l-7 4-7-4V6l7-4z\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M10 10v8M10 10l7-4M10 10L3 6\"\n stroke=\"currentColor\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n)\n\n/**\n * Dropdown selector for switching between documentation sets.\n * Inspired by Fumadocs design - clean and minimal.\n */\nexport function DocSetSelector({ docSets, currentDocSet, className }: DocSetSelectorProps) {\n const [isOpen, setIsOpen] = useState(false)\n const dropdownRef = useRef<HTMLDivElement>(null)\n\n const current = docSets.find((ds) => ds.slug === currentDocSet) || docSets[0]\n\n // Close dropdown when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {\n setIsOpen(false)\n }\n }\n\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside)\n return () => document.removeEventListener('mousedown', handleClickOutside)\n }\n }, [isOpen])\n\n // Close on escape key\n useEffect(() => {\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key === 'Escape') setIsOpen(false)\n }\n\n if (isOpen) {\n document.addEventListener('keydown', handleEscape)\n return () => document.removeEventListener('keydown', handleEscape)\n }\n }, [isOpen])\n\n const handleSelect = (docSet: DocSetMeta) => {\n setIsOpen(false)\n if (docSet.slug !== currentDocSet) {\n router.visit(`${docSet.prefix}/`)\n }\n }\n\n return (\n <div className={cn('relative', className)} ref={dropdownRef}>\n {/* Trigger Button - Clean, flat design like Fumadocs */}\n <button\n onClick={() => setIsOpen(!isOpen)}\n className={cn(\n 'w-full flex items-center gap-2.5 px-3 py-2',\n 'bg-gray-100/80 dark:bg-white/5',\n 'border border-gray-200 dark:border-white/10',\n 'rounded-lg',\n 'hover:bg-gray-200/80 dark:hover:bg-white/10',\n 'transition-colors duration-150',\n 'focus:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50'\n )}\n aria-label=\"Select documentation\"\n aria-expanded={isOpen}\n aria-haspopup=\"listbox\"\n >\n {/* Icon */}\n <div className=\"flex-shrink-0 w-5 h-5 flex items-center justify-center text-gray-600 dark:text-gray-400\">\n {current.icon ? (\n <span className=\"text-base leading-none\">{current.icon}</span>\n ) : current.iconUrl ? (\n <img src={current.iconUrl} alt=\"\" className=\"w-5 h-5\" />\n ) : (\n <PackageIcon className=\"w-5 h-5\" />\n )}\n </div>\n\n {/* Text */}\n <span className=\"flex-1 text-left text-sm font-medium text-gray-900 dark:text-white truncate\">\n {current.name}\n </span>\n\n {/* Chevron */}\n <ChevronUpDownIcon className=\"flex-shrink-0 w-4 h-4 text-gray-400 dark:text-gray-500\" />\n </button>\n\n {/* Dropdown Menu */}\n <div\n className={cn(\n 'absolute left-0 right-0 mt-1.5',\n 'py-1',\n 'bg-white dark:bg-[#1a1a1a]',\n 'border border-gray-200 dark:border-white/10',\n 'rounded-lg',\n 'shadow-lg shadow-black/5 dark:shadow-black/30',\n 'z-50',\n 'transition-all duration-150 ease-out origin-top',\n isOpen\n ? 'opacity-100 scale-100'\n : 'opacity-0 scale-95 pointer-events-none'\n )}\n role=\"listbox\"\n aria-label=\"Select documentation set\"\n >\n {docSets.map((docSet) => {\n const isSelected = docSet.slug === currentDocSet\n\n return (\n <button\n key={docSet.slug || '_root'}\n onClick={() => handleSelect(docSet)}\n className={cn(\n 'w-full flex items-center gap-2.5 px-3 py-2',\n 'transition-colors duration-100',\n 'focus:outline-none',\n isSelected\n ? 'bg-primary-50 dark:bg-primary-500/10'\n : 'hover:bg-gray-50 dark:hover:bg-white/5'\n )}\n role=\"option\"\n aria-selected={isSelected}\n >\n {/* Icon */}\n <div className={cn(\n 'flex-shrink-0 w-5 h-5 flex items-center justify-center',\n isSelected\n ? 'text-primary-600 dark:text-primary-400'\n : 'text-gray-500 dark:text-gray-400'\n )}>\n {docSet.icon ? (\n <span className=\"text-base leading-none\">{docSet.icon}</span>\n ) : docSet.iconUrl ? (\n <img src={docSet.iconUrl} alt=\"\" className=\"w-5 h-5\" />\n ) : (\n <PackageIcon className=\"w-5 h-5\" />\n )}\n </div>\n\n {/* Text Content */}\n <div className=\"flex-1 text-left min-w-0\">\n <div\n className={cn(\n 'text-sm font-medium truncate',\n isSelected\n ? 'text-primary-700 dark:text-primary-300'\n : 'text-gray-900 dark:text-white'\n )}\n >\n {docSet.name}\n </div>\n {docSet.description && (\n <div className={cn(\n 'text-xs truncate',\n isSelected\n ? 'text-primary-600/70 dark:text-primary-400/70'\n : 'text-gray-500 dark:text-gray-400'\n )}>\n {docSet.description}\n </div>\n )}\n </div>\n\n {/* Checkmark indicator */}\n {isSelected && (\n <CheckIcon className=\"flex-shrink-0 w-4 h-4 text-primary-600 dark:text-primary-400\" />\n )}\n </button>\n )\n })}\n </div>\n </div>\n )\n}\n","import { Head, Link, usePage } from '@inertiajs/react'\nimport { useState } from 'react'\nimport { Sidebar } from './Sidebar'\nimport { TableOfContents } from './TableOfContents'\nimport { ThemeToggle } from './ThemeToggle'\nimport { useTheme } from './ThemeProvider'\nimport type { DocsLayoutProps, SharedProps } from '../types'\n\nexport function MobileMenuButton({ onClick, isOpen }: { onClick: () => void; isOpen: boolean }) {\n return (\n <button\n onClick={onClick}\n className=\"inline-flex items-center justify-center p-2 -ml-2 text-gray-700 hover:text-primary-500 dark:text-gray-300 dark:hover:text-primary-400 lg:hidden transition-colors\"\n aria-expanded={isOpen}\n >\n <span className=\"sr-only\">{isOpen ? 'Close menu' : 'Open menu'}</span>\n {isOpen ? (\n <svg className=\"h-6 w-6\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n ) : (\n <svg className=\"h-6 w-6\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 6h16M4 12h16M4 18h16\" />\n </svg>\n )}\n </button>\n )\n}\n\nfunction GitHubIcon() {\n return (\n <svg className=\"w-6 h-6\" fill=\"currentColor\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path\n fillRule=\"evenodd\"\n d=\"M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z\"\n clipRule=\"evenodd\"\n />\n </svg>\n )\n}\n\n/**\n * Full-featured documentation layout with sidebar, mobile menu, and header.\n */\nexport function DocsLayout({\n children,\n title,\n description: _description,\n logo,\n logoInverted,\n logoUrl: propLogoUrl,\n logoInvertedUrl: propLogoInvertedUrl,\n githubUrl: propGithubUrl,\n navLinks: propNavLinks,\n header,\n headerHeight = 64,\n footer,\n toc,\n}: DocsLayoutProps) {\n const sharedProps = usePage<{ props: SharedProps }>().props as unknown as SharedProps\n const { nav, currentPath, docSets, currentDocSet } = sharedProps\n const [mobileMenuOpen, setMobileMenuOpen] = useState(false)\n const { resolvedTheme } = useTheme()\n\n // Merge props - component props take precedence over shared props from Python\n const logoUrl = propLogoUrl ?? sharedProps.logoUrl\n const logoInvertedUrl = propLogoInvertedUrl ?? sharedProps.logoInvertedUrl\n const githubUrl = propGithubUrl ?? sharedProps.githubUrl\n const navLinks = propNavLinks ?? sharedProps.navLinks ?? []\n\n // Determine which logo to display in header (prefer inverted/dark version)\n const headerLogo = logoInverted || logo || (logoInvertedUrl ? (\n <img src={logoInvertedUrl} alt=\"Logo\" className=\"h-8\" />\n ) : logoUrl ? (\n <img src={logoUrl} alt=\"Logo\" className=\"h-8\" />\n ) : null)\n\n // Determine which logo to display in footer (theme-aware)\n const footerLogoUrl = sharedProps.footerLogoUrl || logoUrl\n const footerLogoInvertedUrl = sharedProps.footerLogoInvertedUrl || logoInvertedUrl\n const currentFooterLogoUrl = resolvedTheme === 'dark' ? (footerLogoInvertedUrl || footerLogoUrl) : footerLogoUrl\n const footerLogo = logo || (currentFooterLogoUrl ? (\n <img src={currentFooterLogoUrl} alt=\"Logo\" className=\"h-6\" />\n ) : null)\n\n return (\n <div className=\"min-h-screen bg-white dark:bg-[#0f0f0f] flex flex-col transition-colors duration-200\">\n <Head title={title} />\n\n {/* Fixed navigation */}\n {(typeof header === 'function'\n ? header({ mobileMenuOpen, toggleMobileMenu: () => setMobileMenuOpen(!mobileMenuOpen) })\n : header) || (\n <nav className=\"fixed w-full z-50 bg-white/95 dark:bg-[#0f0f0f]/95 backdrop-blur-sm border-b border-gray-200 dark:border-gray-800 transition-colors\">\n <div className=\"px-4 lg:px-10\">\n <div className=\"flex justify-between h-16 items-center\">\n <div className=\"flex items-center gap-2\">\n <MobileMenuButton onClick={() => setMobileMenuOpen(!mobileMenuOpen)} isOpen={mobileMenuOpen} />\n {headerLogo ? (\n <Link href=\"/\" className=\"flex items-center\">\n {headerLogo}\n </Link>\n ) : (\n <Link href=\"/\" className=\"font-bold text-lg text-gray-900 dark:text-white\">\n Docs\n </Link>\n )}\n </div>\n <div className=\"flex items-center gap-6\">\n <div className=\"-mr-2\">\n <ThemeToggle size=\"sm\" />\n </div>\n\n {navLinks.map((link) => (\n <Link\n key={link.href}\n href={link.href}\n className=\"hidden sm:block text-gray-700 dark:text-gray-300 font-medium hover:text-primary-600 dark:hover:text-primary-400 transition-colors\"\n >\n {link.label}\n </Link>\n ))}\n {githubUrl && (\n <a\n href={githubUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-gray-700 dark:text-gray-300 hover:text-primary-600 dark:hover:text-primary-400 transition-colors\"\n >\n <GitHubIcon />\n </a>\n )}\n </div>\n </div>\n </div>\n </nav>\n )}\n\n {/* Mobile sidebar */}\n {mobileMenuOpen && (\n <div className=\"fixed inset-0 z-40 lg:hidden\">\n <div className=\"fixed inset-0 bg-black/50 dark:bg-black/70\" onClick={() => setMobileMenuOpen(false)} />\n <div\n className=\"fixed inset-y-0 left-0 w-72 overflow-y-auto bg-white dark:bg-[#0f0f0f] px-4 py-6 border-r border-gray-200 dark:border-gray-800 transition-colors\"\n style={{ paddingTop: headerHeight + 16 }}\n >\n <Sidebar nav={nav} currentPath={currentPath} docSets={docSets} currentDocSet={currentDocSet} />\n </div>\n </div>\n )}\n\n {/* Main content area */}\n <div className=\"bg-white dark:bg-[#0f0f0f] w-full flex-1 transition-colors\" style={{ paddingTop: headerHeight }}>\n <div className=\"flex\">\n {/* Desktop sidebar - fixed width */}\n <aside\n className=\"hidden lg:block w-[24rem] shrink-0 border-r border-gray-200 dark:border-gray-800 transition-colors\"\n style={{ minHeight: `calc(100vh - ${headerHeight}px)` }}\n >\n <nav\n className=\"sticky px-4 lg:px-10 py-6 overflow-y-auto\"\n style={{ top: headerHeight, maxHeight: `calc(100vh - ${headerHeight}px)` }}\n >\n <Sidebar nav={nav} currentPath={currentPath} docSets={docSets} currentDocSet={currentDocSet} />\n </nav>\n </aside>\n\n {/* Right section: content + TOC + footer (not under left sidebar) */}\n <div className=\"flex-1 min-w-0 flex flex-col\">\n <div className=\"flex-1 p-4 lg:px-10 lg:py-6\">\n <div className=\"flex gap-5\">\n {/* Main content */}\n <main className=\"min-w-0 w-full max-w-4xl\">\n <article className=\"prose prose-lg max-w-none prose-headings:font-bold prose-headings:tracking-tight prose-h1:text-3xl prose-h1:mb-4 prose-h2:text-2xl prose-h2:mt-10 first:prose-h2:mt-0 prose-h3:text-xl prose-a:text-primary-600 dark:prose-a:text-primary-400 prose-a:no-underline hover:prose-a:underline prose-code:bg-gray-100 dark:prose-code:bg-gray-800 prose-code:px-1.5 prose-code:py-0.5 prose-code:rounded prose-code:before:content-none prose-code:after:content-none dark:prose-headings:text-white dark:prose-strong:text-white dark:text-gray-300\">\n {children}\n </article>\n </main>\n\n {/* Table of Contents - desktop only */}\n {toc && toc.length > 0 && (\n <aside className=\"hidden xl:block w-56 shrink-0 transition-colors\">\n <TableOfContents items={toc} className=\"sticky overflow-y-auto\"\n style={{ top: headerHeight + 24, maxHeight: `calc(100vh - ${headerHeight + 24}px)` }} />\n </aside>\n )}\n </div>\n </div>\n\n {/* Footer - spans from after sidebar to right edge */}\n {footer || (\n <footer className=\"border-t border-gray-200 dark:border-gray-800 py-8 px-4 lg:px-10 transition-colors\">\n <div className=\"flex flex-col md:flex-row justify-between items-center gap-6\">\n {footerLogo && <Link href=\"/\">{footerLogo}</Link>}\n <div className=\"flex gap-8 text-sm text-gray-600 dark:text-gray-400\">\n {navLinks.map((link) => (\n <Link key={link.href} href={link.href} className=\"hover:text-black dark:hover:text-white transition-colors\">\n {link.label}\n </Link>\n ))}\n {githubUrl && (\n <a\n href={githubUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"hover:text-black dark:hover:text-white transition-colors\"\n >\n GitHub\n </a>\n )}\n </div>\n </div>\n </footer>\n )}\n </div>\n </div>\n </div>\n </div>\n )\n}\n","import { useState } from 'react'\nimport { Link } from '@inertiajs/react'\nimport { cn } from '../lib/utils'\nimport { DocSetSelector } from './DocSetSelector'\nimport type { SidebarProps, NavSection } from '../types'\n\n/**\n * Chevron icon for collapsible sections\n */\nfunction ChevronIcon({ expanded, className }: { expanded: boolean; className?: string }) {\n return (\n <svg\n className={cn('w-4 h-4 transition-transform duration-200', expanded && 'rotate-90', className)}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" />\n </svg>\n )\n}\n\n/**\n * Collapsible navigation section\n */\nfunction CollapsibleSection({\n section,\n currentPath,\n defaultExpanded = true,\n compact = false,\n}: {\n section: NavSection\n currentPath: string\n defaultExpanded?: boolean\n compact?: boolean\n}) {\n // Check if current path is in this section\n const isActive = section.items.some(\n (item) => currentPath === item.href || currentPath + '/' === item.href\n )\n const [expanded, setExpanded] = useState(defaultExpanded || isActive)\n\n return (\n <div>\n <button\n onClick={() => setExpanded(!expanded)}\n className=\"w-full flex items-center justify-between mb-2 group\"\n >\n <h3 className={cn(\n 'text-sm font-mono uppercase tracking-widest text-gray-500 dark:text-gray-400',\n 'group-hover:text-gray-700 dark:group-hover:text-gray-300 transition-colors'\n )}>\n {section.title}\n </h3>\n <ChevronIcon expanded={expanded} className=\"text-gray-400 dark:text-gray-500\" />\n </button>\n {expanded && (\n <ul className={cn(\n 'border-l-2 border-gray-200 dark:border-gray-700',\n compact ? 'space-y-0.5' : 'space-y-1.5'\n )}>\n {section.items.map((item) => (\n <li key={item.href}>\n <Link\n href={item.href}\n className={cn(\n 'block border-l-2 py-1 pl-4 leading-snug transition-colors -ml-0.5',\n compact ? 'text-sm' : 'text-[15px]',\n currentPath === item.href || currentPath + '/' === item.href\n ? 'border-primary-500 text-gray-900 dark:text-white font-semibold'\n : 'border-transparent text-gray-600 dark:text-gray-400 hover:border-primary-300 dark:hover:border-primary-400 hover:text-gray-900 dark:hover:text-white'\n )}\n >\n {item.title}\n </Link>\n </li>\n ))}\n </ul>\n )}\n </div>\n )\n}\n\n/**\n * Static navigation section (non-collapsible)\n */\nfunction StaticSection({\n section,\n currentPath,\n compact = false,\n}: {\n section: NavSection\n currentPath: string\n compact?: boolean\n}) {\n return (\n <div>\n <h3 className=\"mb-3 text-sm font-mono uppercase tracking-widest text-gray-500 dark:text-gray-400\">\n {section.title}\n </h3>\n <ul className={cn(\n 'border-l-2 border-gray-200 dark:border-gray-700',\n compact ? 'space-y-0.5' : 'space-y-1.5'\n )}>\n {section.items.map((item) => (\n <li key={item.href}>\n <Link\n href={item.href}\n className={cn(\n 'block border-l-2 py-1 pl-4 leading-snug transition-colors -ml-0.5',\n compact ? 'text-sm' : 'text-[15px]',\n currentPath === item.href || currentPath + '/' === item.href\n ? 'border-primary-500 text-gray-900 dark:text-white font-semibold'\n : 'border-transparent text-gray-600 dark:text-gray-400 hover:border-primary-300 dark:hover:border-primary-400 hover:text-gray-900 dark:hover:text-white'\n )}\n >\n {item.title}\n </Link>\n </li>\n ))}\n </ul>\n </div>\n )\n}\n\nexport interface ExtendedSidebarProps extends SidebarProps {\n /** Use compact styling (smaller text) */\n compact?: boolean\n /** Make sections collapsible */\n collapsible?: boolean\n /** Collapse sections with more than N items by default */\n collapseThreshold?: number\n}\n\n/**\n * Documentation sidebar with section-based navigation.\n * Supports both docs and API navigation styles.\n */\nexport function Sidebar({\n nav,\n currentPath,\n className,\n docSets,\n currentDocSet,\n compact = false,\n collapsible = false,\n collapseThreshold = 10,\n}: ExtendedSidebarProps) {\n return (\n <nav className={cn('space-y-6', className)}>\n {/* Doc Set Selector - only shown in multi-docs mode */}\n {docSets && docSets.length > 1 && (\n <DocSetSelector docSets={docSets} currentDocSet={currentDocSet ?? ''} className=\"mb-6\" />\n )}\n\n {/* Navigation Sections */}\n <div className={compact ? 'space-y-4' : 'space-y-6'}>\n {nav.map((section) => {\n // Determine if this section should be collapsible\n const shouldCollapse = collapsible && section.items.length > collapseThreshold\n // Check if current path is in this section\n const isActive = section.items.some(\n (item) => currentPath === item.href || currentPath + '/' === item.href\n )\n\n if (shouldCollapse) {\n return (\n <CollapsibleSection\n key={section.title}\n section={section}\n currentPath={currentPath}\n defaultExpanded={isActive}\n compact={compact}\n />\n )\n }\n\n return (\n <StaticSection\n key={section.title}\n section={section}\n currentPath={currentPath}\n compact={compact}\n />\n )\n })}\n </div>\n </nav>\n )\n}\n","import { useEffect, useState, useRef } from 'react'\nimport type { TableOfContentsProps } from '../types'\n\n/**\n * Table of contents component with scroll spy functionality.\n * Displays \"ON THIS PAGE\" sidebar with heading links.\n */\nexport function TableOfContents({ items, className = '', ...props }: TableOfContentsProps) {\n const [activeId, setActiveId] = useState<string>(() => {\n // Initialize with hash from URL if present\n if (typeof window !== 'undefined' && window.location.hash) {\n return window.location.hash.slice(1)\n }\n return ''\n })\n\n // Track if we're currently scrolling from a click\n const isClickScrolling = useRef(false)\n\n useEffect(() => {\n if (items.length === 0) return\n\n // Listen for hash changes\n const handleHashChange = () => {\n const hash = window.location.hash.slice(1)\n if (hash) {\n setActiveId(hash)\n }\n }\n window.addEventListener('hashchange', handleHashChange)\n\n // Scroll-based detection - find the heading closest to top of viewport\n const handleScroll = () => {\n // Skip if we're in the middle of a click-initiated scroll\n if (isClickScrolling.current) return\n\n const headerOffset = 100\n let currentId = ''\n\n // Check if we're at the bottom of the page\n const scrollTop = window.scrollY\n const scrollHeight = document.documentElement.scrollHeight\n const clientHeight = document.documentElement.clientHeight\n const isAtBottom = scrollTop + clientHeight >= scrollHeight - 50\n\n if (isAtBottom) {\n // At bottom of page - find the last heading that's visible in viewport\n for (let i = items.length - 1; i >= 0; i--) {\n const element = document.getElementById(items[i].id)\n if (element) {\n const rect = element.getBoundingClientRect()\n // If this heading is visible in the viewport\n if (rect.top < clientHeight && rect.bottom > 0) {\n currentId = items[i].id\n break\n }\n }\n }\n } else {\n // Normal scroll detection\n for (const item of items) {\n const element = document.getElementById(item.id)\n if (element) {\n const rect = element.getBoundingClientRect()\n // If the heading is at or above the threshold, it's the current section\n if (rect.top <= headerOffset) {\n currentId = item.id\n } else {\n // Once we find a heading below the threshold, stop\n break\n }\n }\n }\n }\n\n // If no heading is above threshold, use the first one\n if (!currentId && items.length > 0) {\n currentId = items[0].id\n }\n\n if (currentId) {\n setActiveId(currentId)\n }\n }\n\n // Throttle scroll handler\n let ticking = false\n const scrollListener = () => {\n if (!ticking) {\n requestAnimationFrame(() => {\n handleScroll()\n ticking = false\n })\n ticking = true\n }\n }\n\n window.addEventListener('scroll', scrollListener, { passive: true })\n\n // Initial check (only if no hash in URL)\n if (!window.location.hash) {\n handleScroll()\n }\n\n return () => {\n window.removeEventListener('scroll', scrollListener)\n window.removeEventListener('hashchange', handleHashChange)\n }\n }, [items])\n\n const handleClick = (e: React.MouseEvent<HTMLAnchorElement>, id: string) => {\n e.preventDefault()\n const element = document.getElementById(id)\n if (element) {\n // Mark that we're click-scrolling to prevent scroll handler from overriding\n isClickScrolling.current = true\n setActiveId(id)\n\n const top = element.getBoundingClientRect().top + window.scrollY - 80\n window.scrollTo({ top, behavior: 'smooth' })\n\n // Update URL hash without jumping\n window.history.pushState(null, '', `#${id}`)\n\n // Re-enable scroll detection after scroll settles\n // Use requestAnimationFrame loop to wait for scroll to stabilize\n let lastScrollY = window.scrollY\n let stableCount = 0\n const checkScrollEnd = () => {\n if (window.scrollY === lastScrollY) {\n stableCount++\n if (stableCount >= 5) {\n // Scroll has been stable for ~5 frames, animation is done\n isClickScrolling.current = false\n return\n }\n } else {\n stableCount = 0\n lastScrollY = window.scrollY\n }\n requestAnimationFrame(checkScrollEnd)\n }\n requestAnimationFrame(checkScrollEnd)\n }\n }\n\n if (items.length === 0) {\n return null\n }\n\n return (\n <nav className={className} {...props}>\n <h3 className=\"mb-3 text-sm font-mono uppercase tracking-widest text-gray-500 dark:text-gray-400\">\n On this page\n </h3>\n <ul className=\"space-y-1.5 border-l-2 border-gray-200 dark:border-gray-700\">\n {items.map((item) => {\n const isActive = activeId === item.id\n const indent = item.level === 3 ? 'pl-6' : 'pl-4'\n\n return (\n <li key={item.id}>\n <a\n href={`#${item.id}`}\n onClick={(e) => handleClick(e, item.id)}\n className={`block border-l-2 py-1 ${indent} -ml-0.5 text-base leading-snug transition-colors ${\n isActive\n ? 'border-primary-500 text-gray-900 dark:text-white font-bold'\n : 'border-transparent text-gray-600 dark:text-gray-300 hover:border-primary-300 dark:hover:border-primary-400 hover:text-gray-900 dark:hover:text-white'\n }`}\n >\n {item.text || item.title}\n </a>\n </li>\n )\n })}\n </ul>\n </nav>\n )\n}\n","import { useState, useRef, useEffect } from 'react'\nimport { useTheme, type Theme } from './ThemeProvider'\nimport { cn } from '../lib/utils'\n\ninterface ThemeToggleProps {\n /** Additional CSS classes */\n className?: string\n /** Size variant */\n size?: 'sm' | 'md' | 'lg'\n}\n\n// Refined sun icon with balanced proportions\nconst SunIcon = ({ className }: { className?: string }) => (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <circle cx=\"12\" cy=\"12\" r=\"4\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M12 5V3M12 21v-2M5 12H3m18 0h-2M7.05 7.05 5.636 5.636m12.728 12.728L16.95 16.95M7.05 16.95l-1.414 1.414M18.364 5.636 16.95 7.05\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n)\n\n// Refined moon icon - elegant crescent\nconst MoonIcon = ({ className }: { className?: string }) => (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M21.752 15.002A9.718 9.718 0 0 1 18 15.75c-5.385 0-9.75-4.365-9.75-9.75 0-1.33.266-2.597.748-3.752A9.753 9.753 0 0 0 3 11.25C3 16.635 7.365 21 12.75 21a9.753 9.753 0 0 0 9.002-5.998Z\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\n </svg>\n)\n\n// Refined monitor icon - clean display shape\nconst MonitorIcon = ({ className }: { className?: string }) => (\n <svg className={className} viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <rect x=\"2\" y=\"3\" width=\"20\" height=\"14\" rx=\"2\" stroke=\"currentColor\" strokeWidth=\"1.5\" />\n <path d=\"M8 21h8m-4-4v4\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" />\n </svg>\n)\n\nconst themeOptions: { value: Theme; label: string; icon: typeof SunIcon }[] = [\n { value: 'light', label: 'Light', icon: SunIcon },\n { value: 'dark', label: 'Dark', icon: MoonIcon },\n { value: 'system', label: 'System', icon: MonitorIcon },\n]\n\n/**\n * Theme toggle dropdown with Light, Dark, and System options.\n * Refined design with smooth animations and premium feel.\n */\nexport function ThemeToggle({ className, size = 'md' }: ThemeToggleProps) {\n const { theme, resolvedTheme, setTheme } = useTheme()\n const [isOpen, setIsOpen] = useState(false)\n const dropdownRef = useRef<HTMLDivElement>(null)\n\n // Close dropdown when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {\n setIsOpen(false)\n }\n }\n\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside)\n return () => document.removeEventListener('mousedown', handleClickOutside)\n }\n }, [isOpen])\n\n // Close on escape key\n useEffect(() => {\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key === 'Escape') setIsOpen(false)\n }\n\n if (isOpen) {\n document.addEventListener('keydown', handleEscape)\n return () => document.removeEventListener('keydown', handleEscape)\n }\n }, [isOpen])\n\n const iconSizes = {\n sm: 'w-[18px] h-[18px]',\n md: 'w-5 h-5',\n lg: 'w-[22px] h-[22px]',\n }\n\n return (\n <div className=\"relative\" ref={dropdownRef}>\n {/* Toggle Button */}\n <button\n onClick={() => setIsOpen(!isOpen)}\n className={cn(\n 'relative inline-flex items-center justify-center',\n 'rounded-full p-4',\n 'text-gray-500 hover:text-gray-900 dark:text-gray-400 dark:hover:text-white',\n 'hover:bg-gray-100 dark:hover:bg-white/10',\n 'transition-all duration-200 ease-out',\n 'focus:outline-none focus-visible:ring-2 focus-visible:ring-primary-500/50 focus-visible:ring-offset-2 dark:focus-visible:ring-offset-[#0f0f0f]',\n iconSizes[size],\n className\n )}\n aria-label=\"Toggle theme\"\n aria-expanded={isOpen}\n aria-haspopup=\"listbox\"\n >\n {/* Sun icon - visible in light mode */}\n <SunIcon\n className={cn(\n iconSizes[size],\n 'absolute inset-0 m-auto transition-all duration-300 ease-out',\n resolvedTheme === 'light'\n ? 'rotate-0 scale-100 opacity-100'\n : 'rotate-90 scale-75 opacity-0'\n )}\n />\n\n {/* Moon icon - visible in dark mode */}\n <MoonIcon\n className={cn(\n iconSizes[size],\n 'absolute inset-0 m-auto transition-all duration-300 ease-out',\n resolvedTheme === 'dark'\n ? 'rotate-0 scale-100 opacity-100'\n : '-rotate-90 scale-75 opacity-0'\n )}\n />\n </button>\n\n {/* Dropdown Menu */}\n <div\n className={cn(\n 'absolute right-0 mt-2 min-w-[140px]',\n 'p-1',\n 'bg-white dark:bg-[#171717]',\n 'border border-gray-200 dark:border-[#262626]',\n 'rounded-xl',\n 'shadow-lg shadow-black/5 dark:shadow-black/40',\n 'z-50',\n 'transition-all duration-200 ease-out origin-top-right',\n isOpen\n ? 'opacity-100 scale-100 translate-y-0'\n : 'opacity-0 scale-95 -translate-y-1 pointer-events-none'\n )}\n role=\"listbox\"\n aria-label=\"Select theme\"\n >\n {themeOptions.map((option, index) => {\n const Icon = option.icon\n const isSelected = theme === option.value\n\n return (\n <button\n key={option.value}\n onClick={() => {\n setTheme(option.value)\n setIsOpen(false)\n }}\n className={cn(\n 'w-full flex items-center gap-2.5 px-3 py-2',\n 'rounded-lg',\n 'text-[13px] font-medium',\n 'transition-all duration-150 ease-out',\n 'focus:outline-none',\n isSelected\n ? 'text-gray-900 dark:text-white bg-gray-100 dark:bg-[#262626]'\n : 'text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-white hover:bg-gray-50 dark:hover:bg-[#1f1f1f]'\n )}\n role=\"option\"\n aria-selected={isSelected}\n style={{\n animationDelay: isOpen ? `${index * 25}ms` : '0ms'\n }}\n >\n <Icon className={cn(\n 'w-4 h-4 flex-shrink-0',\n 'transition-transform duration-150',\n isSelected ? 'scale-110' : 'scale-100'\n )} />\n <span className=\"flex-1 text-left\">{option.label}</span>\n <div className={cn(\n 'w-1.5 h-1.5 rounded-full',\n 'transition-all duration-200',\n isSelected\n ? 'bg-primary-500 scale-100 opacity-100'\n : 'bg-transparent scale-0 opacity-0'\n )} />\n </button>\n )\n })}\n </div>\n </div>\n )\n}\n","import { createContext, useContext, useEffect, useState, type ReactNode } from 'react'\n\nexport type Theme = 'light' | 'dark' | 'system'\nexport type ResolvedTheme = 'light' | 'dark'\n\ninterface ThemeContextValue {\n theme: Theme\n resolvedTheme: ResolvedTheme\n setTheme: (theme: Theme) => void\n}\n\nconst ThemeContext = createContext<ThemeContextValue | null>(null)\n\nconst STORAGE_KEY = 'cross-docs-theme'\n\nfunction getSystemTheme(): ResolvedTheme {\n if (typeof window === 'undefined') return 'light'\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'\n}\n\nfunction getStoredTheme(): Theme | null {\n if (typeof window === 'undefined') return null\n const stored = localStorage.getItem(STORAGE_KEY)\n if (stored === 'light' || stored === 'dark' || stored === 'system') {\n return stored\n }\n return null\n}\n\ninterface ThemeProviderProps {\n children: ReactNode\n /** Default theme if no preference is stored. Defaults to 'system'. */\n defaultTheme?: Theme\n /** Force a specific theme, ignoring user preference */\n forcedTheme?: ResolvedTheme\n}\n\nexport function ThemeProvider({\n children,\n defaultTheme = 'system',\n forcedTheme,\n}: ThemeProviderProps) {\n const [theme, setThemeState] = useState<Theme>(() => {\n // During SSR, use defaultTheme\n if (typeof window === 'undefined') return defaultTheme\n return getStoredTheme() ?? defaultTheme\n })\n\n const [resolvedTheme, setResolvedTheme] = useState<ResolvedTheme>(() => {\n if (forcedTheme) return forcedTheme\n if (typeof window === 'undefined') return 'light'\n if (theme === 'system') return getSystemTheme()\n return theme\n })\n\n // Update resolved theme when theme changes or system preference changes\n useEffect(() => {\n if (forcedTheme) {\n setResolvedTheme(forcedTheme)\n return\n }\n\n const updateResolvedTheme = () => {\n if (theme === 'system') {\n setResolvedTheme(getSystemTheme())\n } else {\n setResolvedTheme(theme)\n }\n }\n\n updateResolvedTheme()\n\n // Listen for system preference changes\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)')\n const handleChange = () => {\n if (theme === 'system') {\n setResolvedTheme(getSystemTheme())\n }\n }\n\n mediaQuery.addEventListener('change', handleChange)\n return () => mediaQuery.removeEventListener('change', handleChange)\n }, [theme, forcedTheme])\n\n // Apply theme class to document\n useEffect(() => {\n const root = document.documentElement\n root.classList.remove('light', 'dark')\n root.classList.add(resolvedTheme)\n }, [resolvedTheme])\n\n const setTheme = (newTheme: Theme) => {\n setThemeState(newTheme)\n localStorage.setItem(STORAGE_KEY, newTheme)\n }\n\n return (\n <ThemeContext.Provider value={{ theme, resolvedTheme, setTheme }}>\n {children}\n </ThemeContext.Provider>\n )\n}\n\nexport function useTheme(): ThemeContextValue {\n const context = useContext(ThemeContext)\n if (!context) {\n throw new Error('useTheme must be used within a ThemeProvider')\n }\n return context\n}\n\n/**\n * Script to prevent flash of unstyled content (FOUC) during page load.\n * Include this in your HTML <head> before any stylesheets.\n */\nexport const themeInitScript = `\n(function() {\n try {\n var stored = localStorage.getItem('${STORAGE_KEY}');\n var theme = stored === 'light' || stored === 'dark' ? stored :\n (stored === 'system' || !stored) && window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n document.documentElement.classList.add(theme);\n } catch (e) {}\n})();\n`.trim()\n","import ReactMarkdown from 'react-markdown'\nimport remarkGfm from 'remark-gfm'\nimport remarkEmoji from 'remark-emoji'\nimport { remarkAlert } from 'remark-github-blockquote-alert'\nimport rehypeRaw from 'rehype-raw'\nimport { CodeBlock } from './CodeBlock'\nimport type { MarkdownProps } from '../types'\n\n/**\n * Convert heading text to URL-safe slug.\n * Must match the Python slugify function in markdown.py.\n */\nfunction slugify(text: string): string {\n return text\n .toLowerCase()\n .replace(/[\\s_]+/g, '-')\n .replace(/[^a-z0-9-]/g, '')\n .replace(/-+/g, '-')\n .replace(/^-|-$/g, '')\n}\n\n/**\n * Extract text content from React children.\n */\nfunction getTextContent(children: React.ReactNode): string {\n if (typeof children === 'string') return children\n if (typeof children === 'number') return String(children)\n if (Array.isArray(children)) return children.map(getTextContent).join('')\n if (children && typeof children === 'object' && 'props' in children) {\n return getTextContent((children as React.ReactElement).props.children)\n }\n return ''\n}\n\n/**\n * Markdown renderer with syntax highlighting and GFM support.\n */\nexport function Markdown({ content, components }: MarkdownProps) {\n // Create lowercase mappings for custom components\n // HTML tag names are case-insensitive, so <TerminalExample> becomes <terminalexample>\n const lowercaseComponents = components\n ? Object.entries(components).reduce(\n (acc, [name, Component]) => {\n acc[name.toLowerCase()] = Component\n return acc\n },\n {} as Record<string, React.ComponentType<any>>\n )\n : {}\n\n return (\n <ReactMarkdown\n remarkPlugins={[remarkGfm, remarkEmoji, remarkAlert]}\n rehypePlugins={[rehypeRaw]}\n components={{\n ...lowercaseComponents,\n // Override pre to avoid double wrapping with CodeBlock\n pre({ children }) {\n return <>{children}</>\n },\n // Custom code block rendering with syntax highlighting\n code({ node, className, children, ...props }) {\n const match = /language-(\\w+)/.exec(className || '')\n const isInline = !match && !className\n\n if (isInline) {\n return (\n <code\n className=\"rounded bg-gray-100 px-1.5 py-0.5 text-sm font-medium text-gray-800 dark:bg-gray-800 dark:text-gray-200\"\n {...props}\n >\n {children}\n </code>\n )\n }\n\n // Parse meta string from the code fence (e.g., ```python title=\"app.py\" showLineNumbers)\n const meta = (node?.data?.meta as string) || ''\n const titleMatch = /title=\"([^\"]+)\"/.exec(meta)\n const filename = titleMatch ? titleMatch[1] : undefined\n const showLineNumbers = meta.includes('showLineNumbers')\n\n return (\n <CodeBlock\n code={String(children).replace(/\\n$/, '')}\n language={match ? match[1] : 'text'}\n filename={filename}\n showLineNumbers={showLineNumbers}\n />\n )\n },\n // Custom link styling\n a({ href, children, node, ...props }) {\n const isExternal = href?.startsWith('http')\n return (\n <a\n href={href}\n className=\"text-primary-600 hover:text-primary-700 dark:text-primary-400 dark:hover:text-primary-300\"\n {...(isExternal ? { target: '_blank', rel: 'noopener noreferrer' } : {})}\n {...props}\n >\n {children}\n </a>\n )\n },\n // Tables\n table({ children }) {\n return (\n <div className=\"overflow-x-auto\">\n <table className=\"w-full text-left text-sm\">{children}</table>\n </div>\n )\n },\n th({ children }) {\n return (\n <th className=\"border-b border-gray-200 bg-gray-50 px-4 py-2 font-semibold dark:border-gray-700 dark:bg-gray-800\">\n {children}\n </th>\n )\n },\n td({ children }) {\n return (\n <td className=\"border-b border-gray-200 px-4 py-2 dark:border-gray-700\">\n {children}\n </td>\n )\n },\n // Headings with anchor IDs for TOC\n h2({ children }) {\n const text = getTextContent(children)\n const id = slugify(text)\n return (\n <h2 id={id}>\n {children}\n </h2>\n )\n },\n h3({ children }) {\n const text = getTextContent(children)\n const id = slugify(text)\n return (\n <h3 id={id}>\n {children}\n </h3>\n )\n },\n // Task list checkbox styling\n input({ type, checked, disabled, ...props }) {\n if (type === 'checkbox') {\n return (\n <input\n type=\"checkbox\"\n checked={checked}\n disabled={disabled}\n className=\"mr-2 h-4 w-4 rounded border-gray-300 text-primary-600 focus:ring-primary-500 dark:border-gray-600 dark:bg-gray-700\"\n {...props}\n />\n )\n }\n return <input type={type} checked={checked} disabled={disabled} {...props} />\n },\n // Footnote section styling\n section({ className, children, ...props }) {\n if (className?.includes('footnotes')) {\n return (\n <section\n className=\"mt-8 border-t border-gray-200 pt-6 text-sm text-gray-600 dark:border-gray-700 dark:text-gray-400\"\n {...props}\n >\n {children}\n </section>\n )\n }\n return <section className={className} {...props}>{children}</section>\n },\n }}\n >\n {content}\n </ReactMarkdown>\n )\n}\n","import React, { createContext, useContext } from 'react'\n\ninterface ComponentsContextValue {\n components?: Record<string, React.ComponentType<any>>\n}\n\nconst ComponentsContext = createContext<ComponentsContextValue>({})\n\nexport function ComponentsProvider({\n children,\n components,\n}: {\n children: React.ReactNode\n components?: Record<string, React.ComponentType<any>>\n}) {\n return (\n <ComponentsContext.Provider value={{ components }}>\n {children}\n </ComponentsContext.Provider>\n )\n}\n\nexport function useComponents() {\n return useContext(ComponentsContext)\n}\n","import { DocsLayout } from './DocsLayout'\nimport { Markdown } from './Markdown'\nimport type { DocContent, DocsLayoutProps } from '../types'\nimport { useComponents } from '../context/ComponentsContext'\n\ninterface DocsPageProps extends Omit<DocsLayoutProps, 'children' | 'title'> {\n content: DocContent\n}\n\n/**\n * Default documentation page component.\n * Renders markdown content within the DocsLayout.\n */\nexport function DocsPage({ content, ...layoutProps }: DocsPageProps) {\n const { components } = useComponents()\n\n return (\n <DocsLayout\n title={content?.title ?? ''}\n description={content?.description}\n toc={content?.toc}\n {...layoutProps}\n >\n <Markdown content={content?.body ?? ''} components={components} />\n </DocsLayout>\n )\n}\n","import { useState, useCallback } from 'react'\n\ninterface ConfettiParticle {\n id: number\n x: number\n y: number\n angle: number\n velocity: number\n spin: number\n scale: number\n}\n\nexport function EmojiConfetti({ children, emoji }: { children: React.ReactNode; emoji: string }) {\n const [particles, setParticles] = useState<ConfettiParticle[]>([])\n const [isActive, setIsActive] = useState(false)\n\n const triggerBurst = useCallback(() => {\n if (isActive) return\n setIsActive(true)\n\n const newParticles: ConfettiParticle[] = []\n const count = 15\n\n for (let i = 0; i < count; i++) {\n // Burst in all directions from center\n const angle = (i / count) * Math.PI * 2 + (Math.random() - 0.5) * 0.5\n newParticles.push({\n id: Date.now() + i,\n x: 50, // Start from center\n y: 50,\n angle,\n velocity: 80 + Math.random() * 60, // Distance to travel\n spin: (Math.random() - 0.5) * 720, // Random rotation\n scale: 0.7 + Math.random() * 0.6,\n })\n }\n setParticles(newParticles)\n\n setTimeout(() => {\n setParticles([])\n setIsActive(false)\n }, 1000)\n }, [isActive])\n\n return (\n <span\n className=\"relative inline-block\"\n onMouseEnter={triggerBurst}\n >\n {children}\n <span className=\"absolute inset-0 pointer-events-none overflow-visible\">\n {particles.map((p) => {\n const endX = p.x + Math.cos(p.angle) * p.velocity\n const endY = p.y + Math.sin(p.angle) * p.velocity\n\n return (\n <span\n key={p.id}\n className=\"absolute\"\n style={{\n left: '50%',\n top: '50%',\n fontSize: `${p.scale}rem`,\n transform: 'translate(-50%, -50%)',\n animation: `emojiConfettiBurst 0.8s cubic-bezier(0.25, 0.46, 0.45, 0.94) forwards`,\n '--end-x': `${(endX - 50)}px`,\n '--end-y': `${(endY - 50)}px`,\n '--spin': `${p.spin}deg`,\n } as React.CSSProperties}\n >\n {emoji}\n </span>\n )\n })}\n </span>\n </span>\n )\n}\n","import { Head, Link } from '@inertiajs/react'\nimport { createContext, useContext, useState, type ReactNode } from 'react'\nimport { ThemeToggle } from './ThemeToggle'\nimport { useTheme } from './ThemeProvider'\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface HomeFeature {\n title: string\n description: ReactNode\n}\n\nexport interface HomePageContextValue {\n title: string\n tagline: string\n description: string\n installCommand: string\n ctaText: string\n ctaHref: string\n features: HomeFeature[]\n logoUrl?: string\n heroLogoUrl?: string\n footerLogoUrl?: string\n footerLogoInvertedUrl?: string\n githubUrl?: string\n navLinks: Array<{ label: string; href: string }>\n}\n\nexport interface HomePageProps extends Omit<HomePageContextValue, 'navLinks'> {\n navLinks?: Array<{ label: string; href: string }>\n children?: ReactNode\n}\n\nexport interface HomeHeaderProps {\n renderLogo?: () => ReactNode\n}\n\nexport interface HomeFeaturesProps {\n renderFeature?: (\n feature: HomeFeature,\n index: number,\n DefaultFeature: typeof HomeFeatureItem\n ) => ReactNode\n}\n\nexport interface HomeFeatureItemProps {\n feature: HomeFeature\n index: number\n totalFeatures: number\n}\n\n// ============================================================================\n// Context\n// ============================================================================\n\nconst HomePageContext = createContext<HomePageContextValue | null>(null)\n\nfunction useHomePage(): HomePageContextValue {\n const context = useContext(HomePageContext)\n if (!context) {\n throw new Error('HomePage sub-components must be used within <HomePage>')\n }\n return context\n}\n\n// ============================================================================\n// Utility Components\n// ============================================================================\n\nfunction InstallCommand({ command }: { command: string }) {\n const [copied, setCopied] = useState(false)\n\n const copyToClipboard = async () => {\n await navigator.clipboard.writeText(command)\n setCopied(true)\n setTimeout(() => setCopied(false), 2000)\n }\n\n return (\n <button\n onClick={copyToClipboard}\n className=\"group relative flex items-center bg-gray-900 dark:bg-white border border-gray-900 dark:border-white px-4 h-14 font-mono text-sm text-white dark:text-gray-900 hover:bg-white dark:hover:bg-gray-900 hover:text-gray-900 dark:hover:text-white transition-colors cursor-pointer\"\n >\n <span className=\"text-primary-500 dark:text-primary-600 mr-2\">$</span>\n <span>{command}</span>\n <svg\n className={`ml-4 w-4 h-4 transition ${copied ? 'text-green-400' : 'opacity-50 group-hover:opacity-100'}`}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\"\n />\n </svg>\n <span\n className={`absolute -top-8 left-1/2 -translate-x-1/2 bg-gray-900 dark:bg-white text-white dark:text-gray-900 text-xs py-1 px-2 rounded transition-opacity duration-300 whitespace-nowrap ${\n copied ? 'opacity-100' : 'opacity-0'\n }`}\n >\n Copied!\n </span>\n </button>\n )\n}\n\nfunction GitHubIcon() {\n return (\n <svg className=\"w-6 h-6\" fill=\"currentColor\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path\n fillRule=\"evenodd\"\n d=\"M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z\"\n clipRule=\"evenodd\"\n />\n </svg>\n )\n}\n\n// ============================================================================\n// Sub-Components\n// ============================================================================\n\n/**\n * Default logo component that renders an image or text.\n */\nfunction DefaultLogo() {\n const { title, logoUrl } = useHomePage()\n\n if (logoUrl) {\n return (\n <Link href=\"/\" className=\"flex items-center\">\n <img src={logoUrl} alt={title} className=\"h-8\" />\n </Link>\n )\n }\n\n return (\n <Link href=\"/\" className=\"font-bold text-lg text-gray-900 dark:text-white\">\n {title}\n </Link>\n )\n}\n\n/**\n * Navigation header for the homepage.\n * Accepts an optional renderLogo prop for custom logo rendering.\n */\nexport function HomeHeader({ renderLogo }: HomeHeaderProps = {}) {\n const { navLinks, githubUrl } = useHomePage()\n\n return (\n <nav className=\"fixed w-full z-50 bg-white/95 dark:bg-[#0f0f0f]/95 backdrop-blur-sm border-b border-gray-200 dark:border-gray-800 transition-colors\">\n <div className=\"px-4 lg:px-10\">\n <div className=\"flex justify-between h-16 items-center\">\n {renderLogo ? renderLogo() : <DefaultLogo />}\n <div className=\"flex items-center gap-6\">\n <div className=\"-mr-2\">\n <ThemeToggle size=\"sm\" />\n </div>\n\n {navLinks.map((link) => (\n <Link\n key={link.href}\n href={link.href}\n className=\"hidden sm:block text-gray-700 dark:text-gray-300 font-medium hover:text-primary-600 dark:hover:text-primary-400 transition-colors\"\n >\n {link.label}\n </Link>\n ))}\n {githubUrl && (\n <a\n href={githubUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-gray-700 dark:text-gray-300 hover:text-primary-600 dark:hover:text-primary-400 transition-colors\"\n >\n <GitHubIcon />\n </a>\n )}\n </div>\n </div>\n </div>\n </nav>\n )\n}\n\n/**\n * Hero section with title, tagline, description, and CTA.\n * If heroLogoUrl is provided, displays an image instead of text title.\n */\nexport function HomeHero() {\n const { title, tagline, description, ctaText, ctaHref, installCommand, heroLogoUrl } = useHomePage()\n\n return (\n <section className=\"pt-16\">\n <div className=\"px-4 lg:px-10 py-16 lg:py-24\">\n <div className=\"max-w-4xl\">\n <div className=\"mb-4 text-sm font-mono uppercase tracking-widest text-gray-500 dark:text-gray-400\">\n {tagline}\n </div>\n {heroLogoUrl ? (\n <h1 className=\"mb-6 lg:mb-8\">\n <img\n src={heroLogoUrl}\n alt={title}\n className=\"h-auto w-auto max-w-[580px]\"\n />\n </h1>\n ) : (\n <h1 className=\"text-5xl lg:text-7xl font-bold tracking-tight mb-6 text-gray-900 dark:text-white\">\n {title}\n </h1>\n )}\n <p className=\"text-xl lg:text-2xl text-gray-600 dark:text-gray-300 max-w-2xl leading-relaxed mb-8\">\n {description}\n </p>\n\n <div className=\"flex flex-col sm:flex-row gap-3\">\n <Link\n href={ctaHref}\n className=\"inline-flex items-center justify-center px-8 h-14 bg-gray-900 dark:bg-white text-white dark:text-gray-900 font-bold text-lg hover:bg-primary-500 dark:hover:bg-primary-500 dark:hover:text-white transition-colors border border-gray-900 dark:border-white hover:border-primary-500 dark:hover:border-primary-500\"\n >\n {ctaText}\n </Link>\n {installCommand && <InstallCommand command={installCommand} />}\n </div>\n </div>\n </div>\n </section>\n )\n}\n\n/**\n * Single feature item within the features grid.\n */\nexport function HomeFeatureItem({ feature, index, totalFeatures }: HomeFeatureItemProps) {\n return (\n <div\n className={`p-4 lg:p-10 border-b sm:border-b border-gray-200 dark:border-gray-800 ${\n index % 2 === 0 ? 'sm:border-r' : ''\n } ${index >= totalFeatures - 2 ? 'sm:border-b-0' : ''} ${\n index === totalFeatures - 1 && totalFeatures % 2 === 1 ? 'border-b-0' : ''\n } transition-colors`}\n >\n <div className=\"text-5xl font-bold text-primary-500 dark:text-primary-400 mb-4\">\n {String(index + 1).padStart(2, '0')}\n </div>\n <h3 className=\"text-xl font-bold mb-2 text-gray-900 dark:text-white\">{feature.title}</h3>\n <p className=\"text-gray-600 dark:text-gray-300\">{feature.description}</p>\n </div>\n )\n}\n\n/**\n * Features section with customizable feature rendering.\n */\nexport function HomeFeatures({ renderFeature }: HomeFeaturesProps = {}) {\n const { title, features } = useHomePage()\n\n if (features.length === 0) {\n return null\n }\n\n return (\n <section className=\"border-t border-gray-200 dark:border-gray-800 transition-colors\">\n <div className=\"grid grid-cols-12\">\n <div className=\"col-span-12 lg:col-span-4 p-4 lg:p-10 border-b lg:border-b-0 lg:border-r border-gray-200 dark:border-gray-800 transition-colors\">\n <div className=\"text-sm font-mono uppercase tracking-widest text-gray-500 dark:text-gray-400 mb-4\">\n Features\n </div>\n <h2 className=\"text-4xl lg:text-5xl font-bold tracking-tight text-gray-900 dark:text-white\">\n Why {title}?\n </h2>\n </div>\n\n <div className=\"col-span-12 lg:col-span-8 grid grid-cols-1 sm:grid-cols-2\">\n {features.map((feature, index) =>\n renderFeature ? (\n <div key={index}>\n {renderFeature(feature, index, HomeFeatureItem)}\n </div>\n ) : (\n <HomeFeatureItem\n key={index}\n feature={feature}\n index={index}\n totalFeatures={features.length}\n />\n )\n )}\n </div>\n </div>\n </section>\n )\n}\n\n/**\n * Call-to-action section.\n */\nexport function HomeCTA() {\n const { ctaHref } = useHomePage()\n\n return (\n <section className=\"border-t border-gray-200 dark:border-gray-800 transition-colors\">\n <div className=\"grid grid-cols-12 items-center\">\n <div className=\"col-span-12 lg:col-span-8 p-4 lg:p-10\">\n <h2 className=\"text-4xl lg:text-6xl font-bold tracking-tight mb-4 text-gray-900 dark:text-white\">\n Ready to start?\n </h2>\n <p className=\"text-xl text-gray-600 dark:text-gray-300 mb-8 max-w-2xl\">\n Get up and running in minutes. Check out our documentation to learn more.\n </p>\n <Link\n href={ctaHref}\n className=\"inline-flex items-center justify-center px-8 py-4 bg-primary-500 text-white font-bold text-lg hover:bg-gray-900 dark:hover:bg-white dark:hover:text-gray-900 transition-colors border border-primary-500 hover:border-gray-900 dark:hover:border-white\"\n >\n Read the Docs\n </Link>\n </div>\n <Link\n href={ctaHref}\n className=\"col-span-12 lg:col-span-4 h-full bg-primary-500 hidden lg:flex items-center justify-center p-4 lg:p-10 hover:bg-gray-900 dark:hover:bg-white transition-colors min-h-[200px] group\"\n >\n <div className=\"text-white group-hover:text-white dark:group-hover:text-gray-900 text-8xl font-bold transition-colors\">&rarr;</div>\n </Link>\n </div>\n </section>\n )\n}\n\n/**\n * Footer section.\n */\nexport function HomeFooter() {\n const { title, logoUrl, footerLogoUrl, footerLogoInvertedUrl, navLinks, githubUrl } = useHomePage()\n const { resolvedTheme } = useTheme()\n\n // Select appropriate logo based on theme\n const currentLogoUrl = resolvedTheme === 'dark'\n ? (footerLogoInvertedUrl || footerLogoUrl || logoUrl)\n : (footerLogoUrl || logoUrl)\n\n return (\n <footer className=\"border-t border-gray-200 dark:border-gray-800 py-8 bg-white dark:bg-[#0f0f0f] transition-colors\">\n <div className=\"px-4 lg:px-10 flex flex-col md:flex-row justify-between items-center gap-6\">\n {currentLogoUrl && (\n <Link href=\"/\">\n <img src={currentLogoUrl} alt={title} className=\"h-6\" />\n </Link>\n )}\n <div className=\"flex gap-8 text-sm text-gray-600 dark:text-gray-300\">\n {navLinks.map((link) => (\n <Link key={link.href} href={link.href} className=\"hover:text-black dark:hover:text-white transition-colors\">\n {link.label}\n </Link>\n ))}\n {githubUrl && (\n <a\n href={githubUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"hover:text-black dark:hover:text-white transition-colors\"\n >\n GitHub\n </a>\n )}\n </div>\n </div>\n </footer>\n )\n}\n\n/**\n * Spacer that fills remaining vertical space.\n * Shows a top border (via gradient) only when it has height.\n */\nfunction HomeSpacer() {\n return (\n <div\n className=\"grow dark:hidden\"\n style={{ backgroundImage: 'linear-gradient(rgb(229, 231, 235) 1px, transparent 1px)' }}\n />\n )\n}\n\nfunction HomeSpacerDark() {\n return (\n <div\n className=\"grow hidden dark:block\"\n style={{ backgroundImage: 'linear-gradient(rgb(38, 38, 38) 1px, transparent 1px)' }}\n />\n )\n}\n\nfunction DefaultHomeLayout() {\n return (\n <>\n <HomeHeader />\n <HomeHero />\n <HomeFeatures />\n <HomeCTA />\n <HomeSpacer />\n <HomeSpacerDark />\n <HomeFooter />\n </>\n )\n}\n\n// ============================================================================\n// Main Component\n// ============================================================================\n\n/**\n * Homepage component for documentation sites.\n *\n * Can be used in two ways:\n *\n * 1. Simple - everything from config:\n * ```tsx\n * <HomePage {...props} />\n * ```\n *\n * 2. Composable - full control via children:\n * ```tsx\n * <HomePage {...props}>\n * <HomePage.Header />\n * <HomePage.Hero />\n * <MyCustomSection />\n * <HomePage.Features renderFeature={(feature, i, Default) => (\n * <Default feature={feature} index={i} totalFeatures={4} />\n * )} />\n * <HomePage.CTA />\n * <HomePage.Footer />\n * </HomePage>\n * ```\n */\nexport function HomePage({\n children,\n navLinks = [],\n ...props\n}: HomePageProps) {\n const contextValue: HomePageContextValue = {\n ...props,\n navLinks,\n }\n\n return (\n <HomePageContext.Provider value={contextValue}>\n <div className=\"min-h-screen bg-white dark:bg-[#0f0f0f] flex flex-col transition-colors duration-200\">\n <Head title={props.title} />\n {children || <DefaultHomeLayout />}\n </div>\n </HomePageContext.Provider>\n )\n}\n\n// Attach sub-components for compound component pattern\nHomePage.Header = HomeHeader\nHomePage.Hero = HomeHero\nHomePage.Features = HomeFeatures\nHomePage.Feature = HomeFeatureItem\nHomePage.CTA = HomeCTA\nHomePage.Footer = HomeFooter\n","import { Head, Link, usePage } from '@inertiajs/react'\nimport { useState } from 'react'\nimport { ThemeToggle } from '../ThemeToggle'\nimport { useTheme } from '../ThemeProvider'\nimport { MobileMenuButton } from '../DocsLayout'\nimport { Sidebar } from '../Sidebar'\nimport type { NavSection, SharedProps } from '../../types'\n\ninterface APILayoutProps {\n children: React.ReactNode\n title: string\n apiNav: NavSection[]\n currentPath: string\n logoUrl?: string\n logoInvertedUrl?: string\n footerLogoUrl?: string\n footerLogoInvertedUrl?: string\n githubUrl?: string\n navLinks?: Array<{ label: string; href: string }>\n /** Right sidebar content (e.g., table of contents) */\n rightSidebar?: React.ReactNode\n /** Custom header component (replaces entire header). Can be a ReactNode or a function that receives mobile menu props. */\n header?: React.ReactNode | ((props: { mobileMenuOpen: boolean; toggleMobileMenu: () => void }) => React.ReactNode)\n /** Header height in pixels. Used to calculate content offset. Defaults to 64 (h-16). */\n headerHeight?: number\n /** Custom footer component */\n footer?: React.ReactNode\n}\n\n/** Shared props type for API pages */\ninterface APISharedProps extends SharedProps {\n apiNav?: NavSection[]\n}\n\nfunction GitHubIcon() {\n return (\n <svg className=\"w-6 h-6\" fill=\"currentColor\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path\n fillRule=\"evenodd\"\n d=\"M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z\"\n clipRule=\"evenodd\"\n />\n </svg>\n )\n}\n\n/**\n * Layout component for API documentation pages.\n * Uses the shared Sidebar component with compact styling and collapsible sections.\n */\nexport function APILayout({\n children,\n title,\n apiNav,\n currentPath,\n logoUrl: propLogoUrl,\n logoInvertedUrl: propLogoInvertedUrl,\n footerLogoUrl: propFooterLogoUrl,\n footerLogoInvertedUrl: propFooterLogoInvertedUrl,\n githubUrl: propGithubUrl,\n navLinks: propNavLinks,\n rightSidebar,\n header,\n headerHeight: propHeaderHeight = 64,\n footer,\n}: APILayoutProps) {\n const sharedProps = usePage<{ props: APISharedProps }>().props as unknown as APISharedProps\n const [mobileMenuOpen, setMobileMenuOpen] = useState(false)\n const { resolvedTheme } = useTheme()\n const headerHeight = propHeaderHeight\n\n // Merge props - component props take precedence over shared props from Python\n const logoUrl = propLogoUrl ?? sharedProps.logoUrl\n const logoInvertedUrl = propLogoInvertedUrl ?? sharedProps.logoInvertedUrl\n const githubUrl = propGithubUrl ?? sharedProps.githubUrl\n const navLinks = propNavLinks ?? sharedProps.navLinks ?? []\n\n const headerLogo = logoInvertedUrl ? (\n <img src={logoInvertedUrl} alt=\"Logo\" className=\"h-8\" />\n ) : logoUrl ? (\n <img src={logoUrl} alt=\"Logo\" className=\"h-8\" />\n ) : null\n\n const footerLogoUrl = propFooterLogoUrl || sharedProps.footerLogoUrl || logoUrl\n const footerLogoInvertedUrl = propFooterLogoInvertedUrl || sharedProps.footerLogoInvertedUrl || logoInvertedUrl\n const currentFooterLogoUrl = resolvedTheme === 'dark' ? (footerLogoInvertedUrl || footerLogoUrl) : footerLogoUrl\n const footerLogo = currentFooterLogoUrl ? (\n <img src={currentFooterLogoUrl} alt=\"Logo\" className=\"h-6\" />\n ) : null\n\n return (\n <div className=\"min-h-screen bg-white dark:bg-[#0f0f0f] flex flex-col transition-colors duration-200\">\n <Head title={title} />\n\n {/* Fixed navigation */}\n {(typeof header === 'function'\n ? header({ mobileMenuOpen, toggleMobileMenu: () => setMobileMenuOpen(!mobileMenuOpen) })\n : header) || (\n <nav className=\"fixed w-full z-50 bg-white/95 dark:bg-[#0f0f0f]/95 backdrop-blur-sm border-b border-gray-200 dark:border-gray-800 transition-colors\">\n <div className=\"px-4 lg:px-10\">\n <div className=\"flex justify-between h-16 items-center\">\n <div className=\"flex items-center gap-2\">\n <MobileMenuButton onClick={() => setMobileMenuOpen(!mobileMenuOpen)} isOpen={mobileMenuOpen} />\n {headerLogo ? (\n <Link href=\"/\" className=\"flex items-center\">\n {headerLogo}\n </Link>\n ) : (\n <Link href=\"/\" className=\"font-bold text-lg text-gray-900 dark:text-white\">\n Docs\n </Link>\n )}\n </div>\n <div className=\"flex items-center gap-6\">\n <div className=\"-mr-2\">\n <ThemeToggle size=\"sm\" />\n </div>\n {navLinks.map((link) => (\n <Link\n key={link.href}\n href={link.href}\n className=\"hidden sm:block text-gray-700 dark:text-gray-300 font-medium hover:text-primary-600 dark:hover:text-primary-400 transition-colors\"\n >\n {link.label}\n </Link>\n ))}\n {githubUrl && (\n <a\n href={githubUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-gray-700 dark:text-gray-300 hover:text-primary-600 dark:hover:text-primary-400 transition-colors\"\n >\n <GitHubIcon />\n </a>\n )}\n </div>\n </div>\n </div>\n </nav>\n )}\n\n {/* Mobile sidebar */}\n {mobileMenuOpen && (\n <div className=\"fixed inset-0 z-40 lg:hidden\">\n <div className=\"fixed inset-0 bg-black/50 dark:bg-black/70\" onClick={() => setMobileMenuOpen(false)} />\n <div\n className=\"fixed inset-y-0 left-0 w-72 overflow-y-auto bg-white dark:bg-[#0f0f0f] px-4 py-6 border-r border-gray-200 dark:border-gray-800 transition-colors\"\n style={{ paddingTop: headerHeight + 16 }}\n >\n <Sidebar\n nav={apiNav}\n currentPath={currentPath}\n />\n </div>\n </div>\n )}\n\n {/* Main content area */}\n <div className=\"bg-white dark:bg-[#0f0f0f] w-full flex-1 transition-colors\" style={{ paddingTop: headerHeight }}>\n <div className=\"flex\">\n {/* Desktop sidebar */}\n <aside\n className=\"hidden lg:block w-64 shrink-0 border-r border-gray-200 dark:border-gray-800 transition-colors\"\n style={{ minHeight: `calc(100vh - ${headerHeight}px)` }}\n >\n <div\n className=\"sticky px-6 py-6 overflow-y-auto\"\n style={{ top: headerHeight, maxHeight: `calc(100vh - ${headerHeight}px)` }}\n >\n <Sidebar\n nav={apiNav}\n currentPath={currentPath}\n />\n </div>\n </aside>\n\n {/* Right section: content + TOC + footer */}\n <div className=\"flex-1 min-w-0 flex flex-col\">\n <div className=\"flex-1 p-4 lg:px-10 lg:py-6\">\n <div className=\"flex gap-5\">\n {/* Main content */}\n <main className=\"min-w-0 w-full max-w-4xl\">\n {children}\n </main>\n\n {/* Table of Contents - desktop only */}\n {rightSidebar && (\n <aside className=\"hidden xl:block w-56 shrink-0 transition-colors\">\n <div\n className=\"sticky overflow-y-auto\"\n style={{ top: headerHeight + 24, maxHeight: `calc(100vh - ${headerHeight + 24}px)` }}\n >\n {rightSidebar}\n </div>\n </aside>\n )}\n </div>\n </div>\n\n {/* Footer */}\n {footer || (\n <footer className=\"border-t border-gray-200 dark:border-gray-800 py-8 px-4 lg:px-10 transition-colors\">\n <div className=\"flex flex-col md:flex-row justify-between items-center gap-6\">\n {footerLogo && <Link href=\"/\">{footerLogo}</Link>}\n <div className=\"flex gap-8 text-sm text-gray-600 dark:text-gray-400\">\n {navLinks.map((link) => (\n <Link key={link.href} href={link.href} className=\"hover:text-black dark:hover:text-white transition-colors\">\n {link.label}\n </Link>\n ))}\n {githubUrl && (\n <a\n href={githubUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"hover:text-black dark:hover:text-white transition-colors\"\n >\n GitHub\n </a>\n )}\n </div>\n </div>\n </footer>\n )}\n </div>\n </div>\n </div>\n </div>\n )\n}\n","import { Link } from '@inertiajs/react'\nimport type { GriffeModule, GriffeClass, GriffeFunction, GriffeAttribute, GriffeMember, GriffeExpression } from '../../types'\nimport { Docstring } from './Docstring'\nimport { ClassDoc } from './ClassDoc'\nimport { FunctionDoc } from './FunctionDoc'\n\n/**\n * Safely render a Griffe expression or value to a string\n */\nfunction renderValue(value: string | GriffeExpression | undefined): string {\n if (!value) return ''\n if (typeof value === 'string') return value\n // Handle Griffe expression objects\n if (value.str) return value.str\n if (value.canonical) return value.canonical\n\n const exprAny = value as any\n\n // Handle ExprName with member reference\n if (value.name && typeof value.name === 'string') return value.name\n\n // Handle ExprBoolOp (like `config or StrawberryConfig()`)\n if (exprAny.cls === 'ExprBoolOp' && exprAny.operator && Array.isArray(exprAny.values)) {\n return exprAny.values.map((v: any) => renderValue(v)).join(` ${exprAny.operator} `)\n }\n\n // Handle ExprBinOp (like `type | None`)\n if (exprAny.cls === 'ExprBinOp' && exprAny.left && exprAny.right) {\n const left = renderValue(exprAny.left)\n const right = renderValue(exprAny.right)\n const op = exprAny.operator || '|'\n return `${left} ${op} ${right}`\n }\n\n // Handle ExprCall (like `StrawberryConfig()`)\n if (exprAny.cls === 'ExprCall' && exprAny.function) {\n const funcName = renderValue(exprAny.function)\n const args = Array.isArray(exprAny.arguments)\n ? exprAny.arguments.map((a: any) => renderValue(a)).join(', ')\n : ''\n return `${funcName}(${args})`\n }\n\n // Handle ExprAttribute (like contextlib.asynccontextmanager)\n if (exprAny.cls === 'ExprAttribute' && Array.isArray(exprAny.values)) {\n return exprAny.values.map((v: any) => renderValue(v)).join('.')\n }\n\n // Handle ExprList and ExprTuple\n if ('elements' in exprAny && Array.isArray(exprAny.elements)) {\n const inner = exprAny.elements.map((el: any) => renderValue(el)).join(', ')\n return exprAny.cls === 'ExprTuple' ? `(${inner})` : `[${inner}]`\n }\n\n // Handle ExprDict\n if (exprAny.cls === 'ExprDict' && Array.isArray(exprAny.keys) && Array.isArray(exprAny.values)) {\n const pairs = exprAny.keys.map((k: any, i: number) =>\n `${renderValue(k)}: ${renderValue(exprAny.values[i])}`\n ).join(', ')\n return `{${pairs}}`\n }\n\n // Handle ExprSubscript (like Dict[str, int])\n if (exprAny.left && exprAny.slice) {\n const left = renderValue(exprAny.left)\n const slice = renderValue(exprAny.slice)\n return `${left}[${slice}]`\n }\n\n // Handle slice expressions\n if ('slice' in exprAny && exprAny.slice && !exprAny.left) {\n return renderValue(exprAny.slice)\n }\n\n // Fallback for unknown expressions\n if (typeof value === 'object') {\n return JSON.stringify(value)\n }\n\n return String(value)\n}\n\ninterface ModuleDocProps {\n module: GriffeModule\n /** URL prefix for links */\n prefix?: string\n /** Show full module content or just summary */\n showFull?: boolean\n /** Additional CSS class */\n className?: string\n /** Override display path (e.g., for aliases to show alias name instead of target path) */\n displayPath?: string\n /** GitHub repository URL for \"Open in GitHub\" links */\n githubUrl?: string\n}\n\n/**\n * Renders documentation for a module including its classes, functions, and submodules.\n */\nexport function ModuleDoc({ module, prefix = '/api', showFull = true, className = '', displayPath, githubUrl }: ModuleDocProps) {\n const members = module.members ?? {}\n\n // Separate members by type\n const submodules: GriffeModule[] = []\n const classes: GriffeClass[] = []\n const functions: GriffeFunction[] = []\n const attributes: GriffeAttribute[] = []\n\n for (const member of Object.values(members)) {\n switch (member.kind) {\n case 'module':\n submodules.push(member as GriffeModule)\n break\n case 'class':\n classes.push(member as GriffeClass)\n break\n case 'function':\n functions.push(member as GriffeFunction)\n break\n case 'attribute':\n attributes.push(member as GriffeAttribute)\n break\n }\n }\n\n // Sort alphabetically\n submodules.sort((a, b) => a.name.localeCompare(b.name))\n classes.sort((a, b) => a.name.localeCompare(b.name))\n functions.sort((a, b) => a.name.localeCompare(b.name))\n attributes.sort((a, b) => a.name.localeCompare(b.name))\n\n // Generate href for a member using dotted path\n const memberHref = (member: GriffeMember) => {\n const modulePath = module.path || module.name\n return `${prefix}/${modulePath}.${member.name}`\n }\n\n return (\n <div className={className}>\n {/* Module header */}\n <h1 id={module.name} className=\"text-3xl font-bold text-gray-900 dark:text-white mb-2\">\n <span className=\"text-gray-500 dark:text-gray-400 font-normal\">module </span>\n {displayPath || module.path || module.name}\n </h1>\n\n {/* Docstring */}\n {module.docstring && (\n <div className=\"mb-8\">\n <Docstring docstring={module.docstring} />\n </div>\n )}\n\n {/* Submodules */}\n {submodules.length > 0 && (\n <div className=\"mb-8\">\n <h2 className=\"text-xl font-semibold text-gray-900 dark:text-white mb-4 pb-2 border-b border-gray-200 dark:border-gray-700\">\n Submodules\n </h2>\n <ul className=\"grid grid-cols-1 md:grid-cols-2 gap-2\">\n {submodules.map((submodule) => (\n <li key={submodule.name}>\n <Link\n href={`${prefix}/${submodule.path || submodule.name}`}\n className=\"block p-3 rounded-lg border border-gray-200 dark:border-gray-700 hover:border-primary-300 dark:hover:border-primary-600 transition-colors\"\n >\n <div className=\"font-mono text-sm text-primary-600 dark:text-primary-400\">\n {submodule.path || submodule.name}\n </div>\n {submodule.docstring && (\n <div className=\"text-sm text-gray-600 dark:text-gray-300 mt-1 line-clamp-2\">\n {submodule.docstring.value.split('\\n')[0]}\n </div>\n )}\n </Link>\n </li>\n ))}\n </ul>\n </div>\n )}\n\n {/* Classes - summary or full */}\n {classes.length > 0 && (\n <div id=\"classes\" className=\"mb-8\">\n <h2 className=\"text-xl font-semibold text-gray-900 dark:text-white mb-4 pb-2 border-b border-gray-200 dark:border-gray-700\">\n Classes\n </h2>\n {showFull ? (\n <div className=\"space-y-12\">\n {classes.map((cls) => (\n <ClassDoc key={cls.name} cls={cls} prefix={prefix} githubUrl={githubUrl} />\n ))}\n </div>\n ) : (\n <ul className=\"grid grid-cols-1 md:grid-cols-2 gap-2\">\n {classes.map((cls) => (\n <li key={cls.name}>\n <Link\n href={memberHref(cls)}\n className=\"block p-3 rounded-lg border border-gray-200 dark:border-gray-700 hover:border-primary-300 dark:hover:border-primary-600 transition-colors\"\n >\n <div className=\"font-mono text-sm text-primary-600 dark:text-primary-400\">\n {cls.name}\n </div>\n {cls.docstring && (\n <div className=\"text-sm text-gray-600 dark:text-gray-300 mt-1 line-clamp-2\">\n {cls.docstring.value.split('\\n')[0]}\n </div>\n )}\n </Link>\n </li>\n ))}\n </ul>\n )}\n </div>\n )}\n\n {/* Functions - summary or full */}\n {functions.length > 0 && (\n <div id=\"functions\" className=\"mb-8\">\n <h2 className=\"text-xl font-semibold text-gray-900 dark:text-white mb-4 pb-2 border-b border-gray-200 dark:border-gray-700\">\n Functions\n </h2>\n {showFull ? (\n <div className=\"space-y-8\">\n {functions.map((fn) => (\n <FunctionDoc key={fn.name} fn={fn} githubUrl={githubUrl} />\n ))}\n </div>\n ) : (\n <ul className=\"grid grid-cols-1 md:grid-cols-2 gap-2\">\n {functions.map((fn) => (\n <li key={fn.name}>\n <Link\n href={memberHref(fn)}\n className=\"block p-3 rounded-lg border border-gray-200 dark:border-gray-700 hover:border-primary-300 dark:hover:border-primary-600 transition-colors\"\n >\n <div className=\"font-mono text-sm text-primary-600 dark:text-primary-400\">\n {fn.name}()\n </div>\n {fn.docstring && (\n <div className=\"text-sm text-gray-600 dark:text-gray-300 mt-1 line-clamp-2\">\n {fn.docstring.value.split('\\n')[0]}\n </div>\n )}\n </Link>\n </li>\n ))}\n </ul>\n )}\n </div>\n )}\n\n {/* Module-level attributes */}\n {attributes.length > 0 && (\n <div className=\"mb-8\">\n <h2 className=\"text-xl font-semibold text-gray-900 dark:text-white mb-4 pb-2 border-b border-gray-200 dark:border-gray-700\">\n Attributes\n </h2>\n <dl className=\"space-y-3\">\n {attributes.map((attr) => (\n <div key={attr.name} id={attr.name} className=\"scroll-mt-20\">\n <dt className=\"font-mono text-sm\">\n <span className=\"text-orange-600 dark:text-orange-400 font-semibold\">{attr.name}</span>\n {attr.annotation && (\n <>\n <span className=\"text-gray-600 dark:text-gray-400\">: </span>\n <span className=\"text-green-600 dark:text-green-400\">\n {typeof attr.annotation === 'string' ? attr.annotation : attr.annotation.str || attr.annotation.name}\n </span>\n </>\n )}\n {attr.value && (\n <>\n <span className=\"text-gray-600 dark:text-gray-400\"> = </span>\n <span className=\"text-cyan-600 dark:text-cyan-400\">{renderValue(attr.value)}</span>\n </>\n )}\n </dt>\n {attr.docstring && (\n <dd className=\"mt-1 text-sm text-gray-600 dark:text-gray-300 ml-4\">\n {attr.docstring.value}\n </dd>\n )}\n </div>\n ))}\n </dl>\n </div>\n )}\n\n {/* Source location */}\n {(module.relative_package_filepath || module.filepath) && (\n <div className=\"mt-4 text-xs text-gray-500 dark:text-gray-400\">\n <span className=\"font-mono\">{module.relative_package_filepath || module.filepath}</span>\n </div>\n )}\n </div>\n )\n}\n","import type { GriffeDocstring, GriffeDocstringSection, GriffeDocstringElement, GriffeExpression } from '../../types'\nimport { Markdown } from '../Markdown'\n\n/**\n * Render a type annotation expression to string\n */\nfunction renderExpression(expr: GriffeExpression | string | undefined): string {\n if (!expr) return ''\n if (typeof expr === 'string') return expr\n if (expr.str) return expr.str\n if (expr.canonical) return expr.canonical\n\n const exprAny = expr as any\n\n // Handle ExprName with member reference\n if (expr.name && typeof expr.name === 'string') return expr.name\n\n // Handle ExprBoolOp (like `config or StrawberryConfig()`)\n if (exprAny.cls === 'ExprBoolOp' && exprAny.operator && Array.isArray(exprAny.values)) {\n return exprAny.values.map((v: any) => renderExpression(v)).join(` ${exprAny.operator} `)\n }\n\n // Handle ExprBinOp (like `type | None`)\n if (exprAny.cls === 'ExprBinOp' && exprAny.left && exprAny.right) {\n const left = renderExpression(exprAny.left)\n const right = renderExpression(exprAny.right)\n const op = exprAny.operator || '|'\n return `${left} ${op} ${right}`\n }\n\n // Handle ExprCall (like `StrawberryConfig()`)\n if (exprAny.cls === 'ExprCall' && exprAny.function) {\n const funcName = renderExpression(exprAny.function)\n const args = Array.isArray(exprAny.arguments)\n ? exprAny.arguments.map((a: any) => renderExpression(a)).join(', ')\n : ''\n return `${funcName}(${args})`\n }\n\n // Handle ExprAttribute (like contextlib.asynccontextmanager)\n if (exprAny.cls === 'ExprAttribute' && Array.isArray(exprAny.values)) {\n return exprAny.values.map((v: any) => renderExpression(v)).join('.')\n }\n\n // Handle ExprList and ExprTuple\n if ('elements' in exprAny && Array.isArray(exprAny.elements)) {\n const inner = exprAny.elements.map((el: any) => renderExpression(el)).join(', ')\n return exprAny.cls === 'ExprTuple' ? `(${inner})` : `[${inner}]`\n }\n\n // Handle ExprDict\n if (exprAny.cls === 'ExprDict' && Array.isArray(exprAny.keys) && Array.isArray(exprAny.values)) {\n const pairs = exprAny.keys.map((k: any, i: number) =>\n `${renderExpression(k)}: ${renderExpression(exprAny.values[i])}`\n ).join(', ')\n return `{${pairs}}`\n }\n\n // Handle ExprSubscript (like Dict[str, int])\n if (exprAny.left && exprAny.slice) {\n const left = renderExpression(exprAny.left)\n const slice = renderExpression(exprAny.slice)\n return `${left}[${slice}]`\n }\n\n // Handle slice expressions\n if ('slice' in exprAny && exprAny.slice && !exprAny.left) {\n return renderExpression(exprAny.slice)\n }\n\n // Fallback for unknown expressions\n if (typeof expr === 'object') {\n return JSON.stringify(expr)\n }\n\n return String(expr)\n}\n\ninterface DocstringSectionProps {\n section: GriffeDocstringSection\n}\n\nfunction DocstringSection({ section }: DocstringSectionProps) {\n switch (section.kind) {\n case 'text':\n return (\n <div className=\"prose prose-sm dark:prose-invert max-w-none\">\n <Markdown content={section.value as string} />\n </div>\n )\n\n case 'parameters':\n return (\n <div className=\"mt-4\">\n <h4 className=\"text-sm font-semibold text-gray-900 dark:text-white mb-2\">Parameters</h4>\n <dl className=\"space-y-2\">\n {(section.value as GriffeDocstringElement[])?.map((param) => (\n <div key={param.name} className=\"grid grid-cols-[auto_1fr] gap-x-3\">\n <dt className=\"font-mono text-sm\">\n <span className=\"text-orange-600 dark:text-orange-400\">{param.name}</span>\n {param.annotation && (\n <span className=\"text-gray-500 dark:text-gray-400\">\n {' '}({renderExpression(param.annotation)})\n </span>\n )}\n </dt>\n <dd className=\"text-sm text-gray-600 dark:text-gray-300\">\n {param.description}\n </dd>\n </div>\n ))}\n </dl>\n </div>\n )\n\n case 'returns':\n return (\n <div className=\"mt-4\">\n <h4 className=\"text-sm font-semibold text-gray-900 dark:text-white mb-2\">Returns</h4>\n <div className=\"text-sm text-gray-600 dark:text-gray-300\">\n {Array.isArray(section.value) ? (\n (section.value as GriffeDocstringElement[]).map((ret, i) => (\n <div key={i}>\n {ret.annotation && (\n <span className=\"font-mono text-green-600 dark:text-green-400\">\n {renderExpression(ret.annotation)}\n </span>\n )}\n {ret.description && <span> - {ret.description}</span>}\n </div>\n ))\n ) : (\n section.value\n )}\n </div>\n </div>\n )\n\n case 'raises':\n return (\n <div className=\"mt-4\">\n <h4 className=\"text-sm font-semibold text-gray-900 dark:text-white mb-2\">Raises</h4>\n <dl className=\"space-y-2\">\n {(section.value as GriffeDocstringElement[])?.map((exc, i) => (\n <div key={i} className=\"grid grid-cols-[auto_1fr] gap-x-3\">\n <dt className=\"font-mono text-sm text-red-600 dark:text-red-400\">\n {exc.annotation ? renderExpression(exc.annotation) : exc.name}\n </dt>\n <dd className=\"text-sm text-gray-600 dark:text-gray-300\">\n {exc.description}\n </dd>\n </div>\n ))}\n </dl>\n </div>\n )\n\n case 'examples':\n return (\n <div className=\"mt-4\">\n <h4 className=\"text-sm font-semibold text-gray-900 dark:text-white mb-2\">Examples</h4>\n <pre className=\"bg-gray-100 dark:bg-gray-800 rounded-lg p-4 overflow-x-auto text-sm\">\n <code>{section.value as string}</code>\n </pre>\n </div>\n )\n\n case 'attributes':\n return (\n <div className=\"mt-4\">\n <h4 className=\"text-sm font-semibold text-gray-900 dark:text-white mb-2\">Attributes</h4>\n <dl className=\"space-y-2\">\n {(section.value as GriffeDocstringElement[])?.map((attr) => (\n <div key={attr.name} className=\"grid grid-cols-[auto_1fr] gap-x-3\">\n <dt className=\"font-mono text-sm\">\n <span className=\"text-orange-600 dark:text-orange-400\">{attr.name}</span>\n {attr.annotation && (\n <span className=\"text-gray-500 dark:text-gray-400\">\n {' '}({renderExpression(attr.annotation)})\n </span>\n )}\n </dt>\n <dd className=\"text-sm text-gray-600 dark:text-gray-300\">\n {attr.description}\n </dd>\n </div>\n ))}\n </dl>\n </div>\n )\n\n case 'deprecated':\n return (\n <div className=\"mt-4 p-3 bg-yellow-50 dark:bg-yellow-900/20 border border-yellow-200 dark:border-yellow-800 rounded-lg\">\n <h4 className=\"text-sm font-semibold text-yellow-800 dark:text-yellow-200 mb-1\">Deprecated</h4>\n <p className=\"text-sm text-yellow-700 dark:text-yellow-300\">{section.value as string}</p>\n </div>\n )\n\n case 'admonition':\n return (\n <div className=\"mt-4 p-3 bg-blue-50 dark:bg-blue-900/20 border border-blue-200 dark:border-blue-800 rounded-lg\">\n {section.title && (\n <h4 className=\"text-sm font-semibold text-blue-800 dark:text-blue-200 mb-1\">{section.title}</h4>\n )}\n <p className=\"text-sm text-blue-700 dark:text-blue-300\">{section.value as string}</p>\n </div>\n )\n\n default:\n if (section.title) {\n return (\n <div className=\"mt-4\">\n <h4 className=\"text-sm font-semibold text-gray-900 dark:text-white mb-2\">{section.title}</h4>\n <div className=\"text-sm text-gray-600 dark:text-gray-300\">\n {typeof section.value === 'string' ? section.value : JSON.stringify(section.value)}\n </div>\n </div>\n )\n }\n return null\n }\n}\n\ninterface DocstringProps {\n docstring: GriffeDocstring | undefined\n /** Show raw text instead of parsed sections */\n raw?: boolean\n /** Only show the text/description part, skip parameters/returns/etc */\n showOnlyText?: boolean\n /** Additional CSS class */\n className?: string\n}\n\n/**\n * Renders a parsed docstring with sections for parameters, returns, raises, etc.\n */\nexport function Docstring({ docstring, raw = false, showOnlyText = false, className = '' }: DocstringProps) {\n if (!docstring) return null\n\n // If raw mode or no parsed sections, show raw value\n if (raw || !docstring.parsed || docstring.parsed.length === 0) {\n return (\n <div className={`prose prose-sm dark:prose-invert max-w-none ${className}`}>\n <p className=\"whitespace-pre-wrap text-gray-600 dark:text-gray-300\">{docstring.value}</p>\n </div>\n )\n }\n\n // If showOnlyText, only render the first text section (the description)\n if (showOnlyText) {\n const firstTextSection = docstring.parsed.find(s => s.kind === 'text')\n if (!firstTextSection) return null\n\n return (\n <div className={`prose prose-sm dark:prose-invert max-w-none ${className}`}>\n <Markdown content={firstTextSection.value as string} />\n </div>\n )\n }\n\n return (\n <div className={className}>\n {docstring.parsed.map((section, i) => (\n <DocstringSection key={`${section.kind}-${i}`} section={section} />\n ))}\n </div>\n )\n}\n","import { useState } from 'react'\nimport type { GriffeClass, GriffeFunction, GriffeAttribute, GriffeExpression } from '../../types'\nimport { Docstring } from './Docstring'\nimport { FunctionDoc } from './FunctionDoc'\nimport { CodeSpan } from './CodeSpan'\n\n/**\n * Render a type annotation expression or value to string\n */\nfunction renderExpression(expr: GriffeExpression | string | undefined): string {\n if (!expr) return ''\n if (typeof expr === 'string') return expr\n if (expr.str) return expr.str\n if (expr.canonical) return expr.canonical\n\n const exprAny = expr as any\n\n // Handle ExprName with member reference\n if (expr.name && typeof expr.name === 'string') return expr.name\n\n // Handle ExprBoolOp (like `config or StrawberryConfig()`)\n if (exprAny.cls === 'ExprBoolOp' && exprAny.operator && Array.isArray(exprAny.values)) {\n return exprAny.values.map((v: any) => renderExpression(v)).join(` ${exprAny.operator} `)\n }\n\n // Handle ExprBinOp (like `type | None`)\n if (exprAny.cls === 'ExprBinOp' && exprAny.left && exprAny.right) {\n const left = renderExpression(exprAny.left)\n const right = renderExpression(exprAny.right)\n const op = exprAny.operator || '|'\n return `${left} ${op} ${right}`\n }\n\n // Handle ExprCall (like `StrawberryConfig()`)\n if (exprAny.cls === 'ExprCall' && exprAny.function) {\n const funcName = renderExpression(exprAny.function)\n const args = Array.isArray(exprAny.arguments)\n ? exprAny.arguments.map((a: any) => renderExpression(a)).join(', ')\n : ''\n return `${funcName}(${args})`\n }\n\n // Handle ExprAttribute (like contextlib.asynccontextmanager)\n if (exprAny.cls === 'ExprAttribute' && Array.isArray(exprAny.values)) {\n return exprAny.values.map((v: any) => renderExpression(v)).join('.')\n }\n\n // Handle ExprList and ExprTuple\n if ('elements' in exprAny && Array.isArray(exprAny.elements)) {\n const inner = exprAny.elements.map((el: any) => renderExpression(el)).join(', ')\n return exprAny.cls === 'ExprTuple' ? `(${inner})` : `[${inner}]`\n }\n\n // Handle ExprDict\n if (exprAny.cls === 'ExprDict' && Array.isArray(exprAny.keys) && Array.isArray(exprAny.values)) {\n const pairs = exprAny.keys.map((k: any, i: number) =>\n `${renderExpression(k)}: ${renderExpression(exprAny.values[i])}`\n ).join(', ')\n return `{${pairs}}`\n }\n\n // Handle ExprSubscript (like Dict[str, int])\n if (exprAny.left && exprAny.slice) {\n const left = renderExpression(exprAny.left)\n const slice = renderExpression(exprAny.slice)\n return `${left}[${slice}]`\n }\n\n // Handle slice expressions\n if ('slice' in exprAny && exprAny.slice && !exprAny.left) {\n return renderExpression(exprAny.slice)\n }\n\n // Fallback for unknown expressions - try to avoid [object Object]\n if (typeof expr === 'object') {\n return JSON.stringify(expr)\n }\n\n return String(expr)\n}\n\n/**\n * Collapsible method item with arrow indicator (strawberry.rocks style)\n */\nfunction CollapsibleMethod({ method }: { method: GriffeFunction }) {\n const [expanded, setExpanded] = useState(false)\n\n return (\n <div className=\"border-b border-gray-200 dark:border-gray-700 last:border-b-0\">\n <button\n onClick={() => setExpanded(!expanded)}\n className=\"w-full flex items-center gap-2 py-3 text-left hover:bg-gray-50 dark:hover:bg-gray-800/50 transition-colors\"\n >\n <span className=\"font-mono text-base font-semibold text-gray-900 dark:text-white\">\n {method.name}\n </span>\n <span className=\"text-gray-400 text-sm\">\n {expanded ? '▲' : '▼'}\n </span>\n </button>\n {expanded && (\n <div className=\"pb-6\">\n <FunctionDoc fn={method} isMethod showName={false} />\n </div>\n )}\n </div>\n )\n}\n\ninterface ClassDocProps {\n cls: GriffeClass\n /** URL prefix for links */\n prefix?: string\n /** Current path for breadcrumb */\n currentPath?: string\n /** GitHub repo URL for source links */\n githubUrl?: string\n /** Additional CSS class */\n className?: string\n /** Override display path (e.g., for aliases to show alias name instead of target path) */\n displayPath?: string\n}\n\n/**\n * Renders documentation for a class matching strawberry.rocks design.\n * Includes: Title, Constructor, Methods (collapsible), Attributes, and footer.\n */\nexport function ClassDoc({ cls, prefix: _prefix = '/api', currentPath: _currentPath, githubUrl, className = '', displayPath }: ClassDocProps) {\n const members = cls.members ?? {}\n\n // Separate members by type\n const methods: GriffeFunction[] = []\n const attributes: GriffeAttribute[] = []\n\n for (const member of Object.values(members)) {\n // Skip private members\n if (member.name.startsWith('_') && !member.name.startsWith('__')) continue\n\n if (member.kind === 'function') {\n methods.push(member as GriffeFunction)\n } else if (member.kind === 'attribute') {\n attributes.push(member as GriffeAttribute)\n }\n }\n\n // Sort methods: __init__ first, then public methods alphabetically, skip other dunders\n const initMethod = methods.find(m => m.name === '__init__')\n const publicMethods = methods\n .filter(m => m.name !== '__init__' && !m.name.startsWith('_'))\n .sort((a, b) => a.name.localeCompare(b.name))\n\n // Sort attributes alphabetically, skip private ones\n const publicAttributes = attributes\n .filter(a => !a.name.startsWith('_'))\n .sort((a, b) => a.name.localeCompare(b.name))\n\n // Get relative filepath for display (prefer package-relative path)\n const relativeFilepath = cls.relative_package_filepath || cls.relative_filepath || cls.filepath\n\n // Build GitHub URL for source link\n const githubSourceUrl = githubUrl && relativeFilepath && cls.lineno\n ? `${githubUrl}/blob/main/${relativeFilepath}#L${cls.lineno}-L${cls.endlineno || cls.lineno}`\n : undefined\n\n return (\n <div className={className}>\n {/* Title - monospace like strawberry.rocks */}\n <h1 id={cls.name} className=\"font-mono text-2xl font-normal text-gray-900 dark:text-white mb-8\">\n {displayPath || cls.path || cls.name}\n </h1>\n\n {/* Constructor section */}\n {initMethod && (\n <section id=\"constructor\" className=\"mb-8\">\n <h2 className=\"text-2xl font-bold text-gray-900 dark:text-white mb-4\">\n Constructor:\n </h2>\n\n {/* Docstring description */}\n {initMethod.docstring && (\n <div className=\"mb-6\">\n <Docstring docstring={initMethod.docstring} showOnlyText />\n </div>\n )}\n\n <FunctionDoc fn={initMethod} isMethod showName={false} />\n </section>\n )}\n\n {/* Class docstring if no __init__ */}\n {!initMethod && cls.docstring && (\n <section className=\"mb-8\">\n <Docstring docstring={cls.docstring} />\n </section>\n )}\n\n {/* Methods section - collapsible */}\n {publicMethods.length > 0 && (\n <section id=\"methods\" className=\"mb-8\">\n <h2 className=\"text-2xl font-bold text-gray-900 dark:text-white mb-4\">\n Methods:\n </h2>\n <div>\n {publicMethods.map((method) => (\n <CollapsibleMethod key={method.name} method={method} />\n ))}\n </div>\n </section>\n )}\n\n {/* Attributes section */}\n {publicAttributes.length > 0 && (\n <section id=\"attributes\" className=\"mb-8\">\n <h2 className=\"text-2xl font-bold text-gray-900 dark:text-white mb-4\">\n Attributes:\n </h2>\n <div className=\"space-y-2\">\n {publicAttributes.map((attr) => (\n <div key={attr.name} className=\"flex items-baseline gap-2\">\n <CodeSpan>{attr.name}:</CodeSpan>\n {attr.annotation && (\n <span className=\"text-sm text-gray-600 dark:text-gray-400 font-mono\">\n {renderExpression(attr.annotation)}\n </span>\n )}\n </div>\n ))}\n </div>\n </section>\n )}\n\n {/* Footer with file path and GitHub link */}\n {relativeFilepath && (\n <footer className=\"mt-8 pt-6 border-t border-gray-200 dark:border-gray-700 space-y-4\">\n <p className=\"flex items-center gap-2\">\n <span className=\"text-sm font-semibold text-gray-500 dark:text-gray-400 uppercase tracking-wide\">\n File path:\n </span>\n <CodeSpan allowCopy>{relativeFilepath}</CodeSpan>\n </p>\n {githubSourceUrl && (\n <p>\n <a\n href={githubSourceUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-sm font-semibold text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200 uppercase tracking-wide\"\n >\n Open in GitHub\n </a>\n </p>\n )}\n </footer>\n )}\n </div>\n )\n}\n","import { useState } from 'react'\nimport type { GriffeFunction, GriffeParameter, GriffeExpression } from '../../types'\n\n/**\n * Render a type annotation expression to string\n */\nfunction renderExpression(expr: GriffeExpression | string | undefined): string {\n if (!expr) return ''\n if (typeof expr === 'string') return expr\n if (expr.str) return expr.str\n if (expr.canonical) return expr.canonical\n\n const exprAny = expr as any\n\n // Handle ExprName with member reference\n if (expr.name && typeof expr.name === 'string') return expr.name\n\n // Handle ExprBoolOp (like `config or StrawberryConfig()`)\n if (exprAny.cls === 'ExprBoolOp' && exprAny.operator && Array.isArray(exprAny.values)) {\n return exprAny.values.map((v: any) => renderExpression(v)).join(` ${exprAny.operator} `)\n }\n\n // Handle ExprBinOp (like `type | None`)\n if (exprAny.cls === 'ExprBinOp' && exprAny.left && exprAny.right) {\n const left = renderExpression(exprAny.left)\n const right = renderExpression(exprAny.right)\n const op = exprAny.operator || '|'\n return `${left} ${op} ${right}`\n }\n\n // Handle ExprCall (like `StrawberryConfig()`)\n if (exprAny.cls === 'ExprCall' && exprAny.function) {\n const funcName = renderExpression(exprAny.function)\n const args = Array.isArray(exprAny.arguments)\n ? exprAny.arguments.map((a: any) => renderExpression(a)).join(', ')\n : ''\n return `${funcName}(${args})`\n }\n\n // Handle ExprAttribute (like contextlib.asynccontextmanager)\n if (exprAny.cls === 'ExprAttribute' && Array.isArray(exprAny.values)) {\n return exprAny.values.map((v: any) => renderExpression(v)).join('.')\n }\n\n // Handle ExprList and ExprTuple\n if ('elements' in exprAny && Array.isArray(exprAny.elements)) {\n const inner = exprAny.elements.map((el: any) => renderExpression(el)).join(', ')\n return exprAny.cls === 'ExprTuple' ? `(${inner})` : `[${inner}]`\n }\n\n // Handle ExprDict\n if (exprAny.cls === 'ExprDict' && Array.isArray(exprAny.keys) && Array.isArray(exprAny.values)) {\n const pairs = exprAny.keys.map((k: any, i: number) =>\n `${renderExpression(k)}: ${renderExpression(exprAny.values[i])}`\n ).join(', ')\n return `{${pairs}}`\n }\n\n // Handle ExprSubscript (like Dict[str, int])\n if (exprAny.left && exprAny.slice) {\n const left = renderExpression(exprAny.left)\n const slice = renderExpression(exprAny.slice)\n return `${left}[${slice}]`\n }\n\n // Handle slice expressions\n if ('slice' in exprAny && exprAny.slice && !exprAny.left) {\n return renderExpression(exprAny.slice)\n }\n\n // Fallback for unknown expressions\n if (typeof expr === 'object') {\n return JSON.stringify(expr)\n }\n\n return String(expr)\n}\n\n/**\n * Render a parameter with its type annotation and default value\n */\nfunction renderParameter(param: GriffeParameter): string {\n let result = ''\n\n // Handle special parameter kinds\n if (param.kind === 'var-positional') {\n result = `*${param.name}`\n } else if (param.kind === 'var-keyword') {\n result = `**${param.name}`\n } else {\n result = param.name\n }\n\n // Add type annotation\n if (param.annotation) {\n const annotation = renderExpression(param.annotation)\n if (annotation) {\n result += `: ${annotation}`\n }\n }\n\n // Add default value\n if (param.default) {\n result += ` = ${renderExpression(param.default)}`\n }\n\n return result\n}\n\n/**\n * Copy icon component\n */\nfunction CopyIcon() {\n return (\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z\" />\n </svg>\n )\n}\n\n/**\n * Check icon component\n */\nfunction CheckIcon() {\n return (\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 13l4 4L19 7\" />\n </svg>\n )\n}\n\ninterface SignatureProps {\n fn: GriffeFunction\n /** Show full path or just function name */\n showPath?: boolean\n /** Additional CSS class */\n className?: string\n}\n\n/**\n * Renders a Python function/method signature with syntax highlighting.\n * Uses dark background style matching strawberry.rocks.\n */\nexport function Signature({ fn, showPath = false, className = '' }: SignatureProps) {\n const [copied, setCopied] = useState(false)\n const name = showPath && fn.path ? fn.path : fn.name\n const isAsync = fn.is_async\n\n // Filter out 'self' for cleaner display\n const displayParams = fn.parameters?.filter(p => p.name !== 'self') ?? []\n\n // Render return type\n const returnType = renderExpression(fn.returns)\n\n // Build parameter string with proper separators for positional-only and keyword-only\n const buildParamString = (params: GriffeParameter[]): string => {\n const parts: string[] = []\n const hasVarPositional = params.some(p => p.kind === 'var-positional')\n let addedBareAsterisk = false\n\n for (let i = 0; i < params.length; i++) {\n const param = params[i]\n const nextParam = params[i + 1]\n\n // Add the parameter itself\n parts.push(renderParameter(param))\n\n // Add / after last positional-only parameter\n if (param.kind === 'positional-only' && nextParam && nextParam.kind !== 'positional-only') {\n parts.push('/')\n }\n\n // Add bare * before first keyword-only parameter (if no *args)\n if (!hasVarPositional && !addedBareAsterisk && nextParam?.kind === 'keyword-only' && param.kind !== 'keyword-only') {\n parts.push('*')\n addedBareAsterisk = true\n }\n }\n\n return parts.join(', ')\n }\n\n // Build the plain text signature for copying\n const plainSignature = (() => {\n const params = buildParamString(displayParams)\n const prefix = isAsync ? 'async def ' : 'def '\n return returnType\n ? `${prefix}${name}(${params}) -> ${returnType}`\n : `${prefix}${name}(${params})`\n })()\n\n const handleCopy = async () => {\n await navigator.clipboard.writeText(plainSignature)\n setCopied(true)\n setTimeout(() => setCopied(false), 2000)\n }\n\n // Build list of parameter tokens (params + separators like / and *)\n type ParamToken = { type: 'param'; param: GriffeParameter } | { type: 'separator'; value: '/' | '*' }\n const buildParamTokens = (params: GriffeParameter[]): ParamToken[] => {\n const tokens: ParamToken[] = []\n const hasVarPositional = params.some(p => p.kind === 'var-positional')\n let addedBareAsterisk = false\n\n for (let i = 0; i < params.length; i++) {\n const param = params[i]\n const nextParam = params[i + 1]\n\n tokens.push({ type: 'param', param })\n\n // Add / after last positional-only parameter\n if (param.kind === 'positional-only' && nextParam && nextParam.kind !== 'positional-only') {\n tokens.push({ type: 'separator', value: '/' })\n }\n\n // Add bare * before first keyword-only parameter (if no *args)\n if (!hasVarPositional && !addedBareAsterisk && nextParam?.kind === 'keyword-only' && param.kind !== 'keyword-only') {\n tokens.push({ type: 'separator', value: '*' })\n addedBareAsterisk = true\n }\n }\n\n return tokens\n }\n\n const paramTokens = buildParamTokens(displayParams)\n\n // Render a single parameter element\n const renderParamElement = (param: GriffeParameter, multiline: boolean) => (\n <>\n {param.kind === 'var-positional' && <span className=\"text-gray-400\">*</span>}\n {param.kind === 'var-keyword' && <span className=\"text-gray-400\">**</span>}\n <span className=\"text-orange-300\">{param.name}</span>\n {param.annotation && (\n <>\n <span className=\"text-gray-400\">: </span>\n <span className=\"text-emerald-400\">{renderExpression(param.annotation)}</span>\n </>\n )}\n {param.default && (\n <>\n <span className=\"text-gray-400\"> = </span>\n <span className=\"text-blue-300\">{renderExpression(param.default)}</span>\n </>\n )}\n {multiline && <span className=\"text-gray-400\">,</span>}\n </>\n )\n\n // Determine if we need multi-line formatting\n const needsMultiline = displayParams.length > 3\n\n return (\n <div className={`relative group ${className}`}>\n {/* Dark code block like strawberry.rocks */}\n <div className=\"font-mono text-sm bg-gray-900 dark:bg-gray-950 rounded-lg p-4 overflow-x-auto\">\n <code className=\"text-gray-100\">\n {isAsync && <span className=\"text-purple-400\">async </span>}\n <span className=\"text-blue-400\">def</span>\n {' '}\n <span className=\"text-yellow-300\">{name}</span>\n <span className=\"text-gray-400\">(</span>\n {paramTokens.length > 0 && (\n needsMultiline ? (\n // Multi-line for many parameters\n <>\n {paramTokens.map((token, i) => (\n token.type === 'param' ? (\n <span key={token.param.name} className=\"block pl-4\">\n {renderParamElement(token.param, true)}\n </span>\n ) : (\n <span key={`sep-${i}`} className=\"block pl-4\">\n <span className=\"text-gray-400\">{token.value},</span>\n </span>\n )\n ))}\n </>\n ) : (\n // Single line for few parameters\n paramTokens.map((token, i) => (\n token.type === 'param' ? (\n <span key={token.param.name}>\n {i > 0 && <span className=\"text-gray-400\">, </span>}\n {renderParamElement(token.param, false)}\n </span>\n ) : (\n <span key={`sep-${i}`}>\n <span className=\"text-gray-400\">, {token.value}</span>\n </span>\n )\n ))\n )\n )}\n <span className=\"text-gray-400\">)</span>\n {returnType && (\n <>\n <span className=\"text-gray-400\"> -&gt; </span>\n <span className=\"text-emerald-400\">{returnType}</span>\n </>\n )}\n <span className=\"text-gray-400\">:</span>\n <span className=\"block pl-2 text-gray-500\">...</span>\n </code>\n </div>\n\n {/* Copy button */}\n <button\n onClick={handleCopy}\n className=\"absolute top-3 right-3 p-1.5 rounded bg-gray-700 hover:bg-gray-600 opacity-0 group-hover:opacity-100 transition-opacity text-gray-300 hover:text-white\"\n title=\"Copy to clipboard\"\n >\n {copied ? <CheckIcon /> : <CopyIcon />}\n </button>\n </div>\n )\n}\n","import { cn } from '../../lib/utils'\n\ninterface CodeSpanProps {\n children: React.ReactNode\n /** Visual variant */\n variant?: 'default' | 'simple'\n /** Allow copy on click */\n allowCopy?: boolean\n /** Additional CSS class */\n className?: string\n}\n\n/**\n * Styled code span component matching strawberry.rocks design.\n * Uses coral/pink color for code badges.\n */\nexport function CodeSpan({ children, variant = 'default', allowCopy = false, className }: CodeSpanProps) {\n const handleCopy = () => {\n if (allowCopy && typeof children === 'string') {\n navigator.clipboard.writeText(children)\n }\n }\n\n if (variant === 'simple') {\n return (\n <code\n onClick={allowCopy ? handleCopy : undefined}\n className={cn(\n 'font-mono text-[0.9em] font-semibold text-gray-900 dark:text-white',\n allowCopy && 'cursor-pointer hover:text-primary-600 dark:hover:text-primary-400',\n className\n )}\n >\n {children}\n </code>\n )\n }\n\n return (\n <code\n onClick={allowCopy ? handleCopy : undefined}\n className={cn(\n 'inline-flex items-center px-2 py-0.5 rounded font-mono text-sm',\n 'bg-red-50 text-red-600 border border-red-200',\n 'dark:bg-red-900/20 dark:text-red-400 dark:border-red-800/50',\n allowCopy && 'cursor-pointer hover:bg-red-100 dark:hover:bg-red-900/30',\n className\n )}\n >\n {children}\n </code>\n )\n}\n","import type { GriffeParameter, GriffeDocstringSection, GriffeDocstringElement, GriffeExpression } from '../../types'\nimport { CodeSpan } from './CodeSpan'\n\n/**\n * Render a type annotation expression to string\n */\nfunction renderExpression(expr: GriffeExpression | string | undefined): string {\n if (!expr) return ''\n if (typeof expr === 'string') return expr\n if (expr.str) return expr.str\n if (expr.canonical) return expr.canonical\n\n const exprAny = expr as any\n\n // Handle ExprName with member reference\n if (expr.name && typeof expr.name === 'string') return expr.name\n\n // Handle ExprBoolOp (like `config or StrawberryConfig()`)\n if (exprAny.cls === 'ExprBoolOp' && exprAny.operator && Array.isArray(exprAny.values)) {\n return exprAny.values.map((v: any) => renderExpression(v)).join(` ${exprAny.operator} `)\n }\n\n // Handle ExprBinOp (like `type | None`)\n if (exprAny.cls === 'ExprBinOp' && exprAny.left && exprAny.right) {\n const left = renderExpression(exprAny.left)\n const right = renderExpression(exprAny.right)\n const op = exprAny.operator || '|'\n return `${left} ${op} ${right}`\n }\n\n // Handle ExprCall (like `StrawberryConfig()`)\n if (exprAny.cls === 'ExprCall' && exprAny.function) {\n const funcName = renderExpression(exprAny.function)\n const args = Array.isArray(exprAny.arguments)\n ? exprAny.arguments.map((a: any) => renderExpression(a)).join(', ')\n : ''\n return `${funcName}(${args})`\n }\n\n // Handle ExprAttribute (like contextlib.asynccontextmanager)\n if (exprAny.cls === 'ExprAttribute' && Array.isArray(exprAny.values)) {\n return exprAny.values.map((v: any) => renderExpression(v)).join('.')\n }\n\n // Handle ExprList and ExprTuple\n if ('elements' in exprAny && Array.isArray(exprAny.elements)) {\n const inner = exprAny.elements.map((el: any) => renderExpression(el)).join(', ')\n return exprAny.cls === 'ExprTuple' ? `(${inner})` : `[${inner}]`\n }\n\n // Handle ExprDict\n if (exprAny.cls === 'ExprDict' && Array.isArray(exprAny.keys) && Array.isArray(exprAny.values)) {\n const pairs = exprAny.keys.map((k: any, i: number) =>\n `${renderExpression(k)}: ${renderExpression(exprAny.values[i])}`\n ).join(', ')\n return `{${pairs}}`\n }\n\n // Handle ExprSubscript (like Dict[str, int])\n if (exprAny.left && exprAny.slice) {\n const left = renderExpression(exprAny.left)\n const slice = renderExpression(exprAny.slice)\n return `${left}[${slice}]`\n }\n\n // Handle slice expressions\n if ('slice' in exprAny && exprAny.slice && !exprAny.left) {\n return renderExpression(exprAny.slice)\n }\n\n // Fallback for unknown expressions\n if (typeof expr === 'object') {\n return JSON.stringify(expr)\n }\n\n return String(expr)\n}\n\n/**\n * Get parameter description from docstring sections\n */\nfunction getParamDescription(\n paramName: string,\n docstringSections?: GriffeDocstringSection[]\n): string | undefined {\n if (!docstringSections) return undefined\n\n for (const section of docstringSections) {\n if (section.kind === 'parameters' && Array.isArray(section.value)) {\n const param = (section.value as GriffeDocstringElement[]).find(\n (p) => p.name === paramName\n )\n if (param) return param.description\n }\n }\n return undefined\n}\n\ninterface ParameterTableProps {\n parameters: GriffeParameter[]\n /** Docstring sections for parameter descriptions */\n docstringSections?: GriffeDocstringSection[]\n /** Additional CSS class */\n className?: string\n}\n\n/**\n * Renders a two-column parameter list matching strawberry.rocks design.\n * Left column: parameter name badge\n * Right column: description, type, and default value\n */\nexport function ParameterTable({ parameters, docstringSections, className = '' }: ParameterTableProps) {\n if (!parameters || parameters.length === 0) return null\n\n // Filter out 'self' parameter for cleaner display\n const displayParams = parameters.filter(p => p.name !== 'self')\n\n if (displayParams.length === 0) return null\n\n return (\n <ol className={`list-none p-0 ${className}`}>\n {displayParams.map((param, index) => {\n const description = getParamDescription(param.name, docstringSections)\n const annotation = renderExpression(param.annotation)\n const defaultValue = renderExpression(param.default)\n const isLast = index === displayParams.length - 1\n\n return (\n <li\n key={param.name}\n className=\"contents\"\n >\n <div className={`grid grid-cols-[max-content_1fr] items-baseline gap-x-8 gap-y-2 py-6 ${!isLast ? 'border-b border-gray-200 dark:border-gray-700' : ''}`}>\n {/* Parameter name badge - left column */}\n <div className=\"flex-shrink-0\">\n <CodeSpan>\n {param.kind === 'var-positional' && '*'}\n {param.kind === 'var-keyword' && '**'}\n {param.name}:\n </CodeSpan>\n </div>\n\n {/* Description and metadata - right column */}\n <div className=\"space-y-3\">\n {/* Description */}\n {description && (\n <p className=\"text-gray-700 dark:text-gray-300 leading-relaxed\">\n {description}\n </p>\n )}\n\n {/* Type and Default in definition list style */}\n <dl className=\"grid grid-cols-[auto_1fr] gap-x-4 gap-y-2\">\n {annotation && (\n <>\n <dt className=\"font-semibold text-gray-500 dark:text-gray-400\">\n Type\n </dt>\n <dd className=\"m-0\">\n <CodeSpan>{annotation}</CodeSpan>\n </dd>\n </>\n )}\n\n {defaultValue && (\n <>\n <dt className=\"font-semibold text-gray-500 dark:text-gray-400\">\n Default\n </dt>\n <dd className=\"m-0\">\n <CodeSpan>{defaultValue}</CodeSpan>\n </dd>\n </>\n )}\n </dl>\n </div>\n </div>\n </li>\n )\n })}\n </ol>\n )\n}\n","import type { GriffeFunction, GriffeDocstringElement } from '../../types'\nimport { Signature } from './Signature'\nimport { Docstring } from './Docstring'\nimport { ParameterTable } from './ParameterTable'\nimport { CodeSpan } from './CodeSpan'\nimport { Markdown } from '../Markdown'\n\ninterface FunctionDocProps {\n fn: GriffeFunction\n /** Whether this is a method (inside a class) */\n isMethod?: boolean\n /** Show function name as title */\n showName?: boolean\n /** GitHub repo URL for source links */\n githubUrl?: string\n /** Additional CSS class */\n className?: string\n /** Override display path (e.g., for aliases to show alias name instead of target path) */\n displayPath?: string\n}\n\n/**\n * Renders documentation for a function or method matching strawberry.rocks design.\n */\nexport function FunctionDoc({ fn, isMethod = false, showName = true, githubUrl, className = '', displayPath }: FunctionDocProps) {\n const hasParams = fn.parameters && fn.parameters.filter(p => p.name !== 'self').length > 0\n\n // Get returns description from docstring\n const returnsSection = fn.docstring?.parsed?.find(s => s.kind === 'returns')\n const returnsValue = returnsSection?.value\n const returnsDescription = Array.isArray(returnsValue)\n ? (returnsValue[0] as GriffeDocstringElement)?.description\n : undefined\n\n // Get additional text sections (examples, notes, etc.) - all text sections after the first\n const textSections = fn.docstring?.parsed?.filter(s => s.kind === 'text') || []\n const additionalTextSections = textSections.slice(1) // Skip first (description)\n\n // Get relative filepath for display (prefer package-relative path)\n const relativeFilepath = fn.relative_package_filepath || fn.relative_filepath || fn.filepath\n\n // Build GitHub URL for source link\n const githubSourceUrl = githubUrl && relativeFilepath && fn.lineno\n ? `${githubUrl}/blob/main/${relativeFilepath}#L${fn.lineno}-L${fn.endlineno || fn.lineno}`\n : undefined\n\n return (\n <article id={fn.name} className={`scroll-mt-20 ${className}`}>\n {/* Function name/title */}\n {showName && (\n <h1 className=\"font-mono text-2xl font-normal text-gray-900 dark:text-white mb-8\">\n {displayPath || fn.path || fn.name}\n </h1>\n )}\n\n {/* Docstring - description text only */}\n {fn.docstring && (\n <div className=\"mb-6\">\n <Docstring docstring={fn.docstring} showOnlyText />\n </div>\n )}\n\n {/* Returns section */}\n {returnsDescription && (\n <section className=\"mb-6\">\n <h2 className=\"text-2xl font-bold text-gray-900 dark:text-white mb-4\">\n Returns:\n </h2>\n <p className=\"text-gray-700 dark:text-gray-300\">\n {returnsDescription}\n </p>\n </section>\n )}\n\n {/* Signature section */}\n <section className=\"mb-6\">\n <h2 className=\"text-2xl font-bold text-gray-900 dark:text-white mb-4\">\n Signature:\n </h2>\n <Signature fn={fn} />\n </section>\n\n {/* Parameters section */}\n {hasParams && (\n <section id=\"parameters\" className=\"mb-6\">\n <h2 className=\"text-2xl font-bold text-gray-900 dark:text-white mb-4\">\n Parameters:\n </h2>\n <ParameterTable\n parameters={fn.parameters!}\n docstringSections={fn.docstring?.parsed}\n />\n </section>\n )}\n\n {/* Additional text sections (examples, notes, etc.) */}\n {additionalTextSections.length > 0 && (\n <section className=\"mb-6 prose prose-sm dark:prose-invert max-w-none\">\n {additionalTextSections.map((section, i) => (\n <Markdown key={i} content={section.value as string} />\n ))}\n </section>\n )}\n\n {/* Footer with file path and GitHub link (only for top-level functions) */}\n {!isMethod && relativeFilepath && (\n <footer className=\"mt-8 pt-6 border-t border-gray-200 dark:border-gray-700 space-y-4\">\n <p className=\"flex items-center gap-2\">\n <span className=\"text-sm font-semibold text-gray-500 dark:text-gray-400 uppercase tracking-wide\">\n File path:\n </span>\n <CodeSpan allowCopy>{relativeFilepath}</CodeSpan>\n </p>\n {githubSourceUrl && (\n <p>\n <a\n href={githubSourceUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-sm font-semibold text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200 uppercase tracking-wide\"\n >\n Open in GitHub\n </a>\n </p>\n )}\n </footer>\n )}\n </article>\n )\n}\n","// Re-export the shared TableOfContents component\nexport { TableOfContents } from '../TableOfContents'\nexport type { TOCItem as TocItem } from '../../types'\n\n/**\n * Generate TOC items from a class's members\n * Filters out private members (except __init__) to match ClassDoc rendering\n */\nexport function generateClassToc(cls: {\n name: string\n members?: Record<string, { kind: string; name: string }>\n}): { id: string; title: string; level: number }[] {\n const items: { id: string; title: string; level: number }[] = []\n\n // Add class name as top item\n items.push({ id: cls.name, title: cls.name, level: 1 })\n\n if (!cls.members) return items\n\n const members = Object.values(cls.members)\n\n // Filter methods: __init__ is special, skip other private/dunder methods\n const methods = members.filter(m => m.kind === 'function')\n const initMethod = methods.find(m => m.name === '__init__')\n const publicMethods = methods\n .filter(m => m.name !== '__init__' && !m.name.startsWith('_'))\n .sort((a, b) => a.name.localeCompare(b.name))\n\n // Filter attributes: skip private ones\n const publicAttributes = members\n .filter(m => m.kind === 'attribute' && !m.name.startsWith('_'))\n .sort((a, b) => a.name.localeCompare(b.name))\n\n // Add constructor section if exists\n if (initMethod) {\n items.push({ id: 'constructor', title: 'Constructor', level: 2 })\n }\n\n // Add methods section header if there are public methods\n if (publicMethods.length > 0) {\n items.push({ id: 'methods', title: 'Methods', level: 2 })\n }\n\n // Add attributes section header if there are public attributes\n if (publicAttributes.length > 0) {\n items.push({ id: 'attributes', title: 'Attributes', level: 2 })\n }\n\n return items\n}\n","import type { APIPageProps, GriffeModule, GriffeClass, GriffeFunction, GriffeMember, GriffeAlias } from '../../types'\nimport { APILayout } from './APILayout'\nimport { ModuleDoc } from './ModuleDoc'\nimport { ClassDoc } from './ClassDoc'\nimport { FunctionDoc } from './FunctionDoc'\nimport { TableOfContents, generateClassToc, type TocItem } from './TableOfContents'\n\n/**\n * Resolve an alias to its target in the API data\n */\nfunction resolveAlias(alias: GriffeAlias, apiData: GriffeModule): GriffeMember | null {\n const targetPath = alias.target_path\n if (!targetPath) return null\n\n // Split the target path into parts\n const parts = targetPath.split('.')\n const packageName = apiData.name\n\n let current: GriffeModule | GriffeClass = apiData\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i]\n\n // Skip the package name if it matches\n if (i === 0 && part === packageName) continue\n\n // Look in members\n if (current.members) {\n const member: GriffeMember | undefined = current.members[part]\n if (member) {\n // Only modules and classes have members to recurse into\n if (member.kind === 'module' || member.kind === 'class') {\n current = member as GriffeModule | GriffeClass\n } else {\n // Found a function, attribute, or alias - return it\n return member\n }\n } else {\n return null\n }\n } else {\n return null\n }\n }\n\n return current\n}\n\n/**\n * Generate TOC items based on item type\n */\nfunction generateTocItems(item: GriffeMember, apiData: GriffeModule): TocItem[] {\n // Resolve aliases first\n if (item.kind === 'alias') {\n const resolved = resolveAlias(item as GriffeAlias, apiData)\n if (resolved) {\n return generateTocItems(resolved, apiData)\n }\n return []\n }\n\n if (item.kind === 'class') {\n return generateClassToc(item as GriffeClass)\n }\n if (item.kind === 'function') {\n const fn = item as GriffeFunction\n const items: TocItem[] = [{ id: fn.name, title: fn.name, level: 1 }]\n if (fn.parameters && fn.parameters.length > 0) {\n items.push({ id: 'parameters', title: 'Parameters', level: 2 })\n }\n return items\n }\n if (item.kind === 'module') {\n const mod = item as GriffeModule\n const items: TocItem[] = [{ id: mod.name, title: mod.name, level: 1 }]\n if (mod.members) {\n const members = Object.values(mod.members)\n const classes = members.filter(m => m.kind === 'class')\n const functions = members.filter(m => m.kind === 'function')\n\n if (classes.length > 0) {\n items.push({ id: 'classes', title: 'Classes', level: 2 })\n }\n if (functions.length > 0) {\n items.push({ id: 'functions', title: 'Functions', level: 2 })\n }\n }\n return items\n }\n return []\n}\n\n/**\n * Determine what kind of content to render based on the current item\n */\nfunction APIContent({\n item,\n prefix,\n currentPath,\n apiData,\n displayPath,\n githubUrl,\n}: {\n item: GriffeMember\n prefix: string\n currentPath: string\n apiData: GriffeModule\n /** Override the display path (used for aliases to show alias name instead of target) */\n displayPath?: string\n /** GitHub repository URL for \"Open in GitHub\" links */\n githubUrl?: string\n}) {\n // Handle aliases by resolving to target\n if (item.kind === 'alias') {\n const alias = item as GriffeAlias\n const resolved = resolveAlias(alias, apiData)\n if (resolved) {\n // Pass the alias path as displayPath so title shows \"strawberry.enum\" not \"strawberry.types.enum.enum\"\n const aliasDisplayPath = alias.path || `${apiData.name}.${alias.name}`\n return <APIContent item={resolved} prefix={prefix} currentPath={currentPath} apiData={apiData} displayPath={aliasDisplayPath} githubUrl={githubUrl} />\n }\n // Could not resolve alias\n return (\n <div className=\"text-gray-600 dark:text-gray-300\">\n <p>Could not resolve alias: {alias.target_path}</p>\n </div>\n )\n }\n\n switch (item.kind) {\n case 'module':\n return <ModuleDoc module={item as GriffeModule} prefix={prefix} showFull displayPath={displayPath} githubUrl={githubUrl} />\n\n case 'class':\n return <ClassDoc cls={item as GriffeClass} prefix={prefix} currentPath={currentPath} displayPath={displayPath} githubUrl={githubUrl} />\n\n case 'function':\n return <FunctionDoc fn={item as GriffeFunction} displayPath={displayPath} githubUrl={githubUrl} />\n\n default:\n return (\n <div className=\"text-gray-600 dark:text-gray-300\">\n <p>Unknown item type: {item.kind}</p>\n <pre className=\"mt-4 text-xs bg-gray-100 dark:bg-gray-800 p-4 rounded overflow-auto\">\n {JSON.stringify(item, null, 2)}\n </pre>\n </div>\n )\n }\n}\n\n/**\n * Main API documentation page component.\n *\n * Renders API documentation with a separate sidebar navigation.\n * Automatically handles different item types (modules, classes, functions).\n *\n * @example\n * // In your pages configuration:\n * createDocsApp({\n * pages: {\n * 'api/APIPage': APIPage,\n * // ...\n * }\n * })\n */\nexport function APIPage({\n apiData,\n currentItem,\n currentPath,\n currentModule,\n apiNav,\n prefix,\n logoUrl,\n logoInvertedUrl,\n footerLogoUrl,\n footerLogoInvertedUrl,\n githubUrl,\n navLinks,\n header,\n headerHeight,\n footer,\n}: APIPageProps) {\n // Determine what to render\n const itemToRender = currentItem || apiData\n\n // Determine the title\n let title = 'API Reference'\n if (itemToRender) {\n const name = itemToRender.name || currentModule\n const kind = itemToRender.kind\n title = `${name} (${kind}) - API Reference`\n }\n\n // Generate table of contents\n const tocItems = itemToRender ? generateTocItems(itemToRender, apiData) : []\n\n return (\n <APILayout\n title={title}\n apiNav={apiNav}\n currentPath={currentPath}\n logoUrl={logoUrl}\n logoInvertedUrl={logoInvertedUrl}\n footerLogoUrl={footerLogoUrl}\n footerLogoInvertedUrl={footerLogoInvertedUrl}\n githubUrl={githubUrl}\n navLinks={navLinks}\n rightSidebar={tocItems.length > 0 ? <TableOfContents items={tocItems} /> : undefined}\n header={header}\n headerHeight={headerHeight}\n footer={footer}\n >\n <APIContent item={itemToRender} prefix={prefix} currentPath={currentPath} apiData={apiData} githubUrl={githubUrl} />\n </APILayout>\n )\n}\n","import { Link } from '@inertiajs/react'\n\ninterface BreadcrumbItem {\n label: string\n href?: string\n}\n\ninterface BreadcrumbProps {\n items: BreadcrumbItem[]\n className?: string\n}\n\n/**\n * Breadcrumb navigation for API documentation pages.\n * Shows the path: API > Module > Class\n */\nexport function Breadcrumb({ items, className = '' }: BreadcrumbProps) {\n if (items.length === 0) return null\n\n return (\n <nav className={`flex items-center gap-2 text-sm mb-4 ${className}`}>\n {items.map((item, index) => (\n <span key={index} className=\"flex items-center gap-2\">\n {index > 0 && (\n <ChevronIcon className=\"text-gray-400 dark:text-gray-500\" />\n )}\n {item.href ? (\n <Link\n href={item.href}\n className=\"text-gray-500 dark:text-gray-400 hover:text-primary-600 dark:hover:text-primary-400 transition-colors\"\n >\n {item.label}\n </Link>\n ) : (\n <span className=\"text-gray-900 dark:text-white font-medium\">\n {item.label}\n </span>\n )}\n </span>\n ))}\n </nav>\n )\n}\n\nfunction ChevronIcon({ className }: { className?: string }) {\n return (\n <svg\n className={`w-4 h-4 ${className}`}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 5l7 7-7 7\" />\n </svg>\n )\n}\n\n/**\n * Generate breadcrumb items from a path like \"/api/strawberry/schema/schema/Schema\"\n * Combines module path into dotted notation: API > strawberry.schema.schema > Schema\n */\nexport function generateBreadcrumb(currentPath: string, prefix: string = '/api'): BreadcrumbItem[] {\n const items: BreadcrumbItem[] = [{ label: 'API', href: prefix }]\n\n // Remove prefix from path\n const relativePath = currentPath.startsWith(prefix)\n ? currentPath.slice(prefix.length)\n : currentPath\n\n // Split path into parts\n const parts = relativePath.split('/').filter(Boolean)\n\n if (parts.length === 0) return items\n\n // If we have parts, combine all but the last into a module path\n if (parts.length === 1) {\n // Just one part - show it as the current item\n items.push({ label: parts[0] })\n } else {\n // Multiple parts: combine all but last into module path\n const moduleParts = parts.slice(0, -1)\n const finalItem = parts[parts.length - 1]\n\n // Build href for module path (link to the parent)\n const moduleHref = prefix + '/' + moduleParts.join('/')\n\n // Add module path as dotted notation\n items.push({\n label: moduleParts.join('.'),\n href: moduleHref,\n })\n\n // Add final item (class/function name)\n items.push({ label: finalItem })\n }\n\n return items\n}\n","import { createInertiaApp } from '@inertiajs/react'\nimport { createRoot, hydrateRoot } from 'react-dom/client'\nimport type { DocsAppConfig } from './types'\nimport { ComponentsProvider } from './context/ComponentsContext'\nimport { ThemeProvider } from './components/ThemeProvider'\n\n/**\n * Create and mount an Inertia.js documentation app.\n *\n * @example\n * ```tsx\n * import { createDocsApp, DocsPage } from '@usecross/docs'\n *\n * createDocsApp({\n * pages: {\n * 'docs/DocsPage': DocsPage,\n * },\n * title: (title) => `${title} - My Docs`,\n * })\n * ```\n */\nexport function createDocsApp(config: DocsAppConfig): void {\n const { pages, title, components } = config\n\n // Disable scroll restoration on initial page load\n if (typeof window !== 'undefined') {\n window.history.scrollRestoration = 'manual'\n window.scrollTo(0, 0)\n }\n\n createInertiaApp({\n title: title ?? ((pageTitle) => (pageTitle ? `${pageTitle}` : 'Documentation')),\n resolve: (name) => {\n const page = pages[name]\n if (!page) {\n throw new Error(`Page component \"${name}\" not found`)\n }\n return page\n },\n setup({ el, App, props }) {\n const appElement = (\n <ThemeProvider>\n <ComponentsProvider components={components}>\n <App {...props} />\n </ComponentsProvider>\n </ThemeProvider>\n )\n\n if (el.hasChildNodes()) {\n hydrateRoot(el, appElement)\n } else {\n createRoot(el).render(appElement)\n }\n },\n })\n}\n"],"mappings":"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","names":["useState","useEffect","jsx","jsxs","useState","useEffect","Link","useState","useState","jsx","jsxs","useState","useEffect","useState","useRef","jsx","jsxs","useState","useRef","useEffect","useEffect","useState","jsx","defaultTheme","jsx","jsxs","useState","useRef","useEffect","jsx","jsxs","useState","Link","jsx","createContext","useContext","jsx","jsx","useState","jsx","jsxs","Head","Link","createContext","useContext","useState","Fragment","jsx","jsxs","createContext","useContext","useState","GitHubIcon","Link","Head","Head","Link","usePage","useState","jsx","jsxs","GitHubIcon","usePage","useState","Head","Link","Link","jsx","jsxs","useState","useState","Fragment","jsx","jsxs","renderExpression","CheckIcon","jsx","Fragment","jsx","jsxs","renderExpression","jsx","jsxs","jsx","jsxs","renderExpression","useState","Fragment","jsx","jsxs","Link","jsx","jsxs","Link","jsx","jsxs","jsx"]}