Skip to content

Commit c93cafb

Browse files
committed
updated UI
1 parent cc397c0 commit c93cafb

34 files changed

Lines changed: 2896 additions & 83 deletions

frontend/main.jsx

Lines changed: 160 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -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-
144109
const 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+
187309
const 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

Comments
 (0)