wexts 3.0.2 → 4.0.0

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 (276) hide show
  1. package/README.md +49 -346
  2. package/bin/wexts.cjs +2 -0
  3. package/dist/chunk-2KAQYLVN.js +0 -0
  4. package/dist/chunk-2KAQYLVN.js.map +1 -1
  5. package/dist/{chunk-O42L6HOX.js → chunk-2LJVUMXW.js} +79 -93
  6. package/dist/chunk-2LJVUMXW.js.map +1 -0
  7. package/dist/chunk-7QKLIVRF.js +94 -0
  8. package/dist/chunk-7QKLIVRF.js.map +1 -0
  9. package/dist/{chunk-FCEZDH42.mjs → chunk-7WULUGLH.mjs} +5 -3
  10. package/dist/chunk-7WULUGLH.mjs.map +1 -0
  11. package/dist/{chunk-WF65EDRZ.js → chunk-BG56B4DE.js} +20 -2
  12. package/dist/chunk-BG56B4DE.js.map +1 -0
  13. package/dist/chunk-CLM5PNSG.mjs +496 -0
  14. package/dist/chunk-CLM5PNSG.mjs.map +1 -0
  15. package/dist/chunk-DNLGCKTT.js +31 -0
  16. package/dist/chunk-DNLGCKTT.js.map +1 -0
  17. package/dist/{chunk-VNNVLQLJ.mjs → chunk-JHOVXH3X.mjs} +2 -2
  18. package/dist/chunk-JHOVXH3X.mjs.map +1 -0
  19. package/dist/chunk-MXINIFPC.js +105 -0
  20. package/dist/chunk-MXINIFPC.js.map +1 -0
  21. package/dist/chunk-SE32ZPOZ.js +496 -0
  22. package/dist/chunk-SE32ZPOZ.js.map +1 -0
  23. package/dist/{chunk-STTOPUZ2.mjs → chunk-UAL54DVV.mjs} +21 -3
  24. package/dist/chunk-UAL54DVV.mjs.map +1 -0
  25. package/dist/{chunk-3OM7CHCA.js → chunk-WCKSKU3C.js} +1 -1
  26. package/dist/chunk-WCKSKU3C.js.map +1 -0
  27. package/dist/chunk-WU6FW77M.mjs +105 -0
  28. package/dist/chunk-WU6FW77M.mjs.map +1 -0
  29. package/dist/chunk-XE4OXN2W.js +0 -0
  30. package/dist/chunk-XE4OXN2W.js.map +1 -1
  31. package/dist/chunk-YBM3IJEA.mjs +94 -0
  32. package/dist/chunk-YBM3IJEA.mjs.map +1 -0
  33. package/dist/{chunk-KXYLEUSW.mjs → chunk-YN6WIWNQ.mjs} +69 -83
  34. package/dist/chunk-YN6WIWNQ.mjs.map +1 -0
  35. package/dist/chunk-YSLEF5C5.mjs +0 -0
  36. package/dist/chunk-YSLEF5C5.mjs.map +0 -0
  37. package/dist/chunk-ZX7QIN24.mjs +31 -0
  38. package/dist/chunk-ZX7QIN24.mjs.map +1 -0
  39. package/dist/cli/index.d.mts +10 -0
  40. package/dist/cli/index.d.ts +10 -0
  41. package/dist/cli/index.js +292 -292
  42. package/dist/cli/index.js.map +1 -1
  43. package/dist/cli/index.mjs +294 -293
  44. package/dist/cli/index.mjs.map +1 -1
  45. package/dist/client/index.d.mts +10 -1
  46. package/dist/client/index.d.ts +10 -1
  47. package/dist/client/index.js +4 -2
  48. package/dist/client/index.js.map +1 -1
  49. package/dist/client/index.mjs +6 -4
  50. package/dist/client/index.mjs.map +0 -0
  51. package/dist/codegen/index.d.mts +2 -1
  52. package/dist/codegen/index.d.ts +2 -1
  53. package/dist/codegen/index.js +5 -3
  54. package/dist/codegen/index.js.map +1 -1
  55. package/dist/codegen/index.mjs +7 -5
  56. package/dist/codegen/index.mjs.map +0 -0
  57. package/dist/decorators-BT1FFqN0.d.mts +29 -0
  58. package/dist/decorators-DvS58PqC.d.ts +29 -0
  59. package/dist/dev-server/index.d.mts +1 -1
  60. package/dist/dev-server/index.d.ts +1 -1
  61. package/dist/dev-server/index.js +3 -3
  62. package/dist/dev-server/index.js.map +1 -1
  63. package/dist/dev-server/index.mjs +3 -3
  64. package/dist/dev-server/index.mjs.map +0 -0
  65. package/dist/{index-SjUaHgFr.d.ts → index-7QeQEf37.d.ts} +27 -10
  66. package/dist/{index-tFGPFVfQ.d.mts → index-7RvU-jGE.d.mts} +0 -1
  67. package/dist/{index-tFGPFVfQ.d.ts → index-7RvU-jGE.d.ts} +0 -1
  68. package/dist/{index-SjUaHgFr.d.mts → index-8nzxy0NN.d.mts} +27 -10
  69. package/dist/index-Co5ZsLqq.d.ts +58 -0
  70. package/dist/index-D94W1__r.d.mts +58 -0
  71. package/dist/index-DQmyVp6F.d.mts +27 -0
  72. package/dist/index-KL_1BrQb.d.ts +27 -0
  73. package/dist/index.d.mts +17 -6
  74. package/dist/index.d.ts +17 -6
  75. package/dist/index.js +57 -30
  76. package/dist/index.js.map +1 -1
  77. package/dist/index.mjs +48 -21
  78. package/dist/index.mjs.map +1 -1
  79. package/dist/nest/index.d.mts +3 -1
  80. package/dist/nest/index.d.ts +3 -1
  81. package/dist/nest/index.js +20 -2
  82. package/dist/nest/index.js.map +1 -1
  83. package/dist/nest/index.mjs +21 -3
  84. package/dist/nest/index.mjs.map +0 -0
  85. package/dist/next/index.d.mts +7 -2
  86. package/dist/next/index.d.ts +7 -2
  87. package/dist/next/index.js +72 -5
  88. package/dist/next/index.js.map +1 -1
  89. package/dist/next/index.mjs +70 -4
  90. package/dist/next/index.mjs.map +1 -1
  91. package/dist/rpc/index.d.mts +2 -0
  92. package/dist/rpc/index.d.ts +2 -0
  93. package/dist/rpc/index.js +23 -0
  94. package/dist/rpc/index.js.map +1 -0
  95. package/dist/rpc/index.mjs +23 -0
  96. package/dist/{chunk-7NSRDJ5C.mjs.map → rpc/index.mjs.map} +0 -0
  97. package/dist/runtime/index.d.mts +55 -0
  98. package/dist/runtime/index.d.ts +55 -0
  99. package/dist/runtime/index.js +213 -0
  100. package/dist/runtime/index.js.map +1 -0
  101. package/dist/runtime/index.mjs +213 -0
  102. package/dist/runtime/index.mjs.map +1 -0
  103. package/dist/types/index.d.mts +0 -0
  104. package/dist/types/index.d.ts +0 -0
  105. package/dist/types/index.js +0 -0
  106. package/dist/types/index.js.map +1 -1
  107. package/dist/types/index.mjs +1 -1
  108. package/dist/types/index.mjs.map +0 -0
  109. package/dist/types-7d_fC-C3.d.mts +32 -0
  110. package/dist/types-7d_fC-C3.d.ts +32 -0
  111. package/dist/vercel-builder/index.d.mts +58 -0
  112. package/dist/vercel-builder/index.d.ts +58 -0
  113. package/dist/vercel-builder/index.js +330 -0
  114. package/dist/vercel-builder/index.js.map +1 -0
  115. package/dist/vercel-builder/index.mjs +330 -0
  116. package/dist/vercel-builder/index.mjs.map +1 -0
  117. package/package.json +37 -16
  118. package/templates/.dockerignore +43 -43
  119. package/templates/.env.example +0 -0
  120. package/templates/Dockerfile +60 -60
  121. package/templates/Procfile +1 -1
  122. package/templates/README.md +67 -58
  123. package/templates/api-sdk.ts +115 -115
  124. package/templates/docker-compose.yml +34 -34
  125. package/templates/nestjs-api/.env.example +0 -0
  126. package/templates/nestjs-api/README.md +87 -79
  127. package/templates/nestjs-api/nest-cli.json +6 -6
  128. package/templates/nestjs-api/package-lock.json +5623 -5623
  129. package/templates/nestjs-api/package.json +40 -40
  130. package/templates/nestjs-api/prisma/dev.db +0 -0
  131. package/templates/nestjs-api/prisma/migrations/20251123205437_init/migration.sql +0 -0
  132. package/templates/nestjs-api/prisma/migrations/migration_lock.toml +0 -0
  133. package/templates/nestjs-api/prisma/schema.prisma +29 -29
  134. package/templates/nestjs-api/src/app.module.ts +17 -17
  135. package/templates/nestjs-api/src/auth/auth.controller.ts +27 -27
  136. package/templates/nestjs-api/src/auth/auth.module.ts +37 -29
  137. package/templates/nestjs-api/src/auth/auth.service.ts +86 -86
  138. package/templates/nestjs-api/src/auth/dto/auth.dto.ts +22 -22
  139. package/templates/nestjs-api/src/auth/guards/jwt-auth.guard.ts +5 -5
  140. package/templates/nestjs-api/src/auth/strategies/jwt.strategy.ts +27 -19
  141. package/templates/nestjs-api/src/main.ts +32 -32
  142. package/templates/nestjs-api/src/prisma/prisma.module.ts +9 -9
  143. package/templates/nestjs-api/src/prisma/prisma.service.ts +14 -14
  144. package/templates/nestjs-api/src/todos/dto/todo.dto.ts +24 -24
  145. package/templates/nestjs-api/src/todos/todos.controller.ts +39 -39
  146. package/templates/nestjs-api/src/todos/todos.module.ts +11 -11
  147. package/templates/nestjs-api/src/todos/todos.service.ts +53 -53
  148. package/templates/nestjs-api/src/users/users.controller.ts +14 -14
  149. package/templates/nestjs-api/src/users/users.module.ts +12 -12
  150. package/templates/nestjs-api/src/users/users.service.ts +19 -19
  151. package/templates/nestjs-api/tsconfig.json +39 -39
  152. package/templates/nextjs-web/README.md +76 -68
  153. package/templates/nextjs-web/app/actions/auth.ts +108 -108
  154. package/templates/nextjs-web/app/dashboard/error.tsx +39 -39
  155. package/templates/nextjs-web/app/dashboard/loading.tsx +14 -14
  156. package/templates/nextjs-web/app/dashboard/page.tsx +5 -5
  157. package/templates/nextjs-web/app/globals.css +93 -93
  158. package/templates/nextjs-web/app/layout.tsx +29 -29
  159. package/templates/nextjs-web/app/login/page.tsx +5 -5
  160. package/templates/nextjs-web/app/page.tsx +28 -28
  161. package/templates/nextjs-web/app/register/page.tsx +5 -5
  162. package/templates/nextjs-web/components/ui/button.tsx +56 -56
  163. package/templates/nextjs-web/components/ui/card.tsx +79 -79
  164. package/templates/nextjs-web/components/ui/input.tsx +25 -25
  165. package/templates/nextjs-web/components/ui/label.tsx +24 -24
  166. package/templates/nextjs-web/features/auth/LoginForm.tsx +140 -140
  167. package/templates/nextjs-web/features/auth/RegisterForm.tsx +159 -159
  168. package/templates/nextjs-web/features/auth/api.ts +35 -35
  169. package/templates/nextjs-web/features/auth/index.ts +3 -3
  170. package/templates/nextjs-web/features/dashboard/DashboardView.tsx +204 -204
  171. package/templates/nextjs-web/features/dashboard/api.ts +9 -9
  172. package/templates/nextjs-web/features/dashboard/components.tsx +74 -74
  173. package/templates/nextjs-web/features/dashboard/index.ts +3 -3
  174. package/templates/nextjs-web/hooks/index.ts +4 -4
  175. package/templates/nextjs-web/lib/api-client.ts +89 -89
  176. package/templates/nextjs-web/lib/api.ts +115 -115
  177. package/templates/nextjs-web/lib/axios-global-config.ts +17 -17
  178. package/templates/nextjs-web/lib/utils.ts +6 -6
  179. package/templates/nextjs-web/lib/wexts-client.ts +4 -4
  180. package/templates/nextjs-web/next-env.d.ts +6 -6
  181. package/templates/nextjs-web/next.config.ts +20 -20
  182. package/templates/nextjs-web/package-lock.json +3254 -3254
  183. package/templates/nextjs-web/package.json +37 -37
  184. package/templates/nextjs-web/postcss.config.js +6 -6
  185. package/templates/nextjs-web/tailwind.config.ts +69 -69
  186. package/templates/nextjs-web/tsconfig.json +1 -1
  187. package/templates/nixpacks.toml +11 -11
  188. package/templates/root-package.json +31 -31
  189. package/templates/server.ts +66 -66
  190. package/templates/tsconfig.json +30 -30
  191. package/dist/chunk-2MCBBWEA.js +0 -1
  192. package/dist/chunk-2MCBBWEA.js.map +0 -1
  193. package/dist/chunk-3OM7CHCA.js.map +0 -1
  194. package/dist/chunk-63MTCWU2.mjs +0 -361
  195. package/dist/chunk-63MTCWU2.mjs.map +0 -1
  196. package/dist/chunk-667BQCEM.js +0 -375
  197. package/dist/chunk-667BQCEM.js.map +0 -1
  198. package/dist/chunk-67IJ6H4J.mjs +0 -44
  199. package/dist/chunk-67IJ6H4J.mjs.map +0 -1
  200. package/dist/chunk-6SVQEGEX.mjs +0 -44
  201. package/dist/chunk-6SVQEGEX.mjs.map +0 -1
  202. package/dist/chunk-7NSRDJ5C.mjs +0 -1
  203. package/dist/chunk-ASDXAK6G.js +0 -44
  204. package/dist/chunk-ASDXAK6G.js.map +0 -1
  205. package/dist/chunk-CKZ4VSCB.mjs +0 -18
  206. package/dist/chunk-CKZ4VSCB.mjs.map +0 -1
  207. package/dist/chunk-DW6GOKMF.js +0 -57
  208. package/dist/chunk-DW6GOKMF.js.map +0 -1
  209. package/dist/chunk-EFZPSZWO.mjs +0 -1
  210. package/dist/chunk-EFZPSZWO.mjs.map +0 -1
  211. package/dist/chunk-FCEZDH42.mjs.map +0 -1
  212. package/dist/chunk-FYGXL4V7.js +0 -361
  213. package/dist/chunk-FYGXL4V7.js.map +0 -1
  214. package/dist/chunk-GKVPGKAH.js +0 -66
  215. package/dist/chunk-GKVPGKAH.js.map +0 -1
  216. package/dist/chunk-GWP6PNSP.js +0 -225
  217. package/dist/chunk-GWP6PNSP.js.map +0 -1
  218. package/dist/chunk-HQKTXE7E.mjs +0 -225
  219. package/dist/chunk-HQKTXE7E.mjs.map +0 -1
  220. package/dist/chunk-HSFLZUJN.mjs +0 -57
  221. package/dist/chunk-HSFLZUJN.mjs.map +0 -1
  222. package/dist/chunk-HU63F22V.js +0 -361
  223. package/dist/chunk-HU63F22V.js.map +0 -1
  224. package/dist/chunk-J5LGTIGS.mjs +0 -10
  225. package/dist/chunk-J5LGTIGS.mjs.map +0 -1
  226. package/dist/chunk-JMBD6DOP.js +0 -225
  227. package/dist/chunk-JMBD6DOP.js.map +0 -1
  228. package/dist/chunk-K7EIJSYQ.js +0 -1
  229. package/dist/chunk-K7EIJSYQ.js.map +0 -1
  230. package/dist/chunk-KXYLEUSW.mjs.map +0 -1
  231. package/dist/chunk-MTHKZO55.js +0 -44
  232. package/dist/chunk-MTHKZO55.js.map +0 -1
  233. package/dist/chunk-NNQFLD7O.mjs +0 -361
  234. package/dist/chunk-NNQFLD7O.mjs.map +0 -1
  235. package/dist/chunk-NU2UB242.js +0 -82
  236. package/dist/chunk-NU2UB242.js.map +0 -1
  237. package/dist/chunk-NULGSZFE.mjs +0 -57
  238. package/dist/chunk-NULGSZFE.mjs.map +0 -1
  239. package/dist/chunk-O42L6HOX.js.map +0 -1
  240. package/dist/chunk-ONXNE2A6.mjs +0 -375
  241. package/dist/chunk-ONXNE2A6.mjs.map +0 -1
  242. package/dist/chunk-OTBYRUBE.mjs +0 -225
  243. package/dist/chunk-OTBYRUBE.mjs.map +0 -1
  244. package/dist/chunk-OTSAVKLY.mjs +0 -66
  245. package/dist/chunk-OTSAVKLY.mjs.map +0 -1
  246. package/dist/chunk-PZ5AY32C.js +0 -10
  247. package/dist/chunk-PZ5AY32C.js.map +0 -1
  248. package/dist/chunk-QP2TMRLG.js +0 -57
  249. package/dist/chunk-QP2TMRLG.js.map +0 -1
  250. package/dist/chunk-RS23R3ZQ.mjs +0 -82
  251. package/dist/chunk-RS23R3ZQ.mjs.map +0 -1
  252. package/dist/chunk-STTOPUZ2.mjs.map +0 -1
  253. package/dist/chunk-VMT3LALB.mjs +0 -51
  254. package/dist/chunk-VMT3LALB.mjs.map +0 -1
  255. package/dist/chunk-VNNVLQLJ.mjs.map +0 -1
  256. package/dist/chunk-W3YRVEFQ.js +0 -66
  257. package/dist/chunk-W3YRVEFQ.js.map +0 -1
  258. package/dist/chunk-WF65EDRZ.js.map +0 -1
  259. package/dist/chunk-WMHVXEYQ.mjs +0 -66
  260. package/dist/chunk-WMHVXEYQ.mjs.map +0 -1
  261. package/dist/chunk-XVKTIYHY.js +0 -51
  262. package/dist/chunk-XVKTIYHY.js.map +0 -1
  263. package/dist/codegen-MRZDLCYI.js +0 -13
  264. package/dist/codegen-MRZDLCYI.js.map +0 -1
  265. package/dist/codegen-UI5HTMXE.mjs +0 -13
  266. package/dist/codegen-UI5HTMXE.mjs.map +0 -1
  267. package/dist/dev-server-JKRVBWPY.mjs +0 -13
  268. package/dist/dev-server-JKRVBWPY.mjs.map +0 -1
  269. package/dist/dev-server-TLL7UQMR.js +0 -13
  270. package/dist/dev-server-TLL7UQMR.js.map +0 -1
  271. package/dist/index-BsNaOUtH.d.mts +0 -44
  272. package/dist/index-BsNaOUtH.d.ts +0 -44
  273. package/dist/index-CrbXnXsO.d.ts +0 -62
  274. package/dist/index-kEbGExWM.d.mts +0 -62
  275. package/templates/nestjs-api/.env +0 -4
  276. package/templates/nextjs-web/.env +0 -1
