create-robindoc-app 0.0.0-experimental-dd4fde6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/lib/cli.d.ts +3 -0
- package/lib/cli.d.ts.map +1 -0
- package/lib/cli.js +3 -0
- package/lib/cli.js.map +1 -0
- package/package.json +46 -0
- package/templates/default/content/README.md +93 -0
- package/templates/default/content/how-it-works.md +177 -0
- package/templates/default/next.config.mjs +4 -0
- package/templates/default/package.json +26 -0
- package/templates/default/src/app/docs/[[...segments]]/page.tsx +29 -0
- package/templates/default/src/app/docs/layout.tsx +14 -0
- package/templates/default/src/app/docs/robindoc.ts +16 -0
- package/templates/default/src/app/globals.css +41 -0
- package/templates/default/src/app/layout.tsx +29 -0
- package/templates/default/src/app/page.tsx +22 -0
- package/templates/default/src/app/search-provider.ts +5 -0
- package/templates/default/tsconfig.json +42 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Alex Savelyev <dev@alexdln.com>
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/lib/cli.d.ts
ADDED
package/lib/cli.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|
package/lib/cli.js
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import{execSync as e}from"child_process";import{existsSync as r}from"fs";import{mkdir as o,cp as n}from"fs/promises";import{fileURLToPath as t}from"url";import{dirname as s,resolve as a}from"path";import{hideBin as p}from"yargs/helpers";import i from"yargs";import c from"chalk";import m from"inquirer";const l=s(t(import.meta.url));(async()=>{let t=i(p(process.argv)).scriptName("create-robindoc-app").usage("$0 [directory]").help().parseSync()._[0]??void 0;if(!t){const e=await m.prompt([{type:"input",name:"appName",message:"Project name:",default:"robindoc-app"}]);e.appName||(console.log(c.red("Aborted.")),process.exit(1)),t=e.appName.trim()}const s=a(t);r(s)&&(console.error(c.red(`\nDirectory ${t} already exists.`)),process.exit(1)),await o(s,{recursive:!0}),console.log(c.cyan(`\nCreating a new robindoc app in ${s}...\n`));const d=(()=>{const e=process.env.npm_config_user_agent||"";return e.startsWith("pnpm")?"pnpm":e.startsWith("yarn")?"yarn":"npm"})(),y=a(l,"..","templates","default");await n(y,s,{recursive:!0,force:!0,errorOnExist:!0}),console.log(c.cyan("\nInstalling dependencies...\n"));const u="pnpm"===d?"pnpm install":"yarn"===d?"yarn":"npm install";try{e(u,{stdio:"inherit",cwd:s}),console.log([`${c.green(`Success! Created ${t} at ${s}`)}`,"To start the development server, please run:",`\tcd ${t}`,`\t${"npm"===d?"npm run":d} dev`].join("\n"))}catch{console.log(c.yellow(`\nFailed to automatically install dependencies. Please run '${u}' inside ${t} manually.\n`))}})().catch(e=>{console.error(e),process.exit(1)});
|
|
3
|
+
//# sourceMappingURL=cli.js.map
|
package/lib/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { execSync } from \"child_process\";\nimport { existsSync } from \"fs\";\nimport { cp, mkdir } from \"fs/promises\";\nimport { fileURLToPath } from \"url\";\nimport { dirname, resolve } from \"path\";\nimport { hideBin } from \"yargs/helpers\";\nimport yargs from \"yargs\";\nimport chalk from \"chalk\";\nimport inquirer from \"inquirer\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\ntype PackageManager = \"pnpm\" | \"yarn\" | \"npm\";\n\nconst detectPackageManager = (): PackageManager => {\n const agent = process.env.npm_config_user_agent || \"\";\n if (agent.startsWith(\"pnpm\")) return \"pnpm\";\n if (agent.startsWith(\"yarn\")) return \"yarn\";\n return \"npm\";\n};\n\nconst run = async () => {\n const argv = yargs(hideBin(process.argv))\n .scriptName(\"create-robindoc-app\")\n .usage(\"$0 [directory]\")\n .help()\n .parseSync();\n\n const targetDirArg = (argv._[0] as string | undefined) ?? undefined;\n\n let appName = targetDirArg;\n\n if (!appName) {\n const res = await inquirer.prompt<{ appName: string }>([\n {\n type: \"input\",\n name: \"appName\",\n message: \"Project name:\",\n default: \"robindoc-app\",\n },\n ]);\n\n if (!res.appName) {\n console.log(chalk.red(\"Aborted.\"));\n process.exit(1);\n }\n\n appName = res.appName.trim();\n }\n\n const root = resolve(appName);\n\n if (existsSync(root)) {\n console.error(chalk.red(`\\nDirectory ${appName} already exists.`));\n process.exit(1);\n }\n\n await mkdir(root, { recursive: true });\n\n console.log(chalk.cyan(`\\nCreating a new robindoc app in ${root}...\\n`));\n\n const pkgManager = detectPackageManager();\n const templateRoot = resolve(__dirname, \"..\", \"templates\", \"default\");\n\n await cp(templateRoot, root, { recursive: true, force: true, errorOnExist: true });\n\n console.log(chalk.cyan(\"\\nInstalling dependencies...\\n\"));\n\n const installCmd = pkgManager === \"pnpm\" ? \"pnpm install\" : pkgManager === \"yarn\" ? \"yarn\" : \"npm install\";\n\n try {\n execSync(installCmd, { stdio: \"inherit\", cwd: root });\n\n console.log(\n [\n `${chalk.green(`Success! Created ${appName} at ${root}`)}`,\n \"To start the development server, please run:\",\n `\\tcd ${appName}`,\n `\\t${pkgManager === \"npm\" ? \"npm run\" : pkgManager} dev`,\n ].join(\"\\n\"),\n );\n } catch {\n console.log(\n chalk.yellow(\n `\\nFailed to automatically install dependencies. Please run '${installCmd}' inside ${appName} manually.\\n`,\n ),\n );\n }\n};\n\nrun().catch((err) => {\n console.error(err);\n process.exit(1);\n});\n"],"names":["__dirname","dirname","fileURLToPath","url","async","appName","yargs","hideBin","process","argv","scriptName","usage","help","parseSync","_","undefined","res","inquirer","prompt","type","name","message","default","console","log","chalk","red","exit","trim","root","resolve","existsSync","error","mkdir","recursive","cyan","pkgManager","agent","env","npm_config_user_agent","startsWith","detectPackageManager","templateRoot","cp","force","errorOnExist","installCmd","execSync","stdio","cwd","green","join","yellow","run","catch","err"],"mappings":";+SAYA,MACMA,EAAYC,EADCC,cAA0BC,MAYjCC,WASR,IAAIC,EARSC,EAAMC,EAAQC,QAAQC,OAC9BC,WAAW,uBACXC,MAAM,kBACNC,OACAC,YAEsBC,EAAE,SAA6BC,EAI1D,IAAKV,EAAS,CACV,MAAMW,QAAYC,EAASC,OAA4B,CACnD,CACIC,KAAM,QACNC,KAAM,UACNC,QAAS,gBACTC,QAAS,kBAIZN,EAAIX,UACLkB,QAAQC,IAAIC,EAAMC,IAAI,aACtBlB,QAAQmB,KAAK,IAGjBtB,EAAUW,EAAIX,QAAQuB,MAC1B,CAEA,MAAMC,EAAOC,EAAQzB,GAEjB0B,EAAWF,KACXN,QAAQS,MAAMP,EAAMC,IAAI,eAAerB,sBACvCG,QAAQmB,KAAK,UAGXM,EAAMJ,EAAM,CAAEK,WAAW,IAE/BX,QAAQC,IAAIC,EAAMU,KAAK,oCAAoCN,WAE3D,MAAMO,EA/CmB,MACzB,MAAMC,EAAQ7B,QAAQ8B,IAAIC,uBAAyB,GACnD,OAAIF,EAAMG,WAAW,QAAgB,OACjCH,EAAMG,WAAW,QAAgB,OAC9B,OA2CYC,GACbC,EAAeZ,EAAQ9B,EAAW,KAAM,YAAa,iBAErD2C,EAAGD,EAAcb,EAAM,CAAEK,WAAW,EAAMU,OAAO,EAAMC,cAAc,IAE3EtB,QAAQC,IAAIC,EAAMU,KAAK,mCAEvB,MAAMW,EAA4B,SAAfV,EAAwB,eAAgC,SAAfA,EAAwB,OAAS,cAE7F,IACIW,EAASD,EAAY,CAAEE,MAAO,UAAWC,IAAKpB,IAE9CN,QAAQC,IACJ,CACI,GAAGC,EAAMyB,MAAM,oBAAoB7C,QAAcwB,OACjD,+CACA,QAAQxB,IACR,KAAoB,QAAf+B,EAAuB,UAAYA,SAC1Ce,KAAK,MAEf,CAAE,MACE5B,QAAQC,IACJC,EAAM2B,OACF,+DAA+DN,aAAsBzC,iBAGjG,GAGJgD,GAAMC,MAAOC,IACThC,QAAQS,MAAMuB,GACd/C,QAAQmB,KAAK"}
|
package/package.json
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "create-robindoc-app",
|
|
3
|
+
"version": "0.0.0-experimental-dd4fde6",
|
|
4
|
+
"description": "CLI to bootstrap a minimal Next.js app using robindoc",
|
|
5
|
+
"bin": "./lib/cli.js",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"build": "rollup -c",
|
|
8
|
+
"dev": "rollup -c -w"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"lib",
|
|
12
|
+
"templates"
|
|
13
|
+
],
|
|
14
|
+
"keywords": [
|
|
15
|
+
"robindoc",
|
|
16
|
+
"create-app",
|
|
17
|
+
"nextjs",
|
|
18
|
+
"documentation"
|
|
19
|
+
],
|
|
20
|
+
"repository": {
|
|
21
|
+
"type": "git",
|
|
22
|
+
"url": "git://github.com/alexdln/robindoc.git"
|
|
23
|
+
},
|
|
24
|
+
"author": {
|
|
25
|
+
"name": "Alex Savelyev",
|
|
26
|
+
"email": "dev@alexdln.com",
|
|
27
|
+
"url": "https://github.com/alexdln/"
|
|
28
|
+
},
|
|
29
|
+
"license": "MIT",
|
|
30
|
+
"dependencies": {
|
|
31
|
+
"chalk": "4.1.2",
|
|
32
|
+
"inquirer": "13.1.0",
|
|
33
|
+
"yargs": "18.0.0"
|
|
34
|
+
},
|
|
35
|
+
"devDependencies": {
|
|
36
|
+
"@rollup/plugin-commonjs": "29.0.0",
|
|
37
|
+
"@rollup/plugin-terser": "0.4.4",
|
|
38
|
+
"@rollup/plugin-typescript": "12.3.0",
|
|
39
|
+
"@types/inquirer": "9.0.9",
|
|
40
|
+
"@types/node": "25.0.8",
|
|
41
|
+
"@types/yargs": "17.0.35",
|
|
42
|
+
"rollup": "4.55.1",
|
|
43
|
+
"ts-patch": "3.3.0",
|
|
44
|
+
"typescript": "5.9.3"
|
|
45
|
+
}
|
|
46
|
+
}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
# Welcome to Your Documentation Site
|
|
2
|
+
|
|
3
|
+
This is your new documentation site built with RobinDoc. Everything is already set up and ready to go!
|
|
4
|
+
|
|
5
|
+
## Getting Started
|
|
6
|
+
|
|
7
|
+
### 1. Install Dependencies
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm install
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
### 2. Start Development Server
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
npm run dev
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Visit [http://localhost:3000/docs](http://localhost:3000/docs) to see your documentation.
|
|
20
|
+
|
|
21
|
+
### 3. Add Your Content
|
|
22
|
+
|
|
23
|
+
Edit the Markdown files in the `content/` directory. Each file automatically becomes a page:
|
|
24
|
+
|
|
25
|
+
- `content/README.md` → `/docs`
|
|
26
|
+
- `content/how-it-works.md` → `/docs/how-it-works`
|
|
27
|
+
|
|
28
|
+
## Project Structure
|
|
29
|
+
|
|
30
|
+
```
|
|
31
|
+
your-app/
|
|
32
|
+
├── content/ # Your documentation files
|
|
33
|
+
│ ├── README.md # Documentation homepage content
|
|
34
|
+
│ └── how-it-works.md # Example page
|
|
35
|
+
├── src/
|
|
36
|
+
│ └── app/
|
|
37
|
+
│ ├── layout.tsx # Root layout (Header/Footer)
|
|
38
|
+
│ ├── docs/
|
|
39
|
+
│ │ ├── robindoc.ts # RobinDoc configuration
|
|
40
|
+
│ │ ├── layout.tsx # Docs layout (Sidebar)
|
|
41
|
+
│ │ └── [[...segments]]/
|
|
42
|
+
│ │ └── page.tsx # Dynamic route handler
|
|
43
|
+
│ └── globals.css # Global styles
|
|
44
|
+
└── package.json
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## Customization
|
|
48
|
+
|
|
49
|
+
### Update Header & Footer
|
|
50
|
+
|
|
51
|
+
Edit `src/app/layout.tsx` to customize your header logo and footer:
|
|
52
|
+
|
|
53
|
+
```tsx
|
|
54
|
+
<Header logo={<>Your Brand</>} />
|
|
55
|
+
<Footer copyright="© 2026 Your Company" />
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### Change Documentation Path
|
|
59
|
+
|
|
60
|
+
Edit `src/app/docs/robindoc.ts` to change the base path:
|
|
61
|
+
|
|
62
|
+
```tsx
|
|
63
|
+
basePath: "/your-path", // Change from "/docs" to your preferred path
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### Add More Pages
|
|
67
|
+
|
|
68
|
+
Simply add new Markdown files to the `content/` directory. They'll automatically appear in the sidebar and be accessible via URL.
|
|
69
|
+
|
|
70
|
+
### Customize Styles
|
|
71
|
+
|
|
72
|
+
Edit `src/app/globals.css` to add your own styles or override RobinDoc's theme variables.
|
|
73
|
+
|
|
74
|
+
## Building for Production
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
npm run build
|
|
78
|
+
npm start
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## Learn More
|
|
82
|
+
|
|
83
|
+
- Read [How It Works](./how-it-works.md) to understand the app structure
|
|
84
|
+
- Visit the [RobinDoc documentation](https://robindoc.com/docs) for advanced features
|
|
85
|
+
- Check out [configuration options](https://robindoc.com/docs/02-structure) for custom setups
|
|
86
|
+
|
|
87
|
+
## Need Help?
|
|
88
|
+
|
|
89
|
+
- Check the [RobinDoc documentation](https://robindoc.com/docs)
|
|
90
|
+
- Review the [example implementations](https://github.com/your-org/robindoc/tree/main/examples)
|
|
91
|
+
- Open an issue on [GitHub](https://github.com/your-org/robindoc/issues)
|
|
92
|
+
|
|
93
|
+
Happy documenting! 🚀
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
# How This App Works
|
|
2
|
+
|
|
3
|
+
This page explains how your documentation site is structured and how each part works together.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
Your app uses Next.js with RobinDoc to automatically convert Markdown files into a fully functional documentation site. Here's how it all connects:
|
|
8
|
+
|
|
9
|
+
1. **Markdown files** in `content/` → **Documentation pages**
|
|
10
|
+
2. **File structure** → **Navigation sidebar**
|
|
11
|
+
3. **Next.js routing** → **Client Side navigation**
|
|
12
|
+
4. **Static generation** → **Fast page loads**
|
|
13
|
+
|
|
14
|
+
## Key Files
|
|
15
|
+
|
|
16
|
+
### `src/app/docs/robindoc.ts`
|
|
17
|
+
|
|
18
|
+
This file initializes RobinDoc and configures your documentation:
|
|
19
|
+
|
|
20
|
+
```tsx
|
|
21
|
+
export const { Page, Sidebar, getMetadata, getStaticParams } = initializeRobindoc({
|
|
22
|
+
configuration: {
|
|
23
|
+
sourceRoot: "./content", // Where your Markdown files are
|
|
24
|
+
basePath: "/docs", // URL prefix for all docs pages
|
|
25
|
+
},
|
|
26
|
+
items: "auto", // Automatically discover files
|
|
27
|
+
});
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
**What it does:**
|
|
31
|
+
- Scans `content/` for Markdown files
|
|
32
|
+
- Creates navigation structure automatically
|
|
33
|
+
- Exports components you'll use in your pages
|
|
34
|
+
|
|
35
|
+
### `src/app/layout.tsx`
|
|
36
|
+
|
|
37
|
+
The root layout wraps your entire app:
|
|
38
|
+
|
|
39
|
+
```tsx
|
|
40
|
+
<RobinProvider component="body">
|
|
41
|
+
<Header logo={<>RobinDoc</>} />
|
|
42
|
+
{children}
|
|
43
|
+
<Footer copyright="© 2026 RobinDoc" />
|
|
44
|
+
</RobinProvider>
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
This provides the header and footer that appear on every page.
|
|
48
|
+
|
|
49
|
+
### `src/app/docs/layout.tsx`
|
|
50
|
+
|
|
51
|
+
The docs layout wraps only documentation pages:
|
|
52
|
+
|
|
53
|
+
```tsx
|
|
54
|
+
<DocsContainer>
|
|
55
|
+
<Sidebar />
|
|
56
|
+
{children}
|
|
57
|
+
<KeylinkToNavigation />
|
|
58
|
+
</DocsContainer>
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
This adds the sidebar navigation to all docs pages.
|
|
62
|
+
|
|
63
|
+
### `src/app/docs/[[...segments]]/page.tsx`
|
|
64
|
+
|
|
65
|
+
This catch-all route handles all documentation URLs:
|
|
66
|
+
|
|
67
|
+
```tsx
|
|
68
|
+
export default async function Docs({ params }) {
|
|
69
|
+
const { segments } = await params;
|
|
70
|
+
const pathname = "/docs/" + (segments?.join("/") || "");
|
|
71
|
+
return <Page pathname={pathname} />;
|
|
72
|
+
}
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
**How it works:**
|
|
76
|
+
- `/docs` → renders `content/README.md`
|
|
77
|
+
- `/docs/how-it-works` → renders `content/how-it-works.md`
|
|
78
|
+
- `/docs/your-path` → renders `content/your-path.md`
|
|
79
|
+
|
|
80
|
+
## Request Flow
|
|
81
|
+
|
|
82
|
+
When someone visits `/docs/how-it-works`:
|
|
83
|
+
|
|
84
|
+
1. Next.js routes to `[[...segments]]/page.tsx`
|
|
85
|
+
2. Wraps with sidebar (from `docs/layout.tsx`)
|
|
86
|
+
3. Wraps with header/footer (from root `layout.tsx`)
|
|
87
|
+
4. Extracts segments: `["how-it-works"]`
|
|
88
|
+
5. Builds pathname: `/docs/how-it-works`
|
|
89
|
+
6. `Page` component finds `content/how-it-works.md`
|
|
90
|
+
7. Converts Markdown to HTML
|
|
91
|
+
8. Returns the page to the browser
|
|
92
|
+
|
|
93
|
+
## File to URL Mapping
|
|
94
|
+
|
|
95
|
+
Your file structure directly maps to URLs:
|
|
96
|
+
|
|
97
|
+
```
|
|
98
|
+
content/
|
|
99
|
+
├── README.md → /docs
|
|
100
|
+
├── how-it-works.md → /docs/how-it-works
|
|
101
|
+
└── guides/
|
|
102
|
+
├── README.md → /docs/guides
|
|
103
|
+
└── advanced.md → /docs/guides/advanced
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
## Static Site Generation
|
|
107
|
+
|
|
108
|
+
During `npm run build`:
|
|
109
|
+
|
|
110
|
+
1. `generateStaticParams()` finds all Markdown files
|
|
111
|
+
2. Next.js pre-renders HTML for each page
|
|
112
|
+
3. Pages are served instantly (no server processing needed)
|
|
113
|
+
4. Better performance and SEO
|
|
114
|
+
|
|
115
|
+
## Customization Tips
|
|
116
|
+
|
|
117
|
+
### Add Custom Components
|
|
118
|
+
|
|
119
|
+
You can use React components in your Markdown. First, pass them to the `Page` component in `page.tsx`:
|
|
120
|
+
|
|
121
|
+
```tsx
|
|
122
|
+
<Page
|
|
123
|
+
pathname={pathname}
|
|
124
|
+
components={{
|
|
125
|
+
Note: MyNoteComponent,
|
|
126
|
+
}}
|
|
127
|
+
/>
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
Then use in Markdown:
|
|
131
|
+
```md
|
|
132
|
+
<Note type="info">
|
|
133
|
+
This is a custom component!
|
|
134
|
+
</Note>
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
### Customize Navigation
|
|
138
|
+
|
|
139
|
+
Edit `robindoc.ts` to customize the sidebar:
|
|
140
|
+
|
|
141
|
+
```tsx
|
|
142
|
+
items: [
|
|
143
|
+
{
|
|
144
|
+
title: "Introduction",
|
|
145
|
+
type: "heading",
|
|
146
|
+
href: "/",
|
|
147
|
+
},
|
|
148
|
+
"auto", // Auto-generate the rest
|
|
149
|
+
]
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
### Change Theme
|
|
153
|
+
|
|
154
|
+
Override CSS variables in `globals.css`:
|
|
155
|
+
|
|
156
|
+
```css
|
|
157
|
+
:root {
|
|
158
|
+
--rb-main-50: #fafafa;
|
|
159
|
+
--rb-main-100: #f5f5f5;
|
|
160
|
+
--rb-main-200: #e5e5e5;
|
|
161
|
+
--rb-main-300: #d4d4d4;
|
|
162
|
+
--rb-main-400: #a3a3a3;
|
|
163
|
+
--rb-main-500: #737373;
|
|
164
|
+
--rb-main-600: #525252;
|
|
165
|
+
--rb-main-700: #404040;
|
|
166
|
+
--rb-main-800: #262626;
|
|
167
|
+
--rb-main-900: #171717;
|
|
168
|
+
--rb-main-950: #0a0a0a;
|
|
169
|
+
}
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
## Next Steps
|
|
173
|
+
|
|
174
|
+
- Add more Markdown files to `content/`
|
|
175
|
+
- Customize the header and footer in `src/app/layout.tsx`
|
|
176
|
+
- Check out [customization options](https://robindoc.com/docs/customization) for more personalizations
|
|
177
|
+
- Explore [RobinDoc documentation](https://robindoc.com/docs) for advanced features
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "robindoc-app",
|
|
3
|
+
"private": true,
|
|
4
|
+
"scripts": {
|
|
5
|
+
"dev": "pnpm run prebuild && next dev",
|
|
6
|
+
"prebuild": "robindoc-minisearch --template src/app/docs/robindoc.ts",
|
|
7
|
+
"build": "next build",
|
|
8
|
+
"start": "next start"
|
|
9
|
+
},
|
|
10
|
+
"dependencies": {
|
|
11
|
+
"next": "16.1.4",
|
|
12
|
+
"react": "19.2.3",
|
|
13
|
+
"react-dom": "19.2.3",
|
|
14
|
+
"robindoc": "latest",
|
|
15
|
+
"@robindoc/minisearch": "latest",
|
|
16
|
+
"@robindoc/next": "latest",
|
|
17
|
+
"sass": "1.97.2"
|
|
18
|
+
},
|
|
19
|
+
"devDependencies": {
|
|
20
|
+
"@types/node": "25.0.8",
|
|
21
|
+
"@types/react": "19.2.8",
|
|
22
|
+
"@types/react-dom": "19.2.3",
|
|
23
|
+
"typescript": "5.9.3",
|
|
24
|
+
"tsx": "4.21.0"
|
|
25
|
+
}
|
|
26
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { Page, getMetadata, getStaticParams } from "../robindoc";
|
|
2
|
+
|
|
3
|
+
export default async function Docs({ params }: { params: Promise<{ segments?: string[] }> }) {
|
|
4
|
+
const { segments } = await params;
|
|
5
|
+
const pathname = "/docs/" + (segments?.join("/") || "");
|
|
6
|
+
|
|
7
|
+
return (
|
|
8
|
+
<Page
|
|
9
|
+
pathname={pathname}
|
|
10
|
+
config={{
|
|
11
|
+
publicDirs: ["public"],
|
|
12
|
+
}}
|
|
13
|
+
/>
|
|
14
|
+
);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export const generateMetadata = async ({ params }: { params: Promise<{ segments?: string[] }> }) => {
|
|
18
|
+
const { segments } = await params;
|
|
19
|
+
const pathname = "/docs/" + (segments?.join("/") || "");
|
|
20
|
+
const metadata = await getMetadata(pathname);
|
|
21
|
+
|
|
22
|
+
return metadata;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
export const generateStaticParams = async () => {
|
|
26
|
+
const staticParams = await getStaticParams("/docs");
|
|
27
|
+
|
|
28
|
+
return staticParams;
|
|
29
|
+
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ReactNode } from "react";
|
|
2
|
+
import { DocsContainer, KeylinkToNavigation } from "robindoc";
|
|
3
|
+
|
|
4
|
+
import { Sidebar } from "./robindoc";
|
|
5
|
+
|
|
6
|
+
export default function DocsLayout({ children }: { children: ReactNode }) {
|
|
7
|
+
return (
|
|
8
|
+
<DocsContainer>
|
|
9
|
+
<Sidebar />
|
|
10
|
+
{children}
|
|
11
|
+
<KeylinkToNavigation />
|
|
12
|
+
</DocsContainer>
|
|
13
|
+
);
|
|
14
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { notFound } from "next/navigation";
|
|
2
|
+
import { initializeRobindoc } from "robindoc";
|
|
3
|
+
|
|
4
|
+
export const { Page, Sidebar, getPageData, getMetadata, getStaticParams, getPageInstruction } = initializeRobindoc(
|
|
5
|
+
{
|
|
6
|
+
configuration: {
|
|
7
|
+
sourceRoot: "./content",
|
|
8
|
+
basePath: "/docs",
|
|
9
|
+
},
|
|
10
|
+
items: "auto",
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
processError: notFound,
|
|
14
|
+
matcher: ["/(?!.*\\..+).*"],
|
|
15
|
+
},
|
|
16
|
+
);
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
html,
|
|
2
|
+
body {
|
|
3
|
+
padding: 0;
|
|
4
|
+
margin: 0;
|
|
5
|
+
font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
*,
|
|
9
|
+
*::before,
|
|
10
|
+
*::after {
|
|
11
|
+
box-sizing: border-box;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
.home-container {
|
|
15
|
+
max-width: 1180px;
|
|
16
|
+
margin: 0 auto;
|
|
17
|
+
padding: 24px;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
.home-cards {
|
|
21
|
+
display: flex;
|
|
22
|
+
flex-wrap: wrap;
|
|
23
|
+
gap: 20px;
|
|
24
|
+
margin-top: 40px;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
.home-card {
|
|
28
|
+
background-color: var(--r-main-100);
|
|
29
|
+
border-radius: 8px;
|
|
30
|
+
padding: 8px 20px;
|
|
31
|
+
display: block;
|
|
32
|
+
text-decoration: none;
|
|
33
|
+
transition: transform 0.2s ease;
|
|
34
|
+
color: inherit;
|
|
35
|
+
width: 375px;
|
|
36
|
+
max-width: 100%;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
.home-card:hover {
|
|
40
|
+
transform: translateY(-2px);
|
|
41
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { type ReactNode } from "react";
|
|
2
|
+
import { RobinProvider, Header, Footer } from "robindoc";
|
|
3
|
+
import { NavigationProvider } from "@robindoc/next";
|
|
4
|
+
|
|
5
|
+
import { searchProvider } from "./search-provider";
|
|
6
|
+
|
|
7
|
+
import "robindoc/lib/styles.css";
|
|
8
|
+
import "./globals.css";
|
|
9
|
+
|
|
10
|
+
export default function RootLayout({ children }: { children: ReactNode }) {
|
|
11
|
+
return (
|
|
12
|
+
<html lang="en">
|
|
13
|
+
<body>
|
|
14
|
+
<NavigationProvider>
|
|
15
|
+
<RobinProvider>
|
|
16
|
+
<Header
|
|
17
|
+
logo={<>RobinDoc</>}
|
|
18
|
+
links={[{ href: "/docs", title: "Docs" }]}
|
|
19
|
+
git="https://github.com/alexdln/robindoc"
|
|
20
|
+
searcher={searchProvider}
|
|
21
|
+
/>
|
|
22
|
+
{children}
|
|
23
|
+
<Footer copyright="© 2026 RobinDoc" />
|
|
24
|
+
</RobinProvider>
|
|
25
|
+
</NavigationProvider>
|
|
26
|
+
</body>
|
|
27
|
+
</html>
|
|
28
|
+
);
|
|
29
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import Link from "next/link";
|
|
2
|
+
|
|
3
|
+
export default function Home() {
|
|
4
|
+
return (
|
|
5
|
+
<div className="home-container">
|
|
6
|
+
<h1>Welcome</h1>
|
|
7
|
+
<h2>Get started with your documentation</h2>
|
|
8
|
+
|
|
9
|
+
<div className="home-cards">
|
|
10
|
+
<Link href="/docs" className="home-card">
|
|
11
|
+
<h3>Template Documentation</h3>
|
|
12
|
+
<p>Learn how this starter app works and customize it to your needs</p>
|
|
13
|
+
</Link>
|
|
14
|
+
|
|
15
|
+
<a href="https://robindoc.com/docs" target="_blank" rel="noopener noreferrer" className="home-card">
|
|
16
|
+
<h3>RobinDoc Documentation</h3>
|
|
17
|
+
<p>Explore advanced features, configuration options, and customization guides</p>
|
|
18
|
+
</a>
|
|
19
|
+
</div>
|
|
20
|
+
</div>
|
|
21
|
+
);
|
|
22
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "es2020",
|
|
4
|
+
"lib": [
|
|
5
|
+
"dom",
|
|
6
|
+
"dom.iterable",
|
|
7
|
+
"esnext"
|
|
8
|
+
],
|
|
9
|
+
"allowJs": false,
|
|
10
|
+
"skipLibCheck": true,
|
|
11
|
+
"strict": true,
|
|
12
|
+
"forceConsistentCasingInFileNames": true,
|
|
13
|
+
"noEmit": true,
|
|
14
|
+
"module": "esnext",
|
|
15
|
+
"moduleResolution": "bundler",
|
|
16
|
+
"resolveJsonModule": true,
|
|
17
|
+
"isolatedModules": true,
|
|
18
|
+
"jsx": "react-jsx",
|
|
19
|
+
"incremental": true,
|
|
20
|
+
"types": [
|
|
21
|
+
"node",
|
|
22
|
+
"react",
|
|
23
|
+
"react-dom"
|
|
24
|
+
],
|
|
25
|
+
"esModuleInterop": true,
|
|
26
|
+
"plugins": [
|
|
27
|
+
{
|
|
28
|
+
"name": "next"
|
|
29
|
+
}
|
|
30
|
+
]
|
|
31
|
+
},
|
|
32
|
+
"include": [
|
|
33
|
+
"next-env.d.ts",
|
|
34
|
+
"**/*.ts",
|
|
35
|
+
"**/*.tsx",
|
|
36
|
+
".next/types/**/*.ts",
|
|
37
|
+
".next/dev/types/**/*.ts"
|
|
38
|
+
],
|
|
39
|
+
"exclude": [
|
|
40
|
+
"node_modules"
|
|
41
|
+
]
|
|
42
|
+
}
|