refactor: convert to bun workspaces monorepo

- Move web app into apps/web/
- Create packages/shared/ with shared types
- Create plugins/decky-vault/ scaffold
- Root package.json manages workspaces only
This commit is contained in:
2026-06-28 05:20:28 +08:00
parent c4bede20d4
commit cd72b7a948
345 changed files with 488 additions and 126 deletions
@@ -0,0 +1,5 @@
import ForgotPasswordForm from "@/components/auth/forgot-password-form"
export default function ForgotPasswordPage() {
return <ForgotPasswordForm />
}
+42
View File
@@ -0,0 +1,42 @@
import type { Metadata } from "next"
import Image from "next/image"
import Link from "next/link"
import logo from "@/app/icon.png"
export const metadata: Metadata = {
title: "Authentication",
}
export default function AuthLayout({
children,
}: {
children: React.ReactNode
}) {
return (
<div className="min-h-[calc(100vh-3.6rem)] flex items-center justify-center px-4 relative overflow-hidden">
{/* Background decorative orbs */}
<div className="absolute top-20 left-10 w-48 h-48 rounded-full bg-primary/10 blur-3xl pointer-events-none" />
<div className="absolute bottom-20 right-10 w-36 h-36 rounded-full bg-secondary/15 blur-2xl pointer-events-none" />
{/* Auth card */}
<div className="w-full max-w-md bg-text/5 border border-border rounded-xl p-8 relative z-10">
{/* Logo */}
<Link
href="/"
className="flex flex-col items-center gap-2 mb-8"
>
<Image
src={logo}
alt="DeckyVault Logo"
className="h-10 w-auto"
/>
<span className="text-lg font-bold text-text">
DeckyVault
</span>
</Link>
{children}
</div>
</div>
)
}
+10
View File
@@ -0,0 +1,10 @@
import { Suspense } from "react"
import LoginForm from "@/components/auth/login-form"
export default function LoginPage() {
return (
<Suspense>
<LoginForm />
</Suspense>
)
}
@@ -0,0 +1,21 @@
import { Suspense } from "react"
import ResetPasswordForm from "@/components/auth/reset-password-form"
import { redirect } from "next/navigation"
interface PageProps {
searchParams: Promise<{ email?: string }>
}
export default async function ResetPasswordPage({ searchParams }: PageProps) {
const { email } = await searchParams
if (!email) {
redirect("/forgot-password")
}
return (
<Suspense>
<ResetPasswordForm email={email} />
</Suspense>
)
}
+10
View File
@@ -0,0 +1,10 @@
import { Suspense } from "react"
import SignupWizard from "@/components/auth/signup-wizard"
export default function SignupPage() {
return (
<Suspense>
<SignupWizard />
</Suspense>
)
}