@@ -1,140 +1,140 @@
1
- 'use client';
2
-
3
- import { useState } from 'react';
4
- import { useRouter } from 'next/navigation';
5
- import { login } from './api';
6
- import { Button } from '@/components/ui/button';
7
- import { Input } from '@/components/ui/input';
8
- import { Label } from '@/components/ui/label';
9
- import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from '@/components/ui/card';
10
- import Link from 'next/link';
11
- import { Zap, Mail, Lock, ArrowRight, Loader2 } from 'lucide-react';
12
-
13
- export function LoginForm() {
14
- const router = useRouter();
15
- const [loading, setLoading] = useState(false);
16
- const [error, setError] = useState('');
17
-
18
- const handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => {
19
- e.preventDefault();
20
- setLoading(true);
21
- setError('');
22
-
23
- const formData = new FormData(e.currentTarget);
24
- const data = Object.fromEntries(formData.entries());
25
-
26
- try {
27
- await login(data);
28
- router.push('/dashboard');
29
- } catch (err: any) {
30
- console.error(err);
31
- setError(err.response?.data?.message || 'Login failed. Please check your credentials.');
32
- } finally {
33
- setLoading(false);
34
- }
35
- };
36
-
37
- return (
38
- <div className="min-h-screen flex items-center justify-center relative overflow-hidden bg-background">
39
- {/* Animated Background Elements */}
40
- <div className="absolute inset-0 overflow-hidden pointer-events-none">
41
- <div className="absolute -top-[20%] -left-[10%] w-[50%] h-[50%] rounded-full bg-primary/20 blur-[100px] animate-float" />
42
- <div className="absolute top-[40%] -right-[10%] w-[40%] h-[40%] rounded-full bg-indigo-500/20 blur-[100px] animate-float" style={{ animationDelay: '2s' }} />
43
- <div className="absolute -bottom-[10%] left-[20%] w-[30%] h-[30%] rounded-full bg-violet-500/20 blur-[100px] animate-float" style={{ animationDelay: '4s' }} />
44
- </div>
45
-
46
- <div className="w-full max-w-md p-8 relative z-10">
47
- <Card className="glass border-white/20 shadow-2xl backdrop-blur-xl">
48
- <CardHeader className="text-center">
49
- <div className="inline-flex items-center justify-center w-16 h-16 rounded-2xl bg-primary/10 mb-6 mx-auto text-primary">
50
- <Zap className="w-8 h-8" />
51
- </div>
52
- <CardTitle className="text-3xl font-bold bg-clip-text text-transparent bg-gradient-to-r from-primary to-indigo-600">
53
- Welcome Back
54
- </CardTitle>
55
- <CardDescription>
56
- Sign in to continue to wexts
57
- </CardDescription>
58
- </CardHeader>
59
- <CardContent>
60
- <form onSubmit={handleSubmit} className="space-y-6">
61
- {error && (
62
- <div className="p-4 rounded-xl bg-destructive/10 text-destructive text-sm font-medium border border-destructive/20 animate-pulse-slow flex items-center gap-2">
63
- <span className="text-lg">⚠️</span>
64
- {error}
65
- </div>
66
- )}
67
-
68
- <div className="space-y-4">
69
- <div className="space-y-2">
70
- <Label htmlFor="email">Email Address</Label>
71
- <div className="relative">
72
- <Mail className="absolute left-3 top-3 w-4 h-4 text-muted-foreground" />
73
- <Input
74
- id="email"
75
- name="email"
76
- type="email"
77
- placeholder="name@example.com"
78
- required
79
- className="pl-10 bg-secondary/50 border-transparent focus:border-primary/50 focus:bg-background transition-all"
80
- />
81
- </div>
82
- </div>
83
-
84
- <div className="space-y-2">
85
- <div className="flex items-center justify-between">
86
- <Label htmlFor="password">Password</Label>
87
- <Link href="#" className="text-xs font-medium text-primary hover:text-primary/80 transition-colors">
88
- Forgot password?
89
- </Link>
90
- </div>
91
- <div className="relative">
92
- <Lock className="absolute left-3 top-3 w-4 h-4 text-muted-foreground" />
93
- <Input
94
- id="password"
95
- name="password"
96
- type="password"
97
- placeholder="••••••••"
98
- required
99
- className="pl-10 bg-secondary/50 border-transparent focus:border-primary/50 focus:bg-background transition-all"
100
- />
101
- </div>
102
- </div>
103
- </div>
104
-
105
- <Button
106
- type="submit"
107
- disabled={loading}
108
- className="w-full bg-gradient-to-r from-primary to-indigo-600 hover:from-primary/90 hover:to-indigo-600/90 shadow-lg shadow-primary/25 group"
109
- >
110
- {loading ? (
111
- <>
112
- <Loader2 className="w-4 h-4 mr-2 animate-spin" />
113
- Signing in...
114
- </>
115
- ) : (
116
- <>
117
- Sign in
118
- <ArrowRight className="w-4 h-4 ml-2 group-hover:translate-x-1 transition-transform" />
119
- </>
120
- )}
121
- </Button>
122
- </form>
123
- </CardContent>
124
- <CardFooter className="justify-center">
125
- <div className="text-center text-sm text-muted-foreground">
126
- Don't have an account?{' '}
127
- <Link href="/register" className="font-semibold text-primary hover:text-primary/80 transition-colors">
128
- Create account
129
- </Link>
130
- </div>
131
- </CardFooter>
132
- </Card>
133
-
134
- <p className="text-center mt-8 text-xs text-muted-foreground/60">
135
- &copy; 2025 wexts Inc. All rights reserved.
136
- </p>
137
- </div>
138
- </div>
139
- );
140
- }
1
+ 'use client';
2
+
3
+ import { useState } from 'react';
4
+ import { useRouter } from 'next/navigation';
5
+ import { login } from './api';
6
+ import { Button } from '@/components/ui/button';
7
+ import { Input } from '@/components/ui/input';
8
+ import { Label } from '@/components/ui/label';
9
+ import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from '@/components/ui/card';
10
+ import Link from 'next/link';
11
+ import { Zap, Mail, Lock, ArrowRight, Loader2 } from 'lucide-react';
12
+
13
+ export function LoginForm() {
14
+ const router = useRouter();
15
+ const [loading, setLoading] = useState(false);
16
+ const [error, setError] = useState('');
17
+
18
+ const handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => {
19
+ e.preventDefault();
20
+ setLoading(true);
21
+ setError('');
22
+
23
+ const formData = new FormData(e.currentTarget);
24
+ const data = Object.fromEntries(formData.entries());
25
+
26
+ try {
27
+ await login(data);
28
+ router.push('/dashboard');
29
+ } catch (err: any) {
30
+ console.error(err);
31
+ setError(err.response?.data?.message || 'Login failed. Please check your credentials.');
32
+ } finally {
33
+ setLoading(false);
34
+ }
35
+ };
36
+
37
+ return (
38
+ <div className="min-h-screen flex items-center justify-center relative overflow-hidden bg-background">
39
+ {/* Animated Background Elements */}
40
+ <div className="absolute inset-0 overflow-hidden pointer-events-none">
41
+ <div className="absolute -top-[20%] -left-[10%] w-[50%] h-[50%] rounded-full bg-primary/20 blur-[100px] animate-float" />
42
+ <div className="absolute top-[40%] -right-[10%] w-[40%] h-[40%] rounded-full bg-indigo-500/20 blur-[100px] animate-float" style={{ animationDelay: '2s' }} />
43
+ <div className="absolute -bottom-[10%] left-[20%] w-[30%] h-[30%] rounded-full bg-violet-500/20 blur-[100px] animate-float" style={{ animationDelay: '4s' }} />
44
+ </div>
45
+
46
+ <div className="w-full max-w-md p-8 relative z-10">
47
+ <Card className="glass border-white/20 shadow-2xl backdrop-blur-xl">
48
+ <CardHeader className="text-center">
49
+ <div className="inline-flex items-center justify-center w-16 h-16 rounded-2xl bg-primary/10 mb-6 mx-auto text-primary">
50
+ <Zap className="w-8 h-8" />
51
+ </div>
52
+ <CardTitle className="text-3xl font-bold bg-clip-text text-transparent bg-gradient-to-r from-primary to-indigo-600">
53
+ Welcome Back
54
+ </CardTitle>
55
+ <CardDescription>
56
+ Sign in to continue to wexts
57
+ </CardDescription>
58
+ </CardHeader>
59
+ <CardContent>
60
+ <form onSubmit={handleSubmit} className="space-y-6">
61
+ {error && (
62
+ <div className="p-4 rounded-xl bg-destructive/10 text-destructive text-sm font-medium border border-destructive/20 animate-pulse-slow flex items-center gap-2">
63
+ <span className="text-lg">⚠️</span>
64
+ {error}
65
+ </div>
66
+ )}
67
+
68
+ <div className="space-y-4">
69
+ <div className="space-y-2">
70
+ <Label htmlFor="email">Email Address</Label>
71
+ <div className="relative">
72
+ <Mail className="absolute left-3 top-3 w-4 h-4 text-muted-foreground" />
73
+ <Input
74
+ id="email"
75
+ name="email"
76
+ type="email"
77
+ placeholder="name@example.com"
78
+ required
79
+ className="pl-10 bg-secondary/50 border-transparent focus:border-primary/50 focus:bg-background transition-all"
80
+ />
81
+ </div>
82
+ </div>
83
+
84
+ <div className="space-y-2">
85
+ <div className="flex items-center justify-between">
86
+ <Label htmlFor="password">Password</Label>
87
+ <Link href="#" className="text-xs font-medium text-primary hover:text-primary/80 transition-colors">
88
+ Forgot password?
89
+ </Link>
90
+ </div>
91
+ <div className="relative">
92
+ <Lock className="absolute left-3 top-3 w-4 h-4 text-muted-foreground" />
93
+ <Input
94
+ id="password"
95
+ name="password"
96
+ type="password"
97
+ placeholder="••••••••"
98
+ required
99
+ className="pl-10 bg-secondary/50 border-transparent focus:border-primary/50 focus:bg-background transition-all"
100
+ />
101
+ </div>
102
+ </div>
103
+ </div>
104
+
105
+ <Button
106
+ type="submit"
107
+ disabled={loading}
108
+ className="w-full bg-gradient-to-r from-primary to-indigo-600 hover:from-primary/90 hover:to-indigo-600/90 shadow-lg shadow-primary/25 group"
109
+ >
110
+ {loading ? (
111
+ <>
112
+ <Loader2 className="w-4 h-4 mr-2 animate-spin" />
113
+ Signing in...
114
+ </>
115
+ ) : (
116
+ <>
117
+ Sign in
118
+ <ArrowRight className="w-4 h-4 ml-2 group-hover:translate-x-1 transition-transform" />
119
+ </>
120
+ )}
121
+ </Button>
122
+ </form>
123
+ </CardContent>
124
+ <CardFooter className="justify-center">
125
+ <div className="text-center text-sm text-muted-foreground">
126
+ Don't have an account?{' '}
127
+ <Link href="/register" className="font-semibold text-primary hover:text-primary/80 transition-colors">
128
+ Create account
129
+ </Link>
130
+ </div>
131
+ </CardFooter>
132
+ </Card>
133
+
134
+ <p className="text-center mt-8 text-xs text-muted-foreground/60">
135
+ &copy; 2025 wexts Inc. All rights reserved.
136
+ </p>
137
+ </div>
138
+ </div>
139
+ );
140
+ }
@@ -1,159 +1,159 @@
1
- 'use client';
2
-
3
- import { useState } from 'react';
4
- import { useRouter } from 'next/navigation';
5
- import { register } from './api';
6
- import { Button } from '@/components/ui/button';
7
- import { Input } from '@/components/ui/input';
8
- import { Label } from '@/components/ui/label';
9
- import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from '@/components/ui/card';
10
- import Link from 'next/link';
11
- import { Zap, Mail, Lock, ArrowRight, Loader2, UserPlus } from 'lucide-react';
12
-
13
- export function RegisterForm() {
14
- const router = useRouter();
15
- const [loading, setLoading] = useState(false);
16
- const [error, setError] = useState('');
17
-
18
- const handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => {
19
- e.preventDefault();
20
- setLoading(true);
21
- setError('');
22
-
23
- const formData = new FormData(e.currentTarget);
24
- const data = Object.fromEntries(formData.entries());
25
-
26
- // Validate passwords match
27
- if (data.password !== data.confirmPassword) {
28
- setError('Passwords do not match');
29
- setLoading(false);
30
- return;
31
- }
32
-
33
- try {
34
- await register(data);
35
- router.push('/login?registered=true');
36
- } catch (err: any) {
37
- console.error(err);
38
- setError(err.response?.data?.message || 'Registration failed. Please try again.');
39
- } finally {
40
- setLoading(false);
41
- }
42
- };
43
-
44
- return (
45
- <div className="min-h-screen flex items-center justify-center relative overflow-hidden bg-background">
46
- {/* Animated Background Elements */}
47
- <div className="absolute inset-0 overflow-hidden pointer-events-none">
48
- <div className="absolute -top-[20%] -left-[10%] w-[50%] h-[50%] rounded-full bg-primary/20 blur-[100px] animate-float" />
49
- <div className="absolute top-[40%] -right-[10%] w-[40%] h-[40%] rounded-full bg-indigo-500/20 blur-[100px] animate-float" style={{ animationDelay: '2s' }} />
50
- <div className="absolute -bottom-[10%] left-[20%] w-[30%] h-[30%] rounded-full bg-violet-500/20 blur-[100px] animate-float" style={{ animationDelay: '4s' }} />
51
- </div>
52
-
53
- <div className="w-full max-w-md p-8 relative z-10">
54
- <Card className="glass border-white/20 shadow-2xl backdrop-blur-xl">
55
- <CardHeader className="text-center">
56
- <div className="inline-flex items-center justify-center w-16 h-16 rounded-2xl bg-primary/10 mb-6 mx-auto text-primary">
57
- <UserPlus className="w-8 h-8" />
58
- </div>
59
- <CardTitle className="text-3xl font-bold bg-clip-text text-transparent bg-gradient-to-r from-primary to-indigo-600">
60
- Create Account
61
- </CardTitle>
62
- <CardDescription>
63
- Join wexts today
64
- </CardDescription>
65
- </CardHeader>
66
- <CardContent>
67
- <form onSubmit={handleSubmit} className="space-y-6">
68
- {error && (
69
- <div className="p-4 rounded-xl bg-destructive/10 text-destructive text-sm font-medium border border-destructive/20 animate-pulse-slow flex items-center gap-2">
70
- <span className="text-lg">⚠️</span>
71
- {error}
72
- </div>
73
- )}
74
-
75
- <div className="space-y-4">
76
- <div className="space-y-2">
77
- <Label htmlFor="email">Email Address</Label>
78
- <div className="relative">
79
- <Mail className="absolute left-3 top-3 w-4 h-4 text-muted-foreground" />
80
- <Input
81
- id="email"
82
- name="email"
83
- type="email"
84
- placeholder="name@example.com"
85
- required
86
- className="pl-10 bg-secondary/50 border-transparent focus:border-primary/50 focus:bg-background transition-all"
87
- />
88
- </div>
89
- </div>
90
-
91
- <div className="space-y-2">
92
- <Label htmlFor="password">Password</Label>
93
- <div className="relative">
94
- <Lock className="absolute left-3 top-3 w-4 h-4 text-muted-foreground" />
95
- <Input
96
- id="password"
97
- name="password"
98
- type="password"
99
- placeholder="••••••••"
100
- required
101
- minLength={6}
102
- className="pl-10 bg-secondary/50 border-transparent focus:border-primary/50 focus:bg-background transition-all"
103
- />
104
- </div>
105
- </div>
106
-
107
- <div className="space-y-2">
108
- <Label htmlFor="confirmPassword">Confirm Password</Label>
109
- <div className="relative">
110
- <Lock className="absolute left-3 top-3 w-4 h-4 text-muted-foreground" />
111
- <Input
112
- id="confirmPassword"
113
- name="confirmPassword"
114
- type="password"
115
- placeholder="••••••••"
116
- required
117
- minLength={6}
118
- className="pl-10 bg-secondary/50 border-transparent focus:border-primary/50 focus:bg-background transition-all"
119
- />
120
- </div>
121
- </div>
122
- </div>
123
-
124
- <Button
125
- type="submit"
126
- disabled={loading}
127
- className="w-full bg-gradient-to-r from-primary to-indigo-600 hover:from-primary/90 hover:to-indigo-600/90 shadow-lg shadow-primary/25 group"
128
- >
129
- {loading ? (
130
- <>
131
- <Loader2 className="w-4 h-4 mr-2 animate-spin" />
132
- Creating account...
133
- </>
134
- ) : (
135
- <>
136
- Create account
137
- <ArrowRight className="w-4 h-4 ml-2 group-hover:translate-x-1 transition-transform" />
138
- </>
139
- )}
140
- </Button>
141
- </form>
142
- </CardContent>
143
- <CardFooter className="justify-center">
144
- <div className="text-center text-sm text-muted-foreground">
145
- Already have an account?{' '}
146
- <Link href="/login" className="font-semibold text-primary hover:text-primary/80 transition-colors">
147
- Sign in
148
- </Link>
149
- </div>
150
- </CardFooter>
151
- </Card>
152
-
153
- <p className="text-center mt-8 text-xs text-muted-foreground/60">
154
- &copy; 2025 wexts Inc. All rights reserved.
155
- </p>
156
- </div>
157
- </div>
158
- );
159
- }
1
+ 'use client';
2
+
3
+ import { useState } from 'react';
4
+ import { useRouter } from 'next/navigation';
5
+ import { register } from './api';
6
+ import { Button } from '@/components/ui/button';
7
+ import { Input } from '@/components/ui/input';
8
+ import { Label } from '@/components/ui/label';
9
+ import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from '@/components/ui/card';
10
+ import Link from 'next/link';
11
+ import { Zap, Mail, Lock, ArrowRight, Loader2, UserPlus } from 'lucide-react';
12
+
13
+ export function RegisterForm() {
14
+ const router = useRouter();
15
+ const [loading, setLoading] = useState(false);
16
+ const [error, setError] = useState('');
17
+
18
+ const handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => {
19
+ e.preventDefault();
20
+ setLoading(true);
21
+ setError('');
22
+
23
+ const formData = new FormData(e.currentTarget);
24
+ const data = Object.fromEntries(formData.entries());
25
+
26
+ // Validate passwords match
27
+ if (data.password !== data.confirmPassword) {
28
+ setError('Passwords do not match');
29
+ setLoading(false);
30
+ return;
31
+ }
32
+
33
+ try {
34
+ await register(data);
35
+ router.push('/login?registered=true');
36
+ } catch (err: any) {
37
+ console.error(err);
38
+ setError(err.response?.data?.message || 'Registration failed. Please try again.');
39
+ } finally {
40
+ setLoading(false);
41
+ }
42
+ };
43
+
44
+ return (
45
+ <div className="min-h-screen flex items-center justify-center relative overflow-hidden bg-background">
46
+ {/* Animated Background Elements */}
47
+ <div className="absolute inset-0 overflow-hidden pointer-events-none">
48
+ <div className="absolute -top-[20%] -left-[10%] w-[50%] h-[50%] rounded-full bg-primary/20 blur-[100px] animate-float" />
49
+ <div className="absolute top-[40%] -right-[10%] w-[40%] h-[40%] rounded-full bg-indigo-500/20 blur-[100px] animate-float" style={{ animationDelay: '2s' }} />
50
+ <div className="absolute -bottom-[10%] left-[20%] w-[30%] h-[30%] rounded-full bg-violet-500/20 blur-[100px] animate-float" style={{ animationDelay: '4s' }} />
51
+ </div>
52
+
53
+ <div className="w-full max-w-md p-8 relative z-10">
54
+ <Card className="glass border-white/20 shadow-2xl backdrop-blur-xl">
55
+ <CardHeader className="text-center">
56
+ <div className="inline-flex items-center justify-center w-16 h-16 rounded-2xl bg-primary/10 mb-6 mx-auto text-primary">
57
+ <UserPlus className="w-8 h-8" />
58
+ </div>
59
+ <CardTitle className="text-3xl font-bold bg-clip-text text-transparent bg-gradient-to-r from-primary to-indigo-600">
60
+ Create Account
61
+ </CardTitle>
62
+ <CardDescription>
63
+ Join wexts today
64
+ </CardDescription>
65
+ </CardHeader>
66
+ <CardContent>
67
+ <form onSubmit={handleSubmit} className="space-y-6">
68
+ {error && (
69
+ <div className="p-4 rounded-xl bg-destructive/10 text-destructive text-sm font-medium border border-destructive/20 animate-pulse-slow flex items-center gap-2">
70
+ <span className="text-lg">⚠️</span>
71
+ {error}
72
+ </div>
73
+ )}
74
+
75
+ <div className="space-y-4">
76
+ <div className="space-y-2">
77
+ <Label htmlFor="email">Email Address</Label>
78
+ <div className="relative">
79
+ <Mail className="absolute left-3 top-3 w-4 h-4 text-muted-foreground" />
80
+ <Input
81
+ id="email"
82
+ name="email"
83
+ type="email"
84
+ placeholder="name@example.com"
85
+ required
86
+ className="pl-10 bg-secondary/50 border-transparent focus:border-primary/50 focus:bg-background transition-all"
87
+ />
88
+ </div>
89
+ </div>
90
+
91
+ <div className="space-y-2">
92
+ <Label htmlFor="password">Password</Label>
93
+ <div className="relative">
94
+ <Lock className="absolute left-3 top-3 w-4 h-4 text-muted-foreground" />
95
+ <Input
96
+ id="password"
97
+ name="password"
98
+ type="password"
99
+ placeholder="••••••••"
100
+ required
101
+ minLength={6}
102
+ className="pl-10 bg-secondary/50 border-transparent focus:border-primary/50 focus:bg-background transition-all"
103
+ />
104
+ </div>
105
+ </div>
106
+
107
+ <div className="space-y-2">
108
+ <Label htmlFor="confirmPassword">Confirm Password</Label>
109
+ <div className="relative">
110
+ <Lock className="absolute left-3 top-3 w-4 h-4 text-muted-foreground" />
111
+ <Input
112
+ id="confirmPassword"
113
+ name="confirmPassword"
114
+ type="password"
115
+ placeholder="••••••••"
116
+ required
117
+ minLength={6}
118
+ className="pl-10 bg-secondary/50 border-transparent focus:border-primary/50 focus:bg-background transition-all"
119
+ />
120
+ </div>
121
+ </div>
122
+ </div>
123
+
124
+ <Button
125
+ type="submit"
126
+ disabled={loading}
127
+ className="w-full bg-gradient-to-r from-primary to-indigo-600 hover:from-primary/90 hover:to-indigo-600/90 shadow-lg shadow-primary/25 group"
128
+ >
129
+ {loading ? (
130
+ <>
131
+ <Loader2 className="w-4 h-4 mr-2 animate-spin" />
132
+ Creating account...
133
+ </>
134
+ ) : (
135
+ <>
136
+ Create account
137
+ <ArrowRight className="w-4 h-4 ml-2 group-hover:translate-x-1 transition-transform" />
138
+ </>
139
+ )}
140
+ </Button>
141
+ </form>
142
+ </CardContent>
143
+ <CardFooter className="justify-center">
144
+ <div className="text-center text-sm text-muted-foreground">
145
+ Already have an account?{' '}
146
+ <Link href="/login" className="font-semibold text-primary hover:text-primary/80 transition-colors">
147
+ Sign in
148
+ </Link>
149
+ </div>
150
+ </CardFooter>
151
+ </Card>
152
+
153
+ <p className="text-center mt-8 text-xs text-muted-foreground/60">
154
+ &copy; 2025 wexts Inc. All rights reserved.
155
+ </p>
156
+ </div>
157
+ </div>
158
+ );
159
+ }