|
1 |
| -import { ArrowRight, Boxes, GitBranch, Sparkles, Terminal } from 'lucide-react'; |
2 |
| -import Layout from '@theme/Layout'; |
3 |
| -import Link from '@docusaurus/Link'; |
4 | 1 |
|
5 |
| -import { Badge } from '@/components/ui/badge'; |
6 |
| -import { Button } from '@/components/ui/button'; |
7 |
| -import { |
8 |
| - Card, |
9 |
| - CardContent, |
10 |
| - CardDescription, |
11 |
| - CardHeader, |
12 |
| - CardTitle, |
13 |
| -} from '@/components/ui/card'; |
14 | 2 | import { useEffect } from 'react';
|
15 | 3 |
|
16 |
| -const featureCards = [ |
17 |
| - { |
18 |
| - title: 'Opinionated building blocks', |
19 |
| - description: |
20 |
| - 'Compose production-ready stacks with recipes for apps, workers, and data pipelines using a few lines of YAML.', |
21 |
| - icon: Boxes, |
22 |
| - href: '/docs/category/providers', |
23 |
| - cta: 'Explore providers', |
24 |
| - }, |
25 |
| - { |
26 |
| - title: 'Developer-first workflows', |
27 |
| - description: |
28 |
| - 'Preview, ship, and roll back from the CLI while Defang manages infrastructure, secrets, and observability.', |
29 |
| - icon: Terminal, |
30 |
| - href: '/docs/category/cli', |
31 |
| - cta: 'See CLI guides', |
32 |
| - }, |
33 |
| - { |
34 |
| - title: 'AI-compatible by default', |
35 |
| - description: |
36 |
| - 'Spin up AI agents, flows, and scheduled jobs with batteries-included examples and best practices.', |
37 |
| - icon: Sparkles, |
38 |
| - href: '/docs/category/use-cases', |
39 |
| - cta: 'Build an agent', |
40 |
| - }, |
41 |
| -]; |
42 |
| - |
43 |
| -const timeline = [ |
44 |
| - { |
45 |
| - title: 'Get started in minutes', |
46 |
| - description: |
47 |
| - 'Follow the quickstart to install the CLI, authenticate, and deploy your first service without touching the console.', |
48 |
| - href: '/docs/getting-started', |
49 |
| - }, |
50 |
| - { |
51 |
| - title: 'Scale to production', |
52 |
| - description: |
53 |
| - 'Define infrastructure once and promote through environments with declarative blueprints and guardrails built in.', |
54 |
| - href: '/docs/category/concepts', |
55 |
| - }, |
56 |
| - { |
57 |
| - title: 'Automate everything', |
58 |
| - description: |
59 |
| - 'Leverage managed pipelines, build triggers, and cloud events so your team ships reliable software every day.', |
60 |
| - href: '/docs/category/tutorials', |
61 |
| - }, |
62 |
| -]; |
63 | 4 |
|
64 | 5 | export default function Home() {
|
65 | 6 | useEffect(() => {
|
66 | 7 | window.location.href = '/docs';
|
67 | 8 | }, []);
|
68 | 9 |
|
69 | 10 | return null;
|
70 |
| - return ( |
71 |
| - <Layout> |
72 |
| - <main className="relative overflow-hidden"> |
73 |
| - <div className="pointer-events-none absolute inset-0 -z-10 bg-hero-grid opacity-70 dark:opacity-45 dark:mix-blend-screen" /> |
74 |
| - <section data-testid="landing-hero" className="container flex flex-col gap-12 py-16 md:py-24 lg:py-28"> |
75 |
| - <div className="flex flex-col gap-8 text-center md:text-left"> |
76 |
| - <div className="flex flex-col items-center gap-3 md:flex-row md:gap-4"> |
77 |
| - <Badge data-testid="hero-badge" className="bg-primary/10 text-primary shadow-none"> |
78 |
| - Built for calm, cloud-native shipping |
79 |
| - </Badge> |
80 |
| - <span className="text-sm text-muted-foreground"> |
81 |
| - Updated {new Date().toLocaleDateString('en-US', { month: 'long', year: 'numeric' })} |
82 |
| - </span> |
83 |
| - </div> |
84 |
| - <h1 className="text-4xl font-semibold tracking-tight text-foreground sm:text-5xl md:text-6xl lg:text-7xl"> |
85 |
| - Shipping calm cloud software is finally the default |
86 |
| - </h1> |
87 |
| - <p className="mx-auto max-w-2xl text-lg text-muted-foreground md:mx-0 md:text-xl"> |
88 |
| - Defang abstracts the noisy parts of infrastructure so you can focus on features. |
89 |
| - These docs walk through the workflows, architecture patterns, and reference deployments that power modern teams. |
90 |
| - </p> |
91 |
| - <div className="flex flex-col items-center gap-4 md:flex-row md:items-center md:gap-6"> |
92 |
| - <Button asChild size="lg" className="w-full md:w-auto hover:text-white"> |
93 |
| - <Link to="/docs/getting-started"> |
94 |
| - Launch quickstart |
95 |
| - <ArrowRight className="ml-2 h-4 w-4" aria-hidden="true" /> |
96 |
| - </Link> |
97 |
| - </Button> |
98 |
| - <Button asChild variant="ghost" className="w-full md:w-auto"> |
99 |
| - <Link to="/docs/samples"> |
100 |
| - Browse production samples |
101 |
| - <ArrowRight className="ml-2 h-4 w-4" aria-hidden="true" /> |
102 |
| - </Link> |
103 |
| - </Button> |
104 |
| - </div> |
105 |
| - <div className="mt-4 flex flex-wrap items-center justify-center gap-6 md:justify-start"> |
106 |
| - {['AWS', 'GCP', 'Docker', 'Pulumi', 'OpenAI'].map((logo) => ( |
107 |
| - <div |
108 |
| - key={logo} |
109 |
| - className="text-sm font-medium text-muted-foreground/80 transition-colors hover:text-foreground" |
110 |
| - > |
111 |
| - {logo} |
112 |
| - </div> |
113 |
| - ))} |
114 |
| - </div> |
115 |
| - </div> |
116 |
| - </section> |
117 |
| - |
118 |
| - <section data-testid="feature-grid" className="container grid gap-6 pb-20 md:grid-cols-2 md:gap-8 lg:grid-cols-3"> |
119 |
| - {featureCards.map(({ title, description, icon: Icon, href, cta }) => ( |
120 |
| - <Card key={title} data-testid="feature-card" className="group"> |
121 |
| - <CardHeader> |
122 |
| - <div className="flex h-12 w-12 items-center justify-center rounded-2xl bg-primary/10 text-primary transition-all group-hover:bg-primary group-hover:text-primary-foreground"> |
123 |
| - <Icon className="h-6 w-6" aria-hidden="true" /> |
124 |
| - </div> |
125 |
| - <CardTitle>{title}</CardTitle> |
126 |
| - <CardDescription>{description}</CardDescription> |
127 |
| - </CardHeader> |
128 |
| - <CardContent className="pt-2"> |
129 |
| - <Button asChild variant="ghost" className="gap-2 px-0 text-sm font-semibold"> |
130 |
| - <Link to={href}> |
131 |
| - {cta} |
132 |
| - <ArrowRight className="h-4 w-4" aria-hidden="true" /> |
133 |
| - </Link> |
134 |
| - </Button> |
135 |
| - </CardContent> |
136 |
| - </Card> |
137 |
| - ))} |
138 |
| - </section> |
139 |
| - |
140 |
| - <section data-testid="timeline" className="border-y border-border/60 bg-card/30 dark:bg-background/70 py-16 md:py-20"> |
141 |
| - <div className="container grid gap-12 md:grid-cols-[1.15fr_0.85fr] md:items-center"> |
142 |
| - <div className="flex flex-col gap-6"> |
143 |
| - <Badge data-testid="timeline-badge" variant="outline" className="w-fit border-primary/40 bg-primary/5 text-primary"> |
144 |
| - Guided track |
145 |
| - </Badge> |
146 |
| - <h2 className="text-3xl font-semibold tracking-tight md:text-4xl"> |
147 |
| - A documentation experience that mirrors the way you ship |
148 |
| - </h2> |
149 |
| - <p className="max-w-xl text-base text-muted-foreground md:text-lg"> |
150 |
| - Move from hello world to production in a straight line. Each stage links to runnable samples, infrastructure definitions, and launch checklists. |
151 |
| - </p> |
152 |
| - <div className="grid gap-4"> |
153 |
| - {timeline.map(({ title, description, href }) => ( |
154 |
| - <Link |
155 |
| - key={title} |
156 |
| - data-testid="timeline-step" |
157 |
| - to={href} |
158 |
| - className="group flex w-full items-start gap-4 rounded-2xl border border-border/60 bg-background/70 p-5 transition-all hover:-translate-y-1 hover:border-primary/60 hover:shadow-xl hover:shadow-primary/15" |
159 |
| - > |
160 |
| - <div className="mt-1 flex h-10 w-10 items-center justify-center rounded-full border border-primary/40 bg-primary/10 text-primary transition-all group-hover:bg-primary group-hover:text-primary-foreground"> |
161 |
| - <GitBranch className="h-4 w-4" aria-hidden="true" /> |
162 |
| - </div> |
163 |
| - <div className="flex flex-col gap-2"> |
164 |
| - <h3 className="text-lg font-semibold text-foreground">{title}</h3> |
165 |
| - <p className="text-sm text-muted-foreground">{description}</p> |
166 |
| - </div> |
167 |
| - </Link> |
168 |
| - ))} |
169 |
| - </div> |
170 |
| - </div> |
171 |
| - <div className="relative isolate flex flex-col gap-4 rounded-3xl border border-border/70 bg-background/90 dark:bg-card/60 p-6 shadow-xl shadow-primary/10"> |
172 |
| - <div className="absolute right-6 top-6 h-20 w-20 rounded-full bg-primary/20 blur-2xl" /> |
173 |
| - <h3 className="text-xl font-semibold">What’s inside</h3> |
174 |
| - <ul className="grid gap-4 text-sm text-muted-foreground"> |
175 |
| - <li className="rounded-2xl border border-border/60 bg-card/80 p-4 shadow-sm"> |
176 |
| - ✅ Environment-aware deploy workflows with automatic rollbacks |
177 |
| - </li> |
178 |
| - <li className="rounded-2xl border border-border/60 bg-card/80 p-4 shadow-sm"> |
179 |
| - ✅ Infrastructure blueprints for web apps, workers, and agents |
180 |
| - </li> |
181 |
| - <li className="rounded-2xl border border-border/60 bg-card/80 p-4 shadow-sm"> |
182 |
| - ✅ Samples that pair CLI commands with production-grade configs |
183 |
| - </li> |
184 |
| - </ul> |
185 |
| - <Button asChild className="self-start"> |
186 |
| - <Link to="/docs/Intro"> |
187 |
| - Dive into the docs |
188 |
| - <ArrowRight className="ml-2 h-4 w-4" aria-hidden="true" /> |
189 |
| - </Link> |
190 |
| - </Button> |
191 |
| - </div> |
192 |
| - </div> |
193 |
| - </section> |
194 |
| - |
195 |
| - <section data-testid="updates" className="container flex flex-col gap-8 py-16 md:py-20"> |
196 |
| - <div className="flex flex-col gap-3 text-center"> |
197 |
| - <Badge data-testid="updates-badge" variant="outline" className="mx-auto border-primary/30 bg-primary/10 text-primary"> |
198 |
| - Recently refreshed |
199 |
| - </Badge> |
200 |
| - <h2 className="text-3xl font-semibold md:text-4xl"> |
201 |
| - New launches, walkthroughs, and templates every month |
202 |
| - </h2> |
203 |
| - <p className="mx-auto max-w-2xl text-base text-muted-foreground md:text-lg"> |
204 |
| - Stay in the flow with product updates, migration notes, and real-world sample apps built by the Defang community. |
205 |
| - </p> |
206 |
| - </div> |
207 |
| - <div className="grid gap-6 md:grid-cols-3"> |
208 |
| - {[ |
209 |
| - { |
210 |
| - title: 'Deploy your first agent with Crew AI', |
211 |
| - href: '/blog/2025/06/16/crew-ai-sample', |
212 |
| - description: 'Use Defang workflows to bootstrap retrieval-augmented agents that scale beyond experiments.', |
213 |
| - }, |
214 |
| - { |
215 |
| - title: 'May 2025 product highlights', |
216 |
| - href: '/blog/2025/06/06/may-product-updates', |
217 |
| - description: 'Ship features faster with environment-aware deploys, project templates, and richer metrics.', |
218 |
| - }, |
219 |
| - { |
220 |
| - title: 'Opinionated Docker Compose to Defang migration', |
221 |
| - href: '/blog/2025/06/16/docker-compose-defang', |
222 |
| - description: 'A guided path for teams standardizing on Defang after years running compose in production.', |
223 |
| - }, |
224 |
| - ].map(({ title, href, description }) => ( |
225 |
| - <Card key={title} data-testid="update-card" className="group border-border/70 bg-background/90"> |
226 |
| - <CardHeader> |
227 |
| - <CardTitle className="text-lg">{title}</CardTitle> |
228 |
| - <CardDescription>{description}</CardDescription> |
229 |
| - </CardHeader> |
230 |
| - <CardContent className="pt-2"> |
231 |
| - <Button asChild variant="ghost" className="gap-2 px-0 text-sm font-semibold hover:bg-transparent"> |
232 |
| - <Link to={href}> |
233 |
| - Read the update |
234 |
| - <ArrowRight className="h-4 w-4" aria-hidden="true" /> |
235 |
| - </Link> |
236 |
| - </Button> |
237 |
| - </CardContent> |
238 |
| - </Card> |
239 |
| - ))} |
240 |
| - </div> |
241 |
| - </section> |
242 |
| - </main> |
243 |
| - </Layout> |
244 |
| - ); |
245 | 11 | }
|
0 commit comments