create-deesse-app 0.5.0 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/README.md +1 -2
  2. package/dist/src/copy.d.ts +1 -1
  3. package/dist/src/copy.d.ts.map +1 -1
  4. package/dist/src/copy.js +3 -1
  5. package/dist/src/copy.js.map +1 -1
  6. package/dist/src/index.js +0 -1
  7. package/dist/src/index.js.map +1 -1
  8. package/dist/tsconfig.tsbuildinfo +1 -1
  9. package/package.json +1 -1
  10. package/templates/default/src/app/(deesse)/admin/[[...slug]]/page.tsx +0 -2
  11. package/templates/without-admin/AGENTS.md +5 -5
  12. package/templates/without-admin/CLAUDE.md +1 -1
  13. package/templates/without-admin/README.md +36 -28
  14. package/templates/without-admin/components.json +25 -25
  15. package/templates/without-admin/drizzle.config.ts +1 -1
  16. package/templates/without-admin/eslint.config.mjs +18 -18
  17. package/templates/without-admin/next.config.ts +7 -0
  18. package/templates/without-admin/package-lock.json +11412 -0
  19. package/templates/without-admin/package.json +41 -50
  20. package/templates/without-admin/postcss.config.mjs +7 -7
  21. package/templates/without-admin/public/file.svg +1 -1
  22. package/templates/without-admin/public/globe.svg +1 -1
  23. package/templates/without-admin/public/nesalia.svg +2 -2
  24. package/templates/without-admin/public/next.svg +1 -0
  25. package/templates/without-admin/public/vercel.svg +1 -0
  26. package/templates/without-admin/public/window.svg +1 -1
  27. package/templates/without-admin/src/app/(deesse)/api/[...slug]/route.ts +5 -0
  28. package/templates/without-admin/src/app/(frontend)/(auth)/login/page.tsx +85 -0
  29. package/templates/without-admin/src/app/(frontend)/(auth)/signup/page.tsx +90 -0
  30. package/templates/without-admin/src/app/(frontend)/home/page.tsx +19 -0
  31. package/templates/without-admin/src/app/(frontend)/layout.tsx +14 -0
  32. package/templates/without-admin/src/app/{page.tsx → (frontend)/page.tsx} +1 -1
  33. package/templates/without-admin/src/app/globals.css +129 -129
  34. package/templates/without-admin/src/app/icon.svg +100 -100
  35. package/templates/without-admin/src/app/layout.tsx +37 -33
  36. package/templates/without-admin/src/components/header.tsx +123 -0
  37. package/templates/without-admin/src/components/password-input.tsx +50 -0
  38. package/templates/without-admin/src/components/providers/index.tsx +3 -1
  39. package/templates/without-admin/src/components/providers/theme-provider.tsx +1 -1
  40. package/templates/without-admin/src/components/ui/alert-dialog.tsx +199 -0
  41. package/templates/without-admin/src/components/ui/avatar.tsx +112 -0
  42. package/templates/without-admin/src/components/ui/button.tsx +67 -0
  43. package/templates/without-admin/src/components/ui/dialog.tsx +168 -0
  44. package/templates/without-admin/src/components/ui/dropdown-menu.tsx +269 -0
  45. package/templates/without-admin/src/components/ui/input.tsx +19 -0
  46. package/templates/without-admin/src/components/ui/label.tsx +24 -0
  47. package/templates/without-admin/src/components/ui/sonner.tsx +49 -0
  48. package/templates/without-admin/src/components/ui/tooltip.tsx +57 -0
  49. package/templates/without-admin/src/db/schema/auth-schema.ts +1 -1
  50. package/templates/without-admin/src/db/schema/index.ts +1 -0
  51. package/templates/without-admin/src/deesse.config.ts +1 -3
  52. package/templates/without-admin/src/lib/deesse.ts +1 -1
  53. package/templates/without-admin/src/lib/utils.ts +6 -6
  54. package/templates/without-admin/tsconfig.json +34 -35
  55. package/templates/minimal/.gitkeep +0 -0
  56. package/templates/without-admin/drizzle/0000_cheerful_clea.sql +0 -58
  57. package/templates/without-admin/drizzle/meta/0000_snapshot.json +0 -405
  58. package/templates/without-admin/drizzle/meta/_journal.json +0 -13
  59. package/templates/without-admin/skills-lock.json +0 -10
  60. package/templates/without-admin/src/deesse.pages.tsx +0 -1
  61. package/templates/without-admin/src/hooks/use-mobile.ts +0 -5
  62. package/templates/without-admin/src/lib/auth.ts +0 -3
