Spaces:
Running
Running
remove /deepsite
Browse files- app/(public)/signin/page.tsx +1 -1
- app/[owner]/[repoId]/page.tsx +1 -1
- app/api/projects/route.ts +1 -1
- app/layout.tsx +5 -5
- app/new/page.tsx +1 -1
- components/ask-ai/redesign.tsx +1 -1
- components/ask-ai/useGeneration.ts +2 -2
- components/editor/project-settings.tsx +1 -1
- components/not-authorized.tsx +3 -3
- components/projects/big-project-card.tsx +1 -1
- components/projects/project-card.tsx +1 -1
- components/providers/session.tsx +1 -1
- components/public/bento.tsx +70 -45
- components/public/navigation.tsx +1 -1
- components/user-menu/index.tsx +4 -4
- components/viewer/blank-page.tsx +1 -1
- lib/auth.ts +1 -1
- lib/seo.ts +5 -5
- lib/utils.ts +2 -2
- next.config.ts +0 -12
- public/deepsite-badge.js +3 -3
- public/robots.txt +1 -1
app/(public)/signin/page.tsx
CHANGED
|
@@ -14,7 +14,7 @@ export default async function SignInPage({
|
|
| 14 |
<p className="text-lg text-muted-foreground mb-8">
|
| 15 |
You can't access this resource without being signed in.
|
| 16 |
</p>
|
| 17 |
-
<LoginButtons callbackUrl={callbackUrl ?? "/
|
| 18 |
</div>
|
| 19 |
</section>
|
| 20 |
);
|
|
|
|
| 14 |
<p className="text-lg text-muted-foreground mb-8">
|
| 15 |
You can't access this resource without being signed in.
|
| 16 |
</p>
|
| 17 |
+
<LoginButtons callbackUrl={callbackUrl ?? "/"} />
|
| 18 |
</div>
|
| 19 |
</section>
|
| 20 |
);
|
app/[owner]/[repoId]/page.tsx
CHANGED
|
@@ -16,7 +16,7 @@ export default async function ProjectPage({
|
|
| 16 |
const { commit } = await searchParams;
|
| 17 |
if (!session) {
|
| 18 |
redirect(
|
| 19 |
-
`/api/auth/signin?callbackUrl
|
| 20 |
commit ? `?commit=${commit}` : ""
|
| 21 |
}`
|
| 22 |
);
|
|
|
|
| 16 |
const { commit } = await searchParams;
|
| 17 |
if (!session) {
|
| 18 |
redirect(
|
| 19 |
+
`/api/auth/signin?callbackUrl=/${owner}/${repoId}${
|
| 20 |
commit ? `?commit=${commit}` : ""
|
| 21 |
}`
|
| 22 |
);
|
app/api/projects/route.ts
CHANGED
|
@@ -74,7 +74,7 @@ tags:
|
|
| 74 |
|
| 75 |
# ${escapeMarkdownHeader(title)}
|
| 76 |
|
| 77 |
-
This project has been created with [DeepSite](https://
|
| 78 |
`;
|
| 79 |
|
| 80 |
const filesToUpload: File[] = [
|
|
|
|
| 74 |
|
| 75 |
# ${escapeMarkdownHeader(title)}
|
| 76 |
|
| 77 |
+
This project has been created with [DeepSite](https://deepsite.hf.co) AI Vibe Coding.
|
| 78 |
`;
|
| 79 |
|
| 80 |
const filesToUpload: File[] = [
|
app/layout.tsx
CHANGED
|
@@ -34,9 +34,9 @@ export const metadata: Metadata = {
|
|
| 34 |
statusBarStyle: "black-translucent",
|
| 35 |
},
|
| 36 |
icons: {
|
| 37 |
-
icon: "/
|
| 38 |
-
shortcut: "/
|
| 39 |
-
apple: "/
|
| 40 |
},
|
| 41 |
verification: {
|
| 42 |
google: process.env.GOOGLE_SITE_VERIFICATION,
|
|
@@ -57,11 +57,11 @@ export default async function RootLayout({
|
|
| 57 |
const structuredData = generateStructuredData("WebApplication", {
|
| 58 |
name: "DeepSite",
|
| 59 |
description: "Build websites with AI, no code required",
|
| 60 |
-
url: "https://
|
| 61 |
});
|
| 62 |
const organizationData = generateStructuredData("Organization", {
|
| 63 |
name: "DeepSite",
|
| 64 |
-
url: "https://
|
| 65 |
});
|
| 66 |
|
| 67 |
return (
|
|
|
|
| 34 |
statusBarStyle: "black-translucent",
|
| 35 |
},
|
| 36 |
icons: {
|
| 37 |
+
icon: "/logo.svg",
|
| 38 |
+
shortcut: "/logo.svg",
|
| 39 |
+
apple: "/logo.svg",
|
| 40 |
},
|
| 41 |
verification: {
|
| 42 |
google: process.env.GOOGLE_SITE_VERIFICATION,
|
|
|
|
| 57 |
const structuredData = generateStructuredData("WebApplication", {
|
| 58 |
name: "DeepSite",
|
| 59 |
description: "Build websites with AI, no code required",
|
| 60 |
+
url: "https://deepsite.hf.co",
|
| 61 |
});
|
| 62 |
const organizationData = generateStructuredData("Organization", {
|
| 63 |
name: "DeepSite",
|
| 64 |
+
url: "https://deepsite.hf.co",
|
| 65 |
});
|
| 66 |
|
| 67 |
return (
|
app/new/page.tsx
CHANGED
|
@@ -10,7 +10,7 @@ export default async function NewProjectPage({
|
|
| 10 |
const session = await auth();
|
| 11 |
|
| 12 |
if (!session) {
|
| 13 |
-
redirect("/api/auth/signin?callbackUrl=/
|
| 14 |
}
|
| 15 |
|
| 16 |
const { prompt } = await searchParams;
|
|
|
|
| 10 |
const session = await auth();
|
| 11 |
|
| 12 |
if (!session) {
|
| 13 |
+
redirect("/api/auth/signin?callbackUrl=/new");
|
| 14 |
}
|
| 15 |
|
| 16 |
const { prompt } = await searchParams;
|
components/ask-ai/redesign.tsx
CHANGED
|
@@ -41,7 +41,7 @@ export function Redesign({
|
|
| 41 |
return;
|
| 42 |
}
|
| 43 |
setIsLoading(true);
|
| 44 |
-
const response = await fetch("/
|
| 45 |
method: "PUT",
|
| 46 |
body: JSON.stringify({ url: url.trim() }),
|
| 47 |
headers: {
|
|
|
|
| 41 |
return;
|
| 42 |
}
|
| 43 |
setIsLoading(true);
|
| 44 |
+
const response = await fetch("/api/redesign", {
|
| 45 |
method: "PUT",
|
| 46 |
body: JSON.stringify({ url: url.trim() }),
|
| 47 |
headers: {
|
components/ask-ai/useGeneration.ts
CHANGED
|
@@ -140,7 +140,7 @@ export const useGeneration = (projectName: string) => {
|
|
| 140 |
],
|
| 141 |
});
|
| 142 |
try {
|
| 143 |
-
const response = await fetch("/
|
| 144 |
method: "POST",
|
| 145 |
body: JSON.stringify({
|
| 146 |
projectTitle,
|
|
@@ -234,7 +234,7 @@ export const useGeneration = (projectName: string) => {
|
|
| 234 |
const isFollowUp = files?.length > 0;
|
| 235 |
abortController.current = new AbortController();
|
| 236 |
|
| 237 |
-
const request = await fetch("/
|
| 238 |
method: "POST",
|
| 239 |
body: JSON.stringify({
|
| 240 |
prompt,
|
|
|
|
| 140 |
],
|
| 141 |
});
|
| 142 |
try {
|
| 143 |
+
const response = await fetch("/api/projects", {
|
| 144 |
method: "POST",
|
| 145 |
body: JSON.stringify({
|
| 146 |
projectTitle,
|
|
|
|
| 234 |
const isFollowUp = files?.length > 0;
|
| 235 |
abortController.current = new AbortController();
|
| 236 |
|
| 237 |
+
const request = await fetch("/api/ask", {
|
| 238 |
method: "POST",
|
| 239 |
body: JSON.stringify({
|
| 240 |
prompt,
|
components/editor/project-settings.tsx
CHANGED
|
@@ -98,7 +98,7 @@ export const ProjectSettings = ({
|
|
| 98 |
<span className="text-3xl">{project?.cardData?.emoji}</span>
|
| 99 |
) : (
|
| 100 |
<Image
|
| 101 |
-
src="/
|
| 102 |
alt="DeepSite"
|
| 103 |
width={100}
|
| 104 |
height={100}
|
|
|
|
| 98 |
<span className="text-3xl">{project?.cardData?.emoji}</span>
|
| 99 |
) : (
|
| 100 |
<Image
|
| 101 |
+
src="/logo.svg"
|
| 102 |
alt="DeepSite"
|
| 103 |
width={100}
|
| 104 |
height={100}
|
components/not-authorized.tsx
CHANGED
|
@@ -19,7 +19,7 @@ export const NotAuthorizedDomain = () => {
|
|
| 19 |
host === "huggingface.co" ||
|
| 20 |
host === "hf.co" ||
|
| 21 |
host === "enzostvs-deepsite.hf.space" ||
|
| 22 |
-
host === "
|
| 23 |
);
|
| 24 |
};
|
| 25 |
|
|
@@ -104,7 +104,7 @@ export const NotAuthorizedDomain = () => {
|
|
| 104 |
<DialogTitle className="hidden" />
|
| 105 |
<div className="max-w-md mx-auto text-center px-6 py-12">
|
| 106 |
<Image
|
| 107 |
-
src="/
|
| 108 |
alt="DeepSite"
|
| 109 |
width={48}
|
| 110 |
height={48}
|
|
@@ -122,7 +122,7 @@ export const NotAuthorizedDomain = () => {
|
|
| 122 |
.
|
| 123 |
</p>
|
| 124 |
|
| 125 |
-
<Link href="https://
|
| 126 |
<Button size="lg" className="text-base!">
|
| 127 |
Go to DeepSite
|
| 128 |
</Button>
|
|
|
|
| 19 |
host === "huggingface.co" ||
|
| 20 |
host === "hf.co" ||
|
| 21 |
host === "enzostvs-deepsite.hf.space" ||
|
| 22 |
+
host === "deepsite.hf.co"
|
| 23 |
);
|
| 24 |
};
|
| 25 |
|
|
|
|
| 104 |
<DialogTitle className="hidden" />
|
| 105 |
<div className="max-w-md mx-auto text-center px-6 py-12">
|
| 106 |
<Image
|
| 107 |
+
src="/logo.svg"
|
| 108 |
alt="DeepSite"
|
| 109 |
width={48}
|
| 110 |
height={48}
|
|
|
|
| 122 |
.
|
| 123 |
</p>
|
| 124 |
|
| 125 |
+
<Link href="https://deepsite.hf.co" target="_blank">
|
| 126 |
<Button size="lg" className="text-base!">
|
| 127 |
Go to DeepSite
|
| 128 |
</Button>
|
components/projects/big-project-card.tsx
CHANGED
|
@@ -33,7 +33,7 @@ export function BigProjectCard({
|
|
| 33 |
onOpenDeleteDialog: (id: string) => void;
|
| 34 |
}) {
|
| 35 |
return (
|
| 36 |
-
<a href={
|
| 37 |
<div className="group/big-card rounded-lg overflow-hidden transition-all border-2 border-background ring-[1px] ring-border relative">
|
| 38 |
{project.private ? (
|
| 39 |
<div className="h-40 bg-linear-to-br flex flex-col gap-1 items-center justify-center text-lg from-blue-500 to-purple-500">
|
|
|
|
| 33 |
onOpenDeleteDialog: (id: string) => void;
|
| 34 |
}) {
|
| 35 |
return (
|
| 36 |
+
<a href={`/${project.name}`} className="">
|
| 37 |
<div className="group/big-card rounded-lg overflow-hidden transition-all border-2 border-background ring-[1px] ring-border relative">
|
| 38 |
{project.private ? (
|
| 39 |
<div className="h-40 bg-linear-to-br flex flex-col gap-1 items-center justify-center text-lg from-blue-500 to-purple-500">
|
components/projects/project-card.tsx
CHANGED
|
@@ -11,7 +11,7 @@ import { SpaceEntry } from "@huggingface/hub";
|
|
| 11 |
|
| 12 |
export function ProjectCard({ project }: { project: SpaceEntry }) {
|
| 13 |
return (
|
| 14 |
-
<a href={
|
| 15 |
<div className="flex items-center justify-start gap-3 border-2 border-background ring-[1px] ring-border rounded-lg overflow-hidden transition-all hover:bg-accent">
|
| 16 |
<div
|
| 17 |
className={`size-10 bg-linear-to-br flex items-center justify-center text-lg from-${
|
|
|
|
| 11 |
|
| 12 |
export function ProjectCard({ project }: { project: SpaceEntry }) {
|
| 13 |
return (
|
| 14 |
+
<a href={`/${project.name}`}>
|
| 15 |
<div className="flex items-center justify-start gap-3 border-2 border-background ring-[1px] ring-border rounded-lg overflow-hidden transition-all hover:bg-accent">
|
| 16 |
<div
|
| 17 |
className={`size-10 bg-linear-to-br flex items-center justify-center text-lg from-${
|
components/providers/session.tsx
CHANGED
|
@@ -4,6 +4,6 @@ import { SessionProvider } from "next-auth/react";
|
|
| 4 |
|
| 5 |
export function AuthProvider({ children }: { children: React.ReactNode }) {
|
| 6 |
return (
|
| 7 |
-
<SessionProvider
|
| 8 |
);
|
| 9 |
}
|
|
|
|
| 4 |
|
| 5 |
export function AuthProvider({ children }: { children: React.ReactNode }) {
|
| 6 |
return (
|
| 7 |
+
<SessionProvider>{children}</SessionProvider>
|
| 8 |
);
|
| 9 |
}
|
components/public/bento.tsx
CHANGED
|
@@ -1,137 +1,162 @@
|
|
|
|
|
|
|
|
| 1 |
export const Bento = () => {
|
| 2 |
return (
|
| 3 |
<section id="features" className="min-h-screen py-20 px-6 relative">
|
| 4 |
-
|
| 5 |
-
|
|
|
|
| 6 |
Powerful Features 🚀
|
| 7 |
</div>
|
| 8 |
-
<h2 className="mb-3 text-balance text-3xl font-bold tracking-tight lg:text-5xl">
|
| 9 |
Everything you need
|
| 10 |
</h2>
|
| 11 |
-
<p className="text-muted-foreground mx-auto max-w-2xl md:text-lg lg:text-xl text-balance">
|
| 12 |
Build, deploy, and scale your websites with cutting-edge features
|
| 13 |
</p>
|
| 14 |
</header>
|
| 15 |
|
|
|
|
| 16 |
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6 max-w-7xl mx-auto">
|
| 17 |
-
|
|
|
|
| 18 |
<div className="relative z-10">
|
| 19 |
-
<div className="text-3xl lg:text-4xl mb-4"
|
| 20 |
-
|
|
|
|
|
|
|
| 21 |
Multi Pages
|
| 22 |
</h3>
|
| 23 |
-
<p className="text-muted-foreground lg:text-lg mb-6">
|
| 24 |
Create complex websites with multiple interconnected pages. Build
|
| 25 |
everything from simple landing pages to full-featured web
|
| 26 |
applications with dynamic routing and navigation.
|
| 27 |
</p>
|
| 28 |
<div className="flex flex-wrap gap-2">
|
| 29 |
-
<span className="px-3 py-1 bg-purple-500/
|
| 30 |
Dynamic Routing
|
| 31 |
</span>
|
| 32 |
-
<span className="px-3 py-1 bg-blue-500/
|
| 33 |
Navigation
|
| 34 |
</span>
|
| 35 |
-
<span className="px-3 py-1 bg-green-500/
|
| 36 |
SEO Ready
|
| 37 |
</span>
|
| 38 |
</div>
|
| 39 |
</div>
|
| 40 |
-
|
| 41 |
</div>
|
| 42 |
|
| 43 |
-
|
|
|
|
| 44 |
<div className="relative z-10">
|
| 45 |
-
<div className="text-3xl mb-4"
|
| 46 |
-
|
|
|
|
|
|
|
| 47 |
Auto Deploy
|
| 48 |
</h3>
|
| 49 |
-
<p className="text-muted-foreground mb-4">
|
| 50 |
Push your changes and watch them go live instantly. No complex
|
| 51 |
CI/CD setup required.
|
| 52 |
</p>
|
| 53 |
</div>
|
| 54 |
-
|
| 55 |
</div>
|
| 56 |
|
| 57 |
-
|
|
|
|
| 58 |
<div className="relative z-10">
|
| 59 |
-
<div className="text-3xl mb-4"
|
| 60 |
-
|
|
|
|
|
|
|
| 61 |
Free Hosting
|
| 62 |
</h3>
|
| 63 |
-
<p className="text-muted-foreground mb-4">
|
| 64 |
Host your websites for free with global CDN and lightning-fast
|
| 65 |
performance.
|
| 66 |
</p>
|
| 67 |
</div>
|
| 68 |
-
|
| 69 |
</div>
|
| 70 |
|
| 71 |
-
|
|
|
|
| 72 |
<div className="relative z-10">
|
| 73 |
-
<div className="text-3xl mb-4"
|
| 74 |
-
|
|
|
|
|
|
|
| 75 |
Open Source Models
|
| 76 |
</h3>
|
| 77 |
-
<p className="text-muted-foreground mb-4">
|
| 78 |
Powered by cutting-edge open source AI models. Transparent,
|
| 79 |
customizable, and community-driven development.
|
| 80 |
</p>
|
| 81 |
<div className="flex flex-wrap gap-2">
|
| 82 |
-
<span className="px-3 py-1 bg-cyan-500/
|
| 83 |
DeepSeek
|
| 84 |
</span>
|
| 85 |
-
<span className="px-3 py-1 bg-indigo-500/
|
| 86 |
MiniMax
|
| 87 |
</span>
|
| 88 |
-
<span className="px-3 py-1 bg-pink-500/
|
| 89 |
Kimi
|
| 90 |
</span>
|
| 91 |
</div>
|
| 92 |
</div>
|
| 93 |
-
|
| 94 |
</div>
|
| 95 |
|
| 96 |
-
|
|
|
|
| 97 |
<div className="relative z-10">
|
| 98 |
-
<div className="text-3xl mb-4"
|
| 99 |
-
|
|
|
|
|
|
|
| 100 |
Perfect UX
|
| 101 |
</h3>
|
| 102 |
-
<p className="text-muted-foreground mb-4">
|
| 103 |
Intuitive interface designed for developers and non-developers
|
| 104 |
alike.
|
| 105 |
</p>
|
| 106 |
</div>
|
| 107 |
-
|
| 108 |
</div>
|
| 109 |
|
| 110 |
-
|
|
|
|
| 111 |
<div className="relative z-10">
|
| 112 |
-
<div className="text-3xl mb-4"
|
| 113 |
-
|
|
|
|
|
|
|
| 114 |
Hugging Face
|
| 115 |
</h3>
|
| 116 |
-
<p className="text-muted-foreground mb-4">
|
| 117 |
Seamless integration with Hugging Face models and datasets for
|
| 118 |
cutting-edge AI capabilities.
|
| 119 |
</p>
|
| 120 |
</div>
|
| 121 |
-
|
| 122 |
</div>
|
| 123 |
|
| 124 |
-
|
|
|
|
| 125 |
<div className="relative z-10">
|
| 126 |
-
<div className="text-3xl mb-4"
|
| 127 |
-
|
|
|
|
|
|
|
| 128 |
Blazing Fast
|
| 129 |
</h3>
|
| 130 |
-
<p className="text-muted-foreground mb-4">
|
| 131 |
Optimized performance with edge computing and smart caching.
|
| 132 |
</p>
|
| 133 |
</div>
|
| 134 |
-
|
| 135 |
</div>
|
| 136 |
</div>
|
| 137 |
</section>
|
|
|
|
| 1 |
+
"use client";
|
| 2 |
+
|
| 3 |
export const Bento = () => {
|
| 4 |
return (
|
| 5 |
<section id="features" className="min-h-screen py-20 px-6 relative">
|
| 6 |
+
{/* Header with fade-in animation */}
|
| 7 |
+
<header className="text-center mb-16 animate-in fade-in duration-700">
|
| 8 |
+
<div className="w-fit mb-2 text-[11px] mx-auto uppercase text-muted-foreground/70 font-semibold tracking-widest animate-in fade-in slide-in-from-top-2 duration-500">
|
| 9 |
Powerful Features 🚀
|
| 10 |
</div>
|
| 11 |
+
<h2 className="mb-3 text-balance text-3xl font-bold tracking-tight lg:text-5xl animate-in fade-in slide-in-from-top-3 duration-700 delay-100">
|
| 12 |
Everything you need
|
| 13 |
</h2>
|
| 14 |
+
<p className="text-muted-foreground mx-auto max-w-2xl md:text-lg lg:text-xl text-balance animate-in fade-in slide-in-from-top-4 duration-700 delay-200">
|
| 15 |
Build, deploy, and scale your websites with cutting-edge features
|
| 16 |
</p>
|
| 17 |
</header>
|
| 18 |
|
| 19 |
+
{/* Grid with staggered card animations */}
|
| 20 |
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6 max-w-7xl mx-auto">
|
| 21 |
+
{/* Multi Pages - Large Card */}
|
| 22 |
+
<div className="max-md:col-span-1 max-lg:col-span-2 lg:row-span-2 relative p-8 rounded-2xl border border-border/80 shadow-2xs bg-linear-to-b from-background to-background/50 bg-card overflow-hidden group hover:border-primary/30 hover:shadow-lg hover:-translate-y-1 transition-all duration-500 animate-in fade-in slide-in-from-bottom-4 delay-100">
|
| 23 |
<div className="relative z-10">
|
| 24 |
+
<div className="text-3xl lg:text-4xl mb-4 inline-block transition-transform duration-300 group-hover:scale-110 group-hover:rotate-3">
|
| 25 |
+
📄
|
| 26 |
+
</div>
|
| 27 |
+
<h3 className="text-2xl lg:text-3xl font-bold text-primary mb-3 transition-colors duration-300">
|
| 28 |
Multi Pages
|
| 29 |
</h3>
|
| 30 |
+
<p className="text-muted-foreground lg:text-lg mb-6 transition-colors duration-300 group-hover:text-foreground/90">
|
| 31 |
Create complex websites with multiple interconnected pages. Build
|
| 32 |
everything from simple landing pages to full-featured web
|
| 33 |
applications with dynamic routing and navigation.
|
| 34 |
</p>
|
| 35 |
<div className="flex flex-wrap gap-2">
|
| 36 |
+
<span className="px-3 py-1.5 bg-purple-500/30 text-purple-200 border border-purple-400/40 rounded-md text-xs font-medium shadow-[inset_0_1px_0_0_rgba(255,255,255,0.1)] transition-all duration-200 hover:bg-purple-500/40 hover:border-purple-400/60 hover:shadow-[inset_0_1px_0_0_rgba(255,255,255,0.15),0_2px_4px_rgba(0,0,0,0.2)] hover:-translate-y-0.5 active:translate-y-0 active:shadow-[inset_0_2px_4px_rgba(0,0,0,0.2)]">
|
| 37 |
Dynamic Routing
|
| 38 |
</span>
|
| 39 |
+
<span className="px-3 py-1.5 bg-blue-500/30 text-blue-200 border border-blue-400/40 rounded-md text-xs font-medium shadow-[inset_0_1px_0_0_rgba(255,255,255,0.1)] transition-all duration-200 hover:bg-blue-500/40 hover:border-blue-400/60 hover:shadow-[inset_0_1px_0_0_rgba(255,255,255,0.15),0_2px_4px_rgba(0,0,0,0.2)] hover:-translate-y-0.5 active:translate-y-0 active:shadow-[inset_0_2px_4px_rgba(0,0,0,0.2)]">
|
| 40 |
Navigation
|
| 41 |
</span>
|
| 42 |
+
<span className="px-3 py-1.5 bg-green-500/30 text-green-200 border border-green-400/40 rounded-md text-xs font-medium shadow-[inset_0_1px_0_0_rgba(255,255,255,0.1)] transition-all duration-200 hover:bg-green-500/40 hover:border-green-400/60 hover:shadow-[inset_0_1px_0_0_rgba(255,255,255,0.15),0_2px_4px_rgba(0,0,0,0.2)] hover:-translate-y-0.5 active:translate-y-0 active:shadow-[inset_0_2px_4px_rgba(0,0,0,0.2)]">
|
| 43 |
SEO Ready
|
| 44 |
</span>
|
| 45 |
</div>
|
| 46 |
</div>
|
| 47 |
+
<div className="absolute -top-20 -right-20 w-40 h-40 bg-linear-to-r from-purple-500 to-pink-500 opacity-10 blur-3xl rounded-full transition-all duration-700 ease-out group-hover:scale-150 group-hover:opacity-20" />
|
| 48 |
</div>
|
| 49 |
|
| 50 |
+
{/* Auto Deploy */}
|
| 51 |
+
<div className="relative p-8 rounded-2xl border border-border/80 shadow-2xs bg-linear-to-b from-background to-background/50 bg-card overflow-hidden group hover:border-primary/30 hover:shadow-lg hover:-translate-y-1 transition-all duration-500 animate-in fade-in slide-in-from-bottom-4 delay-200">
|
| 52 |
<div className="relative z-10">
|
| 53 |
+
<div className="text-3xl mb-4 inline-block transition-transform duration-300 group-hover:scale-110 group-hover:rotate-12">
|
| 54 |
+
⚡
|
| 55 |
+
</div>
|
| 56 |
+
<h3 className="text-xl lg:text-2xl font-bold text-primary mb-3 transition-colors duration-300">
|
| 57 |
Auto Deploy
|
| 58 |
</h3>
|
| 59 |
+
<p className="text-muted-foreground mb-4 transition-colors duration-300 group-hover:text-foreground/90">
|
| 60 |
Push your changes and watch them go live instantly. No complex
|
| 61 |
CI/CD setup required.
|
| 62 |
</p>
|
| 63 |
</div>
|
| 64 |
+
<div className="absolute -bottom-10 -right-10 w-32 h-32 bg-linear-to-r from-yellow-500 to-orange-500 opacity-10 blur-2xl rounded-full transition-all duration-700 ease-out group-hover:scale-150 group-hover:opacity-20" />
|
| 65 |
</div>
|
| 66 |
|
| 67 |
+
{/* Free Hosting */}
|
| 68 |
+
<div className="relative p-8 rounded-2xl border border-border/80 shadow-2xs bg-linear-to-b from-background to-background/50 bg-card overflow-hidden group hover:border-primary/30 hover:shadow-lg hover:-translate-y-1 transition-all duration-500 animate-in fade-in slide-in-from-bottom-4 delay-300">
|
| 69 |
<div className="relative z-10">
|
| 70 |
+
<div className="text-3xl mb-4 inline-block transition-transform duration-300 group-hover:scale-110 group-hover:rotate-12">
|
| 71 |
+
🌐
|
| 72 |
+
</div>
|
| 73 |
+
<h3 className="text-xl lg:text-2xl font-bold text-primary mb-3 transition-colors duration-300">
|
| 74 |
Free Hosting
|
| 75 |
</h3>
|
| 76 |
+
<p className="text-muted-foreground mb-4 transition-colors duration-300 group-hover:text-foreground/90">
|
| 77 |
Host your websites for free with global CDN and lightning-fast
|
| 78 |
performance.
|
| 79 |
</p>
|
| 80 |
</div>
|
| 81 |
+
<div className="absolute -top-10 -left-10 w-32 h-32 bg-linear-to-r from-green-500 to-emerald-500 opacity-10 blur-2xl rounded-full transition-all duration-700 ease-out group-hover:scale-150 group-hover:opacity-20" />
|
| 82 |
</div>
|
| 83 |
|
| 84 |
+
{/* Open Source Models */}
|
| 85 |
+
<div className="lg:col-span-2 relative p-8 rounded-2xl border border-border/80 shadow-2xs bg-linear-to-b from-background to-background/50 bg-card overflow-hidden group hover:border-primary/30 hover:shadow-lg hover:-translate-y-1 transition-all duration-500 animate-in fade-in slide-in-from-bottom-4 delay-400">
|
| 86 |
<div className="relative z-10">
|
| 87 |
+
<div className="text-3xl mb-4 inline-block transition-transform duration-300 group-hover:scale-110 group-hover:-rotate-12">
|
| 88 |
+
🔓
|
| 89 |
+
</div>
|
| 90 |
+
<h3 className="text-xl lg:text-2xl font-bold text-primary mb-3 transition-colors duration-300">
|
| 91 |
Open Source Models
|
| 92 |
</h3>
|
| 93 |
+
<p className="text-muted-foreground mb-4 transition-colors duration-300 group-hover:text-foreground/90">
|
| 94 |
Powered by cutting-edge open source AI models. Transparent,
|
| 95 |
customizable, and community-driven development.
|
| 96 |
</p>
|
| 97 |
<div className="flex flex-wrap gap-2">
|
| 98 |
+
<span className="px-3 py-1.5 bg-cyan-500/30 text-cyan-200 border border-cyan-400/40 rounded-md text-xs font-medium shadow-[inset_0_1px_0_0_rgba(255,255,255,0.1)] transition-all duration-200 hover:bg-cyan-500/40 hover:border-cyan-400/60 hover:shadow-[inset_0_1px_0_0_rgba(255,255,255,0.15),0_2px_4px_rgba(0,0,0,0.2)] hover:-translate-y-0.5 active:translate-y-0 active:shadow-[inset_0_2px_4px_rgba(0,0,0,0.2)]">
|
| 99 |
DeepSeek
|
| 100 |
</span>
|
| 101 |
+
<span className="px-3 py-1.5 bg-indigo-500/30 text-indigo-200 border border-indigo-400/40 rounded-md text-xs font-medium shadow-[inset_0_1px_0_0_rgba(255,255,255,0.1)] transition-all duration-200 hover:bg-indigo-500/40 hover:border-indigo-400/60 hover:shadow-[inset_0_1px_0_0_rgba(255,255,255,0.15),0_2px_4px_rgba(0,0,0,0.2)] hover:-translate-y-0.5 active:translate-y-0 active:shadow-[inset_0_2px_4px_rgba(0,0,0,0.2)]">
|
| 102 |
MiniMax
|
| 103 |
</span>
|
| 104 |
+
<span className="px-3 py-1.5 bg-pink-500/30 text-pink-200 border border-pink-400/40 rounded-md text-xs font-medium shadow-[inset_0_1px_0_0_rgba(255,255,255,0.1)] transition-all duration-200 hover:bg-pink-500/40 hover:border-pink-400/60 hover:shadow-[inset_0_1px_0_0_rgba(255,255,255,0.15),0_2px_4px_rgba(0,0,0,0.2)] hover:-translate-y-0.5 active:translate-y-0 active:shadow-[inset_0_2px_4px_rgba(0,0,0,0.2)]">
|
| 105 |
Kimi
|
| 106 |
</span>
|
| 107 |
</div>
|
| 108 |
</div>
|
| 109 |
+
<div className="absolute -bottom-10 right-10 w-32 h-32 bg-linear-to-r from-cyan-500 to-indigo-500 opacity-10 blur-2xl rounded-full transition-all duration-700 ease-out group-hover:scale-150 group-hover:opacity-20" />
|
| 110 |
</div>
|
| 111 |
|
| 112 |
+
{/* Perfect UX */}
|
| 113 |
+
<div className="relative p-8 rounded-2xl border border-border/80 shadow-2xs bg-linear-to-b from-background to-background/50 bg-card overflow-hidden group hover:border-primary/30 hover:shadow-lg hover:-translate-y-1 transition-all duration-500 animate-in fade-in slide-in-from-bottom-4 delay-500">
|
| 114 |
<div className="relative z-10">
|
| 115 |
+
<div className="text-3xl mb-4 inline-block transition-transform duration-300 group-hover:scale-110 group-hover:rotate-12">
|
| 116 |
+
✨
|
| 117 |
+
</div>
|
| 118 |
+
<h3 className="text-xl lg:text-2xl font-bold text-primary mb-3 transition-colors duration-300">
|
| 119 |
Perfect UX
|
| 120 |
</h3>
|
| 121 |
+
<p className="text-muted-foreground mb-4 transition-colors duration-300 group-hover:text-foreground/90">
|
| 122 |
Intuitive interface designed for developers and non-developers
|
| 123 |
alike.
|
| 124 |
</p>
|
| 125 |
</div>
|
| 126 |
+
<div className="absolute -top-10 -right-10 w-32 h-32 bg-linear-to-r from-rose-500 to-pink-500 opacity-10 blur-2xl rounded-full transition-all duration-700 ease-out group-hover:scale-150 group-hover:opacity-20" />
|
| 127 |
</div>
|
| 128 |
|
| 129 |
+
{/* Hugging Face */}
|
| 130 |
+
<div className="relative p-8 rounded-2xl border border-border/80 shadow-2xs bg-linear-to-b from-background to-background/50 bg-card overflow-hidden group hover:border-primary/30 hover:shadow-lg hover:-translate-y-1 transition-all duration-500 animate-in fade-in slide-in-from-bottom-4 delay-[600ms]">
|
| 131 |
<div className="relative z-10">
|
| 132 |
+
<div className="text-3xl mb-4 inline-block transition-transform duration-300 group-hover:scale-110 group-hover:rotate-12">
|
| 133 |
+
🤗
|
| 134 |
+
</div>
|
| 135 |
+
<h3 className="text-xl lg:text-2xl font-bold text-primary mb-3 transition-colors duration-300">
|
| 136 |
Hugging Face
|
| 137 |
</h3>
|
| 138 |
+
<p className="text-muted-foreground mb-4 transition-colors duration-300 group-hover:text-foreground/90">
|
| 139 |
Seamless integration with Hugging Face models and datasets for
|
| 140 |
cutting-edge AI capabilities.
|
| 141 |
</p>
|
| 142 |
</div>
|
| 143 |
+
<div className="absolute -top-10 -right-10 w-32 h-32 bg-linear-to-r from-yellow-500 to-amber-500 opacity-10 blur-2xl rounded-full transition-all duration-700 ease-out group-hover:scale-150 group-hover:opacity-20" />
|
| 144 |
</div>
|
| 145 |
|
| 146 |
+
{/* Blazing Fast */}
|
| 147 |
+
<div className="relative p-8 rounded-2xl border border-border/80 shadow-2xs bg-linear-to-b from-background to-background/50 bg-card overflow-hidden group hover:border-primary/30 hover:shadow-lg hover:-translate-y-1 transition-all duration-500 animate-in fade-in slide-in-from-bottom-4 delay-700">
|
| 148 |
<div className="relative z-10">
|
| 149 |
+
<div className="text-3xl mb-4 inline-block transition-transform duration-300 group-hover:scale-110 group-hover:-rotate-12">
|
| 150 |
+
🚀
|
| 151 |
+
</div>
|
| 152 |
+
<h3 className="text-xl lg:text-2xl font-bold text-primary mb-3 transition-colors duration-300">
|
| 153 |
Blazing Fast
|
| 154 |
</h3>
|
| 155 |
+
<p className="text-muted-foreground mb-4 transition-colors duration-300 group-hover:text-foreground/90">
|
| 156 |
Optimized performance with edge computing and smart caching.
|
| 157 |
</p>
|
| 158 |
</div>
|
| 159 |
+
<div className="absolute -bottom-10 -right-10 w-32 h-32 bg-linear-to-r from-blue-500 to-cyan-500 opacity-10 blur-2xl rounded-full transition-all duration-700 ease-out group-hover:scale-150 group-hover:opacity-20" />
|
| 160 |
</div>
|
| 161 |
</div>
|
| 162 |
</section>
|
components/public/navigation.tsx
CHANGED
|
@@ -10,7 +10,7 @@ export function Navigation() {
|
|
| 10 |
<div className="flex items-center justify-start gap-4">
|
| 11 |
<Link href="/" className="flex items-center gap-2">
|
| 12 |
<Image
|
| 13 |
-
src="/
|
| 14 |
alt="DeepSite"
|
| 15 |
width={100}
|
| 16 |
height={100}
|
|
|
|
| 10 |
<div className="flex items-center justify-start gap-4">
|
| 11 |
<Link href="/" className="flex items-center gap-2">
|
| 12 |
<Image
|
| 13 |
+
src="/logo.svg"
|
| 14 |
alt="DeepSite"
|
| 15 |
width={100}
|
| 16 |
height={100}
|
components/user-menu/index.tsx
CHANGED
|
@@ -42,7 +42,7 @@ export function UserMenu() {
|
|
| 42 |
newUrl.searchParams.delete("signin");
|
| 43 |
window.history.replaceState({}, "", newUrl.toString());
|
| 44 |
|
| 45 |
-
signIn("huggingface", { callbackUrl: "/
|
| 46 |
}
|
| 47 |
}
|
| 48 |
}, [session, status]);
|
|
@@ -50,7 +50,7 @@ export function UserMenu() {
|
|
| 50 |
const handleSignIn = () => {
|
| 51 |
if (window.location.hostname === "localhost") {
|
| 52 |
signIn("huggingface", {
|
| 53 |
-
callbackUrl: "/
|
| 54 |
});
|
| 55 |
return;
|
| 56 |
}
|
|
@@ -78,12 +78,12 @@ export function UserMenu() {
|
|
| 78 |
if (!isOnTargetPage) {
|
| 79 |
window.open(`${targetUrl}?signin=true`, "_blank");
|
| 80 |
} else {
|
| 81 |
-
signIn("huggingface", { callbackUrl: "/
|
| 82 |
}
|
| 83 |
};
|
| 84 |
|
| 85 |
const handleSignOut = () => {
|
| 86 |
-
signOut({ callbackUrl: "/
|
| 87 |
};
|
| 88 |
|
| 89 |
if (isLoading) {
|
|
|
|
| 42 |
newUrl.searchParams.delete("signin");
|
| 43 |
window.history.replaceState({}, "", newUrl.toString());
|
| 44 |
|
| 45 |
+
signIn("huggingface", { callbackUrl: "/" });
|
| 46 |
}
|
| 47 |
}
|
| 48 |
}, [session, status]);
|
|
|
|
| 50 |
const handleSignIn = () => {
|
| 51 |
if (window.location.hostname === "localhost") {
|
| 52 |
signIn("huggingface", {
|
| 53 |
+
callbackUrl: "/",
|
| 54 |
});
|
| 55 |
return;
|
| 56 |
}
|
|
|
|
| 78 |
if (!isOnTargetPage) {
|
| 79 |
window.open(`${targetUrl}?signin=true`, "_blank");
|
| 80 |
} else {
|
| 81 |
+
signIn("huggingface", { callbackUrl: "/" });
|
| 82 |
}
|
| 83 |
};
|
| 84 |
|
| 85 |
const handleSignOut = () => {
|
| 86 |
+
signOut({ callbackUrl: "/" });
|
| 87 |
};
|
| 88 |
|
| 89 |
if (isLoading) {
|
components/viewer/blank-page.tsx
CHANGED
|
@@ -24,7 +24,7 @@ export function BlankPage() {
|
|
| 24 |
<div className="bg-card max-w-lg w-full px-10 py-6 z-1 rounded-xl shadow-accent-foreground mx-auto">
|
| 25 |
<header className="flex flex-col items-center justify-center">
|
| 26 |
<Image
|
| 27 |
-
src="/
|
| 28 |
alt="DeepSite"
|
| 29 |
width={56}
|
| 30 |
height={56}
|
|
|
|
| 24 |
<div className="bg-card max-w-lg w-full px-10 py-6 z-1 rounded-xl shadow-accent-foreground mx-auto">
|
| 25 |
<header className="flex flex-col items-center justify-center">
|
| 26 |
<Image
|
| 27 |
+
src="/logo.svg"
|
| 28 |
alt="DeepSite"
|
| 29 |
width={56}
|
| 30 |
height={56}
|
lib/auth.ts
CHANGED
|
@@ -62,7 +62,7 @@ export const authOptions: NextAuthOptions = {
|
|
| 62 |
},
|
| 63 |
},
|
| 64 |
pages: {
|
| 65 |
-
signIn: "/
|
| 66 |
},
|
| 67 |
secret: process.env.NEXTAUTH_SECRET,
|
| 68 |
};
|
|
|
|
| 62 |
},
|
| 63 |
},
|
| 64 |
pages: {
|
| 65 |
+
signIn: "/signin",
|
| 66 |
},
|
| 67 |
secret: process.env.NEXTAUTH_SECRET,
|
| 68 |
};
|
lib/seo.ts
CHANGED
|
@@ -18,7 +18,7 @@ export function generateSEO({
|
|
| 18 |
noIndex = false,
|
| 19 |
canonical,
|
| 20 |
}: SEOParams = {}): Metadata {
|
| 21 |
-
const baseUrl = "https://
|
| 22 |
const fullUrl = `${baseUrl}${path}`;
|
| 23 |
const canonicalUrl = canonical || fullUrl;
|
| 24 |
|
|
@@ -98,7 +98,7 @@ export function generateStructuredData(
|
|
| 98 |
...baseStructuredData,
|
| 99 |
name: "DeepSite",
|
| 100 |
description: "Build websites with AI, no code required",
|
| 101 |
-
url: "https://
|
| 102 |
applicationCategory: "DeveloperApplication",
|
| 103 |
operatingSystem: "Web",
|
| 104 |
offers: {
|
|
@@ -109,7 +109,7 @@ export function generateStructuredData(
|
|
| 109 |
creator: {
|
| 110 |
"@type": "Organization",
|
| 111 |
name: "DeepSite",
|
| 112 |
-
url: "https://
|
| 113 |
},
|
| 114 |
...data,
|
| 115 |
};
|
|
@@ -118,8 +118,8 @@ export function generateStructuredData(
|
|
| 118 |
return {
|
| 119 |
...baseStructuredData,
|
| 120 |
name: "DeepSite",
|
| 121 |
-
url: "https://
|
| 122 |
-
logo: "https://
|
| 123 |
description: "AI-powered web development platform",
|
| 124 |
sameAs: [
|
| 125 |
// Add social media links here if available
|
|
|
|
| 18 |
noIndex = false,
|
| 19 |
canonical,
|
| 20 |
}: SEOParams = {}): Metadata {
|
| 21 |
+
const baseUrl = "https://deepsite.hf.co";
|
| 22 |
const fullUrl = `${baseUrl}${path}`;
|
| 23 |
const canonicalUrl = canonical || fullUrl;
|
| 24 |
|
|
|
|
| 98 |
...baseStructuredData,
|
| 99 |
name: "DeepSite",
|
| 100 |
description: "Build websites with AI, no code required",
|
| 101 |
+
url: "https://deepsite.hf.co",
|
| 102 |
applicationCategory: "DeveloperApplication",
|
| 103 |
operatingSystem: "Web",
|
| 104 |
offers: {
|
|
|
|
| 109 |
creator: {
|
| 110 |
"@type": "Organization",
|
| 111 |
name: "DeepSite",
|
| 112 |
+
url: "https://deepsite.hf.co",
|
| 113 |
},
|
| 114 |
...data,
|
| 115 |
};
|
|
|
|
| 118 |
return {
|
| 119 |
...baseStructuredData,
|
| 120 |
name: "DeepSite",
|
| 121 |
+
url: "https://deepsite.hf.co",
|
| 122 |
+
logo: "https://deepsite.hf.co/logo.svg",
|
| 123 |
description: "AI-powered web development platform",
|
| 124 |
sameAs: [
|
| 125 |
// Add social media links here if available
|
lib/utils.ts
CHANGED
|
@@ -118,7 +118,7 @@ export const defaultHTML = `<!DOCTYPE html>
|
|
| 118 |
Ask me anything.
|
| 119 |
</h1>
|
| 120 |
</div>
|
| 121 |
-
<img src="https://
|
| 122 |
<script></script>
|
| 123 |
</body>
|
| 124 |
</html>
|
|
@@ -126,7 +126,7 @@ export const defaultHTML = `<!DOCTYPE html>
|
|
| 126 |
|
| 127 |
export function injectDeepSiteBadge(html: string): string {
|
| 128 |
const badgeScript =
|
| 129 |
-
'<script src="https://
|
| 130 |
|
| 131 |
// Remove any existing badge script to avoid duplicates
|
| 132 |
const cleanedHtml = html.replace(
|
|
|
|
| 118 |
Ask me anything.
|
| 119 |
</h1>
|
| 120 |
</div>
|
| 121 |
+
<img src="https://deepsite.hf.co/arrow.svg" class="absolute bottom-8 left-0 w-[100px] transform rotate-30 dark:invert dark:brightness-0" />
|
| 122 |
<script></script>
|
| 123 |
</body>
|
| 124 |
</html>
|
|
|
|
| 126 |
|
| 127 |
export function injectDeepSiteBadge(html: string): string {
|
| 128 |
const badgeScript =
|
| 129 |
+
'<script src="https://deepsite.hf.co/deepsite-badge.js"></script>';
|
| 130 |
|
| 131 |
// Remove any existing badge script to avoid duplicates
|
| 132 |
const cleanedHtml = html.replace(
|
next.config.ts
CHANGED
|
@@ -1,18 +1,6 @@
|
|
| 1 |
import type { NextConfig } from "next";
|
| 2 |
|
| 3 |
const nextConfig: NextConfig = {
|
| 4 |
-
basePath: "/deepsite",
|
| 5 |
-
assetPrefix: "/deepsite",
|
| 6 |
-
async redirects() {
|
| 7 |
-
return [
|
| 8 |
-
{
|
| 9 |
-
source: "/",
|
| 10 |
-
destination: "/deepsite",
|
| 11 |
-
permanent: true,
|
| 12 |
-
basePath: false,
|
| 13 |
-
},
|
| 14 |
-
];
|
| 15 |
-
},
|
| 16 |
experimental: {
|
| 17 |
globalNotFound: true,
|
| 18 |
},
|
|
|
|
| 1 |
import type { NextConfig } from "next";
|
| 2 |
|
| 3 |
const nextConfig: NextConfig = {
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 4 |
experimental: {
|
| 5 |
globalNotFound: true,
|
| 6 |
},
|
public/deepsite-badge.js
CHANGED
|
@@ -9,7 +9,7 @@
|
|
| 9 |
// Don't show badge on huggingface.co/deepsite
|
| 10 |
const hostname = window.location.hostname;
|
| 11 |
const pathname = window.location.pathname;
|
| 12 |
-
if (hostname === "
|
| 13 |
return;
|
| 14 |
}
|
| 15 |
|
|
@@ -80,12 +80,12 @@
|
|
| 80 |
|
| 81 |
// Create link
|
| 82 |
const link = document.createElement("a");
|
| 83 |
-
link.href = "https://
|
| 84 |
link.target = "_blank";
|
| 85 |
link.rel = "noopener noreferrer";
|
| 86 |
|
| 87 |
const icon = document.createElement("img");
|
| 88 |
-
icon.src = "https://
|
| 89 |
icon.alt = "DeepSite";
|
| 90 |
icon.style.marginRight = "6px";
|
| 91 |
icon.style.width = "16px";
|
|
|
|
| 9 |
// Don't show badge on huggingface.co/deepsite
|
| 10 |
const hostname = window.location.hostname;
|
| 11 |
const pathname = window.location.pathname;
|
| 12 |
+
if (hostname === "deepsite.hf.co" && pathname.startsWith("/")) {
|
| 13 |
return;
|
| 14 |
}
|
| 15 |
|
|
|
|
| 80 |
|
| 81 |
// Create link
|
| 82 |
const link = document.createElement("a");
|
| 83 |
+
link.href = "https://deepsite.hf.co";
|
| 84 |
link.target = "_blank";
|
| 85 |
link.rel = "noopener noreferrer";
|
| 86 |
|
| 87 |
const icon = document.createElement("img");
|
| 88 |
+
icon.src = "https://deepsite.hf.co/logo.svg";
|
| 89 |
icon.alt = "DeepSite";
|
| 90 |
icon.style.marginRight = "6px";
|
| 91 |
icon.style.width = "16px";
|
public/robots.txt
CHANGED
|
@@ -11,7 +11,7 @@ Disallow: /assets/
|
|
| 11 |
Allow: /api/public/
|
| 12 |
|
| 13 |
# Sitemap location
|
| 14 |
-
Sitemap: https://
|
| 15 |
|
| 16 |
# Crawl-delay for respectful crawling
|
| 17 |
Crawl-delay: 1
|
|
|
|
| 11 |
Allow: /api/public/
|
| 12 |
|
| 13 |
# Sitemap location
|
| 14 |
+
Sitemap: https://deepsite.hf.co/sitemap.xml
|
| 15 |
|
| 16 |
# Crawl-delay for respectful crawling
|
| 17 |
Crawl-delay: 1
|