diff --git a/.env.example b/.env.example
index dedca96..ba4fc7d 100644
--- a/.env.example
+++ b/.env.example
@@ -1,3 +1,10 @@
# Visit https://dashboard.clerk.com/last-active?path=api-keys to find your API Keys
NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY=
CLERK_SECRET_KEY=
+
+# The route at which your authentication flow lives, for more information see: https://clerk.com/docs/deployments/clerk-environment-variables
+NEXT_PUBLIC_CLERK_SIGN_IN_URL=/sign-in
+
+# Redirect URLs for after authenticating, for more information see: https://clerk.com/docs/guides/custom-redirects
+NEXT_PUBLIC_CLERK_SIGN_IN_FORCE_REDIRECT_URL=/dashboard
+NEXT_PUBLIC_CLERK_SIGN_UP_FORCE_REDIRECT_URL=/dashboard
diff --git a/app/[[...home]]/page.tsx b/app/[[...home]]/page.tsx
new file mode 100644
index 0000000..c7663cb
--- /dev/null
+++ b/app/[[...home]]/page.tsx
@@ -0,0 +1,49 @@
+import Image from "next/image";
+import Link from "next/link";
+import {
+ SignIn,
+ SignInButton,
+ SignUp,
+ SignOutButton,
+ SignedIn,
+ SignedOut,
+} from "@clerk/nextjs";
+import { ClerkLogo } from "../components/clerk-logo";
+
+export default function Page() {
+ return (
+
+
+
+
+
+
+
+ Welcome to Clerk
+
+
+
+
+ Get started by signing up as your first user
+
+
+
+
+
+
+
+
+
+
+ Dashboard
+
+
+
+
+
+
+ );
+}
diff --git a/app/components/clerk-logo.tsx b/app/components/clerk-logo.tsx
new file mode 100644
index 0000000..9ef9915
--- /dev/null
+++ b/app/components/clerk-logo.tsx
@@ -0,0 +1,30 @@
+export function ClerkLogo() {
+ return (
+
+
+
+
+
+
+
+ );
+}
diff --git a/app/components/code-switcher.tsx b/app/components/code-switcher.tsx
new file mode 100644
index 0000000..a41a414
--- /dev/null
+++ b/app/components/code-switcher.tsx
@@ -0,0 +1,60 @@
+"use client";
+
+import { useOrganization, useSession, useUser } from "@clerk/nextjs";
+import clsx from "clsx";
+import { useState } from "react";
+import { Prism as SyntaxHighlighter } from "react-syntax-highlighter";
+import theme from "./theme";
+
+const TYPES = ["user", "session", "organization"];
+
+export function CodeSwitcher() {
+ const [selectedType, setSelectedType] = useState(TYPES[0]);
+ const { user } = useUser();
+ const { session } = useSession();
+ const { organization } = useOrganization();
+
+ const selectedCode = JSON.stringify(
+ {
+ user,
+ session,
+ organization,
+ }[selectedType],
+ null,
+ 2
+ );
+
+ const typesToShow = organization
+ ? TYPES
+ : TYPES.filter((type) => type !== "organization");
+
+ return (
+
+
+ {typesToShow.map((type) => (
+ setSelectedType(type)}
+ >
+ {type}
+
+ ))}
+
+
+
+
+ {selectedCode}
+
+
+
+
+
+
+ );
+}
diff --git a/app/components/footer.tsx b/app/components/footer.tsx
new file mode 100644
index 0000000..31f034a
--- /dev/null
+++ b/app/components/footer.tsx
@@ -0,0 +1,146 @@
+export function Footer() {
+ return (
+
+ );
+}
diff --git a/app/components/theme.tsx b/app/components/theme.tsx
new file mode 100644
index 0000000..f6d0651
--- /dev/null
+++ b/app/components/theme.tsx
@@ -0,0 +1,154 @@
+export default {
+ 'code[class*="language-"]': {
+ color: "#c5c8c6",
+ fontFamily: "var(--font-geist-mono)",
+ direction: "ltr",
+ textAlign: "left",
+ whiteSpace: "pre",
+ wordSpacing: "normal",
+ wordBreak: "normal",
+ lineHeight: "1.5",
+ MozTabSize: "4",
+ OTabSize: "4",
+ tabSize: "4",
+ WebkitHyphens: "none",
+ MozHyphens: "none",
+ msHyphens: "none",
+ hyphens: "none",
+ fontSize: 12,
+ },
+ 'pre[class*="language-"]': {
+ color: "#c5c8c6",
+ fontFamily: "var(--font-geist-mono)",
+ direction: "ltr",
+ textAlign: "left",
+ whiteSpace: "pre",
+ wordSpacing: "normal",
+ wordBreak: "normal",
+ lineHeight: "1.5",
+ MozTabSize: "4",
+ OTabSize: "4",
+ tabSize: "4",
+ WebkitHyphens: "none",
+ MozHyphens: "none",
+ msHyphens: "none",
+ hyphens: "none",
+ padding: "16px 0px 32px",
+ margin: ".5em 0",
+ overflow: "auto",
+ borderRadius: "0.3em",
+ background: "white",
+ fontSize: 12,
+ height: "100%",
+ },
+ ':not(pre) > code[class*="language-"]': {
+ background: "white",
+ padding: ".1em",
+ borderRadius: ".3em",
+ },
+ comment: {
+ color: "#7C7C7C",
+ },
+ prolog: {
+ color: "#7C7C7C",
+ },
+ doctype: {
+ color: "#7C7C7C",
+ },
+ cdata: {
+ color: "#7C7C7C",
+ },
+ punctuation: {
+ color: "#c5c8c6",
+ },
+ ".namespace": {
+ Opacity: ".7",
+ },
+ property: {
+ color: "#676767",
+ },
+ keyword: {
+ color: "#676767",
+ },
+ tag: {
+ color: "#676767",
+ },
+ "class-name": {
+ color: "#FFFFB6",
+ textDecoration: "underline",
+ },
+ boolean: {
+ color: "#DB3FB9",
+ },
+ constant: {
+ color: "#DB3FB9",
+ },
+ symbol: {
+ color: "#f92672",
+ },
+ deleted: {
+ color: "#f92672",
+ },
+ number: {
+ color: "#FF73FD",
+ },
+ selector: {
+ color: "#4248DA",
+ },
+ "attr-name": {
+ color: "#4248DA",
+ },
+ string: {
+ color: "#4248DA",
+ },
+ char: {
+ color: "#4248DA",
+ },
+ builtin: {
+ color: "#4248DA",
+ },
+ inserted: {
+ color: "#4248DA",
+ },
+ variable: {
+ color: "#C6C5FE",
+ },
+ operator: {
+ color: "#EDEDED",
+ },
+ entity: {
+ color: "#FFFFB6",
+ cursor: "help",
+ },
+ url: {
+ color: "#676767",
+ },
+ ".language-css .token.string": {
+ color: "#C1C1C1",
+ },
+ ".style .token.string": {
+ color: "#C1C1C1",
+ },
+ atrule: {
+ color: "#F9EE98",
+ },
+ "attr-value": {
+ color: "#F9EE98",
+ },
+ function: {
+ color: "#DAD085",
+ },
+ regex: {
+ color: "#E9C062",
+ },
+ important: {
+ color: "#fd971f",
+ fontWeight: "bold",
+ },
+ bold: {
+ fontWeight: "bold",
+ },
+ italic: {
+ fontStyle: "italic",
+ },
+};
diff --git a/app/components/user-details.tsx b/app/components/user-details.tsx
new file mode 100644
index 0000000..af50edb
--- /dev/null
+++ b/app/components/user-details.tsx
@@ -0,0 +1,167 @@
+"use client";
+
+import { useOrganization, useSession, useUser } from "@clerk/nextjs";
+
+function Row({
+ desc,
+ value,
+ children,
+}: {
+ desc: string;
+ value: string;
+ children: React.ReactNode;
+}) {
+ return (
+
+ {desc}
+
+ {value}
+ {children}
+
+
+ );
+}
+
+function PointerC({ label }: { label: string }) {
+ return (
+
+ );
+}
+
+function formatDate(date: Date) {
+ return date.toLocaleDateString("en-US", {
+ month: "short",
+ day: "numeric",
+ year: "numeric",
+ });
+}
+
+function formatDateWithNumbers(date: Date): string {
+ return date.toLocaleString("en-US", {
+ month: "numeric",
+ day: "numeric",
+ year: "numeric",
+ hour: "numeric",
+ minute: "2-digit",
+ second: "2-digit",
+ hour12: true,
+ });
+}
+
+export function UserDetails() {
+ const { user } = useUser();
+ const { session } = useSession();
+ const { organization } = useOrganization();
+
+ if (!user || !session) return null;
+
+ return (
+
+
+
+
+
+
+
+ {user.firstName && user.lastName ? (
+
+ {user.firstName} {user.lastName}
+
+
+
+ user.firstName
+
+
+ user.lastName
+
+
+
+ ) : (
+
+ )}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Session details
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {organization ? (
+ <>
+
+ Organization detail
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ >
+ ) : null}
+
+
+ );
+}
diff --git a/app/dashboard/page.tsx b/app/dashboard/page.tsx
new file mode 100644
index 0000000..f3c90ad
--- /dev/null
+++ b/app/dashboard/page.tsx
@@ -0,0 +1,60 @@
+import { UserButton } from "@clerk/nextjs";
+import { auth } from "@clerk/nextjs/server";
+import { ClerkLogo } from "../components/clerk-logo";
+import Link from "next/link";
+import { CodeSwitcher } from "../components/code-switcher";
+import { UserDetails } from "../components/user-details";
+
+export default async function Page() {
+ await auth.protect();
+
+ return (
+ <>
+
+
+
+
+
+
+
+
+
+
+
+
+ Back to Home
+
+
+
+
+
+
+
+
+
+
+
+
+
+ >
+ );
+}
diff --git a/app/layout.tsx b/app/layout.tsx
index e9e5c37..a51e97c 100644
--- a/app/layout.tsx
+++ b/app/layout.tsx
@@ -1,46 +1,50 @@
-import type { Metadata } from 'next'
-import { ClerkProvider, SignInButton, SignUpButton, SignedIn, SignedOut, UserButton } from '@clerk/nextjs'
-import { Geist, Geist_Mono } from 'next/font/google'
-import './globals.css'
+import type { Metadata } from "next";
+import {
+ ClerkProvider,
+ SignInButton,
+ SignUpButton,
+ SignedIn,
+ SignedOut,
+ UserButton,
+} from "@clerk/nextjs";
+import { Geist, Geist_Mono } from "next/font/google";
+import "./globals.css";
+import { Footer } from "./components/footer";
const geistSans = Geist({
- variable: '--font-geist-sans',
- subsets: ['latin'],
-})
+ variable: "--font-geist-sans",
+ subsets: ["latin"],
+});
const geistMono = Geist_Mono({
- variable: '--font-geist-mono',
- subsets: ['latin'],
-})
+ variable: "--font-geist-mono",
+ subsets: ["latin"],
+});
export const metadata: Metadata = {
- title: 'Clerk Next.js Quickstart',
- description: 'Generated by create next app',
-}
+ title: "Clerk Next.js Quickstart",
+ description: "Generated by create next app",
+};
export default function RootLayout({
children,
}: Readonly<{
- children: React.ReactNode
+ children: React.ReactNode;
}>) {
return (
-
+
-
-
+
{children}
+
- )
+ );
}
diff --git a/app/page.tsx b/app/page.tsx
deleted file mode 100644
index 402bb47..0000000
--- a/app/page.tsx
+++ /dev/null
@@ -1,101 +0,0 @@
-import Image from "next/image";
-
-export default function Home() {
- return (
-
-
-
-
-
- Get started by editing{" "}
-
- app/page.tsx
-
- .
-
- Save and see your changes instantly.
-
-
-
-
-
-
- );
-}
diff --git a/app/sign-in/[[...sign-in]]/page.tsx b/app/sign-in/[[...sign-in]]/page.tsx
new file mode 100644
index 0000000..d015f88
--- /dev/null
+++ b/app/sign-in/[[...sign-in]]/page.tsx
@@ -0,0 +1,9 @@
+import { SignIn } from "@clerk/nextjs";
+
+export default function Page() {
+ return (
+
+
+
+ );
+}
diff --git a/middleware.ts b/middleware.ts
index a4262cd..1e92395 100644
--- a/middleware.ts
+++ b/middleware.ts
@@ -1,14 +1,22 @@
-import { clerkMiddleware } from '@clerk/nextjs/server'
+import { clerkMiddleware, createRouteMatcher } from "@clerk/nextjs/server";
-// This Middleware does not protect any routes by default.
-// See https://clerk.com/docs/references/nextjs/clerk-middleware for more information about configuring your Middleware
-export default clerkMiddleware()
+const isPublicRoute = createRouteMatcher([
+ "/(.*)",
+ "/sign-in(.*)",
+ "/sign-up(.*)",
+]);
+
+export default clerkMiddleware(async (auth, req) => {
+ if (!isPublicRoute(req)) {
+ await auth.protect();
+ }
+});
export const config = {
matcher: [
// Skip Next.js internals and all static files, unless found in search params
- '/((?!_next|[^?]*\\.(?:html?|css|js(?!on)|jpe?g|webp|png|gif|svg|ttf|woff2?|ico|csv|docx?|xlsx?|zip|webmanifest)).*)',
+ "/((?!_next|[^?]*\\.(?:html?|css|js(?!on)|jpe?g|webp|png|gif|svg|ttf|woff2?|ico|csv|docx?|xlsx?|zip|webmanifest)).*)",
// Always run for API routes
- '/(api|trpc)(.*)',
+ "/(api|trpc)(.*)",
],
-}
+};
diff --git a/package-lock.json b/package-lock.json
index d72df2d..66c279d 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -8,10 +8,12 @@
"name": "clerk-nextjs-app-quickstart",
"version": "0.1.0",
"dependencies": {
- "@clerk/nextjs": "^6.23.1",
+ "@clerk/nextjs": "^6.24.0",
+ "clsx": "^2.1.1",
"next": "15.3.4",
"react": "^19.1.0",
- "react-dom": "^19.1.0"
+ "react-dom": "^19.1.0",
+ "react-syntax-highlighter": "^15.6.1"
},
"devDependencies": {
"@tailwindcss/postcss": "^4.1.11",
@@ -49,16 +51,25 @@
"node": ">=6.0.0"
}
},
- "node_modules/@clerk/backend": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/@clerk/backend/-/backend-2.3.0.tgz",
- "integrity": "sha512-QkvJOF6nshJ9TkCjdXKY2MDWv29/TefIop350sXMpIrN1fIJIWzdFEnIjd4PCINSySPSctlRybL51Z8G/aTusg==",
+ "node_modules/@babel/runtime": {
+ "version": "7.27.6",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.6.tgz",
+ "integrity": "sha512-vbavdySgbTTrmFE+EsiqUTzlOr5bzlnJtUv9PynGCAKvfQqjIXbvFdumPM/GxMDfyuGMJaJAU6TO4zc1Jf1i8Q==",
"license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@clerk/backend": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/@clerk/backend/-/backend-2.4.1.tgz",
+ "integrity": "sha512-NryqYBslAWMNkw/8ff6qK9kMrbWPIAtNOfkr62Rmtyh/MODRQJI0GmHgLg0DcBQofPrRCIXhauhfJRWqweN3Mw==",
"dependencies": {
- "@clerk/shared": "^3.10.0",
- "@clerk/types": "^4.62.0",
+ "@clerk/shared": "^3.11.0",
+ "@clerk/types": "^4.64.0",
"cookie": "1.0.2",
"snakecase-keys": "8.0.1",
+ "standardwebhooks": "^1.0.0",
"tslib": "2.8.1"
},
"engines": {
@@ -66,13 +77,12 @@
}
},
"node_modules/@clerk/clerk-react": {
- "version": "5.32.2",
- "resolved": "https://registry.npmjs.org/@clerk/clerk-react/-/clerk-react-5.32.2.tgz",
- "integrity": "sha512-Me/mN7FW8QiF1M2yUtDJzQ12O+XEgFNbi82n+VILrPK/ilfufmA2uscqyyUyTmpxybwDHzD/U4Rve7HXwReweg==",
- "license": "MIT",
+ "version": "5.33.0",
+ "resolved": "https://registry.npmjs.org/@clerk/clerk-react/-/clerk-react-5.33.0.tgz",
+ "integrity": "sha512-3mDmsLFyup/O4blgS5erCHJnckEexIbWPhRnHEl+nGj9sftyo9h1t8GwFNjZGzLO2U8ALPH/6fe/cCnxk0qBRQ==",
"dependencies": {
- "@clerk/shared": "^3.10.0",
- "@clerk/types": "^4.62.0",
+ "@clerk/shared": "^3.11.0",
+ "@clerk/types": "^4.64.0",
"tslib": "2.8.1"
},
"engines": {
@@ -84,15 +94,14 @@
}
},
"node_modules/@clerk/nextjs": {
- "version": "6.23.1",
- "resolved": "https://registry.npmjs.org/@clerk/nextjs/-/nextjs-6.23.1.tgz",
- "integrity": "sha512-/c6FxnFd/m5uKVwbQTW1rJIOYoIHxRTc3MIVBzK7rSzukz23UFVZxeEsOmpQX2RT5hKyt5nlT15aci3bkhsPYw==",
- "license": "MIT",
+ "version": "6.24.0",
+ "resolved": "https://registry.npmjs.org/@clerk/nextjs/-/nextjs-6.24.0.tgz",
+ "integrity": "sha512-hc2b/dxmMdN4XvQ1GBwVXG5d/d1L4SDMVtzuR55+LUQl0IK22STQb4tuhfyqAoSM9Av7YGXwXu1CTniWtSjscA==",
"dependencies": {
- "@clerk/backend": "^2.3.0",
- "@clerk/clerk-react": "^5.32.2",
- "@clerk/shared": "^3.10.0",
- "@clerk/types": "^4.62.0",
+ "@clerk/backend": "^2.4.1",
+ "@clerk/clerk-react": "^5.33.0",
+ "@clerk/shared": "^3.11.0",
+ "@clerk/types": "^4.64.0",
"server-only": "0.0.1",
"tslib": "2.8.1"
},
@@ -106,13 +115,12 @@
}
},
"node_modules/@clerk/shared": {
- "version": "3.10.0",
- "resolved": "https://registry.npmjs.org/@clerk/shared/-/shared-3.10.0.tgz",
- "integrity": "sha512-3Xljj8v5dszuxzSEnQMQTf5pgfs8i/zzq9Dl744q0LutL5qGwtmk5Ja7G0kN3qQymyYy6OJOVcgnweevjazOPQ==",
+ "version": "3.11.0",
+ "resolved": "https://registry.npmjs.org/@clerk/shared/-/shared-3.11.0.tgz",
+ "integrity": "sha512-bSFWbKbW5bVehtELba5fERAJYDQUeQlUgcrn3JGZDFgnkN4j8tjdVv9lgEdEqDe65IwWxt9wRSbh0KRVdk9OLA==",
"hasInstallScript": true,
- "license": "MIT",
"dependencies": {
- "@clerk/types": "^4.62.0",
+ "@clerk/types": "^4.64.0",
"dequal": "2.0.3",
"glob-to-regexp": "0.4.1",
"js-cookie": "3.0.5",
@@ -136,10 +144,9 @@
}
},
"node_modules/@clerk/types": {
- "version": "4.62.0",
- "resolved": "https://registry.npmjs.org/@clerk/types/-/types-4.62.0.tgz",
- "integrity": "sha512-Ps/8eQHCuv2bZYgTG3+4xgxlltoX91GNf+G5TG/DSSmECgR657qGoasOrLLcMMyE+OZiX57k51oH137Ohhggog==",
- "license": "MIT",
+ "version": "4.64.0",
+ "resolved": "https://registry.npmjs.org/@clerk/types/-/types-4.64.0.tgz",
+ "integrity": "sha512-R9V4aJ8o7A7CJiqleNTTlIWt77pbmWeyD/rkvbN/CQ7By0KE0IPZbsWGXK0q2/WZNcP47LwOYO9aOnuXVrdLYw==",
"dependencies": {
"csstype": "3.1.3"
},
@@ -753,6 +760,11 @@
"node": ">= 10"
}
},
+ "node_modules/@stablelib/base64": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@stablelib/base64/-/base64-1.0.1.tgz",
+ "integrity": "sha512-1bnPQqSxSuc3Ii6MhBysoWCg58j97aUjuCSZrGSmDxNqtytIi0k8utUenAwTZN4V5mXXYGsVUI9zeBqy+jBOSQ=="
+ },
"node_modules/@swc/counter": {
"version": "0.1.3",
"resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz",
@@ -1042,6 +1054,15 @@
"tailwindcss": "4.1.11"
}
},
+ "node_modules/@types/hast": {
+ "version": "2.3.10",
+ "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.10.tgz",
+ "integrity": "sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/unist": "^2"
+ }
+ },
"node_modules/@types/node": {
"version": "24.0.3",
"resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.3.tgz",
@@ -1070,6 +1091,12 @@
"@types/react": "^19.0.0"
}
},
+ "node_modules/@types/unist": {
+ "version": "2.0.11",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz",
+ "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==",
+ "license": "MIT"
+ },
"node_modules/busboy": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz",
@@ -1100,6 +1127,36 @@
}
]
},
+ "node_modules/character-entities": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz",
+ "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/character-entities-legacy": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz",
+ "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/character-reference-invalid": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz",
+ "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
"node_modules/chownr": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz",
@@ -1115,6 +1172,15 @@
"resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz",
"integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA=="
},
+ "node_modules/clsx": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
+ "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/color": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz",
@@ -1160,11 +1226,20 @@
"simple-swizzle": "^0.2.2"
}
},
+ "node_modules/comma-separated-tokens": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz",
+ "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
"node_modules/cookie": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz",
"integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==",
- "license": "MIT",
"engines": {
"node": ">=18"
}
@@ -1178,7 +1253,6 @@
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
"integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==",
- "license": "MIT",
"engines": {
"node": ">=6"
}
@@ -1197,7 +1271,6 @@
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz",
"integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==",
- "license": "MIT",
"dependencies": {
"no-case": "^3.0.4",
"tslib": "^2.0.3"
@@ -1217,11 +1290,36 @@
"node": ">=10.13.0"
}
},
+ "node_modules/fast-sha256": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/fast-sha256/-/fast-sha256-1.3.0.tgz",
+ "integrity": "sha512-n11RGP/lrWEFI/bWdygLxhI+pVeo1ZYIVwvvPkW7azl/rOy+F3HYRZ2K5zeE9mmkhQppyv9sQFx0JM9UabnpPQ=="
+ },
+ "node_modules/fault": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/fault/-/fault-1.0.4.tgz",
+ "integrity": "sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==",
+ "license": "MIT",
+ "dependencies": {
+ "format": "^0.2.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/format": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz",
+ "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==",
+ "engines": {
+ "node": ">=0.4.x"
+ }
+ },
"node_modules/glob-to-regexp": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
- "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==",
- "license": "BSD-2-Clause"
+ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw=="
},
"node_modules/graceful-fs": {
"version": "4.2.11",
@@ -1230,6 +1328,72 @@
"dev": true,
"license": "ISC"
},
+ "node_modules/hast-util-parse-selector": {
+ "version": "2.2.5",
+ "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz",
+ "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hastscript": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz",
+ "integrity": "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/hast": "^2.0.0",
+ "comma-separated-tokens": "^1.0.0",
+ "hast-util-parse-selector": "^2.0.0",
+ "property-information": "^5.0.0",
+ "space-separated-tokens": "^1.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/highlight.js": {
+ "version": "10.7.3",
+ "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz",
+ "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/highlightjs-vue": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/highlightjs-vue/-/highlightjs-vue-1.0.0.tgz",
+ "integrity": "sha512-PDEfEF102G23vHmPhLyPboFCD+BkMGu+GuJe2d9/eH4FsCwvgBpnc9n0pGE+ffKdph38s6foEZiEjdgHdzp+IA==",
+ "license": "CC0-1.0"
+ },
+ "node_modules/is-alphabetical": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz",
+ "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/is-alphanumerical": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz",
+ "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==",
+ "license": "MIT",
+ "dependencies": {
+ "is-alphabetical": "^1.0.0",
+ "is-decimal": "^1.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
"node_modules/is-arrayish": {
"version": "0.3.2",
"resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
@@ -1237,6 +1401,26 @@
"license": "MIT",
"optional": true
},
+ "node_modules/is-decimal": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz",
+ "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/is-hexadecimal": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz",
+ "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
"node_modules/jiti": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz",
@@ -1251,7 +1435,6 @@
"version": "3.0.5",
"resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.5.tgz",
"integrity": "sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==",
- "license": "MIT",
"engines": {
"node": ">=14"
}
@@ -1499,11 +1682,24 @@
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz",
"integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==",
- "license": "MIT",
"dependencies": {
"tslib": "^2.0.3"
}
},
+ "node_modules/lowlight": {
+ "version": "1.20.0",
+ "resolved": "https://registry.npmjs.org/lowlight/-/lowlight-1.20.0.tgz",
+ "integrity": "sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==",
+ "license": "MIT",
+ "dependencies": {
+ "fault": "^1.0.0",
+ "highlight.js": "~10.7.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
"node_modules/magic-string": {
"version": "0.30.17",
"resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz",
@@ -1518,7 +1714,6 @@
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz",
"integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==",
- "license": "MIT",
"engines": {
"node": ">=8"
},
@@ -1667,12 +1862,29 @@
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz",
"integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==",
- "license": "MIT",
"dependencies": {
"lower-case": "^2.0.2",
"tslib": "^2.0.3"
}
},
+ "node_modules/parse-entities": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz",
+ "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==",
+ "license": "MIT",
+ "dependencies": {
+ "character-entities": "^1.0.0",
+ "character-entities-legacy": "^1.0.0",
+ "character-reference-invalid": "^1.0.0",
+ "is-alphanumerical": "^1.0.0",
+ "is-decimal": "^1.0.0",
+ "is-hexadecimal": "^1.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
"node_modules/picocolors": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
@@ -1706,6 +1918,28 @@
"node": "^10 || ^12 || >=14"
}
},
+ "node_modules/prismjs": {
+ "version": "1.30.0",
+ "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz",
+ "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/property-information": {
+ "version": "5.6.0",
+ "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz",
+ "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==",
+ "license": "MIT",
+ "dependencies": {
+ "xtend": "^4.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
"node_modules/react": {
"version": "19.1.0",
"resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz",
@@ -1727,6 +1961,47 @@
"react": "^19.1.0"
}
},
+ "node_modules/react-syntax-highlighter": {
+ "version": "15.6.1",
+ "resolved": "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-15.6.1.tgz",
+ "integrity": "sha512-OqJ2/vL7lEeV5zTJyG7kmARppUjiB9h9udl4qHQjjgEos66z00Ia0OckwYfRxCSFrW8RJIBnsBwQsHZbVPspqg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "^7.3.1",
+ "highlight.js": "^10.4.1",
+ "highlightjs-vue": "^1.0.0",
+ "lowlight": "^1.17.0",
+ "prismjs": "^1.27.0",
+ "refractor": "^3.6.0"
+ },
+ "peerDependencies": {
+ "react": ">= 0.14.0"
+ }
+ },
+ "node_modules/refractor": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/refractor/-/refractor-3.6.0.tgz",
+ "integrity": "sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==",
+ "license": "MIT",
+ "dependencies": {
+ "hastscript": "^6.0.0",
+ "parse-entities": "^2.0.0",
+ "prismjs": "~1.27.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/refractor/node_modules/prismjs": {
+ "version": "1.27.0",
+ "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.27.0.tgz",
+ "integrity": "sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/scheduler": {
"version": "0.26.0",
"resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz",
@@ -1807,7 +2082,6 @@
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz",
"integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==",
- "license": "MIT",
"dependencies": {
"dot-case": "^3.0.4",
"tslib": "^2.0.3"
@@ -1817,7 +2091,6 @@
"version": "8.0.1",
"resolved": "https://registry.npmjs.org/snakecase-keys/-/snakecase-keys-8.0.1.tgz",
"integrity": "sha512-Sj51kE1zC7zh6TDlNNz0/Jn1n5HiHdoQErxO8jLtnyrkJW/M5PrI7x05uDgY3BO7OUQYKCvmeMurW6BPUdwEOw==",
- "license": "MIT",
"dependencies": {
"map-obj": "^4.1.0",
"snake-case": "^3.0.4",
@@ -1835,11 +2108,29 @@
"node": ">=0.10.0"
}
},
+ "node_modules/space-separated-tokens": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz",
+ "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/standardwebhooks": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/standardwebhooks/-/standardwebhooks-1.0.0.tgz",
+ "integrity": "sha512-BbHGOQK9olHPMvQNHWul6MYlrRTAOKn03rOe4A8O3CLWhNf4YHBqq2HJKKC+sfqpxiBY52pNeesD6jIiLDz8jg==",
+ "dependencies": {
+ "@stablelib/base64": "^1.0.0",
+ "fast-sha256": "^1.3.0"
+ }
+ },
"node_modules/std-env": {
"version": "3.9.0",
"resolved": "https://registry.npmjs.org/std-env/-/std-env-3.9.0.tgz",
- "integrity": "sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==",
- "license": "MIT"
+ "integrity": "sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw=="
},
"node_modules/streamsearch": {
"version": "1.1.0",
@@ -1872,10 +2163,9 @@
}
},
"node_modules/swr": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/swr/-/swr-2.3.3.tgz",
- "integrity": "sha512-dshNvs3ExOqtZ6kJBaAsabhPdHyeY4P2cKwRCniDVifBMoG/SVI7tfLWqPXriVspf2Rg4tPzXJTnwaihIeFw2A==",
- "license": "MIT",
+ "version": "2.3.4",
+ "resolved": "https://registry.npmjs.org/swr/-/swr-2.3.4.tgz",
+ "integrity": "sha512-bYd2lrhc+VarcpkgWclcUi92wYCpOgMws9Sd1hG1ntAu0NEy+14CbotuFjshBU2kt9rYj9TSmDcybpxpeTU1fg==",
"dependencies": {
"dequal": "^2.0.3",
"use-sync-external-store": "^1.4.0"
@@ -1928,7 +2218,6 @@
"version": "4.41.0",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz",
"integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==",
- "license": "(MIT OR CC0-1.0)",
"engines": {
"node": ">=16"
},
@@ -1960,11 +2249,19 @@
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz",
"integrity": "sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==",
- "license": "MIT",
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0"
}
},
+ "node_modules/xtend": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
+ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.4"
+ }
+ },
"node_modules/yallist": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz",
diff --git a/package.json b/package.json
index b2029cc..c408a07 100644
--- a/package.json
+++ b/package.json
@@ -9,10 +9,12 @@
"lint": "next lint"
},
"dependencies": {
- "@clerk/nextjs": "^6.23.1",
+ "@clerk/nextjs": "^6.24.0",
+ "clsx": "^2.1.1",
"next": "15.3.4",
"react": "^19.1.0",
- "react-dom": "^19.1.0"
+ "react-dom": "^19.1.0",
+ "react-syntax-highlighter": "^15.6.1"
},
"devDependencies": {
"@tailwindcss/postcss": "^4.1.11",