- {[
- {
- title: "Data Ingestion",
- icon:
,
- color: "text-blue-500",
- description: "Connect multiple sources with automatic syncing"
- },
- {
- title: "AI Processing",
- icon:
,
- color: "text-purple-500",
- description: "Smart chunking & OpenAI embeddings"
- },
- {
- title: "Vector Storage",
- icon:
,
- color: "text-green-500",
- description: "Blazing-fast indexing with Qdrant"
- },
- {
- title: "Smart Retrieval",
- icon:
,
- color: "text-orange-500",
- description: "Hybrid search & context-aware responses"
- }
- ].map((step, idx) => (
-
-
-
- {[...Array(3)].map((_, i) => (
-
- ))}
-
-
- {["Data Source", "Processing", "Storage", "Answer"].map((label, i) => (
-
-
- {i === 3 ? : }
-
-
{label}
-
- ))}
-
-
+
+
+
No black boxes. No lock-in.
+
Your data stack should stay yours.
+
+
+ Deploy anywhere. Customize everything.
-
-
-
-
-
-
+
+
);
}
diff --git a/app/api/waitlist/route.ts b/app/api/waitlist/route.ts
new file mode 100644
index 0000000..ca42b0e
--- /dev/null
+++ b/app/api/waitlist/route.ts
@@ -0,0 +1,38 @@
+import { NextResponse } from 'next/server';
+
+export async function POST(request: Request) {
+ try {
+ const body = await request.json();
+ const email = String(body?.email || '').trim();
+ const thoughts = String(body?.thoughts || '').trim();
+
+ if (!email || !thoughts) {
+ return NextResponse.json(
+ { message: 'Email and thoughts are required.' },
+ { status: 400 },
+ );
+ }
+
+ const isEmailValid = /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email);
+ if (!isEmailValid) {
+ return NextResponse.json({ message: 'Please provide a valid email.' }, { status: 400 });
+ }
+
+ if (thoughts.length < 10) {
+ return NextResponse.json(
+ { message: 'Please share a bit more detail in your thoughts.' },
+ { status: 400 },
+ );
+ }
+
+ console.log('[waitlist]', {
+ email,
+ thoughts,
+ createdAt: new Date().toISOString(),
+ });
+
+ return NextResponse.json({ ok: true, message: 'Added to waitlist.' }, { status: 200 });
+ } catch {
+ return NextResponse.json({ message: 'Invalid request body.' }, { status: 400 });
+ }
+}
diff --git a/app/docs/[[...slug]]/page.tsx b/app/docs/[[...slug]]/page.tsx
index db990ca..1e1073e 100644
--- a/app/docs/[[...slug]]/page.tsx
+++ b/app/docs/[[...slug]]/page.tsx
@@ -18,13 +18,20 @@ export default async function Page(props: {
const MDX = page.data.body;
return (
-
- {page.data.title}
- {page.data.description}
-
-
-
-
+
+
+
Documentation
+
Learn. Build. Ship faster with Dcup.
+
+
+
+ {page.data.title}
+ {page.data.description}
+
+
+
+
+
);
}
diff --git a/app/global.css b/app/global.css
index d1dfe11..5141aa0 100644
--- a/app/global.css
+++ b/app/global.css
@@ -90,3 +90,25 @@
.animate-pulse {
animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
}
+
+@keyframes fadeSlideIn {
+ from {
+ opacity: 0;
+ transform: translateY(18px);
+ }
+ to {
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
+
+@keyframes floatIn {
+ from {
+ opacity: 0;
+ transform: translateY(20px) scale(0.98);
+ }
+ to {
+ opacity: 1;
+ transform: translateY(0) scale(1);
+ }
+}
diff --git a/app/layout.config.tsx b/app/layout.config.tsx
index d9cf3d8..e599c81 100644
--- a/app/layout.config.tsx
+++ b/app/layout.config.tsx
@@ -3,29 +3,25 @@ import type { BaseLayoutProps } from 'fumadocs-ui/layouts/shared';
/**
* Shared layout configurations
- *
- * you can configure layouts individually from:
- * Home Layout: app/(home)/layout.tsx
- * Docs Layout: app/docs/layout.tsx
*/
export const baseOptions: BaseLayoutProps = {
nav: {
enableSearch: true,
- enabled: false,
- transparentMode: "always",
- children:
+ enabled: true,
+ transparentMode: 'top',
+ children:
,
},
links: [
{
- text: 'Documentation',
+ text: 'Docs',
url: '/docs',
active: 'nested-url',
},
{
- text: "Blogs",
+ text: 'Blog',
url: '/blog',
- active: 'nested-url'
- }
+ active: 'nested-url',
+ },
],
- disableThemeSwitch: true
+ disableThemeSwitch: true,
};
diff --git a/components/Navbar/Navbar.tsx b/components/Navbar/Navbar.tsx
index bbb9425..fade4a3 100644
--- a/components/Navbar/Navbar.tsx
+++ b/components/Navbar/Navbar.tsx
@@ -1,115 +1,110 @@
-import Link from "next/link";
-import { Button } from "@/components/ui/button";
-import { ArrowRight, Menu } from "lucide-react";
+import Link from 'next/link';
+import { Button } from '@/components/ui/button';
+import { ArrowRight, Menu, Sparkles } from 'lucide-react';
import {
Sheet,
SheetContent,
SheetHeader,
SheetTitle,
SheetTrigger,
-} from "@/components/ui/sheet"
-import { Logo } from "../Logo/logo";
-import { SearchBox } from "../Search/Search";
-import { FaGithub } from "react-icons/fa";
-
+} from '@/components/ui/sheet';
+import { Logo } from '../Logo/logo';
+import { SearchBox } from '../Search/Search';
+import { FaGithub } from 'react-icons/fa';
export function Navbar() {
const navLinks = [
- { name: "Docs", href: "/docs" },
- { name: "Blogs", href: "/blog" },
- { name: "Contact", href: "/contact" },
- { name: "Terms of Service", href: "/terms_of_service_and_privacy_policy" }
+ { name: 'Docs', href: '/docs' },
+ { name: 'Blog', href: '/blog' },
+ { name: 'Contact', href: '/contact' },
+ { name: 'Terms', href: '/terms_of_service_and_privacy_policy' },
];
return (
-