specra 0.1.13 → 0.2.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/LICENSE.MD +25 -4
- package/README.md +67 -58
- package/config/specra.config.schema.json +16 -0
- package/config/svelte-config.js +63 -0
- package/dist/api-parser.types.d.ts +59 -0
- package/dist/api-parser.types.js +5 -0
- package/dist/api.types.d.ts +137 -0
- package/dist/api.types.js +5 -0
- package/dist/category.d.ts +21 -0
- package/dist/category.js +48 -0
- package/dist/components/ConfigProvider.svelte +13 -0
- package/dist/components/ConfigProvider.svelte.d.ts +31 -0
- package/dist/components/docs/Accordion.svelte +18 -0
- package/dist/components/docs/Accordion.svelte.d.ts +10 -0
- package/dist/components/docs/AccordionItem.svelte +41 -0
- package/dist/components/docs/AccordionItem.svelte.d.ts +10 -0
- package/dist/components/docs/Badge.svelte +28 -0
- package/dist/components/docs/Badge.svelte.d.ts +9 -0
- package/dist/components/docs/Breadcrumb.svelte +80 -0
- package/dist/components/docs/Breadcrumb.svelte.d.ts +8 -0
- package/dist/components/docs/Callout.svelte +96 -0
- package/dist/components/docs/Callout.svelte.d.ts +10 -0
- package/dist/components/docs/Card.svelte +63 -0
- package/dist/components/docs/Card.svelte.d.ts +12 -0
- package/dist/components/docs/CardGrid.svelte +24 -0
- package/dist/components/docs/CardGrid.svelte.d.ts +8 -0
- package/dist/components/docs/CategoryIndex.svelte +110 -0
- package/dist/components/docs/CategoryIndex.svelte.d.ts +29 -0
- package/dist/components/docs/CodeBlock.svelte +172 -0
- package/dist/components/docs/CodeBlock.svelte.d.ts +8 -0
- package/dist/components/docs/Column.svelte +25 -0
- package/dist/components/docs/Column.svelte.d.ts +8 -0
- package/dist/components/docs/Columns.svelte +38 -0
- package/dist/components/docs/Columns.svelte.d.ts +13 -0
- package/dist/components/docs/DevModeBadge.svelte +15 -0
- package/dist/components/docs/DevModeBadge.svelte.d.ts +18 -0
- package/dist/components/docs/DocBadge.svelte +28 -0
- package/dist/components/docs/DocBadge.svelte.d.ts +9 -0
- package/dist/components/docs/DocLayout.svelte +107 -0
- package/dist/components/docs/DocLayout.svelte.d.ts +32 -0
- package/dist/components/docs/DocLoading.svelte +53 -0
- package/dist/components/docs/DocLoading.svelte.d.ts +18 -0
- package/dist/components/docs/DocMetadata.svelte +106 -0
- package/dist/components/docs/DocMetadata.svelte.d.ts +18 -0
- package/dist/components/docs/DocNavigation.svelte +56 -0
- package/dist/components/docs/DocNavigation.svelte.d.ts +12 -0
- package/dist/components/docs/DocTags.svelte +22 -0
- package/dist/components/docs/DocTags.svelte.d.ts +6 -0
- package/dist/components/docs/DraftBadge.svelte +10 -0
- package/dist/components/docs/DraftBadge.svelte.d.ts +18 -0
- package/dist/components/docs/Footer.svelte +72 -0
- package/dist/components/docs/Footer.svelte.d.ts +7 -0
- package/dist/components/docs/Frame.svelte +27 -0
- package/dist/components/docs/Frame.svelte.d.ts +9 -0
- package/dist/components/docs/Header.svelte +123 -0
- package/dist/components/docs/Header.svelte.d.ts +9 -0
- package/dist/components/docs/HeaderWithMenu.svelte +34 -0
- package/dist/components/docs/HeaderWithMenu.svelte.d.ts +17 -0
- package/dist/components/docs/HotReloadIndicator.svelte +44 -0
- package/dist/components/docs/HotReloadIndicator.svelte.d.ts +3 -0
- package/dist/components/docs/Icon.svelte +103 -0
- package/dist/components/docs/Icon.svelte.d.ts +11 -0
- package/dist/components/docs/Image.svelte +88 -0
- package/dist/components/docs/Image.svelte.d.ts +11 -0
- package/dist/components/docs/ImageCard.svelte +91 -0
- package/dist/components/docs/ImageCard.svelte.d.ts +12 -0
- package/dist/components/docs/ImageCardGrid.svelte +25 -0
- package/dist/components/docs/ImageCardGrid.svelte.d.ts +8 -0
- package/dist/components/docs/LayoutProviders.svelte +57 -0
- package/dist/components/docs/LayoutProviders.svelte.d.ts +9 -0
- package/dist/components/docs/Logo.svelte +25 -0
- package/dist/components/docs/Logo.svelte.d.ts +11 -0
- package/dist/components/docs/Math.svelte +54 -0
- package/dist/components/docs/Math.svelte.d.ts +7 -0
- package/dist/components/docs/MdxContent.svelte +41 -0
- package/dist/components/docs/MdxHotReload.svelte +78 -0
- package/dist/components/docs/MdxHotReload.svelte.d.ts +9 -0
- package/dist/components/docs/MdxLayout.svelte +16 -0
- package/dist/components/docs/MdxLayout.svelte.d.ts +6 -0
- package/dist/components/docs/Mermaid.svelte +88 -0
- package/dist/components/docs/Mermaid.svelte.d.ts +7 -0
- package/dist/components/docs/MobileDocLayout.svelte +211 -0
- package/dist/components/docs/MobileDocLayout.svelte.d.ts +35 -0
- package/dist/components/docs/MobileSidebar.svelte +122 -0
- package/dist/components/docs/MobileSidebar.svelte.d.ts +31 -0
- package/dist/components/docs/MobileSidebarWrapper.svelte +122 -0
- package/dist/components/docs/MobileSidebarWrapper.svelte.d.ts +32 -0
- package/dist/components/docs/NotFoundContent.svelte +40 -0
- package/dist/components/docs/NotFoundContent.svelte.d.ts +6 -0
- package/dist/components/docs/SearchHighlight.svelte +116 -0
- package/dist/components/docs/SearchHighlight.svelte.d.ts +3 -0
- package/dist/components/docs/SearchModal.svelte +239 -0
- package/dist/components/docs/SearchModal.svelte.d.ts +9 -0
- package/dist/components/docs/Sidebar.svelte +69 -0
- package/dist/components/docs/Sidebar.svelte.d.ts +31 -0
- package/dist/components/docs/SidebarMenuItems.svelte +344 -0
- package/dist/components/docs/SidebarMenuItems.svelte.d.ts +33 -0
- package/dist/components/docs/SidebarSkeleton.svelte +50 -0
- package/dist/components/docs/SidebarSkeleton.svelte.d.ts +18 -0
- package/dist/components/docs/SiteBanner.svelte +92 -0
- package/dist/components/docs/SiteBanner.svelte.d.ts +7 -0
- package/dist/components/docs/Step.svelte +44 -0
- package/dist/components/docs/Step.svelte.d.ts +8 -0
- package/dist/components/docs/Steps.svelte +15 -0
- package/dist/components/docs/Steps.svelte.d.ts +7 -0
- package/dist/components/docs/Tab.svelte +40 -0
- package/dist/components/docs/Tab.svelte.d.ts +8 -0
- package/dist/components/docs/TabGroups.svelte +183 -0
- package/dist/components/docs/TabGroups.svelte.d.ts +25 -0
- package/dist/components/docs/TableOfContents.svelte +100 -0
- package/dist/components/docs/TableOfContents.svelte.d.ts +9 -0
- package/dist/components/docs/Tabs.svelte +69 -0
- package/dist/components/docs/Tabs.svelte.d.ts +8 -0
- package/dist/components/docs/ThemeToggle.svelte +16 -0
- package/dist/components/docs/ThemeToggle.svelte.d.ts +18 -0
- package/dist/components/docs/Tooltip.svelte +44 -0
- package/dist/components/docs/Tooltip.svelte.d.ts +10 -0
- package/dist/components/docs/VersionSwitcher.svelte +95 -0
- package/dist/components/docs/VersionSwitcher.svelte.d.ts +7 -0
- package/dist/components/docs/Video.svelte +84 -0
- package/dist/components/docs/Video.svelte.d.ts +12 -0
- package/dist/components/docs/api/ApiEndpoint.svelte +61 -0
- package/dist/components/docs/api/ApiEndpoint.svelte.d.ts +11 -0
- package/dist/components/docs/api/ApiParams.svelte +80 -0
- package/dist/components/docs/api/ApiParams.svelte.d.ts +14 -0
- package/dist/components/docs/api/ApiPlayground.svelte +259 -0
- package/dist/components/docs/api/ApiPlayground.svelte.d.ts +16 -0
- package/dist/components/docs/api/ApiReference.svelte +278 -0
- package/dist/components/docs/api/ApiReference.svelte.d.ts +23 -0
- package/dist/components/docs/api/ApiResponse.svelte +66 -0
- package/dist/components/docs/api/ApiResponse.svelte.d.ts +9 -0
- package/dist/components/docs/api/index.d.ts +5 -0
- package/dist/components/docs/api/index.js +5 -0
- package/dist/components/docs/componentTextProps.d.ts +3 -0
- package/dist/components/docs/componentTextProps.js +61 -0
- package/dist/components/docs/index.d.ts +54 -0
- package/dist/components/docs/index.js +56 -0
- package/dist/components/global/VersionNotFound.svelte +48 -0
- package/dist/components/global/VersionNotFound.svelte.d.ts +7 -0
- package/dist/components/global/index.d.ts +1 -0
- package/dist/components/global/index.js +1 -0
- package/dist/components/index.d.ts +6 -822
- package/dist/components/index.js +11 -3854
- package/dist/components/ui/Badge.svelte +48 -0
- package/dist/components/ui/Badge.svelte.d.ts +15 -0
- package/dist/components/ui/Button.svelte +58 -0
- package/dist/components/ui/Button.svelte.d.ts +17 -0
- package/dist/components/ui/Dialog.svelte +16 -0
- package/dist/components/ui/Dialog.svelte.d.ts +9 -0
- package/dist/components/ui/DialogClose.svelte +16 -0
- package/dist/components/ui/DialogClose.svelte.d.ts +9 -0
- package/dist/components/ui/DialogContent.svelte +43 -0
- package/dist/components/ui/DialogContent.svelte.d.ts +10 -0
- package/dist/components/ui/DialogDescription.svelte +21 -0
- package/dist/components/ui/DialogDescription.svelte.d.ts +9 -0
- package/dist/components/ui/DialogFooter.svelte +20 -0
- package/dist/components/ui/DialogFooter.svelte.d.ts +9 -0
- package/dist/components/ui/DialogHeader.svelte +20 -0
- package/dist/components/ui/DialogHeader.svelte.d.ts +9 -0
- package/dist/components/ui/DialogTitle.svelte +21 -0
- package/dist/components/ui/DialogTitle.svelte.d.ts +9 -0
- package/dist/components/ui/Input.svelte +23 -0
- package/dist/components/ui/Input.svelte.d.ts +8 -0
- package/dist/components/ui/Textarea.svelte +19 -0
- package/dist/components/ui/Textarea.svelte.d.ts +7 -0
- package/dist/components/ui/index.d.ts +11 -0
- package/dist/components/ui/index.js +11 -0
- package/dist/config.d.ts +8 -0
- package/dist/config.js +9 -0
- package/dist/config.schema.json +471 -0
- package/dist/config.server.d.ts +46 -0
- package/dist/config.server.js +149 -0
- package/dist/{mdx-ColN3Cyg.d.mts → config.types.d.ts} +22 -75
- package/dist/config.types.js +39 -0
- package/dist/dev-utils.d.ts +29 -0
- package/dist/dev-utils.js +63 -0
- package/dist/index.d.ts +19 -4
- package/dist/index.js +25 -4861
- package/dist/mdx-cache.d.ts +41 -0
- package/dist/mdx-cache.js +160 -0
- package/dist/mdx-components.js +50 -1931
- package/dist/mdx-security.d.ts +76 -0
- package/dist/mdx-security.js +217 -0
- package/dist/mdx.d.ts +73 -0
- package/dist/mdx.js +1099 -0
- package/dist/middleware/index.d.ts +1 -0
- package/dist/middleware/index.js +2 -0
- package/dist/middleware/security.d.ts +22 -47
- package/dist/middleware/security.js +111 -137
- package/dist/parsers/base-parser.d.ts +14 -0
- package/dist/parsers/base-parser.js +1 -0
- package/dist/parsers/index.d.ts +16 -0
- package/dist/parsers/index.js +51 -0
- package/dist/parsers/openapi-parser.d.ts +18 -0
- package/dist/parsers/openapi-parser.js +209 -0
- package/dist/parsers/postman-parser.d.ts +20 -0
- package/dist/parsers/postman-parser.js +260 -0
- package/dist/parsers/specra-parser.d.ts +10 -0
- package/dist/parsers/specra-parser.js +18 -0
- package/dist/redirects.d.ts +12 -0
- package/dist/redirects.js +30 -0
- package/dist/remark-code-meta.d.ts +6 -0
- package/dist/remark-code-meta.js +21 -0
- package/dist/sidebar-utils.d.ts +59 -0
- package/dist/sidebar-utils.js +144 -0
- package/dist/stores/config.d.ts +20 -0
- package/dist/stores/config.js +45 -0
- package/dist/stores/index.d.ts +4 -0
- package/dist/stores/index.js +4 -0
- package/dist/stores/sidebar.d.ts +7 -0
- package/dist/stores/sidebar.js +12 -0
- package/dist/stores/tabs.d.ts +6 -0
- package/dist/stores/tabs.js +41 -0
- package/dist/stores/theme.d.ts +7 -0
- package/dist/stores/theme.js +75 -0
- package/dist/{styles.css → styles/globals.css} +136 -6
- package/dist/toc.d.ts +9 -0
- package/dist/toc.js +15 -0
- package/dist/utils.d.ts +13 -0
- package/dist/utils.js +30 -0
- package/package.json +47 -90
- package/dist/app/api/mdx-watch/route.d.mts +0 -10
- package/dist/app/api/mdx-watch/route.d.ts +0 -10
- package/dist/app/api/mdx-watch/route.js +0 -118
- package/dist/app/api/mdx-watch/route.js.map +0 -1
- package/dist/app/api/mdx-watch/route.mjs +0 -91
- package/dist/app/api/mdx-watch/route.mjs.map +0 -1
- package/dist/chunk-6S3EJVEO.mjs +0 -259
- package/dist/chunk-6S3EJVEO.mjs.map +0 -1
- package/dist/chunk-BE7EROIW.mjs +0 -212
- package/dist/chunk-BE7EROIW.mjs.map +0 -1
- package/dist/chunk-CWHRZHZO.mjs +0 -168
- package/dist/chunk-CWHRZHZO.mjs.map +0 -1
- package/dist/chunk-D5VDVYFY.mjs +0 -1325
- package/dist/chunk-D5VDVYFY.mjs.map +0 -1
- package/dist/chunk-WMCO2UX5.mjs +0 -585
- package/dist/chunk-WMCO2UX5.mjs.map +0 -1
- package/dist/chunk-XEMGCPZZ.mjs +0 -475
- package/dist/chunk-XEMGCPZZ.mjs.map +0 -1
- package/dist/components/index.d.mts +0 -822
- package/dist/components/index.js.map +0 -1
- package/dist/components/index.mjs +0 -3741
- package/dist/components/index.mjs.map +0 -1
- package/dist/index.d.mts +0 -4
- package/dist/index.js.map +0 -1
- package/dist/index.mjs +0 -1897
- package/dist/index.mjs.map +0 -1
- package/dist/layouts/index.d.mts +0 -34
- package/dist/layouts/index.d.ts +0 -34
- package/dist/layouts/index.js +0 -453
- package/dist/layouts/index.js.map +0 -1
- package/dist/layouts/index.mjs +0 -173
- package/dist/layouts/index.mjs.map +0 -1
- package/dist/lib/index.d.mts +0 -583
- package/dist/lib/index.d.ts +0 -583
- package/dist/lib/index.js +0 -1595
- package/dist/lib/index.js.map +0 -1
- package/dist/lib/index.mjs +0 -111
- package/dist/lib/index.mjs.map +0 -1
- package/dist/mdx-ColN3Cyg.d.ts +0 -352
- package/dist/mdx-components.d.mts +0 -86
- package/dist/mdx-components.d.ts +0 -86
- package/dist/mdx-components.js.map +0 -1
- package/dist/mdx-components.mjs +0 -206
- package/dist/mdx-components.mjs.map +0 -1
- package/dist/middleware/security.d.mts +0 -82
- package/dist/middleware/security.js.map +0 -1
- package/dist/middleware/security.mjs +0 -84
- package/dist/middleware/security.mjs.map +0 -1
- package/dist/styles.css.map +0 -1
- package/dist/styles.d.mts +0 -2
- package/dist/styles.d.ts +0 -2
- package/dist/styles.js +0 -2
- package/dist/styles.js.map +0 -1
- package/dist/styles.mjs +0 -1
- package/dist/styles.mjs.map +0 -1
package/dist/index.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/docs/componentTextProps.ts","../src/components/docs/dev-mode-badge.tsx","../src/components/docs/mobile-doc-layout.tsx","../src/components/docs/footer.tsx","../src/components/docs/logo.tsx","../src/components/docs/site-banner.tsx","../src/components/docs/tab-groups.tsx","../src/components/docs/sidebar-menu-items.tsx","../src/components/docs/sidebar.tsx","../src/components/docs/tab-context.tsx","../src/components/docs/doc-layout-wrapper.tsx","../src/components/docs/doc-loading.tsx","../src/components/docs/header.tsx","../src/components/docs/version-switcher.tsx","../src/components/docs/language-switcher.tsx","../src/components/config-provider.tsx","../src/components/docs/theme-toggle.tsx","../src/components/docs/search-modal.tsx","../src/components/ui/dialog.tsx","../src/components/docs/hot-reload-indicator.tsx","../src/components/docs/mdx-hot-reload.tsx","../src/components/docs/not-found-content.tsx","../src/components/docs/search-highlight.tsx","../src/components/docs/sidebar-skeleton.tsx","../src/components/docs/table-of-contents.tsx","../src/components/global/version-not-found.tsx"],"sourcesContent":["\n\nexport const COMPONENT_TEXT_PROPS: Record<string, string[]> = {\n // Accordion components\n Accordion: [\"title\"],\n AccordionItem: [\"title\"],\n\n // Alert/Callout components\n Alert: [\"title\", \"description\"],\n Banner: [\"title\"],\n Callout: [\"title\", \"content\"],\n Note: [\"title\"],\n Warning: [\"title\", \"text\"],\n\n // Navigation components\n BreadCrumb: [\"title\", \"slug\", \"version\"],\n\n // Card components\n Card: [\"title\", \"description\"],\n ImageCard: [\"title\", \"description\", \"alt\"],\n\n // Media components\n Image: [\"alt\", \"caption\"],\n Video: [\"caption\"],\n Frame: [\"title\"],\n Mermaid: [\"caption\"],\n\n // Interactive components\n Tooltip: [\"content\"],\n\n // Code components\n CodeBlock: [\"filename\"],\n\n // Step components\n Step: [\"title\"],\n}\n\nexport function extractComponentPropsText(mdx: string): string {\n return mdx.replace(\n /<([A-Z][\\w]*)\\b([^/>]*)\\/>/g,\n (_, component, props) => {\n const searchableProps = COMPONENT_TEXT_PROPS[component]\n if (!searchableProps) return \" \"\n\n let extracted = \"\"\n\n for (const prop of searchableProps) {\n const match = props.match(\n new RegExp(`${prop}=\"([^\"]+)\"`, \"i\")\n )\n if (match) {\n extracted += \" \" + match[1]\n }\n }\n\n return extracted || \" \"\n }\n )\n}\n\nexport function extractSearchText(mdx: string): string {\n return extractComponentPropsText(mdx)\n // 2. Remove fenced code blocks\n .replace(/```[\\s\\S]*?```/g, \" \")\n\n // 3. Remove JSX blocks with children\n .replace(/<([A-Z][\\w]*)\\b[^>]*>[\\s\\S]*?<\\/\\1>/g, \" \")\n\n // 4. Remove remaining JSX & HTML\n .replace(/<\\/?[A-Za-z][^>]*>/g, \" \")\n\n // 5. Remove inline code\n .replace(/`[^`]+`/g, \" \")\n\n // 6. Remove markdown links (keep text)\n .replace(/\\[([^\\]]+)\\]\\([^)]+\\)/g, \"$1\")\n\n // 7. Remove markdown noise\n .replace(/[#>*_~=-]+/g, \" \")\n\n // 8. Normalize whitespace\n .replace(/\\s+/g, \" \")\n .trim()\n .slice(0, 1000)\n}","import { useEffect, useState } from \"react\"\nimport { Code2, Wifi } from \"lucide-react\"\n\nexport function DevModeBadge() {\n const [isConnected, setIsConnected] = useState(true)\n\n useEffect(() => {\n if (process.env.NODE_ENV !== \"development\") return\n\n // Check WebSocket connection status\n const checkConnection = () => {\n setIsConnected(navigator.onLine)\n }\n\n window.addEventListener(\"online\", checkConnection)\n window.addEventListener(\"offline\", checkConnection)\n\n return () => {\n window.removeEventListener(\"online\", checkConnection)\n window.removeEventListener(\"offline\", checkConnection)\n }\n }, [])\n\n if (process.env.NODE_ENV !== \"development\") return null\n\n return (\n <div className=\"fixed top-20 left-4 z-40 flex items-center gap-2 px-3 py-1.5 bg-orange-500/10 text-orange-600 dark:text-orange-400 border border-orange-500/20 rounded-full text-xs font-medium\">\n <Code2 className=\"h-3 w-3\" />\n <span>Dev Mode</span>\n <div className={`h-2 w-2 rounded-full ${isConnected ? \"bg-green-500\" : \"bg-red-500\"} animate-pulse`} />\n </div>\n )\n}\n","\"use client\"\n\nimport { useState, ReactNode, cloneElement, isValidElement } from \"react\"\nimport Link from \"next/link\"\nimport { Footer } from \"./footer\"\nimport { SiteBanner } from \"./site-banner\"\nimport { TabGroups } from \"./tab-groups\"\nimport { Sidebar } from \"./sidebar\"\nimport { SidebarMenuItems } from \"./sidebar-menu-items\"\nimport { Logo } from \"./logo\"\nimport type { SpecraConfig } from \"@/lib/config\"\nimport type { Doc } from \"@/lib/mdx\"\n\ninterface MobileDocLayoutProps {\n header: ReactNode\n docs: Doc[]\n version: string\n children: ReactNode\n toc: ReactNode\n config: SpecraConfig\n activeTabGroup?: string\n onTabChange?: (tabId: string) => void\n}\n\nexport function MobileDocLayout({ header, docs, version, children, toc, config, activeTabGroup, onTabChange }: MobileDocLayoutProps) {\n const [sidebarOpen, setSidebarOpen] = useState(false)\n\n const handleTabChange = (tabId: string) => {\n onTabChange?.(tabId)\n }\n\n const closeSidebar = () => setSidebarOpen(false)\n const toggleSidebar = () => setSidebarOpen(!sidebarOpen)\n\n // Clone header and pass onMenuClick prop if it's a valid React element\n const headerWithProps = isValidElement(header)\n ? cloneElement(header as React.ReactElement<any>, {\n onMenuClick: toggleSidebar,\n })\n : header\n\n return (\n <div className=\"min-h-screen bg-background\">\n {/* Header */}\n {headerWithProps}\n\n {/* Site-wide Banner */}\n <SiteBanner config={config} />\n\n {/* Tab Groups - shown only if configured */}\n {config.navigation?.tabGroups && config.navigation.tabGroups.length > 0 && (\n <TabGroups\n tabGroups={config.navigation.tabGroups}\n activeTabId={activeTabGroup}\n onTabChange={handleTabChange}\n docs={docs}\n version={version}\n />\n )}\n\n {/* Mobile Sidebar Overlay */}\n {sidebarOpen && (\n <div\n className=\"lg:hidden fixed inset-0 bg-background/80 backdrop-blur-sm z-40\"\n onClick={() => setSidebarOpen(false)}\n />\n )}\n\n {/* Mobile Sidebar */}\n <div\n className={`lg:hidden fixed top-0 left-0 h-full w-72 bg-background border-r border-border z-50 transform transition-transform duration-300 ease-in-out ${sidebarOpen ? \"translate-x-0\" : \"-translate-x-full\"\n }`}\n >\n <div className=\"flex flex-col h-full\">\n {/* Logo and Site Title Header */}\n <div className=\"shrink-0 px-4 py-4 border-b border-border\">\n <Link href=\"/\" className=\"flex items-center gap-2 group justify-center\">\n {!config.site?.hideLogo && (\n <Logo\n logo={config.site?.logo}\n alt={config.site?.title || \"Logo\"}\n className=\"w-18 object-contain\"\n />\n )}\n <div className=\"flex flex-col\">\n <span className=\"font-semibold text-foreground group-hover:text-primary transition-colors\">\n {config.site?.title || \"Documentation\"}\n </span>\n {config.site?.description && (\n <span className=\"text-xs text-muted-foreground line-clamp-1\">\n {config.site.description}\n </span>\n )}\n </div>\n </Link>\n </div>\n\n {/* Documentation Label */}\n <div className=\"shrink-0 px-4 pt-4 pb-2\">\n <h2 className=\"text-xs font-semibold text-muted-foreground uppercase tracking-wider px-2\">Documentation</h2>\n </div>\n\n {/* Tab Groups Dropdown - Mobile Only */}\n {config.navigation?.tabGroups && config.navigation.tabGroups.length > 0 && (\n <div className=\"shrink-0 px-4 py-3 border-b border-border\">\n <TabGroups\n tabGroups={config.navigation.tabGroups}\n activeTabId={activeTabGroup}\n onTabChange={handleTabChange}\n mobileOnly\n docs={docs}\n version={version}\n />\n </div>\n )}\n\n {/* Sidebar Menu Items */}\n <div className=\"flex-1 overflow-y-auto px-4 py-4\">\n <SidebarMenuItems\n docs={docs}\n version={version}\n config={config}\n onLinkClick={closeSidebar}\n activeTabGroup={activeTabGroup}\n />\n </div>\n </div>\n </div>\n\n {/* Main Content */}\n <main className=\"container mx-auto px-2 md:px-6 py-8\">\n <div className=\"flex\">\n {/* Desktop Sidebar */}\n <div className=\"hidden lg:block\">\n <Sidebar\n docs={docs}\n version={version}\n config={config}\n activeTabGroup={activeTabGroup}\n />\n </div>\n\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex flex-col gap-2 px-2 md:px-8\">\n {/* Content */}\n {children}\n\n {/* Footer */}\n <Footer config={config} />\n\n </div>\n </div>\n\n {/* ToC */}\n {toc}\n </div>\n\n\n </main>\n\n </div>\n )\n}\n","import Link from \"next/link\"\nimport { getConfig, SpecraConfig } from \"@/lib/config\"\nimport { Logo } from \"./logo\"\n\nexport function Footer({ config }: { config: SpecraConfig }) {\n // Server component - can use getConfig directly\n // const config = getConfig()\n\n if (!config.footer) {\n return null\n }\n\n return (\n <footer className=\"bg-muted/30 dark:bg-muted/10 rounded-2xl mt-24\">\n <div className=\"px-2 md:px-6 py-12\">\n {config.footer.links && config.footer.links.length > 0 && (\n <div className=\"grid grid-cols-2 md:grid-cols-4 gap-8 mb-8\">\n {config.footer.links.map((column, idx) => (\n <div key={idx}>\n <h3 className=\"font-semibold text-foreground mb-4\">{column.title}</h3>\n <ul className=\"space-y-2\">\n {column.items.map((item, itemIdx) => (\n <li key={itemIdx}>\n <Link\n href={item.href}\n className=\"text-sm text-muted-foreground hover:text-foreground transition-colors\"\n >\n {item.label}\n </Link>\n </li>\n ))}\n </ul>\n </div>\n ))}\n </div>\n )}\n\n <div className=\"pt-8 border-t border-border/50\">\n <div className=\"flex flex-col md:flex-row items-center justify-between gap-4\">\n {config.footer.copyright && (\n <p className=\"text-sm text-muted-foreground text-center md:text-left\">\n {config.footer.copyright}\n </p>\n )}\n\n {config.footer.branding?.showBranding && (\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n {config.footer.branding.logo && (\n <Logo\n logo={config.footer.branding.logo}\n alt={config.footer.branding.title || \"Powered by\"}\n className=\"h-5 w-auto object-contain\"\n />\n )}\n <span>Powered by</span>\n {config.footer.branding.url ? (\n <Link\n href={config.footer.branding.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"font-semibold hover:text-foreground transition-colors\"\n >\n {config.footer.branding.title || \"Specra\"}\n </Link>\n ) : (\n <span className=\"font-semibold\">\n {config.footer.branding.title || \"Specra\"}\n </span>\n )}\n </div>\n )}\n </div>\n </div>\n </div>\n </footer>\n )\n}\n","\nimport { useTheme } from \"next-themes\"\nimport { useEffect, useState } from \"react\"\n\ninterface LogoProps {\n logo?: string | { light: string; dark: string }\n alt?: string\n className?: string\n}\n\nexport function Logo({ logo, alt = \"Logo\", className = \"h-8 w-8 object-contain\" }: LogoProps) {\n const { resolvedTheme } = useTheme()\n const [mounted, setMounted] = useState(false)\n\n // Avoid hydration mismatch by only rendering theme-dependent content after mount\n useEffect(() => {\n setMounted(true)\n }, [])\n\n if (!logo) return null\n\n // If logo is a string, use it directly\n if (typeof logo === \"string\") {\n return <img src={logo} alt={alt} className={className} />\n }\n\n // If logo is an object with light/dark variants\n // Use light as fallback during SSR and before theme is determined\n if (!mounted) {\n return <img src={logo.light} alt={alt} className={className} />\n }\n\n const logoSrc = resolvedTheme === \"dark\" ? logo.dark : logo.light\n\n return <img src={logoSrc} alt={alt} className={className} />\n}\n","\n\nimport { X, AlertCircle, CheckCircle, Info, XCircle } from \"lucide-react\"\nimport { useState, useEffect } from \"react\"\nimport type { SpecraConfig } from \"@/lib/config\"\n\ninterface SiteBannerProps {\n config: SpecraConfig\n}\n\nexport function SiteBanner({ config }: SiteBannerProps) {\n const [dismissed, setDismissed] = useState(false)\n const [mounted, setMounted] = useState(false)\n \n const banner = config.banner\n const storageKey = \"site-banner-dismissed\"\n \n useEffect(() => {\n setMounted(true)\n // Check if banner was previously dismissed\n const isDismissed = localStorage.getItem(storageKey) === \"true\"\n setDismissed(isDismissed)\n }, [])\n \n const handleDismiss = () => {\n setDismissed(true)\n localStorage.setItem(storageKey, \"true\")\n }\n \n // Don't render on server or if no banner configured or if dismissed\n if (!mounted || !banner || !banner.enabled || dismissed) {\n return null\n }\n\n const typeConfig = {\n info: {\n icon: Info,\n bg: \"bg-blue-500/10 dark:bg-blue-400/5\",\n border: \"border-blue-500/30 dark:border-blue-500/20\",\n iconColor: \"text-blue-600 dark:text-blue-400\",\n textColor: \"text-blue-900 dark:text-blue-300\",\n },\n success: {\n icon: CheckCircle,\n bg: \"bg-green-500/10 dark:bg-green-400/5\",\n border: \"border-green-500/30 dark:border-green-500/20\",\n iconColor: \"text-green-600 dark:text-green-400\",\n textColor: \"text-green-900 dark:text-green-300\",\n },\n warning: {\n icon: AlertCircle,\n bg: \"bg-yellow-500/10 dark:bg-yellow-400/5\",\n border: \"border-yellow-500/30 dark:border-yellow-500/20\",\n iconColor: \"text-yellow-600 dark:text-yellow-400\",\n textColor: \"text-yellow-900 dark:text-yellow-300\",\n },\n error: {\n icon: XCircle,\n bg: \"bg-red-500/10 dark:bg-red-400/5\",\n border: \"border-red-500/30 dark:border-red-500/20\",\n iconColor: \"text-red-600 dark:text-red-400\",\n textColor: \"text-red-900 dark:text-red-300\",\n },\n }\n\n const type = banner.type || \"info\"\n const { icon: IconComponent, bg, border, iconColor, textColor } = typeConfig[type]\n\n return (\n <div className={`w-full border-b ${border} ${bg}`}>\n <div className=\"container mx-auto px-2 md:px-6 py-3\">\n <div className=\"flex items-center gap-3\">\n <IconComponent className={`h-5 w-5 shrink-0 ${iconColor}`} />\n <div className=\"flex-1 min-w-0\">\n <p className={`text-sm font-medium ${textColor}`}>\n {banner.message}\n </p>\n </div>\n {banner.dismissible && (\n <button\n onClick={handleDismiss}\n className={`shrink-0 p-1 rounded-md hover:bg-black/5 dark:hover:bg-white/5 transition-colors ${iconColor}`}\n aria-label=\"Dismiss banner\"\n >\n <X className=\"h-4 w-4\" />\n </button>\n )}\n </div>\n </div>\n </div>\n )\n}\n","\"use client\"\n\nimport { useState } from \"react\"\nimport { useRouter } from \"next/navigation\"\nimport { ChevronDown } from \"lucide-react\"\nimport { Icon } from \"./icon\"\nimport type { TabGroup } from \"@/lib/config.types\"\n\ninterface TabGroupsProps {\n tabGroups: TabGroup[]\n activeTabId?: string\n onTabChange?: (tabId: string) => void\n mobileOnly?: boolean\n docs?: Array<{ slug: string; meta?: { tab_group?: string }; categoryTabGroup?: string }>\n version?: string\n}\n\nexport function TabGroups({ tabGroups, activeTabId, onTabChange, mobileOnly = false, docs, version }: TabGroupsProps) {\n const [dropdownOpen, setDropdownOpen] = useState(false)\n const router = useRouter()\n\n // Filter out tabs that have no associated docs\n const filteredTabGroups = docs\n ? tabGroups.filter((tab) => {\n const hasDocsInTab = docs.some((doc) => {\n const docTabGroup = doc.meta?.tab_group || doc.categoryTabGroup\n return docTabGroup === tab.id || (!docTabGroup && tab.id === tabGroups[0]?.id)\n })\n return hasDocsInTab\n })\n : tabGroups\n\n const activeTab = activeTabId || filteredTabGroups[0]?.id || \"\"\n const activeTabData = filteredTabGroups.find(tab => tab.id === activeTab)\n\n const handleTabChange = (tabId: string) => {\n onTabChange?.(tabId)\n setDropdownOpen(false)\n\n // Navigate to the first item in the new tab group if docs are provided\n if (docs && version) {\n const firstDocInTab = docs.find((doc) => {\n const docTabGroup = doc.meta?.tab_group || doc.categoryTabGroup\n return docTabGroup === tabId || (!docTabGroup && tabId === filteredTabGroups[0]?.id)\n })\n\n if (firstDocInTab) {\n router.push(`/docs/${version}/${firstDocInTab.slug}`)\n }\n }\n }\n\n if (!filteredTabGroups || filteredTabGroups.length === 0) {\n return null\n }\n\n // Mobile only version (for sidebar)\n if (mobileOnly) {\n return (\n <div className=\"relative\">\n <button\n onClick={() => setDropdownOpen(!dropdownOpen)}\n className=\"flex items-center justify-between w-full px-3 py-2 text-sm font-medium text-foreground bg-muted/50 rounded-lg hover:bg-muted transition-colors\"\n aria-label=\"Select tab group\"\n aria-expanded={dropdownOpen}\n >\n <div className=\"flex items-center gap-2\">\n {activeTabData?.icon && <Icon icon={activeTabData.icon} size={16} className=\"shrink-0\" />}\n <span>{activeTabData?.label}</span>\n </div>\n <ChevronDown\n className={`h-4 w-4 transition-transform ${dropdownOpen ? \"rotate-180\" : \"\"}`}\n />\n </button>\n\n {dropdownOpen && (\n <>\n <div\n className=\"fixed inset-0 z-40\"\n onClick={() => setDropdownOpen(false)}\n />\n <div className=\"absolute top-full left-0 right-0 mt-2 bg-background border border-border rounded-lg shadow-lg z-50 max-h-[60vh] overflow-y-auto\">\n {filteredTabGroups.map((tab) => {\n const isActive = tab.id === activeTab\n\n return (\n <button\n key={tab.id}\n onClick={() => handleTabChange(tab.id)}\n className={`flex items-center gap-2 w-full px-3 py-2 text-sm font-medium text-left transition-colors first:rounded-t-lg last:rounded-b-lg ${\n isActive\n ? \"bg-primary/10 text-primary\"\n : \"text-muted-foreground hover:bg-accent hover:text-foreground\"\n }`}\n >\n {tab.icon && <Icon icon={tab.icon} size={16} className=\"shrink-0\" />}\n {tab.label}\n </button>\n )\n })}\n </div>\n </>\n )}\n </div>\n )\n }\n\n return (\n <div className=\"sticky top-16 z-30 border-b border-border bg-background/95 backdrop-blur supports-[backdrop-filter]:bg-background/60\">\n <div className=\"container mx-auto px-2 md:px-6\">\n {/* Mobile Dropdown */}\n <div className=\"md:hidden relative\">\n <button\n onClick={() => setDropdownOpen(!dropdownOpen)}\n className=\"flex items-center justify-between w-full px-4 py-3 text-sm font-medium text-foreground\"\n aria-label=\"Select tab\"\n aria-expanded={dropdownOpen}\n >\n <div className=\"flex items-center gap-2\">\n {activeTabData?.icon && <Icon icon={activeTabData.icon} size={16} className=\"shrink-0\" />}\n {activeTabData?.label}\n </div>\n <ChevronDown\n className={`h-4 w-4 transition-transform ${dropdownOpen ? \"rotate-180\" : \"\"}`}\n />\n </button>\n\n {dropdownOpen && (\n <>\n <div\n className=\"fixed inset-0 z-40\"\n onClick={() => setDropdownOpen(false)}\n />\n <div className=\"absolute top-full left-0 right-0 bg-background border border-border shadow-lg z-50 max-h-[60vh] overflow-y-auto\">\n {filteredTabGroups.map((tab) => {\n const isActive = tab.id === activeTab\n\n return (\n <button\n key={tab.id}\n onClick={() => handleTabChange(tab.id)}\n className={`flex items-center gap-2 w-full px-4 py-3 text-sm font-medium text-left transition-colors ${\n isActive\n ? \"bg-primary/10 text-primary\"\n : \"text-muted-foreground hover:bg-accent hover:text-foreground\"\n }`}\n >\n {tab.icon && <Icon icon={tab.icon} size={16} className=\"shrink-0\" />}\n {tab.label}\n </button>\n )\n })}\n </div>\n </>\n )}\n </div>\n\n {/* Desktop Tabs */}\n <nav className=\"hidden md:flex gap-1\" aria-label=\"Documentation tabs\">\n {filteredTabGroups.map((tab) => {\n const isActive = tab.id === activeTab\n\n return (\n <button\n key={tab.id}\n onClick={() => handleTabChange(tab.id)}\n className={`flex items-center gap-2 px-4 py-3 text-sm font-medium whitespace-nowrap transition-all border-b-2 ${\n isActive\n ? \"border-primary text-primary\"\n : \"border-transparent text-muted-foreground hover:text-foreground hover:border-border\"\n }`}\n aria-current={isActive ? \"page\" : undefined}\n >\n {tab.icon && <Icon icon={tab.icon} size={16} className=\"shrink-0\" />}\n {tab.label}\n </button>\n )\n })}\n </nav>\n </div>\n </div>\n )\n}\n","\"use client\"\n\nimport Link from \"next/link\"\nimport { usePathname } from \"next/navigation\"\nimport { ChevronRight, ChevronDown, FolderOpen } from \"lucide-react\"\nimport { useState } from \"react\"\nimport type { SpecraConfig } from \"@/lib/config\"\nimport { Icon } from \"./icon\"\nimport { sortSidebarItems, sortSidebarGroups } from \"@/lib/sidebar-utils\"\n\ninterface DocItem {\n title: string\n slug: string\n filePath: string\n section?: string\n group?: string\n sidebar?: string\n sidebar_position?: number\n categoryLabel?: string\n categoryPosition?: number\n categoryCollapsible?: boolean\n categoryCollapsed?: boolean\n categoryIcon?: string\n categoryTabGroup?: string\n meta?: {\n icon?: string\n tab_group?: string\n [key: string]: any\n }\n}\n\ninterface SidebarMenuItemsProps {\n docs: DocItem[]\n version: string\n onLinkClick?: () => void\n config: SpecraConfig\n activeTabGroup?: string\n}\n\ninterface SidebarGroup {\n label: string\n path: string\n icon?: string\n items: DocItem[]\n position: number\n collapsible: boolean\n defaultCollapsed: boolean\n children: Record<string, SidebarGroup>\n}\n\nexport function SidebarMenuItems({ docs, version, onLinkClick, config, activeTabGroup }: SidebarMenuItemsProps) {\n const pathname = usePathname()\n const [collapsed, setCollapsed] = useState<Record<string, boolean>>(() => {\n const initial: Record<string, boolean> = {}\n return initial\n })\n\n // Filter docs by active tab group if tab groups are configured\n const hasTabGroups = config.navigation?.tabGroups && config.navigation.tabGroups.length > 0\n const filteredDocs = hasTabGroups && activeTabGroup\n ? docs.filter((doc) => {\n const docTabGroup = doc.meta?.tab_group || doc.categoryTabGroup\n\n if (!docTabGroup) {\n return activeTabGroup === config.navigation?.tabGroups?.[0]?.id\n }\n\n return docTabGroup === activeTabGroup\n })\n : docs\n\n // Build a hierarchical tree structure\n const rootGroups: Record<string, SidebarGroup> = {}\n const standalone: DocItem[] = []\n\n filteredDocs.forEach((doc) => {\n const pathParts = doc.filePath.split(\"/\")\n const isIndexFile = doc.filePath.endsWith(\"/index\") ||\n doc.filePath === \"index\" ||\n (pathParts.length > 1 && doc.slug === pathParts.slice(0, -1).join(\"/\"))\n\n const customGroup = doc.sidebar || doc.group\n\n if (customGroup) {\n const groupName = customGroup.charAt(0).toUpperCase() + customGroup.slice(1)\n if (!rootGroups[groupName]) {\n rootGroups[groupName] = {\n label: groupName,\n path: customGroup,\n items: [],\n position: 999,\n collapsible: doc.categoryCollapsible ?? true,\n defaultCollapsed: doc.categoryCollapsed ?? false,\n children: {}\n }\n }\n if (isIndexFile) {\n rootGroups[groupName].position = doc.sidebar_position ?? 999\n rootGroups[groupName].icon = doc.categoryIcon\n } else {\n rootGroups[groupName].items.push(doc)\n }\n return\n }\n\n if (pathParts.length > 1) {\n const folderParts = pathParts.slice(0, -1)\n\n let currentLevel = rootGroups\n let currentPath = \"\"\n\n for (let i = 0; i < folderParts.length; i++) {\n const folder = folderParts[i]\n currentPath = currentPath ? `${currentPath}/${folder}` : folder\n const folderLabel = folder.split(\"-\").map(w => w.charAt(0).toUpperCase() + w.slice(1)).join(\" \")\n\n if (!currentLevel[folder]) {\n currentLevel[folder] = {\n label: doc.categoryLabel && i === folderParts.length - 1 ? doc.categoryLabel : folderLabel,\n path: currentPath,\n icon: doc.categoryIcon,\n items: [],\n position: doc.categoryPosition ?? 999,\n collapsible: doc.categoryCollapsible ?? true,\n defaultCollapsed: doc.categoryCollapsed ?? false,\n children: {}\n }\n }\n\n if (i === folderParts.length - 1) {\n if (isIndexFile) {\n currentLevel[folder].position = doc.categoryPosition ?? doc.sidebar_position ?? 999\n if (doc.categoryLabel) {\n currentLevel[folder].label = doc.categoryLabel\n }\n if (doc.categoryIcon) {\n currentLevel[folder].icon = doc.categoryIcon\n }\n } else {\n currentLevel[folder].items.push(doc)\n }\n }\n\n currentLevel = currentLevel[folder].children\n }\n } else {\n if (!isIndexFile) {\n standalone.push(doc)\n }\n }\n })\n\n const toggleSection = (section: string) => {\n setCollapsed((prev) => ({ ...prev, [section]: !prev[section] }))\n }\n\n const renderGroup = (groupKey: string, group: SidebarGroup, depth: number = 0) => {\n const sortedItems = sortSidebarItems(group.items)\n const sortedChildren = sortSidebarGroups(group.children)\n const hasChildren = sortedChildren.length > 0\n const hasItems = sortedItems.length > 0\n const hasContent = hasChildren || hasItems\n\n const isActiveInGroup = (g: SidebarGroup): boolean => {\n const hasActiveItem = g.items.some((doc) => pathname === `/docs/${version}/${doc.slug}`)\n if (hasActiveItem) return true\n return Object.values(g.children).some(child => isActiveInGroup(child))\n }\n\n const hasActiveItem = isActiveInGroup(group)\n const isGroupActive = pathname === `/docs/${version}/${group.path}`\n const isCollapsed = hasActiveItem || isGroupActive ? false : (collapsed[groupKey] ?? group.defaultCollapsed)\n const marginLeft = depth > 0 ? \"ml-4\" : \"\"\n\n // Calculate groupHref with locale if needed\n let groupHref = `/docs/${version}/${group.path}`\n\n // Check for locale in pathname to preserve it in group links\n if (config.features?.i18n) {\n const i18n = config.features.i18n\n const locales = typeof i18n === 'object' ? i18n.locales : ['en']\n // pathname is /docs/v1.0.0/[locale]/... or /docs/v1.0.0/...\n const pathParts = pathname?.split('/') || []\n const potentialLocale = pathParts[3] // /docs/v/locale/...\n\n if (potentialLocale && locales.includes(potentialLocale)) {\n // If current path has locale, ensure group path includes it\n // group.path comes from logical file path (no locale)\n groupHref = `/docs/${version}/${potentialLocale}/${group.path}`\n }\n }\n\n return (\n <div key={`group-${groupKey}`} className={`space-y-1 ${marginLeft}`}>\n <div className=\"flex items-center group\">\n <Link\n href={groupHref}\n onClick={(e) => {\n e.preventDefault()\n toggleSection(groupKey)\n }}\n className={`flex items-center gap-2 flex-1 px-3 py-2 text-sm font-semibold rounded-l-xl transition-all ${isGroupActive\n ? \"bg-primary/10 text-primary\"\n : \"text-foreground hover:bg-accent/50\"\n }`}\n >\n {group.icon ? (\n <Icon icon={group.icon} size={16} className=\"shrink-0\" />\n ) : (\n <FolderOpen size={16} className=\"shrink-0\" />\n )}\n {group.label}\n </Link>\n\n {hasContent && group.collapsible && config.navigation?.collapsibleSidebar && (\n <button\n onClick={(e) => {\n e.preventDefault()\n e.stopPropagation()\n toggleSection(groupKey)\n }}\n className={`p-2 rounded-r-xl transition-all ${isGroupActive ? \"hover:bg-primary/20\" : \"hover:bg-accent/50\"}`}\n aria-label={isCollapsed ? \"Expand section\" : \"Collapse section\"}\n >\n {isCollapsed ? (\n <ChevronRight className={`h-4 w-4 ${isGroupActive ? \"text-primary\" : \"text-muted-foreground\"}`} />\n ) : (\n <ChevronDown className={`h-4 w-4 ${isGroupActive ? \"text-primary\" : \"text-muted-foreground\"}`} />\n )}\n </button>\n )}\n </div>\n\n {!isCollapsed && hasContent && (\n <div className=\"ml-4 space-y-1\">\n {(() => {\n const merged: Array<{ type: 'group', key: string, group: SidebarGroup, position: number } | { type: 'item', doc: DocItem, position: number }> = [\n ...sortedChildren.map(([childKey, childGroup]) => ({\n type: 'group' as const,\n key: childKey,\n group: childGroup,\n position: childGroup.position\n })),\n ...sortedItems.map((doc) => ({\n type: 'item' as const,\n doc,\n position: doc.sidebar_position ?? doc.meta?.sidebar_position ?? doc.meta?.order ?? 999\n }))\n ]\n\n merged.sort((a, b) => a.position - b.position)\n\n return merged.map((item) => {\n if (item.type === 'group') {\n return renderGroup(`${groupKey}/${item.key}`, item.group, depth + 1)\n } else {\n const href = `/docs/${version}/${item.doc.slug}`\n const isActive = pathname === href\n\n return (\n <Link\n key={`grouped-${item.doc.slug}`}\n href={href}\n onClick={onLinkClick}\n className={`flex items-center gap-2 px-3 py-2 text-sm rounded-xl transition-all ${isActive\n ? \"bg-primary/10 text-primary font-medium\"\n : \"text-foreground hover:text-foreground hover:bg-accent/50\"\n }`}\n >\n {item.doc.meta?.icon && <Icon icon={item.doc.meta.icon} size={16} className=\"shrink-0\" />}\n {item.doc.title}\n </Link>\n )\n }\n })\n })()}\n </div>\n )}\n </div>\n )\n }\n\n const sortedRootGroups = sortSidebarGroups(rootGroups)\n const sortedStandalone = sortSidebarItems(standalone)\n\n return (\n <nav className=\"space-y-1\">\n {sortedStandalone.length > 0 && sortedStandalone.map((doc) => {\n const href = `/docs/${version}/${doc.slug}`\n const isActive = pathname === href\n\n return (\n <Link\n key={`standalone-${doc.slug}`}\n href={href}\n onClick={onLinkClick}\n className={`flex items-center gap-2 px-3 py-2 text-sm rounded-xl transition-all ${isActive\n ? \"bg-primary/10 text-primary font-medium\"\n : \"text-foreground hover:text-foreground hover:bg-accent/50\"\n }`}\n >\n {doc.meta?.icon && <Icon icon={doc.meta.icon} size={16} className=\"shrink-0\" />}\n {doc.title}\n </Link>\n )\n })}\n\n {sortedRootGroups.map(([groupKey, group]) => renderGroup(groupKey, group, 0))}\n </nav>\n )\n}\n","\"use client\"\n\nimport type { SpecraConfig } from \"@/lib/config\"\nimport { SidebarMenuItems } from \"./sidebar-menu-items\"\n\ninterface DocItem {\n title: string\n slug: string\n filePath: string\n section?: string\n group?: string\n sidebar?: string\n sidebar_position?: number\n categoryLabel?: string\n categoryPosition?: number\n categoryCollapsible?: boolean\n categoryCollapsed?: boolean\n categoryIcon?: string\n categoryTabGroup?: string\n meta?: {\n icon?: string\n tab_group?: string\n [key: string]: any\n }\n}\n\ninterface SidebarProps {\n docs: DocItem[]\n version: string\n onLinkClick?: () => void\n config: SpecraConfig\n activeTabGroup?: string\n}\n\nexport function Sidebar({ docs, version, onLinkClick, config, activeTabGroup }: SidebarProps) {\n if (!config.navigation?.showSidebar) {\n return null\n }\n\n const hasTabGroups = config.navigation?.tabGroups && config.navigation.tabGroups.length > 0\n const stickyTop = hasTabGroups ? \"top-[7.5rem]\" : \"top-24\"\n const maxHeight = hasTabGroups ? \"max-h-[calc(100vh-10rem)]\" : \"max-h-[calc(100vh-7rem)]\"\n\n return (\n <aside className={`w-64 shrink-0 sticky ${stickyTop} self-start`}>\n <div className={`${maxHeight} overflow-y-auto bg-muted/30 dark:bg-muted/10 rounded-2xl p-4 border border-border/50`}>\n <h2 className=\"text-xs font-semibold text-muted-foreground uppercase tracking-wider mb-4 px-2\">Documentation</h2>\n <SidebarMenuItems\n docs={docs}\n version={version}\n onLinkClick={onLinkClick}\n config={config}\n activeTabGroup={activeTabGroup}\n />\n </div>\n </aside>\n )\n}\n","\"use client\"\n\n// import { createContext, useContext, useState, ReactNode } from \"react\"\nimport * as React from \"react\"\n\ninterface TabContextType {\n activeTabGroup: string\n setActiveTabGroup: (tabId: string) => void\n}\n\nconst TabContext = React.createContext<TabContextType | undefined>(undefined)\n\nconst TAB_STORAGE_KEY = \"specra-active-tab-group\"\n\nexport function TabProvider({ children, defaultTab }: { children: React.ReactNode; defaultTab: string }) {\n // Always initialize with defaultTab to avoid hydration mismatch\n const [activeTabGroup, setActiveTabGroupState] = React.useState(defaultTab)\n const isInitialMount = React.useRef(true)\n\n // Sync with localStorage after hydration\n React.useEffect(() => {\n if (isInitialMount.current) {\n isInitialMount.current = false\n\n // Only read from localStorage on initial mount\n if (typeof window !== \"undefined\") {\n try {\n const stored = localStorage.getItem(TAB_STORAGE_KEY)\n if (stored && stored !== defaultTab) {\n setActiveTabGroupState(stored)\n }\n } catch {\n // Ignore localStorage errors\n }\n }\n }\n }, [defaultTab])\n\n // Wrapper to persist to localStorage when tab changes\n const setActiveTabGroup = (tabId: string) => {\n setActiveTabGroupState(tabId)\n if (typeof window !== \"undefined\") {\n try {\n localStorage.setItem(TAB_STORAGE_KEY, tabId)\n } catch {\n // Ignore localStorage errors\n }\n }\n }\n\n return (\n <TabContext.Provider value={{ activeTabGroup, setActiveTabGroup }}>\n {children}\n </TabContext.Provider>\n )\n}\n\nexport function useTabContext() {\n const context = React.useContext(TabContext)\n if (!context) {\n throw new Error(\"useTabContext must be used within TabProvider\")\n }\n return context\n}\n","\"use client\"\n\nimport { ReactNode } from \"react\"\nimport { MobileDocLayout } from \"./mobile-doc-layout\"\nimport { useTabContext } from \"./tab-context\"\nimport type { SpecraConfig } from \"@/lib/config\"\nimport type { Doc } from \"@/lib/mdx\"\n\ninterface DocLayoutWrapperProps {\n header: ReactNode\n docs: Doc[]\n version: string\n children: ReactNode\n toc: ReactNode\n config: SpecraConfig\n currentPageTabGroup?: string\n}\n\nexport function DocLayoutWrapper({ header, docs, version, children, toc, config }: DocLayoutWrapperProps) {\n // Use global tab context - TabSync component handles synchronization\n const { activeTabGroup, setActiveTabGroup } = useTabContext()\n\n return (\n <MobileDocLayout\n header={header}\n docs={docs}\n version={version}\n toc={toc}\n config={config}\n activeTabGroup={activeTabGroup}\n onTabChange={setActiveTabGroup}\n >\n {children}\n </MobileDocLayout>\n )\n}\n","export function DocLoading() {\n return (\n <div className=\"max-w-4xl mx-auto px-2 md:px-6 py-8\">\n <div className=\"animate-pulse space-y-4\">\n <div className=\"h-8 bg-gray-200 rounded w-3/4\" />\n <div className=\"h-4 bg-gray-200 rounded w-1/2\" />\n <div className=\"space-y-3 mt-8\">\n <div className=\"h-4 bg-gray-200 rounded\" />\n <div className=\"h-4 bg-gray-200 rounded w-5/6\" />\n <div className=\"h-4 bg-gray-200 rounded w-4/6\" />\n </div>\n </div>\n </div>\n )\n}","\"use client\"\n\nimport Link from \"next/link\"\nimport { Search, Menu, Github, Twitter, MessageCircle } from \"lucide-react\"\nimport { Button } from \"@/components/ui/button\"\nimport { VersionSwitcher } from \"./version-switcher\"\nimport { LanguageSwitcher } from \"./language-switcher\"\nimport { ThemeToggle } from \"./theme-toggle\"\nimport { SearchModal } from \"./search-modal\"\nimport { Logo } from \"./logo\"\nimport { useState, useEffect } from \"react\"\nimport type { SpecraConfig } from \"@/lib/config\"\nimport { useConfig } from \"../config-provider\"\n\ninterface HeaderProps {\n currentVersion: string\n versions: string[]\n onMenuClick?: () => void\n config?: SpecraConfig // Made optional since we can get it from context\n}\n\nexport function Header({ currentVersion, versions, onMenuClick, config: configProp }: HeaderProps) {\n // Use config from context if not provided as prop\n const contextConfig = useConfig()\n const config = configProp || contextConfig\n const [searchOpen, setSearchOpen] = useState(false)\n\n // Keyboard shortcut for search (Cmd+K or Ctrl+K)\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if ((e.metaKey || e.ctrlKey) && e.key === \"k\") {\n e.preventDefault()\n setSearchOpen(true)\n }\n }\n\n window.addEventListener(\"keydown\", handleKeyDown)\n return () => window.removeEventListener(\"keydown\", handleKeyDown)\n }, [])\n\n return (\n <header className=\"sticky top-0 z-50 w-full border-b border-border bg-background/95 backdrop-blur supports-backdrop-filter:bg-background/60\">\n <div className=\"container flex h-16 items-center justify-between px-2 md:px-6 mx-auto\">\n <div className=\"flex items-center gap-1\">\n <button\n onClick={onMenuClick}\n className=\"lg:hidden hover:bg-muted p-2 rounded-md transition-colors\"\n aria-label=\"Toggle menu\"\n >\n <Menu className=\"h-5 w-5\" />\n </button>\n <Link href=\"/\" className=\"flex items-center gap-2\">\n {!config.site.hideLogo && (\n config.site.logo ? (\n <Logo logo={config.site.logo} alt={config.site.title} className=\"h-12 w-auto object-contain\" />\n ) : (\n <div className=\"h-8 w-8 rounded-xl bg-primary flex items-center justify-center\">\n <span className=\"text-primary-foreground font-bold text-lg\">\n {config.site.title.charAt(0).toUpperCase()}\n </span>\n </div>\n )\n )}\n {!config.site.hideTitle && (\n <span className=\"font-semibold text-lg text-foreground\">{config.site.title ?? \"Specra\"}</span>\n )}\n </Link>\n </div>\n\n <div className=\"flex items-center gap-2\">\n {config.search?.enabled && (\n <button\n onClick={() => setSearchOpen(true)}\n className=\"flex items-center gap-2 px-3 py-2 text-sm text-muted-foreground hover:text-foreground bg-muted rounded-md transition-colors\"\n >\n <Search className=\"h-4 w-4\" />\n <span className=\"hidden sm:inline\">{config.search.placeholder || \"Search\"}</span>\n <kbd className=\"hidden sm:inline-flex h-5 select-none items-center gap-1 rounded border border-border bg-background px-1.5 font-mono text-xs font-medium\">\n ⌘K\n </kbd>\n </button>\n )}\n\n {config.features?.versioning && (\n <VersionSwitcher currentVersion={currentVersion} versions={versions} />\n )}\n\n {/* Social Links */}\n {config.social?.github && (\n <a\n href={config.social.github}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"hidden md:flex items-center justify-center h-9 w-9 rounded-md hover:bg-muted transition-colors\"\n aria-label=\"GitHub\"\n >\n <Github className=\"h-4 w-4\" />\n </a>\n )}\n {config.social?.twitter && (\n <a\n href={config.social.twitter}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"hidden md:flex items-center justify-center h-9 w-9 rounded-md hover:bg-muted transition-colors\"\n aria-label=\"Twitter\"\n >\n <Twitter className=\"h-4 w-4\" />\n </a>\n )}\n {config.social?.discord && (\n <a\n href={config.social.discord}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"hidden md:flex items-center justify-center h-9 w-9 rounded-md hover:bg-muted transition-colors\"\n aria-label=\"Discord\"\n >\n <MessageCircle className=\"h-4 w-4\" />\n </a>\n )}\n\n <ThemeToggle />\n <LanguageSwitcher />\n </div>\n </div>\n\n {/* Search Modal */}\n <SearchModal isOpen={searchOpen} onClose={() => setSearchOpen(false)} config={config} />\n </header>\n )\n}\n","\n\nimport { useState } from \"react\"\nimport { Check, ChevronDown } from \"lucide-react\"\nimport { useRouter } from \"next/navigation\"\n\ninterface VersionSwitcherProps {\n currentVersion: string\n versions: string[]\n}\n\nexport function VersionSwitcher({ currentVersion, versions }: VersionSwitcherProps) {\n const [open, setOpen] = useState(false)\n const router = useRouter()\n\n const handleVersionChange = (version: string) => {\n router.push(`/docs/${version}`)\n setOpen(false)\n }\n\n return (\n <div className=\"relative\">\n <button\n onClick={() => setOpen(!open)}\n className=\"flex items-center gap-2 px-3 py-2 text-sm text-foreground bg-muted rounded-md hover:bg-muted/80 transition-colors\"\n >\n <span className=\"font-medium\">{currentVersion}</span>\n <ChevronDown className=\"h-4 w-4\" />\n </button>\n\n {open && (\n <>\n <div className=\"fixed inset-0 z-40\" onClick={() => setOpen(false)} />\n <div className=\"absolute right-0 mt-2 w-48 bg-background border border-border rounded-md shadow-lg z-50\">\n <div className=\"p-2\">\n {versions.map((version) => (\n <button\n key={version}\n onClick={() => handleVersionChange(version)}\n className=\"flex items-center justify-between w-full px-3 py-2 text-sm text-foreground hover:bg-muted rounded-md transition-colors\"\n >\n <span>{version}</span>\n {version === currentVersion && <Check className=\"h-4 w-4 text-primary\" />}\n </button>\n ))}\n </div>\n </div>\n </>\n )}\n </div>\n )\n}\n","\"use client\"\n\nimport { useState } from \"react\"\nimport { Languages, Check, ChevronDown } from \"lucide-react\"\nimport { usePathname, useRouter } from \"next/navigation\"\nimport { useConfig } from \"../config-provider\"\n\nexport function LanguageSwitcher() {\n const [open, setOpen] = useState(false)\n const pathname = usePathname()\n const router = useRouter()\n const config = useConfig()\n\n const i18n = config.features?.i18n\n if (!i18n || typeof i18n === 'boolean') return null\n\n const { locales, localeNames, defaultLocale, prefixDefault } = i18n\n\n // Extract current locale from pathname\n // /docs/[version]/[locale]/...\n const pathParts = pathname.split(\"/\")\n const version = pathParts[2]\n let currentLocale = defaultLocale\n\n if (pathParts[3] && locales.includes(pathParts[3])) {\n currentLocale = pathParts[3]\n }\n\n const handleLocaleChange = (newLocale: string) => {\n if (newLocale === currentLocale) {\n setOpen(false)\n return\n }\n\n const parts = [...pathParts]\n\n // Check if current path has a locale prefix\n const hasLocalePrefix = locales.includes(parts[3])\n\n if (newLocale === defaultLocale && !prefixDefault) {\n // Transitioning to default locale which has no prefix\n if (hasLocalePrefix) {\n parts.splice(3, 1)\n }\n } else {\n // Transitioning to a localized path\n if (hasLocalePrefix) {\n parts[3] = newLocale\n } else {\n parts.splice(3, 0, newLocale)\n }\n }\n\n const newPath = parts.join(\"/\")\n router.push(newPath)\n setOpen(false)\n }\n\n return (\n <div className=\"relative\">\n <button\n onClick={() => setOpen(!open)}\n className=\"flex items-center gap-1.5 px-2 h-9 rounded-md hover:bg-muted transition-colors\"\n aria-label=\"Switch language\"\n >\n <Languages className=\"h-4 w-4\" />\n <span className=\"text-xs font-bold uppercase\">{currentLocale}</span>\n <ChevronDown className=\"h-3 w-3 text-muted-foreground\" />\n </button>\n\n {open && (\n <>\n <div className=\"fixed inset-0 z-40\" onClick={() => setOpen(false)} />\n <div className=\"absolute right-0 mt-2 w-40 bg-background border border-border rounded-md shadow-lg z-50\">\n <div className=\"p-2\">\n {locales.map((locale) => (\n <button\n key={locale}\n onClick={() => handleLocaleChange(locale)}\n className=\"flex items-center justify-between w-full px-3 py-2 text-sm text-foreground hover:bg-muted rounded-md transition-colors\"\n >\n <span>{localeNames?.[locale] || locale.toUpperCase()}</span>\n {currentLocale === locale && <Check className=\"h-4 w-4 text-primary\" />}\n </button>\n ))}\n </div>\n </div>\n </>\n )}\n </div>\n )\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport { SpecraConfig, defaultConfig } from \"../lib/config.types\"\n\nconst ConfigContext = React.createContext<SpecraConfig>(defaultConfig)\n\nexport interface ConfigProviderProps {\n config: SpecraConfig\n children: React.ReactNode\n}\n\n/**\n * Provider component that makes Specra config available to all client components\n * Usage: Wrap your app with this provider in your root layout\n */\nexport function ConfigProvider({ config, children }: ConfigProviderProps) {\n return <ConfigContext.Provider value={config}>{children}</ConfigContext.Provider>\n}\n\n/**\n * Hook to access Specra configuration in any client component\n * @returns The current Specra configuration\n * @example\n * ```tsx\n * function MyComponent() {\n * const config = useConfig()\n * return <div>{config.site.title}</div>\n * }\n * ```\n */\nexport function useConfig(): SpecraConfig {\n const config = React.useContext(ConfigContext)\n if (!config) {\n throw new Error(\"useConfig must be used within a ConfigProvider\")\n }\n return config\n}\n\n/**\n * Hook to access a specific configuration value by path\n * @param path - Dot-separated path to the config value (e.g., \"site.title\")\n * @returns The configuration value at the specified path\n * @example\n * ```tsx\n * function MyComponent() {\n * const title = useConfigValue<string>(\"site.title\")\n * const showSidebar = useConfigValue<boolean>(\"navigation.showSidebar\")\n * return <div>{title}</div>\n * }\n * ```\n */\nexport function useConfigValue<T = any>(path: string): T | undefined {\n const config = useConfig()\n const keys = path.split(\".\")\n let value: any = config\n\n for (const key of keys) {\n if (value && typeof value === \"object\" && key in value) {\n value = value[key]\n } else {\n return undefined\n }\n }\n\n return value as T\n}\n","\n\nimport { Moon, Sun } from \"lucide-react\"\nimport { useEffect, useState } from \"react\"\n\nexport function ThemeToggle() {\n const [theme, setTheme] = useState<\"light\" | \"dark\">(\"dark\")\n\n useEffect(() => {\n // Check for saved theme preference or default to dark\n const savedTheme = localStorage.getItem(\"theme\") as \"light\" | \"dark\" | null\n const prefersDark = window.matchMedia(\"(prefers-color-scheme: dark)\").matches\n const initialTheme = savedTheme || (prefersDark ? \"dark\" : \"light\")\n \n setTheme(initialTheme)\n document.documentElement.classList.toggle(\"dark\", initialTheme === \"dark\")\n }, [])\n\n const toggleTheme = () => {\n const newTheme = theme === \"dark\" ? \"light\" : \"dark\"\n setTheme(newTheme)\n localStorage.setItem(\"theme\", newTheme)\n document.documentElement.classList.toggle(\"dark\", newTheme === \"dark\")\n }\n\n return (\n <button\n onClick={toggleTheme}\n className=\"flex items-center justify-center w-9 h-9 rounded-md border border-border bg-background hover:bg-accent transition-colors\"\n aria-label=\"Toggle theme\"\n >\n {theme === \"dark\" ? (\n <Sun className=\"h-4 w-4 text-foreground\" />\n ) : (\n <Moon className=\"h-4 w-4 text-foreground\" />\n )}\n </button>\n )\n}\n","\n\nimport { useState, useEffect, useCallback } from \"react\"\nimport { Search, FileText, Loader2 } from \"lucide-react\"\nimport { useRouter } from \"next/navigation\"\nimport type { SpecraConfig } from \"@/lib/config\"\nimport {\n Dialog,\n DialogContent,\n DialogTitle,\n} from \"@/components/ui/dialog\"\n\ninterface SearchResult {\n id: string\n title: string\n content: string\n slug: string\n version: string\n category?: string\n tab_group?: string\n}\n\ninterface SearchModalProps {\n isOpen: boolean\n onClose: () => void\n config: SpecraConfig\n}\n\nexport function SearchModal({ isOpen, onClose, config }: SearchModalProps) {\n const [query, setQuery] = useState(\"\")\n const [results, setResults] = useState<SearchResult[]>([])\n const [isLoading, setIsLoading] = useState(false)\n const [selectedIndex, setSelectedIndex] = useState(0)\n const router = useRouter()\n\n const searchConfig = config.search\n\n // Search function\n const performSearch = useCallback(async (searchQuery: string) => {\n if (!searchQuery.trim() || !searchConfig?.enabled) {\n setResults([])\n return\n }\n\n setIsLoading(true)\n try {\n const response = await fetch(\"/api/search\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n query: searchQuery,\n // filter: 'version = \"v1.0.0\"',\n distinct: \"version\",\n limit: 2\n }),\n })\n\n\n if (response.ok) {\n const data = await response.json()\n console.log(\"Search response:\", data)\n setResults(data.hits || [])\n } else {\n console.error(\"Search failed:\", response.status, await response.text())\n }\n } catch (error) {\n console.error(\"Search error:\", error)\n setResults([])\n } finally {\n setIsLoading(false)\n }\n }, [searchConfig])\n\n // Debounced search\n useEffect(() => {\n const timer = setTimeout(() => {\n performSearch(query)\n }, 300)\n\n return () => clearTimeout(timer)\n }, [query, performSearch])\n\n // Handle keyboard navigation\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (!isOpen) return\n\n switch (e.key) {\n case \"Escape\":\n onClose()\n break\n case \"ArrowDown\":\n e.preventDefault()\n setSelectedIndex((prev) => Math.min(prev + 1, results.length - 1))\n break\n case \"ArrowUp\":\n e.preventDefault()\n setSelectedIndex((prev) => Math.max(prev - 1, 0))\n break\n case \"Enter\":\n e.preventDefault()\n if (results[selectedIndex]) {\n handleResultClick(results[selectedIndex])\n }\n break\n }\n }\n\n window.addEventListener(\"keydown\", handleKeyDown)\n return () => window.removeEventListener(\"keydown\", handleKeyDown)\n }, [isOpen, results, selectedIndex, onClose])\n\n // Reset on open/close\n useEffect(() => {\n if (isOpen) {\n setQuery(\"\")\n setResults([])\n setSelectedIndex(0)\n }\n }, [isOpen])\n\n const handleResultClick = (result: SearchResult) => {\n // Add search query as URL parameter for highlighting\n // Include tab_group parameter to switch to the correct tab\n const params = new URLSearchParams()\n params.set('q', query)\n if (result.tab_group) {\n params.set('tab', result.tab_group)\n }\n const url = `/docs/${result.version}/${result.slug}?${params.toString()}`\n router.push(url)\n onClose()\n }\n\n const highlightText = (text: string, query: string) => {\n if (!query.trim()) return text\n\n const parts = text.split(new RegExp(`(${query})`, \"gi\"))\n return parts.map((part, i) =>\n part.toLowerCase() === query.toLowerCase()\n ? <mark key={i} className=\"bg-yellow-200 dark:bg-yellow-900/50 text-foreground\">{part}</mark>\n : part\n )\n }\n\n return (\n <Dialog open={isOpen} onOpenChange={onClose} modal={true}>\n <DialogContent\n className=\"max-w-2xl p-0 gap-0 top-[10vh] translate-y-0\"\n showCloseButton={false}\n onOpenAutoFocus={(e) => e.preventDefault()}\n >\n <DialogTitle className=\"sr-only\">Search Documentation</DialogTitle>\n {/* Search Input */}\n <div className=\"flex items-center gap-3 px-4 py-3 border-b border-border\">\n <Search className=\"h-5 w-5 text-muted-foreground shrink-0\" />\n <input\n type=\"text\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n placeholder={searchConfig?.placeholder || \"Search documentation...\"}\n className=\"flex-1 bg-transparent border-none outline-none text-foreground placeholder:text-muted-foreground\"\n autoFocus\n />\n {isLoading && <Loader2 className=\"h-5 w-5 text-muted-foreground animate-spin\" />}\n </div>\n\n {/* Results */}\n <div className=\"max-h-[60vh] overflow-y-auto\">\n {query.trim() && results.length === 0 && !isLoading && (\n <div className=\"px-4 py-8 text-center text-muted-foreground\">\n No results found for \"{query}\"\n </div>\n )}\n\n {results.length > 0 && (\n <div className=\"py-2\">\n {results.map((result, index) => (\n <button\n key={result.id}\n onClick={() => handleResultClick(result)}\n className={`w-full px-4 py-3 text-left hover:bg-muted/50 transition-colors border-l-2 ${index === selectedIndex\n ? \"bg-muted/50 border-primary\"\n : \"border-transparent\"\n }`}\n onMouseEnter={() => setSelectedIndex(index)}\n >\n <div className=\"flex items-start gap-3\">\n <FileText className=\"h-5 w-5 text-muted-foreground shrink-0 mt-0.5\" />\n <div className=\"flex-1 min-w-0\">\n <div className=\"font-medium text-foreground mb-1\">\n {highlightText(result.title, query)}\n </div>\n {result.content && (\n <div className=\"text-sm text-muted-foreground line-clamp-2\">\n {highlightText(result.content, query)}\n </div>\n )}\n <div className=\"flex items-center gap-2 mt-1 text-xs text-muted-foreground\">\n <span>{result.version}</span>\n {result.category && (\n <>\n <span>•</span>\n <span>{result.category}</span>\n </>\n )}\n </div>\n </div>\n </div>\n </button>\n ))}\n </div>\n )}\n\n {!query.trim() && (\n <div className=\"px-4 py-8 text-center text-muted-foreground text-sm\">\n <p>Start typing to search documentation...</p>\n <div className=\"mt-4 flex items-center justify-center gap-4 text-xs\">\n <kbd className=\"px-2 py-1 bg-muted rounded border border-border\">↑↓</kbd>\n <span>Navigate</span>\n <kbd className=\"px-2 py-1 bg-muted rounded border border-border\">Enter</kbd>\n <span>Select</span>\n <kbd className=\"px-2 py-1 bg-muted rounded border border-border\">Esc</kbd>\n <span>Close</span>\n </div>\n </div>\n )}\n </div>\n </DialogContent>\n </Dialog>\n )\n}\n","\"use client\"\n\nimport * as React from \"react\"\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\"\nimport { XIcon } from \"lucide-react\"\n\nimport { cn } from \"@/lib/utils\"\n\nfunction Dialog({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Root>) {\n return <DialogPrimitive.Root data-slot=\"dialog\" {...props} />\n}\n\nfunction DialogTrigger({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Trigger>) {\n return <DialogPrimitive.Trigger data-slot=\"dialog-trigger\" {...props} />\n}\n\nfunction DialogPortal({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Portal>) {\n return <DialogPrimitive.Portal data-slot=\"dialog-portal\" {...props} />\n}\n\nfunction DialogClose({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Close>) {\n return <DialogPrimitive.Close data-slot=\"dialog-close\" {...props} />\n}\n\nfunction DialogOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Overlay>) {\n return (\n <DialogPrimitive.Overlay\n data-slot=\"dialog-overlay\"\n className={cn(\n \"data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-50 bg-black/50 dark:bg-black/70 backdrop-blur-md\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DialogContent({\n className,\n children,\n showCloseButton = true,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Content> & {\n showCloseButton?: boolean\n}) {\n return (\n <DialogPortal data-slot=\"dialog-portal\">\n <DialogOverlay />\n <DialogPrimitive.Content\n data-slot=\"dialog-content\"\n className={cn(\n \"bg-background data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 fixed top-[50%] left-[50%] z-50 grid w-full max-w-[calc(100%-2rem)] translate-x-[-50%] translate-y-[-50%] gap-4 rounded-lg border p-6 shadow-lg duration-200 outline-none sm:max-w-lg\",\n className\n )}\n {...props}\n >\n {children}\n {showCloseButton && (\n <DialogPrimitive.Close\n data-slot=\"dialog-close\"\n className=\"ring-offset-background focus:ring-ring data-[state=open]:bg-accent data-[state=open]:text-muted-foreground absolute top-4 right-4 rounded-xs opacity-70 transition-opacity hover:opacity-100 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\"\n >\n <XIcon />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n )}\n </DialogPrimitive.Content>\n </DialogPortal>\n )\n}\n\nfunction DialogHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"dialog-header\"\n className={cn(\"flex flex-col gap-2 text-center sm:text-left\", className)}\n {...props}\n />\n )\n}\n\nfunction DialogFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"dialog-footer\"\n className={cn(\n \"flex flex-col-reverse gap-2 sm:flex-row sm:justify-end\",\n className\n )}\n {...props}\n />\n )\n}\n\nfunction DialogTitle({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Title>) {\n return (\n <DialogPrimitive.Title\n data-slot=\"dialog-title\"\n className={cn(\"text-lg leading-none font-semibold\", className)}\n {...props}\n />\n )\n}\n\nfunction DialogDescription({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Description>) {\n return (\n <DialogPrimitive.Description\n data-slot=\"dialog-description\"\n className={cn(\"text-muted-foreground text-sm\", className)}\n {...props}\n />\n )\n}\n\nexport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogOverlay,\n DialogPortal,\n DialogTitle,\n DialogTrigger,\n}\n","\"use client\"\n\nimport { useEffect, useState } from \"react\"\nimport { usePathname } from \"next/navigation\"\nimport { RefreshCw } from \"lucide-react\"\n\nexport function HotReloadIndicator() {\n const [isReloading, setIsReloading] = useState(false)\n const [lastReload, setLastReload] = useState<Date | null>(null)\n const pathname = usePathname()\n\n useEffect(() => {\n if (process.env.NODE_ENV !== \"development\") return\n\n // Track when content updates\n setIsReloading(true)\n const timer = setTimeout(() => {\n setIsReloading(false)\n setLastReload(new Date())\n \n // Auto-hide after 3 seconds\n setTimeout(() => {\n setLastReload(null)\n }, 3000)\n }, 500)\n\n return () => clearTimeout(timer)\n }, [pathname])\n\n useEffect(() => {\n if (process.env.NODE_ENV !== \"development\") return\n\n // Listen for Next.js Fast Refresh\n const handleBeforeRefresh = () => {\n setIsReloading(true)\n }\n\n const handleAfterRefresh = () => {\n setIsReloading(false)\n setLastReload(new Date())\n setTimeout(() => setLastReload(null), 3000)\n }\n\n // @ts-ignore - Next.js internal API\n if (typeof window !== 'undefined' && window.__NEXT_DATA__) {\n window.addEventListener('beforeunload', handleBeforeRefresh)\n }\n\n return () => {\n window.removeEventListener('beforeunload', handleBeforeRefresh)\n }\n }, [])\n\n if (process.env.NODE_ENV !== \"development\") return null\n\n return (\n <>\n {/* Reloading indicator */}\n {isReloading && (\n <div className=\"fixed bottom-4 right-4 z-50 flex items-center gap-2 px-4 py-2 bg-primary text-primary-foreground rounded-xl shadow-lg animate-in slide-in-from-bottom-2\">\n <RefreshCw className=\"h-4 w-4 animate-spin\" />\n <span className=\"text-sm font-medium\">Reloading...</span>\n </div>\n )}\n\n {/* Success indicator */}\n {lastReload && !isReloading && (\n <div className=\"fixed bottom-4 right-4 z-50 flex items-center gap-2 px-4 py-2 bg-green-500 text-white rounded-xl shadow-lg animate-in slide-in-from-bottom-2\">\n <RefreshCw className=\"h-4 w-4\" />\n <span className=\"text-sm font-medium\">\n Updated at {lastReload.toLocaleTimeString()}\n </span>\n </div>\n )}\n </>\n )\n}\n","\n\nimport { useEffect } from \"react\"\nimport { useRouter } from \"next/navigation\"\n\nexport function MdxHotReload() {\n const router = useRouter()\n\n useEffect(() => {\n if (process.env.NODE_ENV !== \"development\") return\n\n // Use Server-Sent Events to watch for file changes\n const eventSource = new EventSource('/api/mdx-watch')\n\n eventSource.onmessage = (event) => {\n const data = JSON.parse(event.data)\n \n if (data.type === 'change') {\n console.log('[MDX Hot Reload] File changed:', data.file)\n router.refresh()\n } else if (data.type === 'connected') {\n console.log('[MDX Hot Reload] Watching for changes...')\n }\n }\n\n eventSource.onerror = (error) => {\n console.error('[MDX Hot Reload] Connection error:', error)\n eventSource.close()\n }\n\n return () => {\n eventSource.close()\n }\n }, [router])\n\n return null\n}\n","import Link from \"next/link\"\nimport { AlertTriangle, Home, ArrowLeft } from \"lucide-react\"\n\ninterface NotFoundContentProps {\n version: string\n}\n\nexport function NotFoundContent({ version }: NotFoundContentProps) {\n return (\n <div className=\"flex min-h-[calc(100vh-12rem)] items-center justify-center px-4 py-12\">\n <div className=\"w-full max-w-2xl text-center\">\n <div className=\"mb-6 flex justify-center\">\n <div className=\"rounded-full bg-yellow-500/10 p-4\">\n <AlertTriangle className=\"h-16 w-16 text-yellow-500\" />\n </div>\n </div>\n\n <h1 className=\"mb-3 text-5xl font-bold tracking-tight\">404</h1>\n <h2 className=\"mb-4 text-2xl font-semibold\">Page Not Found</h2>\n\n <p className=\"mb-8 text-base text-muted-foreground\">\n The documentation page you're looking for doesn't exist or may have been moved.\n <br />\n Try using the sidebar to find what you're looking for, or return to the documentation home.\n </p>\n\n <div className=\"flex flex-col items-center justify-center gap-3 sm:flex-row\">\n <Link\n href={`/docs/${version}`}\n className=\"inline-flex items-center gap-2 rounded-lg bg-primary px-6 py-3 text-sm font-medium text-primary-foreground hover:bg-primary/90 transition-colors\"\n >\n <ArrowLeft className=\"h-4 w-4\" />\n Back to Documentation\n </Link>\n\n <Link\n href=\"/\"\n className=\"inline-flex items-center gap-2 rounded-lg border border-border bg-background px-6 py-3 text-sm font-medium hover:bg-muted transition-colors\"\n >\n <Home className=\"h-4 w-4\" />\n Go to Homepage\n </Link>\n </div>\n\n <div className=\"mt-12 rounded-lg border border-border bg-muted/30 p-6\">\n <p className=\"text-sm text-muted-foreground\">\n <strong className=\"font-medium text-foreground\">Tip:</strong> Use the sidebar navigation on the left to browse all available documentation pages.\n </p>\n </div>\n </div>\n </div>\n )\n}\n","\"use client\"\n\nimport { useEffect } from \"react\"\nimport { useSearchParams } from \"next/navigation\"\n\nexport function SearchHighlight() {\n const searchParams = useSearchParams()\n const query = searchParams.get(\"q\")\n\n useEffect(() => {\n if (!query) {\n // Remove any existing highlights\n document.querySelectorAll(\"mark.search-highlight\").forEach((mark) => {\n const parent = mark.parentNode\n if (parent) {\n parent.replaceChild(document.createTextNode(mark.textContent || \"\"), mark)\n parent.normalize()\n }\n })\n return\n }\n\n // Wait for content to load\n const timeout = setTimeout(() => {\n highlightSearchTerm(query)\n }, 100)\n\n return () => {\n clearTimeout(timeout)\n // Cleanup highlights on unmount\n document.querySelectorAll(\"mark.search-highlight\").forEach((mark) => {\n const parent = mark.parentNode\n if (parent) {\n parent.replaceChild(document.createTextNode(mark.textContent || \"\"), mark)\n parent.normalize()\n }\n })\n }\n }, [query])\n\n return null\n}\n\nfunction highlightSearchTerm(searchTerm: string) {\n // Remove existing highlights first\n document.querySelectorAll(\"mark.search-highlight\").forEach((mark) => {\n const parent = mark.parentNode\n if (parent) {\n parent.replaceChild(document.createTextNode(mark.textContent || \"\"), mark)\n parent.normalize()\n }\n })\n\n // Only highlight in the main content area\n const contentArea = document.querySelector(\"main\") || document.body\n \n const walker = document.createTreeWalker(\n contentArea,\n NodeFilter.SHOW_TEXT,\n {\n acceptNode: (node) => {\n // Skip if parent is already a mark, script, style, or code element\n const parent = node.parentElement\n if (!parent) return NodeFilter.FILTER_REJECT\n \n const tagName = parent.tagName.toLowerCase()\n if ([\"mark\", \"script\", \"style\", \"code\", \"pre\"].includes(tagName)) {\n return NodeFilter.FILTER_REJECT\n }\n \n // Check if text contains the search term\n if (node.textContent && node.textContent.toLowerCase().includes(searchTerm.toLowerCase())) {\n return NodeFilter.FILTER_ACCEPT\n }\n \n return NodeFilter.FILTER_REJECT\n }\n }\n )\n\n const nodesToHighlight: { node: Text; text: string }[] = []\n let currentNode: Node | null\n\n while ((currentNode = walker.nextNode())) {\n if (currentNode.textContent) {\n nodesToHighlight.push({\n node: currentNode as Text,\n text: currentNode.textContent\n })\n }\n }\n\n // Highlight all found nodes\n nodesToHighlight.forEach(({ node, text }) => {\n const regex = new RegExp(`(${escapeRegex(searchTerm)})`, \"gi\")\n const parts = text.split(regex)\n \n if (parts.length > 1) {\n const fragment = document.createDocumentFragment()\n \n parts.forEach((part) => {\n if (part.toLowerCase() === searchTerm.toLowerCase()) {\n const mark = document.createElement(\"mark\")\n mark.className = \"search-highlight bg-yellow-200 dark:bg-yellow-900/50 text-foreground px-1 rounded\"\n mark.textContent = part\n fragment.appendChild(mark)\n } else if (part) {\n fragment.appendChild(document.createTextNode(part))\n }\n })\n \n node.parentNode?.replaceChild(fragment, node)\n }\n })\n\n // Scroll to first highlight\n const firstHighlight = document.querySelector(\"mark.search-highlight\")\n if (firstHighlight) {\n setTimeout(() => {\n firstHighlight.scrollIntoView({ behavior: \"smooth\", block: \"center\" })\n }, 200)\n }\n}\n\nfunction escapeRegex(string: string) {\n return string.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\")\n}\n","export function SidebarSkeleton() {\n return (\n <aside className=\"w-64 pr-8 py-6\">\n <div className=\"space-y-6\">\n {/* Documentation title */}\n <div className=\"px-2\">\n <div className=\"h-5 w-32 bg-muted/50 rounded animate-pulse\" />\n </div>\n\n {/* Skeleton items */}\n <div className=\"space-y-1\">\n {[...Array(8)].map((_, i) => (\n <div key={i} className=\"px-3 py-2\">\n <div\n className=\"h-4 bg-muted/50 rounded animate-pulse\"\n style={{ width: `${60 + Math.random() * 40}%` }}\n />\n </div>\n ))}\n </div>\n\n {/* Another section */}\n <div className=\"space-y-1\">\n <div className=\"px-2 mb-2\">\n <div className=\"h-4 w-24 bg-muted/50 rounded animate-pulse\" />\n </div>\n {[...Array(5)].map((_, i) => (\n <div key={i} className=\"px-3 py-2\">\n <div\n className=\"h-4 bg-muted/50 rounded animate-pulse\"\n style={{ width: `${50 + Math.random() * 50}%` }}\n />\n </div>\n ))}\n </div>\n </div>\n </aside>\n )\n}\n","\n\nimport { useEffect, useState } from \"react\"\nimport type { SpecraConfig } from \"@/lib/config\"\n\ninterface TOCItem {\n id: string\n title: string\n level: number\n}\n\ninterface TableOfContentsProps {\n items: TOCItem[]\n config: SpecraConfig\n}\n\nexport function TableOfContents({ items, config }: TableOfContentsProps) {\n const [activeId, setActiveId] = useState<string>(\"\")\n\n // Check if TOC should be shown\n if (!config.navigation?.showTableOfContents) {\n return null\n }\n\n // Filter items by max depth\n const maxDepth = config.navigation?.tocMaxDepth || 3\n const filteredItems = items.filter(item => item.level <= maxDepth)\n\n // Check if tab groups are configured\n const hasTabGroups = config.navigation?.tabGroups && config.navigation.tabGroups.length > 0\n\n useEffect(() => {\n const observer = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n if (entry.isIntersecting) {\n setActiveId(entry.target.id)\n }\n })\n },\n { rootMargin: \"-80px 0px -80% 0px\" },\n )\n\n filteredItems.forEach((item) => {\n const element = document.getElementById(item.id)\n if (element) {\n observer.observe(element)\n }\n })\n\n return () => observer.disconnect()\n }, [filteredItems])\n\n const handleClick = (e: React.MouseEvent<HTMLAnchorElement>, id: string) => {\n e.preventDefault()\n const element = document.getElementById(id)\n if (element) {\n const offset = 100 // Offset for fixed header\n const elementPosition = element.getBoundingClientRect().top\n const offsetPosition = elementPosition + window.scrollY - offset\n\n window.scrollTo({\n top: offsetPosition,\n behavior: \"smooth\",\n })\n \n // Update URL without jumping\n window.history.replaceState(null, \"\", `#${id}`)\n \n // Manually set active ID after scroll\n setActiveId(id)\n }\n }\n\n // Adjust top position based on whether tabs are present\n const stickyTop = hasTabGroups ? \"top-[7.5rem]\" : \"top-24\"\n const maxHeight = hasTabGroups ? \"max-h-[calc(100vh-10rem)]\" : \"max-h-[calc(100vh-7rem)]\"\n\n return (\n <aside className={`w-64 hidden xl:block shrink-0 sticky ${stickyTop} self-start`}>\n {filteredItems.length > 0 && (\n <div className={`${maxHeight} overflow-y-auto bg-muted/30 dark:bg-muted/10 rounded-2xl p-4 border border-border/50`}>\n <h3 className=\"text-xs font-semibold text-muted-foreground uppercase tracking-wider mb-4 px-2\">On this page</h3>\n <nav className=\"space-y-1\">\n {filteredItems.map((item, index) => (\n <a\n key={`${item.id}-${index}`}\n href={`#${item.id}`}\n onClick={(e) => handleClick(e, item.id)}\n className={`block text-sm transition-all cursor-pointer rounded-xl px-3 py-2 ${item.level === 3 ? \"ml-3\" : \"\"} ${\n activeId === item.id\n ? \"text-primary font-medium\"\n : \"text-foreground hover:bg-accent/50\"\n }`}\n >\n {item.title}\n </a>\n ))}\n </nav>\n </div>\n )}\n </aside>\n )\n}\n","import { AlertTriangle } from \"lucide-react\";\nimport Link from \"next/link\";\n\nexport function VersionNotFound() {\n return (\n <>\n <div className=\"flex min-h-screen items-center justify-center px-4\">\n <div className=\"text-center\">\n <div className=\"mb-4 flex justify-center\">\n <AlertTriangle className=\"h-16 w-16 text-yellow-500\" />\n </div>\n <h1 className=\"mb-2 text-4xl font-bold\">Version Not Found</h1>\n <p className=\"mb-6 text-muted-foreground\">\n The documentation version you're looking for doesn't exist.\n </p>\n <Link\n href=\"/docs/v1.0.0\"\n className=\"inline-flex items-center rounded-lg bg-primary px-4 py-2 text-sm font-medium text-primary-foreground hover:bg-primary/90\"\n >\n Go to Latest Version\n </Link>\n </div>\n </div>\n </>\n )\n}"],"mappings":"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","names":["useState","Link","useEffect","useState","jsx","jsx","jsxs","useState","useEffect","jsx","jsxs","useState","jsx","jsxs","useState","Link","ChevronDown","useState","jsx","jsxs","useState","hasActiveItem","Link","ChevronDown","jsx","jsxs","jsx","jsxs","useState","Link","jsx","jsx","jsx","jsxs","Link","Search","useState","ChevronDown","useRouter","Fragment","jsx","jsxs","useState","Check","ChevronDown","usePathname","useRouter","React","jsx","Fragment","jsx","jsxs","useState","usePathname","useRouter","ChevronDown","Check","useEffect","useState","jsx","useState","useEffect","useRouter","jsx","jsxs","Fragment","jsx","jsxs","useState","useRouter","useEffect","query","useState","useEffect","jsx","jsxs","useState","useEffect","Link","Search","useEffect","useState","usePathname","Fragment","jsx","jsxs","useEffect","useRouter","Link","jsx","jsxs","useEffect","jsx","jsxs","useEffect","useState","jsx","jsxs","AlertTriangle","Link","Fragment","jsx","jsxs"]}
|
package/dist/layouts/index.d.mts
DELETED
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
-
import { D as DocMeta, S as SpecraConfig, a as Doc } from '../mdx-ColN3Cyg.mjs';
|
|
3
|
-
|
|
4
|
-
interface DocLayoutProps {
|
|
5
|
-
meta: DocMeta;
|
|
6
|
-
content: string;
|
|
7
|
-
previousDoc?: {
|
|
8
|
-
title: string;
|
|
9
|
-
slug: string;
|
|
10
|
-
};
|
|
11
|
-
nextDoc?: {
|
|
12
|
-
title: string;
|
|
13
|
-
slug: string;
|
|
14
|
-
};
|
|
15
|
-
version: string;
|
|
16
|
-
slug: string;
|
|
17
|
-
config: SpecraConfig;
|
|
18
|
-
mdxComponents: Record<string, React.ComponentType<any>>;
|
|
19
|
-
}
|
|
20
|
-
declare function DocLayout({ content, meta, previousDoc, nextDoc, version, slug, config, mdxComponents }: DocLayoutProps): react_jsx_runtime.JSX.Element;
|
|
21
|
-
|
|
22
|
-
interface CategoryIndexProps {
|
|
23
|
-
categoryPath: string;
|
|
24
|
-
version: string;
|
|
25
|
-
allDocs: Doc[];
|
|
26
|
-
title: string;
|
|
27
|
-
description?: string;
|
|
28
|
-
content?: string;
|
|
29
|
-
config: SpecraConfig;
|
|
30
|
-
mdxComponents: Record<string, React.ComponentType<any>>;
|
|
31
|
-
}
|
|
32
|
-
declare function CategoryIndex({ categoryPath, version, allDocs, title, description, content, config, mdxComponents }: CategoryIndexProps): react_jsx_runtime.JSX.Element;
|
|
33
|
-
|
|
34
|
-
export { CategoryIndex, DocLayout };
|
package/dist/layouts/index.d.ts
DELETED
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
-
import { D as DocMeta, S as SpecraConfig, a as Doc } from '../mdx-ColN3Cyg.js';
|
|
3
|
-
|
|
4
|
-
interface DocLayoutProps {
|
|
5
|
-
meta: DocMeta;
|
|
6
|
-
content: string;
|
|
7
|
-
previousDoc?: {
|
|
8
|
-
title: string;
|
|
9
|
-
slug: string;
|
|
10
|
-
};
|
|
11
|
-
nextDoc?: {
|
|
12
|
-
title: string;
|
|
13
|
-
slug: string;
|
|
14
|
-
};
|
|
15
|
-
version: string;
|
|
16
|
-
slug: string;
|
|
17
|
-
config: SpecraConfig;
|
|
18
|
-
mdxComponents: Record<string, React.ComponentType<any>>;
|
|
19
|
-
}
|
|
20
|
-
declare function DocLayout({ content, meta, previousDoc, nextDoc, version, slug, config, mdxComponents }: DocLayoutProps): react_jsx_runtime.JSX.Element;
|
|
21
|
-
|
|
22
|
-
interface CategoryIndexProps {
|
|
23
|
-
categoryPath: string;
|
|
24
|
-
version: string;
|
|
25
|
-
allDocs: Doc[];
|
|
26
|
-
title: string;
|
|
27
|
-
description?: string;
|
|
28
|
-
content?: string;
|
|
29
|
-
config: SpecraConfig;
|
|
30
|
-
mdxComponents: Record<string, React.ComponentType<any>>;
|
|
31
|
-
}
|
|
32
|
-
declare function CategoryIndex({ categoryPath, version, allDocs, title, description, content, config, mdxComponents }: CategoryIndexProps): react_jsx_runtime.JSX.Element;
|
|
33
|
-
|
|
34
|
-
export { CategoryIndex, DocLayout };
|