11import { colors , fonts , gradient } from '../tokens'
22import { INSTALL_CMD } from '../constants'
33
4+ const keyframesStyle = `
5+ @keyframes lattice-fade-slide-up {
6+ from { opacity: 0; transform: translateY(12px); }
7+ to { opacity: 1; transform: translateY(0); }
8+ }
9+ @keyframes lattice-fade-in {
10+ from { opacity: 0; }
11+ to { opacity: 1; }
12+ }
13+ @keyframes lattice-float {
14+ 0%, 100% { transform: translateY(0); }
15+ 50% { transform: translateY(-8px); }
16+ }
17+ `
18+
419const styles : Record < string , React . CSSProperties > = {
520 hero : {
621 background : gradient ,
722 padding : '5rem 2rem 4rem' ,
823 textAlign : 'center' as const ,
924 color : '#ffffff' ,
25+ position : 'relative' as const ,
26+ overflow : 'hidden' as const ,
27+ } ,
28+ bgDecoration : {
29+ position : 'absolute' as const ,
30+ inset : 0 ,
31+ pointerEvents : 'none' as const ,
32+ overflow : 'hidden' as const ,
33+ } ,
34+ content : {
35+ position : 'relative' as const ,
36+ } ,
37+ brandMark : {
38+ marginBottom : '2rem' ,
39+ } ,
40+ brandTitle : {
41+ fontSize : 'clamp(28px, 4vw, 44px)' ,
42+ fontWeight : 200 ,
43+ fontFamily : "'Outfit', sans-serif" ,
44+ letterSpacing : '0.45em' ,
45+ textTransform : 'uppercase' as const ,
46+ margin : 0 ,
47+ lineHeight : 1 ,
48+ animation : 'lattice-fade-slide-up 1.5s ease-out 0.3s both' ,
49+ background : 'linear-gradient(90deg, rgba(255,255,255,0.6), #ffffff, rgba(255,255,255,0.6))' ,
50+ WebkitBackgroundClip : 'text' ,
51+ WebkitTextFillColor : 'transparent' ,
52+ backgroundClip : 'text' ,
53+ } ,
54+ brandSubtitle : {
55+ fontSize : 'clamp(10px, 1.2vw, 14px)' ,
56+ fontWeight : 300 ,
57+ fontFamily : "'Outfit', sans-serif" ,
58+ letterSpacing : '0.3em' ,
59+ color : 'rgba(140, 185, 200, 0.5)' ,
60+ textTransform : 'uppercase' as const ,
61+ margin : '0.75rem 0 0' ,
62+ animation : 'lattice-fade-in 1.5s ease-out 0.6s both' ,
1063 } ,
1164 title : {
1265 fontSize : '3rem' ,
@@ -35,8 +88,8 @@ const styles: Record<string, React.CSSProperties> = {
3588 ctaPrimary : {
3689 display : 'inline-block' ,
3790 padding : '0.75rem 2rem' ,
38- background : '#ffffff' ,
39- color : colors . accentBlue ,
91+ background : colors . accentBlue ,
92+ color : colors . textOnAccent ,
4093 borderRadius : '8px' ,
4194 textDecoration : 'none' ,
4295 fontWeight : 600 ,
@@ -50,7 +103,7 @@ const styles: Record<string, React.CSSProperties> = {
50103 padding : '0.75rem 2rem' ,
51104 background : 'transparent' ,
52105 color : '#ffffff' ,
53- border : '2px solid rgba(255, 255,255,0.6 )' ,
106+ border : '2px solid rgba(0, 255, 255, 0.4 )' ,
54107 borderRadius : '8px' ,
55108 textDecoration : 'none' ,
56109 fontWeight : 600 ,
@@ -70,24 +123,127 @@ const styles: Record<string, React.CSSProperties> = {
70123 } ,
71124}
72125
126+ function HeroCurves ( ) {
127+ return (
128+ < svg
129+ style = { { width : '100%' , height : '100%' , position : 'absolute' , top : 0 , left : 0 } }
130+ viewBox = "0 0 800 400"
131+ fill = "none"
132+ preserveAspectRatio = "xMidYMid slice"
133+ xmlns = "http://www.w3.org/2000/svg"
134+ >
135+ < defs >
136+ < linearGradient id = "hero-curve-grad" x1 = "0%" y1 = "0%" x2 = "100%" y2 = "0%" >
137+ < stop offset = "0%" stopColor = "transparent" />
138+ < stop offset = "50%" stopColor = "rgba(0, 255, 255, 0.12)" />
139+ < stop offset = "100%" stopColor = "transparent" />
140+ </ linearGradient >
141+ </ defs >
142+ { /* Organic lattice curves — flowing Bezier paths */ }
143+ < path
144+ d = "M400 60 C 200 60, 80 200, 400 340 C 720 200, 600 60, 400 60"
145+ stroke = "url(#hero-curve-grad)"
146+ strokeWidth = "0.8"
147+ style = { { animation : 'lattice-float 6s ease-in-out infinite' } }
148+ />
149+ < path
150+ d = "M400 60 C 150 100, 120 300, 400 340 C 680 300, 650 100, 400 60"
151+ stroke = "url(#hero-curve-grad)"
152+ strokeWidth = "0.8"
153+ style = { { animation : 'lattice-float 6s ease-in-out 1s infinite' } }
154+ />
155+ < path
156+ d = "M400 60 C 250 120, 200 280, 400 340 C 600 280, 550 120, 400 60"
157+ stroke = "url(#hero-curve-grad)"
158+ strokeWidth = "0.8"
159+ style = { { animation : 'lattice-float 6s ease-in-out 2s infinite' } }
160+ />
161+ { /* Node dots at curve intersections */ }
162+ < circle
163+ cx = "400"
164+ cy = "60"
165+ r = "2.5"
166+ fill = "rgba(0, 255, 255, 0.3)"
167+ style = { { animation : 'lattice-float 6s ease-in-out infinite' } }
168+ />
169+ < circle
170+ cx = "400"
171+ cy = "340"
172+ r = "2.5"
173+ fill = "rgba(0, 255, 255, 0.3)"
174+ style = { { animation : 'lattice-float 6s ease-in-out 1s infinite' } }
175+ />
176+ < circle
177+ cx = "160"
178+ cy = "200"
179+ r = "2"
180+ fill = "rgba(0, 255, 255, 0.2)"
181+ style = { { animation : 'lattice-float 6s ease-in-out 0.5s infinite' } }
182+ />
183+ < circle
184+ cx = "640"
185+ cy = "200"
186+ r = "2"
187+ fill = "rgba(0, 255, 255, 0.2)"
188+ style = { { animation : 'lattice-float 6s ease-in-out 1.5s infinite' } }
189+ />
190+ </ svg >
191+ )
192+ }
193+
73194export function Hero ( ) {
74195 return (
75196 < section style = { styles . hero } >
76- < h1 style = { styles . title } > Structure the knowledge behind what you build</ h1 >
77- < p style = { styles . subtitle } >
78- When you build with LLMs, research and reasoning vanish into chat logs. Lattice is a CLI that captures it —
79- connecting sources, strategy, requirements, and code into a Git-native knowledge graph that any collaborator,
80- human or agent, can pick up and build on.
81- </ p >
82- < div style = { styles . ctaRow } >
83- < a href = "/getting-started" style = { styles . ctaPrimary } >
84- Get Started
85- </ a >
86- < a href = "/reader?url=https://forkzero.github.io/lattice/lattice-data.json" style = { styles . ctaSecondary } >
87- See it live
88- </ a >
197+ < style > { keyframesStyle } </ style >
198+ < div style = { styles . bgDecoration } >
199+ { /* Blurred ambient orbs */ }
200+ < div
201+ style = { {
202+ position : 'absolute' ,
203+ top : '-30%' ,
204+ right : '-10%' ,
205+ width : '400px' ,
206+ height : '400px' ,
207+ background : 'rgba(0, 255, 255, 0.06)' ,
208+ borderRadius : '50%' ,
209+ filter : 'blur(80px)' ,
210+ } }
211+ />
212+ < div
213+ style = { {
214+ position : 'absolute' ,
215+ bottom : '-20%' ,
216+ left : '-5%' ,
217+ width : '350px' ,
218+ height : '350px' ,
219+ background : 'rgba(139,92,246,0.12)' ,
220+ borderRadius : '50%' ,
221+ filter : 'blur(80px)' ,
222+ } }
223+ />
224+ < HeroCurves />
225+ </ div >
226+ < div style = { styles . content } >
227+ < div style = { styles . brandMark } >
228+ < div style = { styles . brandTitle } > Lattice</ div >
229+ < div style = { styles . brandSubtitle } > Knowledge Coordination Protocol</ div >
230+ </ div >
231+ < h1 style = { styles . title } > Structure the knowledge behind what you build</ h1 >
232+ < p style = { styles . subtitle } >
233+ When you build with LLMs, research and reasoning vanish into chat logs. Lattice is a CLI that captures it —
234+ connecting sources, strategy, requirements, and code into a Git-native knowledge graph that any collaborator,
235+ human or agent, can pick up and build on.
236+ </ p >
237+ < div style = { styles . ctaRow } >
238+ < a href = "/getting-started" style = { styles . ctaPrimary } >
239+ Get Started
240+ </ a >
241+ < a href = "/reader?url=https://forkzero.github.io/lattice/lattice-data.json" style = { styles . ctaSecondary } >
242+ See it live
243+ </ a >
244+ </ div >
245+ < span style = { styles . installHint } > { INSTALL_CMD } </ span >
89246 </ div >
90- < span style = { styles . installHint } > { INSTALL_CMD } </ span >
91247 </ section >
92248 )
93249}
0 commit comments