Skip to content

Commit b91c454

Browse files
authored
feat(dashboard): compact landing page
Redesign the public homepage with a compact AgentState product layout, inline SVG visuals, scoped landing theme styles, and simplified homepage sections.\n\nCo-Authored-By: Duyet Le <me@duyet.net>\nCo-Authored-By: duyetbot <bot@duyet.net>
1 parent fd8027a commit b91c454

14 files changed

Lines changed: 661 additions & 230 deletions

File tree

packages/dashboard/public/landing/analytics.svg

Lines changed: 0 additions & 15 deletions
This file was deleted.

packages/dashboard/public/landing/chatbot.svg

Lines changed: 0 additions & 10 deletions
This file was deleted.

packages/dashboard/public/landing/frameworks.svg

Lines changed: 0 additions & 12 deletions
This file was deleted.

packages/dashboard/public/landing/sessions.svg

Lines changed: 0 additions & 12 deletions
This file was deleted.

packages/dashboard/public/landing/state-architecture.svg

Lines changed: 0 additions & 46 deletions
This file was deleted.

packages/dashboard/src/app/_features.tsx

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import {
1414
MotionSection,
1515
} from "@/components/landing/motion";
1616
import { Badge } from "@/components/ui/badge";
17-
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";
17+
import { Card, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";
1818

1919
type Feature = {
2020
title: string;
@@ -54,7 +54,7 @@ const features: readonly Feature[] = [
5454
export function Features() {
5555
return (
5656
<MotionSection
57-
className="max-w-5xl mx-auto px-6 pb-20"
57+
className="max-w-5xl mx-auto px-6 pb-14"
5858
animate="visible"
5959
initial="hidden"
6060
variants={landingContainer}
@@ -66,29 +66,29 @@ export function Features() {
6666
The primitives an agent product needs after the first conversation lands in production.
6767
</p>
6868
</MotionDiv>
69-
<MotionDiv className="grid gap-4 sm:grid-cols-2 lg:grid-cols-4" variants={landingContainer}>
69+
<MotionDiv className="grid gap-3 sm:grid-cols-2 lg:grid-cols-4" variants={landingContainer}>
7070
{features.map(({ title, badge, icon: Icon, description }) => (
7171
<MotionDiv
7272
className="h-full"
7373
key={title}
7474
variants={landingCard}
7575
whileHover={landingHover}
7676
>
77-
<Card className="h-full">
77+
<Card className="h-full" size="sm">
7878
<CardHeader>
7979
<CardTitle className="flex items-center gap-2">
8080
<span className="flex size-8 items-center justify-center rounded-lg bg-muted text-muted-foreground">
8181
<Icon aria-hidden="true" />
8282
</span>
8383
{title}
8484
</CardTitle>
85-
<CardDescription>
86-
<Badge variant="secondary">{badge}</Badge>
87-
</CardDescription>
85+
<div className="flex flex-col gap-2">
86+
<Badge className="w-fit" variant="secondary">
87+
{badge}
88+
</Badge>
89+
<CardDescription>{description}</CardDescription>
90+
</div>
8891
</CardHeader>
89-
<CardContent>
90-
<p className="text-sm text-muted-foreground leading-relaxed">{description}</p>
91-
</CardContent>
9292
</Card>
9393
</MotionDiv>
9494
))}

packages/dashboard/src/app/_hero.tsx

Lines changed: 8 additions & 91 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,4 @@
1-
import {
2-
ArrowRightIcon,
3-
DatabaseIcon,
4-
HistoryIcon,
5-
KeyRoundIcon,
6-
MessageSquareIcon,
7-
} from "lucide-react";
1+
import { ArrowRightIcon } from "lucide-react";
82
import Link from "next/link";
93
import {
104
landingCard,
@@ -14,49 +8,27 @@ import {
148
MotionDiv,
159
MotionSection,
1610
} from "@/components/landing/motion";
11+
import { HeroConsole } from "@/components/landing/visuals";
1712
import { Badge } from "@/components/ui/badge";
1813
import { Button } from "@/components/ui/button";
19-
import {
20-
Card,
21-
CardAction,
22-
CardContent,
23-
CardDescription,
24-
CardFooter,
25-
CardHeader,
26-
CardTitle,
27-
} from "@/components/ui/card";
28-
import { Separator } from "@/components/ui/separator";
29-
30-
const overviewRows = [
31-
{ label: "Ingest", value: "POST /api/v1/conversations" },
32-
{ label: "Retrieve", value: "GET /api/v1/conversations/:id" },
33-
{ label: "Analyze", value: "GET /api/v1/analytics/summary" },
34-
] as const;
35-
36-
const productSignals = [
37-
{ icon: MessageSquareIcon, label: "Conversation threads" },
38-
{ icon: DatabaseIcon, label: "D1-backed storage" },
39-
{ icon: HistoryIcon, label: "Cursor history" },
40-
{ icon: KeyRoundIcon, label: "API key controls" },
41-
] as const;
4214

4315
export function Hero() {
4416
return (
4517
<MotionSection
4618
animate="visible"
47-
className="max-w-5xl mx-auto px-6 py-16 sm:py-20"
19+
className="max-w-5xl mx-auto px-6 py-12 sm:py-16"
4820
initial="hidden"
4921
variants={landingContainer}
5022
>
51-
<div className="grid gap-8 lg:grid-cols-[1fr_24rem] lg:items-start">
52-
<div className="flex flex-col gap-6">
23+
<div className="grid gap-8 lg:grid-cols-[minmax(0,1fr)_30rem] lg:items-center">
24+
<div className="flex flex-col gap-5">
5325
<MotionDiv className="flex flex-wrap gap-2" variants={landingItem}>
5426
<Badge variant="outline">REST API</Badge>
5527
<Badge variant="outline">Cloudflare D1</Badge>
5628
<Badge variant="outline">Agent memory</Badge>
5729
</MotionDiv>
5830
<MotionDiv className="flex flex-col gap-4" variants={landingItem}>
59-
<h1 className="text-4xl font-semibold tracking-tight text-balance sm:text-5xl md:text-6xl">
31+
<h1 className="max-w-3xl text-5xl font-semibold tracking-tight text-balance sm:text-6xl md:text-7xl">
6032
AgentState
6133
</h1>
6234
<p className="max-w-2xl text-lg leading-relaxed text-pretty text-muted-foreground sm:text-xl">
@@ -82,65 +54,10 @@ export function Hero() {
8254
API reference
8355
</Button>
8456
</MotionDiv>
85-
<MotionDiv className="grid gap-3 sm:grid-cols-2" variants={landingContainer}>
86-
{productSignals.map(({ icon: Icon, label }) => (
87-
<MotionDiv key={label} variants={landingCard} whileHover={landingHover}>
88-
<Card size="sm">
89-
<CardHeader>
90-
<CardTitle className="flex items-center gap-2">
91-
<span className="flex size-8 items-center justify-center rounded-lg bg-muted text-muted-foreground">
92-
<Icon aria-hidden="true" />
93-
</span>
94-
{label}
95-
</CardTitle>
96-
</CardHeader>
97-
</Card>
98-
</MotionDiv>
99-
))}
100-
</MotionDiv>
10157
</div>
10258

103-
<MotionDiv variants={landingCard} whileHover={landingHover}>
104-
<Card>
105-
<CardHeader>
106-
<CardTitle>Operations overview</CardTitle>
107-
<CardDescription>
108-
One API surface for runtime memory and audit history.
109-
</CardDescription>
110-
<CardAction>
111-
<Badge variant="secondary">Live</Badge>
112-
</CardAction>
113-
</CardHeader>
114-
<CardContent className="flex flex-col gap-4">
115-
{overviewRows.map((row) => (
116-
<div key={row.value} className="flex flex-col gap-1">
117-
<div className="flex items-center justify-between gap-3">
118-
<span className="text-sm font-medium">{row.label}</span>
119-
<Badge variant="outline">v1</Badge>
120-
</div>
121-
<code className="truncate rounded-md bg-muted px-3 py-2 font-mono text-sm text-muted-foreground">
122-
{row.value}
123-
</code>
124-
</div>
125-
))}
126-
<Separator />
127-
<div className="grid grid-cols-2 gap-3">
128-
<div className="flex flex-col gap-1">
129-
<span className="text-sm font-medium">Memory API</span>
130-
<span className="text-sm text-muted-foreground">Store and retrieve context</span>
131-
</div>
132-
<div className="flex flex-col gap-1">
133-
<span className="text-sm font-medium">Ops dashboard</span>
134-
<span className="text-sm text-muted-foreground">Monitor usage and exports</span>
135-
</div>
136-
</div>
137-
</CardContent>
138-
<CardFooter>
139-
<p className="text-sm text-muted-foreground">
140-
Built for agents that need stable memory across deploys, sessions, and frameworks.
141-
</p>
142-
</CardFooter>
143-
</Card>
59+
<MotionDiv variants={landingCard} whileHover={landingHover} whileTap={{ scale: 0.99 }}>
60+
<HeroConsole />
14461
</MotionDiv>
14562
</div>
14663
</MotionSection>

0 commit comments

Comments
 (0)