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 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
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -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,4 @@
1
+ /** @type {import("next").NextConfig} */
2
+ const nextConfig = {};
3
+
4
+ export default nextConfig;
@@ -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,5 @@
1
+ "use client";
2
+
3
+ import { createSearchProvider } from "@robindoc/minisearch/provider";
4
+
5
+ export const searchProvider = createSearchProvider("/search-index.json");
@@ -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
+ }