Skip to content

Commit fb62a88

Browse files
authored
Feature/landing page setup (#156)
* feat: Enhance SignInPage with form validation and loading state - Implemented form validation using Zod and react-hook-form for email and password fields. - Added loading state to improve user experience during sign-in. - Integrated error handling for various sign-in scenarios, including unverified email and session management. - Updated LoginForm component to accept form props and handle submission logic. - Introduced Loading component for better visual feedback during loading states. - Refactored AuthLayout for improved layout and responsiveness. * feat: Revamp landing page structure and components - Removed the old Home component and replaced it with a new layout for the landing page. - Introduced a new LandingLayout component to encapsulate the Navbar and Footer. - Created multiple new pages for the landing section, including About, Contact, Disclaimer, Grants, Hackathons, Privacy, Projects, and Terms of Service. - Updated the Projects component to include pagination and improved project filtering based on user ownership and status. - Enhanced the ProjectCard component to conditionally display the ellipsis menu based on project ownership. - Added a Footer component for consistent navigation across the landing pages. * feat: Update CampaignTable and pagination handling across user pages - Modified CampaignTable component to accept `limit` and `showPagination` props for flexible display. - Adjusted CampaignTable instances in UserPage and CampaignsPage to utilize new props. - Refactored pagination logic in Projects component to streamline page navigation and improve user experience. - Enhanced Pagination component for better integration and usability across different contexts. * chore: Update Next.js version to 15.5.2 in package.json and package-lock.json - Upgraded Next.js from 15.4.4 to 15.5.2 for improved performance and features. - Updated related dependencies in package-lock.json to reflect the new version. * feat: Refactor Projects and RecentProjects components for improved data fetching and dependency management - Updated fetchProjects function in Projects component to include necessary dependencies for useCallback. - Enhanced RecentProjects component to properly utilize fetchProjects with updated dependency array. - Improved error handling and loading state management during project data fetching. * feat: Add GSAP animations and new waitlist page - Integrated GSAP for enhanced animations in the Navbar and new WaitlistPage component. - Added form validation using Zod and react-hook-form for the waitlist form. - Implemented character animations for the title and subtitle on the waitlist page. - Updated package.json and package-lock.json to include GSAP and @gsap/react dependencies. - Enhanced global styles with new CSS classes for animations and gradients. * feat: A lot of implentations * feat: Enhance landing page components and add newsletter functionality - Updated spacing and layout in LandingPage, BackedBy, WhyBoundless, and Hero components for improved responsiveness. - Introduced a new Newsletter component with form handling and state management. - Added SVG assets for SDF, Trustless, and Stellar branding. - Improved dialog overlay styling for better visual consistency. - Refactored existing components to accommodate new design and functionality. * feat: Add BlogCard and BlogSection components with mock data and styling - Introduced BlogCard component to display individual blog posts with title, excerpt, image, and date. - Created BlogSection component to manage and display a collection of BlogCard components, including responsive design for mobile and desktop views. - Implemented a card stack animation for mobile users and a grid layout for larger screens. - Added mock blog data for initial rendering and testing. - Updated global styles for text clipping and improved layout consistency.
1 parent 9c74e18 commit fb62a88

26 files changed

Lines changed: 809 additions & 20 deletions

app/(landing)/page.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import HowBoundlessWork from '@/components/landing-page/HowBoundlessWork';
1111
import WhyBoundless from '@/components/landing-page/WhyBoundless';
1212
import BackedBy from '@/components/landing-page/BackedBy';
1313
import NewsLetter from '@/components/landing-page/NewsLetter';
14+
import BlogSection from '@/components/landing-page/blog/BlogSection';
1415

1516
export default function LandingPage() {
1617
const containerRef = useRef<HTMLDivElement>(null);
@@ -95,11 +96,15 @@ export default function LandingPage() {
9596
return (
9697
<div ref={containerRef} className='relative overflow-hidden'>
9798
<BeamBackground />
98-
<div ref={contentRef} className='relative z-10 space-y-[80px]'>
99+
<div
100+
ref={contentRef}
101+
className='relative z-10 space-y-[23px] md:space-y-[80px] max-w-[1300px] mx-auto'
102+
>
99103
<Hero />
100104
<WhyBoundless />
101105
<BackedBy />
102106
<NewsLetter />
107+
<BlogSection />
103108
<HowBoundlessWork />
104109
</div>
105110
</div>

app/globals.css

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -357,6 +357,8 @@ input[type='number'] {
357357
#3ae6b2 73.28%
358358
);
359359
-webkit-background-clip: text;
360+
background-clip: text;
361+
color: transparent;
360362
-webkit-text-fill-color: transparent;
361363
}
362364

components/landing-page/BackedBy.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ const BackedBy = () => {
128128

129129
return (
130130
<div
131-
className='w-full h-full py-16 px-6 md:px-12 lg:px-[100px] relative'
131+
className='w-full h-full md:py-16 py-5 px-6 md:px-12 lg:px-[100px] relative'
132132
id='backed-by'
133133
>
134134
<div className='mx-auto relative max-w-[1200px]'>

components/landing-page/BeamBackground.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -304,14 +304,14 @@ export default function BeamBackground() {
304304
</div>
305305

306306
{/* Pattern Placeholder */}
307-
<div className='flex items-center justify-center'>
307+
<div className='flex items-center bg-acscent'>
308308
<div id='pattern' className='w-full h-screen'>
309309
<svg
310310
width='1252'
311311
height='810'
312312
id='pattern'
313313
viewBox='0 0 1252 810'
314-
className='justify-self-center h-screen'
314+
className='justify-self-center w-full h-screen'
315315
fill='none'
316316
xmlns='http://www.w3.org/2000/svg'
317317
>

components/landing-page/Hero.tsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ export default function Hero() {
8484

8585
return (
8686
<div
87-
className='min-h-screen h-screen flex items-stretch md:items-end justify-between pb-[66px] md:mx-[116px] mx-5 relative'
87+
className='min-h-screen h-screen flex items-stretch md:items-end justify-between pb-[36] md:pb-[66px] md:mx-[116px] mx-5 relative '
8888
id='hero'
8989
>
9090
<div
@@ -104,7 +104,7 @@ export default function Hero() {
104104
src='/glow.svg'
105105
alt='glow'
106106
unoptimized
107-
className='absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-full h-full z-10 glow-element'
107+
className='absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 h-full z-10 glow-element !max-w-screen !w-screen'
108108
width={1920}
109109
height={1080}
110110
/>
@@ -116,13 +116,13 @@ export default function Hero() {
116116
width={1920}
117117
height={1080}
118118
/>
119-
<div
120-
className='absolute bottom-0 left-0 w-full h-[150px] z-10 bg-gradient-to-t from-transparent to-background'
119+
{/* <div
120+
className='absolute bottom-0 left-0 !w-screen !max-w-screen h-[150px] z-10 bg-gradient-to-t from-transparent to-background'
121121
style={{
122122
background:
123123
'linear-gradient(180deg, rgba(3, 3, 3, 0.00) 32.3%, #030303 84.8%)',
124124
}}
125-
/>
125+
/> */}
126126
</div>
127127
<div className='flex flex-col md:flex-row justify-between items-end gap-4 h-full w-full md:h-auto mt-[120px] z-10'>
128128
<h2 className='text-left text-white xl:text-[48px] lg:text-[32px] text-[30px] leading-[140%] md:max-w-[579px] max-w-[350px]'>

components/landing-page/NewsLetter.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
1-
import React from 'react';
1+
import React, { useState } from 'react';
22
import { BoundlessButton } from '../buttons';
3+
import Newsletter from '../overview/Newsletter';
34

45
const NewsLetter = () => {
6+
const [open, setOpen] = useState(false);
57
return (
68
<div className='w-full h-full my-[98px] px-5 md:px-[100px] relative'>
79
<div
@@ -20,11 +22,13 @@ const NewsLetter = () => {
2022
variant='secondary'
2123
className='bg-background hover:text-background'
2224
size='xl'
25+
onClick={() => setOpen(true)}
2326
>
2427
Subscribe to Our Newsletter
2528
</BoundlessButton>
2629
</div>
2730
</div>
31+
<Newsletter open={open} onOpenChange={setOpen} />
2832
</div>
2933
);
3034
};

components/landing-page/WhyBoundless.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import React from 'react';
55
const WhyBoundless = () => {
66
return (
77
<div
8-
className='w-full h-full py-20 px-6 md:px-10 xl:px-[100px]'
8+
className='w-full h-full md:py-20 py-5 px-6 md:px-10 xl:px-[100px]'
99
id='how-boundless-work'
1010
>
1111
{/* Heading & Description */}
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
import {
2+
Card,
3+
CardContent,
4+
CardFooter,
5+
CardHeader,
6+
CardTitle,
7+
} from '@/components/ui/card';
8+
import { Clock } from 'lucide-react';
9+
import Link from 'next/link';
10+
import Image from 'next/image';
11+
import React from 'react';
12+
13+
type Blog = {
14+
id: number;
15+
title: string;
16+
excerpt: string;
17+
image: string;
18+
date: string;
19+
slug: string;
20+
category: string;
21+
};
22+
23+
const BlogCard = ({ blog }: { blog: Blog }) => {
24+
return (
25+
<Card
26+
key={blog.id}
27+
className='rounded-[8px] border-[#1B1B1B] bg-[#101010] w-full max-w-none p-0 overflow-hidden gap-0 hover:border-[#2A2A2A] transition-colors duration-300'
28+
>
29+
<CardHeader className='p-0 !pb-0 relative'>
30+
<CardTitle
31+
className='absolute top-3.5 left-3.5 px-2.5 py-1 rounded-full border border-[rgba(255,255,255,0.48)] backdrop-blur-[12px] text-white leading-[160%] font-medium text-sm z-10'
32+
style={{
33+
background:
34+
'conic-gradient(from 180deg at 50% 50%, rgba(3, 3, 3, 0.12) 18.88653337955475deg, rgba(3, 3, 3, 0.12) 73.51145267486572deg, rgba(3, 3, 3, 0.12) 128.6191964149475deg, rgba(16, 16, 16, 0.12) 223.4290623664856deg, rgba(3, 3, 3, 0.12) 317.18567848205566deg)',
35+
}}
36+
>
37+
{blog.category}
38+
</CardTitle>
39+
<div className='h-[214px] w-full'>
40+
<Image
41+
src={blog.image}
42+
alt={blog.title}
43+
width={397}
44+
height={214}
45+
className='w-full h-full object-cover'
46+
/>
47+
</div>
48+
</CardHeader>
49+
<CardContent className='p-5 pb-2'>
50+
<h2 className='text-white leading-[145%] font-semibold text-sm sm:text-base line-clamp-2'>
51+
{blog.title}
52+
</h2>
53+
<p className='text-[#D9D9D9] text-sm sm:text-base leading-[160%] tracking-[-0.48px] mt-3 line-clamp-2'>
54+
{blog.excerpt}
55+
</p>
56+
</CardContent>
57+
<CardFooter className='pb-5 px-5 mt-3'>
58+
<div className='flex items-center justify-between gap-2 w-full'>
59+
<div className='flex items-center justify-start gap-1 text-[#b5b5b5] text-xs sm:text-sm'>
60+
<Clock className='w-3 h-3 sm:w-4 sm:h-4' />
61+
{blog.date}
62+
</div>
63+
<Link
64+
href={`/blog/${blog.slug}`}
65+
className='underline text-white text-xs sm:text-sm hover:text-[#D9D9D9] transition-colors duration-200'
66+
>
67+
Continue Reading
68+
</Link>
69+
</div>
70+
</CardFooter>
71+
</Card>
72+
);
73+
};
74+
75+
export default BlogCard;

0 commit comments

Comments
 (0)