Skip to content

Commit c3eec63

Browse files
gmoonclaude
andcommitted
Replace horizontal flow diagram with vertical trace using real lattice data
Hero now mentions CLI and Git-native explicitly. How It Works section shows a real 4-layer trace (SRC → THX → REQ → IMP) from Lattice's own knowledge graph instead of the generic dot-and-arrow diagram. Fully responsive vertical layout, no horizontal scroll on mobile. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent cd845f9 commit c3eec63

2 files changed

Lines changed: 151 additions & 19 deletions

File tree

src/components/Hero.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,8 +74,8 @@ export function Hero() {
7474
<section style={styles.hero}>
7575
<h1 style={styles.title}>Structure the knowledge behind what you build</h1>
7676
<p style={styles.subtitle}>
77-
When you build with LLMs, the research and reasoning behind every decision disappears into chat. Lattice
78-
captures it — connecting sources, strategy, requirements, and code into a knowledge graph that any collaborator,
77+
When you build with LLMs, research and reasoning vanish into chat logs. Lattice is a CLI that captures it —
78+
connecting sources, strategy, requirements, and code into a Git-native knowledge graph that any collaborator,
7979
human or agent, can pick up and build on.
8080
</p>
8181
<div style={styles.ctaRow}>

src/pages/HomePage.tsx

Lines changed: 149 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import { colors, fonts, shadows, radius } from '../tokens'
22
import { Header } from '../components/Header'
33
import { Hero } from '../components/Hero'
44
import { ProjectCard } from '../components/ProjectCard'
5-
import { LatticeFlowDiagram } from '../components/LatticeFlowDiagram'
65
import { Footer } from '../components/Footer'
76
import { projects } from '../data/projects'
87
import { blogPosts } from '../data/blog-posts'
@@ -84,7 +83,36 @@ function ValueProps() {
8483
)
8584
}
8685

87-
// --- How It Works ---
86+
// --- How It Works (Vertical Trace) ---
87+
88+
const traceNodes = [
89+
{
90+
type: 'Source',
91+
color: colors.accentBlue,
92+
id: 'SRC-REQUIREMENTS-DRIFT',
93+
title: 'Requirements Documentation Drifts From Implementation',
94+
},
95+
{
96+
type: 'Thesis',
97+
color: colors.accentPurple,
98+
id: 'THX-VERSION-AWARE',
99+
title: 'Traceability Must Be Version-Aware to Enable Drift Detection',
100+
},
101+
{
102+
type: 'Requirement',
103+
color: colors.accentYellow,
104+
id: 'REQ-CORE-005',
105+
title: 'Automatic Drift Detection',
106+
},
107+
{
108+
type: 'Implementation',
109+
color: colors.accentGreen,
110+
id: 'IMP-GRAPH-001',
111+
title: 'Graph Traversal and Drift Detection',
112+
},
113+
]
114+
115+
const traceEdges = ['supports', 'derives', 'satisfies']
88116

