Skip to content

Commit ce9a1fa

Browse files
duyetduyetbot
andauthored
feat(dashboard): shadcn/ui redesign — landing page, dashboard spacing, chat components (#339)
* feat(dashboard): add shadcn semantic token aliases to design system Co-Authored-By: Duyet Le <me@duyet.net> Co-Authored-By: duyetbot <bot@duyet.net> * feat(dashboard): rebuild landing page with shadcn-style blocks Split hero with code demo, numbered workflow, feature grid, CTA band, rich footer. Consistent max-w-6xl px-6 container across sections. Drops the Anthropic-brand experiment (Poppins/Lora, warm palette). Co-Authored-By: Duyet Le <me@duyet.net> Co-Authored-By: duyetbot <bot@duyet.net> * feat(dashboard): shadcn chat components for conversations + spacing normalization New Message/Bubble primitives (shadcn June 2026 chat component API), conversation view rebuilt on them; dashboard pages normalized to consistent px-6/gap-6 shells and bg-card/border-border surfaces. Co-Authored-By: Duyet Le <me@duyet.net> Co-Authored-By: duyetbot <bot@duyet.net> --------- Co-authored-by: duyetbot <bot@duyet.net>
1 parent 42b30dc commit ce9a1fa

28 files changed

Lines changed: 315 additions & 452 deletions

packages/dashboard/src/components/analytics/area-chart.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ export function AreaChartCard({
173173
}, []);
174174

175175
return (
176-
<Card className="flex flex-col gap-4 p-5">
176+
<Card className="flex flex-col gap-4 p-6">
177177
<div className="flex flex-wrap items-start justify-between gap-3">
178178
<div className="flex flex-col gap-1">
179179
<p className="font-mono text-[11px] uppercase tracking-[0.1em] text-fg-4">{title}</p>

packages/dashboard/src/components/analytics/summary-cards.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ export function SummaryCards({
8383
{stats.map((s) => {
8484
const IconComp = s.icon;
8585
return (
86-
<Card key={s.label} className="flex flex-col gap-4 p-5">
86+
<Card key={s.label} className="flex flex-col gap-4 p-6">
8787
<div className="flex items-start justify-between gap-2">
8888
<div className="flex flex-col gap-1.5">
8989
<p className="font-mono text-[11px] uppercase tracking-[0.1em] text-fg-4">

packages/dashboard/src/components/dashboard/analytics/_metric-card.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ export function MetricCard({
2323
iconColor = "text-accent",
2424
}: MetricCardProps) {
2525
return (
26-
<Card className="flex h-full flex-col gap-4 p-5">
26+
<Card className="flex h-full flex-col gap-4 p-6">
2727
<div className="flex items-start justify-between gap-2">
2828
<div className="flex flex-col gap-1">
2929
<h3 className="text-[14px] font-medium text-fg">{title}</h3>

packages/dashboard/src/components/dashboard/analytics/_top-conversations.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ export function TopConversations({ conversations, limit = 5 }: TopConversationsP
3636
}
3737

3838
return (
39-
<Card className="h-full p-5">
39+
<Card className="h-full p-6">
4040
<div className="flex flex-col gap-1">
4141
<h3 className="text-[14px] font-medium text-fg">Top Conversations</h3>
4242
<p className="font-mono text-[11px] uppercase tracking-[0.1em] text-fg-4">

packages/dashboard/src/components/dashboard/analytics/analytics-page-content.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ export function AnalyticsPageContent() {
3636
const loading = loadingProjects || loadingAnalytics;
3737

3838
return (
39-
<div className="flex flex-col gap-6 px-4 lg:px-6">
39+
<div className="flex flex-col gap-6 px-6 py-6 lg:px-8">
4040
<AnalyticsHeader range={range} onRangeChange={setRange} />
4141

4242
{loading && <AnalyticsLoading hasData={!!data} />}

packages/dashboard/src/components/dashboard/conversations/conversations-page.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ function PageHeader({
1717
return (
1818
<header className="mb-[22px] flex flex-col gap-4 sm:flex-row sm:items-start sm:justify-between">
1919
<div className="flex max-w-2xl flex-col gap-1.5">
20-
<h1 className="text-[26px] tracking-tight text-fg">{title}</h1>
21-
<p className="text-[14.5px] leading-6 text-fg-3">{description}</p>
20+
<h1 className="text-2xl font-semibold tracking-tight text-foreground">{title}</h1>
21+
<p className="text-sm text-muted-foreground">{description}</p>
2222
</div>
2323
{actions && <div className="flex flex-wrap items-center gap-2 sm:justify-end">{actions}</div>}
2424
</header>
@@ -53,7 +53,7 @@ function ConversationsContent() {
5353
const showLoadMore = hasMore && conversations.length > 0;
5454

5555
return (
56-
<div className="px-5 sm:px-7">
56+
<div className="flex flex-col gap-6 px-6 py-6 lg:px-8">
5757
<PageHeader
5858
title="Conversations"
5959
description={

packages/dashboard/src/components/dashboard/domains/domains-content.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ export function DomainsContent() {
4141
<Suspense
4242
fallback={<div className="h-32 animate-pulse rounded-[var(--radius-lg)] bg-panel2" />}
4343
>
44-
<div className="flex flex-col gap-component px-4 py-7 lg:px-6">
44+
<div className="flex flex-col gap-6 px-6 py-6 lg:px-8">
4545
<PageHeader
4646
title="Custom Domains"
4747
description="Add a custom domain to serve your project from your own domain with SSL."

packages/dashboard/src/components/dashboard/integrate/integrate-content.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ export default function IntegrateContent() {
135135
const isCurl = fw === "rest";
136136

137137
return (
138-
<div className="flex flex-col gap-5 px-4 lg:px-6">
138+
<div className="flex flex-col gap-6 px-6 py-6 lg:px-8">
139139
<PageHeader
140140
title="Integrate"
141141
description="Pick your framework — copy the adapter and you're persisting state."

packages/dashboard/src/components/dashboard/keys/keys-page.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ function KeysContent() {
8282
};
8383

8484
return (
85-
<div className="flex flex-col space-y-section page-padding section-padding">
85+
<div className="flex flex-col gap-6 px-6 py-6 lg:px-8">
8686
<PageHeader
8787
title="API Keys"
8888
description="Project-scoped keys your agents use to authenticate against the API. Keep them secret."
@@ -100,7 +100,7 @@ function KeysContent() {
100100
/>
101101

102102
{/* Active project selector — shares ProjectScope with the sidebar */}
103-
<Card className="flex flex-col gap-2 p-4 sm:flex-row sm:items-center sm:justify-between">
103+
<Card className="flex flex-col gap-2 p-6 sm:flex-row sm:items-center sm:justify-between">
104104
<div className="flex items-center gap-2.5">
105105
<span className="as-label-sm text-fg-4">Project</span>
106106
{loadingProjects ? (

packages/dashboard/src/components/dashboard/organizations/create/_create-org-loading.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { Card } from "@/components/ui/card";
33

44
export function CreateOrgLoading() {
55
return (
6-
<div className="page-padding flex flex-col gap-section py-7">
6+
<div className="flex flex-col gap-6 px-6 py-6 lg:px-8">
77
<div className="flex items-start gap-3">
88
<span className="mt-0.5 grid size-8 shrink-0 place-items-center rounded-[var(--radius)] text-fg-4">
99
<ArrowLeftIcon className="size-4" aria-hidden="true" />

0 commit comments

Comments
 (0)