@@ -1,50 +1,41 @@
1
- {
2
- "name": "without-admin",
3
- "version": "0.1.0",
4
- "private": true,
5
- "scripts": {
6
- "dev": "next dev",
7
- "build": "next build",
8
- "start": "next start",
9
- "lint": "eslint"
10
- },
11
- "dependencies": {
12
- "@base-ui/react": "^1.3.0",
13
- "better-auth": "^1.0.0",
14
- "class-variance-authority": "^0.7.1",
15
- "clsx": "^2.1.1",
16
- "cmdk": "^1.1.1",
17
- "date-fns": "^4.1.0",
18
- "deesse": "workspace:*",
19
- "drizzle-orm": "^0.38.0",
20
- "embla-carousel-react": "^8.6.0",
21
- "input-otp": "^1.4.2",
22
- "lucide-react": "^1.6.0",
23
- "next": "16.2.1",
24
- "next-themes": "^0.4.6",
25
- "pg": "^8.13.0",
26
- "radix-ui": "^1.4.3",
27
- "react": "19.2.4",
28
- "react-day-picker": "^9.14.0",
29
- "react-dom": "19.2.4",
30
- "react-resizable-panels": "^4.7.6",
31
- "recharts": "3.8.0",
32
- "shadcn": "^4.1.0",
33
- "sonner": "^2.0.7",
34
- "tailwind-merge": "^3.5.0",
35
- "tw-animate-css": "^1.4.0",
36
- "vaul": "^1.1.2"
37
- },
38
- "devDependencies": {
39
- "@tailwindcss/postcss": "^4",
40
- "@types/node": "^20",
41
- "@types/pg": "^8.11.0",
42
- "@types/react": "^19",
43
- "@types/react-dom": "^19",
44
- "drizzle-kit": "^0.30.0",
45
- "eslint": "^9",
46
- "eslint-config-next": "16.2.1",
47
- "tailwindcss": "^4",
48
- "typescript": "^5"
49
- }
50
- }
1
+ {
2
+ "name": "without-admin",
3
+ "version": "0.1.0",
4
+ "private": true,
5
+ "scripts": {
6
+ "dev": "next dev --webpack",
7
+ "build": "next build",
8
+ "start": "next start",
9
+ "lint": "eslint"
10
+ },
11
+ "dependencies": {
12
+ "@deessejs/next": "workspace:*",
13
+ "better-auth": "^1.0.0",
14
+ "class-variance-authority": "^0.7.1",
15
+ "clsx": "^2.1.1",
16
+ "deesse": "workspace:*",
17
+ "drizzle-orm": "^0.38.0",
18
+ "lucide-react": "^1.8.0",
19
+ "next": "16.2.4",
20
+ "next-themes": "^0.4.6",
21
+ "pg": "^8.13.0",
22
+ "radix-ui": "^1.4.3",
23
+ "react": "19.2.4",
24
+ "react-dom": "19.2.4",
25
+ "shadcn": "^4.2.0",
26
+ "tailwind-merge": "^3.5.0",
27
+ "tw-animate-css": "^1.4.0"
28
+ },
29
+ "devDependencies": {
30
+ "@tailwindcss/postcss": "^4",
31
+ "@types/node": "^20",
32
+ "@types/pg": "^8.11.0",
33
+ "@types/react": "^19",
34
+ "@types/react-dom": "^19",
35
+ "drizzle-kit": "^0.30.0",
36
+ "eslint": "^9",
37
+ "eslint-config-next": "16.2.4",
38
+ "tailwindcss": "^4",
39
+ "typescript": "^5"
40
+ }
41
+ }
@@ -1,7 +1,7 @@
1
- const config = {
2
- plugins: {
3
- "@tailwindcss/postcss": {},
4
- },
5
- };
6
-
7
- export default config;
1
+ const config = {
2
+ plugins: {
3
+ "@tailwindcss/postcss": {},
4
+ },
5
+ };
6
+
7
+ export default config;
@@ -1 +1 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M14.5 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7.5L14.5 2z"/><polyline points="14 2 14 8 20 8"/><line x1="16" x2="8" y1="13" y2="13"/><line x1="16" x2="8" y1="17" y2="17"/><line x1="10" x2="8" y1="9" y2="9"/></svg>
1
+ <svg fill="none" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><path d="M14.5 13.5V5.41a1 1 0 0 0-.3-.7L9.8.29A1 1 0 0 0 9.08 0H1.5v13.5A2.5 2.5 0 0 0 4 16h8a2.5 2.5 0 0 0 2.5-2.5m-1.5 0v-7H8v-5H3v12a1 1 0 0 0 1 1h8a1 1 0 0 0 1-1M9.5 5V2.12L12.38 5zM5.13 5h-.62v1.25h2.12V5zm-.62 3h7.12v1.25H4.5zm.62 3h-.62v1.25h7.12V11z" clip-rule="evenodd" fill="#666" fill-rule="evenodd"/></svg>
@@ -1 +1 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M2 12s3-7 10-7 10 7 10 7-3 7-10 7-10-7-10-7Z"/><circle cx="12" cy="12" r="3"/></svg>
1
+ <svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><g clip-path="url(#a)"><path fill-rule="evenodd" clip-rule="evenodd" d="M10.27 14.1a6.5 6.5 0 0 0 3.67-3.45q-1.24.21-2.7.34-.31 1.83-.97 3.1M8 16A8 8 0 1 0 8 0a8 8 0 0 0 0 16m.48-1.52a7 7 0 0 1-.96 0H7.5a4 4 0 0 1-.84-1.32q-.38-.89-.63-2.08a40 40 0 0 0 3.92 0q-.25 1.2-.63 2.08a4 4 0 0 1-.84 1.31zm2.94-4.76q1.66-.15 2.95-.43a7 7 0 0 0 0-2.58q-1.3-.27-2.95-.43a18 18 0 0 1 0 3.44m-1.27-3.54a17 17 0 0 1 0 3.64 39 39 0 0 1-4.3 0 17 17 0 0 1 0-3.64 39 39 0 0 1 4.3 0m1.1-1.17q1.45.13 2.69.34a6.5 6.5 0 0 0-3.67-3.44q.65 1.26.98 3.1M8.48 1.5l.01.02q.41.37.84 1.31.38.89.63 2.08a40 40 0 0 0-3.92 0q.25-1.2.63-2.08a4 4 0 0 1 .85-1.32 7 7 0 0 1 .96 0m-2.75.4a6.5 6.5 0 0 0-3.67 3.44 29 29 0 0 1 2.7-.34q.31-1.83.97-3.1M4.58 6.28q-1.66.16-2.95.43a7 7 0 0 0 0 2.58q1.3.27 2.95.43a18 18 0 0 1 0-3.44m.17 4.71q-1.45-.12-2.69-.34a6.5 6.5 0 0 0 3.67 3.44q-.65-1.27-.98-3.1" fill="#666"/></g><defs><clipPath id="a"><path fill="#fff" d="M0 0h16v16H0z"/></clipPath></defs></svg>
@@ -2,7 +2,7 @@
2
2
  width="100%" viewBox="0 0 400 400" enable-background="new 0 0 400 400" xml:space="preserve">
