├── .eslintignore ├── .vscode └── settings.json ├── app ├── favicon.ico ├── api │ ├── auth │ │ └── [...nextauth] │ │ │ └── route.ts │ └── sentry-example-api │ │ └── route.ts ├── (root) │ ├── layout.tsx │ ├── startup │ │ ├── create │ │ │ └── page.tsx │ │ └── [id] │ │ │ └── page.tsx │ ├── page.tsx │ ├── search │ │ └── page.tsx │ └── user │ │ └── [id] │ │ └── page.tsx ├── studio │ └── [[...tool]] │ │ └── page.tsx ├── global-error.tsx ├── layout.tsx ├── globals.css └── sentry-example-page │ └── page.tsx ├── .prettierignore ├── public ├── gif-incredible.mp4 └── images │ ├── avatar-lula-meyers.jpg │ ├── avatar-owen-garcia.jpg │ ├── design-example-1.png │ ├── design-example-1O.png │ ├── design-example-2.png │ ├── design-example-2O.png │ ├── avatar-florence-shaw.jpg │ ├── avatar-ashwin-santiago.jpg │ ├── framer-logo.svg │ ├── plus.svg │ ├── mouse-pointer.svg │ ├── menu.svg │ ├── figma-logo.svg │ ├── twice.svg │ ├── github-logo.svg │ ├── notion-logo.svg │ ├── apex.svg │ ├── slack-logo.svg │ ├── pulse.svg │ ├── cursor-you.svg │ ├── relume-logo.svg │ ├── acme-corp.svg │ ├── echo-valley.svg │ ├── quantum.svg │ ├── logo.svg │ └── celestial.svg ├── sanity-typegen.json ├── postcss.config.mjs ├── next-auth.d.ts ├── sanity ├── lib │ ├── live.ts │ ├── client.ts │ ├── write-client.ts │ └── queries.ts ├── schemaTypes │ ├── index.ts │ ├── playlist.ts │ ├── author.ts │ └── startup.ts ├── structure.ts ├── env.ts └── types.ts ├── components ├── ui │ ├── skeleton.tsx │ ├── textarea.tsx │ ├── label.tsx │ ├── input.tsx │ ├── toaster.tsx │ ├── badge.tsx │ ├── avatar.tsx │ ├── button.tsx │ ├── card.tsx │ ├── toast.tsx │ └── dropdown-menu.tsx ├── ping.tsx ├── ping-animate.tsx ├── avatar.tsx ├── key.tsx ├── tag.tsx ├── search-form-reset.tsx ├── user-startups.tsx ├── feature-card.tsx ├── button.tsx ├── view.tsx ├── views-badge.tsx ├── homepage │ ├── footer.tsx │ ├── recent-pitches-carousel.tsx │ ├── call-to-action.tsx │ ├── introduction.tsx │ ├── logo-ticker.tsx │ ├── integrations.tsx │ ├── faqs.tsx │ ├── hero.tsx │ └── features.tsx ├── pointer.tsx ├── search-form.tsx ├── integrations-column.tsx ├── general-swiper.tsx ├── startup-card.tsx ├── navbar.tsx ├── navigation-bar.tsx └── startup-form.tsx ├── instrumentation.ts ├── sanity.cli.ts ├── lib ├── utils.ts ├── validation.ts └── actions.ts ├── components.json ├── .gitignore ├── sentry.server.config.ts ├── tsconfig.json ├── sentry.edge.config.ts ├── sanity.config.ts ├── .eslintrc.json ├── sentry.client.config.ts ├── auth.ts ├── prettier.config.js ├── next.config.ts ├── package.json ├── tailwind.config.ts ├── hooks └── use-toast.ts └── README.md /.eslintignore: -------------------------------------------------------------------------------- 1 | *.json 2 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | } -------------------------------------------------------------------------------- /app/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AayushBharti/Next-Venture/HEAD/app/favicon.ico -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | dist 2 | node_modules 3 | .next 4 | build 5 | public 6 | .contentlayer 7 | *.min.cjs 8 | -------------------------------------------------------------------------------- /public/gif-incredible.mp4: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AayushBharti/Next-Venture/HEAD/public/gif-incredible.mp4 -------------------------------------------------------------------------------- /public/images/avatar-lula-meyers.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AayushBharti/Next-Venture/HEAD/public/images/avatar-lula-meyers.jpg -------------------------------------------------------------------------------- /public/images/avatar-owen-garcia.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AayushBharti/Next-Venture/HEAD/public/images/avatar-owen-garcia.jpg -------------------------------------------------------------------------------- /public/images/design-example-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AayushBharti/Next-Venture/HEAD/public/images/design-example-1.png -------------------------------------------------------------------------------- /public/images/design-example-1O.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AayushBharti/Next-Venture/HEAD/public/images/design-example-1O.png -------------------------------------------------------------------------------- /public/images/design-example-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AayushBharti/Next-Venture/HEAD/public/images/design-example-2.png -------------------------------------------------------------------------------- /public/images/design-example-2O.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AayushBharti/Next-Venture/HEAD/public/images/design-example-2O.png -------------------------------------------------------------------------------- /public/images/avatar-florence-shaw.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AayushBharti/Next-Venture/HEAD/public/images/avatar-florence-shaw.jpg -------------------------------------------------------------------------------- /public/images/avatar-ashwin-santiago.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AayushBharti/Next-Venture/HEAD/public/images/avatar-ashwin-santiago.jpg -------------------------------------------------------------------------------- /sanity-typegen.json: -------------------------------------------------------------------------------- 1 | { 2 | "path": "./src/**/*.{ts,tsx,js,jsx}", 3 | "schema": "./sanity/extract.json", 4 | "generates": "./sanity/types.ts" 5 | } 6 | -------------------------------------------------------------------------------- /app/api/auth/[...nextauth]/route.ts: -------------------------------------------------------------------------------- 1 | import { handlers } from "@/auth" // Referring to the auth.ts we just created 2 | export const { GET, POST } = handlers 3 | -------------------------------------------------------------------------------- /postcss.config.mjs: -------------------------------------------------------------------------------- 1 | /** @type {import('postcss-load-config').Config} */ 2 | const config = { 3 | plugins: { 4 | tailwindcss: {}, 5 | }, 6 | }; 7 | 8 | export default config; 9 | -------------------------------------------------------------------------------- /next-auth.d.ts: -------------------------------------------------------------------------------- 1 | import NextAuth from "next-auth" 2 | 3 | declare module "next-auth" { 4 | interface Session { 5 | id: string 6 | } 7 | 8 | interface JWT { 9 | id: string 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /sanity/lib/live.ts: -------------------------------------------------------------------------------- 1 | import "server-only" 2 | 3 | import { defineLive } from "next-sanity" 4 | 5 | import { client } from "@/sanity/lib/client" 6 | 7 | export const { sanityFetch, SanityLive } = defineLive({ client }) 8 | -------------------------------------------------------------------------------- /public/images/framer-logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /app/(root)/layout.tsx: -------------------------------------------------------------------------------- 1 | import Navbar from "@/components/navigation-bar" 2 | 3 | export default function Layout({ 4 | children, 5 | }: Readonly<{ children: React.ReactNode }>) { 6 | return ( 7 |
8 | 9 | {children} 10 |
11 | ) 12 | } 13 | -------------------------------------------------------------------------------- /public/images/plus.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /public/images/mouse-pointer.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /sanity/lib/client.ts: -------------------------------------------------------------------------------- 1 | import { createClient } from "next-sanity" 2 | 3 | import { apiVersion, dataset, projectId } from "../env" 4 | 5 | export const client = createClient({ 6 | projectId, 7 | dataset, 8 | apiVersion, 9 | useCdn: false, // Set to false if statically generating pages, using ISR or tag-based revalidation 10 | }) 11 | -------------------------------------------------------------------------------- /app/api/sentry-example-api/route.ts: -------------------------------------------------------------------------------- 1 | import { NextResponse } from "next/server" 2 | 3 | export const dynamic = "force-dynamic" 4 | 5 | // A faulty API route to test Sentry's error monitoring 6 | export function GET() { 7 | throw new Error("Sentry Example API Route Error") 8 | return NextResponse.json({ data: "Testing Sentry Error..." }) 9 | } 10 | -------------------------------------------------------------------------------- /components/ui/skeleton.tsx: -------------------------------------------------------------------------------- 1 | import { cn } from "@/lib/utils" 2 | 3 | function Skeleton({ 4 | className, 5 | ...props 6 | }: React.HTMLAttributes) { 7 | return ( 8 |
12 | ) 13 | } 14 | 15 | export { Skeleton } 16 | -------------------------------------------------------------------------------- /public/images/menu.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /sanity/schemaTypes/index.ts: -------------------------------------------------------------------------------- 1 | import { type SchemaTypeDefinition } from "sanity" 2 | 3 | import { author } from "@/sanity/schemaTypes/author" 4 | import { startup } from "@/sanity/schemaTypes/startup" 5 | import { playlist } from "@/sanity/schemaTypes/playlist" 6 | 7 | export const schema: { types: SchemaTypeDefinition[] } = { 8 | types: [author, startup, playlist], 9 | } 10 | -------------------------------------------------------------------------------- /instrumentation.ts: -------------------------------------------------------------------------------- 1 | import * as Sentry from "@sentry/nextjs" 2 | 3 | export async function register() { 4 | if (process.env.NEXT_RUNTIME === "nodejs") { 5 | await import("./sentry.server.config") 6 | } 7 | 8 | if (process.env.NEXT_RUNTIME === "edge") { 9 | await import("./sentry.edge.config") 10 | } 11 | } 12 | 13 | export const onRequestError = Sentry.captureRequestError 14 | -------------------------------------------------------------------------------- /sanity/structure.ts: -------------------------------------------------------------------------------- 1 | import type { StructureResolver } from "sanity/structure" 2 | 3 | // https://www.sanity.io/docs/structure-builder-cheat-sheet 4 | export const structure: StructureResolver = S => 5 | S.list() 6 | .title("Content") 7 | .items([ 8 | S.documentTypeListItem("author").title("Authors"), 9 | S.documentTypeListItem("startup").title("Startups"), 10 | ]) 11 | -------------------------------------------------------------------------------- /sanity.cli.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * This configuration file lets you run `$ sanity [command]` in this folder 3 | * Go to https://www.sanity.io/docs/cli to learn more. 4 | **/ 5 | import { defineCliConfig } from "sanity/cli" 6 | 7 | const projectId = process.env.NEXT_PUBLIC_SANITY_PROJECT_ID 8 | const dataset = process.env.NEXT_PUBLIC_SANITY_DATASET 9 | 10 | export default defineCliConfig({ api: { projectId, dataset } }) 11 | -------------------------------------------------------------------------------- /sanity/lib/write-client.ts: -------------------------------------------------------------------------------- 1 | import "server-only" 2 | 3 | import { createClient } from "next-sanity" 4 | 5 | import { apiVersion, dataset, projectId, token } from "../env" 6 | 7 | export const writeClient = createClient({ 8 | projectId, 9 | dataset, 10 | apiVersion, 11 | useCdn: false, 12 | token, 13 | }) 14 | 15 | if (!writeClient.config().token) { 16 | throw new Error("Write token not found.") 17 | } 18 | -------------------------------------------------------------------------------- /components/ping.tsx: -------------------------------------------------------------------------------- 1 | const Ping = () => { 2 | return ( 3 |
4 |
5 | 6 | 7 | 8 | 9 |
10 |
11 | ) 12 | } 13 | export default Ping 14 | -------------------------------------------------------------------------------- /components/ping-animate.tsx: -------------------------------------------------------------------------------- 1 | const Ping = () => { 2 | return ( 3 |
4 |
5 | 6 | 7 | 8 | 9 |
10 |
11 | ) 12 | } 13 | export default Ping 14 | -------------------------------------------------------------------------------- /components/avatar.tsx: -------------------------------------------------------------------------------- 1 | import React, { HTMLAttributes } from "react" 2 | 3 | import { cn } from "@/lib/utils" 4 | 5 | export default function Avatar(props: HTMLAttributes) { 6 | const { className, children, ...otherProps } = props 7 | return ( 8 |
15 | {children} 16 |
17 | ) 18 | } 19 | -------------------------------------------------------------------------------- /lib/utils.ts: -------------------------------------------------------------------------------- 1 | import { type ClassValue, clsx } from "clsx" 2 | import { twMerge } from "tailwind-merge" 3 | 4 | export function cn(...inputs: ClassValue[]) { 5 | return twMerge(clsx(inputs)) 6 | } 7 | 8 | export function formatDate(date: string) { 9 | return new Date(date).toLocaleDateString("en-US", { 10 | month: "long", 11 | day: "numeric", 12 | year: "numeric", 13 | }) 14 | } 15 | 16 | export function parseServerActionResponse(response: T) { 17 | return JSON.parse(JSON.stringify(response)) 18 | } 19 | -------------------------------------------------------------------------------- /components.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://ui.shadcn.com/schema.json", 3 | "style": "new-york", 4 | "rsc": true, 5 | "tsx": true, 6 | "tailwind": { 7 | "config": "tailwind.config.ts", 8 | "css": "app/globals.css", 9 | "baseColor": "zinc", 10 | "cssVariables": true, 11 | "prefix": "" 12 | }, 13 | "aliases": { 14 | "components": "@/components", 15 | "utils": "@/lib/utils", 16 | "ui": "@/components/ui", 17 | "lib": "@/lib", 18 | "hooks": "@/hooks" 19 | }, 20 | "iconLibrary": "lucide" 21 | } -------------------------------------------------------------------------------- /components/key.tsx: -------------------------------------------------------------------------------- 1 | import React, { HTMLAttributes } from "react" 2 | import { twMerge } from "tailwind-merge" 3 | 4 | export default function Key(props: HTMLAttributes) { 5 | const { className, children, ...otherProps } = props 6 | return ( 7 |
14 | {children} 15 |
16 | ) 17 | } 18 | -------------------------------------------------------------------------------- /components/tag.tsx: -------------------------------------------------------------------------------- 1 | import React, { HTMLAttributes } from "react" 2 | 3 | import { cn } from "@/lib/utils" 4 | 5 | export default function Tag(props: HTMLAttributes) { 6 | const { className, children, ...otherProps } = props 7 | return ( 8 |
15 | 16 | {children} 17 |
18 | ) 19 | } 20 | -------------------------------------------------------------------------------- /lib/validation.ts: -------------------------------------------------------------------------------- 1 | import { z } from "zod" 2 | 3 | export const formSchema = z.object({ 4 | title: z.string().min(3).max(100), 5 | description: z.string().min(20).max(500), 6 | category: z.string().min(3).max(20), 7 | link: z 8 | .string() 9 | .url() 10 | .refine(async url => { 11 | try { 12 | const response = await fetch(url, { method: "HEAD" }) 13 | const contentType = response.headers.get("content-type") 14 | 15 | return contentType?.startsWith("image/") 16 | } catch { 17 | return false 18 | } 19 | }), 20 | pitch: z.string().min(10), 21 | }) 22 | -------------------------------------------------------------------------------- /sanity/schemaTypes/playlist.ts: -------------------------------------------------------------------------------- 1 | import { defineField, defineType } from "sanity" 2 | 3 | export const playlist = defineType({ 4 | name: "playlist", 5 | title: "Playlists", 6 | type: "document", 7 | fields: [ 8 | defineField({ 9 | name: "title", 10 | type: "string", 11 | }), 12 | defineField({ 13 | name: "slug", 14 | type: "slug", 15 | options: { 16 | source: "title", 17 | }, 18 | }), 19 | defineField({ 20 | name: "select", 21 | type: "array", 22 | of: [{ type: "reference", to: [{ type: "startup" }] }], 23 | }), 24 | ], 25 | }) 26 | -------------------------------------------------------------------------------- /app/(root)/startup/create/page.tsx: -------------------------------------------------------------------------------- 1 | import { redirect } from "next/navigation" 2 | 3 | import { auth } from "@/auth" 4 | import StartupForm from "@/components/startup-form" 5 | 6 | const Page = async () => { 7 | const session = await auth() 8 | 9 | if (!session) redirect("/") 10 | 11 | return ( 12 | <> 13 |
14 |

15 | Submit Your Startup 16 |

17 |
18 | 19 | 20 | 21 | ) 22 | } 23 | 24 | export default Page 25 | -------------------------------------------------------------------------------- /sanity/env.ts: -------------------------------------------------------------------------------- 1 | export const apiVersion = 2 | process.env.NEXT_PUBLIC_SANITY_API_VERSION || "2024-11-02" 3 | 4 | export const dataset = assertValue( 5 | process.env.NEXT_PUBLIC_SANITY_DATASET, 6 | "Missing environment variable: NEXT_PUBLIC_SANITY_DATASET", 7 | ) 8 | 9 | export const projectId = assertValue( 10 | process.env.NEXT_PUBLIC_SANITY_PROJECT_ID, 11 | "Missing environment variable: NEXT_PUBLIC_SANITY_PROJECT_ID", 12 | ) 13 | 14 | export const token = process.env.SANITY_WRITE_TOKEN 15 | 16 | function assertValue(v: T | undefined, errorMessage: string): T { 17 | if (v === undefined) { 18 | throw new Error(errorMessage) 19 | } 20 | 21 | return v 22 | } 23 | -------------------------------------------------------------------------------- /components/search-form-reset.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import { X } from "lucide-react" 4 | import Link from "next/link" 5 | 6 | import { Button } from "./ui/button" 7 | 8 | const SearchFormReset = () => { 9 | const reset = () => { 10 | const form = document.querySelector(".search-form") as HTMLFormElement 11 | if (form) form.reset() 12 | } 13 | 14 | return ( 15 | 24 | ) 25 | } 26 | export default SearchFormReset 27 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.* 7 | .yarn/* 8 | !.yarn/patches 9 | !.yarn/plugins 10 | !.yarn/releases 11 | !.yarn/versions 12 | 13 | # testing 14 | /coverage 15 | 16 | # next.js 17 | /.next/ 18 | /out/ 19 | 20 | # production 21 | /build 22 | 23 | # misc 24 | .DS_Store 25 | *.pem 26 | 27 | # debug 28 | npm-debug.log* 29 | yarn-debug.log* 30 | yarn-error.log* 31 | 32 | # env files (can opt-in for commiting if needed) 33 | .env* 34 | 35 | # vercel 36 | .vercel 37 | 38 | # typescript 39 | *.tsbuildinfo 40 | next-env.d.ts 41 | 42 | # Sentry Config File 43 | .env.sentry-build-plugin 44 | -------------------------------------------------------------------------------- /sentry.server.config.ts: -------------------------------------------------------------------------------- 1 | // This file configures the initialization of Sentry on the server. 2 | // The config you add here will be used whenever the server handles a request. 3 | // https://docs.sentry.io/platforms/javascript/guides/nextjs/ 4 | 5 | import * as Sentry from "@sentry/nextjs" 6 | 7 | Sentry.init({ 8 | dsn: "https://1c984c8324a9109aa8fb2092fca60110@o4508267791187968.ingest.us.sentry.io/4508267792302080", 9 | 10 | // Define how likely traces are sampled. Adjust this value in production, or use tracesSampler for greater control. 11 | tracesSampleRate: 1, 12 | 13 | // Setting this option to true will print useful information to the console while you're setting up Sentry. 14 | debug: false, 15 | }) 16 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "ES2017", 4 | "lib": ["dom", "dom.iterable", "esnext"], 5 | "allowJs": true, 6 | "skipLibCheck": true, 7 | "strict": true, 8 | "noEmit": true, 9 | "esModuleInterop": true, 10 | "module": "esnext", 11 | "moduleResolution": "bundler", 12 | "resolveJsonModule": true, 13 | "isolatedModules": true, 14 | "jsx": "preserve", 15 | "incremental": true, 16 | "plugins": [ 17 | { 18 | "name": "next" 19 | } 20 | ], 21 | "paths": { 22 | "@/*": ["./*"] 23 | } 24 | }, 25 | "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], 26 | "exclude": ["node_modules"] 27 | } 28 | -------------------------------------------------------------------------------- /app/studio/[[...tool]]/page.tsx: -------------------------------------------------------------------------------- 1 | /** 2 | * This route is responsible for the built-in authoring environment using Sanity Studio. 3 | * All routes under your studio path is handled by this file using Next.js' catch-all routes: 4 | * https://nextjs.org/docs/routing/dynamic-routes#catch-all-routes 5 | * 6 | * You can learn more about the next-sanity package here: 7 | * https://github.com/sanity-io/next-sanity 8 | */ 9 | 10 | import { NextStudio } from "next-sanity/studio" 11 | 12 | import config from "@/sanity.config" 13 | 14 | export const dynamic = "force-static" 15 | 16 | export { metadata, viewport } from "next-sanity/studio" 17 | 18 | export default function StudioPage() { 19 | return 20 | } 21 | -------------------------------------------------------------------------------- /components/user-startups.tsx: -------------------------------------------------------------------------------- 1 | import React from "react" 2 | 3 | import StartupCard, { StartupTypeCard } from "@/components/startup-card" 4 | import { client } from "@/sanity/lib/client" 5 | import { STARTUPS_BY_AUTHOR_QUERY } from "@/sanity/lib/queries" 6 | 7 | const UserStartups = async ({ id }: { id: string }) => { 8 | const startups = await client.fetch(STARTUPS_BY_AUTHOR_QUERY, { id }) 9 | 10 | return ( 11 | <> 12 | {startups.length > 0 ? ( 13 | startups.map((startup: StartupTypeCard) => ( 14 | 15 | )) 16 | ) : ( 17 |

No posts yet

18 | )} 19 | 20 | ) 21 | } 22 | export default UserStartups 23 | -------------------------------------------------------------------------------- /components/ui/textarea.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react" 2 | 3 | import { cn } from "@/lib/utils" 4 | 5 | const Textarea = React.forwardRef< 6 | HTMLTextAreaElement, 7 | React.ComponentProps<"textarea"> 8 | >(({ className, ...props }, ref) => { 9 | return ( 10 |