diff --git a/.vscode/extensions.json b/.vscode/extensions.json
new file mode 100644
index 0000000..3f60dc2
--- /dev/null
+++ b/.vscode/extensions.json
@@ -0,0 +1,7 @@
+{
+ "recommendations": [
+ "esbenp.prettier-vscode",
+ "vivaxy.vscode-conventional-commits",
+ "dbaeumer.vscode-eslint"
+ ]
+}
diff --git a/package.json b/package.json
index 2260762..b446ee8 100644
--- a/package.json
+++ b/package.json
@@ -10,7 +10,13 @@
"format": "prettier --write ."
},
"dependencies": {
+ "@fortawesome/fontawesome-svg-core": "^6.7.2",
+ "@fortawesome/free-brands-svg-icons": "^6.7.2",
+ "@fortawesome/free-regular-svg-icons": "^6.7.2",
+ "@fortawesome/free-solid-svg-icons": "^6.7.2",
+ "@fortawesome/react-fontawesome": "^0.2.2",
"next": "15.3.2",
+ "next-auth": "^5.0.0-beta.25",
"react": "^19.0.0",
"react-dom": "^19.0.0"
},
@@ -23,6 +29,7 @@
"eslint-config-next": "15.3.2",
"eslint-config-prettier": "10.1.3",
"prettier": "3.5.3",
+ "prisma": "^6.7.0",
"typescript": "5.8.3"
},
"packageManager": "yarn@1.22.22+sha1.ac34549e6aa8e7ead463a7407e1c7390f61a6610"
diff --git a/prisma/schema.prisma b/prisma/schema.prisma
new file mode 100644
index 0000000..e8b9fe9
--- /dev/null
+++ b/prisma/schema.prisma
@@ -0,0 +1,15 @@
+// This is your Prisma schema file,
+// learn more about it in the docs: https://pris.ly/d/prisma-schema
+
+// Looking for ways to speed up your queries, or scale easily with your serverless or edge functions?
+// Try Prisma Accelerate: https://pris.ly/cli/accelerate-init
+
+generator client {
+ provider = "prisma-client-js"
+ output = "../generated/prisma"
+}
+
+datasource db {
+ provider = "postgresql"
+ url = env("DATABASE_URL")
+}
diff --git a/src/app/api/auth/[...nextauth]/route.ts b/src/app/api/auth/[...nextauth]/route.ts
new file mode 100644
index 0000000..0a98352
--- /dev/null
+++ b/src/app/api/auth/[...nextauth]/route.ts
@@ -0,0 +1,3 @@
+import { handlers } from '@/auth';
+
+export const { GET, POST } = handlers;
diff --git a/src/app/globals.css b/src/app/globals.css
index e3734be..e37b231 100644
--- a/src/app/globals.css
+++ b/src/app/globals.css
@@ -1,12 +1,48 @@
:root {
--background: #ffffff;
- --foreground: #171717;
+ --foreground: #3a3a3a;
+
+ --neutral: #808080;
+
+ --primary-50: rgba(59, 130, 246, 0.5);
+ --primary-75: rgba(59, 130, 246, 0.75);
+ --primary-100: rgba(59, 130, 246, 1);
+
+ --warning-50: rgba(245, 158, 11, 0.5);
+ --warning-75: rgba(245, 158, 11, 0.75);
+ --warning-100: rgba(245, 158, 11, 1);
+
+ --success-50: rgba(22, 163, 74, 0.5);
+ --success-75: rgba(22, 163, 74, 0.75);
+ --success-100: rgba(22, 163, 74, 1);
+
+ --danger-50: rgba(220, 38, 38, 0.5);
+ --danger-75: rgba(220, 38, 38, 0.75);
+ --danger-100: rgba(220, 38, 38, 1);
+
+ --button-text-size: 18px;
+
+ --neutral-50: rgb(204, 204, 204, 0.5);
+ --neutral-75: rgb(204, 204, 204, 0.75);
+ --neutral-100: rgb(204, 204, 204, 1);
+
+ --textbox-50: rgb(204, 204, 204, 0.5);
+ --textbox-75: rgb(204, 204, 204, 0.75);
+ --textbox-100: rgb(204, 204, 204, 1);
+
+ --base-1: #f3f3f3;
}
@media (prefers-color-scheme: dark) {
:root {
--background: #0a0a0a;
- --foreground: #ededed;
+ --foreground: #e5e7eb;
+
+ --textbox-50: rgb(75, 85, 99, 0.5);
+ --textbox-75: rgb(75, 85, 99, 0.75);
+ --textbox-100: rgb(75, 85, 99, 1);
+
+ --base-1: #111111;
}
}
diff --git a/src/app/home/page.tsx b/src/app/home/page.tsx
new file mode 100644
index 0000000..b28c508
--- /dev/null
+++ b/src/app/home/page.tsx
@@ -0,0 +1,10 @@
+import { Logout } from '@/components/user/sso-logout-button';
+
+export default function Home() {
+ return (
+
+
Home
+
+
+ );
+}
diff --git a/src/app/login/login.module.css b/src/app/login/login.module.css
new file mode 100644
index 0000000..73b5f1b
--- /dev/null
+++ b/src/app/login/login.module.css
@@ -0,0 +1,30 @@
+body:has(.loginContainer) {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ height: 100svh;
+}
+
+.loginContainer {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ gap: 1.5rem;
+ padding: 2rem;
+ width: 300px;
+
+ background-color: var(--base-1);
+ border-radius: 1rem;
+ border: 2px solid var(--foreground);
+}
+
+.loginContainer h1 {
+ margin-bottom: 1rem;
+}
+
+.loginContainer form {
+ display: flex;
+ flex-direction: column;
+ gap: 1rem;
+}
diff --git a/src/app/login/page.tsx b/src/app/login/page.tsx
new file mode 100644
index 0000000..9aadba1
--- /dev/null
+++ b/src/app/login/page.tsx
@@ -0,0 +1,30 @@
+import { auth } from '@/auth';
+import SSOLogin from '@/components/user/sso-login-button';
+import LoginForm from '@/components/user/login-form';
+import { redirect } from 'next/navigation';
+
+import style from './login.module.css';
+
+import '@/app/globals.css';
+
+export default async function LoginPage() {
+ const session = await auth();
+
+ if (session?.user) {
+ redirect('/home');
+ }
+
+ return (
+
+
Login
+
+
+
+
+
+ {process.env.AUTH_AUTHENTIK_ISSUER && (
+
+ )}
+
+ );
+}
diff --git a/src/auth.ts b/src/auth.ts
new file mode 100644
index 0000000..50b654c
--- /dev/null
+++ b/src/auth.ts
@@ -0,0 +1,13 @@
+import NextAuth from 'next-auth';
+import Authentik from 'next-auth/providers/authentik';
+
+export const { handlers, signIn, signOut, auth } = NextAuth({
+ providers: [process.env.AUTH_AUTHENTIK_ISSUER ? Authentik : null].filter(
+ (x) => x !== null,
+ ),
+ callbacks: {
+ authorized: async ({ auth }) => {
+ return !!auth;
+ },
+ },
+});
diff --git a/src/components/button.module.css b/src/components/button.module.css
new file mode 100644
index 0000000..05fb359
--- /dev/null
+++ b/src/components/button.module.css
@@ -0,0 +1,60 @@
+.button {
+ background-color: var(--color-50);
+ border-radius: 16px;
+ padding: 10px 20px;
+ outline: none;
+ border: 2px solid var(--color-100);
+ transition: background-color 0.3s ease;
+ height: 50px;
+}
+
+.button:hover {
+ background-color: var(--color-75);
+}
+
+.button:active {
+ background-color: var(--color-100);
+}
+
+.button span {
+ color: var(--foreground);
+ font-size: var(--button-text-size);
+ font-weight: 600;
+}
+
+.icon {
+ display: grid;
+ grid-template-columns: 25px 1fr;
+ gap: 10px;
+ align-items: center;
+}
+
+.style_primary {
+ --color-50: var(--primary-50);
+ --color-75: var(--primary-75);
+ --color-100: var(--primary-100);
+}
+
+.style_warning {
+ --color-50: var(--warning-50);
+ --color-75: var(--warning-75);
+ --color-100: var(--warning-100);
+}
+
+.style_success {
+ --color-50: var(--success-50);
+ --color-75: var(--success-75);
+ --color-100: var(--success-100);
+}
+
+.style_danger {
+ --color-50: var(--danger-50);
+ --color-75: var(--danger-75);
+ --color-100: var(--danger-100);
+}
+
+.style_neutral {
+ --color-50: var(--neutral-50);
+ --color-75: var(--neutral-75);
+ --color-100: var(--neutral-100);
+}
diff --git a/src/components/button.tsx b/src/components/button.tsx
new file mode 100644
index 0000000..87094ad
--- /dev/null
+++ b/src/components/button.tsx
@@ -0,0 +1,47 @@
+import style from './button.module.css';
+
+import { IconProp } from '@fortawesome/fontawesome-svg-core';
+import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
+
+export default function Button({
+ type,
+ children,
+ mode = 'primary',
+ icon,
+ width,
+}: {
+ type?: 'button' | 'submit' | 'reset';
+ children?: React.ReactNode;
+ mode?: 'primary' | 'warning' | 'success' | 'danger' | 'neutral';
+ icon?: IconProp;
+ width?: number;
+}) {
+ if (!icon) {
+ return (
+
+ );
+ } else {
+ return (
+
+ );
+ }
+}
diff --git a/src/components/labeled-input.module.css b/src/components/labeled-input.module.css
new file mode 100644
index 0000000..85f46ed
--- /dev/null
+++ b/src/components/labeled-input.module.css
@@ -0,0 +1,37 @@
+.input,
+.input * {
+ box-sizing: border-box;
+}
+
+.input {
+ position: relative;
+ overflow: visible;
+ width: 250px;
+}
+
+.input input {
+ width: 100%;
+ height: 50px;
+ border: 1px solid var(--textbox-75);
+ border-radius: 16px;
+ padding: 10px 20px;
+ background-color: var(--textbox-50);
+ color: var(--foreground);
+ font-size: 16px;
+ transition:
+ background-color 0.2s ease,
+ border-color 0.2s ease,
+ box-shadow 0.2s ease;
+}
+
+.input input:hover {
+ background-color: var(--textbox-75);
+ border-color: var(--textbox-100);
+}
+
+.input input:focus {
+ outline: none;
+ background-color: var(--textbox-100);
+ border-color: var(--primary-100);
+ box-shadow: 0 0 0 2px var(--primary-50);
+}
diff --git a/src/components/labeled-input.tsx b/src/components/labeled-input.tsx
new file mode 100644
index 0000000..48f27fe
--- /dev/null
+++ b/src/components/labeled-input.tsx
@@ -0,0 +1,50 @@
+import style from './labeled-input.module.css';
+
+export default function LabeledInput({
+ type,
+ width,
+ label,
+ placeholder,
+ value,
+}: {
+ type: 'text' | 'email' | 'password';
+ width?: number;
+ label?: string;
+ placeholder?: string;
+ value?: string;
+}) {
+ const randomId = Math.random().toString(36).substring(2, 15);
+
+ if (!label) {
+ return (
+
+
+
+ );
+ } else {
+ return (
+
+
+
+
+
+ );
+ }
+}
diff --git a/src/components/user/login-form.tsx b/src/components/user/login-form.tsx
new file mode 100644
index 0000000..12d1f3e
--- /dev/null
+++ b/src/components/user/login-form.tsx
@@ -0,0 +1,24 @@
+import LabeledInput from '@/components/labeled-input';
+import Button from '../button';
+
+export default function LoginForm() {
+ return (
+
+
+
+ );
+}
diff --git a/src/components/user/sso-login-button.tsx b/src/components/user/sso-login-button.tsx
new file mode 100644
index 0000000..272872e
--- /dev/null
+++ b/src/components/user/sso-login-button.tsx
@@ -0,0 +1,24 @@
+import { signIn } from '@/auth';
+import Button from '../button';
+import { faOpenid } from '@fortawesome/free-brands-svg-icons';
+
+export default function SSOLogin({
+ provider,
+ providerDisplayName,
+}: {
+ provider: string;
+ providerDisplayName: string;
+}) {
+ return (
+
+ );
+}
diff --git a/src/components/user/sso-logout-button.tsx b/src/components/user/sso-logout-button.tsx
new file mode 100644
index 0000000..9a42274
--- /dev/null
+++ b/src/components/user/sso-logout-button.tsx
@@ -0,0 +1,18 @@
+import { signOut } from '@/auth';
+import Button from '../button';
+import { faDoorOpen } from '@fortawesome/free-solid-svg-icons';
+
+export function Logout() {
+ return (
+
+ );
+}
diff --git a/src/middleware.ts b/src/middleware.ts
new file mode 100644
index 0000000..a35c316
--- /dev/null
+++ b/src/middleware.ts
@@ -0,0 +1,16 @@
+import { auth } from '@/auth';
+
+export default auth((req) => {
+ if (
+ !req.auth &&
+ req.nextUrl.pathname !== '/login' &&
+ process.env.MEETUP_SKIP_LOGIN !== 'true'
+ ) {
+ const newUrl = new URL('/login', req.nextUrl.origin);
+ return Response.redirect(newUrl);
+ }
+});
+
+export const config = {
+ matcher: ['/((?!api|_next/static|_next/image|favicon.ico).*)'],
+};
diff --git a/yarn.lock b/yarn.lock
index 4f15697..d741f2d 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2,6 +2,19 @@
# yarn lockfile v1
+"@auth/core@0.37.2":
+ version "0.37.2"
+ resolved "https://registry.yarnpkg.com/@auth/core/-/core-0.37.2.tgz#0db8a94a076846bd88eb7f9273618513e2285cb2"
+ integrity sha512-kUvzyvkcd6h1vpeMAojK2y7+PAV5H+0Cc9+ZlKYDFhDY31AlvsB+GW5vNO4qE3Y07KeQgvNO9U0QUx/fN62kBw==
+ dependencies:
+ "@panva/hkdf" "^1.2.1"
+ "@types/cookie" "0.6.0"
+ cookie "0.7.1"
+ jose "^5.9.3"
+ oauth4webapi "^3.0.0"
+ preact "10.11.3"
+ preact-render-to-string "5.2.3"
+
"@emnapi/core@^1.4.0":
version "1.4.3"
resolved "https://registry.yarnpkg.com/@emnapi/core/-/core-1.4.3.tgz#9ac52d2d5aea958f67e52c40a065f51de59b77d6"
@@ -24,6 +37,131 @@
dependencies:
tslib "^2.4.0"
+"@esbuild/aix-ppc64@0.25.4":
+ version "0.25.4"
+ resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.4.tgz#830d6476cbbca0c005136af07303646b419f1162"
+ integrity sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==
+
+"@esbuild/android-arm64@0.25.4":
+ version "0.25.4"
+ resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.25.4.tgz#d11d4fc299224e729e2190cacadbcc00e7a9fd67"
+ integrity sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==
+
+"@esbuild/android-arm@0.25.4":
+ version "0.25.4"
+ resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.25.4.tgz#5660bd25080553dd2a28438f2a401a29959bd9b1"
+ integrity sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==
+
+"@esbuild/android-x64@0.25.4":
+ version "0.25.4"
+ resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.25.4.tgz#18ddde705bf984e8cd9efec54e199ac18bc7bee1"
+ integrity sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==
+
+"@esbuild/darwin-arm64@0.25.4":
+ version "0.25.4"
+ resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.4.tgz#b0b7fb55db8fc6f5de5a0207ae986eb9c4766e67"
+ integrity sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==
+
+"@esbuild/darwin-x64@0.25.4":
+ version "0.25.4"
+ resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.25.4.tgz#e6813fdeba0bba356cb350a4b80543fbe66bf26f"
+ integrity sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==
+
+"@esbuild/freebsd-arm64@0.25.4":
+ version "0.25.4"
+ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.4.tgz#dc11a73d3ccdc308567b908b43c6698e850759be"
+ integrity sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==
+
+"@esbuild/freebsd-x64@0.25.4":
+ version "0.25.4"
+ resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.4.tgz#91da08db8bd1bff5f31924c57a81dab26e93a143"
+ integrity sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==
+
+"@esbuild/linux-arm64@0.25.4":
+ version "0.25.4"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.25.4.tgz#efc15e45c945a082708f9a9f73bfa8d4db49728a"
+ integrity sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==
+
+"@esbuild/linux-arm@0.25.4":
+ version "0.25.4"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.25.4.tgz#9b93c3e54ac49a2ede6f906e705d5d906f6db9e8"
+ integrity sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==
+
+"@esbuild/linux-ia32@0.25.4":
+ version "0.25.4"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.25.4.tgz#be8ef2c3e1d99fca2d25c416b297d00360623596"
+ integrity sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==
+
+"@esbuild/linux-loong64@0.25.4":
+ version "0.25.4"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.25.4.tgz#b0840a2707c3fc02eec288d3f9defa3827cd7a87"
+ integrity sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==
+
+"@esbuild/linux-mips64el@0.25.4":
+ version "0.25.4"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.4.tgz#2a198e5a458c9f0e75881a4e63d26ba0cf9df39f"
+ integrity sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==
+
+"@esbuild/linux-ppc64@0.25.4":
+ version "0.25.4"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.4.tgz#64f4ae0b923d7dd72fb860b9b22edb42007cf8f5"
+ integrity sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==
+
+"@esbuild/linux-riscv64@0.25.4":
+ version "0.25.4"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.4.tgz#fb2844b11fdddd39e29d291c7cf80f99b0d5158d"
+ integrity sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==
+
+"@esbuild/linux-s390x@0.25.4":
+ version "0.25.4"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.25.4.tgz#1466876e0aa3560c7673e63fdebc8278707bc750"
+ integrity sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==
+
+"@esbuild/linux-x64@0.25.4":
+ version "0.25.4"
+ resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.25.4.tgz#c10fde899455db7cba5f11b3bccfa0e41bf4d0cd"
+ integrity sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==
+
+"@esbuild/netbsd-arm64@0.25.4":
+ version "0.25.4"
+ resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.4.tgz#02e483fbcbe3f18f0b02612a941b77be76c111a4"
+ integrity sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==
+
+"@esbuild/netbsd-x64@0.25.4":
+ version "0.25.4"
+ resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.4.tgz#ec401fb0b1ed0ac01d978564c5fc8634ed1dc2ed"
+ integrity sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==
+
+"@esbuild/openbsd-arm64@0.25.4":
+ version "0.25.4"
+ resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.4.tgz#f272c2f41cfea1d91b93d487a51b5c5ca7a8c8c4"
+ integrity sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==
+
+"@esbuild/openbsd-x64@0.25.4":
+ version "0.25.4"
+ resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.4.tgz#2e25950bc10fa9db1e5c868e3d50c44f7c150fd7"
+ integrity sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==
+
+"@esbuild/sunos-x64@0.25.4":
+ version "0.25.4"
+ resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.25.4.tgz#cd596fa65a67b3b7adc5ecd52d9f5733832e1abd"
+ integrity sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==
+
+"@esbuild/win32-arm64@0.25.4":
+ version "0.25.4"
+ resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.25.4.tgz#b4dbcb57b21eeaf8331e424c3999b89d8951dc88"
+ integrity sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==
+
+"@esbuild/win32-ia32@0.25.4":
+ version "0.25.4"
+ resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.25.4.tgz#410842e5d66d4ece1757634e297a87635eb82f7a"
+ integrity sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==
+
+"@esbuild/win32-x64@0.25.4":
+ version "0.25.4"
+ resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.25.4.tgz#0b17ec8a70b2385827d52314c1253160a0b9bacc"
+ integrity sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==
+
"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0":
version "4.6.0"
resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.6.0.tgz#bfe67b3d334a8579a35e48fe240dc0638d1bcd91"
@@ -90,6 +228,46 @@
"@eslint/core" "^0.13.0"
levn "^0.4.1"
+"@fortawesome/fontawesome-common-types@6.7.2":
+ version "6.7.2"
+ resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.7.2.tgz#7123d74b0c1e726794aed1184795dbce12186470"
+ integrity sha512-Zs+YeHUC5fkt7Mg1l6XTniei3k4bwG/yo3iFUtZWd/pMx9g3fdvkSK9E0FOC+++phXOka78uJcYb8JaFkW52Xg==
+
+"@fortawesome/fontawesome-svg-core@^6.7.2":
+ version "6.7.2"
+ resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.7.2.tgz#0ac6013724d5cc327c1eb81335b91300a4fce2f2"
+ integrity sha512-yxtOBWDrdi5DD5o1pmVdq3WMCvnobT0LU6R8RyyVXPvFRd2o79/0NCuQoCjNTeZz9EzA9xS3JxNWfv54RIHFEA==
+ dependencies:
+ "@fortawesome/fontawesome-common-types" "6.7.2"
+
+"@fortawesome/free-brands-svg-icons@^6.7.2":
+ version "6.7.2"
+ resolved "https://registry.yarnpkg.com/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-6.7.2.tgz#4ebee8098f31da5446dda81edc344025eb59b27e"
+ integrity sha512-zu0evbcRTgjKfrr77/2XX+bU+kuGfjm0LbajJHVIgBWNIDzrhpRxiCPNT8DW5AdmSsq7Mcf9D1bH0aSeSUSM+Q==
+ dependencies:
+ "@fortawesome/fontawesome-common-types" "6.7.2"
+
+"@fortawesome/free-regular-svg-icons@^6.7.2":
+ version "6.7.2"
+ resolved "https://registry.yarnpkg.com/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-6.7.2.tgz#f1651e55e6651a15589b0569516208f9c65f96db"
+ integrity sha512-7Z/ur0gvCMW8G93dXIQOkQqHo2M5HLhYrRVC0//fakJXxcF1VmMPsxnG6Ee8qEylA8b8Q3peQXWMNZ62lYF28g==
+ dependencies:
+ "@fortawesome/fontawesome-common-types" "6.7.2"
+
+"@fortawesome/free-solid-svg-icons@^6.7.2":
+ version "6.7.2"
+ resolved "https://registry.yarnpkg.com/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.7.2.tgz#fe25883b5eb8464a82918599950d283c465b57f6"
+ integrity sha512-GsBrnOzU8uj0LECDfD5zomZJIjrPhIlWU82AHwa2s40FKH+kcxQaBvBo3Z4TxyZHIyX8XTDxsyA33/Vx9eFuQA==
+ dependencies:
+ "@fortawesome/fontawesome-common-types" "6.7.2"
+
+"@fortawesome/react-fontawesome@^0.2.2":
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/@fortawesome/react-fontawesome/-/react-fontawesome-0.2.2.tgz#68b058f9132b46c8599875f6a636dad231af78d4"
+ integrity sha512-EnkrprPNqI6SXJl//m29hpaNzOp1bruISWaOiRtkMi/xSvHJlzc2j2JAYS7egxt/EbjSNV/k6Xy0AQI6vB2+1g==
+ dependencies:
+ prop-types "^15.8.1"
+
"@humanfs/core@^0.19.1":
version "0.19.1"
resolved "https://registry.yarnpkg.com/@humanfs/core/-/core-0.19.1.tgz#17c55ca7d426733fe3c561906b8173c336b40a77"
@@ -339,6 +517,55 @@
resolved "https://registry.yarnpkg.com/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz#3dc35ba0f1e66b403c00b39344f870298ebb1c8e"
integrity sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==
+"@panva/hkdf@^1.2.1":
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/@panva/hkdf/-/hkdf-1.2.1.tgz#cb0d111ef700136f4580349ff0226bf25c853f23"
+ integrity sha512-6oclG6Y3PiDFcoyk8srjLfVKyMfVCKJ27JwNPViuXziFpmdz+MZnZN/aKY0JGXgYuO/VghU0jcOAZgWXZ1Dmrw==
+
+"@prisma/config@6.7.0":
+ version "6.7.0"
+ resolved "https://registry.yarnpkg.com/@prisma/config/-/config-6.7.0.tgz#ae80b889ba1facc308ecca2009aa6dfbe92c28db"
+ integrity sha512-di8QDdvSz7DLUi3OOcCHSwxRNeW7jtGRUD2+Z3SdNE3A+pPiNT8WgUJoUyOwJmUr5t+JA2W15P78C/N+8RXrOA==
+ dependencies:
+ esbuild ">=0.12 <1"
+ esbuild-register "3.6.0"
+
+"@prisma/debug@6.7.0":
+ version "6.7.0"
+ resolved "https://registry.yarnpkg.com/@prisma/debug/-/debug-6.7.0.tgz#a955174e4f481b0ca5d7c0fd458ef848432afd59"
+ integrity sha512-RabHn9emKoYFsv99RLxvfG2GHzWk2ZI1BuVzqYtmMSIcuGboHY5uFt3Q3boOREM9de6z5s3bQoyKeWnq8Fz22w==
+
+"@prisma/engines-version@6.7.0-36.3cff47a7f5d65c3ea74883f1d736e41d68ce91ed":
+ version "6.7.0-36.3cff47a7f5d65c3ea74883f1d736e41d68ce91ed"
+ resolved "https://registry.yarnpkg.com/@prisma/engines-version/-/engines-version-6.7.0-36.3cff47a7f5d65c3ea74883f1d736e41d68ce91ed.tgz#4ec7c8ee187924a910ec244e3790412d1069d723"
+ integrity sha512-EvpOFEWf1KkJpDsBCrih0kg3HdHuaCnXmMn7XFPObpFTzagK1N0Q0FMnYPsEhvARfANP5Ok11QyoTIRA2hgJTA==
+
+"@prisma/engines@6.7.0":
+ version "6.7.0"
+ resolved "https://registry.yarnpkg.com/@prisma/engines/-/engines-6.7.0.tgz#291835aa5df84e9c33a1cfe1566e639909d46627"
+ integrity sha512-3wDMesnOxPrOsq++e5oKV9LmIiEazFTRFZrlULDQ8fxdub5w4NgRBoxtWbvXmj2nJVCnzuz6eFix3OhIqsZ1jw==
+ dependencies:
+ "@prisma/debug" "6.7.0"
+ "@prisma/engines-version" "6.7.0-36.3cff47a7f5d65c3ea74883f1d736e41d68ce91ed"
+ "@prisma/fetch-engine" "6.7.0"
+ "@prisma/get-platform" "6.7.0"
+
+"@prisma/fetch-engine@6.7.0":
+ version "6.7.0"
+ resolved "https://registry.yarnpkg.com/@prisma/fetch-engine/-/fetch-engine-6.7.0.tgz#c8bc042ee6438d62d5bf77aafa6c56cf0002c5d8"
+ integrity sha512-zLlAGnrkmioPKJR4Yf7NfW3hftcvqeNNEHleMZK9yX7RZSkhmxacAYyfGsCcqRt47jiZ7RKdgE0Wh2fWnm7WsQ==
+ dependencies:
+ "@prisma/debug" "6.7.0"
+ "@prisma/engines-version" "6.7.0-36.3cff47a7f5d65c3ea74883f1d736e41d68ce91ed"
+ "@prisma/get-platform" "6.7.0"
+
+"@prisma/get-platform@6.7.0":
+ version "6.7.0"
+ resolved "https://registry.yarnpkg.com/@prisma/get-platform/-/get-platform-6.7.0.tgz#967f21f8ad966b941dcb47b153b84958655390d1"
+ integrity sha512-i9IH5lO4fQwnMLvQLYNdgVh9TK3PuWBfQd7QLk/YurnAIg+VeADcZDbmhAi4XBBDD+hDif9hrKyASu0hbjwabw==
+ dependencies:
+ "@prisma/debug" "6.7.0"
+
"@rtsao/scc@^1.1.0":
version "1.1.0"
resolved "https://registry.yarnpkg.com/@rtsao/scc/-/scc-1.1.0.tgz#927dd2fae9bc3361403ac2c7a00c32ddce9ad7e8"
@@ -368,6 +595,11 @@
dependencies:
tslib "^2.4.0"
+"@types/cookie@0.6.0":
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.6.0.tgz#eac397f28bf1d6ae0ae081363eca2f425bedf0d5"
+ integrity sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==
+
"@types/estree@^1.0.6":
version "1.0.7"
resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.7.tgz#4158d3105276773d5b7695cd4834b1722e4f37a8"
@@ -879,6 +1111,11 @@ cookie-signature@^1.2.1:
resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.2.2.tgz#57c7fc3cc293acab9fec54d73e15690ebe4a1793"
integrity sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==
+cookie@0.7.1:
+ version "0.7.1"
+ resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.1.tgz#2f73c42142d5d5cf71310a74fc4ae61670e5dbc9"
+ integrity sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==
+
cookie@^0.7.1:
version "0.7.2"
resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.2.tgz#556369c472a2ba910f2979891b526b3436237ed7"
@@ -1138,6 +1375,44 @@ es-to-primitive@^1.3.0:
is-date-object "^1.0.5"
is-symbol "^1.0.4"
+esbuild-register@3.6.0:
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/esbuild-register/-/esbuild-register-3.6.0.tgz#cf270cfa677baebbc0010ac024b823cbf723a36d"
+ integrity sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==
+ dependencies:
+ debug "^4.3.4"
+
+"esbuild@>=0.12 <1":
+ version "0.25.4"
+ resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.25.4.tgz#bb9a16334d4ef2c33c7301a924b8b863351a0854"
+ integrity sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==
+ optionalDependencies:
+ "@esbuild/aix-ppc64" "0.25.4"
+ "@esbuild/android-arm" "0.25.4"
+ "@esbuild/android-arm64" "0.25.4"
+ "@esbuild/android-x64" "0.25.4"
+ "@esbuild/darwin-arm64" "0.25.4"
+ "@esbuild/darwin-x64" "0.25.4"
+ "@esbuild/freebsd-arm64" "0.25.4"
+ "@esbuild/freebsd-x64" "0.25.4"
+ "@esbuild/linux-arm" "0.25.4"
+ "@esbuild/linux-arm64" "0.25.4"
+ "@esbuild/linux-ia32" "0.25.4"
+ "@esbuild/linux-loong64" "0.25.4"
+ "@esbuild/linux-mips64el" "0.25.4"
+ "@esbuild/linux-ppc64" "0.25.4"
+ "@esbuild/linux-riscv64" "0.25.4"
+ "@esbuild/linux-s390x" "0.25.4"
+ "@esbuild/linux-x64" "0.25.4"
+ "@esbuild/netbsd-arm64" "0.25.4"
+ "@esbuild/netbsd-x64" "0.25.4"
+ "@esbuild/openbsd-arm64" "0.25.4"
+ "@esbuild/openbsd-x64" "0.25.4"
+ "@esbuild/sunos-x64" "0.25.4"
+ "@esbuild/win32-arm64" "0.25.4"
+ "@esbuild/win32-ia32" "0.25.4"
+ "@esbuild/win32-x64" "0.25.4"
+
escape-html@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
@@ -1525,6 +1800,11 @@ for-each@^0.3.3, for-each@^0.3.5:
dependencies:
is-callable "^1.2.7"
+fsevents@2.3.3:
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6"
+ integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==
+
forwarded@0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811"
@@ -1948,6 +2228,11 @@ iterator.prototype@^1.1.4:
has-symbols "^1.1.0"
set-function-name "^2.0.2"
+jose@^5.9.3:
+ version "5.10.0"
+ resolved "https://registry.yarnpkg.com/jose/-/jose-5.10.0.tgz#c37346a099d6467c401351a9a0c2161e0f52c4be"
+ integrity sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg==
+
"js-tokens@^3.0.0 || ^4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
@@ -2117,6 +2402,13 @@ negotiator@^1.0.0:
resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-1.0.0.tgz#b6c91bb47172d69f93cfd7c357bbb529019b5f6a"
integrity sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==
+next-auth@^5.0.0-beta.25:
+ version "5.0.0-beta.25"
+ resolved "https://registry.yarnpkg.com/next-auth/-/next-auth-5.0.0-beta.25.tgz#3a9f9734e1d8fa5ced545360f1afc24862cb92d5"
+ integrity sha512-2dJJw1sHQl2qxCrRk+KTQbeH+izFbGFPuJj5eGgBZFYyiYYtvlrBeUw1E/OJJxTRjuxbSYGnCTkUIRsIIW0bog==
+ dependencies:
+ "@auth/core" "0.37.2"
+
next@15.3.2:
version "15.3.2"
resolved "https://registry.yarnpkg.com/next/-/next-15.3.2.tgz#97510629e38a058dd154782a5c2ec9c9ab94d0d8"
@@ -2140,6 +2432,11 @@ next@15.3.2:
"@next/swc-win32-x64-msvc" "15.3.2"
sharp "^0.34.1"
+oauth4webapi@^3.0.0:
+ version "3.5.0"
+ resolved "https://registry.yarnpkg.com/oauth4webapi/-/oauth4webapi-3.5.0.tgz#9be1227e2a6af7761dd0d1a811ce33050077974b"
+ integrity sha512-DF3mLWNuxPkxJkHmWxbSFz4aE5CjWOsm465VBfBdWzmzX4Mg3vF8icxK+iKqfdWrIumBJ2TaoNQWx+SQc2bsPQ==
+
object-assign@^4, object-assign@^4.1.1:
version "4.1.1"
resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
@@ -2321,6 +2618,18 @@ postcss@8.4.31:
picocolors "^1.0.0"
source-map-js "^1.0.2"
+preact-render-to-string@5.2.3:
+ version "5.2.3"
+ resolved "https://registry.yarnpkg.com/preact-render-to-string/-/preact-render-to-string-5.2.3.tgz#23d17376182af720b1060d5a4099843c7fe92fe4"
+ integrity sha512-aPDxUn5o3GhWdtJtW0svRC2SS/l8D9MAgo2+AWml+BhDImb27ALf04Q2d+AHqUUOc6RdSXFIBVa2gxzgMKgtZA==
+ dependencies:
+ pretty-format "^3.8.0"
+
+preact@10.11.3:
+ version "10.11.3"
+ resolved "https://registry.yarnpkg.com/preact/-/preact-10.11.3.tgz#8a7e4ba19d3992c488b0785afcc0f8aa13c78d19"
+ integrity sha512-eY93IVpod/zG3uMF22Unl8h9KkrcKIRs2EGar8hwLZZDU1lkjph303V9HZBwufh2s736U6VXuhD109LYqPoffg==
+
prelude-ls@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396"
@@ -2331,6 +2640,21 @@ prettier@3.5.3:
resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.5.3.tgz#4fc2ce0d657e7a02e602549f053b239cb7dfe1b5"
integrity sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==
+pretty-format@^3.8.0:
+ version "3.8.0"
+ resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-3.8.0.tgz#bfbed56d5e9a776645f4b1ff7aa1a3ac4fa3c385"
+ integrity sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==
+
+prisma@^6.7.0:
+ version "6.7.0"
+ resolved "https://registry.yarnpkg.com/prisma/-/prisma-6.7.0.tgz#7890e352bde11f6ec3018802d3fc1bcbe0027bd2"
+ integrity sha512-vArg+4UqnQ13CVhc2WUosemwh6hr6cr6FY2uzDvCIFwH8pu8BXVv38PktoMLVjtX7sbYThxbnZF5YiR8sN2clw==
+ dependencies:
+ "@prisma/config" "6.7.0"
+ "@prisma/engines" "6.7.0"
+ optionalDependencies:
+ fsevents "2.3.3"
+
prop-types@^15.8.1:
version "15.8.1"
resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5"