Compare commits
No commits in common. "d57bb2e3b9dc92f6707d7e4b4b96c5274d31ec1c" and "ccf44af93f0d9a4920890c11c2b93456ed4eadd8" have entirely different histories.
d57bb2e3b9
...
ccf44af93f
Binary file not shown.
|
Before Width: | Height: | Size: 920 KiB |
|
|
@ -6,7 +6,7 @@ import GlowEffect from './GlowEffect';
|
||||||
import WaitlistPopup from './WaitlistPopup';
|
import WaitlistPopup from './WaitlistPopup';
|
||||||
import { submitEmail, submitWaitlistData } from '@/lib/actions/waitlistActions';
|
import { submitEmail, submitWaitlistData } from '@/lib/actions/waitlistActions';
|
||||||
|
|
||||||
const styles = `
|
export const styles = `
|
||||||
.gradient-text {
|
.gradient-text {
|
||||||
background: linear-gradient(90deg, #818cf8 0%, #c084fc 25%, #f472b6 50%, #c084fc 75%, #818cf8 100%);
|
background: linear-gradient(90deg, #818cf8 0%, #c084fc 25%, #f472b6 50%, #c084fc 75%, #818cf8 100%);
|
||||||
background-size: 200% 100%;
|
background-size: 200% 100%;
|
||||||
|
|
@ -122,9 +122,7 @@ export function HeroSection() {
|
||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<section className="relative pt-20 pb-20 px-6">
|
||||||
<style dangerouslySetInnerHTML={{ __html: styles }} />
|
|
||||||
<section className="relative pt-20 pb-20 px-6">
|
|
||||||
<div className="max-w-4xl mx-auto text-center">
|
<div className="max-w-4xl mx-auto text-center">
|
||||||
<div className="inline-flex items-center gap-2 px-3 py-1 rounded-full bg-white/5 border border-white/10 text-gray-400 text-xs mb-6">
|
<div className="inline-flex items-center gap-2 px-3 py-1 rounded-full bg-white/5 border border-white/10 text-gray-400 text-xs mb-6">
|
||||||
<span className="w-1.5 h-1.5 rounded-full bg-gray-500 beta-dot" />
|
<span className="w-1.5 h-1.5 rounded-full bg-gray-500 beta-dot" />
|
||||||
|
|
@ -210,6 +208,5 @@ export function HeroSection() {
|
||||||
onSubmit={handleWaitlistSubmit}
|
onSubmit={handleWaitlistSubmit}
|
||||||
/>
|
/>
|
||||||
</section>
|
</section>
|
||||||
</>
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,7 @@ function generateZigzagClipPath(yValues: number[]): string {
|
||||||
return `polygon(${topEdge}, ${bottomEdge})`;
|
return `polygon(${topEdge}, ${bottomEdge})`;
|
||||||
}
|
}
|
||||||
|
|
||||||
const styles = `
|
export const styles = `
|
||||||
.shape-future {
|
.shape-future {
|
||||||
clip-path: ${generateZigzagClipPath(ZIGZAG_POINTS)};
|
clip-path: ${generateZigzagClipPath(ZIGZAG_POINTS)};
|
||||||
}
|
}
|
||||||
|
|
@ -43,7 +43,7 @@ const styles = `
|
||||||
}
|
}
|
||||||
|
|
||||||
.shape-future-title {
|
.shape-future-title {
|
||||||
font-family: var(--font-caveat), cursive;
|
font-family: 'Caveat', cursive;
|
||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
|
|
||||||
|
|
@ -55,9 +55,7 @@ const features = [
|
||||||
|
|
||||||
export function ShapeTheFutureSection() {
|
export function ShapeTheFutureSection() {
|
||||||
return (
|
return (
|
||||||
<>
|
<div className="relative my-[60px]">
|
||||||
<style dangerouslySetInnerHTML={{ __html: styles }} />
|
|
||||||
<div className="relative my-[60px]">
|
|
||||||
<section className="shape-future metal-texture bg-[#2a2a2a] relative z-[2]">
|
<section className="shape-future metal-texture bg-[#2a2a2a] relative z-[2]">
|
||||||
<section className="shape-future bg-black absolute w-full h-[500px] top-[-446px] left-[2px] opacity-30 z-[2] " />
|
<section className="shape-future bg-black absolute w-full h-[500px] top-[-446px] left-[2px] opacity-30 z-[2] " />
|
||||||
<div className="absolute h-[200px] w-full blur-sm">
|
<div className="absolute h-[200px] w-full blur-sm">
|
||||||
|
|
@ -89,6 +87,5 @@ export function ShapeTheFutureSection() {
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
</div>
|
</div>
|
||||||
</>
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,12 @@
|
||||||
export { BackgroundBlobs } from './BackgroundBlobs';
|
export { BackgroundBlobs } from './BackgroundBlobs';
|
||||||
export { HeroGlow } from './HeroGlow';
|
export { HeroGlow } from './HeroGlow';
|
||||||
export { HeroSection } from './HeroSection';
|
export { HeroSection, styles as heroStyles } from './HeroSection';
|
||||||
export { ApiExampleSection } from './ApiExampleSection';
|
export { ApiExampleSection } from './ApiExampleSection';
|
||||||
export { ProblemSolutionSection } from './ProblemSolutionSection';
|
export { ProblemSolutionSection } from './ProblemSolutionSection';
|
||||||
export { PromptUrlsSection } from './PromptUrlsSection';
|
export { PromptUrlsSection } from './PromptUrlsSection';
|
||||||
export { HowItWorksSection } from './HowItWorksSection';
|
export { HowItWorksSection } from './HowItWorksSection';
|
||||||
export { KeyFeaturesSection } from './KeyFeaturesSection';
|
export { KeyFeaturesSection } from './KeyFeaturesSection';
|
||||||
export { IntegrationsSection } from './IntegrationsSection';
|
export { IntegrationsSection } from './IntegrationsSection';
|
||||||
export { ShapeTheFutureSection } from './ShapeTheFutureSection';
|
export { ShapeTheFutureSection, styles as shapeFutureStyles } from './ShapeTheFutureSection';
|
||||||
export { GeminiSection } from './GeminiSection';
|
export { GeminiSection } from './GeminiSection';
|
||||||
export { FinalCtaSection } from './FinalCtaSection';
|
export { FinalCtaSection } from './FinalCtaSection';
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
import type { Metadata } from 'next';
|
import type { Metadata } from 'next';
|
||||||
import { Inter, Caveat } from 'next/font/google';
|
import { Inter } from 'next/font/google';
|
||||||
import Image from 'next/image';
|
import Image from 'next/image';
|
||||||
import { Footer } from '@/components/shared/Footer';
|
import { Footer } from '@/components/shared/Footer';
|
||||||
import './globals.css';
|
import './globals.css';
|
||||||
|
|
@ -10,13 +10,6 @@ const inter = Inter({
|
||||||
display: 'swap',
|
display: 'swap',
|
||||||
});
|
});
|
||||||
|
|
||||||
const caveat = Caveat({
|
|
||||||
variable: '--font-caveat',
|
|
||||||
subsets: ['latin'],
|
|
||||||
weight: ['500', '600', '700'],
|
|
||||||
display: 'swap',
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
export default function RootLayout({
|
export default function RootLayout({
|
||||||
children,
|
children,
|
||||||
|
|
@ -29,7 +22,7 @@ export default function RootLayout({
|
||||||
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
||||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossOrigin="anonymous" />
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossOrigin="anonymous" />
|
||||||
</head>
|
</head>
|
||||||
<body className={`${inter.variable} ${caveat.variable} antialiased`}>
|
<body className={`${inter.variable} antialiased`}>
|
||||||
<div className="min-h-screen bg-gradient-to-br from-slate-950 via-slate-900 to-slate-950">
|
<div className="min-h-screen bg-gradient-to-br from-slate-950 via-slate-900 to-slate-950">
|
||||||
{/* Animated gradient background */}
|
{/* Animated gradient background */}
|
||||||
<div className="fixed inset-0 overflow-hidden pointer-events-none">
|
<div className="fixed inset-0 overflow-hidden pointer-events-none">
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@ import {
|
||||||
BackgroundBlobs,
|
BackgroundBlobs,
|
||||||
HeroGlow,
|
HeroGlow,
|
||||||
HeroSection,
|
HeroSection,
|
||||||
|
heroStyles,
|
||||||
ApiExampleSection,
|
ApiExampleSection,
|
||||||
ProblemSolutionSection,
|
ProblemSolutionSection,
|
||||||
PromptUrlsSection,
|
PromptUrlsSection,
|
||||||
|
|
@ -9,44 +10,39 @@ import {
|
||||||
KeyFeaturesSection,
|
KeyFeaturesSection,
|
||||||
IntegrationsSection,
|
IntegrationsSection,
|
||||||
ShapeTheFutureSection,
|
ShapeTheFutureSection,
|
||||||
|
shapeFutureStyles,
|
||||||
GeminiSection,
|
GeminiSection,
|
||||||
FinalCtaSection,
|
FinalCtaSection,
|
||||||
} from './_components';
|
} from './_components';
|
||||||
|
|
||||||
import type { Metadata, Viewport } from 'next';
|
import type { Metadata, Viewport } from 'next'
|
||||||
|
|
||||||
export const viewport: Viewport = {
|
export const viewport: Viewport = {
|
||||||
themeColor: '#0a0a0f',
|
themeColor: '#0a0a0f',
|
||||||
};
|
}
|
||||||
|
|
||||||
export const metadata: Metadata = {
|
export const metadata: Metadata = {
|
||||||
title: 'AI Image Generation Inside Your Workflow | Banatie',
|
title: 'AI Image Generation Inside Your Workflow | Banatie',
|
||||||
description:
|
description: 'Generate production-ready images via API, SDK, CLI, or live URLs. Built-in CDN delivery, style references, and prompt enhancement. Built for developers.',
|
||||||
'Generate production-ready images via API, SDK, CLI, or live URLs. Built-in CDN delivery, style references, and prompt enhancement. Built for developers.',
|
keywords: ['API-first image generation', 'AI image API', 'image generation for developers', 'prompt to image API', 'CDN image delivery'],
|
||||||
keywords: [
|
|
||||||
'API-first image generation',
|
|
||||||
'AI image API',
|
|
||||||
'image generation for developers',
|
|
||||||
'prompt to image API',
|
|
||||||
'CDN image delivery',
|
|
||||||
],
|
|
||||||
authors: [{ name: 'Banatie' }],
|
authors: [{ name: 'Banatie' }],
|
||||||
robots: 'index, follow',
|
robots: 'index, follow',
|
||||||
|
|
||||||
|
// Canonical & Alternates
|
||||||
alternates: {
|
alternates: {
|
||||||
canonical: 'https://banatie.app',
|
canonical: 'https://banatie.app',
|
||||||
languages: {
|
languages: {
|
||||||
en: 'https://banatie.app',
|
'en': 'https://banatie.app',
|
||||||
'x-default': 'https://banatie.app',
|
'x-default': 'https://banatie.app',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// Open Graph
|
||||||
openGraph: {
|
openGraph: {
|
||||||
type: 'website',
|
type: 'website',
|
||||||
url: 'https://banatie.app',
|
url: 'https://banatie.app',
|
||||||
title: 'AI Image Generation Inside Your Workflow | Banatie',
|
title: 'AI Image Generation Inside Your Workflow | Banatie',
|
||||||
description:
|
description: 'Generate production-ready images via API, SDK, CLI, or live URLs. Built-in CDN delivery in seconds.',
|
||||||
'Generate production-ready images via API, SDK, CLI, or live URLs. Built-in CDN delivery in seconds.',
|
|
||||||
siteName: 'Banatie',
|
siteName: 'Banatie',
|
||||||
locale: 'en_US',
|
locale: 'en_US',
|
||||||
images: [
|
images: [
|
||||||
|
|
@ -59,18 +55,28 @@ export const metadata: Metadata = {
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
|
||||||
|
// Twitter
|
||||||
twitter: {
|
twitter: {
|
||||||
card: 'summary_large_image',
|
card: 'summary_large_image',
|
||||||
title: 'AI Image Generation Inside Your Workflow | Banatie',
|
title: 'AI Image Generation Inside Your Workflow | Banatie',
|
||||||
description:
|
description: 'Generate production-ready images via API, SDK, CLI, or live URLs. Built-in CDN delivery in seconds.',
|
||||||
'Generate production-ready images via API, SDK, CLI, or live URLs. Built-in CDN delivery in seconds.',
|
|
||||||
images: ['https://banatie.app/og-image.png'],
|
images: ['https://banatie.app/og-image.png'],
|
||||||
},
|
},
|
||||||
};
|
}
|
||||||
|
|
||||||
|
const customStyles = `
|
||||||
|
@import url('https://fonts.googleapis.com/css2?family=Caveat:wght@500;600;700&display=swap');
|
||||||
|
|
||||||
|
${heroStyles}
|
||||||
|
|
||||||
|
${shapeFutureStyles}
|
||||||
|
`;
|
||||||
|
|
||||||
export default function Home() {
|
export default function Home() {
|
||||||
return (
|
return (
|
||||||
<div className="relative">
|
<>
|
||||||
|
<style dangerouslySetInnerHTML={{ __html: customStyles }} />
|
||||||
|
<div className="relative">
|
||||||
<BackgroundBlobs />
|
<BackgroundBlobs />
|
||||||
<HeroGlow />
|
<HeroGlow />
|
||||||
|
|
||||||
|
|
@ -84,6 +90,7 @@ export default function Home() {
|
||||||
<ShapeTheFutureSection />
|
<ShapeTheFutureSection />
|
||||||
<GeminiSection />
|
<GeminiSection />
|
||||||
<FinalCtaSection />
|
<FinalCtaSection />
|
||||||
</div>
|
</div>
|
||||||
|
</>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -20,9 +20,7 @@
|
||||||
"test:api": "tsx tests/api/run-all.ts",
|
"test:api": "tsx tests/api/run-all.ts",
|
||||||
"format": "prettier --write \"apps/**/*.{ts,tsx,js,jsx,json,css,md}\" \"packages/**/*.{ts,tsx,js,jsx,json,css,md}\" \"*.{ts,tsx,js,jsx,json,css,md}\" --ignore-unknown",
|
"format": "prettier --write \"apps/**/*.{ts,tsx,js,jsx,json,css,md}\" \"packages/**/*.{ts,tsx,js,jsx,json,css,md}\" \"*.{ts,tsx,js,jsx,json,css,md}\" --ignore-unknown",
|
||||||
"format:check": "prettier --check \"apps/**/*.{ts,tsx,js,jsx,json,css,md}\" \"packages/**/*.{ts,tsx,js,jsx,json,css,md}\" \"*.{ts,tsx,js,jsx,json,css,md}\" --ignore-unknown",
|
"format:check": "prettier --check \"apps/**/*.{ts,tsx,js,jsx,json,css,md}\" \"packages/**/*.{ts,tsx,js,jsx,json,css,md}\" \"*.{ts,tsx,js,jsx,json,css,md}\" --ignore-unknown",
|
||||||
"clean": "pnpm -r clean && rm -rf node_modules",
|
"clean": "pnpm -r clean && rm -rf node_modules"
|
||||||
"deploy:landing": "./scripts/deploy-landing.sh",
|
|
||||||
"deploy:landing:no-cache": "./scripts/deploy-landing.sh --no-cache"
|
|
||||||
},
|
},
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"monorepo",
|
"monorepo",
|
||||||
|
|
|
||||||
|
|
@ -1,35 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
set -e
|
|
||||||
|
|
||||||
echo "=== Banatie Landing Deployment ==="
|
|
||||||
|
|
||||||
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
||||||
PROJECT_DIR="$(dirname "$SCRIPT_DIR")"
|
|
||||||
|
|
||||||
# Pull latest code
|
|
||||||
echo "→ Pulling latest changes..."
|
|
||||||
cd "$PROJECT_DIR"
|
|
||||||
git pull
|
|
||||||
|
|
||||||
# Build
|
|
||||||
echo "→ Building landing..."
|
|
||||||
cd /opt/banatie
|
|
||||||
|
|
||||||
BUILD_ARGS=""
|
|
||||||
if [[ "$1" == "--no-cache" ]]; then
|
|
||||||
echo " (using --no-cache)"
|
|
||||||
BUILD_ARGS="--no-cache"
|
|
||||||
fi
|
|
||||||
|
|
||||||
docker compose --env-file .env --env-file secrets.env build $BUILD_ARGS banatie-landing
|
|
||||||
|
|
||||||
# Deploy
|
|
||||||
echo "→ Deploying..."
|
|
||||||
docker compose --env-file .env --env-file secrets.env up -d banatie-landing
|
|
||||||
|
|
||||||
# Check
|
|
||||||
sleep 3
|
|
||||||
echo "→ Status:"
|
|
||||||
docker logs banatie-landing --tail 5
|
|
||||||
|
|
||||||
echo "=== Done ==="
|
|
||||||
Loading…
Reference in New Issue