Skip to content

Commit e2a3a6c

Browse files
bloveclaude
andcommitted
refactor(website): the adapter and agent rows read as a banded feature list
Each capability line sits in its own soft band with a left accent bar, white-on-tint inside the first-class LangGraph lane and grey elsewhere, so the lines read as a list rather than loose paragraph text. The phone stack mirrors the same treatment from the same data. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
1 parent 96677bf commit e2a3a6c

4 files changed

Lines changed: 117 additions & 8 deletions

File tree

apps/website/src/components/landing/EnterpriseArchitecture.tsx

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,41 @@ function CardRows({ card }: { card: Card }) {
162162
</text>
163163
</g>
164164
);
165+
case 'items':
166+
return (
167+
<g
168+
key={i}
169+
className="arch-items"
170+
data-tone={card.highlight ? 'tp' : 'plain'}
171+
>
172+
{row.items.map((item, j) => {
173+
const y = row.y + j * row.step;
174+
return (
175+
<g key={item}>
176+
<rect
177+
className="arch-item-band"
178+
x={card.x + 12}
179+
y={y - 18}
180+
width={card.width - 24}
181+
height={26}
182+
rx={8}
183+
/>
184+
<rect
185+
className="arch-item-bar"
186+
x={card.x + 12}
187+
y={y - 14}
188+
width={3}
189+
height={18}
190+
rx={1.5}
191+
/>
192+
<text className="arch-body" x={card.x + CARD_PAD} y={y}>
193+
{item}
194+
</text>
195+
</g>
196+
);
197+
})}
198+
</g>
199+
);
165200
case 'marks':
166201
return (
167202
<g key={i}>
@@ -379,6 +414,7 @@ function ArchitectureStack() {
379414
const caps = c.rows.find((r) => r.kind === 'caps');
380415
const marks = c.rows.find((r) => r.kind === 'marks');
381416
const texts = c.rows.filter((r) => r.kind === 'text');
417+
const items = c.rows.find((r) => r.kind === 'items');
382418
const mono = c.rows.find((r) => r.kind === 'mono');
383419
const badges = c.rows.filter((r) => r.kind === 'badge');
384420
return (
@@ -409,6 +445,13 @@ function ArchitectureStack() {
409445
)}
410446
</ul>
411447
) : null}
448+
{items && items.kind === 'items' ? (
449+
<ul className="arch-stack-items">
450+
{items.items.map((item) => (
451+
<li key={item}>{item}</li>
452+
))}
453+
</ul>
454+
) : null}
412455
{caps && caps.kind === 'caps' ? (
413456
<ul className="arch-stack-caps">
414457
{caps.caps.map((cap) => (

apps/website/src/lib/architecture-diagram.spec.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,13 @@ describe('architecture diagram geometry', () => {
119119
c.y + c.height - 12
120120
);
121121
}
122+
if (r.kind === 'items') {
123+
const last = r.y + (r.items.length - 1) * r.step;
124+
expect(r.y - 18, `${c.id} items top`).toBeGreaterThan(c.y + 40);
125+
expect(last + 8, `${c.id} items bottom`).toBeLessThanOrEqual(
126+
c.y + c.height - 8
127+
);
128+
}
122129
if (r.kind === 'caps') {
123130
expect(r.y + r.caps.length * 40).toBeLessThanOrEqual(
124131
c.y + c.height - 24

apps/website/src/lib/architecture-diagram.ts

Lines changed: 33 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,14 @@ export type Row =
8888
readonly mark: LogoKey;
8989
readonly label: string;
9090
}
91+
/** A banded list: one row per item, each with a left accent bar. */
92+
| {
93+
readonly kind: 'items';
94+
readonly y: number;
95+
readonly items: readonly string[];
96+
/** Vertical pitch between rows. */
97+
readonly step: number;
98+
}
9199
/** A row of mark badges with no labels. */
92100
| {
93101
readonly kind: 'marks';
@@ -216,9 +224,16 @@ export const CARDS: readonly Card[] = [
216224
tag: 'FIRST-CLASS',
217225
highlight: true,
218226
rows: [
219-
{ kind: 'text', y: 212, text: 'checkpoints · interrupts' },
220-
{ kind: 'text', y: 240, text: 'time travel · memory' },
221-
{ kind: 'text', y: 268, text: 'subgraphs · durable runs' },
227+
{
228+
kind: 'items',
229+
y: 212,
230+
step: 32,
231+
items: [
232+
'checkpoints · interrupts',
233+
'time travel · memory',
234+
'subgraphs · durable runs',
235+
],
236+
},
222237
],
223238
},
224239
{
@@ -231,7 +246,9 @@ export const CARDS: readonly Card[] = [
231246
title2: 'protocol',
232247
href: '/docs/ag-ui/getting-started/introduction',
233248
mark: 'agui',
234-
rows: [{ kind: 'text', y: 460, text: 'events · tools · state' }],
249+
rows: [
250+
{ kind: 'items', y: 460, step: 32, items: ['events · tools · state'] },
251+
],
235252
},
236253
{
237254
id: 'langsmith',
@@ -243,9 +260,12 @@ export const CARDS: readonly Card[] = [
243260
href: '/docs/langgraph/guides/deployment',
244261
mark: 'langchain',
245262
rows: [
246-
{ kind: 'text', y: 172, text: 'deploy · observe' },
247-
{ kind: 'text', y: 212, text: 'traces · evals' },
248-
{ kind: 'text', y: 240, text: 'or self-hosted' },
263+
{
264+
kind: 'items',
265+
y: 200,
266+
step: 32,
267+
items: ['deploy · observe', 'traces · evals', 'or self-hosted'],
268+
},
249269
],
250270
},
251271
{
@@ -264,7 +284,12 @@ export const CARDS: readonly Card[] = [
264284
size: 30,
265285
step: 34,
266286
},
267-
{ kind: 'text', y: 468, text: 'CrewAI · Mastra · Microsoft' },
287+
{
288+
kind: 'items',
289+
y: 468,
290+
step: 32,
291+
items: ['CrewAI · Mastra · Microsoft'],
292+
},
268293
],
269294
},
270295
];

apps/website/src/styles/landing.css

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1773,6 +1773,40 @@
17731773
font-weight: 500;
17741774
fill: #2a2f3a;
17751775
}
1776+
/* Adapter and agent capability rows: a banded list with a left accent, so
1777+
* the lines read as a feature list rather than loose paragraph text. */
1778+
.arch-figure .arch-item-band {
1779+
fill: #f2f5f8;
1780+
}
1781+
.arch-figure .arch-item-bar {
1782+
fill: #c2cad6;
1783+
}
1784+
.arch-figure .arch-items[data-tone='tp'] .arch-item-band {
1785+
fill: rgba(255, 255, 255, 0.75);
1786+
}
1787+
.arch-figure .arch-items[data-tone='tp'] .arch-item-bar {
1788+
fill: #2f5fa8;
1789+
}
1790+
.arch-stack-items {
1791+
list-style: none;
1792+
margin: 10px 0 0;
1793+
padding: 0;
1794+
display: grid;
1795+
gap: 6px;
1796+
font-family: var(--font-inter);
1797+
font-size: 13px;
1798+
color: var(--color-text-secondary);
1799+
}
1800+
.arch-stack-items li {
1801+
background: #f2f5f8;
1802+
border-left: 3px solid #c2cad6;
1803+
border-radius: 8px;
1804+
padding: 6px 10px;
1805+
}
1806+
.arch-stack-card[data-highlight] .arch-stack-items li {
1807+
background: rgba(255, 255, 255, 0.75);
1808+
border-left-color: #2f5fa8;
1809+
}
17761810
.arch-figure .arch-badge rect {
17771811
fill: #fff;
17781812
stroke: #e2e6ec;

0 commit comments

Comments
 (0)