Compare commits

..

No commits in common. "d57bb2e3b9dc92f6707d7e4b4b96c5274d31ec1c" and "ccf44af93f0d9a4920890c11c2b93456ed4eadd8" have entirely different histories.

8 changed files with 36 additions and 79 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 920 KiB

View File

@ -6,7 +6,7 @@ import GlowEffect from './GlowEffect';
import WaitlistPopup from './WaitlistPopup';
import { submitEmail, submitWaitlistData } from '@/lib/actions/waitlistActions';
const styles = `
export const styles = `
.gradient-text {
background: linear-gradient(90deg, #818cf8 0%, #c084fc 25%, #f472b6 50%, #c084fc 75%, #818cf8 100%);
background-size: 200% 100%;
@ -122,8 +122,6 @@ export function HeroSection() {
};
return (
<>
<style dangerouslySetInnerHTML={{ __html: styles }} />
<section className="relative pt-20 pb-20 px-6">
<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">
@ -210,6 +208,5 @@ export function HeroSection() {
onSubmit={handleWaitlistSubmit}
/>
</section>
</>
);
}

View File

@ -21,7 +21,7 @@ function generateZigzagClipPath(yValues: number[]): string {
return `polygon(${topEdge}, ${bottomEdge})`;
}
const styles = `
export const styles = `
.shape-future {
clip-path: ${generateZigzagClipPath(ZIGZAG_POINTS)};
}
@ -43,7 +43,7 @@ const styles = `
}
.shape-future-title {
font-family: var(--font-caveat), cursive;
font-family: 'Caveat', cursive;
}
`;
@ -55,8 +55,6 @@ const features = [
export function ShapeTheFutureSection() {
return (
<>
<style dangerouslySetInnerHTML={{ __html: styles }} />
<div className="relative my-[60px]">
<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] " />
@ -89,6 +87,5 @@ export function ShapeTheFutureSection() {
</div>
</section>
</div>
</>
);
}

View File

@ -1,12 +1,12 @@
export { BackgroundBlobs } from './BackgroundBlobs';
export { HeroGlow } from './HeroGlow';
export { HeroSection } from './HeroSection';
export { HeroSection, styles as heroStyles } from './HeroSection';
export { ApiExampleSection } from './ApiExampleSection';
export { ProblemSolutionSection } from './ProblemSolutionSection';
export { PromptUrlsSection } from './PromptUrlsSection';
export { HowItWorksSection } from './HowItWorksSection';
export { KeyFeaturesSection } from './KeyFeaturesSection';
export { IntegrationsSection } from './IntegrationsSection';
export { ShapeTheFutureSection } from './ShapeTheFutureSection';
export { ShapeTheFutureSection, styles as shapeFutureStyles } from './ShapeTheFutureSection';
export { GeminiSection } from './GeminiSection';
export { FinalCtaSection } from './FinalCtaSection';

View File

@ -1,5 +1,5 @@
import type { Metadata } from 'next';
import { Inter, Caveat } from 'next/font/google';
import { Inter } from 'next/font/google';
import Image from 'next/image';
import { Footer } from '@/components/shared/Footer';
import './globals.css';
@ -10,13 +10,6 @@ const inter = Inter({
display: 'swap',
});
const caveat = Caveat({
variable: '--font-caveat',
subsets: ['latin'],
weight: ['500', '600', '700'],
display: 'swap',
});
export default function RootLayout({
children,
@ -29,7 +22,7 @@ export default function RootLayout({
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossOrigin="anonymous" />
</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">
{/* Animated gradient background */}
<div className="fixed inset-0 overflow-hidden pointer-events-none">

View File

@ -2,6 +2,7 @@ import {
BackgroundBlobs,
HeroGlow,
HeroSection,
heroStyles,
ApiExampleSection,
ProblemSolutionSection,
PromptUrlsSection,
@ -9,44 +10,39 @@ import {
KeyFeaturesSection,
IntegrationsSection,
ShapeTheFutureSection,
shapeFutureStyles,
GeminiSection,
FinalCtaSection,
} from './_components';
import type { Metadata, Viewport } from 'next';
import type { Metadata, Viewport } from 'next'
export const viewport: Viewport = {
themeColor: '#0a0a0f',
};
}
export const metadata: Metadata = {
title: 'AI Image Generation Inside Your Workflow | Banatie',
description:
'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',
],
description: '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'],
authors: [{ name: 'Banatie' }],
robots: 'index, follow',
// Canonical & Alternates
alternates: {
canonical: 'https://banatie.app',
languages: {
en: 'https://banatie.app',
'en': 'https://banatie.app',
'x-default': 'https://banatie.app',
},
},
// Open Graph
openGraph: {
type: 'website',
url: 'https://banatie.app',
title: 'AI Image Generation Inside Your Workflow | Banatie',
description:
'Generate production-ready images via API, SDK, CLI, or live URLs. Built-in CDN delivery in seconds.',
description: 'Generate production-ready images via API, SDK, CLI, or live URLs. Built-in CDN delivery in seconds.',
siteName: 'Banatie',
locale: 'en_US',
images: [
@ -59,17 +55,27 @@ export const metadata: Metadata = {
],
},
// Twitter
twitter: {
card: 'summary_large_image',
title: 'AI Image Generation Inside Your Workflow | Banatie',
description:
'Generate production-ready images via API, SDK, CLI, or live URLs. Built-in CDN delivery in seconds.',
description: 'Generate production-ready images via API, SDK, CLI, or live URLs. Built-in CDN delivery in seconds.',
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() {
return (
<>
<style dangerouslySetInnerHTML={{ __html: customStyles }} />
<div className="relative">
<BackgroundBlobs />
<HeroGlow />
@ -85,5 +91,6 @@ export default function Home() {
<GeminiSection />
<FinalCtaSection />
</div>
</>
);
}

View File

@ -20,9 +20,7 @@
"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: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",
"deploy:landing": "./scripts/deploy-landing.sh",
"deploy:landing:no-cache": "./scripts/deploy-landing.sh --no-cache"
"clean": "pnpm -r clean && rm -rf node_modules"
},
"keywords": [
"monorepo",

View File

@ -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 ==="