@@ -49,7 +49,7 @@ const Hero = () => {
4949 < span > AI Analyst for Startup Evaluation</ span >
5050 </ div >
5151 < h1 className = "mt-6 text-4xl md:text-6xl font-extrabold tracking-tight" >
52- Cut through noise. < span className = "text-accent" > Invest </ span > with confidence.
52+ Pitch < span className = "text-accent" > Lense </ span >
5353 </ h1 >
5454 < p className = "mt-4 md:text-lg text-secondary max-w-3xl mx-auto" >
5555 PitchLense synthesizes pitch decks, founder calls and public signals to produce concise, investor‑ready deal notes with benchmarks and risk assessments.
@@ -85,7 +85,7 @@ const Features = () => {
8585 < div className = "max-w-7xl mx-auto px-6" >
8686 < div className = "grid md:grid-cols-2 gap-8 items-center" >
8787 < div ref = { leftRef } className = "rounded-xl bg-[linear-gradient(180deg,rgba(255,255,255,0.06)_0%,rgba(255,255,255,0.0)_100%)] border border-white/10 p-6 shadow-card reveal" style = { { '--tx' : '-40px' } } >
88- < img src = "/static/banner.svg " alt = "dashboard " className = "rounded-lg opacity-90" />
88+ < img src = "/static/tag_line.gif " alt = "PitchLense Tagline " className = "rounded-lg opacity-90" />
8989 </ div >
9090 < ul ref = { rightRef } className = "space-y-5 reveal" style = { { '--tx' : '40px' } } >
9191 { [ {
@@ -106,41 +106,6 @@ const Features = () => {
106106 ) ;
107107} ;
108108
109- const RiskGrid = ( ) => {
110- const risks = [
111- [ 'Market' , 'Small TAM, weak growth, crowded space, limited differentiation' ] ,
112- [ 'Product' , 'Early stage, unclear PMF, technical risk, weak IP' ] ,
113- [ 'Team/Founder' , 'Churn, single‑founder, skill gaps, credibility' ] ,
114- [ 'Financial' , 'Inconsistent metrics, burn, CAC/LTV, margins' ] ,
115- [ 'Customer & Traction' , 'Low traction, churn, retention, concentration' ] ,
116- [ 'Operational' , 'Supply chain, GTM, inefficiency, execution' ] ,
117- [ 'Competitive' , 'Incumbent strength, low barriers, defensibility' ] ,
118- [ 'Legal & Regulatory' , 'Grey areas, compliance gaps, disputes, IP risks' ] ,
119- [ 'Exit' , 'Limited pathways, low sector exits, late‑stage appeal' ]
120- ] ;
121- return (
122- < section id = "risks" className = "py-20 bg-black/20" >
123- < div className = "max-w-7xl mx-auto px-6" >
124- < h2 className = "text-2xl md:text-3xl font-bold" > Risk categories we assess</ h2 >
125- < div className = "mt-8 grid sm:grid-cols-2 lg:grid-cols-3 gap-4" >
126- { risks . map ( ( [ name , desc ] , i ) => (
127- < div key = { i } className = "rounded-xl border border-white/10 bg-surface p-5 hover:translate-y-[-2px] transition" >
128- < div className = "flex items-center justify-between" >
129- < p className = "font-semibold" > { name } </ p >
130- < span className = "text-xs text-black bg-accent px-2 py-0.5 rounded-full" > v1</ span >
131- </ div >
132- < p className = "mt-2 text-secondary text-sm" > { desc } </ p >
133- </ div >
134- ) ) }
135- </ div >
136- < div className = "mt-10 flex justify-center" >
137- < img src = "/static/hero_trans.svg" alt = "PitchLense overview" className = "w-full max-w-4xl md:max-w-5xl rounded-lg opacity-90" />
138- </ div >
139- </ div >
140- </ section >
141- ) ;
142- } ;
143-
144109const YouTubeVideo = ( ) => {
145110 const videoRef = useRef ( null ) ;
146111
@@ -184,6 +149,163 @@ const YouTubeVideo = () => {
184149 ) ;
185150} ;
186151
152+ const RadialDock = ( ) => {
153+ const dockRef = useRef ( null ) ;
154+
155+ useEffect ( ( ) => {
156+ const io = new IntersectionObserver ( ( entries ) => {
157+ entries . forEach ( ( entry ) => {
158+ if ( entry . isIntersecting ) {
159+ entry . target . classList . add ( 'reveal-visible' ) ;
160+ }
161+ } ) ;
162+ } , { threshold : 0.2 } ) ;
163+
164+ if ( dockRef . current ) io . observe ( dockRef . current ) ;
165+ return ( ) => io . disconnect ( ) ;
166+ } , [ ] ) ;
167+
168+ const dockItems = [
169+ { title : 'Startup Analysis' , icon : '📊' , color : 'from-blue-500/20 to-cyan-500/20' } ,
170+ { title : 'Investment Management' , icon : '💰' , color : 'from-green-500/20 to-emerald-500/20' } ,
171+ { title : 'Global Market Performance & News' , icon : '🌍' , color : 'from-purple-500/20 to-violet-500/20' } ,
172+ { title : 'Networking with other VC, Investors' , icon : '🤝' , color : 'from-orange-500/20 to-red-500/20' } ,
173+ { title : 'AI Meeting Assistance' , icon : '🤖' , color : 'from-pink-500/20 to-rose-500/20' } ,
174+ { title : 'Connect your email client with Pitchlense' , icon : '📧' , color : 'from-indigo-500/20 to-blue-500/20' } ,
175+ { title : 'Company Profiles' , icon : '🏢' , color : 'from-teal-500/20 to-cyan-500/20' } ,
176+ { title : 'Crowd funding & Insider trades' , icon : '📈' , color : 'from-yellow-500/20 to-orange-500/20' }
177+ ] ;
178+
179+ return (
180+ < section id = "radial-dock" className = "py-20 relative overflow-hidden" >
181+ < div className = "max-w-7xl mx-auto px-6" >
182+ < div ref = { dockRef } className = "text-center reveal" style = { { '--ty' : '30px' } } >
183+ < h2 className = "text-2xl md:text-3xl font-bold mb-4" > PitchLense Capabilities</ h2 >
184+ < p className = "text-secondary mb-12 max-w-2xl mx-auto" >
185+ Explore our comprehensive suite of AI-powered tools designed to revolutionize startup evaluation and investment management.
186+ </ p >
187+
188+ { /* Main Container with Slideshows */ }
189+ < div className = "relative flex items-center justify-center gap-8" >
190+ { /* Left Vertical Slideshow */ }
191+ < div className = "movie-reel-container hidden lg:block" >
192+ < div className = "movie-reel-track" >
193+ < div className = "movie-reel-strip" >
194+ { [ 1 , 2 , 3 , 4 , 5 , 6 , 1 , 2 , 3 , 4 , 5 , 6 ] . map ( ( num , index ) => (
195+ < div key = { index } className = "movie-reel-frame" >
196+ < img
197+ src = { `/static/screenshots/${ num } .png` }
198+ alt = { `Screenshot ${ num } ` }
199+ className = "w-full h-full object-cover rounded-lg"
200+ />
201+ </ div >
202+ ) ) }
203+ </ div >
204+ </ div >
205+ </ div >
206+
207+ { /* Radial Dock Container */ }
208+ < div className = "radial-dock-container relative w-[600px] h-[600px]" >
209+ { /* SVG for connection lines */ }
210+ < svg className = "absolute inset-0 w-full h-full pointer-events-none" viewBox = "0 0 600 600" >
211+ { dockItems . map ( ( _ , index ) => {
212+ const angle = ( index * 45 ) * ( Math . PI / 180 ) ;
213+ const radius = 200 ;
214+ const centerX = 300 ;
215+ const centerY = 300 ;
216+ const x1 = centerX ;
217+ const y1 = centerY ;
218+ const x2 = centerX + radius * Math . cos ( angle ) ;
219+ const y2 = centerY + radius * Math . sin ( angle ) ;
220+
221+ return (
222+ < line
223+ key = { index }
224+ x1 = { x1 }
225+ y1 = { y1 }
226+ x2 = { x2 }
227+ y2 = { y2 }
228+ stroke = "rgba(241, 216, 91, 0.3)"
229+ strokeWidth = "2"
230+ strokeDasharray = "5,5"
231+ className = "connection-line"
232+ />
233+ ) ;
234+ } ) }
235+ </ svg >
236+
237+ { /* Central Logo */ }
238+ < div className = "absolute top-1/2 left-1/2 transform -translate-x-1/2 -translate-y-1/2 z-10 w-24 h-24 rounded-full dock-glass flex items-center justify-center cursor-pointer group" >
239+ < img
240+ src = "/static/logo.svg"
241+ alt = "PitchLense"
242+ className = "w-16 h-16 transition-transform duration-300 group-hover:scale-110"
243+ onError = { ( e ) => {
244+ e . currentTarget . outerHTML = '<div class="w-16 h-16 rounded-full bg-accent grid place-items-center shadow-card"><span class="font-extrabold text-black text-2xl">P</span></div>' ;
245+ } }
246+ />
247+ </ div >
248+
249+ { /* Dock Items */ }
250+ { dockItems . map ( ( item , index ) => {
251+ // Start from top (0 degrees) and go clockwise
252+ const angle = ( index * 45 ) * ( Math . PI / 180 ) ;
253+ const radius = 200 ;
254+ const centerX = 300 ;
255+ const centerY = 300 ;
256+ const x = centerX + radius * Math . cos ( angle ) ;
257+ const y = centerY + radius * Math . sin ( angle ) ;
258+
259+ return (
260+ < div
261+ key = { index }
262+ className = "radial-dock-item absolute dock-item-glass cursor-pointer group"
263+ style = { {
264+ left : `${ x - 60 } px` ,
265+ top : `${ y - 60 } px` ,
266+ width : '120px' ,
267+ height : '120px'
268+ } }
269+ >
270+ < div className = "w-full h-full flex flex-col items-center justify-center p-4 text-center" >
271+ < div className = "dock-item-icon text-3xl mb-2 transition-transform duration-300 group-hover:scale-110" >
272+ { item . icon }
273+ </ div >
274+ < div className = "dock-item-text text-xs font-medium text-white/90 leading-tight" >
275+ { item . title }
276+ </ div >
277+ </ div >
278+
279+ { /* Gradient overlay */ }
280+ < div className = { `absolute inset-0 rounded-2xl bg-gradient-to-br ${ item . color } opacity-0 group-hover:opacity-100 transition-opacity duration-300 pointer-events-none` } />
281+ </ div >
282+ ) ;
283+ } ) }
284+ </ div >
285+
286+ { /* Right Vertical Slideshow */ }
287+ < div className = "movie-reel-container hidden lg:block" >
288+ < div className = "movie-reel-track" >
289+ < div className = "movie-reel-strip movie-reel-reverse" >
290+ { [ 6 , 5 , 4 , 3 , 2 , 1 , 6 , 5 , 4 , 3 , 2 , 1 ] . map ( ( num , index ) => (
291+ < div key = { index } className = "movie-reel-frame" >
292+ < img
293+ src = { `/static/screenshots/${ num } .png` }
294+ alt = { `Screenshot ${ num } ` }
295+ className = "w-full h-full object-cover rounded-lg"
296+ />
297+ </ div >
298+ ) ) }
299+ </ div >
300+ </ div >
301+ </ div >
302+ </ div >
303+ </ div >
304+ </ div >
305+ </ section >
306+ ) ;
307+ } ;
308+
187309const Capabilities = ( ) => (
188310 < section id = "capabilities" className = "py-20" >
189311 < div className = "max-w-7xl mx-auto px-6" >
@@ -229,7 +351,7 @@ const App = () => (
229351 < Hero />
230352 < Features />
231353 < YouTubeVideo />
232- < RiskGrid />
354+ < RadialDock />
233355 { /* <CTA /> */ }
234356 </ main >
235357 < Footer />
0 commit comments