3
3
  <path fill="#FBFBFB" opacity="1.000000" stroke="none"
4
4
  d="
5
- M244.048981,112.993195
5
+ M244.048981,112.993195
6
6
  C243.954102,124.816582 243.610443,136.644394 243.820374,148.462372
7
7
  C244.168961,168.084747 239.035538,185.948502 226.956192,201.459137
8
8
  C218.953018,211.735733 210.224243,221.444229 201.956680,231.518982
@@ -47,4 +47,4 @@ M244.048981,112.993195
47
47
  C275.606995,111.449310 260.777893,111.457680 245.138916,111.531952
48
48
  C244.235550,112.090118 244.142258,112.541656 244.048981,112.993195
49
49
  z"/>
50
- </svg>
50
+ </svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 394 80"><path fill="#000" d="M262 0h68.5v12.7h-27.2v66.6h-13.6V12.7H262V0ZM149 0v12.7H94v20.4h44.3v12.6H94v21h55v12.6H80.5V0h68.7zm34.3 0h-17.8l63.8 79.4h17.9l-32-39.7 32-39.6h-17.9l-23 28.6-23-28.6zm18.3 56.7-9-11-27.1 33.7h17.8l18.3-22.7z"/><path fill="#000" d="M81 79.3 17 0H0v79.3h13.6V17l50.2 62.3H81Zm252.6-.4c-1 0-1.8-.4-2.5-1s-1.1-1.6-1.1-2.6.3-1.8 1-2.5 1.6-1 2.6-1 1.8.3 2.5 1a3.4 3.4 0 0 1 .6 4.3 3.7 3.7 0 0 1-3 1.8zm23.2-33.5h6v23.3c0 2.1-.4 4-1.3 5.5a9.1 9.1 0 0 1-3.8 3.5c-1.6.8-3.5 1.3-5.7 1.3-2 0-3.7-.4-5.3-1s-2.8-1.8-3.7-3.2c-.9-1.3-1.4-3-1.4-5h6c.1.8.3 1.6.7 2.2s1 1.2 1.6 1.5c.7.4 1.5.5 2.4.5 1 0 1.8-.2 2.4-.6a4 4 0 0 0 1.6-1.8c.3-.8.5-1.8.5-3V45.5zm30.9 9.1a4.4 4.4 0 0 0-2-3.3 7.5 7.5 0 0 0-4.3-1.1c-1.3 0-2.4.2-3.3.5-.9.4-1.6 1-2 1.6a3.5 3.5 0 0 0-.3 4c.3.5.7.9 1.3 1.2l1.8 1 2 .5 3.2.8c1.3.3 2.5.7 3.7 1.2a13 13 0 0 1 3.2 1.8 8.1 8.1 0 0 1 3 6.5c0 2-.5 3.7-1.5 5.1a10 10 0 0 1-4.4 3.5c-1.8.8-4.1 1.2-6.8 1.2-2.6 0-4.9-.4-6.8-1.2-2-.8-3.4-2-4.5-3.5a10 10 0 0 1-1.7-5.6h6a5 5 0 0 0 3.5 4.6c1 .4 2.2.6 3.4.6 1.3 0 2.5-.2 3.5-.6 1-.4 1.8-1 2.4-1.7a4 4 0 0 0 .8-2.4c0-.9-.2-1.6-.7-2.2a11 11 0 0 0-2.1-1.4l-3.2-1-3.8-1c-2.8-.7-5-1.7-6.6-3.2a7.2 7.2 0 0 1-2.4-5.7 8 8 0 0 1 1.7-5 10 10 0 0 1 4.3-3.5c2-.8 4-1.2 6.4-1.2 2.3 0 4.4.4 6.2 1.2 1.8.8 3.2 2 4.3 3.4 1 1.4 1.5 3 1.5 5h-5.8z"/></svg>
@@ -0,0 +1 @@
1
+ <svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1155 1000"><path d="m577.3 0 577.4 1000H0z" fill="#fff"/></svg>
@@ -1 +1 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect width="18" height="18" x="3" y="3" rx="2"/><path d="M3 9h18"/><path d="M9 21V9"/></svg>
1
+ <svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16"><path fill-rule="evenodd" clip-rule="evenodd" d="M1.5 2.5h13v10a1 1 0 0 1-1 1h-11a1 1 0 0 1-1-1zM0 1h16v11.5a2.5 2.5 0 0 1-2.5 2.5h-11A2.5 2.5 0 0 1 0 12.5zm3.75 4.5a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5M7 4.75a.75.75 0 1 1-1.5 0 .75.75 0 0 1 1.5 0m1.75.75a.75.75 0 1 0 0-1.5.75.75 0 0 0 0 1.5" fill="#666"/></svg>
@@ -0,0 +1,5 @@
1
+ import { deesseAuth } from "@/lib/deesse";
2
+ import { REST_GET, REST_POST } from "@deessejs/next/routes";
3
+
4
+ export const GET = REST_GET({ auth: deesseAuth });
5
+ export const POST = REST_POST({ auth: deesseAuth });
@@ -0,0 +1,85 @@
1
+ "use client"
2
+
3
+ import { useState } from "react"
4
+ import { useRouter, useSearchParams } from "next/navigation"
5
+ import { Loader2 } from "lucide-react"
6
+ import { toast } from "sonner"
7
+ import { Button } from "@/components/ui/button"
8
+ import { Input } from "@/components/ui/input"
9
+ import { Label } from "@/components/ui/label"
10
+ import { PasswordInput } from "@/components/password-input"
11
+ import { client } from "@/lib/client"
12
+
13
+ export default function LoginPage() {
14
+ const router = useRouter()
15
+ const searchParams = useSearchParams()
16
+ const [error, setError] = useState<string | null>(null)
17
+ const [isPending, setIsPending] = useState(false)
18
+
19
+ async function handleSubmit(e: React.FormEvent<HTMLFormElement>) {
20
+ e.preventDefault()
21
+ setError(null)
22
+ setIsPending(true)
23
+
24
+ const formData = new FormData(e.currentTarget)
25
+ const email = formData.get("email") as string
26
+ const password = formData.get("password") as string
27
+
28
+ const { error } = await client.auth.signIn.email({ email, password })
29
+
30
+ if (error) {
31
+ toast.error(error.message)
32
+ setError(error.message)
33
+ setIsPending(false)
34
+ return
35
+ }
36
+
37
+ toast.success("Signed in successfully")
38
+ const redirectTo = searchParams.get("redirectTo") || "/home"
39
+ router.push(redirectTo)
40
+ }
41
+
42
+ return (
43
+ <div className="flex flex-1 items-center justify-center py-12">
44
+ <div className="mx-auto w-full max-w-sm space-y-6">
45
+ <div className="space-y-2 text-center">
46
+ <h1 className="text-2xl font-semibold tracking-tight">Welcome back</h1>
47
+ <p className="text-sm text-muted-foreground">
48
+ Enter your email to sign in to your account
49
+ </p>
50
+ </div>
51
+ <form className="space-y-4" onSubmit={handleSubmit}>
52
+ {error && (
53
+ <div className="rounded-md bg-destructive/10 p-3 text-sm text-destructive">
54
+ {error}
55
+ </div>
56
+ )}
57
+ <div className="space-y-2">
58
+ <Label htmlFor="email">Email</Label>
59
+ <Input id="email" name="email" type="email" placeholder="m@example.com" required disabled={isPending} />
60
+ </div>
61
+ <div className="space-y-2">
62
+ <Label htmlFor="password">Password</Label>
63
+ <PasswordInput id="password" name="password" required disabled={isPending} />
64
+ </div>
65
+ <Button className="w-full" type="submit" disabled={isPending}>
66
+ {isPending ? (
67
+ <>
68
+ <Loader2 className="mr-2 h-4 w-4 animate-spin" />
69
+ Signing in...
70
+ </>
71
+ ) : (
72
+ "Sign in"
73
+ )}
74
+ </Button>
75
+ </form>
76
+ <p className="text-center text-sm text-muted-foreground">
77
+ Don&apos;t have an account?{" "}
78
+ <a href="/signup" className="underline underline-offset-4 hover:text-foreground">
79
+ Sign up
80
+ </a>
81
+ </p>
82
+ </div>
83
+ </div>
84
+ )
85
+ }
@@ -0,0 +1,90 @@
1
+ "use client"
2
+
3
+ import { useState } from "react"
4
+ import { useRouter, useSearchParams } from "next/navigation"
5
+ import { Loader2 } from "lucide-react"
6
+ import { toast } from "sonner"
7
+ import { Button } from "@/components/ui/button"
8
+ import { Input } from "@/components/ui/input"
9
+ import { Label } from "@/components/ui/label"
10
+ import { PasswordInput } from "@/components/password-input"
11
+ import { client } from "@/lib/client"
12
+
13
+ export default function SignupPage() {
14
+ const router = useRouter()
15
+ const searchParams = useSearchParams()
16
+ const [error, setError] = useState<string | null>(null)
17
+ const [isPending, setIsPending] = useState(false)
18
+
19
+ async function handleSubmit(e: React.FormEvent<HTMLFormElement>) {
20
+ e.preventDefault()
21
+ setError(null)
22
+ setIsPending(true)
23
+
24
+ const formData = new FormData(e.currentTarget)
25
+ const name = formData.get("name") as string
26
+ const email = formData.get("email") as string
27
+ const password = formData.get("password") as string
28
+
29
+ const { error } = await client.auth.signUp.email({ email, password, name })
30
+
31
+ if (error) {
32
+ toast.error(error.message)
33
+ setError(error.message)
34
+ setIsPending(false)
35
+ return
36
+ }
37
+
38
+ toast.success("Account created successfully")
39
+ const redirectTo = searchParams.get("redirectTo") || "/home"
40
+ router.push(redirectTo)
41
+ }
42
+
43
+ return (
44
+ <div className="flex flex-1 items-center justify-center py-12">
45
+ <div className="mx-auto w-full max-w-sm space-y-6">
46
+ <div className="space-y-2 text-center">
47
+ <h1 className="text-2xl font-semibold tracking-tight">Create an account</h1>
48
+ <p className="text-sm text-muted-foreground">
49
+ Enter your email below to create your account
50
+ </p>
51
+ </div>
52
+ <form className="space-y-4" onSubmit={handleSubmit}>
53
+ {error && (
54
+ <div className="rounded-md bg-destructive/10 p-3 text-sm text-destructive">
55
+ {error}
56
+ </div>
57
+ )}
58
+ <div className="space-y-2">
59
+ <Label htmlFor="name">Name</Label>
60
+ <Input id="name" name="name" type="text" placeholder="John Doe" required disabled={isPending} />
61
+ </div>
62
+ <div className="space-y-2">
63
+ <Label htmlFor="email">Email</Label>
64
+ <Input id="email" name="email" type="email" placeholder="m@example.com" required disabled={isPending} />
65
+ </div>
66
+ <div className="space-y-2">
67
+ <Label htmlFor="password">Password</Label>
68
+ <PasswordInput id="password" name="password" required disabled={isPending} />
69
+ </div>
70
+ <Button className="w-full" type="submit" disabled={isPending}>
71
+ {isPending ? (
72
+ <>
73
+ <Loader2 className="mr-2 h-4 w-4 animate-spin" />
74
+ Creating account...
75
+ </>
76
+ ) : (
77
+ "Create account"
78
+ )}
79
+ </Button>
80
+ </form>
81
+ <p className="text-center text-sm text-muted-foreground">
82
+ Already have an account?{" "}
83
+ <a href="/login" className="underline underline-offset-4 hover:text-foreground">
84
+ Sign in
85
+ </a>
86
+ </p>
87
+ </div>
88
+ </div>
89
+ )
90
+ }
@@ -0,0 +1,19 @@
1
+ import { redirect } from "next/navigation";
2
+ import { headers } from "next/headers";
3
+ import { deesseAuth } from "@/lib/deesse";
4
+
5
+ export default async function HomePage() {
6
+ const session = await deesseAuth.api.getSession({
7
+ headers: await headers(),
8
+ });
9
+
10
+ if (!session) {
11
+ redirect("/login?redirectTo=/home");
12
+ }
13
+
14
+ return (
15
+ <div className="flex flex-1 items-center justify-center">
16
+ <h1 className="text-2xl font-semibold">Welcome Home</h1>
17
+ </div>
18
+ );
19
+ }
@@ -0,0 +1,14 @@
1
+ import { Header } from '@/components/header';
2
+
3
+ export default function FrontendLayout({
4
+ children,
5
+ }: {
6
+ children: React.ReactNode;
7
+ }) {
8
+ return (
9
+ <>
10
+ <Header />
11
+ {children}
12
+ </>
13
+ );
14
+ }
@@ -47,4 +47,4 @@ export default function Home() {
47
47
  </main>
48
48
  </div>
49
49
  );