89117
const howStyles: Record<string, React.CSSProperties> = {
90118
section: {
@@ -139,20 +167,133 @@ const howStyles: Record<string, React.CSSProperties> = {
139167
},
140168
}
141169

170+
const traceStyles: Record<string, React.CSSProperties> = {
171+
wrapper: {
172+
display: 'flex',
173+
flexDirection: 'column' as const,
174+
alignItems: 'center',
175+
margin: '2rem 0',
176+
},
177+
card: {
178+
width: '100%',
179+
maxWidth: '520px',
180+
background: colors.bgCard,
181+
borderRadius: radius,
182+
padding: '1rem 1.25rem',
183+
boxShadow: shadows.sm,
184+
border: `1px solid ${colors.borderColor}`,
185+
},
186+
cardHeader: {
187+
display: 'flex',
188+
alignItems: 'center',
189+
gap: '0.5rem',
190+
marginBottom: '0.35rem',
191+
flexWrap: 'wrap' as const,
192+
},
193+
typePill: {
194+
fontSize: '0.65rem',
195+
fontWeight: 700,
196+
letterSpacing: '0.06em',
197+
textTransform: 'uppercase' as const,
198+
borderRadius: '100px',
199+
padding: '0.15rem 0.55rem',
200+
lineHeight: 1.4,
201+
},
202+
nodeId: {
203+
fontSize: '0.78rem',
204+
fontFamily: fonts.mono,
205+
color: colors.textMuted,
206+
},
207+
version: {
208+
fontSize: '0.72rem',
209+
fontFamily: fonts.mono,
210+
color: colors.textMuted,
211+
marginLeft: 'auto',
212+
},
213+
nodeTitle: {
214+
fontSize: '1rem',
215+
fontWeight: 600,
216+
fontFamily: fonts.system,
217+
color: colors.textPrimary,
218+
margin: 0,
219+
lineHeight: 1.35,
220+
},
221+
connector: {
222+
display: 'flex',
223+
flexDirection: 'column' as const,
224+
alignItems: 'center',
225+
padding: '0.15rem 0',
226+
},
227+
connectorLine: {
228+
width: '2px',
229+
height: '12px',
230+
background: colors.borderColor,
231+
},
232+
connectorLabel: {
233+
fontSize: '0.75rem',
234+
fontFamily: fonts.mono,
235+
color: colors.textMuted,
236+
padding: '0.1rem 0',
237+
},
238+
connectorArrow: {
239+
fontSize: '0.65rem',
240+
color: colors.textMuted,
241+
lineHeight: 1,
242+
},
243+
}
244+
245+
const inlineCode: React.CSSProperties = {
246+
background: 'rgba(0,0,0,0.06)',
247+
color: colors.accentBlue,
248+
padding: '0.15rem 0.4rem',
249+
borderRadius: '4px',
250+
fontSize: '0.9em',
251+
fontFamily: fonts.mono,
252+
}
253+
254+
function VerticalTrace() {
255+
return (
256+
<div style={traceStyles.wrapper}>
257+
{traceNodes.flatMap((node, i) => [
258+
<div key={node.id} style={{ ...traceStyles.card, borderLeft: `4px solid ${node.color}` }}>
259+
<div style={traceStyles.cardHeader}>
260+
<span style={{ ...traceStyles.typePill, color: node.color, background: `${node.color}14` }}>
261+
{node.type}
262+
</span>
263+
<span style={traceStyles.nodeId}>{node.id}</span>
264+
<span style={traceStyles.version}>v1.0.0</span>
265+
</div>
266+
<p style={traceStyles.nodeTitle}>{node.title}</p>
267+
</div>,
268+
...(i < traceEdges.length
269+
? [
270+
<div key={`edge-${i}`} style={traceStyles.connector}>
271+
<div style={traceStyles.connectorLine} />
272+
<span style={traceStyles.connectorLabel}>{traceEdges[i]}</span>
273+
<div style={traceStyles.connectorLine} />
274+
<span style={traceStyles.connectorArrow}>{'\u25BC'}</span>
275+
</div>,
276+
]
277+
: []),
278+
])}
279+
</div>
280+
)
281+
}
282+
142283
function HowItWorks() {
143284
return (
144285
<section style={howStyles.section}>
145286
<div style={howStyles.container}>
146287
<h2 style={howStyles.sectionTitle}>How it works</h2>
147288
<p style={howStyles.intro}>
148-
Lattice organizes knowledge into four layers, connected by version-bound edges. When anything changes
149-
upstream, you know.
289+
Lattice organizes knowledge into four layers &mdash; sources, theses, requirements, and implementations
290+
&mdash; connected by version-bound edges. Here&rsquo;s a real trace from Lattice&rsquo;s own knowledge graph:
150291
</p>
151-
<LatticeFlowDiagram />
292+
<VerticalTrace />
152293
<p style={howStyles.body}>
153-
Every edge records the version of both source and target nodes. When a node is updated, edges bound to the old
154-
version are flagged as potentially stale. Run <code style={inlineCode}>lattice drift</code> to surface exactly
155-
what needs review — no manual tracking, no stale docs hiding in a wiki.
294+
Every edge records the version it was bound to. When a source is updated or a thesis is revised,{' '}
295+
<code style={inlineCode}>lattice drift</code> tells you exactly which downstream requirements and
296+
implementations need review.
156297
</p>
157298
<pre style={howStyles.codeBlock}>
158299
<code>{`.lattice/
@@ -171,15 +312,6 @@ function HowItWorks() {
171312
)
172313
}
173314

174-
const inlineCode: React.CSSProperties = {
175-
background: 'rgba(255,255,255,0.1)',
176-
color: colors.accentBlue,
177-
padding: '0.15rem 0.4rem',
178-
borderRadius: '4px',
179-
fontSize: '0.9em',
180-
fontFamily: fonts.mono,
181-
}
182-
183315
// --- Featured Article ---
184316

185317
const featuredStyles: Record<string, React.CSSProperties> = {

0 commit comments

Comments
 (0)