docstra 1.7.8 ā 1.8.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/cli/commands/init.js +149 -0
- package/cli/templates/docstra-config.js +53 -0
- package/cli/templates/index.js +11 -0
- package/cli/templates/mdx-components.js +8 -0
- package/cli/templates/next-config.js +7 -0
- package/cli/templates/pages.js +63 -0
- package/cli/utils/fs.js +31 -0
- package/dist/client/index.js +3 -2
- package/dist/client/index.js.map +1 -1
- package/dist/client/index.mjs +3 -2
- package/dist/client/index.mjs.map +1 -1
- package/package.json +3 -2
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
const path = require("path");
|
|
2
|
+
const fs = require("fs");
|
|
3
|
+
const { safeWrite, createFolder } = require("../utils/fs");
|
|
4
|
+
const {
|
|
5
|
+
DOCSTRA_CONFIG,
|
|
6
|
+
MDX_COMPONENTS,
|
|
7
|
+
NEXT_CONFIG,
|
|
8
|
+
INDEX_MDX,
|
|
9
|
+
PAGE_TSX,
|
|
10
|
+
SOURCE_TS
|
|
11
|
+
} = require("../templates");
|
|
12
|
+
|
|
13
|
+
function initDocstra() {
|
|
14
|
+
console.log("\nš§ Initializing Docstra...\n");
|
|
15
|
+
|
|
16
|
+
const root = process.cwd();
|
|
17
|
+
|
|
18
|
+
// 1. Create structure
|
|
19
|
+
createFolder(path.join(root, "app"));
|
|
20
|
+
|
|
21
|
+
// 2. Create docs content
|
|
22
|
+
const contentDir = path.join(root, "app", "docs", "content");
|
|
23
|
+
const slugDir = path.join(root, "app", "docs", "[[...slug]]");
|
|
24
|
+
|
|
25
|
+
createFolder(contentDir);
|
|
26
|
+
createFolder(slugDir);
|
|
27
|
+
|
|
28
|
+
safeWrite(path.join(contentDir, "index.mdx"), INDEX_MDX);
|
|
29
|
+
safeWrite(path.join(slugDir, "page.tsx"), PAGE_TSX);
|
|
30
|
+
|
|
31
|
+
// 3. Create lib/source.ts
|
|
32
|
+
const libDir = path.join(root, "lib");
|
|
33
|
+
createFolder(libDir);
|
|
34
|
+
safeWrite(path.join(libDir, "source.ts"), SOURCE_TS);
|
|
35
|
+
|
|
36
|
+
// 4. Config files
|
|
37
|
+
safeWrite(path.join(root, "mdx-components.tsx"), MDX_COMPONENTS);
|
|
38
|
+
safeWrite(path.join(root, "docstra.config.ts"), DOCSTRA_CONFIG);
|
|
39
|
+
|
|
40
|
+
// 5. Update next.config
|
|
41
|
+
updateNextConfig(root);
|
|
42
|
+
|
|
43
|
+
// 6. Check/Update Tailwind
|
|
44
|
+
updateTailwindGlobals(root);
|
|
45
|
+
|
|
46
|
+
// 7. Instructions
|
|
47
|
+
console.log(`
|
|
48
|
+
Please install latest version of Docstra by running:
|
|
49
|
+
|
|
50
|
+
Package Manager | Command
|
|
51
|
+
npm | npm install docstra@latest
|
|
52
|
+
yarn | yarn add docstra@latest
|
|
53
|
+
pnpm | pnpm add docstra@latest
|
|
54
|
+
`);
|
|
55
|
+
|
|
56
|
+
console.log("\nš Docstra initialized successfully!\n");
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function updateNextConfig(root) {
|
|
60
|
+
const tsPath = path.join(root, "next.config.ts");
|
|
61
|
+
const jsPath = path.join(root, "next.config.js");
|
|
62
|
+
|
|
63
|
+
let nextConfigPath = fs.existsSync(tsPath) ? tsPath :
|
|
64
|
+
fs.existsSync(jsPath) ? jsPath :
|
|
65
|
+
null;
|
|
66
|
+
|
|
67
|
+
if (!nextConfigPath) {
|
|
68
|
+
// Create new if none exists
|
|
69
|
+
safeWrite(tsPath, NEXT_CONFIG);
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
let content = fs.readFileSync(nextConfigPath, "utf8");
|
|
74
|
+
|
|
75
|
+
if (content.includes("withDocstra")) {
|
|
76
|
+
console.log("ā next.config already uses withDocstra");
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
if (!content.includes("withDocstra")) {
|
|
81
|
+
content = `import { withDocstra } from "docstra/server";\n` + content;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
const exportRegex = /export\s+default\s+(.+);?/;
|
|
85
|
+
const match = content.match(exportRegex);
|
|
86
|
+
|
|
87
|
+
if (!match) {
|
|
88
|
+
console.log("ā Could not detect export default. Skipped patch.");
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
let exportValue = match[1].trim();
|
|
93
|
+
if (exportValue.endsWith(";")) {
|
|
94
|
+
exportValue = exportValue.slice(0, -1).trim();
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
const wrapped = `export default withDocstra(${exportValue});`;
|
|
98
|
+
content = content.replace(exportRegex, wrapped);
|
|
99
|
+
|
|
100
|
+
fs.writeFileSync(nextConfigPath, content);
|
|
101
|
+
console.log("ā Updated next.config with withDocstra()");
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
function updateTailwindGlobals(root) {
|
|
106
|
+
const globalsPath = path.join(root, "app", "globals.css");
|
|
107
|
+
|
|
108
|
+
if (!fs.existsSync(globalsPath)) {
|
|
109
|
+
console.log("ā app/globals.css not found.");
|
|
110
|
+
console.log("Please ensure Tailwind is installed correctly before running Docstra init.");
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
let css = fs.readFileSync(globalsPath, "utf8");
|
|
115
|
+
|
|
116
|
+
// Simple check for tailwind import/usage would go here if needed,
|
|
117
|
+
// but we'll focus on injecting our styles.
|
|
118
|
+
|
|
119
|
+
if (css.includes('@import "docstra/css";')) {
|
|
120
|
+
console.log("ā docstra/css already imported in globals.css");
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// Try to find where to insert
|
|
125
|
+
const tailwindRegex = /@import ['"]tailwindcss[^'"]*['"];?/g;
|
|
126
|
+
let lastMatch = null, match;
|
|
127
|
+
while ((match = tailwindRegex.exec(css)) !== null) {
|
|
128
|
+
lastMatch = match;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
if (lastMatch) {
|
|
132
|
+
const insertPos = lastMatch.index + lastMatch[0].length;
|
|
133
|
+
const updatedCSS = css.slice(0, insertPos) + `\n@import "docstra/css";\n` + css.slice(insertPos);
|
|
134
|
+
fs.writeFileSync(globalsPath, updatedCSS, "utf8");
|
|
135
|
+
console.log("ā Injected @import \"docstra/css\" into app/globals.css");
|
|
136
|
+
} else {
|
|
137
|
+
// If no explicit tailwind import found (e.g. using @tailwind directives or v4), just append or warn?
|
|
138
|
+
// For now, let's just append appropriately or warn.
|
|
139
|
+
// The original code warned if no tailwind imports were found.
|
|
140
|
+
// Let's keep it simple:
|
|
141
|
+
console.log(`
|
|
142
|
+
ā Tailwind imports not detected (or using different format).
|
|
143
|
+
Add manually:
|
|
144
|
+
@import "docstra/css";
|
|
145
|
+
`);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
module.exports = { initDocstra };
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
module.exports = `import { defineDocstraConfig } from "docstra/config";
|
|
2
|
+
|
|
3
|
+
export default defineDocstraConfig({
|
|
4
|
+
siteName: "Docstra",
|
|
5
|
+
githubRepo: "https://github.com/sudhucodes/docstra",
|
|
6
|
+
contentDir: "app/docs/content",
|
|
7
|
+
editOnGithub: {
|
|
8
|
+
owner: "sudhucodes",
|
|
9
|
+
repo: "docstra",
|
|
10
|
+
path: "docs/content",
|
|
11
|
+
},
|
|
12
|
+
feedback: {
|
|
13
|
+
enabled: true,
|
|
14
|
+
formSyncFormID: "69c728a1-ccd2-4dab-a9f7-bb52baeb4d31",
|
|
15
|
+
},
|
|
16
|
+
navbar: {
|
|
17
|
+
logo: {
|
|
18
|
+
link: "/",
|
|
19
|
+
src: "/brand/logo.svg",
|
|
20
|
+
alt: "Logo",
|
|
21
|
+
className: "h-8 w-auto",
|
|
22
|
+
},
|
|
23
|
+
links: [
|
|
24
|
+
{ name: "Guides", href: "/docs/guides" },
|
|
25
|
+
{ name: "Examples", href: "/docs/examples" },
|
|
26
|
+
],
|
|
27
|
+
},
|
|
28
|
+
sidebar: {
|
|
29
|
+
links: [
|
|
30
|
+
{
|
|
31
|
+
section: 'Section 1',
|
|
32
|
+
items: [
|
|
33
|
+
{
|
|
34
|
+
name: 'Docs',
|
|
35
|
+
href: '/docs',
|
|
36
|
+
icon: '<Any-Lucide-Icon>'
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
name: 'Link 2',
|
|
40
|
+
href: '/docs/link-2',
|
|
41
|
+
},
|
|
42
|
+
],
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
section: 'Section 2',
|
|
46
|
+
items: [
|
|
47
|
+
{ name: 'Link 3', href: '/docs/link-3' },
|
|
48
|
+
],
|
|
49
|
+
},
|
|
50
|
+
],
|
|
51
|
+
},
|
|
52
|
+
});
|
|
53
|
+
`;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
const docstraConfig = require("./docstra-config");
|
|
2
|
+
const mdxComponents = require("./mdx-components");
|
|
3
|
+
const nextConfig = require("./next-config");
|
|
4
|
+
const pages = require("./pages");
|
|
5
|
+
|
|
6
|
+
module.exports = {
|
|
7
|
+
DOCSTRA_CONFIG: docstraConfig,
|
|
8
|
+
MDX_COMPONENTS: mdxComponents,
|
|
9
|
+
NEXT_CONFIG: nextConfig,
|
|
10
|
+
...pages,
|
|
11
|
+
};
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
exports.INDEX_MDX = `# Welcome to Docstra
|
|
2
|
+
|
|
3
|
+
Your documentation starts inside \`app/docs\`!
|
|
4
|
+
|
|
5
|
+
Start editing this file or add more MDX pages.
|
|
6
|
+
|
|
7
|
+
## Tips
|
|
8
|
+
- Pages in \`app/docs/content\` render automatically.
|
|
9
|
+
- \`[[...slug]]\` handles dynamic routing.
|
|
10
|
+
`;
|
|
11
|
+
|
|
12
|
+
exports.PAGE_TSX = `import docstraConfig from "@/docstra.config";
|
|
13
|
+
import { mdxComponents } from "@/mdx-components";
|
|
14
|
+
import {
|
|
15
|
+
DocstraBody,
|
|
16
|
+
DocstraHeader,
|
|
17
|
+
DocstraPage,
|
|
18
|
+
DocstraProvider,
|
|
19
|
+
} from "docstra";
|
|
20
|
+
|
|
21
|
+
import { source } from "@/lib/source";
|
|
22
|
+
import { notFound } from "next/navigation";
|
|
23
|
+
|
|
24
|
+
export default async function Page({ params }: { params: Promise<{ slug?: string[] }> }) {
|
|
25
|
+
const { slug } = await params
|
|
26
|
+
const page = source.getPage(slug);
|
|
27
|
+
if (!page) return notFound();
|
|
28
|
+
|
|
29
|
+
const MDX = page.body;
|
|
30
|
+
|
|
31
|
+
return (
|
|
32
|
+
<DocstraProvider docstraConfig={docstraConfig} docs={source.files} pageData={page.info}>
|
|
33
|
+
<DocstraHeader />
|
|
34
|
+
<DocstraPage>
|
|
35
|
+
<DocstraBody>
|
|
36
|
+
<MDX components={mdxComponents} />
|
|
37
|
+
</DocstraBody>
|
|
38
|
+
</DocstraPage>
|
|
39
|
+
</DocstraProvider>
|
|
40
|
+
);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export function generateStaticParams() {
|
|
44
|
+
return source.generateStaticParams();
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export async function generateMetadata({ params }: { params: Promise<{ slug?: string[] }> }) {
|
|
48
|
+
const { slug } = await params
|
|
49
|
+
const page = source.getPage(slug);
|
|
50
|
+
if (!page) return notFound();
|
|
51
|
+
|
|
52
|
+
return {
|
|
53
|
+
title: page.info.data.metadata.title,
|
|
54
|
+
description: page.info.data.metadata.description,
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
`;
|
|
58
|
+
|
|
59
|
+
exports.SOURCE_TS = `import { docs } from "@/.docstra/index";
|
|
60
|
+
import { createSource } from "docstra/server";
|
|
61
|
+
|
|
62
|
+
export const source = createSource(docs);
|
|
63
|
+
`;
|
package/cli/utils/fs.js
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
const fs = require("fs");
|
|
2
|
+
const path = require("path");
|
|
3
|
+
|
|
4
|
+
function safeWrite(filePath, content) {
|
|
5
|
+
if (!fs.existsSync(filePath)) {
|
|
6
|
+
// Ensure directory exists
|
|
7
|
+
const dir = path.dirname(filePath);
|
|
8
|
+
if (!fs.existsSync(dir)) {
|
|
9
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
fs.writeFileSync(filePath, content);
|
|
13
|
+
console.log(`ā Created ${filePath.replace(process.cwd() + path.sep, "")}`);
|
|
14
|
+
} else {
|
|
15
|
+
console.log(`ā Already exists: ${filePath.replace(process.cwd() + path.sep, "")}`);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function createFolder(folderPath) {
|
|
20
|
+
if (!fs.existsSync(folderPath)) {
|
|
21
|
+
fs.mkdirSync(folderPath, { recursive: true });
|
|
22
|
+
console.log(`ā Created /${path.relative(process.cwd(), folderPath).replace(/\\/g, "/")}`);
|
|
23
|
+
} else {
|
|
24
|
+
console.log(`ā /${path.relative(process.cwd(), folderPath).replace(/\\/g, "/")} already exists`);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
module.exports = {
|
|
29
|
+
safeWrite,
|
|
30
|
+
createFolder
|
|
31
|
+
};
|
package/dist/client/index.js
CHANGED
|
@@ -659,6 +659,7 @@ function DocstraFeedback() {
|
|
|
659
659
|
const { docstraConfig } = useDocstra();
|
|
660
660
|
const [message, setMessage] = (0, import_react6.useState)("");
|
|
661
661
|
const [submitted, setSubmitted] = (0, import_react6.useState)(false);
|
|
662
|
+
const baseUrlOfGithub = "https://github.com/" + docstraConfig?.editOnGithub?.owner + "/" + docstraConfig?.editOnGithub?.repo;
|
|
662
663
|
return /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("div", { className: "border-y border-gray-200 mt-20 py-10 space-y-4", children: submitted ? /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)(import_jsx_runtime12.Fragment, { children: [
|
|
663
664
|
/* @__PURE__ */ (0, import_jsx_runtime12.jsx)("p", { className: "font-medium text-gray-900", children: "Thank you for your feedback!" }),
|
|
664
665
|
/* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
|
|
@@ -708,7 +709,7 @@ function DocstraFeedback() {
|
|
|
708
709
|
"form",
|
|
709
710
|
{
|
|
710
711
|
className: "flex flex-col gap-2",
|
|
711
|
-
action: `https://formsync.app/v1/s/${docstraConfig?.feedback?.formSyncFormID || ""}`,
|
|
712
|
+
action: `https://api.formsync.app/v1/s/${docstraConfig?.feedback?.formSyncFormID || ""}`,
|
|
712
713
|
method: "POST",
|
|
713
714
|
children: [
|
|
714
715
|
/* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
|
|
@@ -732,7 +733,7 @@ function DocstraFeedback() {
|
|
|
732
733
|
/* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
|
|
733
734
|
"a",
|
|
734
735
|
{
|
|
735
|
-
href: `https://www.formsync.app?utm_source=${
|
|
736
|
+
href: `https://www.formsync.app?utm_source=${baseUrlOfGithub}`,
|
|
736
737
|
className: "text-gray-800",
|
|
737
738
|
children: "FormSync"
|
|
738
739
|
}
|
package/dist/client/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/client/index.ts","../../src/context/docstra-context.tsx","../../src/client/components/search-box.tsx","../../src/utils/cn.ts","../../src/client/components/header.tsx","../../src/client/components/sidebar.tsx","../../src/utils/get-icon.ts","../../src/client/components/docstra-toc.tsx","../../src/client/components/docs-page.tsx","../../src/client/components/breadcrumbs.tsx","../../src/client/components/page-buttons.tsx","../../src/client/components/docstra-page-head.tsx","../../src/client/components/feedback.tsx","../../src/client/components/input.tsx","../../src/client/components/button.tsx","../../src/client/components/pagination.tsx","../../src/client/components/docs-body.tsx","../../src/client/components/code-block.tsx"],"sourcesContent":["'use client';\r\n\r\nexport * from '../context/docstra-context';\r\nexport * from './components/header';\r\nexport * from './components/docs-page';\r\nexport * from './components/docs-body';\r\nexport * from './components/code-block';","'use client';\r\nimport React, { createContext, useContext, useState } from 'react';\r\nimport { DocstraConfig, DocstraContextType, pageDataContent } from '../types';\r\nimport { ToastContainer } from 'react-toast-msg';\r\nimport { DocstraSearchBox } from '../client/components/search-box';\r\n\r\nconst DocstraContext = createContext<DocstraContextType | null>(null);\r\n\r\nexport function DocstraProvider({\r\n children,\r\n docstraConfig,\r\n docs,\r\n pageData: initialPageData,\r\n slug\r\n}: {\r\n children: React.ReactNode;\r\n docstraConfig: DocstraConfig;\r\n docs: pageDataContent[];\r\n pageData?: pageDataContent;\r\n slug?: string | string[];\r\n}) {\r\n const pageData = initialPageData || (() => {\r\n const normalizedSlug = Array.isArray(slug)\r\n ? (slug.length === 0 ? 'index' : slug.join('/'))\r\n : (slug || 'index');\r\n return docs.find(d => d.slug === normalizedSlug);\r\n })();\r\n\r\n if (!pageData) {\r\n // Fallback or error? For now, if no pageData and no resolution, context might be partial or throw.\r\n // But effectively this enables: <Provider docs={...} slug={...}>\r\n }\r\n const [openSidebar, setOpenSidebar] = useState(false);\r\n const [openSearchBox, setOpenSearchBox] = useState(false);\r\n\r\n return (\r\n <DocstraContext.Provider\r\n value={{\r\n openSidebar,\r\n setOpenSidebar,\r\n docstraConfig,\r\n openSearchBox,\r\n setOpenSearchBox,\r\n pageData: pageData!,\r\n docs\r\n }}\r\n >\r\n <ToastContainer />\r\n <DocstraSearchBox />\r\n {children}\r\n </DocstraContext.Provider>\r\n );\r\n}\r\n\r\nexport function useDocstra() {\r\n const ctx = useContext(DocstraContext);\r\n if (!ctx) throw new Error('Please wrap your app with DocstraProvider');\r\n return ctx;\r\n}\r\n","'use client';\r\n\r\nimport { SearchIcon } from 'lucide-react';\r\nimport { useDocstra } from '../../context/docstra-context';\r\nimport { cn } from '../../utils/cn';\r\nimport { useEffect, useMemo, useState } from 'react';\r\nimport Fuse from 'fuse.js';\r\nimport Link from 'next/link';\r\nimport { useRouter } from 'next/navigation';\r\n\r\nexport function DocstraSearchBox() {\r\n const { openSearchBox, setOpenSearchBox, docs } = useDocstra();\r\n const [searchQuery, setSearchQuery] = useState('');\r\n const [searchResults, setSearchResults] = useState<any[]>([]);\r\n const router = useRouter();\r\n\r\n useEffect(() => {\r\n const handleKeyDown = (event: KeyboardEvent) => {\r\n if (event.ctrlKey && event.key === 'k') {\r\n event.preventDefault();\r\n setOpenSearchBox(true);\r\n }\r\n };\r\n\r\n window.addEventListener('keydown', handleKeyDown);\r\n\r\n return () => {\r\n window.removeEventListener('keydown', handleKeyDown);\r\n };\r\n }, []);\r\n\r\n const fuse = useMemo(() => {\r\n if (!docs || docs.length === 0) return null;\r\n return new Fuse(docs, {\r\n keys: [\"data.metadata.title\", \"data.metadata.description\"],\r\n threshold: 0.3,\r\n });\r\n }, [docs]);\r\n\r\n useEffect(() => {\r\n if (searchQuery && fuse) {\r\n const results = fuse.search(searchQuery);\r\n setSearchResults(results.map(r => r.item));\r\n } else if (!searchQuery) {\r\n setSearchResults([]);\r\n }\r\n }, [searchQuery, fuse]);\r\n\r\n const onSearchHandler = (e: React.FormEvent<HTMLFormElement>) => {\r\n e.preventDefault();\r\n if (searchQuery) {\r\n const component = searchResults[0];\r\n if (component) {\r\n router.push(`/docs/${component.slug}`);\r\n setSearchQuery(\"\");\r\n setOpenSearchBox(false);\r\n }\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n const handleEscape = (e: KeyboardEvent) => {\r\n if (e.key === \"Escape\") {\r\n setOpenSearchBox(false);\r\n setSearchQuery(\"\");\r\n }\r\n };\r\n\r\n if (openSearchBox) {\r\n window.addEventListener(\"keydown\", handleEscape);\r\n }\r\n\r\n return () => {\r\n window.removeEventListener(\"keydown\", handleEscape);\r\n };\r\n }, [openSearchBox]);\r\n\r\n return (\r\n <div\r\n onClick={() => {\r\n setOpenSearchBox(false);\r\n setSearchQuery('');\r\n }}\r\n className={cn(\r\n 'fixed inset-0 z-25 flex items-start justify-center bg-white/40 backdrop-blur-md opacity-0 pointer-events-none transition-all duration-300',\r\n openSearchBox && 'opacity-100 pointer-events-auto'\r\n )}\r\n >\r\n <div\r\n onClick={e => e.stopPropagation()}\r\n className=\"flex flex-col items-center mt-30 max-w-lg w-full max-md:px-4\"\r\n >\r\n <form\r\n onSubmit={onSearchHandler}\r\n className={cn(\r\n 'relative flex items-center justify-between w-full bg-white border border-slate-200 text-gray-400 h-15 p-0.5 rounded-md',\r\n searchQuery && \"rounded-b-none border-b-0\"\r\n )}\r\n >\r\n {openSearchBox && (\r\n <>\r\n <SearchIcon className=\"size-5.5 mx-3 shrink-0\" />\r\n <input className=\"w-full bg-transparent h-full outline-none text-gray-400 placeholder:text-gray-400\" type=\"text\" placeholder=\"Search docs...\" spellCheck=\"false\" autoFocus={true} value={searchQuery} onChange={e => setSearchQuery(e.target.value)} name=\"searchQuery\" required />\r\n <span className=\"border border-gray-200 px-2 mr-3 py-1 rounded text-xs\">\r\n Esc\r\n </span>\r\n </>\r\n )}\r\n </form>\r\n <div\r\n className={cn(\r\n \"max-h-70 overflow-x-hidden overflow-y-auto scrollbar-y w-full bg-white text-slate-700 flex flex-col\",\r\n searchQuery && \"rounded-b-md border border-slate-200\"\r\n )}\r\n >\r\n {searchResults.map((item) => (\r\n <Link\r\n href={`/docs/${item.slug === 'index' ? '' : item.slug}`}\r\n key={item.slug}\r\n onClick={() => {\r\n setOpenSearchBox(false);\r\n setSearchQuery(\"\");\r\n }}\r\n className=\"w-full hover:bg-gray-100/70 border-b border-slate-200 transition-all py-4 px-4 last:mb-2\"\r\n >\r\n <h4 className=\"font-medium\">{item.data?.metadata?.title || item.slug}</h4>\r\n <p className=\"text-sm mt-1 text-gray-500\">{item.data?.metadata?.description}</p>\r\n </Link>\r\n ))}\r\n\r\n {searchQuery && searchResults.length === 0 && (\r\n <div className=\"text-gray-500 text-center py-20\">No results found</div>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import { twMerge } from 'tailwind-merge';\r\nimport clsx, { ClassValue } from 'clsx';\r\n\r\nexport function cn(...inputs: ClassValue[]) {\r\n return twMerge(clsx(inputs));\r\n}\r\n","'use client';\r\n\r\nimport { TextAlignEnd, XIcon } from 'lucide-react';\r\nimport { useEffect } from 'react';\r\nimport { useDocstra } from '../../context/docstra-context';\r\nimport { cn } from '../../utils/cn';\r\nimport Link from 'next/link';\r\n\r\nexport function DocstraHeader() {\r\n const { openSidebar, setOpenSidebar, docstraConfig } = useDocstra();\r\n\r\n const githubRepo = 'https://github.com/' + docstraConfig?.editOnGithub?.owner + '/' + docstraConfig?.editOnGithub?.repo;\r\n\r\n useEffect(() => {\r\n if (openSidebar) {\r\n document.body.classList.add('max-md:overflow-hidden');\r\n } else {\r\n document.body.classList.remove('max-md:overflow-hidden');\r\n }\r\n }, [openSidebar]);\r\n return (\r\n <header className=\"sticky top-0 z-10 text-sm flex items-center justify-between border-b border-gray-100 h-18 px-4 md:px-6 bg-white\">\r\n <Link href={docstraConfig.navbar?.logo?.link || '/'} className='hover:opacity-80 transition'>\r\n <img\r\n src={docstraConfig.navbar?.logo?.src || '/logo.png'}\r\n alt={docstraConfig.navbar?.logo?.alt || 'Logo'}\r\n className={cn('h-9.5 w-auto', docstraConfig.navbar?.logo?.className)}\r\n />\r\n </Link>\r\n <div className=\"hidden divide-x divide-gray-200 md:flex items-center\">\r\n {docstraConfig.navbar?.links?.map(link => (\r\n <Link key={link.name} href={link.href} className=\"px-6 hover:text-gray-600\">\r\n {link.name}\r\n </Link>\r\n ))}\r\n <Link href={githubRepo || 'https://github.com/sudhucodes/docstra'}>\r\n <svg className=\"size-6 mx-6\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n <path d=\"M12 .3a12 12 0 0 0-3.8 23.38c.6.12.83-.26.83-.57L9 21.07c-3.34.72-4.04-1.61-4.04-1.61-.55-1.39-1.34-1.76-1.34-1.76-1.08-.74.09-.73.09-.73 1.2.09 1.83 1.24 1.83 1.24 1.08 1.83 2.81 1.3 3.5 1 .1-.78.42-1.31.76-1.61-2.67-.3-5.47-1.33-5.47-5.93 0-1.31.47-2.38 1.24-3.22-.14-.3-.54-1.52.1-3.18 0 0 1-.32 3.3 1.23a11.5 11.5 0 0 1 6 0c2.28-1.55 3.29-1.23 3.29-1.23.64 1.66.24 2.88.12 3.18a4.65 4.65 0 0 1 1.23 3.22c0 4.61-2.8 5.63-5.48 5.92.42.36.81 1.1.81 2.22l-.01 3.29c0 .31.2.69.82.57A12 12 0 0 0 12 .3\" />\r\n </svg>\r\n </Link>\r\n </div>\r\n <button\r\n onClick={() => setOpenSidebar(!openSidebar)}\r\n className=\"md:hidden transition text-gray-600 active:ring-2 ring-gray-200 p-1.5 rounded-md\"\r\n >\r\n {openSidebar ? <XIcon className=\"size-6.5\" /> : <TextAlignEnd className=\"size-6.5\" />}\r\n </button>\r\n </header>\r\n );\r\n}\r\n","'use client';\r\n\r\nimport { SearchIcon } from 'lucide-react';\r\nimport { usePathname } from 'next/navigation';\r\nimport { cn } from '../../utils/cn';\r\nimport { useDocstra } from '../../context/docstra-context';\r\nimport { getIcon } from '../../utils/get-icon';\r\nimport { toast } from 'react-toast-msg';\r\nimport Link from 'next/link';\r\n\r\nexport function DocstraSidebar() {\r\n const { openSidebar, setOpenSidebar, docstraConfig, setOpenSearchBox } = useDocstra();\r\n const pathname = usePathname();\r\n\r\n return (\r\n <>\r\n <div\r\n className={cn(\r\n 'fixed inset-0 z-20 bg-black/50 opacity-0 pointer-events-none transition-all duration-300',\r\n openSidebar && 'opacity-100 pointer-events-auto'\r\n )}\r\n onClick={() => setOpenSidebar(false)}\r\n />\r\n <aside\r\n className={cn(\r\n 'sticky md:top-18 h-[calc(100svh-72px)] scrollbar-y w-screen max-md:rounded-t-lg z-21 md:w-72 pb-10 text-base md:text-sm shrink-0 border-r border-gray-200 p-4 max-md:fixed bg-white overflow-y-auto transition-all duration-300',\r\n openSidebar ? 'top-32' : 'top-full'\r\n )}\r\n >\r\n <div\r\n className=\"flex items-center select-none gap-2 cursor-pointer mt-6 mb-4 p-2.5 text-gray-500 border border-gray-200 rounded-lg hover:bg-gray-50\"\r\n onClick={() => {\r\n setOpenSidebar(openSidebar && false);\r\n setOpenSearchBox(true)\r\n }}\r\n >\r\n <SearchIcon className=\"size-4.5\" />\r\n <p>Search</p>\r\n <div className=\"ms-auto font-mono inline-flex gap-0.5\">\r\n <span className=\"rounded-md border border-gray-200 px-1.5\">Ctrl</span>\r\n <span className=\"rounded-md border border-gray-200 px-1.5\">K</span>\r\n </div>\r\n </div>\r\n\r\n {docstraConfig.sidebar?.links?.map(group => (\r\n <div key={group.section}>\r\n <p className=\"inline-flex items-center gap-2 mb-2 mt-2 px-2\">{group.section}</p>\r\n\r\n <ul className=\"mb-4\">\r\n {group.items.map(link => {\r\n const Icon = getIcon(link.icon);\r\n\r\n return (\r\n <li key={link.href}>\r\n <Link\r\n href={link.href}\r\n onNavigate={() => openSidebar && setOpenSidebar(false)}\r\n className={cn(\r\n 'flex items-center gap-2 text-gray-500 hover:bg-gray-100 py-2 px-2.5 rounded-lg',\r\n pathname === link.href && 'bg-gray-100 text-gray-800'\r\n )}\r\n >\r\n {Icon && <Icon className=\"size-4\" />}\r\n <span>{link.name}</span>\r\n </Link>\r\n </li>\r\n );\r\n })}\r\n </ul>\r\n </div>\r\n ))}\r\n </aside>\r\n </>\r\n );\r\n}\r\n","import * as Icons from 'lucide-react';\r\n\r\nexport function getIcon(name?: string) {\r\n if (!name) return undefined;\r\n\r\n return (Icons as Record<string, any>)[name];\r\n}\r\n","'use client';\r\n\r\nimport { ArrowUpCircleIcon, SquareArrowOutUpRightIcon, TextAlignStartIcon } from 'lucide-react';\r\nimport { usePathname } from 'next/navigation';\r\nimport { useEffect, useRef, useState } from 'react';\r\nimport { cn } from '../../utils/cn';\r\nimport { TOCLinkProps } from '../../types';\r\nimport { useDocstra } from '../../context/docstra-context';\r\n\r\n\r\nexport function DocstraTOC() {\r\n const [activeId, setActiveId] = useState<string | null>(null);\r\n const [scrollDir, setScrollDir] = useState<'up' | 'down'>('down');\r\n const [isScrolled, setIsScrolled] = useState(false);\r\n const [isManualClick, setIsManualClick] = useState(false);\r\n const { docstraConfig, pageData } = useDocstra();\r\n const mdxFilePath = pageData?.path;\r\n // We expect tableOfContents to be present in data now, extracted by loader.\r\n // Fallback to empty array if missing for some reason.\r\n const headings = pageData?.data?.tableOfContents || [];\r\n\r\n const lastScrollY = useRef(0);\r\n const observerRef = useRef<IntersectionObserver | null>(null);\r\n\r\n const pathname = usePathname();\r\n const baseUrlOfGithub = 'https://github.com/' + docstraConfig?.editOnGithub?.owner + '/' + docstraConfig?.editOnGithub?.repo;\r\n const githubLink = `${baseUrlOfGithub}/edit/main/${docstraConfig?.editOnGithub?.path}/${mdxFilePath}`;\r\n\r\n useEffect(() => {\r\n const onScroll = () => {\r\n const currentY = window.scrollY;\r\n setScrollDir(currentY > lastScrollY.current ? 'down' : 'up');\r\n setIsScrolled(currentY > 100);\r\n lastScrollY.current = currentY;\r\n };\r\n\r\n window.addEventListener('scroll', onScroll);\r\n return () => window.removeEventListener('scroll', onScroll);\r\n }, []);\r\n\r\n useEffect(() => {\r\n const allHeadings = document.querySelectorAll<HTMLHeadingElement>(`h2[id], h3[id]`);\r\n\r\n const observer = new IntersectionObserver(\r\n entries => {\r\n if (isManualClick) return;\r\n\r\n const visible = entries\r\n .filter(e => e.isIntersecting)\r\n .sort((a, b) => a.boundingClientRect.top - b.boundingClientRect.top);\r\n\r\n if (visible.length > 0) {\r\n const nextActive =\r\n scrollDir === 'down' ? visible[0].target.id : visible[visible.length - 1].target.id;\r\n\r\n setActiveId(nextActive);\r\n }\r\n },\r\n {\r\n rootMargin: '-40% 0px -50% 0px',\r\n threshold: [0, 0.2, 0.6, 1.0]\r\n }\r\n );\r\n\r\n allHeadings.forEach(heading => observer.observe(heading));\r\n observerRef.current = observer;\r\n\r\n return () => observer.disconnect();\r\n }, [pathname, scrollDir, isManualClick]);\r\n\r\n useEffect(() => {\r\n const scrolled = window.scrollY > 100;\r\n !scrolled && setActiveId(headings[0]?.id);\r\n }, [headings]);\r\n\r\n useEffect(() => {\r\n if (!activeId) return;\r\n\r\n const container = document.querySelector('.toc-scroll-container');\r\n if (!container) return;\r\n\r\n const activeLink = container.querySelector(`a[href=\"#${activeId}\"]`);\r\n if (!activeLink) return;\r\n\r\n const containerRect = container.getBoundingClientRect();\r\n const linkRect = activeLink.getBoundingClientRect();\r\n\r\n const isOutOfView =\r\n linkRect.top < containerRect.top || linkRect.bottom > containerRect.bottom;\r\n\r\n if (isOutOfView) {\r\n activeLink.scrollIntoView({\r\n behavior: 'smooth',\r\n block: 'nearest',\r\n });\r\n }\r\n }, [activeId]);\r\n\r\n\r\n useEffect(() => {\r\n if (!isManualClick) return;\r\n const timer = setTimeout(() => setIsManualClick(false), 800);\r\n return () => clearTimeout(timer);\r\n }, [isManualClick]);\r\n\r\n const handleClick = (id: string) => {\r\n setActiveId(id);\r\n setIsManualClick(true);\r\n };\r\n\r\n return (\r\n <aside className=\"sticky top-18 text-sm hidden xl:block text-gray-500 shrink-0 h-[calc(100svh-72px)] w-64 border-l border-gray-200 p-6 overflow-y-auto\">\r\n <p className=\"flex items-center gap-2 mb-5\">\r\n <TextAlignStartIcon className=\"size-4\" />\r\n On this page\r\n </p>\r\n\r\n {/* Links Container */}\r\n <ul className='toc-scroll-container max-h-3/4 overflow-y-auto scrollbar-none'>\r\n {headings.map(h2 => (\r\n <li key={h2.id}>\r\n <TableOfContentsLink heading={h2} activeId={activeId} handleClick={handleClick} />\r\n\r\n {h2.children.map(h3 => (\r\n <TableOfContentsLink\r\n key={h3.id}\r\n heading={h3}\r\n activeId={activeId}\r\n handleClick={handleClick}\r\n className=\"pl-8\"\r\n />\r\n ))}\r\n </li>\r\n ))}\r\n </ul>\r\n\r\n <hr className=\"my-6 border-gray-200\" />\r\n\r\n {docstraConfig.editOnGithub && (\r\n <a\r\n href={githubLink}\r\n rel=\"noopener noreferrer\"\r\n className=\"flex items-center gap-2 text-gray-400 hover:text-gray-700 transition\"\r\n >\r\n Edit this page on GitHub\r\n <SquareArrowOutUpRightIcon className=\"size-4\" />\r\n </a>\r\n )}\r\n\r\n {isScrolled && (\r\n <button\r\n onClick={() => scrollTo({ top: 0, behavior: 'smooth' })}\r\n className=\"flex items-center cursor-pointer gap-2 mt-3 text-gray-400 hover:text-gray-700 transition\"\r\n >\r\n Scroll to top\r\n <ArrowUpCircleIcon className=\"size-4\" />\r\n </button>\r\n )}\r\n </aside>\r\n );\r\n}\r\n\r\nfunction TableOfContentsLink({ heading, activeId, handleClick, className }: TOCLinkProps) {\r\n return (\r\n <a\r\n href={`#${heading.id}`}\r\n className={cn('border-l border-gray-200 block py-1.5 pl-4 transition-colors', className, {\r\n 'border-gray-800 text-gray-900 font-medium': activeId === heading.id,\r\n 'hover:text-gray-800 hover:border-gray-400': activeId !== heading.id\r\n })}\r\n onClick={() => handleClick(heading.id)}\r\n >\r\n {heading.text}\r\n </a>\r\n );\r\n}\r\n","import { DocstraSidebar } from './sidebar';\r\nimport { DocstraTOC } from './docstra-toc';\r\n\r\ninterface DocstraPageProps {\r\n children: React.ReactNode;\r\n toc?: boolean;\r\n sidebar?: boolean;\r\n}\r\n\r\nexport function DocstraPage({ children, toc = true, sidebar = true }: DocstraPageProps) {\r\n return (\r\n <div className=\"min-h-screen flex bg-white w-full\">\r\n {sidebar && <DocstraSidebar />}\r\n {children}\r\n {toc && <DocstraTOC />}\r\n </div>\r\n );\r\n}\r\n","'use client';\r\n\r\nimport { usePathname } from 'next/navigation';\r\nimport { ChevronRight } from 'lucide-react';\r\nimport Link from 'next/link';\r\n\r\nexport function DocstraBreadcrumbs() {\r\n const pathname = usePathname();\r\n const paths = pathname.split('/').filter(Boolean);\r\n\r\n const breadcrumbs = paths.map((segment, index) => {\r\n const href = '/' + paths.slice(0, index + 1).join('/');\r\n const title = segment.replace(/-/g, ' ').replace(/\\b\\w/g, c => c.toUpperCase());\r\n return { href, title };\r\n });\r\n\r\n return (\r\n <nav aria-label=\"Breadcrumb\" className=\"flex text-sm items-center pb-4 text-gray-500\">\r\n <ol className=\"flex items-center space-x-2\">\r\n <li>\r\n <Link href=\"/\" className=\"hover:text-gray-700 transition-colors font-medium\">\r\n Home\r\n </Link>\r\n </li>\r\n\r\n {breadcrumbs.map((crumb, index) => {\r\n const isLast = index === breadcrumbs.length - 1;\r\n return (\r\n <li key={crumb.href} className=\"flex items-center space-x-2\">\r\n <ChevronRight className=\"w-4 h-4 text-gray-400\" />\r\n {isLast ? (\r\n <span className=\"text-gray-600 font-medium\">{crumb.title}</span>\r\n ) : (\r\n <Link href={crumb.href} className=\"hover:text-gray-700 font-medium transition-colors\">\r\n {crumb.title}\r\n </Link>\r\n )}\r\n </li>\r\n );\r\n })}\r\n </ol>\r\n </nav>\r\n );\r\n}\r\n","'use client';\r\n\r\nimport { CheckIcon, CopyIcon } from 'lucide-react';\r\nimport { useEffect, useState } from 'react';\r\nimport { useDocstra } from '../../context/docstra-context';\r\n\r\nexport function DocstraPageButtons() {\r\n const { pageData } = useDocstra();\r\n const [isCopied, setIsCopied] = useState(false);\r\n const [href, setHref] = useState<string | null>(null);\r\n\r\n useEffect(() => {\r\n setHref(window.location.href);\r\n }, []);\r\n\r\n const prompt = `Read from this URL: ${href} and explain it to me.`;\r\n\r\n const handleCopy = () => {\r\n navigator.clipboard.writeText(pageData?.data.raw || '');\r\n setIsCopied(true);\r\n setTimeout(() => setIsCopied(false), 3000);\r\n };\r\n\r\n return (\r\n <div className=\"flex items-center gap-3 mt-6\">\r\n <button\r\n title=\"Copy Markdown\"\r\n onClick={handleCopy}\r\n className=\"flex items-center cursor-pointer gap-2 bg-gray-50 hover:bg-gray-100 border border-gray-200 px-3 py-2 rounded-md text-xs\"\r\n >\r\n {isCopied ? <CheckIcon className=\"size-3.5\" /> : <CopyIcon className=\"size-3.5\" />}\r\n Copy Markdown\r\n </button>\r\n <a\r\n title=\"Ask ChatGPT\"\r\n href={`https://chatgpt.com/?hints=search&q=${encodeURIComponent(prompt)}`}\r\n className=\"flex items-center gap-2 bg-gray-50 hover:bg-gray-100 border border-gray-200 px-3 py-2 rounded-md text-xs\"\r\n rel=\"noreferrer noopener\"\r\n >\r\n Ask ChatGPT\r\n </a>\r\n </div>\r\n );\r\n}\r\n","import { useDocstra } from '../../context/docstra-context';\r\nimport { DocstraPageButtons } from './page-buttons';\r\n\r\nexport function DocstraPageHead() {\r\n const { pageData } = useDocstra();\r\n const title = pageData?.data?.metadata?.title;\r\n const description = pageData?.data?.metadata?.description;\r\n return (\r\n <>\r\n <h1 className=\"text-3xl font-bold\">{title}</h1>\r\n <p className=\"my-4 text-gray-500\">{description}</p>\r\n <DocstraPageButtons />\r\n <hr className=\"my-10 border-gray-200\" />\r\n </>\r\n );\r\n}\r\n","'use client';\r\n\r\nimport { useState } from 'react';\r\nimport { ThumbsUp, ThumbsDown } from 'lucide-react';\r\nimport Input from './input';\r\nimport Button from './button';\r\nimport { useDocstra } from '../../context/docstra-context';\r\n\r\ntype Opinion = 'good' | 'bad' | null;\r\n\r\nexport function DocstraFeedback() {\r\n const [opinion, setOpinion] = useState<Opinion>(null);\r\n const { docstraConfig } = useDocstra();\r\n const [message, setMessage] = useState<string>('');\r\n const [submitted, setSubmitted] = useState<boolean>(false);\r\n\r\n return (\r\n <div className=\"border-y border-gray-200 mt-20 py-10 space-y-4\">\r\n {submitted ? (\r\n <>\r\n <p className=\"font-medium text-gray-900\">Thank you for your feedback!</p>\r\n <Button\r\n onClick={() => {\r\n setSubmitted(false);\r\n setOpinion(null);\r\n setMessage('');\r\n }}\r\n label=\"Submit Again\"\r\n className=\"w-max text-sm\"\r\n />\r\n </>\r\n ) : (\r\n <>\r\n <p className=\"font-medium\">How is this guide?</p>\r\n <div className=\"flex gap-2\">\r\n <button\r\n onClick={() => setOpinion('good')}\r\n className={`flex items-center cursor-pointer gap-1 px-3 py-2 rounded-full border text-sm ${opinion === 'good'\r\n ? 'bg-green-100 text-green-600 border-green-300'\r\n : 'border-gray-200 text-gray-600 hover:bg-gray-100'\r\n }`}\r\n >\r\n <ThumbsUp className={`size-4 ${opinion === 'good' ? 'fill-green-600' : 'text-gray-500'}`} />\r\n Good\r\n </button>\r\n <button\r\n onClick={() => setOpinion('bad')}\r\n className={`flex items-center cursor-pointer gap-1 px-3 py-2 rounded-full border text-sm ${opinion === 'bad'\r\n ? 'bg-red-100 text-red-600 border-red-300'\r\n : 'border-gray-200 text-gray-600 hover:bg-gray-100'\r\n }`}\r\n >\r\n <ThumbsDown\r\n className={`size-4 pt-0.5 ${opinion === 'bad' ? 'fill-red-600' : 'text-gray-500'}`}\r\n />\r\n Bad\r\n </button>\r\n </div>\r\n {opinion && (\r\n <form\r\n className=\"flex flex-col gap-2\"\r\n action={`https://formsync.app/v1/s/${docstraConfig?.feedback?.formSyncFormID || ''}`}\r\n method=\"POST\"\r\n >\r\n <Input\r\n value={message}\r\n id=\"message\"\r\n onChange={e => setMessage(e.target.value)}\r\n placeholder=\"Leave your feedback...\"\r\n required\r\n type=\"textarea\"\r\n />\r\n <input type=\"hidden\" name=\"opinion\" value={opinion} />\r\n <input type=\"hidden\" name=\"page\" value={window.location.href} />\r\n <input type=\"hidden\" name=\"_redirect\" value={window.location.href} />\r\n <Button label=\"Submit\" className=\"w-max text-sm\" />\r\n {docstraConfig?.feedback?.watermark !== false && (\r\n <p className=\"text-left text-sm text-gray-500 mt-6\">\r\n Powered by{' '}\r\n <a\r\n href={`https://www.formsync.app?utm_source=${docstraConfig?.githubRepo}`}\r\n className=\"text-gray-800\"\r\n >\r\n FormSync\r\n </a>\r\n </p>\r\n )}\r\n </form>\r\n )}\r\n </>\r\n )}\r\n </div>\r\n );\r\n}\r\n","import { cn } from '../../utils/cn';\r\n\r\ninterface Props {\r\n label?: string;\r\n type?: 'text' | 'textarea';\r\n placeholder?: string;\r\n id: string;\r\n required?: boolean;\r\n onChange?: (e: any) => void;\r\n value?: string;\r\n readOnly?: boolean;\r\n className?: string;\r\n optional?: boolean;\r\n}\r\n\r\nexport default function Input({\r\n label,\r\n type,\r\n placeholder = '',\r\n id,\r\n required = false,\r\n onChange,\r\n value,\r\n readOnly = false,\r\n className = '',\r\n optional = false\r\n}: Props) {\r\n return (\r\n <div className={cn('flex flex-col mt-4 w-full', className)}>\r\n {label && (\r\n <label htmlFor={id} className=\"font-medium w-max cursor-pointer\">\r\n {label}\r\n {optional && <span className=\"text-xs font-normal text-gray-400 ml-1 mt-1\">(Optional)</span>}\r\n </label>\r\n )}\r\n {type === 'textarea' ? (\r\n <textarea\r\n id={id}\r\n name={id}\r\n className={cn(\r\n 'mt-2 w-full p-3 border border-gray-300 resize-none not-focus:hover:border-gray-500 read-only:text-gray-400/80 outline-none focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2 transition-all duration-200 rounded-lg',\r\n className\r\n )}\r\n placeholder={placeholder}\r\n required={required}\r\n onChange={onChange}\r\n rows={4}\r\n value={value}\r\n readOnly={readOnly}\r\n />\r\n ) : (\r\n <input\r\n type={type}\r\n id={id}\r\n name={id}\r\n className=\"mt-2 w-full h-12 px-3 border border-gray-300 not-focus:hover:border-gray-500 read-only:text-gray-400/80 outline-none focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2 transition-all duration-200 rounded-lg\"\r\n placeholder={placeholder}\r\n required={required}\r\n onChange={onChange}\r\n value={value}\r\n readOnly={readOnly}\r\n />\r\n )}\r\n </div>\r\n );\r\n}\r\n","import { Loader2Icon } from 'lucide-react';\r\nimport { cn } from '../../utils/cn';\r\n\r\ninterface Props {\r\n label: string;\r\n loading?: boolean;\r\n type?: 'submit' | 'button';\r\n className?: string;\r\n disabled?: boolean;\r\n onClick?: () => void;\r\n}\r\n\r\nexport default function Button({ label, loading, type = 'submit', className = '', disabled = false, onClick }: Props) {\r\n return (\r\n <button\r\n type={type}\r\n disabled={disabled}\r\n className={cn(\r\n 'relative w-full mt-4 h-12 px-6 py-3 cursor-pointer font-medium bg-gray-900 hover:opacity-85 text-white rounded-lg',\r\n className\r\n )}\r\n aria-label={label}\r\n onClick={onClick}\r\n >\r\n {loading ? (\r\n <Loader2Icon className=\"absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 animate-spin mx-auto\" />\r\n ) : (\r\n label\r\n )}\r\n </button>\r\n );\r\n}\r\n","'use client';\r\n\r\nimport { usePathname } from 'next/navigation';\r\nimport Link from 'next/link';\r\nimport { ArrowLeftIcon, ArrowRightIcon } from 'lucide-react';\r\nimport { useDocstra } from '../../context/docstra-context';\r\nimport { DocsLinkGroup, DocsLinkItem } from '../../types';\r\n\r\nexport function DocstraPagination() {\r\n const pathname = usePathname();\r\n const { docstraConfig } = useDocstra();\r\n\r\n const flatLinks: any = docstraConfig?.sidebar?.links?.flatMap((section: DocsLinkGroup) => section.items);\r\n\r\n const currentIndex = flatLinks.findIndex((item: DocsLinkItem) => item.href === pathname);\r\n\r\n const prev = currentIndex > 0 ? flatLinks[currentIndex - 1] : null;\r\n const next = currentIndex < flatLinks.length - 1 ? flatLinks[currentIndex + 1] : null;\r\n\r\n return (\r\n <div className=\"flex flex-col lg:flex-row gap-2 justify-between py-10 mt-10\">\r\n {prev ? (\r\n <Link\r\n href={prev.href}\r\n className=\"flex flex-col items-start gap-2 border border-gray-200 hover:bg-gray-50 py-3 md:min-w-62 pl-4 pr-10 rounded-lg text-sm\"\r\n >\r\n <span className=\"text-gray-500\">Previous</span>\r\n <p className=\"flex items-center font-medium\">\r\n <ArrowLeftIcon className=\"size-5 mr-2\" />\r\n {prev.name}\r\n </p>\r\n </Link>\r\n ) : (\r\n <div />\r\n )}\r\n\r\n {next ? (\r\n <Link\r\n href={next.href}\r\n className=\"flex flex-col items-end gap-2 border border-gray-200 hover:bg-gray-50 py-3 pr-4 md:min-w-62 pl-10 rounded-lg text-sm\"\r\n >\r\n <span className=\"text-gray-500\">Next</span>\r\n <p className=\"flex items-center font-medium\">\r\n {next.name}\r\n <ArrowRightIcon className=\"size-5 ml-2\" />\r\n </p>\r\n </Link>\r\n ) : (\r\n <div />\r\n )}\r\n </div>\r\n );\r\n}\r\n","import { useDocstra } from '../../context/docstra-context';\r\nimport { DocstraBreadcrumbs } from './breadcrumbs';\r\nimport { DocstraPageHead } from './docstra-page-head';\r\nimport { DocstraFeedback } from './feedback';\r\nimport { DocstraPagination } from './pagination';\r\n\r\ninterface Props {\r\n children: React.ReactNode;\r\n}\r\n\r\nexport function DocstraBody({ children }: Props) {\r\n const { docstraConfig } = useDocstra();\r\n return (\r\n <main className=\"flex-1 px-4 md:px-8 py-10 max-w-full text-base/7\">\r\n <DocstraBreadcrumbs />\r\n <DocstraPageHead />\r\n {children}\r\n {docstraConfig?.feedback?.enabled && <DocstraFeedback />}\r\n <DocstraPagination />\r\n </main>\r\n );\r\n}\r\n","import { CheckIcon, CopyIcon } from 'lucide-react';\r\nimport { Highlight, themes } from 'prism-react-renderer';\r\nimport { useState } from 'react';\r\n\r\nexport function DocstraCodeBlock(props: any) {\r\n const { filename, children, className } = props;\r\n\r\n const isInline = !className?.includes(\"language-\");\r\n\r\n const rawText =\r\n typeof children === \"string\"\r\n ? children\r\n : children?.props?.children || \"\";\r\n\r\n if (isInline) {\r\n return (\r\n <code className=\"px-1 py-0.5 rounded border border-gray-200 text-gray-800 text-sm\">\r\n {rawText}\r\n </code>\r\n );\r\n }\r\n\r\n const [isCopied, setIsCopied] = useState(false);\r\n\r\n const match = className?.match(/language-([\\w-]+)/);\r\n const language = match?.[1] ?? \"txt\";\r\n\r\n const handleCopy = () => {\r\n navigator.clipboard.writeText(rawText.trim());\r\n setIsCopied(true);\r\n setTimeout(() => setIsCopied(false), 2000);\r\n };\r\n\r\n return (\r\n <div className=\"max-w-2xl overflow-hidden rounded-lg text-sm text-gray-800 border border-gray-200/80 mt-4\">\r\n <div className=\"flex items-center bg-gray-50 justify-between border-b border-gray-200/80\">\r\n <span className=\"text-xs text-gray-400 p-4\">\r\n {filename || language}\r\n </span>\r\n\r\n <button\r\n onClick={handleCopy}\r\n className=\"rounded cursor-pointer aspect-square p-2 m-2 text-xs hover:bg-gray-200 transition\"\r\n >\r\n {isCopied ? (\r\n <CheckIcon className=\"size-4\" />\r\n ) : (\r\n <CopyIcon className=\"size-4\" />\r\n )}\r\n </button>\r\n </div>\r\n\r\n <Highlight\r\n theme={themes.vsLight}\r\n code={rawText.trim()}\r\n language={language}\r\n >\r\n {({ tokens, getLineProps, getTokenProps }) => (\r\n <pre className=\"p-4 font-mono whitespace-pre overflow-x-auto\">\r\n {tokens.map((line, i) => (\r\n <div key={i} {...getLineProps({ line })}>\r\n <span className=\"text-slate-500 mr-4 select-none\">\r\n {i + 1}\r\n </span>\r\n {line.map((token, key) => (\r\n <span key={key} {...getTokenProps({ token })} />\r\n ))}\r\n </div>\r\n ))}\r\n </pre>\r\n )}\r\n </Highlight>\r\n </div>\r\n );\r\n}"],"mappings":"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","names":["import_react","clsx","Fuse","Link","import_jsx_runtime","import_lucide_react","import_react","import_link","import_jsx_runtime","Link","import_lucide_react","import_navigation","import_link","import_jsx_runtime","Link","import_lucide_react","import_navigation","import_react","import_jsx_runtime","import_jsx_runtime","import_navigation","import_lucide_react","import_link","import_jsx_runtime","Link","import_lucide_react","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_lucide_react","import_jsx_runtime","import_lucide_react","import_jsx_runtime","import_jsx_runtime","import_navigation","import_link","import_lucide_react","import_jsx_runtime","Link","import_jsx_runtime","import_lucide_react","import_react","import_jsx_runtime"]}
|
|
1
|
+
{"version":3,"sources":["../../src/client/index.ts","../../src/context/docstra-context.tsx","../../src/client/components/search-box.tsx","../../src/utils/cn.ts","../../src/client/components/header.tsx","../../src/client/components/sidebar.tsx","../../src/utils/get-icon.ts","../../src/client/components/docstra-toc.tsx","../../src/client/components/docs-page.tsx","../../src/client/components/breadcrumbs.tsx","../../src/client/components/page-buttons.tsx","../../src/client/components/docstra-page-head.tsx","../../src/client/components/feedback.tsx","../../src/client/components/input.tsx","../../src/client/components/button.tsx","../../src/client/components/pagination.tsx","../../src/client/components/docs-body.tsx","../../src/client/components/code-block.tsx"],"sourcesContent":["'use client';\r\n\r\nexport * from '../context/docstra-context';\r\nexport * from './components/header';\r\nexport * from './components/docs-page';\r\nexport * from './components/docs-body';\r\nexport * from './components/code-block';","'use client';\r\nimport React, { createContext, useContext, useState } from 'react';\r\nimport { DocstraConfig, DocstraContextType, pageDataContent } from '../types';\r\nimport { ToastContainer } from 'react-toast-msg';\r\nimport { DocstraSearchBox } from '../client/components/search-box';\r\n\r\nconst DocstraContext = createContext<DocstraContextType | null>(null);\r\n\r\nexport function DocstraProvider({\r\n children,\r\n docstraConfig,\r\n docs,\r\n pageData: initialPageData,\r\n slug\r\n}: {\r\n children: React.ReactNode;\r\n docstraConfig: DocstraConfig;\r\n docs: pageDataContent[];\r\n pageData?: pageDataContent;\r\n slug?: string | string[];\r\n}) {\r\n const pageData = initialPageData || (() => {\r\n const normalizedSlug = Array.isArray(slug)\r\n ? (slug.length === 0 ? 'index' : slug.join('/'))\r\n : (slug || 'index');\r\n return docs.find(d => d.slug === normalizedSlug);\r\n })();\r\n\r\n if (!pageData) {\r\n // Fallback or error? For now, if no pageData and no resolution, context might be partial or throw.\r\n // But effectively this enables: <Provider docs={...} slug={...}>\r\n }\r\n const [openSidebar, setOpenSidebar] = useState(false);\r\n const [openSearchBox, setOpenSearchBox] = useState(false);\r\n\r\n return (\r\n <DocstraContext.Provider\r\n value={{\r\n openSidebar,\r\n setOpenSidebar,\r\n docstraConfig,\r\n openSearchBox,\r\n setOpenSearchBox,\r\n pageData: pageData!,\r\n docs\r\n }}\r\n >\r\n <ToastContainer />\r\n <DocstraSearchBox />\r\n {children}\r\n </DocstraContext.Provider>\r\n );\r\n}\r\n\r\nexport function useDocstra() {\r\n const ctx = useContext(DocstraContext);\r\n if (!ctx) throw new Error('Please wrap your app with DocstraProvider');\r\n return ctx;\r\n}\r\n","'use client';\r\n\r\nimport { SearchIcon } from 'lucide-react';\r\nimport { useDocstra } from '../../context/docstra-context';\r\nimport { cn } from '../../utils/cn';\r\nimport { useEffect, useMemo, useState } from 'react';\r\nimport Fuse from 'fuse.js';\r\nimport Link from 'next/link';\r\nimport { useRouter } from 'next/navigation';\r\n\r\nexport function DocstraSearchBox() {\r\n const { openSearchBox, setOpenSearchBox, docs } = useDocstra();\r\n const [searchQuery, setSearchQuery] = useState('');\r\n const [searchResults, setSearchResults] = useState<any[]>([]);\r\n const router = useRouter();\r\n\r\n useEffect(() => {\r\n const handleKeyDown = (event: KeyboardEvent) => {\r\n if (event.ctrlKey && event.key === 'k') {\r\n event.preventDefault();\r\n setOpenSearchBox(true);\r\n }\r\n };\r\n\r\n window.addEventListener('keydown', handleKeyDown);\r\n\r\n return () => {\r\n window.removeEventListener('keydown', handleKeyDown);\r\n };\r\n }, []);\r\n\r\n const fuse = useMemo(() => {\r\n if (!docs || docs.length === 0) return null;\r\n return new Fuse(docs, {\r\n keys: [\"data.metadata.title\", \"data.metadata.description\"],\r\n threshold: 0.3,\r\n });\r\n }, [docs]);\r\n\r\n useEffect(() => {\r\n if (searchQuery && fuse) {\r\n const results = fuse.search(searchQuery);\r\n setSearchResults(results.map(r => r.item));\r\n } else if (!searchQuery) {\r\n setSearchResults([]);\r\n }\r\n }, [searchQuery, fuse]);\r\n\r\n const onSearchHandler = (e: React.FormEvent<HTMLFormElement>) => {\r\n e.preventDefault();\r\n if (searchQuery) {\r\n const component = searchResults[0];\r\n if (component) {\r\n router.push(`/docs/${component.slug}`);\r\n setSearchQuery(\"\");\r\n setOpenSearchBox(false);\r\n }\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n const handleEscape = (e: KeyboardEvent) => {\r\n if (e.key === \"Escape\") {\r\n setOpenSearchBox(false);\r\n setSearchQuery(\"\");\r\n }\r\n };\r\n\r\n if (openSearchBox) {\r\n window.addEventListener(\"keydown\", handleEscape);\r\n }\r\n\r\n return () => {\r\n window.removeEventListener(\"keydown\", handleEscape);\r\n };\r\n }, [openSearchBox]);\r\n\r\n return (\r\n <div\r\n onClick={() => {\r\n setOpenSearchBox(false);\r\n setSearchQuery('');\r\n }}\r\n className={cn(\r\n 'fixed inset-0 z-25 flex items-start justify-center bg-white/40 backdrop-blur-md opacity-0 pointer-events-none transition-all duration-300',\r\n openSearchBox && 'opacity-100 pointer-events-auto'\r\n )}\r\n >\r\n <div\r\n onClick={e => e.stopPropagation()}\r\n className=\"flex flex-col items-center mt-30 max-w-lg w-full max-md:px-4\"\r\n >\r\n <form\r\n onSubmit={onSearchHandler}\r\n className={cn(\r\n 'relative flex items-center justify-between w-full bg-white border border-slate-200 text-gray-400 h-15 p-0.5 rounded-md',\r\n searchQuery && \"rounded-b-none border-b-0\"\r\n )}\r\n >\r\n {openSearchBox && (\r\n <>\r\n <SearchIcon className=\"size-5.5 mx-3 shrink-0\" />\r\n <input className=\"w-full bg-transparent h-full outline-none text-gray-400 placeholder:text-gray-400\" type=\"text\" placeholder=\"Search docs...\" spellCheck=\"false\" autoFocus={true} value={searchQuery} onChange={e => setSearchQuery(e.target.value)} name=\"searchQuery\" required />\r\n <span className=\"border border-gray-200 px-2 mr-3 py-1 rounded text-xs\">\r\n Esc\r\n </span>\r\n </>\r\n )}\r\n </form>\r\n <div\r\n className={cn(\r\n \"max-h-70 overflow-x-hidden overflow-y-auto scrollbar-y w-full bg-white text-slate-700 flex flex-col\",\r\n searchQuery && \"rounded-b-md border border-slate-200\"\r\n )}\r\n >\r\n {searchResults.map((item) => (\r\n <Link\r\n href={`/docs/${item.slug === 'index' ? '' : item.slug}`}\r\n key={item.slug}\r\n onClick={() => {\r\n setOpenSearchBox(false);\r\n setSearchQuery(\"\");\r\n }}\r\n className=\"w-full hover:bg-gray-100/70 border-b border-slate-200 transition-all py-4 px-4 last:mb-2\"\r\n >\r\n <h4 className=\"font-medium\">{item.data?.metadata?.title || item.slug}</h4>\r\n <p className=\"text-sm mt-1 text-gray-500\">{item.data?.metadata?.description}</p>\r\n </Link>\r\n ))}\r\n\r\n {searchQuery && searchResults.length === 0 && (\r\n <div className=\"text-gray-500 text-center py-20\">No results found</div>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import { twMerge } from 'tailwind-merge';\r\nimport clsx, { ClassValue } from 'clsx';\r\n\r\nexport function cn(...inputs: ClassValue[]) {\r\n return twMerge(clsx(inputs));\r\n}\r\n","'use client';\r\n\r\nimport { TextAlignEnd, XIcon } from 'lucide-react';\r\nimport { useEffect } from 'react';\r\nimport { useDocstra } from '../../context/docstra-context';\r\nimport { cn } from '../../utils/cn';\r\nimport Link from 'next/link';\r\n\r\nexport function DocstraHeader() {\r\n const { openSidebar, setOpenSidebar, docstraConfig } = useDocstra();\r\n\r\n const githubRepo = 'https://github.com/' + docstraConfig?.editOnGithub?.owner + '/' + docstraConfig?.editOnGithub?.repo;\r\n\r\n useEffect(() => {\r\n if (openSidebar) {\r\n document.body.classList.add('max-md:overflow-hidden');\r\n } else {\r\n document.body.classList.remove('max-md:overflow-hidden');\r\n }\r\n }, [openSidebar]);\r\n return (\r\n <header className=\"sticky top-0 z-10 text-sm flex items-center justify-between border-b border-gray-100 h-18 px-4 md:px-6 bg-white\">\r\n <Link href={docstraConfig.navbar?.logo?.link || '/'} className='hover:opacity-80 transition'>\r\n <img\r\n src={docstraConfig.navbar?.logo?.src || '/logo.png'}\r\n alt={docstraConfig.navbar?.logo?.alt || 'Logo'}\r\n className={cn('h-9.5 w-auto', docstraConfig.navbar?.logo?.className)}\r\n />\r\n </Link>\r\n <div className=\"hidden divide-x divide-gray-200 md:flex items-center\">\r\n {docstraConfig.navbar?.links?.map(link => (\r\n <Link key={link.name} href={link.href} className=\"px-6 hover:text-gray-600\">\r\n {link.name}\r\n </Link>\r\n ))}\r\n <Link href={githubRepo || 'https://github.com/sudhucodes/docstra'}>\r\n <svg className=\"size-6 mx-6\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n <path d=\"M12 .3a12 12 0 0 0-3.8 23.38c.6.12.83-.26.83-.57L9 21.07c-3.34.72-4.04-1.61-4.04-1.61-.55-1.39-1.34-1.76-1.34-1.76-1.08-.74.09-.73.09-.73 1.2.09 1.83 1.24 1.83 1.24 1.08 1.83 2.81 1.3 3.5 1 .1-.78.42-1.31.76-1.61-2.67-.3-5.47-1.33-5.47-5.93 0-1.31.47-2.38 1.24-3.22-.14-.3-.54-1.52.1-3.18 0 0 1-.32 3.3 1.23a11.5 11.5 0 0 1 6 0c2.28-1.55 3.29-1.23 3.29-1.23.64 1.66.24 2.88.12 3.18a4.65 4.65 0 0 1 1.23 3.22c0 4.61-2.8 5.63-5.48 5.92.42.36.81 1.1.81 2.22l-.01 3.29c0 .31.2.69.82.57A12 12 0 0 0 12 .3\" />\r\n </svg>\r\n </Link>\r\n </div>\r\n <button\r\n onClick={() => setOpenSidebar(!openSidebar)}\r\n className=\"md:hidden transition text-gray-600 active:ring-2 ring-gray-200 p-1.5 rounded-md\"\r\n >\r\n {openSidebar ? <XIcon className=\"size-6.5\" /> : <TextAlignEnd className=\"size-6.5\" />}\r\n </button>\r\n </header>\r\n );\r\n}\r\n","'use client';\r\n\r\nimport { SearchIcon } from 'lucide-react';\r\nimport { usePathname } from 'next/navigation';\r\nimport { cn } from '../../utils/cn';\r\nimport { useDocstra } from '../../context/docstra-context';\r\nimport { getIcon } from '../../utils/get-icon';\r\nimport { toast } from 'react-toast-msg';\r\nimport Link from 'next/link';\r\n\r\nexport function DocstraSidebar() {\r\n const { openSidebar, setOpenSidebar, docstraConfig, setOpenSearchBox } = useDocstra();\r\n const pathname = usePathname();\r\n\r\n return (\r\n <>\r\n <div\r\n className={cn(\r\n 'fixed inset-0 z-20 bg-black/50 opacity-0 pointer-events-none transition-all duration-300',\r\n openSidebar && 'opacity-100 pointer-events-auto'\r\n )}\r\n onClick={() => setOpenSidebar(false)}\r\n />\r\n <aside\r\n className={cn(\r\n 'sticky md:top-18 h-[calc(100svh-72px)] scrollbar-y w-screen max-md:rounded-t-lg z-21 md:w-72 pb-10 text-base md:text-sm shrink-0 border-r border-gray-200 p-4 max-md:fixed bg-white overflow-y-auto transition-all duration-300',\r\n openSidebar ? 'top-32' : 'top-full'\r\n )}\r\n >\r\n <div\r\n className=\"flex items-center select-none gap-2 cursor-pointer mt-6 mb-4 p-2.5 text-gray-500 border border-gray-200 rounded-lg hover:bg-gray-50\"\r\n onClick={() => {\r\n setOpenSidebar(openSidebar && false);\r\n setOpenSearchBox(true)\r\n }}\r\n >\r\n <SearchIcon className=\"size-4.5\" />\r\n <p>Search</p>\r\n <div className=\"ms-auto font-mono inline-flex gap-0.5\">\r\n <span className=\"rounded-md border border-gray-200 px-1.5\">Ctrl</span>\r\n <span className=\"rounded-md border border-gray-200 px-1.5\">K</span>\r\n </div>\r\n </div>\r\n\r\n {docstraConfig.sidebar?.links?.map(group => (\r\n <div key={group.section}>\r\n <p className=\"inline-flex items-center gap-2 mb-2 mt-2 px-2\">{group.section}</p>\r\n\r\n <ul className=\"mb-4\">\r\n {group.items.map(link => {\r\n const Icon = getIcon(link.icon);\r\n\r\n return (\r\n <li key={link.href}>\r\n <Link\r\n href={link.href}\r\n onNavigate={() => openSidebar && setOpenSidebar(false)}\r\n className={cn(\r\n 'flex items-center gap-2 text-gray-500 hover:bg-gray-100 py-2 px-2.5 rounded-lg',\r\n pathname === link.href && 'bg-gray-100 text-gray-800'\r\n )}\r\n >\r\n {Icon && <Icon className=\"size-4\" />}\r\n <span>{link.name}</span>\r\n </Link>\r\n </li>\r\n );\r\n })}\r\n </ul>\r\n </div>\r\n ))}\r\n </aside>\r\n </>\r\n );\r\n}\r\n","import * as Icons from 'lucide-react';\r\n\r\nexport function getIcon(name?: string) {\r\n if (!name) return undefined;\r\n\r\n return (Icons as Record<string, any>)[name];\r\n}\r\n","'use client';\r\n\r\nimport { ArrowUpCircleIcon, SquareArrowOutUpRightIcon, TextAlignStartIcon } from 'lucide-react';\r\nimport { usePathname } from 'next/navigation';\r\nimport { useEffect, useRef, useState } from 'react';\r\nimport { cn } from '../../utils/cn';\r\nimport { TOCLinkProps } from '../../types';\r\nimport { useDocstra } from '../../context/docstra-context';\r\n\r\n\r\nexport function DocstraTOC() {\r\n const [activeId, setActiveId] = useState<string | null>(null);\r\n const [scrollDir, setScrollDir] = useState<'up' | 'down'>('down');\r\n const [isScrolled, setIsScrolled] = useState(false);\r\n const [isManualClick, setIsManualClick] = useState(false);\r\n const { docstraConfig, pageData } = useDocstra();\r\n const mdxFilePath = pageData?.path;\r\n // We expect tableOfContents to be present in data now, extracted by loader.\r\n // Fallback to empty array if missing for some reason.\r\n const headings = pageData?.data?.tableOfContents || [];\r\n\r\n const lastScrollY = useRef(0);\r\n const observerRef = useRef<IntersectionObserver | null>(null);\r\n\r\n const pathname = usePathname();\r\n const baseUrlOfGithub = 'https://github.com/' + docstraConfig?.editOnGithub?.owner + '/' + docstraConfig?.editOnGithub?.repo;\r\n const githubLink = `${baseUrlOfGithub}/edit/main/${docstraConfig?.editOnGithub?.path}/${mdxFilePath}`;\r\n\r\n useEffect(() => {\r\n const onScroll = () => {\r\n const currentY = window.scrollY;\r\n setScrollDir(currentY > lastScrollY.current ? 'down' : 'up');\r\n setIsScrolled(currentY > 100);\r\n lastScrollY.current = currentY;\r\n };\r\n\r\n window.addEventListener('scroll', onScroll);\r\n return () => window.removeEventListener('scroll', onScroll);\r\n }, []);\r\n\r\n useEffect(() => {\r\n const allHeadings = document.querySelectorAll<HTMLHeadingElement>(`h2[id], h3[id]`);\r\n\r\n const observer = new IntersectionObserver(\r\n entries => {\r\n if (isManualClick) return;\r\n\r\n const visible = entries\r\n .filter(e => e.isIntersecting)\r\n .sort((a, b) => a.boundingClientRect.top - b.boundingClientRect.top);\r\n\r\n if (visible.length > 0) {\r\n const nextActive =\r\n scrollDir === 'down' ? visible[0].target.id : visible[visible.length - 1].target.id;\r\n\r\n setActiveId(nextActive);\r\n }\r\n },\r\n {\r\n rootMargin: '-40% 0px -50% 0px',\r\n threshold: [0, 0.2, 0.6, 1.0]\r\n }\r\n );\r\n\r\n allHeadings.forEach(heading => observer.observe(heading));\r\n observerRef.current = observer;\r\n\r\n return () => observer.disconnect();\r\n }, [pathname, scrollDir, isManualClick]);\r\n\r\n useEffect(() => {\r\n const scrolled = window.scrollY > 100;\r\n !scrolled && setActiveId(headings[0]?.id);\r\n }, [headings]);\r\n\r\n useEffect(() => {\r\n if (!activeId) return;\r\n\r\n const container = document.querySelector('.toc-scroll-container');\r\n if (!container) return;\r\n\r\n const activeLink = container.querySelector(`a[href=\"#${activeId}\"]`);\r\n if (!activeLink) return;\r\n\r\n const containerRect = container.getBoundingClientRect();\r\n const linkRect = activeLink.getBoundingClientRect();\r\n\r\n const isOutOfView =\r\n linkRect.top < containerRect.top || linkRect.bottom > containerRect.bottom;\r\n\r\n if (isOutOfView) {\r\n activeLink.scrollIntoView({\r\n behavior: 'smooth',\r\n block: 'nearest',\r\n });\r\n }\r\n }, [activeId]);\r\n\r\n\r\n useEffect(() => {\r\n if (!isManualClick) return;\r\n const timer = setTimeout(() => setIsManualClick(false), 800);\r\n return () => clearTimeout(timer);\r\n }, [isManualClick]);\r\n\r\n const handleClick = (id: string) => {\r\n setActiveId(id);\r\n setIsManualClick(true);\r\n };\r\n\r\n return (\r\n <aside className=\"sticky top-18 text-sm hidden xl:block text-gray-500 shrink-0 h-[calc(100svh-72px)] w-64 border-l border-gray-200 p-6 overflow-y-auto\">\r\n <p className=\"flex items-center gap-2 mb-5\">\r\n <TextAlignStartIcon className=\"size-4\" />\r\n On this page\r\n </p>\r\n\r\n {/* Links Container */}\r\n <ul className='toc-scroll-container max-h-3/4 overflow-y-auto scrollbar-none'>\r\n {headings.map(h2 => (\r\n <li key={h2.id}>\r\n <TableOfContentsLink heading={h2} activeId={activeId} handleClick={handleClick} />\r\n\r\n {h2.children.map(h3 => (\r\n <TableOfContentsLink\r\n key={h3.id}\r\n heading={h3}\r\n activeId={activeId}\r\n handleClick={handleClick}\r\n className=\"pl-8\"\r\n />\r\n ))}\r\n </li>\r\n ))}\r\n </ul>\r\n\r\n <hr className=\"my-6 border-gray-200\" />\r\n\r\n {docstraConfig.editOnGithub && (\r\n <a\r\n href={githubLink}\r\n rel=\"noopener noreferrer\"\r\n className=\"flex items-center gap-2 text-gray-400 hover:text-gray-700 transition\"\r\n >\r\n Edit this page on GitHub\r\n <SquareArrowOutUpRightIcon className=\"size-4\" />\r\n </a>\r\n )}\r\n\r\n {isScrolled && (\r\n <button\r\n onClick={() => scrollTo({ top: 0, behavior: 'smooth' })}\r\n className=\"flex items-center cursor-pointer gap-2 mt-3 text-gray-400 hover:text-gray-700 transition\"\r\n >\r\n Scroll to top\r\n <ArrowUpCircleIcon className=\"size-4\" />\r\n </button>\r\n )}\r\n </aside>\r\n );\r\n}\r\n\r\nfunction TableOfContentsLink({ heading, activeId, handleClick, className }: TOCLinkProps) {\r\n return (\r\n <a\r\n href={`#${heading.id}`}\r\n className={cn('border-l border-gray-200 block py-1.5 pl-4 transition-colors', className, {\r\n 'border-gray-800 text-gray-900 font-medium': activeId === heading.id,\r\n 'hover:text-gray-800 hover:border-gray-400': activeId !== heading.id\r\n })}\r\n onClick={() => handleClick(heading.id)}\r\n >\r\n {heading.text}\r\n </a>\r\n );\r\n}\r\n","import { DocstraSidebar } from './sidebar';\r\nimport { DocstraTOC } from './docstra-toc';\r\n\r\ninterface DocstraPageProps {\r\n children: React.ReactNode;\r\n toc?: boolean;\r\n sidebar?: boolean;\r\n}\r\n\r\nexport function DocstraPage({ children, toc = true, sidebar = true }: DocstraPageProps) {\r\n return (\r\n <div className=\"min-h-screen flex bg-white w-full\">\r\n {sidebar && <DocstraSidebar />}\r\n {children}\r\n {toc && <DocstraTOC />}\r\n </div>\r\n );\r\n}\r\n","'use client';\r\n\r\nimport { usePathname } from 'next/navigation';\r\nimport { ChevronRight } from 'lucide-react';\r\nimport Link from 'next/link';\r\n\r\nexport function DocstraBreadcrumbs() {\r\n const pathname = usePathname();\r\n const paths = pathname.split('/').filter(Boolean);\r\n\r\n const breadcrumbs = paths.map((segment, index) => {\r\n const href = '/' + paths.slice(0, index + 1).join('/');\r\n const title = segment.replace(/-/g, ' ').replace(/\\b\\w/g, c => c.toUpperCase());\r\n return { href, title };\r\n });\r\n\r\n return (\r\n <nav aria-label=\"Breadcrumb\" className=\"flex text-sm items-center pb-4 text-gray-500\">\r\n <ol className=\"flex items-center space-x-2\">\r\n <li>\r\n <Link href=\"/\" className=\"hover:text-gray-700 transition-colors font-medium\">\r\n Home\r\n </Link>\r\n </li>\r\n\r\n {breadcrumbs.map((crumb, index) => {\r\n const isLast = index === breadcrumbs.length - 1;\r\n return (\r\n <li key={crumb.href} className=\"flex items-center space-x-2\">\r\n <ChevronRight className=\"w-4 h-4 text-gray-400\" />\r\n {isLast ? (\r\n <span className=\"text-gray-600 font-medium\">{crumb.title}</span>\r\n ) : (\r\n <Link href={crumb.href} className=\"hover:text-gray-700 font-medium transition-colors\">\r\n {crumb.title}\r\n </Link>\r\n )}\r\n </li>\r\n );\r\n })}\r\n </ol>\r\n </nav>\r\n );\r\n}\r\n","'use client';\r\n\r\nimport { CheckIcon, CopyIcon } from 'lucide-react';\r\nimport { useEffect, useState } from 'react';\r\nimport { useDocstra } from '../../context/docstra-context';\r\n\r\nexport function DocstraPageButtons() {\r\n const { pageData } = useDocstra();\r\n const [isCopied, setIsCopied] = useState(false);\r\n const [href, setHref] = useState<string | null>(null);\r\n\r\n useEffect(() => {\r\n setHref(window.location.href);\r\n }, []);\r\n\r\n const prompt = `Read from this URL: ${href} and explain it to me.`;\r\n\r\n const handleCopy = () => {\r\n navigator.clipboard.writeText(pageData?.data.raw || '');\r\n setIsCopied(true);\r\n setTimeout(() => setIsCopied(false), 3000);\r\n };\r\n\r\n return (\r\n <div className=\"flex items-center gap-3 mt-6\">\r\n <button\r\n title=\"Copy Markdown\"\r\n onClick={handleCopy}\r\n className=\"flex items-center cursor-pointer gap-2 bg-gray-50 hover:bg-gray-100 border border-gray-200 px-3 py-2 rounded-md text-xs\"\r\n >\r\n {isCopied ? <CheckIcon className=\"size-3.5\" /> : <CopyIcon className=\"size-3.5\" />}\r\n Copy Markdown\r\n </button>\r\n <a\r\n title=\"Ask ChatGPT\"\r\n href={`https://chatgpt.com/?hints=search&q=${encodeURIComponent(prompt)}`}\r\n className=\"flex items-center gap-2 bg-gray-50 hover:bg-gray-100 border border-gray-200 px-3 py-2 rounded-md text-xs\"\r\n rel=\"noreferrer noopener\"\r\n >\r\n Ask ChatGPT\r\n </a>\r\n </div>\r\n );\r\n}\r\n","import { useDocstra } from '../../context/docstra-context';\r\nimport { DocstraPageButtons } from './page-buttons';\r\n\r\nexport function DocstraPageHead() {\r\n const { pageData } = useDocstra();\r\n const title = pageData?.data?.metadata?.title;\r\n const description = pageData?.data?.metadata?.description;\r\n return (\r\n <>\r\n <h1 className=\"text-3xl font-bold\">{title}</h1>\r\n <p className=\"my-4 text-gray-500\">{description}</p>\r\n <DocstraPageButtons />\r\n <hr className=\"my-10 border-gray-200\" />\r\n </>\r\n );\r\n}\r\n","'use client';\r\n\r\nimport { useState } from 'react';\r\nimport { ThumbsUp, ThumbsDown } from 'lucide-react';\r\nimport Input from './input';\r\nimport Button from './button';\r\nimport { useDocstra } from '../../context/docstra-context';\r\n\r\ntype Opinion = 'good' | 'bad' | null;\r\n\r\nexport function DocstraFeedback() {\r\n const [opinion, setOpinion] = useState<Opinion>(null);\r\n const { docstraConfig } = useDocstra();\r\n const [message, setMessage] = useState<string>('');\r\n const [submitted, setSubmitted] = useState<boolean>(false);\r\n const baseUrlOfGithub = 'https://github.com/' + docstraConfig?.editOnGithub?.owner + '/' + docstraConfig?.editOnGithub?.repo;\r\n\r\n return (\r\n <div className=\"border-y border-gray-200 mt-20 py-10 space-y-4\">\r\n {submitted ? (\r\n <>\r\n <p className=\"font-medium text-gray-900\">Thank you for your feedback!</p>\r\n <Button\r\n onClick={() => {\r\n setSubmitted(false);\r\n setOpinion(null);\r\n setMessage('');\r\n }}\r\n label=\"Submit Again\"\r\n className=\"w-max text-sm\"\r\n />\r\n </>\r\n ) : (\r\n <>\r\n <p className=\"font-medium\">How is this guide?</p>\r\n <div className=\"flex gap-2\">\r\n <button\r\n onClick={() => setOpinion('good')}\r\n className={`flex items-center cursor-pointer gap-1 px-3 py-2 rounded-full border text-sm ${opinion === 'good'\r\n ? 'bg-green-100 text-green-600 border-green-300'\r\n : 'border-gray-200 text-gray-600 hover:bg-gray-100'\r\n }`}\r\n >\r\n <ThumbsUp className={`size-4 ${opinion === 'good' ? 'fill-green-600' : 'text-gray-500'}`} />\r\n Good\r\n </button>\r\n <button\r\n onClick={() => setOpinion('bad')}\r\n className={`flex items-center cursor-pointer gap-1 px-3 py-2 rounded-full border text-sm ${opinion === 'bad'\r\n ? 'bg-red-100 text-red-600 border-red-300'\r\n : 'border-gray-200 text-gray-600 hover:bg-gray-100'\r\n }`}\r\n >\r\n <ThumbsDown\r\n className={`size-4 pt-0.5 ${opinion === 'bad' ? 'fill-red-600' : 'text-gray-500'}`}\r\n />\r\n Bad\r\n </button>\r\n </div>\r\n {opinion && (\r\n <form\r\n className=\"flex flex-col gap-2\"\r\n action={`https://api.formsync.app/v1/s/${docstraConfig?.feedback?.formSyncFormID || ''}`}\r\n method=\"POST\"\r\n >\r\n <Input\r\n value={message}\r\n id=\"message\"\r\n onChange={e => setMessage(e.target.value)}\r\n placeholder=\"Leave your feedback...\"\r\n required\r\n type=\"textarea\"\r\n />\r\n <input type=\"hidden\" name=\"opinion\" value={opinion} />\r\n <input type=\"hidden\" name=\"page\" value={window.location.href} />\r\n <input type=\"hidden\" name=\"_redirect\" value={window.location.href} />\r\n <Button label=\"Submit\" className=\"w-max text-sm\" />\r\n {docstraConfig?.feedback?.watermark !== false && (\r\n <p className=\"text-left text-sm text-gray-500 mt-6\">\r\n Powered by{' '}\r\n <a\r\n href={`https://www.formsync.app?utm_source=${baseUrlOfGithub}`}\r\n className=\"text-gray-800\"\r\n >\r\n FormSync\r\n </a>\r\n </p>\r\n )}\r\n </form>\r\n )}\r\n </>\r\n )}\r\n </div>\r\n );\r\n}\r\n","import { cn } from '../../utils/cn';\r\n\r\ninterface Props {\r\n label?: string;\r\n type?: 'text' | 'textarea';\r\n placeholder?: string;\r\n id: string;\r\n required?: boolean;\r\n onChange?: (e: any) => void;\r\n value?: string;\r\n readOnly?: boolean;\r\n className?: string;\r\n optional?: boolean;\r\n}\r\n\r\nexport default function Input({\r\n label,\r\n type,\r\n placeholder = '',\r\n id,\r\n required = false,\r\n onChange,\r\n value,\r\n readOnly = false,\r\n className = '',\r\n optional = false\r\n}: Props) {\r\n return (\r\n <div className={cn('flex flex-col mt-4 w-full', className)}>\r\n {label && (\r\n <label htmlFor={id} className=\"font-medium w-max cursor-pointer\">\r\n {label}\r\n {optional && <span className=\"text-xs font-normal text-gray-400 ml-1 mt-1\">(Optional)</span>}\r\n </label>\r\n )}\r\n {type === 'textarea' ? (\r\n <textarea\r\n id={id}\r\n name={id}\r\n className={cn(\r\n 'mt-2 w-full p-3 border border-gray-300 resize-none not-focus:hover:border-gray-500 read-only:text-gray-400/80 outline-none focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2 transition-all duration-200 rounded-lg',\r\n className\r\n )}\r\n placeholder={placeholder}\r\n required={required}\r\n onChange={onChange}\r\n rows={4}\r\n value={value}\r\n readOnly={readOnly}\r\n />\r\n ) : (\r\n <input\r\n type={type}\r\n id={id}\r\n name={id}\r\n className=\"mt-2 w-full h-12 px-3 border border-gray-300 not-focus:hover:border-gray-500 read-only:text-gray-400/80 outline-none focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2 transition-all duration-200 rounded-lg\"\r\n placeholder={placeholder}\r\n required={required}\r\n onChange={onChange}\r\n value={value}\r\n readOnly={readOnly}\r\n />\r\n )}\r\n </div>\r\n );\r\n}\r\n","import { Loader2Icon } from 'lucide-react';\r\nimport { cn } from '../../utils/cn';\r\n\r\ninterface Props {\r\n label: string;\r\n loading?: boolean;\r\n type?: 'submit' | 'button';\r\n className?: string;\r\n disabled?: boolean;\r\n onClick?: () => void;\r\n}\r\n\r\nexport default function Button({ label, loading, type = 'submit', className = '', disabled = false, onClick }: Props) {\r\n return (\r\n <button\r\n type={type}\r\n disabled={disabled}\r\n className={cn(\r\n 'relative w-full mt-4 h-12 px-6 py-3 cursor-pointer font-medium bg-gray-900 hover:opacity-85 text-white rounded-lg',\r\n className\r\n )}\r\n aria-label={label}\r\n onClick={onClick}\r\n >\r\n {loading ? (\r\n <Loader2Icon className=\"absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 animate-spin mx-auto\" />\r\n ) : (\r\n label\r\n )}\r\n </button>\r\n );\r\n}\r\n","'use client';\r\n\r\nimport { usePathname } from 'next/navigation';\r\nimport Link from 'next/link';\r\nimport { ArrowLeftIcon, ArrowRightIcon } from 'lucide-react';\r\nimport { useDocstra } from '../../context/docstra-context';\r\nimport { DocsLinkGroup, DocsLinkItem } from '../../types';\r\n\r\nexport function DocstraPagination() {\r\n const pathname = usePathname();\r\n const { docstraConfig } = useDocstra();\r\n\r\n const flatLinks: any = docstraConfig?.sidebar?.links?.flatMap((section: DocsLinkGroup) => section.items);\r\n\r\n const currentIndex = flatLinks.findIndex((item: DocsLinkItem) => item.href === pathname);\r\n\r\n const prev = currentIndex > 0 ? flatLinks[currentIndex - 1] : null;\r\n const next = currentIndex < flatLinks.length - 1 ? flatLinks[currentIndex + 1] : null;\r\n\r\n return (\r\n <div className=\"flex flex-col lg:flex-row gap-2 justify-between py-10 mt-10\">\r\n {prev ? (\r\n <Link\r\n href={prev.href}\r\n className=\"flex flex-col items-start gap-2 border border-gray-200 hover:bg-gray-50 py-3 md:min-w-62 pl-4 pr-10 rounded-lg text-sm\"\r\n >\r\n <span className=\"text-gray-500\">Previous</span>\r\n <p className=\"flex items-center font-medium\">\r\n <ArrowLeftIcon className=\"size-5 mr-2\" />\r\n {prev.name}\r\n </p>\r\n </Link>\r\n ) : (\r\n <div />\r\n )}\r\n\r\n {next ? (\r\n <Link\r\n href={next.href}\r\n className=\"flex flex-col items-end gap-2 border border-gray-200 hover:bg-gray-50 py-3 pr-4 md:min-w-62 pl-10 rounded-lg text-sm\"\r\n >\r\n <span className=\"text-gray-500\">Next</span>\r\n <p className=\"flex items-center font-medium\">\r\n {next.name}\r\n <ArrowRightIcon className=\"size-5 ml-2\" />\r\n </p>\r\n </Link>\r\n ) : (\r\n <div />\r\n )}\r\n </div>\r\n );\r\n}\r\n","import { useDocstra } from '../../context/docstra-context';\r\nimport { DocstraBreadcrumbs } from './breadcrumbs';\r\nimport { DocstraPageHead } from './docstra-page-head';\r\nimport { DocstraFeedback } from './feedback';\r\nimport { DocstraPagination } from './pagination';\r\n\r\ninterface Props {\r\n children: React.ReactNode;\r\n}\r\n\r\nexport function DocstraBody({ children }: Props) {\r\n const { docstraConfig } = useDocstra();\r\n return (\r\n <main className=\"flex-1 px-4 md:px-8 py-10 max-w-full text-base/7\">\r\n <DocstraBreadcrumbs />\r\n <DocstraPageHead />\r\n {children}\r\n {docstraConfig?.feedback?.enabled && <DocstraFeedback />}\r\n <DocstraPagination />\r\n </main>\r\n );\r\n}\r\n","import { CheckIcon, CopyIcon } from 'lucide-react';\r\nimport { Highlight, themes } from 'prism-react-renderer';\r\nimport { useState } from 'react';\r\n\r\nexport function DocstraCodeBlock(props: any) {\r\n const { filename, children, className } = props;\r\n\r\n const isInline = !className?.includes(\"language-\");\r\n\r\n const rawText =\r\n typeof children === \"string\"\r\n ? children\r\n : children?.props?.children || \"\";\r\n\r\n if (isInline) {\r\n return (\r\n <code className=\"px-1 py-0.5 rounded border border-gray-200 text-gray-800 text-sm\">\r\n {rawText}\r\n </code>\r\n );\r\n }\r\n\r\n const [isCopied, setIsCopied] = useState(false);\r\n\r\n const match = className?.match(/language-([\\w-]+)/);\r\n const language = match?.[1] ?? \"txt\";\r\n\r\n const handleCopy = () => {\r\n navigator.clipboard.writeText(rawText.trim());\r\n setIsCopied(true);\r\n setTimeout(() => setIsCopied(false), 2000);\r\n };\r\n\r\n return (\r\n <div className=\"max-w-2xl overflow-hidden rounded-lg text-sm text-gray-800 border border-gray-200/80 mt-4\">\r\n <div className=\"flex items-center bg-gray-50 justify-between border-b border-gray-200/80\">\r\n <span className=\"text-xs text-gray-400 p-4\">\r\n {filename || language}\r\n </span>\r\n\r\n <button\r\n onClick={handleCopy}\r\n className=\"rounded cursor-pointer aspect-square p-2 m-2 text-xs hover:bg-gray-200 transition\"\r\n >\r\n {isCopied ? (\r\n <CheckIcon className=\"size-4\" />\r\n ) : (\r\n <CopyIcon className=\"size-4\" />\r\n )}\r\n </button>\r\n </div>\r\n\r\n <Highlight\r\n theme={themes.vsLight}\r\n code={rawText.trim()}\r\n language={language}\r\n >\r\n {({ tokens, getLineProps, getTokenProps }) => (\r\n <pre className=\"p-4 font-mono whitespace-pre overflow-x-auto\">\r\n {tokens.map((line, i) => (\r\n <div key={i} {...getLineProps({ line })}>\r\n <span className=\"text-slate-500 mr-4 select-none\">\r\n {i + 1}\r\n </span>\r\n {line.map((token, key) => (\r\n <span key={key} {...getTokenProps({ token })} />\r\n ))}\r\n </div>\r\n ))}\r\n </pre>\r\n )}\r\n </Highlight>\r\n </div>\r\n );\r\n}"],"mappings":"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","names":["import_react","clsx","Fuse","Link","import_jsx_runtime","import_lucide_react","import_react","import_link","import_jsx_runtime","Link","import_lucide_react","import_navigation","import_link","import_jsx_runtime","Link","import_lucide_react","import_navigation","import_react","import_jsx_runtime","import_jsx_runtime","import_navigation","import_lucide_react","import_link","import_jsx_runtime","Link","import_lucide_react","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_lucide_react","import_jsx_runtime","import_lucide_react","import_jsx_runtime","import_jsx_runtime","import_navigation","import_link","import_lucide_react","import_jsx_runtime","Link","import_jsx_runtime","import_lucide_react","import_react","import_jsx_runtime"]}
|
package/dist/client/index.mjs
CHANGED
|
@@ -619,6 +619,7 @@ function DocstraFeedback() {
|
|
|
619
619
|
const { docstraConfig } = useDocstra();
|
|
620
620
|
const [message, setMessage] = useState5("");
|
|
621
621
|
const [submitted, setSubmitted] = useState5(false);
|
|
622
|
+
const baseUrlOfGithub = "https://github.com/" + docstraConfig?.editOnGithub?.owner + "/" + docstraConfig?.editOnGithub?.repo;
|
|
622
623
|
return /* @__PURE__ */ jsx12("div", { className: "border-y border-gray-200 mt-20 py-10 space-y-4", children: submitted ? /* @__PURE__ */ jsxs11(Fragment4, { children: [
|
|
623
624
|
/* @__PURE__ */ jsx12("p", { className: "font-medium text-gray-900", children: "Thank you for your feedback!" }),
|
|
624
625
|
/* @__PURE__ */ jsx12(
|
|
@@ -668,7 +669,7 @@ function DocstraFeedback() {
|
|
|
668
669
|
"form",
|
|
669
670
|
{
|
|
670
671
|
className: "flex flex-col gap-2",
|
|
671
|
-
action: `https://formsync.app/v1/s/${docstraConfig?.feedback?.formSyncFormID || ""}`,
|
|
672
|
+
action: `https://api.formsync.app/v1/s/${docstraConfig?.feedback?.formSyncFormID || ""}`,
|
|
672
673
|
method: "POST",
|
|
673
674
|
children: [
|
|
674
675
|
/* @__PURE__ */ jsx12(
|
|
@@ -692,7 +693,7 @@ function DocstraFeedback() {
|
|
|
692
693
|
/* @__PURE__ */ jsx12(
|
|
693
694
|
"a",
|
|
694
695
|
{
|
|
695
|
-
href: `https://www.formsync.app?utm_source=${
|
|
696
|
+
href: `https://www.formsync.app?utm_source=${baseUrlOfGithub}`,
|
|
696
697
|
className: "text-gray-800",
|
|
697
698
|
children: "FormSync"
|
|
698
699
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/context/docstra-context.tsx","../../src/client/components/search-box.tsx","../../src/utils/cn.ts","../../src/client/components/header.tsx","../../src/client/components/sidebar.tsx","../../src/utils/get-icon.ts","../../src/client/components/docstra-toc.tsx","../../src/client/components/docs-page.tsx","../../src/client/components/breadcrumbs.tsx","../../src/client/components/page-buttons.tsx","../../src/client/components/docstra-page-head.tsx","../../src/client/components/feedback.tsx","../../src/client/components/input.tsx","../../src/client/components/button.tsx","../../src/client/components/pagination.tsx","../../src/client/components/docs-body.tsx","../../src/client/components/code-block.tsx"],"sourcesContent":["'use client';\r\nimport React, { createContext, useContext, useState } from 'react';\r\nimport { DocstraConfig, DocstraContextType, pageDataContent } from '../types';\r\nimport { ToastContainer } from 'react-toast-msg';\r\nimport { DocstraSearchBox } from '../client/components/search-box';\r\n\r\nconst DocstraContext = createContext<DocstraContextType | null>(null);\r\n\r\nexport function DocstraProvider({\r\n children,\r\n docstraConfig,\r\n docs,\r\n pageData: initialPageData,\r\n slug\r\n}: {\r\n children: React.ReactNode;\r\n docstraConfig: DocstraConfig;\r\n docs: pageDataContent[];\r\n pageData?: pageDataContent;\r\n slug?: string | string[];\r\n}) {\r\n const pageData = initialPageData || (() => {\r\n const normalizedSlug = Array.isArray(slug)\r\n ? (slug.length === 0 ? 'index' : slug.join('/'))\r\n : (slug || 'index');\r\n return docs.find(d => d.slug === normalizedSlug);\r\n })();\r\n\r\n if (!pageData) {\r\n // Fallback or error? For now, if no pageData and no resolution, context might be partial or throw.\r\n // But effectively this enables: <Provider docs={...} slug={...}>\r\n }\r\n const [openSidebar, setOpenSidebar] = useState(false);\r\n const [openSearchBox, setOpenSearchBox] = useState(false);\r\n\r\n return (\r\n <DocstraContext.Provider\r\n value={{\r\n openSidebar,\r\n setOpenSidebar,\r\n docstraConfig,\r\n openSearchBox,\r\n setOpenSearchBox,\r\n pageData: pageData!,\r\n docs\r\n }}\r\n >\r\n <ToastContainer />\r\n <DocstraSearchBox />\r\n {children}\r\n </DocstraContext.Provider>\r\n );\r\n}\r\n\r\nexport function useDocstra() {\r\n const ctx = useContext(DocstraContext);\r\n if (!ctx) throw new Error('Please wrap your app with DocstraProvider');\r\n return ctx;\r\n}\r\n","'use client';\r\n\r\nimport { SearchIcon } from 'lucide-react';\r\nimport { useDocstra } from '../../context/docstra-context';\r\nimport { cn } from '../../utils/cn';\r\nimport { useEffect, useMemo, useState } from 'react';\r\nimport Fuse from 'fuse.js';\r\nimport Link from 'next/link';\r\nimport { useRouter } from 'next/navigation';\r\n\r\nexport function DocstraSearchBox() {\r\n const { openSearchBox, setOpenSearchBox, docs } = useDocstra();\r\n const [searchQuery, setSearchQuery] = useState('');\r\n const [searchResults, setSearchResults] = useState<any[]>([]);\r\n const router = useRouter();\r\n\r\n useEffect(() => {\r\n const handleKeyDown = (event: KeyboardEvent) => {\r\n if (event.ctrlKey && event.key === 'k') {\r\n event.preventDefault();\r\n setOpenSearchBox(true);\r\n }\r\n };\r\n\r\n window.addEventListener('keydown', handleKeyDown);\r\n\r\n return () => {\r\n window.removeEventListener('keydown', handleKeyDown);\r\n };\r\n }, []);\r\n\r\n const fuse = useMemo(() => {\r\n if (!docs || docs.length === 0) return null;\r\n return new Fuse(docs, {\r\n keys: [\"data.metadata.title\", \"data.metadata.description\"],\r\n threshold: 0.3,\r\n });\r\n }, [docs]);\r\n\r\n useEffect(() => {\r\n if (searchQuery && fuse) {\r\n const results = fuse.search(searchQuery);\r\n setSearchResults(results.map(r => r.item));\r\n } else if (!searchQuery) {\r\n setSearchResults([]);\r\n }\r\n }, [searchQuery, fuse]);\r\n\r\n const onSearchHandler = (e: React.FormEvent<HTMLFormElement>) => {\r\n e.preventDefault();\r\n if (searchQuery) {\r\n const component = searchResults[0];\r\n if (component) {\r\n router.push(`/docs/${component.slug}`);\r\n setSearchQuery(\"\");\r\n setOpenSearchBox(false);\r\n }\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n const handleEscape = (e: KeyboardEvent) => {\r\n if (e.key === \"Escape\") {\r\n setOpenSearchBox(false);\r\n setSearchQuery(\"\");\r\n }\r\n };\r\n\r\n if (openSearchBox) {\r\n window.addEventListener(\"keydown\", handleEscape);\r\n }\r\n\r\n return () => {\r\n window.removeEventListener(\"keydown\", handleEscape);\r\n };\r\n }, [openSearchBox]);\r\n\r\n return (\r\n <div\r\n onClick={() => {\r\n setOpenSearchBox(false);\r\n setSearchQuery('');\r\n }}\r\n className={cn(\r\n 'fixed inset-0 z-25 flex items-start justify-center bg-white/40 backdrop-blur-md opacity-0 pointer-events-none transition-all duration-300',\r\n openSearchBox && 'opacity-100 pointer-events-auto'\r\n )}\r\n >\r\n <div\r\n onClick={e => e.stopPropagation()}\r\n className=\"flex flex-col items-center mt-30 max-w-lg w-full max-md:px-4\"\r\n >\r\n <form\r\n onSubmit={onSearchHandler}\r\n className={cn(\r\n 'relative flex items-center justify-between w-full bg-white border border-slate-200 text-gray-400 h-15 p-0.5 rounded-md',\r\n searchQuery && \"rounded-b-none border-b-0\"\r\n )}\r\n >\r\n {openSearchBox && (\r\n <>\r\n <SearchIcon className=\"size-5.5 mx-3 shrink-0\" />\r\n <input className=\"w-full bg-transparent h-full outline-none text-gray-400 placeholder:text-gray-400\" type=\"text\" placeholder=\"Search docs...\" spellCheck=\"false\" autoFocus={true} value={searchQuery} onChange={e => setSearchQuery(e.target.value)} name=\"searchQuery\" required />\r\n <span className=\"border border-gray-200 px-2 mr-3 py-1 rounded text-xs\">\r\n Esc\r\n </span>\r\n </>\r\n )}\r\n </form>\r\n <div\r\n className={cn(\r\n \"max-h-70 overflow-x-hidden overflow-y-auto scrollbar-y w-full bg-white text-slate-700 flex flex-col\",\r\n searchQuery && \"rounded-b-md border border-slate-200\"\r\n )}\r\n >\r\n {searchResults.map((item) => (\r\n <Link\r\n href={`/docs/${item.slug === 'index' ? '' : item.slug}`}\r\n key={item.slug}\r\n onClick={() => {\r\n setOpenSearchBox(false);\r\n setSearchQuery(\"\");\r\n }}\r\n className=\"w-full hover:bg-gray-100/70 border-b border-slate-200 transition-all py-4 px-4 last:mb-2\"\r\n >\r\n <h4 className=\"font-medium\">{item.data?.metadata?.title || item.slug}</h4>\r\n <p className=\"text-sm mt-1 text-gray-500\">{item.data?.metadata?.description}</p>\r\n </Link>\r\n ))}\r\n\r\n {searchQuery && searchResults.length === 0 && (\r\n <div className=\"text-gray-500 text-center py-20\">No results found</div>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import { twMerge } from 'tailwind-merge';\r\nimport clsx, { ClassValue } from 'clsx';\r\n\r\nexport function cn(...inputs: ClassValue[]) {\r\n return twMerge(clsx(inputs));\r\n}\r\n","'use client';\r\n\r\nimport { TextAlignEnd, XIcon } from 'lucide-react';\r\nimport { useEffect } from 'react';\r\nimport { useDocstra } from '../../context/docstra-context';\r\nimport { cn } from '../../utils/cn';\r\nimport Link from 'next/link';\r\n\r\nexport function DocstraHeader() {\r\n const { openSidebar, setOpenSidebar, docstraConfig } = useDocstra();\r\n\r\n const githubRepo = 'https://github.com/' + docstraConfig?.editOnGithub?.owner + '/' + docstraConfig?.editOnGithub?.repo;\r\n\r\n useEffect(() => {\r\n if (openSidebar) {\r\n document.body.classList.add('max-md:overflow-hidden');\r\n } else {\r\n document.body.classList.remove('max-md:overflow-hidden');\r\n }\r\n }, [openSidebar]);\r\n return (\r\n <header className=\"sticky top-0 z-10 text-sm flex items-center justify-between border-b border-gray-100 h-18 px-4 md:px-6 bg-white\">\r\n <Link href={docstraConfig.navbar?.logo?.link || '/'} className='hover:opacity-80 transition'>\r\n <img\r\n src={docstraConfig.navbar?.logo?.src || '/logo.png'}\r\n alt={docstraConfig.navbar?.logo?.alt || 'Logo'}\r\n className={cn('h-9.5 w-auto', docstraConfig.navbar?.logo?.className)}\r\n />\r\n </Link>\r\n <div className=\"hidden divide-x divide-gray-200 md:flex items-center\">\r\n {docstraConfig.navbar?.links?.map(link => (\r\n <Link key={link.name} href={link.href} className=\"px-6 hover:text-gray-600\">\r\n {link.name}\r\n </Link>\r\n ))}\r\n <Link href={githubRepo || 'https://github.com/sudhucodes/docstra'}>\r\n <svg className=\"size-6 mx-6\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n <path d=\"M12 .3a12 12 0 0 0-3.8 23.38c.6.12.83-.26.83-.57L9 21.07c-3.34.72-4.04-1.61-4.04-1.61-.55-1.39-1.34-1.76-1.34-1.76-1.08-.74.09-.73.09-.73 1.2.09 1.83 1.24 1.83 1.24 1.08 1.83 2.81 1.3 3.5 1 .1-.78.42-1.31.76-1.61-2.67-.3-5.47-1.33-5.47-5.93 0-1.31.47-2.38 1.24-3.22-.14-.3-.54-1.52.1-3.18 0 0 1-.32 3.3 1.23a11.5 11.5 0 0 1 6 0c2.28-1.55 3.29-1.23 3.29-1.23.64 1.66.24 2.88.12 3.18a4.65 4.65 0 0 1 1.23 3.22c0 4.61-2.8 5.63-5.48 5.92.42.36.81 1.1.81 2.22l-.01 3.29c0 .31.2.69.82.57A12 12 0 0 0 12 .3\" />\r\n </svg>\r\n </Link>\r\n </div>\r\n <button\r\n onClick={() => setOpenSidebar(!openSidebar)}\r\n className=\"md:hidden transition text-gray-600 active:ring-2 ring-gray-200 p-1.5 rounded-md\"\r\n >\r\n {openSidebar ? <XIcon className=\"size-6.5\" /> : <TextAlignEnd className=\"size-6.5\" />}\r\n </button>\r\n </header>\r\n );\r\n}\r\n","'use client';\r\n\r\nimport { SearchIcon } from 'lucide-react';\r\nimport { usePathname } from 'next/navigation';\r\nimport { cn } from '../../utils/cn';\r\nimport { useDocstra } from '../../context/docstra-context';\r\nimport { getIcon } from '../../utils/get-icon';\r\nimport { toast } from 'react-toast-msg';\r\nimport Link from 'next/link';\r\n\r\nexport function DocstraSidebar() {\r\n const { openSidebar, setOpenSidebar, docstraConfig, setOpenSearchBox } = useDocstra();\r\n const pathname = usePathname();\r\n\r\n return (\r\n <>\r\n <div\r\n className={cn(\r\n 'fixed inset-0 z-20 bg-black/50 opacity-0 pointer-events-none transition-all duration-300',\r\n openSidebar && 'opacity-100 pointer-events-auto'\r\n )}\r\n onClick={() => setOpenSidebar(false)}\r\n />\r\n <aside\r\n className={cn(\r\n 'sticky md:top-18 h-[calc(100svh-72px)] scrollbar-y w-screen max-md:rounded-t-lg z-21 md:w-72 pb-10 text-base md:text-sm shrink-0 border-r border-gray-200 p-4 max-md:fixed bg-white overflow-y-auto transition-all duration-300',\r\n openSidebar ? 'top-32' : 'top-full'\r\n )}\r\n >\r\n <div\r\n className=\"flex items-center select-none gap-2 cursor-pointer mt-6 mb-4 p-2.5 text-gray-500 border border-gray-200 rounded-lg hover:bg-gray-50\"\r\n onClick={() => {\r\n setOpenSidebar(openSidebar && false);\r\n setOpenSearchBox(true)\r\n }}\r\n >\r\n <SearchIcon className=\"size-4.5\" />\r\n <p>Search</p>\r\n <div className=\"ms-auto font-mono inline-flex gap-0.5\">\r\n <span className=\"rounded-md border border-gray-200 px-1.5\">Ctrl</span>\r\n <span className=\"rounded-md border border-gray-200 px-1.5\">K</span>\r\n </div>\r\n </div>\r\n\r\n {docstraConfig.sidebar?.links?.map(group => (\r\n <div key={group.section}>\r\n <p className=\"inline-flex items-center gap-2 mb-2 mt-2 px-2\">{group.section}</p>\r\n\r\n <ul className=\"mb-4\">\r\n {group.items.map(link => {\r\n const Icon = getIcon(link.icon);\r\n\r\n return (\r\n <li key={link.href}>\r\n <Link\r\n href={link.href}\r\n onNavigate={() => openSidebar && setOpenSidebar(false)}\r\n className={cn(\r\n 'flex items-center gap-2 text-gray-500 hover:bg-gray-100 py-2 px-2.5 rounded-lg',\r\n pathname === link.href && 'bg-gray-100 text-gray-800'\r\n )}\r\n >\r\n {Icon && <Icon className=\"size-4\" />}\r\n <span>{link.name}</span>\r\n </Link>\r\n </li>\r\n );\r\n })}\r\n </ul>\r\n </div>\r\n ))}\r\n </aside>\r\n </>\r\n );\r\n}\r\n","import * as Icons from 'lucide-react';\r\n\r\nexport function getIcon(name?: string) {\r\n if (!name) return undefined;\r\n\r\n return (Icons as Record<string, any>)[name];\r\n}\r\n","'use client';\r\n\r\nimport { ArrowUpCircleIcon, SquareArrowOutUpRightIcon, TextAlignStartIcon } from 'lucide-react';\r\nimport { usePathname } from 'next/navigation';\r\nimport { useEffect, useRef, useState } from 'react';\r\nimport { cn } from '../../utils/cn';\r\nimport { TOCLinkProps } from '../../types';\r\nimport { useDocstra } from '../../context/docstra-context';\r\n\r\n\r\nexport function DocstraTOC() {\r\n const [activeId, setActiveId] = useState<string | null>(null);\r\n const [scrollDir, setScrollDir] = useState<'up' | 'down'>('down');\r\n const [isScrolled, setIsScrolled] = useState(false);\r\n const [isManualClick, setIsManualClick] = useState(false);\r\n const { docstraConfig, pageData } = useDocstra();\r\n const mdxFilePath = pageData?.path;\r\n // We expect tableOfContents to be present in data now, extracted by loader.\r\n // Fallback to empty array if missing for some reason.\r\n const headings = pageData?.data?.tableOfContents || [];\r\n\r\n const lastScrollY = useRef(0);\r\n const observerRef = useRef<IntersectionObserver | null>(null);\r\n\r\n const pathname = usePathname();\r\n const baseUrlOfGithub = 'https://github.com/' + docstraConfig?.editOnGithub?.owner + '/' + docstraConfig?.editOnGithub?.repo;\r\n const githubLink = `${baseUrlOfGithub}/edit/main/${docstraConfig?.editOnGithub?.path}/${mdxFilePath}`;\r\n\r\n useEffect(() => {\r\n const onScroll = () => {\r\n const currentY = window.scrollY;\r\n setScrollDir(currentY > lastScrollY.current ? 'down' : 'up');\r\n setIsScrolled(currentY > 100);\r\n lastScrollY.current = currentY;\r\n };\r\n\r\n window.addEventListener('scroll', onScroll);\r\n return () => window.removeEventListener('scroll', onScroll);\r\n }, []);\r\n\r\n useEffect(() => {\r\n const allHeadings = document.querySelectorAll<HTMLHeadingElement>(`h2[id], h3[id]`);\r\n\r\n const observer = new IntersectionObserver(\r\n entries => {\r\n if (isManualClick) return;\r\n\r\n const visible = entries\r\n .filter(e => e.isIntersecting)\r\n .sort((a, b) => a.boundingClientRect.top - b.boundingClientRect.top);\r\n\r\n if (visible.length > 0) {\r\n const nextActive =\r\n scrollDir === 'down' ? visible[0].target.id : visible[visible.length - 1].target.id;\r\n\r\n setActiveId(nextActive);\r\n }\r\n },\r\n {\r\n rootMargin: '-40% 0px -50% 0px',\r\n threshold: [0, 0.2, 0.6, 1.0]\r\n }\r\n );\r\n\r\n allHeadings.forEach(heading => observer.observe(heading));\r\n observerRef.current = observer;\r\n\r\n return () => observer.disconnect();\r\n }, [pathname, scrollDir, isManualClick]);\r\n\r\n useEffect(() => {\r\n const scrolled = window.scrollY > 100;\r\n !scrolled && setActiveId(headings[0]?.id);\r\n }, [headings]);\r\n\r\n useEffect(() => {\r\n if (!activeId) return;\r\n\r\n const container = document.querySelector('.toc-scroll-container');\r\n if (!container) return;\r\n\r\n const activeLink = container.querySelector(`a[href=\"#${activeId}\"]`);\r\n if (!activeLink) return;\r\n\r\n const containerRect = container.getBoundingClientRect();\r\n const linkRect = activeLink.getBoundingClientRect();\r\n\r\n const isOutOfView =\r\n linkRect.top < containerRect.top || linkRect.bottom > containerRect.bottom;\r\n\r\n if (isOutOfView) {\r\n activeLink.scrollIntoView({\r\n behavior: 'smooth',\r\n block: 'nearest',\r\n });\r\n }\r\n }, [activeId]);\r\n\r\n\r\n useEffect(() => {\r\n if (!isManualClick) return;\r\n const timer = setTimeout(() => setIsManualClick(false), 800);\r\n return () => clearTimeout(timer);\r\n }, [isManualClick]);\r\n\r\n const handleClick = (id: string) => {\r\n setActiveId(id);\r\n setIsManualClick(true);\r\n };\r\n\r\n return (\r\n <aside className=\"sticky top-18 text-sm hidden xl:block text-gray-500 shrink-0 h-[calc(100svh-72px)] w-64 border-l border-gray-200 p-6 overflow-y-auto\">\r\n <p className=\"flex items-center gap-2 mb-5\">\r\n <TextAlignStartIcon className=\"size-4\" />\r\n On this page\r\n </p>\r\n\r\n {/* Links Container */}\r\n <ul className='toc-scroll-container max-h-3/4 overflow-y-auto scrollbar-none'>\r\n {headings.map(h2 => (\r\n <li key={h2.id}>\r\n <TableOfContentsLink heading={h2} activeId={activeId} handleClick={handleClick} />\r\n\r\n {h2.children.map(h3 => (\r\n <TableOfContentsLink\r\n key={h3.id}\r\n heading={h3}\r\n activeId={activeId}\r\n handleClick={handleClick}\r\n className=\"pl-8\"\r\n />\r\n ))}\r\n </li>\r\n ))}\r\n </ul>\r\n\r\n <hr className=\"my-6 border-gray-200\" />\r\n\r\n {docstraConfig.editOnGithub && (\r\n <a\r\n href={githubLink}\r\n rel=\"noopener noreferrer\"\r\n className=\"flex items-center gap-2 text-gray-400 hover:text-gray-700 transition\"\r\n >\r\n Edit this page on GitHub\r\n <SquareArrowOutUpRightIcon className=\"size-4\" />\r\n </a>\r\n )}\r\n\r\n {isScrolled && (\r\n <button\r\n onClick={() => scrollTo({ top: 0, behavior: 'smooth' })}\r\n className=\"flex items-center cursor-pointer gap-2 mt-3 text-gray-400 hover:text-gray-700 transition\"\r\n >\r\n Scroll to top\r\n <ArrowUpCircleIcon className=\"size-4\" />\r\n </button>\r\n )}\r\n </aside>\r\n );\r\n}\r\n\r\nfunction TableOfContentsLink({ heading, activeId, handleClick, className }: TOCLinkProps) {\r\n return (\r\n <a\r\n href={`#${heading.id}`}\r\n className={cn('border-l border-gray-200 block py-1.5 pl-4 transition-colors', className, {\r\n 'border-gray-800 text-gray-900 font-medium': activeId === heading.id,\r\n 'hover:text-gray-800 hover:border-gray-400': activeId !== heading.id\r\n })}\r\n onClick={() => handleClick(heading.id)}\r\n >\r\n {heading.text}\r\n </a>\r\n );\r\n}\r\n","import { DocstraSidebar } from './sidebar';\r\nimport { DocstraTOC } from './docstra-toc';\r\n\r\ninterface DocstraPageProps {\r\n children: React.ReactNode;\r\n toc?: boolean;\r\n sidebar?: boolean;\r\n}\r\n\r\nexport function DocstraPage({ children, toc = true, sidebar = true }: DocstraPageProps) {\r\n return (\r\n <div className=\"min-h-screen flex bg-white w-full\">\r\n {sidebar && <DocstraSidebar />}\r\n {children}\r\n {toc && <DocstraTOC />}\r\n </div>\r\n );\r\n}\r\n","'use client';\r\n\r\nimport { usePathname } from 'next/navigation';\r\nimport { ChevronRight } from 'lucide-react';\r\nimport Link from 'next/link';\r\n\r\nexport function DocstraBreadcrumbs() {\r\n const pathname = usePathname();\r\n const paths = pathname.split('/').filter(Boolean);\r\n\r\n const breadcrumbs = paths.map((segment, index) => {\r\n const href = '/' + paths.slice(0, index + 1).join('/');\r\n const title = segment.replace(/-/g, ' ').replace(/\\b\\w/g, c => c.toUpperCase());\r\n return { href, title };\r\n });\r\n\r\n return (\r\n <nav aria-label=\"Breadcrumb\" className=\"flex text-sm items-center pb-4 text-gray-500\">\r\n <ol className=\"flex items-center space-x-2\">\r\n <li>\r\n <Link href=\"/\" className=\"hover:text-gray-700 transition-colors font-medium\">\r\n Home\r\n </Link>\r\n </li>\r\n\r\n {breadcrumbs.map((crumb, index) => {\r\n const isLast = index === breadcrumbs.length - 1;\r\n return (\r\n <li key={crumb.href} className=\"flex items-center space-x-2\">\r\n <ChevronRight className=\"w-4 h-4 text-gray-400\" />\r\n {isLast ? (\r\n <span className=\"text-gray-600 font-medium\">{crumb.title}</span>\r\n ) : (\r\n <Link href={crumb.href} className=\"hover:text-gray-700 font-medium transition-colors\">\r\n {crumb.title}\r\n </Link>\r\n )}\r\n </li>\r\n );\r\n })}\r\n </ol>\r\n </nav>\r\n );\r\n}\r\n","'use client';\r\n\r\nimport { CheckIcon, CopyIcon } from 'lucide-react';\r\nimport { useEffect, useState } from 'react';\r\nimport { useDocstra } from '../../context/docstra-context';\r\n\r\nexport function DocstraPageButtons() {\r\n const { pageData } = useDocstra();\r\n const [isCopied, setIsCopied] = useState(false);\r\n const [href, setHref] = useState<string | null>(null);\r\n\r\n useEffect(() => {\r\n setHref(window.location.href);\r\n }, []);\r\n\r\n const prompt = `Read from this URL: ${href} and explain it to me.`;\r\n\r\n const handleCopy = () => {\r\n navigator.clipboard.writeText(pageData?.data.raw || '');\r\n setIsCopied(true);\r\n setTimeout(() => setIsCopied(false), 3000);\r\n };\r\n\r\n return (\r\n <div className=\"flex items-center gap-3 mt-6\">\r\n <button\r\n title=\"Copy Markdown\"\r\n onClick={handleCopy}\r\n className=\"flex items-center cursor-pointer gap-2 bg-gray-50 hover:bg-gray-100 border border-gray-200 px-3 py-2 rounded-md text-xs\"\r\n >\r\n {isCopied ? <CheckIcon className=\"size-3.5\" /> : <CopyIcon className=\"size-3.5\" />}\r\n Copy Markdown\r\n </button>\r\n <a\r\n title=\"Ask ChatGPT\"\r\n href={`https://chatgpt.com/?hints=search&q=${encodeURIComponent(prompt)}`}\r\n className=\"flex items-center gap-2 bg-gray-50 hover:bg-gray-100 border border-gray-200 px-3 py-2 rounded-md text-xs\"\r\n rel=\"noreferrer noopener\"\r\n >\r\n Ask ChatGPT\r\n </a>\r\n </div>\r\n );\r\n}\r\n","import { useDocstra } from '../../context/docstra-context';\r\nimport { DocstraPageButtons } from './page-buttons';\r\n\r\nexport function DocstraPageHead() {\r\n const { pageData } = useDocstra();\r\n const title = pageData?.data?.metadata?.title;\r\n const description = pageData?.data?.metadata?.description;\r\n return (\r\n <>\r\n <h1 className=\"text-3xl font-bold\">{title}</h1>\r\n <p className=\"my-4 text-gray-500\">{description}</p>\r\n <DocstraPageButtons />\r\n <hr className=\"my-10 border-gray-200\" />\r\n </>\r\n );\r\n}\r\n","'use client';\r\n\r\nimport { useState } from 'react';\r\nimport { ThumbsUp, ThumbsDown } from 'lucide-react';\r\nimport Input from './input';\r\nimport Button from './button';\r\nimport { useDocstra } from '../../context/docstra-context';\r\n\r\ntype Opinion = 'good' | 'bad' | null;\r\n\r\nexport function DocstraFeedback() {\r\n const [opinion, setOpinion] = useState<Opinion>(null);\r\n const { docstraConfig } = useDocstra();\r\n const [message, setMessage] = useState<string>('');\r\n const [submitted, setSubmitted] = useState<boolean>(false);\r\n\r\n return (\r\n <div className=\"border-y border-gray-200 mt-20 py-10 space-y-4\">\r\n {submitted ? (\r\n <>\r\n <p className=\"font-medium text-gray-900\">Thank you for your feedback!</p>\r\n <Button\r\n onClick={() => {\r\n setSubmitted(false);\r\n setOpinion(null);\r\n setMessage('');\r\n }}\r\n label=\"Submit Again\"\r\n className=\"w-max text-sm\"\r\n />\r\n </>\r\n ) : (\r\n <>\r\n <p className=\"font-medium\">How is this guide?</p>\r\n <div className=\"flex gap-2\">\r\n <button\r\n onClick={() => setOpinion('good')}\r\n className={`flex items-center cursor-pointer gap-1 px-3 py-2 rounded-full border text-sm ${opinion === 'good'\r\n ? 'bg-green-100 text-green-600 border-green-300'\r\n : 'border-gray-200 text-gray-600 hover:bg-gray-100'\r\n }`}\r\n >\r\n <ThumbsUp className={`size-4 ${opinion === 'good' ? 'fill-green-600' : 'text-gray-500'}`} />\r\n Good\r\n </button>\r\n <button\r\n onClick={() => setOpinion('bad')}\r\n className={`flex items-center cursor-pointer gap-1 px-3 py-2 rounded-full border text-sm ${opinion === 'bad'\r\n ? 'bg-red-100 text-red-600 border-red-300'\r\n : 'border-gray-200 text-gray-600 hover:bg-gray-100'\r\n }`}\r\n >\r\n <ThumbsDown\r\n className={`size-4 pt-0.5 ${opinion === 'bad' ? 'fill-red-600' : 'text-gray-500'}`}\r\n />\r\n Bad\r\n </button>\r\n </div>\r\n {opinion && (\r\n <form\r\n className=\"flex flex-col gap-2\"\r\n action={`https://formsync.app/v1/s/${docstraConfig?.feedback?.formSyncFormID || ''}`}\r\n method=\"POST\"\r\n >\r\n <Input\r\n value={message}\r\n id=\"message\"\r\n onChange={e => setMessage(e.target.value)}\r\n placeholder=\"Leave your feedback...\"\r\n required\r\n type=\"textarea\"\r\n />\r\n <input type=\"hidden\" name=\"opinion\" value={opinion} />\r\n <input type=\"hidden\" name=\"page\" value={window.location.href} />\r\n <input type=\"hidden\" name=\"_redirect\" value={window.location.href} />\r\n <Button label=\"Submit\" className=\"w-max text-sm\" />\r\n {docstraConfig?.feedback?.watermark !== false && (\r\n <p className=\"text-left text-sm text-gray-500 mt-6\">\r\n Powered by{' '}\r\n <a\r\n href={`https://www.formsync.app?utm_source=${docstraConfig?.githubRepo}`}\r\n className=\"text-gray-800\"\r\n >\r\n FormSync\r\n </a>\r\n </p>\r\n )}\r\n </form>\r\n )}\r\n </>\r\n )}\r\n </div>\r\n );\r\n}\r\n","import { cn } from '../../utils/cn';\r\n\r\ninterface Props {\r\n label?: string;\r\n type?: 'text' | 'textarea';\r\n placeholder?: string;\r\n id: string;\r\n required?: boolean;\r\n onChange?: (e: any) => void;\r\n value?: string;\r\n readOnly?: boolean;\r\n className?: string;\r\n optional?: boolean;\r\n}\r\n\r\nexport default function Input({\r\n label,\r\n type,\r\n placeholder = '',\r\n id,\r\n required = false,\r\n onChange,\r\n value,\r\n readOnly = false,\r\n className = '',\r\n optional = false\r\n}: Props) {\r\n return (\r\n <div className={cn('flex flex-col mt-4 w-full', className)}>\r\n {label && (\r\n <label htmlFor={id} className=\"font-medium w-max cursor-pointer\">\r\n {label}\r\n {optional && <span className=\"text-xs font-normal text-gray-400 ml-1 mt-1\">(Optional)</span>}\r\n </label>\r\n )}\r\n {type === 'textarea' ? (\r\n <textarea\r\n id={id}\r\n name={id}\r\n className={cn(\r\n 'mt-2 w-full p-3 border border-gray-300 resize-none not-focus:hover:border-gray-500 read-only:text-gray-400/80 outline-none focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2 transition-all duration-200 rounded-lg',\r\n className\r\n )}\r\n placeholder={placeholder}\r\n required={required}\r\n onChange={onChange}\r\n rows={4}\r\n value={value}\r\n readOnly={readOnly}\r\n />\r\n ) : (\r\n <input\r\n type={type}\r\n id={id}\r\n name={id}\r\n className=\"mt-2 w-full h-12 px-3 border border-gray-300 not-focus:hover:border-gray-500 read-only:text-gray-400/80 outline-none focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2 transition-all duration-200 rounded-lg\"\r\n placeholder={placeholder}\r\n required={required}\r\n onChange={onChange}\r\n value={value}\r\n readOnly={readOnly}\r\n />\r\n )}\r\n </div>\r\n );\r\n}\r\n","import { Loader2Icon } from 'lucide-react';\r\nimport { cn } from '../../utils/cn';\r\n\r\ninterface Props {\r\n label: string;\r\n loading?: boolean;\r\n type?: 'submit' | 'button';\r\n className?: string;\r\n disabled?: boolean;\r\n onClick?: () => void;\r\n}\r\n\r\nexport default function Button({ label, loading, type = 'submit', className = '', disabled = false, onClick }: Props) {\r\n return (\r\n <button\r\n type={type}\r\n disabled={disabled}\r\n className={cn(\r\n 'relative w-full mt-4 h-12 px-6 py-3 cursor-pointer font-medium bg-gray-900 hover:opacity-85 text-white rounded-lg',\r\n className\r\n )}\r\n aria-label={label}\r\n onClick={onClick}\r\n >\r\n {loading ? (\r\n <Loader2Icon className=\"absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 animate-spin mx-auto\" />\r\n ) : (\r\n label\r\n )}\r\n </button>\r\n );\r\n}\r\n","'use client';\r\n\r\nimport { usePathname } from 'next/navigation';\r\nimport Link from 'next/link';\r\nimport { ArrowLeftIcon, ArrowRightIcon } from 'lucide-react';\r\nimport { useDocstra } from '../../context/docstra-context';\r\nimport { DocsLinkGroup, DocsLinkItem } from '../../types';\r\n\r\nexport function DocstraPagination() {\r\n const pathname = usePathname();\r\n const { docstraConfig } = useDocstra();\r\n\r\n const flatLinks: any = docstraConfig?.sidebar?.links?.flatMap((section: DocsLinkGroup) => section.items);\r\n\r\n const currentIndex = flatLinks.findIndex((item: DocsLinkItem) => item.href === pathname);\r\n\r\n const prev = currentIndex > 0 ? flatLinks[currentIndex - 1] : null;\r\n const next = currentIndex < flatLinks.length - 1 ? flatLinks[currentIndex + 1] : null;\r\n\r\n return (\r\n <div className=\"flex flex-col lg:flex-row gap-2 justify-between py-10 mt-10\">\r\n {prev ? (\r\n <Link\r\n href={prev.href}\r\n className=\"flex flex-col items-start gap-2 border border-gray-200 hover:bg-gray-50 py-3 md:min-w-62 pl-4 pr-10 rounded-lg text-sm\"\r\n >\r\n <span className=\"text-gray-500\">Previous</span>\r\n <p className=\"flex items-center font-medium\">\r\n <ArrowLeftIcon className=\"size-5 mr-2\" />\r\n {prev.name}\r\n </p>\r\n </Link>\r\n ) : (\r\n <div />\r\n )}\r\n\r\n {next ? (\r\n <Link\r\n href={next.href}\r\n className=\"flex flex-col items-end gap-2 border border-gray-200 hover:bg-gray-50 py-3 pr-4 md:min-w-62 pl-10 rounded-lg text-sm\"\r\n >\r\n <span className=\"text-gray-500\">Next</span>\r\n <p className=\"flex items-center font-medium\">\r\n {next.name}\r\n <ArrowRightIcon className=\"size-5 ml-2\" />\r\n </p>\r\n </Link>\r\n ) : (\r\n <div />\r\n )}\r\n </div>\r\n );\r\n}\r\n","import { useDocstra } from '../../context/docstra-context';\r\nimport { DocstraBreadcrumbs } from './breadcrumbs';\r\nimport { DocstraPageHead } from './docstra-page-head';\r\nimport { DocstraFeedback } from './feedback';\r\nimport { DocstraPagination } from './pagination';\r\n\r\ninterface Props {\r\n children: React.ReactNode;\r\n}\r\n\r\nexport function DocstraBody({ children }: Props) {\r\n const { docstraConfig } = useDocstra();\r\n return (\r\n <main className=\"flex-1 px-4 md:px-8 py-10 max-w-full text-base/7\">\r\n <DocstraBreadcrumbs />\r\n <DocstraPageHead />\r\n {children}\r\n {docstraConfig?.feedback?.enabled && <DocstraFeedback />}\r\n <DocstraPagination />\r\n </main>\r\n );\r\n}\r\n","import { CheckIcon, CopyIcon } from 'lucide-react';\r\nimport { Highlight, themes } from 'prism-react-renderer';\r\nimport { useState } from 'react';\r\n\r\nexport function DocstraCodeBlock(props: any) {\r\n const { filename, children, className } = props;\r\n\r\n const isInline = !className?.includes(\"language-\");\r\n\r\n const rawText =\r\n typeof children === \"string\"\r\n ? children\r\n : children?.props?.children || \"\";\r\n\r\n if (isInline) {\r\n return (\r\n <code className=\"px-1 py-0.5 rounded border border-gray-200 text-gray-800 text-sm\">\r\n {rawText}\r\n </code>\r\n );\r\n }\r\n\r\n const [isCopied, setIsCopied] = useState(false);\r\n\r\n const match = className?.match(/language-([\\w-]+)/);\r\n const language = match?.[1] ?? \"txt\";\r\n\r\n const handleCopy = () => {\r\n navigator.clipboard.writeText(rawText.trim());\r\n setIsCopied(true);\r\n setTimeout(() => setIsCopied(false), 2000);\r\n };\r\n\r\n return (\r\n <div className=\"max-w-2xl overflow-hidden rounded-lg text-sm text-gray-800 border border-gray-200/80 mt-4\">\r\n <div className=\"flex items-center bg-gray-50 justify-between border-b border-gray-200/80\">\r\n <span className=\"text-xs text-gray-400 p-4\">\r\n {filename || language}\r\n </span>\r\n\r\n <button\r\n onClick={handleCopy}\r\n className=\"rounded cursor-pointer aspect-square p-2 m-2 text-xs hover:bg-gray-200 transition\"\r\n >\r\n {isCopied ? (\r\n <CheckIcon className=\"size-4\" />\r\n ) : (\r\n <CopyIcon className=\"size-4\" />\r\n )}\r\n </button>\r\n </div>\r\n\r\n <Highlight\r\n theme={themes.vsLight}\r\n code={rawText.trim()}\r\n language={language}\r\n >\r\n {({ tokens, getLineProps, getTokenProps }) => (\r\n <pre className=\"p-4 font-mono whitespace-pre overflow-x-auto\">\r\n {tokens.map((line, i) => (\r\n <div key={i} {...getLineProps({ line })}>\r\n <span className=\"text-slate-500 mr-4 select-none\">\r\n {i + 1}\r\n </span>\r\n {line.map((token, key) => (\r\n <span key={key} {...getTokenProps({ token })} />\r\n ))}\r\n </div>\r\n ))}\r\n </pre>\r\n )}\r\n </Highlight>\r\n </div>\r\n );\r\n}"],"mappings":"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","names":["useState","jsx","jsxs","useState","useEffect","Link","jsx","jsxs","useEffect","SearchIcon","Link","Fragment","jsx","jsxs","SearchIcon","usePathname","useEffect","useState","jsx","jsxs","useState","usePathname","useEffect","jsx","jsxs","usePathname","Link","jsx","jsxs","useEffect","useState","jsx","jsxs","useState","useEffect","Fragment","jsx","jsxs","useState","jsx","jsxs","jsx","Fragment","jsx","jsxs","useState","usePathname","Link","jsx","jsxs","usePathname","Link","jsx","jsxs","CheckIcon","CopyIcon","useState","jsx","jsxs"]}
|
|
1
|
+
{"version":3,"sources":["../../src/context/docstra-context.tsx","../../src/client/components/search-box.tsx","../../src/utils/cn.ts","../../src/client/components/header.tsx","../../src/client/components/sidebar.tsx","../../src/utils/get-icon.ts","../../src/client/components/docstra-toc.tsx","../../src/client/components/docs-page.tsx","../../src/client/components/breadcrumbs.tsx","../../src/client/components/page-buttons.tsx","../../src/client/components/docstra-page-head.tsx","../../src/client/components/feedback.tsx","../../src/client/components/input.tsx","../../src/client/components/button.tsx","../../src/client/components/pagination.tsx","../../src/client/components/docs-body.tsx","../../src/client/components/code-block.tsx"],"sourcesContent":["'use client';\r\nimport React, { createContext, useContext, useState } from 'react';\r\nimport { DocstraConfig, DocstraContextType, pageDataContent } from '../types';\r\nimport { ToastContainer } from 'react-toast-msg';\r\nimport { DocstraSearchBox } from '../client/components/search-box';\r\n\r\nconst DocstraContext = createContext<DocstraContextType | null>(null);\r\n\r\nexport function DocstraProvider({\r\n children,\r\n docstraConfig,\r\n docs,\r\n pageData: initialPageData,\r\n slug\r\n}: {\r\n children: React.ReactNode;\r\n docstraConfig: DocstraConfig;\r\n docs: pageDataContent[];\r\n pageData?: pageDataContent;\r\n slug?: string | string[];\r\n}) {\r\n const pageData = initialPageData || (() => {\r\n const normalizedSlug = Array.isArray(slug)\r\n ? (slug.length === 0 ? 'index' : slug.join('/'))\r\n : (slug || 'index');\r\n return docs.find(d => d.slug === normalizedSlug);\r\n })();\r\n\r\n if (!pageData) {\r\n // Fallback or error? For now, if no pageData and no resolution, context might be partial or throw.\r\n // But effectively this enables: <Provider docs={...} slug={...}>\r\n }\r\n const [openSidebar, setOpenSidebar] = useState(false);\r\n const [openSearchBox, setOpenSearchBox] = useState(false);\r\n\r\n return (\r\n <DocstraContext.Provider\r\n value={{\r\n openSidebar,\r\n setOpenSidebar,\r\n docstraConfig,\r\n openSearchBox,\r\n setOpenSearchBox,\r\n pageData: pageData!,\r\n docs\r\n }}\r\n >\r\n <ToastContainer />\r\n <DocstraSearchBox />\r\n {children}\r\n </DocstraContext.Provider>\r\n );\r\n}\r\n\r\nexport function useDocstra() {\r\n const ctx = useContext(DocstraContext);\r\n if (!ctx) throw new Error('Please wrap your app with DocstraProvider');\r\n return ctx;\r\n}\r\n","'use client';\r\n\r\nimport { SearchIcon } from 'lucide-react';\r\nimport { useDocstra } from '../../context/docstra-context';\r\nimport { cn } from '../../utils/cn';\r\nimport { useEffect, useMemo, useState } from 'react';\r\nimport Fuse from 'fuse.js';\r\nimport Link from 'next/link';\r\nimport { useRouter } from 'next/navigation';\r\n\r\nexport function DocstraSearchBox() {\r\n const { openSearchBox, setOpenSearchBox, docs } = useDocstra();\r\n const [searchQuery, setSearchQuery] = useState('');\r\n const [searchResults, setSearchResults] = useState<any[]>([]);\r\n const router = useRouter();\r\n\r\n useEffect(() => {\r\n const handleKeyDown = (event: KeyboardEvent) => {\r\n if (event.ctrlKey && event.key === 'k') {\r\n event.preventDefault();\r\n setOpenSearchBox(true);\r\n }\r\n };\r\n\r\n window.addEventListener('keydown', handleKeyDown);\r\n\r\n return () => {\r\n window.removeEventListener('keydown', handleKeyDown);\r\n };\r\n }, []);\r\n\r\n const fuse = useMemo(() => {\r\n if (!docs || docs.length === 0) return null;\r\n return new Fuse(docs, {\r\n keys: [\"data.metadata.title\", \"data.metadata.description\"],\r\n threshold: 0.3,\r\n });\r\n }, [docs]);\r\n\r\n useEffect(() => {\r\n if (searchQuery && fuse) {\r\n const results = fuse.search(searchQuery);\r\n setSearchResults(results.map(r => r.item));\r\n } else if (!searchQuery) {\r\n setSearchResults([]);\r\n }\r\n }, [searchQuery, fuse]);\r\n\r\n const onSearchHandler = (e: React.FormEvent<HTMLFormElement>) => {\r\n e.preventDefault();\r\n if (searchQuery) {\r\n const component = searchResults[0];\r\n if (component) {\r\n router.push(`/docs/${component.slug}`);\r\n setSearchQuery(\"\");\r\n setOpenSearchBox(false);\r\n }\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n const handleEscape = (e: KeyboardEvent) => {\r\n if (e.key === \"Escape\") {\r\n setOpenSearchBox(false);\r\n setSearchQuery(\"\");\r\n }\r\n };\r\n\r\n if (openSearchBox) {\r\n window.addEventListener(\"keydown\", handleEscape);\r\n }\r\n\r\n return () => {\r\n window.removeEventListener(\"keydown\", handleEscape);\r\n };\r\n }, [openSearchBox]);\r\n\r\n return (\r\n <div\r\n onClick={() => {\r\n setOpenSearchBox(false);\r\n setSearchQuery('');\r\n }}\r\n className={cn(\r\n 'fixed inset-0 z-25 flex items-start justify-center bg-white/40 backdrop-blur-md opacity-0 pointer-events-none transition-all duration-300',\r\n openSearchBox && 'opacity-100 pointer-events-auto'\r\n )}\r\n >\r\n <div\r\n onClick={e => e.stopPropagation()}\r\n className=\"flex flex-col items-center mt-30 max-w-lg w-full max-md:px-4\"\r\n >\r\n <form\r\n onSubmit={onSearchHandler}\r\n className={cn(\r\n 'relative flex items-center justify-between w-full bg-white border border-slate-200 text-gray-400 h-15 p-0.5 rounded-md',\r\n searchQuery && \"rounded-b-none border-b-0\"\r\n )}\r\n >\r\n {openSearchBox && (\r\n <>\r\n <SearchIcon className=\"size-5.5 mx-3 shrink-0\" />\r\n <input className=\"w-full bg-transparent h-full outline-none text-gray-400 placeholder:text-gray-400\" type=\"text\" placeholder=\"Search docs...\" spellCheck=\"false\" autoFocus={true} value={searchQuery} onChange={e => setSearchQuery(e.target.value)} name=\"searchQuery\" required />\r\n <span className=\"border border-gray-200 px-2 mr-3 py-1 rounded text-xs\">\r\n Esc\r\n </span>\r\n </>\r\n )}\r\n </form>\r\n <div\r\n className={cn(\r\n \"max-h-70 overflow-x-hidden overflow-y-auto scrollbar-y w-full bg-white text-slate-700 flex flex-col\",\r\n searchQuery && \"rounded-b-md border border-slate-200\"\r\n )}\r\n >\r\n {searchResults.map((item) => (\r\n <Link\r\n href={`/docs/${item.slug === 'index' ? '' : item.slug}`}\r\n key={item.slug}\r\n onClick={() => {\r\n setOpenSearchBox(false);\r\n setSearchQuery(\"\");\r\n }}\r\n className=\"w-full hover:bg-gray-100/70 border-b border-slate-200 transition-all py-4 px-4 last:mb-2\"\r\n >\r\n <h4 className=\"font-medium\">{item.data?.metadata?.title || item.slug}</h4>\r\n <p className=\"text-sm mt-1 text-gray-500\">{item.data?.metadata?.description}</p>\r\n </Link>\r\n ))}\r\n\r\n {searchQuery && searchResults.length === 0 && (\r\n <div className=\"text-gray-500 text-center py-20\">No results found</div>\r\n )}\r\n </div>\r\n </div>\r\n </div>\r\n );\r\n}\r\n","import { twMerge } from 'tailwind-merge';\r\nimport clsx, { ClassValue } from 'clsx';\r\n\r\nexport function cn(...inputs: ClassValue[]) {\r\n return twMerge(clsx(inputs));\r\n}\r\n","'use client';\r\n\r\nimport { TextAlignEnd, XIcon } from 'lucide-react';\r\nimport { useEffect } from 'react';\r\nimport { useDocstra } from '../../context/docstra-context';\r\nimport { cn } from '../../utils/cn';\r\nimport Link from 'next/link';\r\n\r\nexport function DocstraHeader() {\r\n const { openSidebar, setOpenSidebar, docstraConfig } = useDocstra();\r\n\r\n const githubRepo = 'https://github.com/' + docstraConfig?.editOnGithub?.owner + '/' + docstraConfig?.editOnGithub?.repo;\r\n\r\n useEffect(() => {\r\n if (openSidebar) {\r\n document.body.classList.add('max-md:overflow-hidden');\r\n } else {\r\n document.body.classList.remove('max-md:overflow-hidden');\r\n }\r\n }, [openSidebar]);\r\n return (\r\n <header className=\"sticky top-0 z-10 text-sm flex items-center justify-between border-b border-gray-100 h-18 px-4 md:px-6 bg-white\">\r\n <Link href={docstraConfig.navbar?.logo?.link || '/'} className='hover:opacity-80 transition'>\r\n <img\r\n src={docstraConfig.navbar?.logo?.src || '/logo.png'}\r\n alt={docstraConfig.navbar?.logo?.alt || 'Logo'}\r\n className={cn('h-9.5 w-auto', docstraConfig.navbar?.logo?.className)}\r\n />\r\n </Link>\r\n <div className=\"hidden divide-x divide-gray-200 md:flex items-center\">\r\n {docstraConfig.navbar?.links?.map(link => (\r\n <Link key={link.name} href={link.href} className=\"px-6 hover:text-gray-600\">\r\n {link.name}\r\n </Link>\r\n ))}\r\n <Link href={githubRepo || 'https://github.com/sudhucodes/docstra'}>\r\n <svg className=\"size-6 mx-6\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n <path d=\"M12 .3a12 12 0 0 0-3.8 23.38c.6.12.83-.26.83-.57L9 21.07c-3.34.72-4.04-1.61-4.04-1.61-.55-1.39-1.34-1.76-1.34-1.76-1.08-.74.09-.73.09-.73 1.2.09 1.83 1.24 1.83 1.24 1.08 1.83 2.81 1.3 3.5 1 .1-.78.42-1.31.76-1.61-2.67-.3-5.47-1.33-5.47-5.93 0-1.31.47-2.38 1.24-3.22-.14-.3-.54-1.52.1-3.18 0 0 1-.32 3.3 1.23a11.5 11.5 0 0 1 6 0c2.28-1.55 3.29-1.23 3.29-1.23.64 1.66.24 2.88.12 3.18a4.65 4.65 0 0 1 1.23 3.22c0 4.61-2.8 5.63-5.48 5.92.42.36.81 1.1.81 2.22l-.01 3.29c0 .31.2.69.82.57A12 12 0 0 0 12 .3\" />\r\n </svg>\r\n </Link>\r\n </div>\r\n <button\r\n onClick={() => setOpenSidebar(!openSidebar)}\r\n className=\"md:hidden transition text-gray-600 active:ring-2 ring-gray-200 p-1.5 rounded-md\"\r\n >\r\n {openSidebar ? <XIcon className=\"size-6.5\" /> : <TextAlignEnd className=\"size-6.5\" />}\r\n </button>\r\n </header>\r\n );\r\n}\r\n","'use client';\r\n\r\nimport { SearchIcon } from 'lucide-react';\r\nimport { usePathname } from 'next/navigation';\r\nimport { cn } from '../../utils/cn';\r\nimport { useDocstra } from '../../context/docstra-context';\r\nimport { getIcon } from '../../utils/get-icon';\r\nimport { toast } from 'react-toast-msg';\r\nimport Link from 'next/link';\r\n\r\nexport function DocstraSidebar() {\r\n const { openSidebar, setOpenSidebar, docstraConfig, setOpenSearchBox } = useDocstra();\r\n const pathname = usePathname();\r\n\r\n return (\r\n <>\r\n <div\r\n className={cn(\r\n 'fixed inset-0 z-20 bg-black/50 opacity-0 pointer-events-none transition-all duration-300',\r\n openSidebar && 'opacity-100 pointer-events-auto'\r\n )}\r\n onClick={() => setOpenSidebar(false)}\r\n />\r\n <aside\r\n className={cn(\r\n 'sticky md:top-18 h-[calc(100svh-72px)] scrollbar-y w-screen max-md:rounded-t-lg z-21 md:w-72 pb-10 text-base md:text-sm shrink-0 border-r border-gray-200 p-4 max-md:fixed bg-white overflow-y-auto transition-all duration-300',\r\n openSidebar ? 'top-32' : 'top-full'\r\n )}\r\n >\r\n <div\r\n className=\"flex items-center select-none gap-2 cursor-pointer mt-6 mb-4 p-2.5 text-gray-500 border border-gray-200 rounded-lg hover:bg-gray-50\"\r\n onClick={() => {\r\n setOpenSidebar(openSidebar && false);\r\n setOpenSearchBox(true)\r\n }}\r\n >\r\n <SearchIcon className=\"size-4.5\" />\r\n <p>Search</p>\r\n <div className=\"ms-auto font-mono inline-flex gap-0.5\">\r\n <span className=\"rounded-md border border-gray-200 px-1.5\">Ctrl</span>\r\n <span className=\"rounded-md border border-gray-200 px-1.5\">K</span>\r\n </div>\r\n </div>\r\n\r\n {docstraConfig.sidebar?.links?.map(group => (\r\n <div key={group.section}>\r\n <p className=\"inline-flex items-center gap-2 mb-2 mt-2 px-2\">{group.section}</p>\r\n\r\n <ul className=\"mb-4\">\r\n {group.items.map(link => {\r\n const Icon = getIcon(link.icon);\r\n\r\n return (\r\n <li key={link.href}>\r\n <Link\r\n href={link.href}\r\n onNavigate={() => openSidebar && setOpenSidebar(false)}\r\n className={cn(\r\n 'flex items-center gap-2 text-gray-500 hover:bg-gray-100 py-2 px-2.5 rounded-lg',\r\n pathname === link.href && 'bg-gray-100 text-gray-800'\r\n )}\r\n >\r\n {Icon && <Icon className=\"size-4\" />}\r\n <span>{link.name}</span>\r\n </Link>\r\n </li>\r\n );\r\n })}\r\n </ul>\r\n </div>\r\n ))}\r\n </aside>\r\n </>\r\n );\r\n}\r\n","import * as Icons from 'lucide-react';\r\n\r\nexport function getIcon(name?: string) {\r\n if (!name) return undefined;\r\n\r\n return (Icons as Record<string, any>)[name];\r\n}\r\n","'use client';\r\n\r\nimport { ArrowUpCircleIcon, SquareArrowOutUpRightIcon, TextAlignStartIcon } from 'lucide-react';\r\nimport { usePathname } from 'next/navigation';\r\nimport { useEffect, useRef, useState } from 'react';\r\nimport { cn } from '../../utils/cn';\r\nimport { TOCLinkProps } from '../../types';\r\nimport { useDocstra } from '../../context/docstra-context';\r\n\r\n\r\nexport function DocstraTOC() {\r\n const [activeId, setActiveId] = useState<string | null>(null);\r\n const [scrollDir, setScrollDir] = useState<'up' | 'down'>('down');\r\n const [isScrolled, setIsScrolled] = useState(false);\r\n const [isManualClick, setIsManualClick] = useState(false);\r\n const { docstraConfig, pageData } = useDocstra();\r\n const mdxFilePath = pageData?.path;\r\n // We expect tableOfContents to be present in data now, extracted by loader.\r\n // Fallback to empty array if missing for some reason.\r\n const headings = pageData?.data?.tableOfContents || [];\r\n\r\n const lastScrollY = useRef(0);\r\n const observerRef = useRef<IntersectionObserver | null>(null);\r\n\r\n const pathname = usePathname();\r\n const baseUrlOfGithub = 'https://github.com/' + docstraConfig?.editOnGithub?.owner + '/' + docstraConfig?.editOnGithub?.repo;\r\n const githubLink = `${baseUrlOfGithub}/edit/main/${docstraConfig?.editOnGithub?.path}/${mdxFilePath}`;\r\n\r\n useEffect(() => {\r\n const onScroll = () => {\r\n const currentY = window.scrollY;\r\n setScrollDir(currentY > lastScrollY.current ? 'down' : 'up');\r\n setIsScrolled(currentY > 100);\r\n lastScrollY.current = currentY;\r\n };\r\n\r\n window.addEventListener('scroll', onScroll);\r\n return () => window.removeEventListener('scroll', onScroll);\r\n }, []);\r\n\r\n useEffect(() => {\r\n const allHeadings = document.querySelectorAll<HTMLHeadingElement>(`h2[id], h3[id]`);\r\n\r\n const observer = new IntersectionObserver(\r\n entries => {\r\n if (isManualClick) return;\r\n\r\n const visible = entries\r\n .filter(e => e.isIntersecting)\r\n .sort((a, b) => a.boundingClientRect.top - b.boundingClientRect.top);\r\n\r\n if (visible.length > 0) {\r\n const nextActive =\r\n scrollDir === 'down' ? visible[0].target.id : visible[visible.length - 1].target.id;\r\n\r\n setActiveId(nextActive);\r\n }\r\n },\r\n {\r\n rootMargin: '-40% 0px -50% 0px',\r\n threshold: [0, 0.2, 0.6, 1.0]\r\n }\r\n );\r\n\r\n allHeadings.forEach(heading => observer.observe(heading));\r\n observerRef.current = observer;\r\n\r\n return () => observer.disconnect();\r\n }, [pathname, scrollDir, isManualClick]);\r\n\r\n useEffect(() => {\r\n const scrolled = window.scrollY > 100;\r\n !scrolled && setActiveId(headings[0]?.id);\r\n }, [headings]);\r\n\r\n useEffect(() => {\r\n if (!activeId) return;\r\n\r\n const container = document.querySelector('.toc-scroll-container');\r\n if (!container) return;\r\n\r\n const activeLink = container.querySelector(`a[href=\"#${activeId}\"]`);\r\n if (!activeLink) return;\r\n\r\n const containerRect = container.getBoundingClientRect();\r\n const linkRect = activeLink.getBoundingClientRect();\r\n\r\n const isOutOfView =\r\n linkRect.top < containerRect.top || linkRect.bottom > containerRect.bottom;\r\n\r\n if (isOutOfView) {\r\n activeLink.scrollIntoView({\r\n behavior: 'smooth',\r\n block: 'nearest',\r\n });\r\n }\r\n }, [activeId]);\r\n\r\n\r\n useEffect(() => {\r\n if (!isManualClick) return;\r\n const timer = setTimeout(() => setIsManualClick(false), 800);\r\n return () => clearTimeout(timer);\r\n }, [isManualClick]);\r\n\r\n const handleClick = (id: string) => {\r\n setActiveId(id);\r\n setIsManualClick(true);\r\n };\r\n\r\n return (\r\n <aside className=\"sticky top-18 text-sm hidden xl:block text-gray-500 shrink-0 h-[calc(100svh-72px)] w-64 border-l border-gray-200 p-6 overflow-y-auto\">\r\n <p className=\"flex items-center gap-2 mb-5\">\r\n <TextAlignStartIcon className=\"size-4\" />\r\n On this page\r\n </p>\r\n\r\n {/* Links Container */}\r\n <ul className='toc-scroll-container max-h-3/4 overflow-y-auto scrollbar-none'>\r\n {headings.map(h2 => (\r\n <li key={h2.id}>\r\n <TableOfContentsLink heading={h2} activeId={activeId} handleClick={handleClick} />\r\n\r\n {h2.children.map(h3 => (\r\n <TableOfContentsLink\r\n key={h3.id}\r\n heading={h3}\r\n activeId={activeId}\r\n handleClick={handleClick}\r\n className=\"pl-8\"\r\n />\r\n ))}\r\n </li>\r\n ))}\r\n </ul>\r\n\r\n <hr className=\"my-6 border-gray-200\" />\r\n\r\n {docstraConfig.editOnGithub && (\r\n <a\r\n href={githubLink}\r\n rel=\"noopener noreferrer\"\r\n className=\"flex items-center gap-2 text-gray-400 hover:text-gray-700 transition\"\r\n >\r\n Edit this page on GitHub\r\n <SquareArrowOutUpRightIcon className=\"size-4\" />\r\n </a>\r\n )}\r\n\r\n {isScrolled && (\r\n <button\r\n onClick={() => scrollTo({ top: 0, behavior: 'smooth' })}\r\n className=\"flex items-center cursor-pointer gap-2 mt-3 text-gray-400 hover:text-gray-700 transition\"\r\n >\r\n Scroll to top\r\n <ArrowUpCircleIcon className=\"size-4\" />\r\n </button>\r\n )}\r\n </aside>\r\n );\r\n}\r\n\r\nfunction TableOfContentsLink({ heading, activeId, handleClick, className }: TOCLinkProps) {\r\n return (\r\n <a\r\n href={`#${heading.id}`}\r\n className={cn('border-l border-gray-200 block py-1.5 pl-4 transition-colors', className, {\r\n 'border-gray-800 text-gray-900 font-medium': activeId === heading.id,\r\n 'hover:text-gray-800 hover:border-gray-400': activeId !== heading.id\r\n })}\r\n onClick={() => handleClick(heading.id)}\r\n >\r\n {heading.text}\r\n </a>\r\n );\r\n}\r\n","import { DocstraSidebar } from './sidebar';\r\nimport { DocstraTOC } from './docstra-toc';\r\n\r\ninterface DocstraPageProps {\r\n children: React.ReactNode;\r\n toc?: boolean;\r\n sidebar?: boolean;\r\n}\r\n\r\nexport function DocstraPage({ children, toc = true, sidebar = true }: DocstraPageProps) {\r\n return (\r\n <div className=\"min-h-screen flex bg-white w-full\">\r\n {sidebar && <DocstraSidebar />}\r\n {children}\r\n {toc && <DocstraTOC />}\r\n </div>\r\n );\r\n}\r\n","'use client';\r\n\r\nimport { usePathname } from 'next/navigation';\r\nimport { ChevronRight } from 'lucide-react';\r\nimport Link from 'next/link';\r\n\r\nexport function DocstraBreadcrumbs() {\r\n const pathname = usePathname();\r\n const paths = pathname.split('/').filter(Boolean);\r\n\r\n const breadcrumbs = paths.map((segment, index) => {\r\n const href = '/' + paths.slice(0, index + 1).join('/');\r\n const title = segment.replace(/-/g, ' ').replace(/\\b\\w/g, c => c.toUpperCase());\r\n return { href, title };\r\n });\r\n\r\n return (\r\n <nav aria-label=\"Breadcrumb\" className=\"flex text-sm items-center pb-4 text-gray-500\">\r\n <ol className=\"flex items-center space-x-2\">\r\n <li>\r\n <Link href=\"/\" className=\"hover:text-gray-700 transition-colors font-medium\">\r\n Home\r\n </Link>\r\n </li>\r\n\r\n {breadcrumbs.map((crumb, index) => {\r\n const isLast = index === breadcrumbs.length - 1;\r\n return (\r\n <li key={crumb.href} className=\"flex items-center space-x-2\">\r\n <ChevronRight className=\"w-4 h-4 text-gray-400\" />\r\n {isLast ? (\r\n <span className=\"text-gray-600 font-medium\">{crumb.title}</span>\r\n ) : (\r\n <Link href={crumb.href} className=\"hover:text-gray-700 font-medium transition-colors\">\r\n {crumb.title}\r\n </Link>\r\n )}\r\n </li>\r\n );\r\n })}\r\n </ol>\r\n </nav>\r\n );\r\n}\r\n","'use client';\r\n\r\nimport { CheckIcon, CopyIcon } from 'lucide-react';\r\nimport { useEffect, useState } from 'react';\r\nimport { useDocstra } from '../../context/docstra-context';\r\n\r\nexport function DocstraPageButtons() {\r\n const { pageData } = useDocstra();\r\n const [isCopied, setIsCopied] = useState(false);\r\n const [href, setHref] = useState<string | null>(null);\r\n\r\n useEffect(() => {\r\n setHref(window.location.href);\r\n }, []);\r\n\r\n const prompt = `Read from this URL: ${href} and explain it to me.`;\r\n\r\n const handleCopy = () => {\r\n navigator.clipboard.writeText(pageData?.data.raw || '');\r\n setIsCopied(true);\r\n setTimeout(() => setIsCopied(false), 3000);\r\n };\r\n\r\n return (\r\n <div className=\"flex items-center gap-3 mt-6\">\r\n <button\r\n title=\"Copy Markdown\"\r\n onClick={handleCopy}\r\n className=\"flex items-center cursor-pointer gap-2 bg-gray-50 hover:bg-gray-100 border border-gray-200 px-3 py-2 rounded-md text-xs\"\r\n >\r\n {isCopied ? <CheckIcon className=\"size-3.5\" /> : <CopyIcon className=\"size-3.5\" />}\r\n Copy Markdown\r\n </button>\r\n <a\r\n title=\"Ask ChatGPT\"\r\n href={`https://chatgpt.com/?hints=search&q=${encodeURIComponent(prompt)}`}\r\n className=\"flex items-center gap-2 bg-gray-50 hover:bg-gray-100 border border-gray-200 px-3 py-2 rounded-md text-xs\"\r\n rel=\"noreferrer noopener\"\r\n >\r\n Ask ChatGPT\r\n </a>\r\n </div>\r\n );\r\n}\r\n","import { useDocstra } from '../../context/docstra-context';\r\nimport { DocstraPageButtons } from './page-buttons';\r\n\r\nexport function DocstraPageHead() {\r\n const { pageData } = useDocstra();\r\n const title = pageData?.data?.metadata?.title;\r\n const description = pageData?.data?.metadata?.description;\r\n return (\r\n <>\r\n <h1 className=\"text-3xl font-bold\">{title}</h1>\r\n <p className=\"my-4 text-gray-500\">{description}</p>\r\n <DocstraPageButtons />\r\n <hr className=\"my-10 border-gray-200\" />\r\n </>\r\n );\r\n}\r\n","'use client';\r\n\r\nimport { useState } from 'react';\r\nimport { ThumbsUp, ThumbsDown } from 'lucide-react';\r\nimport Input from './input';\r\nimport Button from './button';\r\nimport { useDocstra } from '../../context/docstra-context';\r\n\r\ntype Opinion = 'good' | 'bad' | null;\r\n\r\nexport function DocstraFeedback() {\r\n const [opinion, setOpinion] = useState<Opinion>(null);\r\n const { docstraConfig } = useDocstra();\r\n const [message, setMessage] = useState<string>('');\r\n const [submitted, setSubmitted] = useState<boolean>(false);\r\n const baseUrlOfGithub = 'https://github.com/' + docstraConfig?.editOnGithub?.owner + '/' + docstraConfig?.editOnGithub?.repo;\r\n\r\n return (\r\n <div className=\"border-y border-gray-200 mt-20 py-10 space-y-4\">\r\n {submitted ? (\r\n <>\r\n <p className=\"font-medium text-gray-900\">Thank you for your feedback!</p>\r\n <Button\r\n onClick={() => {\r\n setSubmitted(false);\r\n setOpinion(null);\r\n setMessage('');\r\n }}\r\n label=\"Submit Again\"\r\n className=\"w-max text-sm\"\r\n />\r\n </>\r\n ) : (\r\n <>\r\n <p className=\"font-medium\">How is this guide?</p>\r\n <div className=\"flex gap-2\">\r\n <button\r\n onClick={() => setOpinion('good')}\r\n className={`flex items-center cursor-pointer gap-1 px-3 py-2 rounded-full border text-sm ${opinion === 'good'\r\n ? 'bg-green-100 text-green-600 border-green-300'\r\n : 'border-gray-200 text-gray-600 hover:bg-gray-100'\r\n }`}\r\n >\r\n <ThumbsUp className={`size-4 ${opinion === 'good' ? 'fill-green-600' : 'text-gray-500'}`} />\r\n Good\r\n </button>\r\n <button\r\n onClick={() => setOpinion('bad')}\r\n className={`flex items-center cursor-pointer gap-1 px-3 py-2 rounded-full border text-sm ${opinion === 'bad'\r\n ? 'bg-red-100 text-red-600 border-red-300'\r\n : 'border-gray-200 text-gray-600 hover:bg-gray-100'\r\n }`}\r\n >\r\n <ThumbsDown\r\n className={`size-4 pt-0.5 ${opinion === 'bad' ? 'fill-red-600' : 'text-gray-500'}`}\r\n />\r\n Bad\r\n </button>\r\n </div>\r\n {opinion && (\r\n <form\r\n className=\"flex flex-col gap-2\"\r\n action={`https://api.formsync.app/v1/s/${docstraConfig?.feedback?.formSyncFormID || ''}`}\r\n method=\"POST\"\r\n >\r\n <Input\r\n value={message}\r\n id=\"message\"\r\n onChange={e => setMessage(e.target.value)}\r\n placeholder=\"Leave your feedback...\"\r\n required\r\n type=\"textarea\"\r\n />\r\n <input type=\"hidden\" name=\"opinion\" value={opinion} />\r\n <input type=\"hidden\" name=\"page\" value={window.location.href} />\r\n <input type=\"hidden\" name=\"_redirect\" value={window.location.href} />\r\n <Button label=\"Submit\" className=\"w-max text-sm\" />\r\n {docstraConfig?.feedback?.watermark !== false && (\r\n <p className=\"text-left text-sm text-gray-500 mt-6\">\r\n Powered by{' '}\r\n <a\r\n href={`https://www.formsync.app?utm_source=${baseUrlOfGithub}`}\r\n className=\"text-gray-800\"\r\n >\r\n FormSync\r\n </a>\r\n </p>\r\n )}\r\n </form>\r\n )}\r\n </>\r\n )}\r\n </div>\r\n );\r\n}\r\n","import { cn } from '../../utils/cn';\r\n\r\ninterface Props {\r\n label?: string;\r\n type?: 'text' | 'textarea';\r\n placeholder?: string;\r\n id: string;\r\n required?: boolean;\r\n onChange?: (e: any) => void;\r\n value?: string;\r\n readOnly?: boolean;\r\n className?: string;\r\n optional?: boolean;\r\n}\r\n\r\nexport default function Input({\r\n label,\r\n type,\r\n placeholder = '',\r\n id,\r\n required = false,\r\n onChange,\r\n value,\r\n readOnly = false,\r\n className = '',\r\n optional = false\r\n}: Props) {\r\n return (\r\n <div className={cn('flex flex-col mt-4 w-full', className)}>\r\n {label && (\r\n <label htmlFor={id} className=\"font-medium w-max cursor-pointer\">\r\n {label}\r\n {optional && <span className=\"text-xs font-normal text-gray-400 ml-1 mt-1\">(Optional)</span>}\r\n </label>\r\n )}\r\n {type === 'textarea' ? (\r\n <textarea\r\n id={id}\r\n name={id}\r\n className={cn(\r\n 'mt-2 w-full p-3 border border-gray-300 resize-none not-focus:hover:border-gray-500 read-only:text-gray-400/80 outline-none focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2 transition-all duration-200 rounded-lg',\r\n className\r\n )}\r\n placeholder={placeholder}\r\n required={required}\r\n onChange={onChange}\r\n rows={4}\r\n value={value}\r\n readOnly={readOnly}\r\n />\r\n ) : (\r\n <input\r\n type={type}\r\n id={id}\r\n name={id}\r\n className=\"mt-2 w-full h-12 px-3 border border-gray-300 not-focus:hover:border-gray-500 read-only:text-gray-400/80 outline-none focus:ring-2 focus:ring-indigo-500 focus:ring-offset-2 transition-all duration-200 rounded-lg\"\r\n placeholder={placeholder}\r\n required={required}\r\n onChange={onChange}\r\n value={value}\r\n readOnly={readOnly}\r\n />\r\n )}\r\n </div>\r\n );\r\n}\r\n","import { Loader2Icon } from 'lucide-react';\r\nimport { cn } from '../../utils/cn';\r\n\r\ninterface Props {\r\n label: string;\r\n loading?: boolean;\r\n type?: 'submit' | 'button';\r\n className?: string;\r\n disabled?: boolean;\r\n onClick?: () => void;\r\n}\r\n\r\nexport default function Button({ label, loading, type = 'submit', className = '', disabled = false, onClick }: Props) {\r\n return (\r\n <button\r\n type={type}\r\n disabled={disabled}\r\n className={cn(\r\n 'relative w-full mt-4 h-12 px-6 py-3 cursor-pointer font-medium bg-gray-900 hover:opacity-85 text-white rounded-lg',\r\n className\r\n )}\r\n aria-label={label}\r\n onClick={onClick}\r\n >\r\n {loading ? (\r\n <Loader2Icon className=\"absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 animate-spin mx-auto\" />\r\n ) : (\r\n label\r\n )}\r\n </button>\r\n );\r\n}\r\n","'use client';\r\n\r\nimport { usePathname } from 'next/navigation';\r\nimport Link from 'next/link';\r\nimport { ArrowLeftIcon, ArrowRightIcon } from 'lucide-react';\r\nimport { useDocstra } from '../../context/docstra-context';\r\nimport { DocsLinkGroup, DocsLinkItem } from '../../types';\r\n\r\nexport function DocstraPagination() {\r\n const pathname = usePathname();\r\n const { docstraConfig } = useDocstra();\r\n\r\n const flatLinks: any = docstraConfig?.sidebar?.links?.flatMap((section: DocsLinkGroup) => section.items);\r\n\r\n const currentIndex = flatLinks.findIndex((item: DocsLinkItem) => item.href === pathname);\r\n\r\n const prev = currentIndex > 0 ? flatLinks[currentIndex - 1] : null;\r\n const next = currentIndex < flatLinks.length - 1 ? flatLinks[currentIndex + 1] : null;\r\n\r\n return (\r\n <div className=\"flex flex-col lg:flex-row gap-2 justify-between py-10 mt-10\">\r\n {prev ? (\r\n <Link\r\n href={prev.href}\r\n className=\"flex flex-col items-start gap-2 border border-gray-200 hover:bg-gray-50 py-3 md:min-w-62 pl-4 pr-10 rounded-lg text-sm\"\r\n >\r\n <span className=\"text-gray-500\">Previous</span>\r\n <p className=\"flex items-center font-medium\">\r\n <ArrowLeftIcon className=\"size-5 mr-2\" />\r\n {prev.name}\r\n </p>\r\n </Link>\r\n ) : (\r\n <div />\r\n )}\r\n\r\n {next ? (\r\n <Link\r\n href={next.href}\r\n className=\"flex flex-col items-end gap-2 border border-gray-200 hover:bg-gray-50 py-3 pr-4 md:min-w-62 pl-10 rounded-lg text-sm\"\r\n >\r\n <span className=\"text-gray-500\">Next</span>\r\n <p className=\"flex items-center font-medium\">\r\n {next.name}\r\n <ArrowRightIcon className=\"size-5 ml-2\" />\r\n </p>\r\n </Link>\r\n ) : (\r\n <div />\r\n )}\r\n </div>\r\n );\r\n}\r\n","import { useDocstra } from '../../context/docstra-context';\r\nimport { DocstraBreadcrumbs } from './breadcrumbs';\r\nimport { DocstraPageHead } from './docstra-page-head';\r\nimport { DocstraFeedback } from './feedback';\r\nimport { DocstraPagination } from './pagination';\r\n\r\ninterface Props {\r\n children: React.ReactNode;\r\n}\r\n\r\nexport function DocstraBody({ children }: Props) {\r\n const { docstraConfig } = useDocstra();\r\n return (\r\n <main className=\"flex-1 px-4 md:px-8 py-10 max-w-full text-base/7\">\r\n <DocstraBreadcrumbs />\r\n <DocstraPageHead />\r\n {children}\r\n {docstraConfig?.feedback?.enabled && <DocstraFeedback />}\r\n <DocstraPagination />\r\n </main>\r\n );\r\n}\r\n","import { CheckIcon, CopyIcon } from 'lucide-react';\r\nimport { Highlight, themes } from 'prism-react-renderer';\r\nimport { useState } from 'react';\r\n\r\nexport function DocstraCodeBlock(props: any) {\r\n const { filename, children, className } = props;\r\n\r\n const isInline = !className?.includes(\"language-\");\r\n\r\n const rawText =\r\n typeof children === \"string\"\r\n ? children\r\n : children?.props?.children || \"\";\r\n\r\n if (isInline) {\r\n return (\r\n <code className=\"px-1 py-0.5 rounded border border-gray-200 text-gray-800 text-sm\">\r\n {rawText}\r\n </code>\r\n );\r\n }\r\n\r\n const [isCopied, setIsCopied] = useState(false);\r\n\r\n const match = className?.match(/language-([\\w-]+)/);\r\n const language = match?.[1] ?? \"txt\";\r\n\r\n const handleCopy = () => {\r\n navigator.clipboard.writeText(rawText.trim());\r\n setIsCopied(true);\r\n setTimeout(() => setIsCopied(false), 2000);\r\n };\r\n\r\n return (\r\n <div className=\"max-w-2xl overflow-hidden rounded-lg text-sm text-gray-800 border border-gray-200/80 mt-4\">\r\n <div className=\"flex items-center bg-gray-50 justify-between border-b border-gray-200/80\">\r\n <span className=\"text-xs text-gray-400 p-4\">\r\n {filename || language}\r\n </span>\r\n\r\n <button\r\n onClick={handleCopy}\r\n className=\"rounded cursor-pointer aspect-square p-2 m-2 text-xs hover:bg-gray-200 transition\"\r\n >\r\n {isCopied ? (\r\n <CheckIcon className=\"size-4\" />\r\n ) : (\r\n <CopyIcon className=\"size-4\" />\r\n )}\r\n </button>\r\n </div>\r\n\r\n <Highlight\r\n theme={themes.vsLight}\r\n code={rawText.trim()}\r\n language={language}\r\n >\r\n {({ tokens, getLineProps, getTokenProps }) => (\r\n <pre className=\"p-4 font-mono whitespace-pre overflow-x-auto\">\r\n {tokens.map((line, i) => (\r\n <div key={i} {...getLineProps({ line })}>\r\n <span className=\"text-slate-500 mr-4 select-none\">\r\n {i + 1}\r\n </span>\r\n {line.map((token, key) => (\r\n <span key={key} {...getTokenProps({ token })} />\r\n ))}\r\n </div>\r\n ))}\r\n </pre>\r\n )}\r\n </Highlight>\r\n </div>\r\n );\r\n}"],"mappings":"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","names":["useState","jsx","jsxs","useState","useEffect","Link","jsx","jsxs","useEffect","SearchIcon","Link","Fragment","jsx","jsxs","SearchIcon","usePathname","useEffect","useState","jsx","jsxs","useState","usePathname","useEffect","jsx","jsxs","usePathname","Link","jsx","jsxs","useEffect","useState","jsx","jsxs","useState","useEffect","Fragment","jsx","jsxs","useState","jsx","jsxs","jsx","Fragment","jsx","jsxs","useState","usePathname","Link","jsx","jsxs","usePathname","Link","jsx","jsxs","CheckIcon","CopyIcon","useState","jsx","jsxs"]}
|
package/package.json
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "docstra",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.8.0",
|
|
4
4
|
"bin": {
|
|
5
5
|
"docstra": "cli/index.js"
|
|
6
6
|
},
|
|
7
7
|
"description": "The Modern Documentation Framework for Next.js",
|
|
8
8
|
"files": [
|
|
9
|
-
"dist"
|
|
9
|
+
"dist",
|
|
10
|
+
"cli"
|
|
10
11
|
],
|
|
11
12
|
"exports": {
|
|
12
13
|
".": {
|