Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions apps/marketing/astro.config.mjs
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
import { defineConfig } from "astro/config";
import tailwindcss from "@tailwindcss/vite";

/** Set in deploy (e.g. preview URL) so canonical and Open Graph URLs resolve. */
const site = process.env.PUBLIC_SITE_URL;

export default defineConfig({
...(site ? { site } : {}),
vite: {
plugins: [tailwindcss()],
},
server: {
port: Number(process.env.PORT ?? 4173),
},
Expand Down
6 changes: 5 additions & 1 deletion apps/marketing/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,14 @@
},
"dependencies": {
"@fontsource-variable/dm-sans": "^5.2.8",
"astro": "^6.0.4"
"@fontsource-variable/inter": "^5.1.1",
"@fontsource-variable/jetbrains-mono": "^5.1.1",
"astro": "^6.1.2"
},
"devDependencies": {
"@astrojs/check": "^0.9.7",
"@tailwindcss/vite": "^4.0.17",
"tailwindcss": "^4.0.17",
"typescript": "catalog:",
"vitest": "catalog:"
}
Expand Down
73 changes: 73 additions & 0 deletions apps/marketing/src/components/Capabilities.astro
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
---
const capabilities = [
{
icon: `<svg class="w-6 h-6" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M13 10V3L4 14h7v7l9-11h-7z" /></svg>`,
title: "Lightning Fast Generation",
description: "Generate production-ready code in seconds with our optimized AI models trained on millions of repositories.",
},
{
icon: `<svg class="w-6 h-6" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M9 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z" /></svg>`,
title: "Enterprise Security",
description: "SOC 2 compliant with end-to-end encryption. Your code never leaves your infrastructure.",
},
{
icon: `<svg class="w-6 h-6" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M8 9l3 3-3 3m5 0h3M5 20h14a2 2 0 002-2V6a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z" /></svg>`,
title: "Multi-Language Support",
description: "Native support for 50+ programming languages including TypeScript, Python, Rust, Go, and more.",
},
{
icon: `<svg class="w-6 h-6" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0zm6 3a2 2 0 11-4 0 2 2 0 014 0zM7 10a2 2 0 11-4 0 2 2 0 014 0z" /></svg>`,
title: "Team Collaboration",
description: "Real-time collaboration with shared context, code reviews, and seamless Git integration.",
},
{
icon: `<svg class="w-6 h-6" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z" /></svg>`,
title: "Intelligent Debugging",
description: "AI-powered error detection and automatic fixes. Debug smarter, not harder.",
},
{
icon: `<svg class="w-6 h-6" fill="none" viewBox="0 0 24 24" stroke="currentColor"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M4 7v10c0 2.21 3.582 4 8 4s8-1.79 8-4V7M4 7c0 2.21 3.582 4 8 4s8-1.79 8-4M4 7c0-2.21 3.582-4 8-4s8 1.79 8 4m0 5c0 2.21-3.582 4-8 4s-8-1.79-8-4" /></svg>`,
title: "Context Aware",
description: "Understands your entire codebase. Get suggestions that fit your architecture and coding style.",
},
];
---

<section id="capabilities" class="relative section-padding overflow-hidden">
<!-- Background gradient -->
<div class="absolute inset-0 bg-gradient-to-b from-transparent via-primary/[0.02] to-transparent"></div>

<div class="relative container-wide">
<!-- Section Header -->
<div class="text-center mb-16 lg:mb-20">
<div class="inline-flex items-center gap-2 px-4 py-1.5 rounded-full glass-strong text-sm mb-6">
<span class="w-1.5 h-1.5 rounded-full bg-primary"></span>
<span class="text-muted-foreground">Capabilities</span>
</div>
<h2 class="text-3xl sm:text-4xl lg:text-5xl font-bold text-foreground mb-5 text-balance tracking-tight">
Everything you need to ship faster
</h2>
<p class="max-w-2xl mx-auto text-base sm:text-lg text-muted-foreground text-pretty leading-relaxed">
A complete toolkit designed for modern development teams who want to build and deploy with confidence.
</p>
</div>

<!-- Capabilities Grid -->
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-5 lg:gap-6">
{capabilities.map((capability, index) => (
<div class="group relative p-6 lg:p-8 rounded-2xl glass card-hover">
<!-- Hover gradient -->
<div class="absolute inset-0 rounded-2xl bg-gradient-to-br from-primary/10 via-transparent to-transparent opacity-0 group-hover:opacity-100 transition-opacity duration-500"></div>

<div class="relative">
<div class="w-12 h-12 rounded-xl bg-primary/10 flex items-center justify-center text-primary mb-5 group-hover:bg-primary group-hover:text-primary-foreground transition-all duration-300 group-hover:scale-110">
<Fragment set:html={capability.icon} />
</div>
<h3 class="text-lg font-semibold text-foreground mb-2.5">{capability.title}</h3>
<p class="text-muted-foreground text-sm leading-relaxed">{capability.description}</p>
</div>
</div>
))}
</div>
</div>
</section>
156 changes: 156 additions & 0 deletions apps/marketing/src/components/Footer.astro
Original file line number Diff line number Diff line change
@@ -0,0 +1,156 @@
---
const footerLinks = {
product: [
{ label: "Features", href: "#capabilities" },
{ label: "Pricing", href: "#pricing" },
{ label: "Changelog", href: "#" },
{ label: "Roadmap", href: "#" },
],
resources: [
{ label: "Documentation", href: "#" },
{ label: "API Reference", href: "#" },
{ label: "Guides", href: "#" },
{ label: "Blog", href: "#" },
],
company: [
{ label: "About", href: "#" },
{ label: "Careers", href: "#" },
{ label: "Contact", href: "#" },
{ label: "Press", href: "#" },
],
legal: [
{ label: "Privacy", href: "#" },
{ label: "Terms", href: "#" },
{ label: "Security", href: "#" },
],
};

const socialLinks = [
{
label: "GitHub",
href: "https://github.com/OpenKnots/okcode",
icon: `<svg class="w-5 h-5" fill="currentColor" viewBox="0 0 24 24"><path fill-rule="evenodd" d="M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z" clip-rule="evenodd" /></svg>`,
},
{
label: "X (Twitter)",
href: "#",
icon: `<svg class="w-5 h-5" fill="currentColor" viewBox="0 0 24 24"><path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z" /></svg>`,
},
{
label: "Discord",
href: "#",
icon: `<svg class="w-5 h-5" fill="currentColor" viewBox="0 0 24 24"><path d="M20.317 4.3698a19.7913 19.7913 0 00-4.8851-1.5152.0741.0741 0 00-.0785.0371c-.211.3753-.4447.8648-.6083 1.2495-1.8447-.2762-3.68-.2762-5.4868 0-.1636-.3933-.4058-.8742-.6177-1.2495a.077.077 0 00-.0785-.037 19.7363 19.7363 0 00-4.8852 1.515.0699.0699 0 00-.0321.0277C.5334 9.0458-.319 13.5799.0992 18.0578a.0824.0824 0 00.0312.0561c2.0528 1.5076 4.0413 2.4228 5.9929 3.0294a.0777.0777 0 00.0842-.0276c.4616-.6304.8731-1.2952 1.226-1.9942a.076.076 0 00-.0416-.1057c-.6528-.2476-1.2743-.5495-1.8722-.8923a.077.077 0 01-.0076-.1277c.1258-.0943.2517-.1923.3718-.2914a.0743.0743 0 01.0776-.0105c3.9278 1.7933 8.18 1.7933 12.0614 0a.0739.0739 0 01.0785.0095c.1202.099.246.1981.3728.2924a.077.077 0 01-.0066.1276 12.2986 12.2986 0 01-1.873.8914.0766.0766 0 00-.0407.1067c.3604.698.7719 1.3628 1.225 1.9932a.076.076 0 00.0842.0286c1.961-.6067 3.9495-1.5219 6.0023-3.0294a.077.077 0 00.0313-.0552c.5004-5.177-.8382-9.6739-3.5485-13.6604a.061.061 0 00-.0312-.0286zM8.02 15.3312c-1.1825 0-2.1569-1.0857-2.1569-2.419 0-1.3332.9555-2.4189 2.157-2.4189 1.2108 0 2.1757 1.0952 2.1568 2.419 0 1.3332-.9555 2.4189-2.1569 2.4189zm7.9748 0c-1.1825 0-2.1569-1.0857-2.1569-2.419 0-1.3332.9554-2.4189 2.1569-2.4189 1.2108 0 2.1757 1.0952 2.1568 2.419 0 1.3332-.946 2.4189-2.1568 2.4189z" /></svg>`,
},
{
label: "LinkedIn",
href: "#",
icon: `<svg class="w-5 h-5" fill="currentColor" viewBox="0 0 24 24"><path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"/></svg>`,
},
];
---

<footer class="relative pt-20 lg:pt-24 pb-8 border-t border-white/[0.06]">
<!-- Background gradient -->
<div class="absolute inset-0 bg-gradient-to-t from-primary/[0.02] to-transparent pointer-events-none"></div>

<div class="relative container-wide">
<!-- Main Footer Content -->
<div class="grid grid-cols-2 sm:grid-cols-3 lg:grid-cols-6 gap-8 lg:gap-12 mb-16">
<!-- Brand Column -->
<div class="col-span-2 sm:col-span-3 lg:col-span-2">
<a href="/" class="inline-flex items-center gap-2.5 mb-5 group">
<div class="w-9 h-9 rounded-xl bg-gradient-to-br from-primary to-violet-400 flex items-center justify-center transition-transform group-hover:scale-105">
<svg class="w-5 h-5 text-white" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 20l4-16m4 4l4 4-4 4M6 16l-4-4 4-4" />
</svg>
</div>
<span class="font-semibold text-lg text-foreground">OK Code</span>
</a>
<p class="text-sm text-muted-foreground max-w-xs mb-6 leading-relaxed">
The AI platform that helps developers build and ship code faster than ever before.
</p>
<!-- Social Links -->
<div class="flex items-center gap-3">
{socialLinks.map((link) => (
<a
href={link.href}
target="_blank"
rel="noopener noreferrer"
class="w-10 h-10 rounded-lg flex items-center justify-center text-muted-foreground hover:text-foreground hover:bg-white/5 transition-all"
aria-label={link.label}
>
<Fragment set:html={link.icon} />
</a>
))}
</div>
</div>

<!-- Links Columns -->
<div>
<h4 class="font-semibold text-foreground mb-4 text-sm">Product</h4>
<ul class="space-y-3">
{footerLinks.product.map((link) => (
<li>
<a href={link.href} class="text-sm text-muted-foreground link-hover">
{link.label}
</a>
</li>
))}
</ul>
</div>

<div>
<h4 class="font-semibold text-foreground mb-4 text-sm">Resources</h4>
<ul class="space-y-3">
{footerLinks.resources.map((link) => (
<li>
<a href={link.href} class="text-sm text-muted-foreground link-hover">
{link.label}
</a>
</li>
))}
</ul>
</div>

<div>
<h4 class="font-semibold text-foreground mb-4 text-sm">Company</h4>
<ul class="space-y-3">
{footerLinks.company.map((link) => (
<li>
<a href={link.href} class="text-sm text-muted-foreground link-hover">
{link.label}
</a>
</li>
))}
</ul>
</div>

<div>
<h4 class="font-semibold text-foreground mb-4 text-sm">Legal</h4>
<ul class="space-y-3">
{footerLinks.legal.map((link) => (
<li>
<a href={link.href} class="text-sm text-muted-foreground link-hover">
{link.label}
</a>
</li>
))}
</ul>
</div>
</div>

<!-- Bottom Bar -->
<div class="pt-8 border-t border-white/[0.06] flex flex-col sm:flex-row items-center justify-between gap-4">
<p class="text-sm text-muted-foreground">
&copy; {new Date().getFullYear()} OK Code. All rights reserved.
</p>
<div class="flex items-center gap-2 text-sm text-muted-foreground">
<span class="relative flex h-2 w-2">
<span class="animate-ping absolute inline-flex h-full w-full rounded-full bg-green-400 opacity-75"></span>
<span class="relative inline-flex rounded-full h-2 w-2 bg-green-400"></span>
</span>
All systems operational
</div>
</div>
</div>
</footer>
Loading
Loading