50
- }
50
+ }
@@ -1,130 +1,130 @@
1
- @import "tailwindcss";
2
- @import "tw-animate-css";
3
- @import "shadcn/tailwind.css";
4
-
5
- @custom-variant dark (&:is(.dark *));
6
-
7
- @theme inline {
8
- --color-background: var(--background);
9
- --color-foreground: var(--foreground);
10
- --font-sans: var(--font-sans);
11
- --font-mono: var(--font-geist-mono);
12
- --font-heading: var(--font-sans);
13
- --color-sidebar-ring: var(--sidebar-ring);
14
- --color-sidebar-border: var(--sidebar-border);
15
- --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
16
- --color-sidebar-accent: var(--sidebar-accent);
17
- --color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
18
- --color-sidebar-primary: var(--sidebar-primary);
19
- --color-sidebar-foreground: var(--sidebar-foreground);
20
- --color-sidebar: var(--sidebar);
21
- --color-chart-5: var(--chart-5);
22
- --color-chart-4: var(--chart-4);
23
- --color-chart-3: var(--chart-3);
24
- --color-chart-2: var(--chart-2);
25
- --color-chart-1: var(--chart-1);
26
- --color-ring: var(--ring);
27
- --color-input: var(--input);
28
- --color-border: var(--border);
29
- --color-destructive: var(--destructive);
30
- --color-accent-foreground: var(--accent-foreground);
31
- --color-accent: var(--accent);
32
- --color-muted-foreground: var(--muted-foreground);
33
- --color-muted: var(--muted);
34
- --color-secondary-foreground: var(--secondary-foreground);
35
- --color-secondary: var(--secondary);
36
- --color-primary-foreground: var(--primary-foreground);
37
- --color-primary: var(--primary);
38
- --color-popover-foreground: var(--popover-foreground);
39
- --color-popover: var(--popover);
40
- --color-card-foreground: var(--card-foreground);
41
- --color-card: var(--card);
42
- --radius-sm: calc(var(--radius) * 0.6);
43
- --radius-md: calc(var(--radius) * 0.8);
44
- --radius-lg: var(--radius);
45
- --radius-xl: calc(var(--radius) * 1.4);
46
- --radius-2xl: calc(var(--radius) * 1.8);
47
- --radius-3xl: calc(var(--radius) * 2.2);
48
- --radius-4xl: calc(var(--radius) * 2.6);
49
- }
50
-
51
- :root {
52
- --background: oklch(1 0 0);
53
- --foreground: oklch(0.145 0 0);
54
- --card: oklch(1 0 0);
55
- --card-foreground: oklch(0.145 0 0);
56
- --popover: oklch(1 0 0);
57
- --popover-foreground: oklch(0.145 0 0);
58
- --primary: oklch(0.205 0 0);
59
- --primary-foreground: oklch(0.985 0 0);
60
- --secondary: oklch(0.97 0 0);
61
- --secondary-foreground: oklch(0.205 0 0);
62
- --muted: oklch(0.97 0 0);
63
- --muted-foreground: oklch(0.556 0 0);
64
- --accent: oklch(0.97 0 0);
65
- --accent-foreground: oklch(0.205 0 0);
66
- --destructive: oklch(0.577 0.245 27.325);
67
- --border: oklch(0.922 0 0);
68
- --input: oklch(0.922 0 0);
69
- --ring: oklch(0.708 0 0);
70
- --chart-1: oklch(0.87 0 0);
71
- --chart-2: oklch(0.556 0 0);
72
- --chart-3: oklch(0.439 0 0);
73
- --chart-4: oklch(0.371 0 0);
74
- --chart-5: oklch(0.269 0 0);
75
- --radius: 0.625rem;
76
- --sidebar: oklch(0.985 0 0);
77
- --sidebar-foreground: oklch(0.145 0 0);
78
- --sidebar-primary: oklch(0.205 0 0);
79
- --sidebar-primary-foreground: oklch(0.985 0 0);
80
- --sidebar-accent: oklch(0.97 0 0);
81
- --sidebar-accent-foreground: oklch(0.205 0 0);
82
- --sidebar-border: oklch(0.922 0 0);
83
- --sidebar-ring: oklch(0.708 0 0);
84
- }
85
-
86
- .dark {
87
- --background: oklch(0.145 0 0);
88
- --foreground: oklch(0.985 0 0);
89
- --card: oklch(0.205 0 0);
90
- --card-foreground: oklch(0.985 0 0);
91
- --popover: oklch(0.205 0 0);
92
- --popover-foreground: oklch(0.985 0 0);
93
- --primary: oklch(0.922 0 0);
94
- --primary-foreground: oklch(0.205 0 0);
95
- --secondary: oklch(0.269 0 0);
96
- --secondary-foreground: oklch(0.985 0 0);
97
- --muted: oklch(0.269 0 0);
98
- --muted-foreground: oklch(0.708 0 0);
99
- --accent: oklch(0.269 0 0);
100
- --accent-foreground: oklch(0.985 0 0);
101
- --destructive: oklch(0.704 0.191 22.216);
102
- --border: oklch(1 0 0 / 10%);
103
- --input: oklch(1 0 0 / 15%);
104
- --ring: oklch(0.556 0 0);
105
- --chart-1: oklch(0.87 0 0);
106
- --chart-2: oklch(0.556 0 0);
107
- --chart-3: oklch(0.439 0 0);
108
- --chart-4: oklch(0.371 0 0);
109
- --chart-5: oklch(0.269 0 0);
110
- --sidebar: oklch(0.205 0 0);
111
- --sidebar-foreground: oklch(0.985 0 0);
112
- --sidebar-primary: oklch(0.488 0.243 264.376);
113
- --sidebar-primary-foreground: oklch(0.985 0 0);
114
- --sidebar-accent: oklch(0.269 0 0);
115
- --sidebar-accent-foreground: oklch(0.985 0 0);
116
- --sidebar-border: oklch(1 0 0 / 10%);
117
- --sidebar-ring: oklch(0.556 0 0);
118
- }
119
-
120
- @layer base {
121
- * {
122
- @apply border-border outline-ring/50;
123
- }
124
- body {
125
- @apply bg-background text-foreground;
126
- }
127
- html {
128
- @apply font-sans;
129
- }
1
+ @import "tailwindcss";
2
+ @import "tw-animate-css";
3
+ @import "shadcn/tailwind.css";
4
+
5
+ @custom-variant dark (&:is(.dark *));
6
+
7
+ @theme inline {
8
+ --color-background: var(--background);
9
+ --color-foreground: var(--foreground);
10
+ --font-sans: var(--font-sans);
11
+ --font-mono: var(--font-geist-mono);
12
+ --font-heading: var(--font-sans);
13
+ --color-sidebar-ring: var(--sidebar-ring);
14
+ --color-sidebar-border: var(--sidebar-border);
15
+ --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
16
+ --color-sidebar-accent: var(--sidebar-accent);
17
+ --color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
18
+ --color-sidebar-primary: var(--sidebar-primary);
19
+ --color-sidebar-foreground: var(--sidebar-foreground);
20
+ --color-sidebar: var(--sidebar);
21
+ --color-chart-5: var(--chart-5);
22
+ --color-chart-4: var(--chart-4);
23
+ --color-chart-3: var(--chart-3);
24
+ --color-chart-2: var(--chart-2);
25
+ --color-chart-1: var(--chart-1);
26
+ --color-ring: var(--ring);
27
+ --color-input: var(--input);
28
+ --color-border: var(--border);
29
+ --color-destructive: var(--destructive);
30
+ --color-accent-foreground: var(--accent-foreground);
31
+ --color-accent: var(--accent);
32
+ --color-muted-foreground: var(--muted-foreground);
33
+ --color-muted: var(--muted);
34
+ --color-secondary-foreground: var(--secondary-foreground);
35
+ --color-secondary: var(--secondary);
36
+ --color-primary-foreground: var(--primary-foreground);
37
+ --color-primary: var(--primary);
38
+ --color-popover-foreground: var(--popover-foreground);
39
+ --color-popover: var(--popover);
40
+ --color-card-foreground: var(--card-foreground);
41
+ --color-card: var(--card);
42
+ --radius-sm: calc(var(--radius) * 0.6);
43
+ --radius-md: calc(var(--radius) * 0.8);
44
+ --radius-lg: var(--radius);
45
+ --radius-xl: calc(var(--radius) * 1.4);
46
+ --radius-2xl: calc(var(--radius) * 1.8);
47
+ --radius-3xl: calc(var(--radius) * 2.2);
48
+ --radius-4xl: calc(var(--radius) * 2.6);
49
+ }
50
+
51
+ :root {
52
+ --background: oklch(1 0 0);
53
+ --foreground: oklch(0.145 0 0);
54
+ --card: oklch(1 0 0);
55
+ --card-foreground: oklch(0.145 0 0);
56
+ --popover: oklch(1 0 0);
57
+ --popover-foreground: oklch(0.145 0 0);
58
+ --primary: oklch(0.205 0 0);
59
+ --primary-foreground: oklch(0.985 0 0);
60
+ --secondary: oklch(0.97 0 0);
61
+ --secondary-foreground: oklch(0.205 0 0);
62
+ --muted: oklch(0.97 0 0);
63
+ --muted-foreground: oklch(0.556 0 0);
64
+ --accent: oklch(0.97 0 0);
65
+ --accent-foreground: oklch(0.205 0 0);
66
+ --destructive: oklch(0.577 0.245 27.325);
67
+ --border: oklch(0.922 0 0);
68
+ --input: oklch(0.922 0 0);
69
+ --ring: oklch(0.708 0 0);
70
+ --chart-1: oklch(0.87 0 0);
71
+ --chart-2: oklch(0.556 0 0);
72
+ --chart-3: oklch(0.439 0 0);
73
+ --chart-4: oklch(0.371 0 0);
74
+ --chart-5: oklch(0.269 0 0);
75
+ --radius: 0.625rem;
76
+ --sidebar: oklch(0.985 0 0);
77
+ --sidebar-foreground: oklch(0.145 0 0);
78
+ --sidebar-primary: oklch(0.205 0 0);
79
+ --sidebar-primary-foreground: oklch(0.985 0 0);
80
+ --sidebar-accent: oklch(0.97 0 0);
81
+ --sidebar-accent-foreground: oklch(0.205 0 0);
82
+ --sidebar-border: oklch(0.922 0 0);
83
+ --sidebar-ring: oklch(0.708 0 0);
84
+ }
85
+
86
+ .dark {
87
+ --background: oklch(0.145 0 0);
88
+ --foreground: oklch(0.985 0 0);
89
+ --card: oklch(0.205 0 0);
90
+ --card-foreground: oklch(0.985 0 0);
91
+ --popover: oklch(0.205 0 0);
92
+ --popover-foreground: oklch(0.985 0 0);
93
+ --primary: oklch(0.922 0 0);
94
+ --primary-foreground: oklch(0.205 0 0);
95
+ --secondary: oklch(0.269 0 0);
96
+ --secondary-foreground: oklch(0.985 0 0);
97
+ --muted: oklch(0.269 0 0);
98
+ --muted-foreground: oklch(0.708 0 0);
99
+ --accent: oklch(0.269 0 0);
100
+ --accent-foreground: oklch(0.985 0 0);
101
+ --destructive: oklch(0.704 0.191 22.216);
102
+ --border: oklch(1 0 0 / 10%);
103
+ --input: oklch(1 0 0 / 15%);
104
+ --ring: oklch(0.556 0 0);
105
+ --chart-1: oklch(0.87 0 0);
106
+ --chart-2: oklch(0.556 0 0);
107
+ --chart-3: oklch(0.439 0 0);
108
+ --chart-4: oklch(0.371 0 0);
109
+ --chart-5: oklch(0.269 0 0);
110
+ --sidebar: oklch(0.205 0 0);
111
+ --sidebar-foreground: oklch(0.985 0 0);
112
+ --sidebar-primary: oklch(0.488 0.243 264.376);
113
+ --sidebar-primary-foreground: oklch(0.985 0 0);
114
+ --sidebar-accent: oklch(0.269 0 0);
115
+ --sidebar-accent-foreground: oklch(0.985 0 0);
116
+ --sidebar-border: oklch(1 0 0 / 10%);
117
+ --sidebar-ring: oklch(0.556 0 0);
118
+ }
119
+
120
+ @layer base {
121
+ * {
122
+ @apply border-border outline-ring/50;
123
+ }
124
+ body {
125
+ @apply bg-background text-foreground;
126
+ }
127
+ html {
128
+ @apply font-sans;
129
+ }
130
130
  }