Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
f4dcdc0
fix: modify api.ts
Benjtalkshow Oct 14, 2025
b90d4ed
Merge branch 'main' of https://github.com/Benjtalkshow/boundless into…
Benjtalkshow Oct 16, 2025
9ea81a5
Merge branch 'main' of https://github.com/Benjtalkshow/boundless into…
Benjtalkshow Oct 16, 2025
5be269f
fix: remove google auth buttom
Benjtalkshow Oct 16, 2025
490dcb2
Merge branch 'main' of https://github.com/Benjtalkshow/boundless into…
Benjtalkshow Oct 20, 2025
842fd48
fix: fixes responsive fixes on organization
Benjtalkshow Oct 20, 2025
596a7f8
fix: minor fixes
Benjtalkshow Nov 6, 2025
96fee24
fix: minor fixes
Benjtalkshow Nov 6, 2025
9dfb149
fix: modify create organization
Benjtalkshow Nov 7, 2025
a194d90
fix: modify create organization
Benjtalkshow Nov 7, 2025
b2ceee0
fix: fix organization permission
Benjtalkshow Nov 8, 2025
9ea97d1
fix: merge into main
Benjtalkshow Nov 8, 2025
adb4629
Merge branch 'main' of https://github.com/Benjtalkshow/boundless into…
Benjtalkshow Nov 8, 2025
0c11420
fix: merge into main
Benjtalkshow Nov 8, 2025
1f5ec24
feat: hackathon overview page
Benjtalkshow Nov 11, 2025
bca1ef6
feat: hackathon overview page
Benjtalkshow Nov 11, 2025
9202b4f
feat: implement participant overview
Benjtalkshow Nov 12, 2025
096f265
feat: implement participant overview
Benjtalkshow Nov 12, 2025
b3478d0
feat: implement resources tab
Benjtalkshow Nov 12, 2025
e83a0be
feat: implement the submission tab
Benjtalkshow Nov 12, 2025
398be9b
feat: implement comment tab
Benjtalkshow Nov 12, 2025
de546b1
fix: implement provider for hackathon
Benjtalkshow Nov 14, 2025
0fd2690
fix: implement provider for hackathon
Benjtalkshow Nov 14, 2025
0d7417f
fix: minor fixes
Benjtalkshow Nov 15, 2025
4d3efee
fix: merge branch 'main' of https://github.com/Benjtalkshow/boundless…
Benjtalkshow Nov 15, 2025
83893e4
fix: hackathon banner
Benjtalkshow Nov 15, 2025
8013d62
fix: hackathon banner
Benjtalkshow Nov 15, 2025
3fb1323
fix: fix hackthon conflict
Benjtalkshow Nov 15, 2025
b7fc94f
Merge branch 'main' of https://github.com/Benjtalkshow/boundless into…
Benjtalkshow Nov 15, 2025
0594ac8
Merge branch 'main' of https://github.com/Benjtalkshow/boundless into…
Benjtalkshow Nov 15, 2025
7e08bc1
fix: fix organization page
Benjtalkshow Nov 15, 2025
22c12c1
fix: fix organization page
Benjtalkshow Nov 16, 2025
08e5be5
fix: fix organization page
Benjtalkshow Nov 16, 2025
8e6bded
Merge branch 'main' of https://github.com/Benjtalkshow/boundless into…
Benjtalkshow Nov 16, 2025
5e6c9e6
fix: use transform
Benjtalkshow Nov 17, 2025
9135f2e
Merge branch 'main' of https://github.com/Benjtalkshow/boundless into…
Benjtalkshow Nov 17, 2025
c2409f4
fix: add tagline
Benjtalkshow Nov 18, 2025
b08579a
fix: add tagline
Benjtalkshow Nov 18, 2025
4b8ef58
fix: fix conflict
Benjtalkshow Nov 18, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 3 additions & 4 deletions app/(landing)/hackathons/[slug]/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ export default function HackathonPage() {

const {
currentHackathon,
content,
// content,
timelineEvents,
participants,
submissions,
Expand Down Expand Up @@ -70,7 +70,6 @@ export default function HackathonPage() {
if (loading) {
return <LoadingScreen />;
}

if (!currentHackathon) {
return (
<div className='flex min-h-screen items-center justify-center'>
Expand All @@ -91,7 +90,7 @@ export default function HackathonPage() {
{/* Banner */}
<HackathonBanner
title={currentHackathon.title}
subtitle={currentHackathon.subtitle}
tagline={currentHackathon.tagline}
deadline={currentHackathon.deadline}
categories={currentHackathon.categories}
status={currentHackathon.status}
Expand All @@ -112,7 +111,7 @@ export default function HackathonPage() {
<div className='mx-auto max-w-7xl px-6 py-12 text-white'>
{activeTab === 'overview' && (
<HackathonOverview
content={content}
content={currentHackathon.description}
timelineEvents={timelineEvents}
prizes={prizes}
/>
Expand Down
4 changes: 2 additions & 2 deletions app/(landing)/hackathons/preview/[orgId]/[draftId]/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ export default function DraftPreviewPage({ params }: PreviewPageProps) {
const hackathon: Hackathon = {
id: transformed._id,
title: transformed.information.title,
subtitle: transformed.participation?.about || '',
tagline: transformed.participation?.about || '',
description: transformed.information.description,
slug: transformed.information.slug || '',
imageUrl: transformed.information.banner,
Expand Down Expand Up @@ -378,7 +378,7 @@ export default function DraftPreviewPage({ params }: PreviewPageProps) {
{/* Banner */}
<HackathonBanner
title={previewHackathon.title}
subtitle={previewHackathon.subtitle}
tagline={previewHackathon.tagline}
deadline={previewHackathon.deadline}
categories={previewHackathon.categories}
status={previewHackathon.status}
Expand Down
8 changes: 5 additions & 3 deletions components/FeatureFuture.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,11 @@ export function FutureFeature({
badgeClassName,
}: FutureFeatureProps) {
return (
<div className={cn('relative inline-flex items-center', className)}>
<div className={disabledClass}>{children}</div>

<div className={cn('relative w-full', className)}>
{' '}
{/* Changed from inline-flex to w-full */}
<div className={cn('w-full', disabledClass)}>{children}</div>{' '}
{/* Added w-full */}
<Badge
variant='secondary'
className={cn(
Expand Down
10 changes: 3 additions & 7 deletions components/auth/LoginWrapper.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -171,11 +171,7 @@ const LoginWrapper = ({ setLoadingState }: LoginWrapperProps) => {
setLoadingState(true);
},
onSuccess: async () => {
setIsLoading(false);
setLoadingState(false);

// Wait a bit for cookies to be set by Better Auth
await new Promise(resolve => setTimeout(resolve, 100));
await new Promise(resolve => setTimeout(resolve, 200));

const session = await authClient.getSession();

Expand Down Expand Up @@ -204,8 +200,8 @@ const LoginWrapper = ({ setLoadingState }: LoginWrapperProps) => {
}
}

// Use full page reload to ensure cookies are available in middleware
// Use callbackUrl if provided, otherwise redirect to home
// Keep loading state active during redirect
// The page will unmount when redirecting, so no need to set false
window.location.href = callbackUrl;
},
onError: ctx => {
Expand Down
19 changes: 9 additions & 10 deletions components/hackathons/hackathonBanner.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,12 @@ import { Card } from '@/components/ui/card';
import { Badge } from '@/components/ui/badge';
import { formatDate } from '@/lib/utils';
import { useEffect, useState } from 'react';
import { sanitizeHtml } from '@/lib/utils/renderHtml';
// import { sanitizeHtml } from '@/lib/utils/renderHtml';

interface HackathonBannerProps {
title: string;
subtitle?: string | React.ReactNode;
imageUrl?: string;
tagline?: string;
deadline?: string;
startDate?: string;
endDate?: string;
Expand Down Expand Up @@ -61,7 +61,7 @@ function formatCountdown(time: TimeRemaining): string {

export function HackathonBanner({
title,
subtitle,
tagline,
imageUrl,
deadline,
startDate,
Expand Down Expand Up @@ -245,18 +245,17 @@ export function HackathonBanner({
<h1 className='text-left text-3xl leading-tight font-bold text-white drop-shadow-lg md:text-4xl lg:text-5xl'>
{title}
</h1>
{subtitle && typeof subtitle === 'string' ? (
<div
className='max-w-2xl text-left text-base text-gray-200 drop-shadow-md md:text-lg'
dangerouslySetInnerHTML={sanitizeHtml(subtitle)}
/>
{tagline && typeof tagline === 'string' ? (
<span className='max-w-2xl text-left text-base text-gray-200 drop-shadow-md md:text-lg'>
{tagline}
</span>
) : (
<div className='max-w-2xl text-left text-base text-gray-200 drop-shadow-md md:text-lg'>
{subtitle}
{tagline}
</div>
)}

{subtitle && (
{tagline && (
<div className='h-1 w-20 rounded-full bg-[#a7f950] md:w-24' />
)}
</div>
Expand Down
43 changes: 15 additions & 28 deletions components/hackathons/overview/hackathonOverview.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
'use client';
import ReactMarkdown from 'react-markdown';
import remarkGfm from 'remark-gfm';
import { HackathonTimeline } from './hackathonTimeline';
import { HackathonPrizes } from './hackathonPrizes';

Expand Down Expand Up @@ -33,19 +34,8 @@ export function HackathonOverview({
<div className={`w-full py-8 ${className}`}>
<article className='prose prose-sm sm:prose lg:prose-lg dark:prose-invert max-w-none text-left'>
<ReactMarkdown
remarkPlugins={[remarkGfm]}
components={{
h1: ({ ...props }) => (
<h1 className='mb-6 text-4xl font-bold' {...props} />
),
h2: ({ ...props }) => (
<h2 className='mt-8 mb-4 text-3xl font-bold' {...props} />
),
h3: ({ ...props }) => (
<h3 className='mt-6 mb-3 text-2xl font-semibold' {...props} />
),
p: ({ ...props }) => (
<p className='mb-4 text-base leading-7' {...props} />
),
ul: ({ ...props }) => (
<ul
className='marker:text-primary mb-4 ml-4 list-inside list-disc space-y-2'
Expand All @@ -58,37 +48,34 @@ export function HackathonOverview({
{...props}
/>
),
li: ({ ...props }) => <li className='mb-1 text-base' {...props} />,
blockquote: ({ ...props }) => (
<blockquote
className='border-primary my-4 border-l-4 pl-4 text-gray-600 italic dark:text-gray-400'

table: ({ ...props }) => (
<table
className='w-full border border-gray-400 text-sm text-white'
{...props}
/>
),
code: ({ ...props }) => (
<code
className='rounded bg-gray-100 px-2 py-1 font-mono text-sm dark:bg-gray-800'
thead: ({ ...props }) => (
<thead
className='border-b border-gray-400 text-white'
{...props}
/>
),
pre: ({ ...props }) => (
<pre
className='mb-4 overflow-auto rounded bg-gray-100 p-4 dark:bg-gray-800'
{...props}
/>
tbody: ({ ...props }) => (
<tbody className='text-white' {...props} />
),
table: ({ ...props }) => (
<table className='mb-4 w-full border-collapse' {...props} />
tr: ({ ...props }) => (
<tr className='border-b border-gray-400' {...props} />
),
th: ({ ...props }) => (
<th
className='border border-gray-300 bg-gray-100 px-4 py-2 dark:border-gray-700 dark:bg-gray-800'
className='border border-gray-400 px-3 py-2 text-left font-semibold text-white'
{...props}
/>
),
td: ({ ...props }) => (
<td
className='border border-gray-300 px-4 py-2 dark:border-gray-700'
className='border border-gray-400 px-3 py-2 text-white'
{...props}
/>
),
Expand Down
8 changes: 0 additions & 8 deletions components/hackathons/overview/hackathonPrizes.tsx
Original file line number Diff line number Diff line change
@@ -1,13 +1,5 @@
'use client';

// interface Prize {
// title: string
// rank: string
// prize: string
// details: string[]
// icon?: string
// }

interface HackathonPrizesProps {
title?: string;
totalPrizes?: string;
Expand Down
1 change: 1 addition & 0 deletions components/landing-page/Explore.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,7 @@ const tabs = [
{ name: 'Featured Projects', value: 'featured-projects' },
{ name: 'Ongoing Hackathons', value: 'ongoing-hackathons' },
{ name: 'Open Grants', value: 'open-grants' },
{ name: 'Bounties', value: 'live-grants' },
];

export default function Explore() {
Expand Down
2 changes: 2 additions & 0 deletions components/landing-page/Hero2.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,7 @@ export default function Hero2() {
<div className='relative mx-auto hidden h-[500px] max-w-5xl md:block'>
<div className='absolute top-12 left-0 z-10 w-72 -rotate-3 transform cursor-pointer shadow-xl transition-transform duration-300 hover:rotate-0'>
<HackathonCard
tagline='Build the future of boundless'
organizationName='Boundless'
deadlineInDays={10}
categories={['Web3', 'DeFi', 'Blockchain']}
Expand Down Expand Up @@ -167,6 +168,7 @@ export default function Hero2() {

<div className='absolute bottom-0 left-1/2 z-20 w-96 -translate-x-1/2 transform cursor-pointer rounded-2xl shadow-xl transition-transform duration-300 hover:scale-105'>
<HackathonCard
tagline='Build the future of boundless'
organizationName='Boundless'
deadlineInDays={5}
categories={['AI', 'Machine Learning', 'Open Source']}
Expand Down
10 changes: 5 additions & 5 deletions components/landing-page/hackathon/HackathonCard.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,8 @@ type HackathonCardProps = {
organizerLogo: string;
hackathonImage: string;
hackathonTitle: string;
hackathonDescription: string;
tagline: string;
hackathonDescription?: string;
status: 'Published' | 'Ongoing' | 'Completed' | 'Cancelled';
deadlineInDays: number;
categories: string[];
Expand Down Expand Up @@ -45,14 +46,15 @@ function HackathonCard({
organizerLogo,
hackathonImage,
hackathonTitle,
hackathonDescription,
// hackathonDescription,
status,
deadlineInDays,
categories,
location,
venueType,
participants,
prizePool,
tagline,
isFullWidth = false,
className,
}: HackathonCardProps) {
Expand Down Expand Up @@ -255,9 +257,7 @@ function HackathonCard({
<h2 className='line-clamp-2 text-base leading-tight font-semibold text-white sm:text-lg'>
{hackathonTitle}
</h2>
<p className='mt-1 line-clamp-2 text-sm text-gray-400'>
{hackathonDescription}
</p>
<p className='mt-1 line-clamp-2 text-sm text-gray-400'>{tagline}</p>
</div>

<div className='flex flex-wrap items-center justify-between border-t border-neutral-800 px-4 pt-3 text-sm text-gray-400 sm:px-5'>
Expand Down
2 changes: 1 addition & 1 deletion components/organization/OrganizationAnalytics.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ const OrganizationAnalytics = () => {

return (
<div className='min-h-screen bg-black'>
<div className='mx-auto max-w-6xl px-6 py-8'>
<div className=' '>
{/* Header */}
<div className='mb-8'>
<h1 className='mb-1 text-2xl font-medium text-white'>Analytics</h1>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -183,7 +183,7 @@ export default function NewHackathonTab({

return (
<div
className='bg-background-main-bg flex-1 overflow-hidden text-white'
className='bg-background-main-bg mx-auto max-w-6xl flex-1 overflow-hidden px-6 py-8 text-white'
id={organizationId}
>
<Tabs
Expand Down
23 changes: 22 additions & 1 deletion components/organization/hackathons/new/tabs/InfoTab.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ export default function InfoTab({
defaultValues: {
name: initialData?.name || '',
banner: initialData?.banner || '',
tagline: initialData?.tagline || '',
description: initialData?.description || '',
categories: Array.isArray(initialData?.categories)
? initialData.categories
Expand Down Expand Up @@ -124,7 +125,27 @@ export default function InfoTab({
name='banner'
setValue={form.setValue}
/>

{/* Tagline */}
<FormField
control={form.control}
name='tagline'
render={({ field }) => (
<FormItem>
<FormLabel className='text-sm font-medium text-white'>
Tagline <span className='text-red-500'>*</span>
</FormLabel>
<FormControl>
<Input
{...field}
type='text'
placeholder='Build the Future. Ship the Impossible. (Max of 200 char)'
className='h-11 border-zinc-800 bg-zinc-900/50 text-white placeholder:text-zinc-600'
/>
</FormControl>
<FormMessage className='text-xs text-red-500' />
</FormItem>
)}
/>
{/* Description */}
<FormField
control={form.control}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,10 @@ export const infoSchema = z
venueType: z.enum(['virtual', 'physical'], {
message: 'Venue type is required',
}),
tagline: z
.string()
.min(1, 'Tagline is required')
.max(200, 'Tagline must not exceed 200 characters'),

country: z.string().optional(),
state: z.string().optional(),
Expand Down
Loading
Loading