diff --git a/app/(landing)/hackathons/[slug]/page.tsx b/app/(landing)/hackathons/[slug]/page.tsx index 7f517999b..60fa63df7 100644 --- a/app/(landing)/hackathons/[slug]/page.tsx +++ b/app/(landing)/hackathons/[slug]/page.tsx @@ -298,7 +298,7 @@ export default function HackathonPage() { {activeTab === 'resources' && currentHackathon?.resources?.resources?.[0] && ( - + )} diff --git a/app/(landing)/profile/[username]/profile-data.tsx b/app/(landing)/profile/[username]/profile-data.tsx index b9f013bac..b74bf71ca 100644 --- a/app/(landing)/profile/[username]/profile-data.tsx +++ b/app/(landing)/profile/[username]/profile-data.tsx @@ -46,7 +46,7 @@ export function ProfileData({ username }: PublicProfileDataProps) { try { setLoading(true); const data = await getUserProfileByUsername(username); - console.log('userData:', data); // This will log the actual data + // console.log('userData:', data); setUserData(data); } catch (err) { setError(`Failed to load user profile: ${err}`); @@ -59,11 +59,11 @@ export function ProfileData({ username }: PublicProfileDataProps) { }, [username]); // This logs on every render - will show null initially, then the data after fetch - useEffect(() => { - if (userData) { - console.log('Current userData state:', userData); - } - }, [userData]); + // useEffect(() => { + // if (userData) { + // console.log('Current userData state:', userData); + // } + // }, [userData]); if (loading) { return ( diff --git a/app/layout.tsx b/app/layout.tsx index 804c88f23..8cf1b7d1f 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -10,6 +10,7 @@ import { generateWebsiteStructuredData, } from '@/lib/structured-data'; import NextTopLoader from 'nextjs-toploader'; +import DevelopmentStatusModal from '@/components/DevelopmentStatusModal'; const inter = Inter({ variable: '--font-inter', @@ -95,6 +96,7 @@ export default function RootLayout({ {children} + diff --git a/components/DevelopmentStatusModal.tsx b/components/DevelopmentStatusModal.tsx new file mode 100644 index 000000000..cbef89d06 --- /dev/null +++ b/components/DevelopmentStatusModal.tsx @@ -0,0 +1,163 @@ +'use client'; + +import React, { useState, useEffect } from 'react'; +import { Code2, X } from 'lucide-react'; +import { + Dialog, + DialogContent, + DialogDescription, + DialogTitle, +} from '@/components/ui/dialog'; + +const BRAND_COLOR = '#a7f950'; +const DEV_MODAL_KEY = 'dev-status-modal-dismissed'; + +const DevelopmentStatusModal = () => { + const [isOpen, setIsOpen] = useState(false); + + useEffect(() => { + // Check if user has already dismissed the modal + try { + const dismissed = localStorage.getItem(DEV_MODAL_KEY); + if (!dismissed) { + // Show modal after a short delay + const timer = setTimeout(() => { + setIsOpen(true); + }, 800); + return () => clearTimeout(timer); + } + } catch { + // If localStorage fails, show the modal anyway + setIsOpen(true); + } + }, []); + + const handleClose = () => { + try { + localStorage.setItem(DEV_MODAL_KEY, 'true'); + } catch { + // Silently fail if localStorage is not available + } + setIsOpen(false); + }; + + return ( + + + {/* Header with gradient background */} +
+
+ +
+ +
+
+ +
+
+ + Boundless is Under Active Development + +
+
+
+ + {/* Content */} +
+ + Welcome to Boundless! We're actively building and improving the + platform. You may encounter: + + +
+
+
+
+
+

+ New features being rolled out regularly +

+
+ +
+
+
+
+

+ Occasional bugs and UI improvements in progress +

+
+ +
+
+
+
+

+ Changes to features and functionality +

+
+
+ +
+

+ Your feedback matters!{' '} + Help us build the best platform by reporting issues or suggesting + improvements through our support channels. +

+
+ + +
+ +
+ ); +}; + +export default DevelopmentStatusModal; diff --git a/components/auth/login-form.tsx b/components/auth/login-form.tsx index a0a2909a8..14e1d24ba 100644 --- a/components/auth/login-form.tsx +++ b/components/auth/login-form.tsx @@ -36,7 +36,7 @@ export function LoginForm({ onSuccess, onError }: LoginFormProps) { const onSubmit = async (data: LoginFormData) => { try { setIsLoading(true); - console.log('Attempting login for:', data.email); + // console.log('Attempting login for:', data.email); const { error } = await authClient.signIn.email( { @@ -46,7 +46,7 @@ export function LoginForm({ onSuccess, onError }: LoginFormProps) { }, { onSuccess: () => { - console.log('Login successful'); + // console.log('Login successful'); toast.success('Login successful!'); onSuccess?.(); }, diff --git a/components/hackathons/participants/participantAvatar.tsx b/components/hackathons/participants/participantAvatar.tsx index eb53b6ba9..341c17406 100644 --- a/components/hackathons/participants/participantAvatar.tsx +++ b/components/hackathons/participants/participantAvatar.tsx @@ -52,7 +52,8 @@ export function ParticipantAvatar({ participant }: ParticipantAvatarProps) { - {participant.username} + {participant.username.slice(0, 1).toUpperCase() + + participant.username.slice(1)} diff --git a/components/hackathons/participants/profileCard.tsx b/components/hackathons/participants/profileCard.tsx index b187c88ec..1e6c6231c 100644 --- a/components/hackathons/participants/profileCard.tsx +++ b/components/hackathons/participants/profileCard.tsx @@ -2,182 +2,248 @@ import { useState, useMemo } from 'react'; import { Button } from '@/components/ui/button'; import { Badge } from '@/components/ui/badge'; +import { Card, CardContent } from '@/components/ui/card'; +import { Avatar, AvatarImage, AvatarFallback } from '@/components/ui/avatar'; +import { Separator } from '@/components/ui/separator'; import type { Participant } from '@/types/hackathon'; import Image from 'next/image'; -import { MessageCircle, Users } from 'lucide-react'; -import { format } from 'date-fns'; +import { MessageCircle, Users, CheckCircle2 } from 'lucide-react'; import { useHackathonData } from '@/lib/providers/hackathonProvider'; import Link from 'next/link'; +const BRAND_COLOR = '#a7f950'; + interface ProfileCardProps { participant: Participant; } +// Simple date formatter +const formatJoinDate = (dateString: string) => { + const date = new Date(dateString); + const months = [ + 'Jan', + 'Feb', + 'Mar', + 'Apr', + 'May', + 'Jun', + 'Jul', + 'Aug', + 'Sep', + 'Oct', + 'Nov', + 'Dec', + ]; + return `${months[date.getMonth()]} ${date.getFullYear()}`; +}; + export function ProfileCard({ participant }: ProfileCardProps) { const [isFollowing, setIsFollowing] = useState(false); const { participants } = useHackathonData(); const teamMembers = useMemo(() => { if (participant.role === 'leader' && participant.teamId) { return participants.filter( - p => p.teamId === participant.teamId && p.id !== participant.id // Exclude the current participant (leader) + p => p.teamId === participant.teamId && p.id !== participant.id ); } return []; }, [participant, participants]); - // Check if this participant is a team leader const isTeamLeader = participant.role === 'leader' && participant.teamId; - // Check if this participant is a team member (but not leader) - // const isTeamMember = participant.role === 'member' && participant.teamId; + return ( + + {/* Header with gradient background and wave pattern */} +
+ {/* Wave Background */} +
+ +
- // Check if this is an individual participant - // const isIndividual = !participant.teamId || participant.isIndividual; +
+ + + + {participant.name.charAt(0)} + + - return ( -
- {/* Header with avatar */} -
-
-
- {participant.username} -
-
-

- {participant.name} +
+
+

+ {participant.name} +

{participant.verified && ( - - - + )} -

-

@{participant.username}

-

- Joined {format(new Date(participant.joinedDate!), 'MMM, yyyy')} +

+

@{participant.username}

+

+ Joined {formatJoinDate(participant.joinedDate!)}

- {/* Team Info */} - {participant.teamName && ( -
- -
-

- {participant.teamName} -

-

- {isTeamLeader - ? `${teamMembers.length + 1} member${teamMembers.length + 1 !== 1 ? 's' : ''} • Team Leader` - : 'Team Member'} -

+ + {/* Team Info */} + {participant.teamName && ( +
+
+ +
+
+

+ {participant.teamName} +

+

+ {isTeamLeader + ? `${teamMembers.length + 1} member${teamMembers.length + 1 !== 1 ? 's' : ''} • Team Leader` + : 'Team Member'} +

+
-
- )} + )} -
- - -
+ {/* Action Buttons */} +
+ + +
- {isTeamLeader && teamMembers.length > 0 && ( -
-
- {teamMembers.map(member => ( - -
0 && ( +
+
+ {teamMembers.slice(0, 4).map(member => ( + - {member.username} -
- - ))} + + + + {member.name.charAt(0)} + + + + ))} +
+ {teamMembers.length > 4 && ( + + +{teamMembers.length - 4} more + + )}
-
- )} + )} - {/* Description */} - {participant.description && ( -

- {participant.description} -

- )} + {/* Description */} + {participant.description && ( +

+ {participant.description} +

+ )} - {/* Categories */} - {participant.categories && participant.categories.length > 0 && ( -
-

Interests

-
- {participant.categories.map((category, index) => ( - - {category} - - ))} + {/* Categories */} + {participant.categories && participant.categories.length > 0 && ( +
+

+ Interests +

+
+ {participant.categories.map((category, index) => ( + + {category} + + ))} +
-
- )} + )} - {/* Stats */} -
-
-

- {participant.projects || 0} -

-

Projects

-
-
-

- {participant.followers || 0} -

-

Followers

-
-
-

- {participant.following || 0} -

-

Following

+ + + {/* Stats */} +
+
+

+ {participant.projects || 0} +

+

Projects

+
+
+

+ {participant.followers || 0} +

+

Followers

+
+
+

+ {participant.following || 0} +

+

Following

+
-
-
+ + ); } diff --git a/components/hackathons/resources/resources.tsx b/components/hackathons/resources/resources.tsx index c0f5383e8..4ece5136a 100644 --- a/components/hackathons/resources/resources.tsx +++ b/components/hackathons/resources/resources.tsx @@ -11,7 +11,7 @@ import { } from 'lucide-react'; import Link from 'next/link'; import { useHackathonData } from '@/lib/providers/hackathonProvider'; -import type { HackathonResource } from '@/lib/api/hackathons'; +import type { HackathonResourceDocument as HackathonResource } from '@/lib/api/hackathons'; import { VideoPlayer, VideoPlayerContent, @@ -25,12 +25,12 @@ import { VideoPlayerVolumeRange, } from '@/components/ui/video-player'; -interface HackathonResourcesProps { - hackathonSlugOrId?: string; - organizationId?: string; -} +// interface HackathonResourcesProps { +// hackathonSlugOrId?: string; +// organizationId?: string; +// } -export function HackathonResources({}: HackathonResourcesProps) { +export function HackathonResources() { const { currentHackathon } = useHackathonData(); // Transform resources from hackathon data to component format diff --git a/components/landing-page/hackathon/HackathonCard.tsx b/components/landing-page/hackathon/HackathonCard.tsx index 93f4c5504..190cbd3cd 100644 --- a/components/landing-page/hackathon/HackathonCard.tsx +++ b/components/landing-page/hackathon/HackathonCard.tsx @@ -4,7 +4,7 @@ import { formatNumber } from '@/lib/utils'; import { useRouter } from 'nextjs-toploader/app'; import Image from 'next/image'; import { MapPinIcon } from 'lucide-react'; -import { useRef, useEffect, useState } from 'react'; +import { useEffect, useState } from 'react'; type HackathonCardProps = { hackathonId?: string; @@ -98,7 +98,7 @@ function HackathonCard({ prizePool, tagline, isFullWidth = false, - className, + // className, }: HackathonCardProps) { const router = useRouter(); const [timeRemaining, setTimeRemaining] = useState({ @@ -278,24 +278,15 @@ function HackathonCard({ }: { categoriesList: string[]; }) => { - const ref = useRef(null); - const [showEllipsis, setShowEllipsis] = useState(false); - - useEffect(() => { - const el = ref.current; - if (!el) return; - const check = () => setShowEllipsis(el.scrollWidth > el.clientWidth); - check(); - window.addEventListener('resize', check); - return () => window.removeEventListener('resize', check); - }, [categoriesList]); + const MAX_VISIBLE = 3; + + const visible = categoriesList.slice(0, MAX_VISIBLE); + const remainingCount = categoriesList.length - MAX_VISIBLE; return ( -
-
- {categoriesList.map((cat, i) => ( +
+
+ {visible.map((cat, i) => ( ))} + + {remainingCount > 0 && ( + + +{remainingCount} + + )}
- {showEllipsis && ( -
- ... -
- )}
); }; diff --git a/components/landing-page/navbar.tsx b/components/landing-page/navbar.tsx index db39c4ad4..c4d47563d 100644 --- a/components/landing-page/navbar.tsx +++ b/components/landing-page/navbar.tsx @@ -1,11 +1,12 @@ 'use client'; import Link from 'next/link'; +import React from 'react'; import { Menu, Plus, Building2, ArrowUpRight, - User, + User as UserIcon, LogOut, Settings, Sparkles, @@ -456,7 +457,7 @@ const MobileMenu = ({ onClick={() => setIsOpen(false)} > - + Profile diff --git a/components/organization/OrganizationContent.tsx b/components/organization/OrganizationContent.tsx index b061c74e8..756a1edc9 100644 --- a/components/organization/OrganizationContent.tsx +++ b/components/organization/OrganizationContent.tsx @@ -126,7 +126,7 @@ export default function OrganizationContent() { }; const handleEdit = (orgId: string) => { - router.push(`/organizations/${orgId}/edit`); + router.push(`/organizations/${orgId}/settings`); }; const handleArchive = async (orgId: string) => { diff --git a/components/organization/cards/OrganzationCards.tsx b/components/organization/cards/OrganzationCards.tsx index f89c9554d..b5bab1cf7 100644 --- a/components/organization/cards/OrganzationCards.tsx +++ b/components/organization/cards/OrganzationCards.tsx @@ -11,6 +11,7 @@ import { Trash2, Loader2, } from 'lucide-react'; +import React from 'react'; import Image from 'next/image'; import { useRouter } from 'next/navigation'; import { normalizeCloudinaryImageUrl } from '@/lib/utils/cloudinary-url'; @@ -85,7 +86,7 @@ export default function OrganizationCard({ if (onEdit) { onEdit(id); } else { - router.push(`/organizations/${id}/edit`); + router.push(`/organizations/${id}/settings`); } }; diff --git a/components/organization/tabs/MembersTab.tsx b/components/organization/tabs/MembersTab.tsx index 4ede6a09f..7532c8eed 100644 --- a/components/organization/tabs/MembersTab.tsx +++ b/components/organization/tabs/MembersTab.tsx @@ -113,7 +113,9 @@ export default function MembersTab({ onSave }: MembersTabProps) { activeOrg.betterAuthOrgId ); setInvitations(data || []); - } catch {} + } catch (error) { + console.error(error); + } } } }; @@ -212,7 +214,9 @@ export default function MembersTab({ onSave }: MembersTabProps) { await updateOrganizationMembers(activeOrgId, emails); onSave?.(members); setHasUserChanges(false); - } catch {} + } catch (error) { + console.error(error); + } }; return ( diff --git a/components/profile/ProfileHeader.tsx b/components/profile/ProfileHeader.tsx index 59e286f57..634988e08 100644 --- a/components/profile/ProfileHeader.tsx +++ b/components/profile/ProfileHeader.tsx @@ -66,7 +66,9 @@ export default function ProfileHeader({ title: `Share ${profile.username}'s profile`, url: profileUrl, }); - } catch {} + } catch (error) { + console.error(error); + } } else { try { await navigator.clipboard.writeText(profileUrl); diff --git a/components/profile/ProfileOverview.tsx b/components/profile/ProfileOverview.tsx index 89728db4e..7daa5b3ae 100644 --- a/components/profile/ProfileOverview.tsx +++ b/components/profile/ProfileOverview.tsx @@ -31,6 +31,7 @@ export default function ProfileOverview({ (user as unknown as { socialLinks?: Record }) .socialLinks || {}, }; + const pathname = usePathname(); const isProfileRoute = pathname.startsWith('/profile'); const statsData: UserStatsType = { diff --git a/hooks/use-auth.ts b/hooks/use-auth.ts index c828ee9b7..f7b0d3af2 100644 --- a/hooks/use-auth.ts +++ b/hooks/use-auth.ts @@ -3,18 +3,17 @@ import { useEffect, useMemo, useCallback, useState } from 'react'; import { authClient } from '@/lib/auth-client'; import { getMe } from '@/lib/api/auth'; -// Simplified auth hook that trusts Better Auth as the single source of truth export function useAuth(requireAuth = true) { const { data: session, isPending: sessionPending, error: sessionError, } = authClient.useSession(); + const router = useRouter(); const [userProfile, setUserProfile] = useState(null); const [profileLoading, setProfileLoading] = useState(false); - // Convert Better Auth session to our user format const user = useMemo(() => { if (session && 'user' in session && session.user) { return { @@ -22,7 +21,7 @@ export function useAuth(requireAuth = true) { email: session.user.email, name: session.user.name || null, image: session.user.image || null, - role: 'USER' as 'USER' | 'ADMIN', // Default role + role: 'USER' as 'USER' | 'ADMIN', username: null, profile: userProfile, }; @@ -34,7 +33,7 @@ export function useAuth(requireAuth = true) { const isLoading = sessionPending || profileLoading; const error = sessionError?.message || null; - // Fetch user profile when authenticated + // Fetch profile useEffect(() => { const fetchProfile = async () => { if ( @@ -49,6 +48,7 @@ export function useAuth(requireAuth = true) { const profile = await getMe(); setUserProfile(profile); } catch { + // ignore error } finally { setProfileLoading(false); } @@ -58,29 +58,23 @@ export function useAuth(requireAuth = true) { fetchProfile(); }, [session, userProfile, profileLoading]); - // Handle required auth redirect + // Redirect if required and unauthenticated useEffect(() => { if (requireAuth && !isAuthenticated && !isLoading) { router.push('/auth?mode=signin'); } }, [requireAuth, isAuthenticated, isLoading, router]); + // refreshUser does not need useless try/catch const refreshUser = useCallback(async () => { - try { - const profile = await getMe(); - setUserProfile(profile); - } catch (error) { - throw error; - } + const profile = await getMe(); + setUserProfile(profile); }, []); + // clearAuth — same fix const clearAuth = useCallback(async () => { - try { - setUserProfile(null); - await authClient.signOut(); - } catch (error) { - throw error; - } + setUserProfile(null); + await authClient.signOut(); }, []); return { @@ -101,13 +95,11 @@ export function useOptionalAuth() { return useAuth(false); } -// Hook for checking auth status without redirecting export function useAuthStatus() { const { data: session, isPending: sessionPending } = authClient.useSession(); const [userProfile, setUserProfile] = useState(null); const [profileLoading, setProfileLoading] = useState(false); - // Convert Better Auth session to our user format const user = useMemo(() => { if (session && 'user' in session && session.user) { return { @@ -123,7 +115,6 @@ export function useAuthStatus() { return null; }, [session, userProfile]); - // Fetch user profile when authenticated useEffect(() => { const fetchProfile = async () => { if ( @@ -138,6 +129,7 @@ export function useAuthStatus() { const profile = await getMe(); setUserProfile(profile); } catch { + // ignore } finally { setProfileLoading(false); } @@ -154,16 +146,13 @@ export function useAuthStatus() { }; } -// Hook for auth actions export function useAuthActions() { const router = useRouter(); + + // remove useless catch const logout = useCallback(async () => { - try { - await authClient.signOut(); - router.push('/'); - } catch (error) { - throw error; - } + await authClient.signOut(); + router.push('/'); }, []); return { diff --git a/lib/api/hackathons.ts b/lib/api/hackathons.ts index 0b7b3837c..76af15862 100644 --- a/lib/api/hackathons.ts +++ b/lib/api/hackathons.ts @@ -142,7 +142,7 @@ export interface HackathonCollaboration { } // Resources Tab Types -export interface HackathonResource { +export interface HackathonResourceItem { link?: string; description?: string; fileUrl?: string; @@ -150,7 +150,7 @@ export interface HackathonResource { } export interface HackathonResources { - resources: HackathonResource[]; + resources: HackathonResourceItem[]; } // Complete Hackathon Data Structure @@ -2192,7 +2192,7 @@ export const reportDiscussion = async ( // Resources API Types and Functions // ============================================ -export interface HackathonResource { +export interface HackathonResourceDocument { _id: string; title: string; type: 'pdf' | 'doc' | 'sheet' | 'slide' | 'link' | 'video'; @@ -2205,10 +2205,10 @@ export interface HackathonResource { } export interface GetHackathonResourcesResponse extends ApiResponse< - HackathonResource[] + HackathonResourceDocument[] > { success: true; - data: HackathonResource[]; + data: HackathonResourceDocument[]; message: string; } diff --git a/lib/api/organization.ts b/lib/api/organization.ts index f6e066d28..5d9f82e8d 100644 --- a/lib/api/organization.ts +++ b/lib/api/organization.ts @@ -36,11 +36,6 @@ export interface AssignRoleRequest { email: string; } -export interface AssignRoleRequest { - action: 'promote' | 'demote'; - email: string; -} - export interface CreateOrganizationRequest { name: string; logo?: string; diff --git a/lib/auth-client.ts b/lib/auth-client.ts index e0acc696b..df3019c6f 100644 --- a/lib/auth-client.ts +++ b/lib/auth-client.ts @@ -1,3 +1,4 @@ +'use client'; import { createAuthClient } from 'better-auth/react'; import { emailOTPClient, diff --git a/lib/auth/server-auth.ts b/lib/auth/server-auth.ts index fd60c279b..00b91dfb1 100644 --- a/lib/auth/server-auth.ts +++ b/lib/auth/server-auth.ts @@ -2,6 +2,7 @@ import { headers } from 'next/headers'; import { redirect } from 'next/navigation'; import { getMeServer } from '@/lib/api/auth-server'; import { authClient } from '@/lib/auth-client'; +import type React from 'react'; export interface ServerUser { id: string; diff --git a/lib/providers/OrganizationProvider.tsx b/lib/providers/OrganizationProvider.tsx index bbdc8d718..4dea57e21 100644 --- a/lib/providers/OrganizationProvider.tsx +++ b/lib/providers/OrganizationProvider.tsx @@ -281,12 +281,16 @@ export function OrganizationProvider({ refreshInterval = 30000, }: OrganizationProviderProps) { const [state, dispatch] = useReducer(organizationReducer, initialState); - const refreshTimeoutRef = useRef(null); + const refreshTimeoutRef = useRef | null>(null); const isInitializedRef = useRef(false); const isFetchingOrganizationsRef = useRef(false); const isFetchingActiveOrgRef = useRef(false); - const fetchOrganizationsTimeoutRef = useRef(null); - const fetchActiveOrgTimeoutRef = useRef(null); + const fetchOrganizationsTimeoutRef = useRef | null>(null); + const fetchActiveOrgTimeoutRef = useRef | null>( + null + ); const setActiveOrgRef = useRef<((orgId: string) => void) | undefined>( undefined ); diff --git a/package-lock.json b/package-lock.json index 57ad3b63f..1ce259a28 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,6 +7,7 @@ "": { "name": "Boundless Frontend v1", "version": "0.1.0", + "hasInstallScript": true, "dependencies": { "@countrystatecity/countries": "^1.0.4", "@creit.tech/stellar-wallets-kit": "^1.7.6", @@ -1451,6 +1452,111 @@ "node": ">= 10" } }, + "node_modules/@next/swc-darwin-x64": { + "version": "16.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.0.7.tgz", + "integrity": "sha512-rtZ7BhnVvO1ICf3QzfW9H3aPz7GhBrnSIMZyr4Qy6boXF0b5E3QLs+cvJmg3PsTCG2M1PBoC+DANUi4wCOKXpA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "16.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.0.7.tgz", + "integrity": "sha512-mloD5WcPIeIeeZqAIP5c2kdaTa6StwP4/2EGy1mUw8HiexSHGK/jcM7lFuS3u3i2zn+xH9+wXJs6njO7VrAqww==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "16.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.0.7.tgz", + "integrity": "sha512-+ksWNrZrthisXuo9gd1XnjHRowCbMtl/YgMpbRvFeDEqEBd523YHPWpBuDjomod88U8Xliw5DHhekBC3EOOd9g==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "16.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.0.7.tgz", + "integrity": "sha512-4WtJU5cRDxpEE44Ana2Xro1284hnyVpBb62lIpU5k85D8xXxatT+rXxBgPkc7C1XwkZMWpK5rXLXTh9PFipWsA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "16.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.0.7.tgz", + "integrity": "sha512-HYlhqIP6kBPXalW2dbMTSuB4+8fe+j9juyxwfMwCe9kQPPeiyFn7NMjNfoFOfJ2eXkeQsoUGXg+O2SE3m4Qg2w==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "16.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.0.7.tgz", + "integrity": "sha512-EviG+43iOoBRZg9deGauXExjRphhuYmIOJ12b9sAPy0eQ6iwcPxfED2asb/s2/yiLYOdm37kPaiZu8uXSYPs0Q==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "16.0.7", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.0.7.tgz", + "integrity": "sha512-gniPjy55zp5Eg0896qSrf3yB1dw4F/3s8VK1ephdsZZ129j2n6e1WqCbE2YgcKhW9hPB9TVZENugquWJD5x0ug==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, "node_modules/@ngneat/elf": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/@ngneat/elf/-/elf-2.5.1.tgz", @@ -18178,111 +18284,6 @@ "type": "github", "url": "https://github.com/sponsors/wooorm" } - }, - "node_modules/@next/swc-darwin-x64": { - "version": "16.0.7", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.0.7.tgz", - "integrity": "sha512-rtZ7BhnVvO1ICf3QzfW9H3aPz7GhBrnSIMZyr4Qy6boXF0b5E3QLs+cvJmg3PsTCG2M1PBoC+DANUi4wCOKXpA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-gnu": { - "version": "16.0.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.0.7.tgz", - "integrity": "sha512-mloD5WcPIeIeeZqAIP5c2kdaTa6StwP4/2EGy1mUw8HiexSHGK/jcM7lFuS3u3i2zn+xH9+wXJs6njO7VrAqww==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-arm64-musl": { - "version": "16.0.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.0.7.tgz", - "integrity": "sha512-+ksWNrZrthisXuo9gd1XnjHRowCbMtl/YgMpbRvFeDEqEBd523YHPWpBuDjomod88U8Xliw5DHhekBC3EOOd9g==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-x64-gnu": { - "version": "16.0.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.0.7.tgz", - "integrity": "sha512-4WtJU5cRDxpEE44Ana2Xro1284hnyVpBb62lIpU5k85D8xXxatT+rXxBgPkc7C1XwkZMWpK5rXLXTh9PFipWsA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-linux-x64-musl": { - "version": "16.0.7", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.0.7.tgz", - "integrity": "sha512-HYlhqIP6kBPXalW2dbMTSuB4+8fe+j9juyxwfMwCe9kQPPeiyFn7NMjNfoFOfJ2eXkeQsoUGXg+O2SE3m4Qg2w==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-arm64-msvc": { - "version": "16.0.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.0.7.tgz", - "integrity": "sha512-EviG+43iOoBRZg9deGauXExjRphhuYmIOJ12b9sAPy0eQ6iwcPxfED2asb/s2/yiLYOdm37kPaiZu8uXSYPs0Q==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@next/swc-win32-x64-msvc": { - "version": "16.0.7", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.0.7.tgz", - "integrity": "sha512-gniPjy55zp5Eg0896qSrf3yB1dw4F/3s8VK1ephdsZZ129j2n6e1WqCbE2YgcKhW9hPB9TVZENugquWJD5x0ug==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } } } }