-
Notifications
You must be signed in to change notification settings - Fork 94
feat: implement Coming Soon page and consolidate placeholder routes #412
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,7 +1,6 @@ | ||
| import React from 'react'; | ||
|
|
||
| import { redirect } from 'next/navigation'; | ||
| const Page = () => { | ||
| return <div>Projects</div>; | ||
| redirect('/coming-soon'); | ||
| }; | ||
|
|
||
| export default Page; |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,17 @@ | ||
| import ComingSoon from '@/components/ComingSoon'; | ||
| import { Footer, Navbar } from '@/components/landing-page'; | ||
| import React from 'react'; | ||
|
|
||
| const page = () => { | ||
| return ( | ||
| <> | ||
| <Navbar /> | ||
| <main className='min-h-[calc(100vh-56px)] flex-1'> | ||
| <ComingSoon /> | ||
| </main> | ||
| <Footer /> | ||
| </> | ||
| ); | ||
| }; | ||
|
|
||
| export default page; |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,7 @@ | ||
| import { redirect } from 'next/navigation'; | ||
|
|
||
| const page = () => { | ||
| redirect('/coming-soon'); | ||
| }; | ||
|
|
||
| export default page; |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,7 @@ | ||
| import { redirect } from 'next/navigation'; | ||
|
|
||
| const page = () => { | ||
| redirect('/coming-soon'); | ||
| }; | ||
|
|
||
| export default page; |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,7 @@ | ||
| import { redirect } from 'next/navigation'; | ||
|
|
||
| const page = () => { | ||
| redirect('/coming-soon'); | ||
| }; | ||
|
|
||
| export default page; |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,7 @@ | ||
| import { redirect } from 'next/navigation'; | ||
|
|
||
| const page = () => { | ||
| redirect('/coming-soon'); | ||
| }; | ||
|
|
||
| export default page; |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,7 @@ | ||
| import { redirect } from 'next/navigation'; | ||
|
|
||
| const page = () => { | ||
| redirect('/coming-soon'); | ||
| }; | ||
|
|
||
| export default page; |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,7 @@ | ||
| import { redirect } from 'next/navigation'; | ||
|
|
||
| const page = () => { | ||
| redirect('/coming-soon'); | ||
| }; | ||
|
|
||
| export default page; |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,115 @@ | ||
| 'use client'; | ||
|
|
||
| import { | ||
| ArrowDownUp, | ||
| CircleDollarSign, | ||
| ChartNoAxesColumnIncreasing, | ||
| ShieldCheck, | ||
| LucideIcon, | ||
| } from 'lucide-react'; | ||
| import { motion } from 'framer-motion'; | ||
|
|
||
| type Feature = { | ||
| id: string; | ||
| title: string; | ||
| description: string; | ||
| icon: LucideIcon; | ||
| }; | ||
|
|
||
| const features: Feature[] = [ | ||
| { | ||
| id: 'grant-flow', | ||
| title: 'Full Grant Flow & Architecture', | ||
| description: | ||
| 'End-to-end grant lifecycle system covering submission, evaluation, approval, and fund distribution.', | ||
| icon: ArrowDownUp, | ||
| }, | ||
| { | ||
| id: 'bounty-implementation', | ||
| title: 'Bounty Implementation', | ||
| description: | ||
| 'Structured bounty creation with decentralized submission handling and transparent verification.', | ||
| icon: CircleDollarSign, | ||
| }, | ||
| { | ||
| id: 'analytics-dashboard', | ||
| title: 'Advanced Analytics Dashboard', | ||
| description: | ||
| 'Clear financial and participation metrics with intuitive visual breakdowns.', | ||
| icon: ChartNoAxesColumnIncreasing, | ||
| }, | ||
| { | ||
| id: 'verified-badging', | ||
| title: 'Verified Project Badging', | ||
| description: | ||
| 'Recognition layer for trusted and high-quality ecosystem projects.', | ||
| icon: ShieldCheck, | ||
| }, | ||
| ]; | ||
|
|
||
| const FeatureBlock = ({ | ||
| title, | ||
| description, | ||
| icon: Icon, | ||
| index, | ||
| }: Feature & { index: number }) => { | ||
| return ( | ||
| <motion.div | ||
| initial={{ opacity: 0, scale: 0.95 }} | ||
| whileInView={{ opacity: 1, scale: 1 }} | ||
| transition={{ duration: 0.6, delay: index * 0.12 }} | ||
| viewport={{ once: true }} | ||
| whileHover={{ scale: 1.02 }} | ||
| className='relative overflow-hidden rounded-3xl bg-gradient-to-br from-[#0e0e0e] to-[#1a1a1a] p-10' | ||
| > | ||
| <div className='pointer-events-none absolute -top-16 -right-16 opacity-5'> | ||
| <Icon className='h-64 w-64' /> | ||
| </div> | ||
|
|
||
| <div className='mb-6 flex items-center gap-2 text-sm text-[#a7f950]'> | ||
| <div className='h-2 w-2 animate-pulse rounded-full bg-[#a7f950]' /> | ||
| In Progress | ||
| </div> | ||
|
|
||
| <h3 className='text-2xl font-semibold tracking-tight text-white'> | ||
| {title} | ||
| </h3> | ||
|
|
||
| <p className='mt-4 max-w-xl text-sm leading-relaxed text-neutral-400'> | ||
| {description} | ||
| </p> | ||
| </motion.div> | ||
| ); | ||
| }; | ||
|
|
||
| const ComingSoon = () => { | ||
| return ( | ||
| <section className='py-24'> | ||
| <div className='mx-auto max-w-6xl px-6'> | ||
| <motion.div | ||
| initial={{ opacity: 0, y: 20 }} | ||
| whileInView={{ opacity: 1, y: 0 }} | ||
| transition={{ duration: 0.6 }} | ||
| viewport={{ once: true }} | ||
| className='mb-20 max-w-2xl' | ||
| > | ||
| <h1 className='text-5xl font-bold tracking-tight text-white md:text-6xl'> | ||
| Coming Soon | ||
| </h1> | ||
| <p className='mt-6 text-lg text-neutral-400'> | ||
| We’re building foundational systems to power a more transparent, | ||
| efficient grant and bounty ecosystem. | ||
| </p> | ||
| </motion.div> | ||
|
|
||
| <div className='flex flex-col gap-12'> | ||
| {features.map((feature, index) => ( | ||
| <FeatureBlock key={feature.id} {...feature} index={index} /> | ||
| ))} | ||
| </div> | ||
| </div> | ||
| </section> | ||
| ); | ||
| }; | ||
|
Comment on lines
+85
to
+113
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Missing "Notify Me" form per requirements. The linked issue Would you like me to help scaffold a "Notify Me" form component that can be wired to your subscription/waitlist API, or open an issue to track this separately? 🤖 Prompt for AI Agents
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Maintainer said I should not worry about the notfiy me button There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
ฅ^•ﻌ•^ฅ |
||
|
|
||
| export default ComingSoon; | ||
Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🧩 Analysis chain
🏁 Script executed:
Repository: boundlessfi/boundless
Length of output: 686
🏁 Script executed:
Repository: boundlessfi/boundless
Length of output: 23611
Incorrect metadata key and unreachable code in bounties page.
The metadata uses
'grants'but this is the bounties page, causing incorrect SEO metadata to be served. Additionally, the JSX return statements (lines 9–13) are unreachable after theredirect()call on line 8 and should be removed.Note: The
'bounties'key does not exist inpageMetadata(lib/metadata.ts). Before changing the metadata key, either add a'bounties'entry to thepageMetadataobject or use an existing key like'projects'.🤖 Prompt for AI Agents
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The code is meant to be unreachable as for the incorrect metadata, I didn't have a touch in that part of the code. I just did what I was asked to do.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@Shadow-MMN, thank you for the clarification. You're absolutely right that the metadata issue with'grants'was pre-existing—your changes only added the redirect.Regarding the unreachable code: I notice that in other files within this same PR, the return statements were handled differently. For example:
app/me/analytics/page.tsx,app/me/hackathons/page.tsx,app/me/profile/page.tsx→ only contain the redirect, no return statementapp/(landing)/profile/[username]/projects/page.tsx→ the return statement was removedWhile in
bounties/page.tsx,grants/page.tsx,contact/page.tsx, andorganizations/[id]/grants/page.tsx, the return statements remain after the redirect.For consistency and cleanliness (especially given the PR's quality constraints), you might consider removing the unreachable return statements in these files. But if you prefer to keep them as-is, that's your call—the redirect will work either way.