ChandimaPrabath commited on
Commit
5649a75
·
1 Parent(s): 7afbbc5

0.0.1 Debug

Browse files
frontend/app/components/NexusAuth.css CHANGED
@@ -1,76 +1,191 @@
 
1
  .nexus-auth-form {
2
  max-width: 400px;
3
- margin: 0 auto;
4
- padding: 20px;
5
- border: 1px solid var(--primary);
6
- border-radius: 5px;
7
- background-color: var(--accent);
 
 
8
  }
9
 
 
10
  .nexus-auth-form h2 {
11
  text-align: center;
12
- margin-bottom: 20px;
13
  color: var(--foreground);
 
 
 
 
 
 
14
  }
15
 
 
16
  .form-group {
17
- margin-bottom: 15px;
18
  }
19
 
20
  .form-group label {
21
  display: block;
22
- margin-bottom: 5px;
23
  color: var(--foreground);
 
 
 
24
  }
25
 
26
  .form-group input {
27
  width: 100%;
28
- padding: 8px;
29
- box-sizing: border-box;
30
  background-color: var(--secondary);
31
  color: var(--foreground);
32
- border: 1px solid var(--primary);
 
 
 
 
33
  }
34
 
35
  .form-group input:focus {
36
  border-color: var(--accent);
 
37
  outline: none;
38
  }
39
 
 
 
 
 
 
 
 
 
 
40
  .submit-button {
41
  width: 100%;
42
- padding: 10px;
 
 
43
  color: var(--foreground);
44
- background-color: var(--primary);
45
  border: none;
46
- border-radius: 5px;
47
  cursor: pointer;
 
 
48
  }
49
 
50
  .submit-button:hover {
51
- background-color: var(--secondary);
 
 
52
  }
53
 
 
 
 
 
 
 
 
54
  .nexus-auth-signup-login {
55
  text-align: center;
56
- margin-top: 50px;
57
  }
58
 
59
  .nexus-auth-signup-login h1 {
60
  margin-bottom: 20px;
61
  color: var(--foreground);
 
 
 
62
  }
63
 
64
  .nexus-auth-signup-login button {
65
- margin-top: 20px;
66
- padding: 10px 20px;
 
67
  color: var(--foreground);
68
- background-color: var(--primary);
69
  border: none;
70
- border-radius: 5px;
71
  cursor: pointer;
 
72
  }
73
 
74
  .nexus-auth-signup-login button:hover {
75
- background-color: var(--secondary);
76
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* Container Styling */
2
  .nexus-auth-form {
3
  max-width: 400px;
4
+ margin: 20px auto;
5
+ padding: 30px;
6
+ border: none;
7
+ border-radius: 12px;
8
+ background: linear-gradient(145deg, var(--accent), var(--secondary));
9
+ box-shadow: 0 10px 15px rgba(0, 0, 0, 0.2), 0 4px 6px rgba(0, 0, 0, 0.1);
10
+ color: var(--foreground);
11
  }
12
 
13
+ /* Header Styling */
14
  .nexus-auth-form h2 {
15
  text-align: center;
16
+ margin-bottom: 25px;
17
  color: var(--foreground);
18
+ font-size: 1.8rem;
19
+ font-weight: 600;
20
+ letter-spacing: 1px;
21
+ text-transform: uppercase;
22
+ border-bottom: 2px solid var(--primary);
23
+ padding-bottom: 10px;
24
  }
25
 
26
+ /* Form Group Styling */
27
  .form-group {
28
+ margin-bottom: 20px;
29
  }
30
 
31
  .form-group label {
32
  display: block;
33
+ margin-bottom: 8px;
34
  color: var(--foreground);
35
+ font-size: 1rem;
36
+ font-weight: 500;
37
+ letter-spacing: 0.5px;
38
  }
39
 
40
  .form-group input {
41
  width: 100%;
42
+ padding: 12px;
 
43
  background-color: var(--secondary);
44
  color: var(--foreground);
45
+ border: 2px solid var(--primary);
46
+ border-radius: 8px;
47
+ font-size: 1rem;
48
+ transition: all 0.3s ease;
49
+ box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.1);
50
  }
51
 
52
  .form-group input:focus {
53
  border-color: var(--accent);
54
+ box-shadow: 0 0 10px var(--accent);
55
  outline: none;
56
  }
57
 
58
+ /* Error Message Styling */
59
+ .error-message {
60
+ color: #ff6b6b; /* Vibrant red for errors */
61
+ font-size: 0.9rem;
62
+ margin-top: 5px;
63
+ font-weight: bold;
64
+ }
65
+
66
+ /* Submit Button Styling */
67
  .submit-button {
68
  width: 100%;
69
+ padding: 14px;
70
+ font-size: 1rem;
71
+ font-weight: bold;
72
  color: var(--foreground);
73
+ background: linear-gradient(135deg, var(--primary), var(--secondary));
74
  border: none;
75
+ border-radius: 8px;
76
  cursor: pointer;
77
+ transition: all 0.3s ease;
78
+ text-transform: uppercase;
79
  }
80
 
81
  .submit-button:hover {
82
+ background: linear-gradient(135deg, var(--secondary), var(--accent));
83
+ transform: translateY(-2px) scale(1.02);
84
+ box-shadow: 0 8px 12px rgba(0, 0, 0, 0.2);
85
  }
86
 
87
+ .submit-button:disabled {
88
+ background-color: var(--primary);
89
+ opacity: 0.5;
90
+ cursor: not-allowed;
91
+ }
92
+
93
+ /* Signup/Login Section Styling */
94
  .nexus-auth-signup-login {
95
  text-align: center;
96
+ margin-top: 40px;
97
  }
98
 
99
  .nexus-auth-signup-login h1 {
100
  margin-bottom: 20px;
101
  color: var(--foreground);
102
+ font-size: 1.5rem;
103
+ font-weight: bold;
104
+ letter-spacing: 0.8px;
105
  }
106
 
107
  .nexus-auth-signup-login button {
108
+ padding: 12px 30px;
109
+ font-size: 1rem;
110
+ font-weight: bold;
111
  color: var(--foreground);
112
+ background: linear-gradient(145deg, var(--primary), var(--secondary));
113
  border: none;
114
+ border-radius: 8px;
115
  cursor: pointer;
116
+ transition: all 0.3s ease;
117
  }
118
 
119
  .nexus-auth-signup-login button:hover {
120
+ background: linear-gradient(145deg, var(--secondary), var(--accent));
121
+ transform: translateY(-2px);
122
+ box-shadow: 0 8px 12px rgba(0, 0, 0, 0.2);
123
+ }
124
+
125
+ /* Responsive Design */
126
+ @media (max-width: 768px) {
127
+ .nexus-auth-form {
128
+ padding: 20px;
129
+ max-width: 90%;
130
+ }
131
+
132
+ .nexus-auth-form h2 {
133
+ font-size: 1.5rem;
134
+ }
135
+
136
+ .form-group label {
137
+ font-size: 0.9rem;
138
+ }
139
+
140
+ .form-group input {
141
+ padding: 10px;
142
+ font-size: 0.95rem;
143
+ }
144
+
145
+ .submit-button {
146
+ padding: 12px;
147
+ font-size: 0.9rem;
148
+ }
149
+
150
+ .nexus-auth-signup-login h1 {
151
+ font-size: 1.3rem;
152
+ }
153
+
154
+ .nexus-auth-signup-login button {
155
+ font-size: 0.9rem;
156
+ }
157
+ }
158
+
159
+ @media (max-width: 480px) {
160
+ .nexus-auth-form {
161
+ padding: 15px;
162
+ max-width: 95%;
163
+ }
164
+
165
+ .nexus-auth-form h2 {
166
+ font-size: 1.3rem;
167
+ }
168
+
169
+ .form-group label {
170
+ font-size: 0.8rem;
171
+ }
172
+
173
+ .form-group input {
174
+ padding: 8px;
175
+ font-size: 0.85rem;
176
+ }
177
+
178
+ .submit-button {
179
+ padding: 10px;
180
+ font-size: 0.85rem;
181
+ }
182
+
183
+ .nexus-auth-signup-login h1 {
184
+ font-size: 1.2rem;
185
+ }
186
+
187
+ .nexus-auth-signup-login button {
188
+ padding: 10px 20px;
189
+ font-size: 0.85rem;
190
+ }
191
+ }
frontend/app/components/NexusAuth.js CHANGED
@@ -1,33 +1,145 @@
1
  'use client';
2
  import './NexusAuth.css';
3
- import { useState } from "react";
 
 
 
4
 
5
  const SignupForm = ({ onSignup }) => {
6
  const [username, setUsername] = useState('');
7
  const [password, setPassword] = useState('');
 
8
  const [email, setEmail] = useState('');
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9
 
10
  const handleSubmit = (e) => {
11
  e.preventDefault();
12
- onSignup({ username, password, email });
 
 
 
 
 
 
13
  };
14
 
 
 
 
 
 
 
 
 
 
15
  return (
16
  <form onSubmit={handleSubmit} className="nexus-auth-form">
17
  <h2>Signup</h2>
18
  <div className="form-group">
19
  <label>Username:</label>
20
- <input type="text" value={username} onChange={(e) => setUsername(e.target.value)} required />
 
 
 
 
 
 
 
 
 
 
 
 
 
 
21
  </div>
22
  <div className="form-group">
23
  <label>Password:</label>
24
- <input type="password" value={password} onChange={(e) => setPassword(e.target.value)} required />
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
25
  </div>
26
  <div className="form-group">
27
  <label>Email (optional):</label>
28
- <input type="email" value={email} onChange={(e) => setEmail(e.target.value)} />
 
 
 
29
  </div>
30
- <button type="submit" className="submit-button">Signup</button>
 
 
31
  </form>
32
  );
33
  };
@@ -46,45 +158,127 @@ const LoginForm = ({ onLogin }) => {
46
  <h2>Login</h2>
47
  <div className="form-group">
48
  <label>Username:</label>
49
- <input type="text" value={username} onChange={(e) => setUsername(e.target.value)} required />
 
 
 
 
50
  </div>
51
  <div className="form-group">
52
  <label>Password:</label>
53
- <input type="password" value={password} onChange={(e) => setPassword(e.target.value)} required />
 
 
 
 
54
  </div>
55
- <button type="submit" className="submit-button">Login</button>
 
 
56
  </form>
57
  );
58
  };
59
 
60
- export const NexusAuthWrapper = ({ children }) =>{
61
- const [isloggedin, setIsloggedin] = useState(false);
62
- const [isSignup, setIsSignup] = useState(true);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
63
 
64
- const handleSignup = (data) => {
65
- // Handle signup logic here
66
- console.log('Signup data:', data);
67
- setIsloggedin(true);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
68
  };
69
-
70
 
71
- const handleLogin = (data) => {
72
- // Handle login logic here
73
- console.log('Login data:', data);
74
- setIsloggedin(true);
 
 
 
 
 
 
 
 
 
 
 
75
  };
76
 
 
 
 
 
77
  return (
78
  <div>
79
- {isloggedin ? children :
80
- <div className="nexus-auth-signup-login">
81
- <h1>Nexus Accounts</h1>
82
- {isSignup ? <SignupForm onSignup={handleSignup} /> : <LoginForm onLogin={handleLogin} />}
83
- <button onClick={() => setIsSignup(!isSignup)}>
84
- {isSignup ? 'Switch to Login' : 'Switch to Signup'}
85
- </button>
86
- </div>
87
- }
 
 
 
 
 
 
88
  </div>
89
  );
90
- };
 
1
  'use client';
2
  import './NexusAuth.css';
3
+ import { useState, useEffect } from 'react';
4
+ import NexusAuthApi from '../lib/Nexus_Auth_API';
5
+ import SplashScreen from './SplashScreen';
6
+ import { CheckCircleIcon} from '@heroicons/react/20/solid';
7
 
8
  const SignupForm = ({ onSignup }) => {
9
  const [username, setUsername] = useState('');
10
  const [password, setPassword] = useState('');
11
+ const [confirmPassword, setConfirmPassword] = useState('');
12
  const [email, setEmail] = useState('');
13
+ const [usernameAvailable, setUsernameAvailable] = useState(null); // null for initial state
14
+ const [passwordValid, setPasswordValid] = useState(false); // Initially invalid
15
+ const [formValid, setFormValid] = useState(false);
16
+ const [debounceTimeout, setDebounceTimeout] = useState(null); // Store timeout ID
17
+
18
+ const validatePassword = (password) => {
19
+ return password.length >= 8;
20
+ };
21
+
22
+ const handleUsernameChange = (e) => {
23
+ const newUsername = e.target.value;
24
+ setUsername(newUsername);
25
+
26
+ // Reset username availability while typing
27
+ setUsernameAvailable(null);
28
+
29
+ // Clear any existing debounce timeout
30
+ if (debounceTimeout) {
31
+ clearTimeout(debounceTimeout);
32
+ }
33
+
34
+ if (newUsername.trim().length > 0) {
35
+ // Set a new timeout to check availability
36
+ const newTimeout = setTimeout(async () => {
37
+ try {
38
+ const response = await NexusAuthApi.isUsernameAvailable(newUsername);
39
+ setUsernameAvailable(response?.is_available === true);
40
+ } catch (error) {
41
+ console.error('Error checking username availability:', error);
42
+ setUsernameAvailable(null); // Fallback state
43
+ }
44
+ }, 1000); // 1-second debounce delay
45
+
46
+ setDebounceTimeout(newTimeout);
47
+ } else {
48
+ setUsernameAvailable(null); // Reset availability check when input is empty
49
+ }
50
+ };
51
+
52
+ const handlePasswordChange = (e) => {
53
+ const newPassword = e.target.value;
54
+ setPassword(newPassword);
55
+ setPasswordValid(validatePassword(newPassword));
56
+ };
57
+
58
+ const handleConfirmPasswordChange = (e) => {
59
+ setConfirmPassword(e.target.value);
60
+ };
61
 
62
  const handleSubmit = (e) => {
63
  e.preventDefault();
64
+
65
+ // Set email to null if it's empty
66
+ const emailValue = email.trim() === '' ? null : email;
67
+
68
+ if (password === confirmPassword && passwordValid) {
69
+ onSignup({ username, password, email: emailValue });
70
+ }
71
  };
72
 
73
+ useEffect(() => {
74
+ setFormValid(
75
+ usernameAvailable === true &&
76
+ password === confirmPassword &&
77
+ passwordValid &&
78
+ username.length > 0
79
+ );
80
+ }, [username, password, confirmPassword, usernameAvailable, passwordValid]);
81
+
82
  return (
83
  <form onSubmit={handleSubmit} className="nexus-auth-form">
84
  <h2>Signup</h2>
85
  <div className="form-group">
86
  <label>Username:</label>
87
+ <input
88
+ type="text"
89
+ value={username}
90
+ onChange={handleUsernameChange}
91
+ required
92
+ className={usernameAvailable === false ? 'error' : ''} />
93
+ {usernameAvailable === true && username.length > 0 && (
94
+ <CheckCircleIcon className="h-5 w-5 text-green-500" />
95
+ )}
96
+ {usernameAvailable === false && (
97
+ <p className="error-message text-red-500">Username is already taken</p>
98
+ )}
99
+ {usernameAvailable === null && username.length > 0 && (
100
+ <p className="typing-message text-green-500">Checking username availability...</p>
101
+ )}
102
  </div>
103
  <div className="form-group">
104
  <label>Password:</label>
105
+ <input
106
+ type="password"
107
+ value={password}
108
+ onChange={handlePasswordChange}
109
+ required
110
+ className={passwordValid ? '' : 'error'} />
111
+ {passwordValid && (
112
+ <CheckCircleIcon className="h-5 w-5 text-green-500" />
113
+ )}
114
+ {!passwordValid && (
115
+ <p className="error-message text-yellow-500">Password must be at least 8 characters long</p>
116
+ )}
117
+ </div>
118
+ <div className="form-group">
119
+ <label>Confirm Password:</label>
120
+ <input
121
+ type="password"
122
+ value={confirmPassword}
123
+ onChange={handleConfirmPasswordChange}
124
+ required
125
+ className={password === confirmPassword ? '' : 'error'} />
126
+ {password === confirmPassword && confirmPassword.length > 0 && (
127
+ <CheckCircleIcon className="h-5 w-5 text-green-500" />
128
+ )}
129
+ {password !== confirmPassword && confirmPassword.length > 0 && (
130
+ <p className="error-message text-red-500">Passwords do not match</p>
131
+ )}
132
  </div>
133
  <div className="form-group">
134
  <label>Email (optional):</label>
135
+ <input
136
+ type="email"
137
+ value={email}
138
+ onChange={(e) => setEmail(e.target.value)} />
139
  </div>
140
+ <button type="submit" className="submit-button" disabled={!formValid}>
141
+ Signup
142
+ </button>
143
  </form>
144
  );
145
  };
 
158
  <h2>Login</h2>
159
  <div className="form-group">
160
  <label>Username:</label>
161
+ <input
162
+ type="text"
163
+ value={username}
164
+ onChange={(e) => setUsername(e.target.value)}
165
+ required />
166
  </div>
167
  <div className="form-group">
168
  <label>Password:</label>
169
+ <input
170
+ type="password"
171
+ value={password}
172
+ onChange={(e) => setPassword(e.target.value)}
173
+ required />
174
  </div>
175
+ <button type="submit" className="submit-button">
176
+ Login
177
+ </button>
178
  </form>
179
  );
180
  };
181
 
182
+ export const NexusAuthWrapper = ({ children, toast }) => {
183
+ const [isLoggedIn, setIsLoggedIn] = useState(false);
184
+ const [isSignup, setIsSignup] = useState(false);
185
+ const [isLoading, setIsLoading] = useState(true);
186
+ const [isSignupSuccessfull, setIsSignupSuccessfull] = useState(false);
187
+
188
+ useEffect(() => {
189
+ const validateUserSession = async () => {
190
+ const storedUsername = localStorage.getItem("me");
191
+ const storedToken = localStorage.getItem("s_tkn");
192
+ const storedUserID = localStorage.getItem("u_id");
193
+
194
+ if (storedUsername && storedToken && storedUserID) {
195
+ try {
196
+ // Validate the token with the NexusAuthApi
197
+ const isValid = await NexusAuthApi.validateToken(storedUserID, storedToken);
198
+ if (isValid) {
199
+ console.log("User is already logged in.");
200
+ toast.info("Welcome back!");
201
+ setIsLoggedIn(true);
202
+ } else {
203
+ // Token invalid, clear localStorage
204
+ clearLocalStorage();
205
+ }
206
+ } catch (error) {
207
+ console.error("Token validation failed:", error);
208
+ toast.error("Token validation failed. Please login again.");
209
+ clearLocalStorage();
210
+ }
211
+ }
212
+ setIsLoading(false); // Stop showing splash screen after validation
213
+ };
214
+
215
+ const clearLocalStorage = () => {
216
+ localStorage.removeItem("me");
217
+ localStorage.removeItem("s_tkn");
218
+ localStorage.removeItem("u_id");
219
+ setIsLoggedIn(false);
220
+ toast.error("Session expired. Please login again.");
221
+ };
222
 
223
+ validateUserSession();
224
+ }, []);
225
+
226
+ const handleSignup = async (data) => {
227
+ try {
228
+ const response = await NexusAuthApi.signup(data.username, data.password, data.email);
229
+ console.log("Signup successful:", response);
230
+ setIsSignupSuccessfull(true);
231
+ toast.success('Signup successful. Please login to continue');
232
+
233
+ // Save username and token to localStorage
234
+ localStorage.setItem("me", response.username);
235
+ localStorage.setItem("s_tkn", response.access_token);
236
+ localStorage.setItem("u_id", response.user_id);
237
+ setIsSignup(false);
238
+ } catch (error) {
239
+ console.error("Signup failed:", error);
240
+ toast.error("Signup failed");
241
+ }
242
  };
 
243
 
244
+ const handleLogin = async (data) => {
245
+ try {
246
+ const response = await NexusAuthApi.login(data.username, data.password);
247
+ console.log("Login successful:", response);
248
+ toast.success('Login successful.');
249
+ // Save username and token to localStorage
250
+ localStorage.setItem("me", response.username);
251
+ localStorage.setItem("s_tkn", response.access_token);
252
+ localStorage.setItem("u_id", response.user_id);
253
+
254
+ setIsLoggedIn(true);
255
+ } catch (error) {
256
+ console.error("Login failed:", error);
257
+ toast.error("Login failed");
258
+ }
259
  };
260
 
261
+ if (isLoading) {
262
+ return <SplashScreen />;
263
+ }
264
+
265
  return (
266
  <div>
267
+ {isLoggedIn ? (
268
+ children
269
+ ) : (
270
+ <div className="nexus-auth-signup-login">
271
+ <h1>Nexus Accounts</h1>
272
+ <button onClick={() => setIsSignup(!isSignup)}>
273
+ {isSignup ? "Already have an Account? Login" : "Don't have an Account? Signup"}
274
+ </button>
275
+ {isSignup ? (
276
+ <SignupForm onSignup={handleSignup} />
277
+ ) : (
278
+ <LoginForm onLogin={handleLogin} />
279
+ )}
280
+ </div>
281
+ )}
282
  </div>
283
  );
284
+ };
frontend/app/components/SplashScreen.js ADDED
@@ -0,0 +1,21 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ const SplashScreen = () => {
2
+ const splashScreenStyle = {
3
+ display: 'flex',
4
+ justifyContent: 'center',
5
+ alignItems: 'center',
6
+ height: '100vh',
7
+ width: '100vw',
8
+ backgroundColor: '#282c34',
9
+ color: 'white',
10
+ fontSize: '2rem',
11
+ fontFamily: 'Arial, sans-serif',
12
+ };
13
+
14
+ return (
15
+ <div style={splashScreenStyle}>
16
+ <h1>Loading...</h1>
17
+ </div>
18
+ );
19
+ };
20
+
21
+ export default SplashScreen;
frontend/app/globals.css CHANGED
@@ -1,21 +1,30 @@
 
 
 
 
1
  :root {
2
- --background: #1e1e2f;
3
- --foreground: #e0e0e0;
4
- --primary: #3a3a5f;
5
- --secondary: #2a2a4f;
6
  --accent: #4a4a7f;
 
 
 
 
7
  }
8
 
9
  html,
10
  body {
11
  max-width: 100vw;
 
12
  overflow-x: hidden;
13
  }
14
 
15
  body {
16
  color: var(--foreground);
17
  background: var(--background);
18
- font-family: Arial, Helvetica, sans-serif;
19
  -webkit-font-smoothing: antialiased;
20
  -moz-osx-font-smoothing: grayscale;
21
  }
@@ -27,32 +36,184 @@ body {
27
  }
28
 
29
  a {
30
- color: var(--accent);
31
  text-decoration: none;
 
 
 
 
 
32
  }
33
 
34
- button {
 
 
35
  background-color: var(--primary);
36
  color: var(--foreground);
37
- border: none;
38
- padding: 10px 20px;
39
- cursor: pointer;
40
- font-size: 1rem;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
41
  }
42
 
43
- button:hover {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
44
  background-color: var(--secondary);
45
  }
46
 
47
- input {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
48
  background-color: var(--secondary);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
49
  color: var(--foreground);
50
- border: 1px solid var(--primary);
51
- padding: 10px;
52
- font-size: 1rem;
53
  }
54
 
55
- input:focus {
56
- border-color: var(--accent);
57
- outline: none;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
58
  }
 
1
+ @tailwind base;
2
+ @tailwind components;
3
+ @tailwind utilities;
4
+
5
  :root {
6
+ --background: #121212; /* Deeper dark background */
7
+ --foreground: #E0E0E0; /* Light gray text */
8
+ --primary: #1F1F2A; /* Darker primary for sidebar */
9
+ --secondary: #2A2A3B; /* Soft secondary background for content */
10
  --accent: #4a4a7f;
11
+ --hover-accent: #5c5c8a; /* Slightly lighter accent color for hover */
12
+ --button-background: #3A3A4C; /* Button background */
13
+ --button-hover: #2D2D38; /* Darker button hover */
14
+ --shadow-dark: rgba(0, 0, 0, 0.15); /* Shadow for depth */
15
  }
16
 
17
  html,
18
  body {
19
  max-width: 100vw;
20
+ height: 100%;
21
  overflow-x: hidden;
22
  }
23
 
24
  body {
25
  color: var(--foreground);
26
  background: var(--background);
27
+ font-family: 'Inter', sans-serif;
28
  -webkit-font-smoothing: antialiased;
29
  -moz-osx-font-smoothing: grayscale;
30
  }
 
36
  }
37
 
38
  a {
 
39
  text-decoration: none;
40
+ color: inherit;
41
+ }
42
+
43
+ a:hover {
44
+ text-decoration: underline;
45
  }
46
 
47
+ /* Sidebar */
48
+ .sidebar {
49
+ width: 280px;
50
  background-color: var(--primary);
51
  color: var(--foreground);
52
+ padding: 30px;
53
+ position: fixed;
54
+ height: 100vh;
55
+ display: flex;
56
+ flex-direction: column;
57
+ border-right: 1px solid rgba(255, 255, 255, 0.1);
58
+ }
59
+
60
+ .sidebar .logo {
61
+ font-size: 2rem;
62
+ font-weight: bold;
63
+ margin-bottom: 40px;
64
+ color: var(--foreground);
65
+ }
66
+
67
+ .logo-container {
68
+ display: flex;
69
+ flex-direction: column;
70
+ align-items: left;
71
+ justify-content: center;
72
+ }
73
+
74
+ .version {
75
+ color: var(--hover-accent);
76
+ font-size: 0.8em;
77
+ margin-top: 20px;
78
+ text-align: end;
79
+ }
80
+
81
+ .sidebar .nav-links {
82
+ list-style-type: none;
83
+ margin-top: 20px;
84
  }
85
 
86
+ .sidebar .nav-links li {
87
+ margin-bottom: 24px;
88
+ }
89
+
90
+ .sidebar .nav-links a {
91
+ color: var(--foreground);
92
+ font-size: 1.2em;
93
+ transition: all 0.3s ease;
94
+ }
95
+
96
+ .sidebar .nav-links a:hover {
97
+ color: var(--accent);
98
+ transform: scale(1.05);
99
+ }
100
+
101
+ /* Content Area */
102
+ .content {
103
+ margin-left: 280px;
104
+ padding: 30px;
105
+ flex-grow: 1;
106
+ height: 100vh;
107
+ overflow-y: auto;
108
  background-color: var(--secondary);
109
  }
110
 
111
+ /* Header */
112
+ .header {
113
+ margin-bottom: 40px;
114
+ }
115
+
116
+ .header h1 {
117
+ color: var(--foreground);
118
+ font-size: 2.5rem;
119
+ font-weight: 600;
120
+ margin-bottom: 10px;
121
+ }
122
+
123
+ /* Main content */
124
+ .main-content {
125
+ display: flex;
126
+ justify-content: center;
127
+ align-items: center;
128
+ flex-direction: column;
129
+ }
130
+
131
+ .user-info-card {
132
  background-color: var(--secondary);
133
+ padding: 40px;
134
+ border-radius: 12px;
135
+ box-shadow: 0 4px 12px var(--shadow-dark);
136
+ text-align: center;
137
+ width: 500px;
138
+ margin-bottom: 30px;
139
+ transition: all 0.3s ease-in-out;
140
+ }
141
+
142
+ .user-info-card:hover {
143
+ transform: translateY(-5px);
144
+ box-shadow: 0 8px 16px rgba(0, 0, 0, 0.2);
145
+ }
146
+
147
+ .user-info-card h3 {
148
+ font-size: 1.8em;
149
+ color: var(--accent);
150
+ margin-bottom: 20px;
151
+ }
152
+
153
+ .user-info-card p {
154
  color: var(--foreground);
155
+ margin-bottom: 20px;
 
 
156
  }
157
 
158
+ .logout-button {
159
+ padding: 12px 24px;
160
+ background-color: var(--button-background);
161
+ color: var(--foreground);
162
+ border: none;
163
+ border-radius: 8px;
164
+ font-size: 1.1em;
165
+ cursor: pointer;
166
+ transition: background-color 0.3s ease;
167
+ }
168
+
169
+ .logout-button:hover {
170
+ background-color: var(--button-hover);
171
+ }
172
+
173
+ /* Login Prompt */
174
+ .login-prompt {
175
+ text-align: center;
176
+ color: var(--foreground);
177
+ font-size: 1.3em;
178
+ margin-top: 40px;
179
+ }
180
+
181
+ .login-prompt a {
182
+ color: var(--accent);
183
+ text-decoration: none;
184
+ }
185
+
186
+ .login-prompt a:hover {
187
+ text-decoration: underline;
188
+ }
189
+
190
+ /* Responsive Design */
191
+ @media (max-width: 1024px) {
192
+ .sidebar {
193
+ width: 240px;
194
+ padding: 20px;
195
+ }
196
+
197
+ .content {
198
+ margin-left: 240px;
199
+ }
200
+
201
+ .user-info-card {
202
+ width: 90%;
203
+ }
204
+ }
205
+
206
+ @media (max-width: 768px) {
207
+ .sidebar {
208
+ width: 200px;
209
+ padding: 15px;
210
+ }
211
+
212
+ .content {
213
+ margin-left: 200px;
214
+ }
215
+
216
+ .user-info-card {
217
+ width: 90%;
218
+ }
219
  }
frontend/app/layout.js CHANGED
@@ -1,6 +1,9 @@
 
1
  import { Geist, Geist_Mono } from "next/font/google";
2
  import "./globals.css";
3
  import { NexusAuthWrapper } from "./components/NexusAuth";
 
 
4
 
5
  const geistSans = Geist({
6
  variable: "--font-geist-sans",
@@ -16,7 +19,26 @@ export default function RootLayout({ children }) {
16
  return (
17
  <html lang="en">
18
  <body className={`${geistSans.variable} ${geistMono.variable}`}>
19
- <NexusAuthWrapper>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
20
  {children}
21
  </NexusAuthWrapper>
22
  </body>
 
1
+ 'use client';
2
  import { Geist, Geist_Mono } from "next/font/google";
3
  import "./globals.css";
4
  import { NexusAuthWrapper } from "./components/NexusAuth";
5
+ import { ToastContainer, toast, Flip } from 'react-toastify';
6
+ import { CheckCircleIcon, InformationCircleIcon, ExclamationCircleIcon } from '@heroicons/react/20/solid';
7
 
8
  const geistSans = Geist({
9
  variable: "--font-geist-sans",
 
19
  return (
20
  <html lang="en">
21
  <body className={`${geistSans.variable} ${geistMono.variable}`}>
22
+ <ToastContainer
23
+ transition={Flip}
24
+ theme="dark"
25
+ icon={({ type, theme }) => {
26
+ // theme is not used in this example but you could
27
+ switch (type) {
28
+ case 'info':
29
+ return <InformationCircleIcon className="text-indigo-400" />;
30
+ case 'error':
31
+ return <InformationCircleIcon className="text-red-500" />;
32
+ case 'success':
33
+ return <CheckCircleIcon className="h-5 w-5 text-green-500" />;
34
+ case 'warning':
35
+ return <ExclamationCircleIcon className="text-yellow-500" />;
36
+ default:
37
+ return null;
38
+ }
39
+ }}
40
+ />
41
+ <NexusAuthWrapper toast={toast}>
42
  {children}
43
  </NexusAuthWrapper>
44
  </body>
frontend/app/lib/Nexus_Auth_API.js CHANGED
@@ -1,66 +1,195 @@
1
- import axios from 'axios';
2
-
3
- const BASE_URL = 'http://localhost:YOUR_API_SERVER_PORT/v1/api/auth';
4
-
5
- export const signup = async (username, password, email) => {
6
- try {
7
- const response = await axios.post(`${BASE_URL}/signup`, {
8
- username,
9
- password,
10
- email,
11
- });
12
- return response.data;
13
- } catch (error) {
14
- throw new Error(error.response.data.detail);
15
- }
16
- };
17
 
18
- export const login = async (username, password) => {
19
- try {
20
- const response = await axios.post(`${BASE_URL}/login`, {
21
- username,
22
- password,
23
- });
24
- return response.data;
25
- } catch (error) {
26
- throw new Error(error.response.data.detail);
27
  }
28
- };
29
 
30
- export const logout = async (userId, token) => {
31
- try {
32
- await axios.post(`${BASE_URL}/logout`, {
33
- user_id: userId,
34
- token,
35
- });
36
- } catch (error) {
37
- console.error(error); // Handle logout errors gracefully
38
- }
39
- };
40
 
41
- export const validateToken = async (userId, token) => {
42
- try {
43
- const response = await axios.get(`${BASE_URL}/validate`, {
44
- params: {
45
- user_id: userId,
46
- token,
47
- },
48
- });
49
- return response.data;
50
- } catch (error) {
51
- throw new Error(error.response.data.detail);
52
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
53
  };
54
 
55
- export const updateUser = async (userId, token, updateData) => {
56
- try {
57
- const response = await axios.put(`${BASE_URL}/user/update`, updateData, {
58
- headers: {
59
- Authorization: `Bearer ${token}`,
60
- },
61
- });
62
- return response.data;
63
- } catch (error) {
64
- throw new Error(error.response.data.detail);
65
- }
66
- };
 
1
+ import axios from "axios";
2
+ import { API_BASE_URL, DEBUG } from "./config";
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3
 
4
+ function debugLog(message, data = null) {
5
+ if (DEBUG) {
6
+ console.log(`[DEBUG] ${message}`);
7
+ if (data) {
8
+ console.log(data);
9
+ }
 
 
 
10
  }
11
+ }
12
 
13
+ const NexusAuthApi = {
14
+ async signup(username, password, email = null) {
15
+ debugLog("Attempting signup", { username, email });
 
 
 
 
 
 
 
16
 
17
+ try {
18
+ // Construct the payload dynamically to exclude `email` if it's null
19
+ const payload = { username, password };
20
+ if (email) {
21
+ payload.email = email;
22
+ }
23
+
24
+ const response = await axios.post(`${API_BASE_URL}/auth/signup`, payload);
25
+ debugLog("Signup successful", response.data);
26
+ return response.data;
27
+ } catch (error) {
28
+ debugLog("Signup failed", error.response?.data || error.message);
29
+ throw error.response?.data || error.message;
30
+ }
31
+ },
32
+
33
+ async login(username, password) {
34
+ debugLog("Attempting login", { username });
35
+ try {
36
+ const response = await axios.post(
37
+ `${API_BASE_URL}/auth/login`,
38
+ { username, password }
39
+ );
40
+ debugLog("Login successful", response.data);
41
+ return response.data;
42
+ } catch (error) {
43
+ debugLog("Login failed", error.response?.data || error.message);
44
+ throw error.response?.data || error.message;
45
+ }
46
+ },
47
+
48
+ async logout(userId, token) {
49
+ debugLog("Attempting logout", { userId });
50
+ try {
51
+ const response = await axios.post(
52
+ `${API_BASE_URL}/auth/logout?user_id=${encodeURIComponent(userId)}&token=${encodeURIComponent(token)}`
53
+ );
54
+ debugLog("Logout successful", response.data);
55
+ return response.data;
56
+ } catch (error) {
57
+ debugLog("Logout failed", error.response?.data || error.message);
58
+ throw error.response?.data || error.message;
59
+ }
60
+ },
61
+
62
+
63
+ async validateToken(userId, token) {
64
+ debugLog("Validating token", { userId, token });
65
+ try {
66
+ const response = await axios.get(
67
+ `${API_BASE_URL}/auth/validate?user_id=${encodeURIComponent(userId)}&token=${encodeURIComponent(token)}`
68
+ );
69
+ debugLog("Token validation successful", response.data);
70
+ return response.data;
71
+ } catch (error) {
72
+ debugLog("Token validation failed", error.response?.data || error.message);
73
+ throw error.response?.data || error.message;
74
+ }
75
+ },
76
+
77
+
78
+ async searchUsers(query) {
79
+ debugLog("Searching users", { query });
80
+ try {
81
+ const response = await axios.get(`${API_BASE_URL}/auth/search-users`, {
82
+ params: { query },
83
+ });
84
+ debugLog("User search successful", response.data);
85
+ return response.data;
86
+ } catch (error) {
87
+ debugLog("User search failed", error.response?.data || error.message);
88
+ throw error.response?.data || error.message;
89
+ }
90
+ },
91
+
92
+ async isUsernameAvailable(query) {
93
+ debugLog("Searching users", { query });
94
+ try {
95
+ const response = await axios.get(`${API_BASE_URL}/auth/is-username-available`, {
96
+ params: { query },
97
+ });
98
+ debugLog("User search successful", response.data);
99
+ return response.data;
100
+ } catch (error) {
101
+ debugLog("User search failed", error.response?.data || error.message);
102
+ throw error.response?.data || error.message;
103
+ }
104
+ },
105
+
106
+ async getUserId(username) {
107
+ debugLog("Fetching user ID", { username });
108
+ try {
109
+ const response = await axios.get(`${API_BASE_URL}/auth/get-user-id`, {
110
+ params: { username },
111
+ });
112
+ debugLog("User ID fetch successful", response.data);
113
+ return response.data;
114
+ } catch (error) {
115
+ debugLog("User ID fetch failed", error.response?.data || error.message);
116
+ throw error.response?.data || error.message;
117
+ }
118
+ },
119
+
120
+ async getAllUsers(adminId, token) {
121
+ debugLog("Fetching all users", { adminId });
122
+ try {
123
+ const response = await axios.get(`${API_BASE_URL}/admin/users`, {
124
+ params: { user_id: adminId, token }
125
+ });
126
+ debugLog("Fetch all users successful", response.data);
127
+ return response.data;
128
+ } catch (error) {
129
+ debugLog("Fetch all users failed", error.response?.data || error.message);
130
+ throw error.response?.data || error.message;
131
+ }
132
+ },
133
+
134
+ async getUser(adminId, token, userId) {
135
+ debugLog("Fetching user details", { adminId, userId });
136
+ try {
137
+ const response = await axios.get(`${API_BASE_URL}/admin/user/${userId}`, {
138
+ params: { admin_id: adminId, token },
139
+ });
140
+ debugLog("Fetch user details successful", response.data);
141
+ return response.data;
142
+ } catch (error) {
143
+ debugLog("Fetch user details failed", error.response?.data || error.message);
144
+ throw error.response?.data || error.message;
145
+ }
146
+ },
147
+
148
+ async updateUser(adminId, token, userId, updateData) {
149
+ debugLog("Updating user", { adminId, userId, updateData });
150
+ try {
151
+ const response = await axios.put(`${API_BASE_URL}/admin/user/${userId}`, updateData, {
152
+ params: { admin_id: adminId, token }
153
+ });
154
+ debugLog("Update user successful", response.data);
155
+ return response.data;
156
+ } catch (error) {
157
+ debugLog("Update user failed", error.response?.data || error.message);
158
+ throw error.response?.data || error.message;
159
+ }
160
+ },
161
+
162
+ async updateAccessLevel(adminId, token, userId, accessLevel) {
163
+ debugLog("Updating access level", { adminId, userId, accessLevel });
164
+ try {
165
+ const response = await axios.put(
166
+ `${API_BASE_URL}/admin/user/${userId}/access-level`,
167
+ { access_level: accessLevel },
168
+ {
169
+ params: { admin_id: adminId, token }
170
+ }
171
+ );
172
+ debugLog("Update access level successful", response.data);
173
+ return response.data;
174
+ } catch (error) {
175
+ debugLog("Update access level failed", error.response?.data || error.message);
176
+ throw error.response?.data || error.message;
177
+ }
178
+ },
179
+
180
+ async updateOwnData(userId, updateData, token) {
181
+ debugLog("Updating own data", { userId, updateData });
182
+ try {
183
+ const response = await axios.put(`${API_BASE_URL}/auth/user/update`, updateData, {
184
+ params: { user_id: userId, token },
185
+ });
186
+ debugLog("Update own data successful", response.data);
187
+ return response.data;
188
+ } catch (error) {
189
+ debugLog("Update own data failed", error.response?.data || error.message);
190
+ throw error.response?.data || error.message;
191
+ }
192
+ },
193
  };
194
 
195
+ export default NexusAuthApi;
 
 
 
 
 
 
 
 
 
 
 
frontend/app/lib/config.js ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ export const API_BASE_URL = "https://hans-r-d-auth-nexus.hf.space/v1/api";
2
+ export const DEBUG = true; // Toggle for enabling/disabling debugging
3
+ export const VERSION = "0.0.1 Debug";
frontend/app/page.js CHANGED
@@ -1,95 +1,71 @@
1
- import Image from "next/image";
2
- import styles from "./page.module.css";
 
 
3
 
4
  export default function Home() {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5
  return (
6
- <div className={styles.page}>
7
- <main className={styles.main}>
8
- <Image
9
- className={styles.logo}
10
- src="/next.svg"
11
- alt="Next.js logo"
12
- width={180}
13
- height={38}
14
- priority
15
- />
16
- <ol>
17
- <li>
18
- Get started by editing <code>app/page.js</code>.
19
- </li>
20
- <li>Save and see your changes instantly.</li>
21
- </ol>
 
 
22
 
23
- <div className={styles.ctas}>
24
- <a
25
- className={styles.primary}
26
- href="https://vercel.com/new?utm_source=create-next-app&utm_medium=appdir-template&utm_campaign=create-next-app"
27
- target="_blank"
28
- rel="noopener noreferrer"
29
- >
30
- <Image
31
- className={styles.logo}
32
- src="/vercel.svg"
33
- alt="Vercel logomark"
34
- width={20}
35
- height={20}
36
- />
37
- Deploy now
38
- </a>
39
- <a
40
- href="https://nextjs.org/docs?utm_source=create-next-app&utm_medium=appdir-template&utm_campaign=create-next-app"
41
- target="_blank"
42
- rel="noopener noreferrer"
43
- className={styles.secondary}
44
- >
45
- Read our docs
46
- </a>
47
  </div>
48
- </main>
49
- <footer className={styles.footer}>
50
- <a
51
- href="https://nextjs.org/learn?utm_source=create-next-app&utm_medium=appdir-template&utm_campaign=create-next-app"
52
- target="_blank"
53
- rel="noopener noreferrer"
54
- >
55
- <Image
56
- aria-hidden
57
- src="/file.svg"
58
- alt="File icon"
59
- width={16}
60
- height={16}
61
- />
62
- Learn
63
- </a>
64
- <a
65
- href="https://vercel.com/templates?framework=next.js&utm_source=create-next-app&utm_medium=appdir-template&utm_campaign=create-next-app"
66
- target="_blank"
67
- rel="noopener noreferrer"
68
- >
69
- <Image
70
- aria-hidden
71
- src="/window.svg"
72
- alt="Window icon"
73
- width={16}
74
- height={16}
75
- />
76
- Examples
77
- </a>
78
- <a
79
- href="https://nextjs.org?utm_source=create-next-app&utm_medium=appdir-template&utm_campaign=create-next-app"
80
- target="_blank"
81
- rel="noopener noreferrer"
82
- >
83
- <Image
84
- aria-hidden
85
- src="/globe.svg"
86
- alt="Globe icon"
87
- width={16}
88
- height={16}
89
- />
90
- Go to nextjs.org →
91
- </a>
92
- </footer>
93
  </div>
94
  );
95
  }
 
1
+ 'use client';
2
+ import { useState, useEffect } from "react";
3
+ import NexusAuthApi from "./lib/Nexus_Auth_API";
4
+ import { VERSION } from "./lib/config";
5
 
6
  export default function Home() {
7
+ const [username, setUsername] = useState(null);
8
+ const [userID, setUserID] = useState(null);
9
+ const [token, setToken] = useState(null);
10
+
11
+ useEffect(() => {
12
+ setUsername(localStorage.getItem('me'));
13
+ setUserID(localStorage.getItem('u_id'));
14
+ setToken(localStorage.getItem('s_tkn'));
15
+ }, []);
16
+
17
+ const clearLocalStorage = () => {
18
+ localStorage.removeItem('me');
19
+ localStorage.removeItem('s_tkn');
20
+ localStorage.removeItem('u_id');
21
+ setUsername(null);
22
+ };
23
+
24
+ const handleLogout = () => {
25
+ NexusAuthApi.logout(userID, token)
26
+ .then(() => {
27
+ clearLocalStorage();
28
+ window.location.reload();
29
+ })
30
+ .catch((error) => {
31
+ console.error("Logout failed", error);
32
+ });
33
+ };
34
+
35
  return (
36
+ <div className="dashboard-container">
37
+ <div className="sidebar">
38
+ <div className="logo-container">
39
+ <sup className="version">{VERSION}</sup>
40
+ <h2 className="logo">Nexus Auth</h2>
41
+
42
+ </div>
43
+ <ul className="nav-links">
44
+ <li><a href="/profile">Profile</a></li>
45
+ <li><a href="/settings">Settings</a></li>
46
+ <li><a href="/support">Support</a></li>
47
+ </ul>
48
+ </div>
49
+
50
+ <div className="content">
51
+ <header className="header">
52
+ <h1>Welcome to Your Dashboard</h1>
53
+ </header>
54
 
55
+ <div className="main-content">
56
+ {username ? (
57
+ <div className="user-info-card">
58
+ <h3>Hello, <strong>{username}</strong></h3>
59
+ <p>User ID: <strong>{userID}</strong></p>
60
+ <button onClick={handleLogout} className="logout-button">Logout</button>
61
+ </div>
62
+ ) : (
63
+ <div className="login-prompt">
64
+ <p>You are not logged in. Please <a href="/login">login</a> to access your account.</p>
65
+ </div>
66
+ )}
 
 
 
 
 
 
 
 
 
 
 
 
67
  </div>
68
+ </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
69
  </div>
70
  );
71
  }
frontend/package-lock.json CHANGED
@@ -8,9 +8,30 @@
8
  "name": "frontend",
9
  "version": "0.1.0",
10
  "dependencies": {
 
 
11
  "next": "15.1.5",
12
  "react": "^19.0.0",
13
- "react-dom": "^19.0.0"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
14
  }
15
  },
16
  "node_modules/@emnapi/runtime": {
@@ -23,6 +44,15 @@
23
  "tslib": "^2.4.0"
24
  }
25
  },
 
 
 
 
 
 
 
 
 
26
  "node_modules/@img/sharp-darwin-arm64": {
27
  "version": "0.33.5",
28
  "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz",
@@ -384,6 +414,77 @@
384
  "url": "https://opencollective.com/libvips"
385
  }
386
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
387
  "node_modules/@next/env": {
388
  "version": "15.1.5",
389
  "resolved": "https://registry.npmjs.org/@next/env/-/env-15.1.5.tgz",
@@ -518,6 +619,55 @@
518
  "node": ">= 10"
519
  }
520
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
521
  "node_modules/@swc/counter": {
522
  "version": "0.1.3",
523
  "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz",
@@ -533,6 +683,191 @@
533
  "tslib": "^2.8.0"
534
  }
535
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
536
  "node_modules/busboy": {
537
  "version": "1.6.0",
538
  "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz",
@@ -544,6 +879,16 @@
544
  "node": ">=10.16.0"
545
  }
546
  },
 
 
 
 
 
 
 
 
 
 
547
  "node_modules/caniuse-lite": {
548
  "version": "1.0.30001695",
549
  "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001695.tgz",
@@ -564,12 +909,59 @@
564
  ],
565
  "license": "CC-BY-4.0"
566
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
567
  "node_modules/client-only": {
568
  "version": "0.0.1",
569
  "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz",
570
  "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==",
571
  "license": "MIT"
572
  },
 
 
 
 
 
 
 
 
 
573
  "node_modules/color": {
574
  "version": "4.2.3",
575
  "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz",
@@ -588,8 +980,8 @@
588
  "version": "2.0.1",
589
  "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
590
  "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
 
591
  "license": "MIT",
592
- "optional": true,
593
  "dependencies": {
594
  "color-name": "~1.1.4"
595
  },
@@ -601,8 +993,8 @@
601
  "version": "1.1.4",
602
  "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
603
  "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
604
- "license": "MIT",
605
- "optional": true
606
  },
607
  "node_modules/color-string": {
608
  "version": "1.9.1",
@@ -615,6 +1007,65 @@
615
  "simple-swizzle": "^0.2.2"
616
  }
617
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
618
  "node_modules/detect-libc": {
619
  "version": "2.0.3",
620
  "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz",
@@ -625,47 +1076,497 @@
625
  "node": ">=8"
626
  }
627
  },
628
- "node_modules/is-arrayish": {
629
- "version": "0.3.2",
630
- "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
631
- "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==",
632
- "license": "MIT",
633
- "optional": true
634
  },
635
- "node_modules/nanoid": {
636
- "version": "3.3.8",
637
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz",
638
- "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==",
639
- "funding": [
640
- {
641
- "type": "github",
642
- "url": "https://github.com/sponsors/ai"
643
- }
644
- ],
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
645
  "license": "MIT",
646
- "bin": {
647
- "nanoid": "bin/nanoid.cjs"
648
- },
649
  "engines": {
650
- "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
651
  }
652
  },
653
- "node_modules/next": {
654
- "version": "15.1.5",
655
- "resolved": "https://registry.npmjs.org/next/-/next-15.1.5.tgz",
656
- "integrity": "sha512-Cf/TEegnt01hn3Hoywh6N8fvkhbOuChO4wFje24+a86wKOubgVaWkDqxGVgoWlz2Hp9luMJ9zw3epftujdnUOg==",
 
657
  "license": "MIT",
658
  "dependencies": {
659
- "@next/env": "15.1.5",
660
- "@swc/counter": "0.1.3",
661
- "@swc/helpers": "0.5.15",
662
- "busboy": "1.6.0",
663
- "caniuse-lite": "^1.0.30001579",
664
- "postcss": "8.4.31",
665
- "styled-jsx": "5.1.6"
666
  },
667
- "bin": {
668
- "next": "dist/bin/next"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
669
  },
670
  "engines": {
671
  "node": "^18.18.0 || ^19.8.0 || >= 20.0.0"
@@ -704,39 +1605,337 @@
704
  }
705
  }
706
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
707
  "node_modules/picocolors": {
708
  "version": "1.1.1",
709
  "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
710
  "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
711
  "license": "ISC"
712
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
713
  "node_modules/postcss": {
714
- "version": "8.4.31",
715
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz",
716
- "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==",
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
717
  "funding": [
718
  {
719
- "type": "opencollective",
720
- "url": "https://opencollective.com/postcss/"
721
  },
722
  {
723
- "type": "tidelift",
724
- "url": "https://tidelift.com/funding/github/npm/postcss"
725
  },
726
  {
727
- "type": "github",
728
- "url": "https://github.com/sponsors/ai"
729
  }
730
  ],
731
- "license": "MIT",
732
- "dependencies": {
733
- "nanoid": "^3.3.6",
734
- "picocolors": "^1.0.0",
735
- "source-map-js": "^1.0.2"
736
- },
737
- "engines": {
738
- "node": "^10 || ^12 || >=14"
739
- }
740
  },
741
  "node_modules/react": {
742
  "version": "19.0.0",
@@ -759,6 +1958,98 @@
759
  "react": "^19.0.0"
760
  }
761
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
762
  "node_modules/scheduler": {
763
  "version": "0.25.0",
764
  "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.25.0.tgz",
@@ -818,6 +2109,42 @@
818
  "@img/sharp-win32-x64": "0.33.5"
819
  }
820
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
821
  "node_modules/simple-swizzle": {
822
  "version": "0.2.2",
823
  "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
@@ -845,6 +2172,110 @@
845
  "node": ">=10.0.0"
846
  }
847
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
848
  "node_modules/styled-jsx": {
849
  "version": "5.1.6",
850
  "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz",
@@ -868,11 +2299,293 @@
868
  }
869
  }
870
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
871
  "node_modules/tslib": {
872
  "version": "2.8.1",
873
  "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
874
  "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
875
  "license": "0BSD"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
876
  }
877
  }
878
  }
 
8
  "name": "frontend",
9
  "version": "0.1.0",
10
  "dependencies": {
11
+ "@heroicons/react": "^2.2.0",
12
+ "axios": "^1.7.9",
13
  "next": "15.1.5",
14
  "react": "^19.0.0",
15
+ "react-dom": "^19.0.0",
16
+ "react-toastify": "^11.0.3"
17
+ },
18
+ "devDependencies": {
19
+ "autoprefixer": "^10.4.20",
20
+ "postcss": "^8.5.1",
21
+ "tailwindcss": "^3.4.17"
22
+ }
23
+ },
24
+ "node_modules/@alloc/quick-lru": {
25
+ "version": "5.2.0",
26
+ "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz",
27
+ "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==",
28
+ "dev": true,
29
+ "license": "MIT",
30
+ "engines": {
31
+ "node": ">=10"
32
+ },
33
+ "funding": {
34
+ "url": "https://github.com/sponsors/sindresorhus"
35
  }
36
  },
37
  "node_modules/@emnapi/runtime": {
 
44
  "tslib": "^2.4.0"
45
  }
46
  },
47
+ "node_modules/@heroicons/react": {
48
+ "version": "2.2.0",
49
+ "resolved": "https://registry.npmjs.org/@heroicons/react/-/react-2.2.0.tgz",
50
+ "integrity": "sha512-LMcepvRaS9LYHJGsF0zzmgKCUim/X3N/DQKc4jepAXJ7l8QxJ1PmxJzqplF2Z3FE4PqBAIGyJAQ/w4B5dsqbtQ==",
51
+ "license": "MIT",
52
+ "peerDependencies": {
53
+ "react": ">= 16 || ^19.0.0-rc"
54
+ }
55
+ },
56
  "node_modules/@img/sharp-darwin-arm64": {
57
  "version": "0.33.5",
58
  "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz",
 
414
  "url": "https://opencollective.com/libvips"
415
  }
416
  },
417
+ "node_modules/@isaacs/cliui": {
418
+ "version": "8.0.2",
419
+ "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
420
+ "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
421
+ "dev": true,
422
+ "license": "ISC",
423
+ "dependencies": {
424
+ "string-width": "^5.1.2",
425
+ "string-width-cjs": "npm:string-width@^4.2.0",
426
+ "strip-ansi": "^7.0.1",
427
+ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
428
+ "wrap-ansi": "^8.1.0",
429
+ "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
430
+ },
431
+ "engines": {
432
+ "node": ">=12"
433
+ }
434
+ },
435
+ "node_modules/@jridgewell/gen-mapping": {
436
+ "version": "0.3.8",
437
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz",
438
+ "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==",
439
+ "dev": true,
440
+ "license": "MIT",
441
+ "dependencies": {
442
+ "@jridgewell/set-array": "^1.2.1",
443
+ "@jridgewell/sourcemap-codec": "^1.4.10",
444
+ "@jridgewell/trace-mapping": "^0.3.24"
445
+ },
446
+ "engines": {
447
+ "node": ">=6.0.0"
448
+ }
449
+ },
450
+ "node_modules/@jridgewell/resolve-uri": {
451
+ "version": "3.1.2",
452
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
453
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
454
+ "dev": true,
455
+ "license": "MIT",
456
+ "engines": {
457
+ "node": ">=6.0.0"
458
+ }
459
+ },
460
+ "node_modules/@jridgewell/set-array": {
461
+ "version": "1.2.1",
462
+ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
463
+ "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
464
+ "dev": true,
465
+ "license": "MIT",
466
+ "engines": {
467
+ "node": ">=6.0.0"
468
+ }
469
+ },
470
+ "node_modules/@jridgewell/sourcemap-codec": {
471
+ "version": "1.5.0",
472
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
473
+ "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
474
+ "dev": true,
475
+ "license": "MIT"
476
+ },
477
+ "node_modules/@jridgewell/trace-mapping": {
478
+ "version": "0.3.25",
479
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
480
+ "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
481
+ "dev": true,
482
+ "license": "MIT",
483
+ "dependencies": {
484
+ "@jridgewell/resolve-uri": "^3.1.0",
485
+ "@jridgewell/sourcemap-codec": "^1.4.14"
486
+ }
487
+ },
488
  "node_modules/@next/env": {
489
  "version": "15.1.5",
490
  "resolved": "https://registry.npmjs.org/@next/env/-/env-15.1.5.tgz",
 
619
  "node": ">= 10"
620
  }
621
  },
622
+ "node_modules/@nodelib/fs.scandir": {
623
+ "version": "2.1.5",
624
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
625
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
626
+ "dev": true,
627
+ "license": "MIT",
628
+ "dependencies": {
629
+ "@nodelib/fs.stat": "2.0.5",
630
+ "run-parallel": "^1.1.9"
631
+ },
632
+ "engines": {
633
+ "node": ">= 8"
634
+ }
635
+ },
636
+ "node_modules/@nodelib/fs.stat": {
637
+ "version": "2.0.5",
638
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
639
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
640
+ "dev": true,
641
+ "license": "MIT",
642
+ "engines": {
643
+ "node": ">= 8"
644
+ }
645
+ },
646
+ "node_modules/@nodelib/fs.walk": {
647
+ "version": "1.2.8",
648
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
649
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
650
+ "dev": true,
651
+ "license": "MIT",
652
+ "dependencies": {
653
+ "@nodelib/fs.scandir": "2.1.5",
654
+ "fastq": "^1.6.0"
655
+ },
656
+ "engines": {
657
+ "node": ">= 8"
658
+ }
659
+ },
660
+ "node_modules/@pkgjs/parseargs": {
661
+ "version": "0.11.0",
662
+ "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
663
+ "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
664
+ "dev": true,
665
+ "license": "MIT",
666
+ "optional": true,
667
+ "engines": {
668
+ "node": ">=14"
669
+ }
670
+ },
671
  "node_modules/@swc/counter": {
672
  "version": "0.1.3",
673
  "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz",
 
683
  "tslib": "^2.8.0"
684
  }
685
  },
686
+ "node_modules/ansi-regex": {
687
+ "version": "6.1.0",
688
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
689
+ "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
690
+ "dev": true,
691
+ "license": "MIT",
692
+ "engines": {
693
+ "node": ">=12"
694
+ },
695
+ "funding": {
696
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
697
+ }
698
+ },
699
+ "node_modules/ansi-styles": {
700
+ "version": "6.2.1",
701
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
702
+ "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
703
+ "dev": true,
704
+ "license": "MIT",
705
+ "engines": {
706
+ "node": ">=12"
707
+ },
708
+ "funding": {
709
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
710
+ }
711
+ },
712
+ "node_modules/any-promise": {
713
+ "version": "1.3.0",
714
+ "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
715
+ "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==",
716
+ "dev": true,
717
+ "license": "MIT"
718
+ },
719
+ "node_modules/anymatch": {
720
+ "version": "3.1.3",
721
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
722
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
723
+ "dev": true,
724
+ "license": "ISC",
725
+ "dependencies": {
726
+ "normalize-path": "^3.0.0",
727
+ "picomatch": "^2.0.4"
728
+ },
729
+ "engines": {
730
+ "node": ">= 8"
731
+ }
732
+ },
733
+ "node_modules/arg": {
734
+ "version": "5.0.2",
735
+ "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz",
736
+ "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==",
737
+ "dev": true,
738
+ "license": "MIT"
739
+ },
740
+ "node_modules/asynckit": {
741
+ "version": "0.4.0",
742
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
743
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
744
+ "license": "MIT"
745
+ },
746
+ "node_modules/autoprefixer": {
747
+ "version": "10.4.20",
748
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz",
749
+ "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==",
750
+ "dev": true,
751
+ "funding": [
752
+ {
753
+ "type": "opencollective",
754
+ "url": "https://opencollective.com/postcss/"
755
+ },
756
+ {
757
+ "type": "tidelift",
758
+ "url": "https://tidelift.com/funding/github/npm/autoprefixer"
759
+ },
760
+ {
761
+ "type": "github",
762
+ "url": "https://github.com/sponsors/ai"
763
+ }
764
+ ],
765
+ "license": "MIT",
766
+ "dependencies": {
767
+ "browserslist": "^4.23.3",
768
+ "caniuse-lite": "^1.0.30001646",
769
+ "fraction.js": "^4.3.7",
770
+ "normalize-range": "^0.1.2",
771
+ "picocolors": "^1.0.1",
772
+ "postcss-value-parser": "^4.2.0"
773
+ },
774
+ "bin": {
775
+ "autoprefixer": "bin/autoprefixer"
776
+ },
777
+ "engines": {
778
+ "node": "^10 || ^12 || >=14"
779
+ },
780
+ "peerDependencies": {
781
+ "postcss": "^8.1.0"
782
+ }
783
+ },
784
+ "node_modules/axios": {
785
+ "version": "1.7.9",
786
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz",
787
+ "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==",
788
+ "license": "MIT",
789
+ "dependencies": {
790
+ "follow-redirects": "^1.15.6",
791
+ "form-data": "^4.0.0",
792
+ "proxy-from-env": "^1.1.0"
793
+ }
794
+ },
795
+ "node_modules/balanced-match": {
796
+ "version": "1.0.2",
797
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
798
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
799
+ "dev": true,
800
+ "license": "MIT"
801
+ },
802
+ "node_modules/binary-extensions": {
803
+ "version": "2.3.0",
804
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
805
+ "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
806
+ "dev": true,
807
+ "license": "MIT",
808
+ "engines": {
809
+ "node": ">=8"
810
+ },
811
+ "funding": {
812
+ "url": "https://github.com/sponsors/sindresorhus"
813
+ }
814
+ },
815
+ "node_modules/brace-expansion": {
816
+ "version": "2.0.1",
817
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
818
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
819
+ "dev": true,
820
+ "license": "MIT",
821
+ "dependencies": {
822
+ "balanced-match": "^1.0.0"
823
+ }
824
+ },
825
+ "node_modules/braces": {
826
+ "version": "3.0.3",
827
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
828
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
829
+ "dev": true,
830
+ "license": "MIT",
831
+ "dependencies": {
832
+ "fill-range": "^7.1.1"
833
+ },
834
+ "engines": {
835
+ "node": ">=8"
836
+ }
837
+ },
838
+ "node_modules/browserslist": {
839
+ "version": "4.24.4",
840
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz",
841
+ "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==",
842
+ "dev": true,
843
+ "funding": [
844
+ {
845
+ "type": "opencollective",
846
+ "url": "https://opencollective.com/browserslist"
847
+ },
848
+ {
849
+ "type": "tidelift",
850
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
851
+ },
852
+ {
853
+ "type": "github",
854
+ "url": "https://github.com/sponsors/ai"
855
+ }
856
+ ],
857
+ "license": "MIT",
858
+ "dependencies": {
859
+ "caniuse-lite": "^1.0.30001688",
860
+ "electron-to-chromium": "^1.5.73",
861
+ "node-releases": "^2.0.19",
862
+ "update-browserslist-db": "^1.1.1"
863
+ },
864
+ "bin": {
865
+ "browserslist": "cli.js"
866
+ },
867
+ "engines": {
868
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
869
+ }
870
+ },
871
  "node_modules/busboy": {
872
  "version": "1.6.0",
873
  "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz",
 
879
  "node": ">=10.16.0"
880
  }
881
  },
882
+ "node_modules/camelcase-css": {
883
+ "version": "2.0.1",
884
+ "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz",
885
+ "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==",
886
+ "dev": true,
887
+ "license": "MIT",
888
+ "engines": {
889
+ "node": ">= 6"
890
+ }
891
+ },
892
  "node_modules/caniuse-lite": {
893
  "version": "1.0.30001695",
894
  "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001695.tgz",
 
909
  ],
910
  "license": "CC-BY-4.0"
911
  },
912
+ "node_modules/chokidar": {
913
+ "version": "3.6.0",
914
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
915
+ "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
916
+ "dev": true,
917
+ "license": "MIT",
918
+ "dependencies": {
919
+ "anymatch": "~3.1.2",
920
+ "braces": "~3.0.2",
921
+ "glob-parent": "~5.1.2",
922
+ "is-binary-path": "~2.1.0",
923
+ "is-glob": "~4.0.1",
924
+ "normalize-path": "~3.0.0",
925
+ "readdirp": "~3.6.0"
926
+ },
927
+ "engines": {
928
+ "node": ">= 8.10.0"
929
+ },
930
+ "funding": {
931
+ "url": "https://paulmillr.com/funding/"
932
+ },
933
+ "optionalDependencies": {
934
+ "fsevents": "~2.3.2"
935
+ }
936
+ },
937
+ "node_modules/chokidar/node_modules/glob-parent": {
938
+ "version": "5.1.2",
939
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
940
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
941
+ "dev": true,
942
+ "license": "ISC",
943
+ "dependencies": {
944
+ "is-glob": "^4.0.1"
945
+ },
946
+ "engines": {
947
+ "node": ">= 6"
948
+ }
949
+ },
950
  "node_modules/client-only": {
951
  "version": "0.0.1",
952
  "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz",
953
  "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==",
954
  "license": "MIT"
955
  },
956
+ "node_modules/clsx": {
957
+ "version": "2.1.1",
958
+ "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
959
+ "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==",
960
+ "license": "MIT",
961
+ "engines": {
962
+ "node": ">=6"
963
+ }
964
+ },
965
  "node_modules/color": {
966
  "version": "4.2.3",
967
  "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz",
 
980
  "version": "2.0.1",
981
  "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
982
  "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
983
+ "devOptional": true,
984
  "license": "MIT",
 
985
  "dependencies": {
986
  "color-name": "~1.1.4"
987
  },
 
993
  "version": "1.1.4",
994
  "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
995
  "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
996
+ "devOptional": true,
997
+ "license": "MIT"
998
  },
999
  "node_modules/color-string": {
1000
  "version": "1.9.1",
 
1007
  "simple-swizzle": "^0.2.2"
1008
  }
1009
  },
1010
+ "node_modules/combined-stream": {
1011
+ "version": "1.0.8",
1012
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
1013
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
1014
+ "license": "MIT",
1015
+ "dependencies": {
1016
+ "delayed-stream": "~1.0.0"
1017
+ },
1018
+ "engines": {
1019
+ "node": ">= 0.8"
1020
+ }
1021
+ },
1022
+ "node_modules/commander": {
1023
+ "version": "4.1.1",
1024
+ "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
1025
+ "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
1026
+ "dev": true,
1027
+ "license": "MIT",
1028
+ "engines": {
1029
+ "node": ">= 6"
1030
+ }
1031
+ },
1032
+ "node_modules/cross-spawn": {
1033
+ "version": "7.0.6",
1034
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
1035
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
1036
+ "dev": true,
1037
+ "license": "MIT",
1038
+ "dependencies": {
1039
+ "path-key": "^3.1.0",
1040
+ "shebang-command": "^2.0.0",
1041
+ "which": "^2.0.1"
1042
+ },
1043
+ "engines": {
1044
+ "node": ">= 8"
1045
+ }
1046
+ },
1047
+ "node_modules/cssesc": {
1048
+ "version": "3.0.0",
1049
+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
1050
+ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
1051
+ "dev": true,
1052
+ "license": "MIT",
1053
+ "bin": {
1054
+ "cssesc": "bin/cssesc"
1055
+ },
1056
+ "engines": {
1057
+ "node": ">=4"
1058
+ }
1059
+ },
1060
+ "node_modules/delayed-stream": {
1061
+ "version": "1.0.0",
1062
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
1063
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
1064
+ "license": "MIT",
1065
+ "engines": {
1066
+ "node": ">=0.4.0"
1067
+ }
1068
+ },
1069
  "node_modules/detect-libc": {
1070
  "version": "2.0.3",
1071
  "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz",
 
1076
  "node": ">=8"
1077
  }
1078
  },
1079
+ "node_modules/didyoumean": {
1080
+ "version": "1.2.2",
1081
+ "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz",
1082
+ "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==",
1083
+ "dev": true,
1084
+ "license": "Apache-2.0"
1085
  },
1086
+ "node_modules/dlv": {
1087
+ "version": "1.1.3",
1088
+ "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
1089
+ "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",
1090
+ "dev": true,
1091
+ "license": "MIT"
1092
+ },
1093
+ "node_modules/eastasianwidth": {
1094
+ "version": "0.2.0",
1095
+ "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
1096
+ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
1097
+ "dev": true,
1098
+ "license": "MIT"
1099
+ },
1100
+ "node_modules/electron-to-chromium": {
1101
+ "version": "1.5.84",
1102
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.84.tgz",
1103
+ "integrity": "sha512-I+DQ8xgafao9Ha6y0qjHHvpZ9OfyA1qKlkHkjywxzniORU2awxyz7f/iVJcULmrF2yrM3nHQf+iDjJtbbexd/g==",
1104
+ "dev": true,
1105
+ "license": "ISC"
1106
+ },
1107
+ "node_modules/emoji-regex": {
1108
+ "version": "9.2.2",
1109
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
1110
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
1111
+ "dev": true,
1112
+ "license": "MIT"
1113
+ },
1114
+ "node_modules/escalade": {
1115
+ "version": "3.2.0",
1116
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
1117
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
1118
+ "dev": true,
1119
  "license": "MIT",
 
 
 
1120
  "engines": {
1121
+ "node": ">=6"
1122
  }
1123
  },
1124
+ "node_modules/fast-glob": {
1125
+ "version": "3.3.3",
1126
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
1127
+ "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
1128
+ "dev": true,
1129
  "license": "MIT",
1130
  "dependencies": {
1131
+ "@nodelib/fs.stat": "^2.0.2",
1132
+ "@nodelib/fs.walk": "^1.2.3",
1133
+ "glob-parent": "^5.1.2",
1134
+ "merge2": "^1.3.0",
1135
+ "micromatch": "^4.0.8"
 
 
1136
  },
1137
+ "engines": {
1138
+ "node": ">=8.6.0"
1139
+ }
1140
+ },
1141
+ "node_modules/fast-glob/node_modules/glob-parent": {
1142
+ "version": "5.1.2",
1143
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
1144
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
1145
+ "dev": true,
1146
+ "license": "ISC",
1147
+ "dependencies": {
1148
+ "is-glob": "^4.0.1"
1149
+ },
1150
+ "engines": {
1151
+ "node": ">= 6"
1152
+ }
1153
+ },
1154
+ "node_modules/fastq": {
1155
+ "version": "1.18.0",
1156
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.18.0.tgz",
1157
+ "integrity": "sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==",
1158
+ "dev": true,
1159
+ "license": "ISC",
1160
+ "dependencies": {
1161
+ "reusify": "^1.0.4"
1162
+ }
1163
+ },
1164
+ "node_modules/fill-range": {
1165
+ "version": "7.1.1",
1166
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
1167
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
1168
+ "dev": true,
1169
+ "license": "MIT",
1170
+ "dependencies": {
1171
+ "to-regex-range": "^5.0.1"
1172
+ },
1173
+ "engines": {
1174
+ "node": ">=8"
1175
+ }
1176
+ },
1177
+ "node_modules/follow-redirects": {
1178
+ "version": "1.15.9",
1179
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz",
1180
+ "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==",
1181
+ "funding": [
1182
+ {
1183
+ "type": "individual",
1184
+ "url": "https://github.com/sponsors/RubenVerborgh"
1185
+ }
1186
+ ],
1187
+ "license": "MIT",
1188
+ "engines": {
1189
+ "node": ">=4.0"
1190
+ },
1191
+ "peerDependenciesMeta": {
1192
+ "debug": {
1193
+ "optional": true
1194
+ }
1195
+ }
1196
+ },
1197
+ "node_modules/foreground-child": {
1198
+ "version": "3.3.0",
1199
+ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz",
1200
+ "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==",
1201
+ "dev": true,
1202
+ "license": "ISC",
1203
+ "dependencies": {
1204
+ "cross-spawn": "^7.0.0",
1205
+ "signal-exit": "^4.0.1"
1206
+ },
1207
+ "engines": {
1208
+ "node": ">=14"
1209
+ },
1210
+ "funding": {
1211
+ "url": "https://github.com/sponsors/isaacs"
1212
+ }
1213
+ },
1214
+ "node_modules/form-data": {
1215
+ "version": "4.0.1",
1216
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz",
1217
+ "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==",
1218
+ "license": "MIT",
1219
+ "dependencies": {
1220
+ "asynckit": "^0.4.0",
1221
+ "combined-stream": "^1.0.8",
1222
+ "mime-types": "^2.1.12"
1223
+ },
1224
+ "engines": {
1225
+ "node": ">= 6"
1226
+ }
1227
+ },
1228
+ "node_modules/fraction.js": {
1229
+ "version": "4.3.7",
1230
+ "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz",
1231
+ "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==",
1232
+ "dev": true,
1233
+ "license": "MIT",
1234
+ "engines": {
1235
+ "node": "*"
1236
+ },
1237
+ "funding": {
1238
+ "type": "patreon",
1239
+ "url": "https://github.com/sponsors/rawify"
1240
+ }
1241
+ },
1242
+ "node_modules/fsevents": {
1243
+ "version": "2.3.3",
1244
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
1245
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
1246
+ "dev": true,
1247
+ "hasInstallScript": true,
1248
+ "license": "MIT",
1249
+ "optional": true,
1250
+ "os": [
1251
+ "darwin"
1252
+ ],
1253
+ "engines": {
1254
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
1255
+ }
1256
+ },
1257
+ "node_modules/function-bind": {
1258
+ "version": "1.1.2",
1259
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
1260
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
1261
+ "dev": true,
1262
+ "license": "MIT",
1263
+ "funding": {
1264
+ "url": "https://github.com/sponsors/ljharb"
1265
+ }
1266
+ },
1267
+ "node_modules/glob": {
1268
+ "version": "10.4.5",
1269
+ "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz",
1270
+ "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==",
1271
+ "dev": true,
1272
+ "license": "ISC",
1273
+ "dependencies": {
1274
+ "foreground-child": "^3.1.0",
1275
+ "jackspeak": "^3.1.2",
1276
+ "minimatch": "^9.0.4",
1277
+ "minipass": "^7.1.2",
1278
+ "package-json-from-dist": "^1.0.0",
1279
+ "path-scurry": "^1.11.1"
1280
+ },
1281
+ "bin": {
1282
+ "glob": "dist/esm/bin.mjs"
1283
+ },
1284
+ "funding": {
1285
+ "url": "https://github.com/sponsors/isaacs"
1286
+ }
1287
+ },
1288
+ "node_modules/glob-parent": {
1289
+ "version": "6.0.2",
1290
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
1291
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
1292
+ "dev": true,
1293
+ "license": "ISC",
1294
+ "dependencies": {
1295
+ "is-glob": "^4.0.3"
1296
+ },
1297
+ "engines": {
1298
+ "node": ">=10.13.0"
1299
+ }
1300
+ },
1301
+ "node_modules/hasown": {
1302
+ "version": "2.0.2",
1303
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
1304
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
1305
+ "dev": true,
1306
+ "license": "MIT",
1307
+ "dependencies": {
1308
+ "function-bind": "^1.1.2"
1309
+ },
1310
+ "engines": {
1311
+ "node": ">= 0.4"
1312
+ }
1313
+ },
1314
+ "node_modules/is-arrayish": {
1315
+ "version": "0.3.2",
1316
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
1317
+ "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==",
1318
+ "license": "MIT",
1319
+ "optional": true
1320
+ },
1321
+ "node_modules/is-binary-path": {
1322
+ "version": "2.1.0",
1323
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
1324
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
1325
+ "dev": true,
1326
+ "license": "MIT",
1327
+ "dependencies": {
1328
+ "binary-extensions": "^2.0.0"
1329
+ },
1330
+ "engines": {
1331
+ "node": ">=8"
1332
+ }
1333
+ },
1334
+ "node_modules/is-core-module": {
1335
+ "version": "2.16.1",
1336
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz",
1337
+ "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==",
1338
+ "dev": true,
1339
+ "license": "MIT",
1340
+ "dependencies": {
1341
+ "hasown": "^2.0.2"
1342
+ },
1343
+ "engines": {
1344
+ "node": ">= 0.4"
1345
+ },
1346
+ "funding": {
1347
+ "url": "https://github.com/sponsors/ljharb"
1348
+ }
1349
+ },
1350
+ "node_modules/is-extglob": {
1351
+ "version": "2.1.1",
1352
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
1353
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
1354
+ "dev": true,
1355
+ "license": "MIT",
1356
+ "engines": {
1357
+ "node": ">=0.10.0"
1358
+ }
1359
+ },
1360
+ "node_modules/is-fullwidth-code-point": {
1361
+ "version": "3.0.0",
1362
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
1363
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
1364
+ "dev": true,
1365
+ "license": "MIT",
1366
+ "engines": {
1367
+ "node": ">=8"
1368
+ }
1369
+ },
1370
+ "node_modules/is-glob": {
1371
+ "version": "4.0.3",
1372
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
1373
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
1374
+ "dev": true,
1375
+ "license": "MIT",
1376
+ "dependencies": {
1377
+ "is-extglob": "^2.1.1"
1378
+ },
1379
+ "engines": {
1380
+ "node": ">=0.10.0"
1381
+ }
1382
+ },
1383
+ "node_modules/is-number": {
1384
+ "version": "7.0.0",
1385
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
1386
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
1387
+ "dev": true,
1388
+ "license": "MIT",
1389
+ "engines": {
1390
+ "node": ">=0.12.0"
1391
+ }
1392
+ },
1393
+ "node_modules/isexe": {
1394
+ "version": "2.0.0",
1395
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
1396
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
1397
+ "dev": true,
1398
+ "license": "ISC"
1399
+ },
1400
+ "node_modules/jackspeak": {
1401
+ "version": "3.4.3",
1402
+ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
1403
+ "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
1404
+ "dev": true,
1405
+ "license": "BlueOak-1.0.0",
1406
+ "dependencies": {
1407
+ "@isaacs/cliui": "^8.0.2"
1408
+ },
1409
+ "funding": {
1410
+ "url": "https://github.com/sponsors/isaacs"
1411
+ },
1412
+ "optionalDependencies": {
1413
+ "@pkgjs/parseargs": "^0.11.0"
1414
+ }
1415
+ },
1416
+ "node_modules/jiti": {
1417
+ "version": "1.21.7",
1418
+ "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz",
1419
+ "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==",
1420
+ "dev": true,
1421
+ "license": "MIT",
1422
+ "bin": {
1423
+ "jiti": "bin/jiti.js"
1424
+ }
1425
+ },
1426
+ "node_modules/lilconfig": {
1427
+ "version": "3.1.3",
1428
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz",
1429
+ "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==",
1430
+ "dev": true,
1431
+ "license": "MIT",
1432
+ "engines": {
1433
+ "node": ">=14"
1434
+ },
1435
+ "funding": {
1436
+ "url": "https://github.com/sponsors/antonk52"
1437
+ }
1438
+ },
1439
+ "node_modules/lines-and-columns": {
1440
+ "version": "1.2.4",
1441
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
1442
+ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
1443
+ "dev": true,
1444
+ "license": "MIT"
1445
+ },
1446
+ "node_modules/lru-cache": {
1447
+ "version": "10.4.3",
1448
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
1449
+ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
1450
+ "dev": true,
1451
+ "license": "ISC"
1452
+ },
1453
+ "node_modules/merge2": {
1454
+ "version": "1.4.1",
1455
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
1456
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
1457
+ "dev": true,
1458
+ "license": "MIT",
1459
+ "engines": {
1460
+ "node": ">= 8"
1461
+ }
1462
+ },
1463
+ "node_modules/micromatch": {
1464
+ "version": "4.0.8",
1465
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
1466
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
1467
+ "dev": true,
1468
+ "license": "MIT",
1469
+ "dependencies": {
1470
+ "braces": "^3.0.3",
1471
+ "picomatch": "^2.3.1"
1472
+ },
1473
+ "engines": {
1474
+ "node": ">=8.6"
1475
+ }
1476
+ },
1477
+ "node_modules/mime-db": {
1478
+ "version": "1.52.0",
1479
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
1480
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
1481
+ "license": "MIT",
1482
+ "engines": {
1483
+ "node": ">= 0.6"
1484
+ }
1485
+ },
1486
+ "node_modules/mime-types": {
1487
+ "version": "2.1.35",
1488
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
1489
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
1490
+ "license": "MIT",
1491
+ "dependencies": {
1492
+ "mime-db": "1.52.0"
1493
+ },
1494
+ "engines": {
1495
+ "node": ">= 0.6"
1496
+ }
1497
+ },
1498
+ "node_modules/minimatch": {
1499
+ "version": "9.0.5",
1500
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
1501
+ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
1502
+ "dev": true,
1503
+ "license": "ISC",
1504
+ "dependencies": {
1505
+ "brace-expansion": "^2.0.1"
1506
+ },
1507
+ "engines": {
1508
+ "node": ">=16 || 14 >=14.17"
1509
+ },
1510
+ "funding": {
1511
+ "url": "https://github.com/sponsors/isaacs"
1512
+ }
1513
+ },
1514
+ "node_modules/minipass": {
1515
+ "version": "7.1.2",
1516
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
1517
+ "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
1518
+ "dev": true,
1519
+ "license": "ISC",
1520
+ "engines": {
1521
+ "node": ">=16 || 14 >=14.17"
1522
+ }
1523
+ },
1524
+ "node_modules/mz": {
1525
+ "version": "2.7.0",
1526
+ "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
1527
+ "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
1528
+ "dev": true,
1529
+ "license": "MIT",
1530
+ "dependencies": {
1531
+ "any-promise": "^1.0.0",
1532
+ "object-assign": "^4.0.1",
1533
+ "thenify-all": "^1.0.0"
1534
+ }
1535
+ },
1536
+ "node_modules/nanoid": {
1537
+ "version": "3.3.8",
1538
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz",
1539
+ "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==",
1540
+ "funding": [
1541
+ {
1542
+ "type": "github",
1543
+ "url": "https://github.com/sponsors/ai"
1544
+ }
1545
+ ],
1546
+ "license": "MIT",
1547
+ "bin": {
1548
+ "nanoid": "bin/nanoid.cjs"
1549
+ },
1550
+ "engines": {
1551
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
1552
+ }
1553
+ },
1554
+ "node_modules/next": {
1555
+ "version": "15.1.5",
1556
+ "resolved": "https://registry.npmjs.org/next/-/next-15.1.5.tgz",
1557
+ "integrity": "sha512-Cf/TEegnt01hn3Hoywh6N8fvkhbOuChO4wFje24+a86wKOubgVaWkDqxGVgoWlz2Hp9luMJ9zw3epftujdnUOg==",
1558
+ "license": "MIT",
1559
+ "dependencies": {
1560
+ "@next/env": "15.1.5",
1561
+ "@swc/counter": "0.1.3",
1562
+ "@swc/helpers": "0.5.15",
1563
+ "busboy": "1.6.0",
1564
+ "caniuse-lite": "^1.0.30001579",
1565
+ "postcss": "8.4.31",
1566
+ "styled-jsx": "5.1.6"
1567
+ },
1568
+ "bin": {
1569
+ "next": "dist/bin/next"
1570
  },
1571
  "engines": {
1572
  "node": "^18.18.0 || ^19.8.0 || >= 20.0.0"
 
1605
  }
1606
  }
1607
  },
1608
+ "node_modules/next/node_modules/postcss": {
1609
+ "version": "8.4.31",
1610
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz",
1611
+ "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==",
1612
+ "funding": [
1613
+ {
1614
+ "type": "opencollective",
1615
+ "url": "https://opencollective.com/postcss/"
1616
+ },
1617
+ {
1618
+ "type": "tidelift",
1619
+ "url": "https://tidelift.com/funding/github/npm/postcss"
1620
+ },
1621
+ {
1622
+ "type": "github",
1623
+ "url": "https://github.com/sponsors/ai"
1624
+ }
1625
+ ],
1626
+ "license": "MIT",
1627
+ "dependencies": {
1628
+ "nanoid": "^3.3.6",
1629
+ "picocolors": "^1.0.0",
1630
+ "source-map-js": "^1.0.2"
1631
+ },
1632
+ "engines": {
1633
+ "node": "^10 || ^12 || >=14"
1634
+ }
1635
+ },
1636
+ "node_modules/node-releases": {
1637
+ "version": "2.0.19",
1638
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz",
1639
+ "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==",
1640
+ "dev": true,
1641
+ "license": "MIT"
1642
+ },
1643
+ "node_modules/normalize-path": {
1644
+ "version": "3.0.0",
1645
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
1646
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
1647
+ "dev": true,
1648
+ "license": "MIT",
1649
+ "engines": {
1650
+ "node": ">=0.10.0"
1651
+ }
1652
+ },
1653
+ "node_modules/normalize-range": {
1654
+ "version": "0.1.2",
1655
+ "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
1656
+ "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",
1657
+ "dev": true,
1658
+ "license": "MIT",
1659
+ "engines": {
1660
+ "node": ">=0.10.0"
1661
+ }
1662
+ },
1663
+ "node_modules/object-assign": {
1664
+ "version": "4.1.1",
1665
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
1666
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
1667
+ "dev": true,
1668
+ "license": "MIT",
1669
+ "engines": {
1670
+ "node": ">=0.10.0"
1671
+ }
1672
+ },
1673
+ "node_modules/object-hash": {
1674
+ "version": "3.0.0",
1675
+ "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz",
1676
+ "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==",
1677
+ "dev": true,
1678
+ "license": "MIT",
1679
+ "engines": {
1680
+ "node": ">= 6"
1681
+ }
1682
+ },
1683
+ "node_modules/package-json-from-dist": {
1684
+ "version": "1.0.1",
1685
+ "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
1686
+ "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==",
1687
+ "dev": true,
1688
+ "license": "BlueOak-1.0.0"
1689
+ },
1690
+ "node_modules/path-key": {
1691
+ "version": "3.1.1",
1692
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
1693
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
1694
+ "dev": true,
1695
+ "license": "MIT",
1696
+ "engines": {
1697
+ "node": ">=8"
1698
+ }
1699
+ },
1700
+ "node_modules/path-parse": {
1701
+ "version": "1.0.7",
1702
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
1703
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
1704
+ "dev": true,
1705
+ "license": "MIT"
1706
+ },
1707
+ "node_modules/path-scurry": {
1708
+ "version": "1.11.1",
1709
+ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
1710
+ "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
1711
+ "dev": true,
1712
+ "license": "BlueOak-1.0.0",
1713
+ "dependencies": {
1714
+ "lru-cache": "^10.2.0",
1715
+ "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
1716
+ },
1717
+ "engines": {
1718
+ "node": ">=16 || 14 >=14.18"
1719
+ },
1720
+ "funding": {
1721
+ "url": "https://github.com/sponsors/isaacs"
1722
+ }
1723
+ },
1724
  "node_modules/picocolors": {
1725
  "version": "1.1.1",
1726
  "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
1727
  "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
1728
  "license": "ISC"
1729
  },
1730
+ "node_modules/picomatch": {
1731
+ "version": "2.3.1",
1732
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
1733
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
1734
+ "dev": true,
1735
+ "license": "MIT",
1736
+ "engines": {
1737
+ "node": ">=8.6"
1738
+ },
1739
+ "funding": {
1740
+ "url": "https://github.com/sponsors/jonschlinkert"
1741
+ }
1742
+ },
1743
+ "node_modules/pify": {
1744
+ "version": "2.3.0",
1745
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
1746
+ "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
1747
+ "dev": true,
1748
+ "license": "MIT",
1749
+ "engines": {
1750
+ "node": ">=0.10.0"
1751
+ }
1752
+ },
1753
+ "node_modules/pirates": {
1754
+ "version": "4.0.6",
1755
+ "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz",
1756
+ "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==",
1757
+ "dev": true,
1758
+ "license": "MIT",
1759
+ "engines": {
1760
+ "node": ">= 6"
1761
+ }
1762
+ },
1763
  "node_modules/postcss": {
1764
+ "version": "8.5.1",
1765
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.1.tgz",
1766
+ "integrity": "sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==",
1767
+ "dev": true,
1768
+ "funding": [
1769
+ {
1770
+ "type": "opencollective",
1771
+ "url": "https://opencollective.com/postcss/"
1772
+ },
1773
+ {
1774
+ "type": "tidelift",
1775
+ "url": "https://tidelift.com/funding/github/npm/postcss"
1776
+ },
1777
+ {
1778
+ "type": "github",
1779
+ "url": "https://github.com/sponsors/ai"
1780
+ }
1781
+ ],
1782
+ "license": "MIT",
1783
+ "dependencies": {
1784
+ "nanoid": "^3.3.8",
1785
+ "picocolors": "^1.1.1",
1786
+ "source-map-js": "^1.2.1"
1787
+ },
1788
+ "engines": {
1789
+ "node": "^10 || ^12 || >=14"
1790
+ }
1791
+ },
1792
+ "node_modules/postcss-import": {
1793
+ "version": "15.1.0",
1794
+ "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz",
1795
+ "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==",
1796
+ "dev": true,
1797
+ "license": "MIT",
1798
+ "dependencies": {
1799
+ "postcss-value-parser": "^4.0.0",
1800
+ "read-cache": "^1.0.0",
1801
+ "resolve": "^1.1.7"
1802
+ },
1803
+ "engines": {
1804
+ "node": ">=14.0.0"
1805
+ },
1806
+ "peerDependencies": {
1807
+ "postcss": "^8.0.0"
1808
+ }
1809
+ },
1810
+ "node_modules/postcss-js": {
1811
+ "version": "4.0.1",
1812
+ "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz",
1813
+ "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==",
1814
+ "dev": true,
1815
+ "license": "MIT",
1816
+ "dependencies": {
1817
+ "camelcase-css": "^2.0.1"
1818
+ },
1819
+ "engines": {
1820
+ "node": "^12 || ^14 || >= 16"
1821
+ },
1822
+ "funding": {
1823
+ "type": "opencollective",
1824
+ "url": "https://opencollective.com/postcss/"
1825
+ },
1826
+ "peerDependencies": {
1827
+ "postcss": "^8.4.21"
1828
+ }
1829
+ },
1830
+ "node_modules/postcss-load-config": {
1831
+ "version": "4.0.2",
1832
+ "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz",
1833
+ "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==",
1834
+ "dev": true,
1835
+ "funding": [
1836
+ {
1837
+ "type": "opencollective",
1838
+ "url": "https://opencollective.com/postcss/"
1839
+ },
1840
+ {
1841
+ "type": "github",
1842
+ "url": "https://github.com/sponsors/ai"
1843
+ }
1844
+ ],
1845
+ "license": "MIT",
1846
+ "dependencies": {
1847
+ "lilconfig": "^3.0.0",
1848
+ "yaml": "^2.3.4"
1849
+ },
1850
+ "engines": {
1851
+ "node": ">= 14"
1852
+ },
1853
+ "peerDependencies": {
1854
+ "postcss": ">=8.0.9",
1855
+ "ts-node": ">=9.0.0"
1856
+ },
1857
+ "peerDependenciesMeta": {
1858
+ "postcss": {
1859
+ "optional": true
1860
+ },
1861
+ "ts-node": {
1862
+ "optional": true
1863
+ }
1864
+ }
1865
+ },
1866
+ "node_modules/postcss-nested": {
1867
+ "version": "6.2.0",
1868
+ "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz",
1869
+ "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==",
1870
+ "dev": true,
1871
+ "funding": [
1872
+ {
1873
+ "type": "opencollective",
1874
+ "url": "https://opencollective.com/postcss/"
1875
+ },
1876
+ {
1877
+ "type": "github",
1878
+ "url": "https://github.com/sponsors/ai"
1879
+ }
1880
+ ],
1881
+ "license": "MIT",
1882
+ "dependencies": {
1883
+ "postcss-selector-parser": "^6.1.1"
1884
+ },
1885
+ "engines": {
1886
+ "node": ">=12.0"
1887
+ },
1888
+ "peerDependencies": {
1889
+ "postcss": "^8.2.14"
1890
+ }
1891
+ },
1892
+ "node_modules/postcss-selector-parser": {
1893
+ "version": "6.1.2",
1894
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz",
1895
+ "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==",
1896
+ "dev": true,
1897
+ "license": "MIT",
1898
+ "dependencies": {
1899
+ "cssesc": "^3.0.0",
1900
+ "util-deprecate": "^1.0.2"
1901
+ },
1902
+ "engines": {
1903
+ "node": ">=4"
1904
+ }
1905
+ },
1906
+ "node_modules/postcss-value-parser": {
1907
+ "version": "4.2.0",
1908
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
1909
+ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
1910
+ "dev": true,
1911
+ "license": "MIT"
1912
+ },
1913
+ "node_modules/proxy-from-env": {
1914
+ "version": "1.1.0",
1915
+ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
1916
+ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
1917
+ "license": "MIT"
1918
+ },
1919
+ "node_modules/queue-microtask": {
1920
+ "version": "1.2.3",
1921
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
1922
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
1923
+ "dev": true,
1924
  "funding": [
1925
  {
1926
+ "type": "github",
1927
+ "url": "https://github.com/sponsors/feross"
1928
  },
1929
  {
1930
+ "type": "patreon",
1931
+ "url": "https://www.patreon.com/feross"
1932
  },
1933
  {
1934
+ "type": "consulting",
1935
+ "url": "https://feross.org/support"
1936
  }
1937
  ],
1938
+ "license": "MIT"
 
 
 
 
 
 
 
 
1939
  },
1940
  "node_modules/react": {
1941
  "version": "19.0.0",
 
1958
  "react": "^19.0.0"
1959
  }
1960
  },
1961
+ "node_modules/react-toastify": {
1962
+ "version": "11.0.3",
1963
+ "resolved": "https://registry.npmjs.org/react-toastify/-/react-toastify-11.0.3.tgz",
1964
+ "integrity": "sha512-cbPtHJPfc0sGqVwozBwaTrTu1ogB9+BLLjd4dDXd863qYLj7DGrQ2sg5RAChjFUB4yc3w8iXOtWcJqPK/6xqRQ==",
1965
+ "license": "MIT",
1966
+ "dependencies": {
1967
+ "clsx": "^2.1.1"
1968
+ },
1969
+ "peerDependencies": {
1970
+ "react": "^18 || ^19",
1971
+ "react-dom": "^18 || ^19"
1972
+ }
1973
+ },
1974
+ "node_modules/read-cache": {
1975
+ "version": "1.0.0",
1976
+ "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
1977
+ "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
1978
+ "dev": true,
1979
+ "license": "MIT",
1980
+ "dependencies": {
1981
+ "pify": "^2.3.0"
1982
+ }
1983
+ },
1984
+ "node_modules/readdirp": {
1985
+ "version": "3.6.0",
1986
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
1987
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
1988
+ "dev": true,
1989
+ "license": "MIT",
1990
+ "dependencies": {
1991
+ "picomatch": "^2.2.1"
1992
+ },
1993
+ "engines": {
1994
+ "node": ">=8.10.0"
1995
+ }
1996
+ },
1997
+ "node_modules/resolve": {
1998
+ "version": "1.22.10",
1999
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz",
2000
+ "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==",
2001
+ "dev": true,
2002
+ "license": "MIT",
2003
+ "dependencies": {
2004
+ "is-core-module": "^2.16.0",
2005
+ "path-parse": "^1.0.7",
2006
+ "supports-preserve-symlinks-flag": "^1.0.0"
2007
+ },
2008
+ "bin": {
2009
+ "resolve": "bin/resolve"
2010
+ },
2011
+ "engines": {
2012
+ "node": ">= 0.4"
2013
+ },
2014
+ "funding": {
2015
+ "url": "https://github.com/sponsors/ljharb"
2016
+ }
2017
+ },
2018
+ "node_modules/reusify": {
2019
+ "version": "1.0.4",
2020
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
2021
+ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
2022
+ "dev": true,
2023
+ "license": "MIT",
2024
+ "engines": {
2025
+ "iojs": ">=1.0.0",
2026
+ "node": ">=0.10.0"
2027
+ }
2028
+ },
2029
+ "node_modules/run-parallel": {
2030
+ "version": "1.2.0",
2031
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
2032
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
2033
+ "dev": true,
2034
+ "funding": [
2035
+ {
2036
+ "type": "github",
2037
+ "url": "https://github.com/sponsors/feross"
2038
+ },
2039
+ {
2040
+ "type": "patreon",
2041
+ "url": "https://www.patreon.com/feross"
2042
+ },
2043
+ {
2044
+ "type": "consulting",
2045
+ "url": "https://feross.org/support"
2046
+ }
2047
+ ],
2048
+ "license": "MIT",
2049
+ "dependencies": {
2050
+ "queue-microtask": "^1.2.2"
2051
+ }
2052
+ },
2053
  "node_modules/scheduler": {
2054
  "version": "0.25.0",
2055
  "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.25.0.tgz",
 
2109
  "@img/sharp-win32-x64": "0.33.5"
2110
  }
2111
  },
2112
+ "node_modules/shebang-command": {
2113
+ "version": "2.0.0",
2114
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
2115
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
2116
+ "dev": true,
2117
+ "license": "MIT",
2118
+ "dependencies": {
2119
+ "shebang-regex": "^3.0.0"
2120
+ },
2121
+ "engines": {
2122
+ "node": ">=8"
2123
+ }
2124
+ },
2125
+ "node_modules/shebang-regex": {
2126
+ "version": "3.0.0",
2127
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
2128
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
2129
+ "dev": true,
2130
+ "license": "MIT",
2131
+ "engines": {
2132
+ "node": ">=8"
2133
+ }
2134
+ },
2135
+ "node_modules/signal-exit": {
2136
+ "version": "4.1.0",
2137
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
2138
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
2139
+ "dev": true,
2140
+ "license": "ISC",
2141
+ "engines": {
2142
+ "node": ">=14"
2143
+ },
2144
+ "funding": {
2145
+ "url": "https://github.com/sponsors/isaacs"
2146
+ }
2147
+ },
2148
  "node_modules/simple-swizzle": {
2149
  "version": "0.2.2",
2150
  "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
 
2172
  "node": ">=10.0.0"
2173
  }
2174
  },
2175
+ "node_modules/string-width": {
2176
+ "version": "5.1.2",
2177
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
2178
+ "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
2179
+ "dev": true,
2180
+ "license": "MIT",
2181
+ "dependencies": {
2182
+ "eastasianwidth": "^0.2.0",
2183
+ "emoji-regex": "^9.2.2",
2184
+ "strip-ansi": "^7.0.1"
2185
+ },
2186
+ "engines": {
2187
+ "node": ">=12"
2188
+ },
2189
+ "funding": {
2190
+ "url": "https://github.com/sponsors/sindresorhus"
2191
+ }
2192
+ },
2193
+ "node_modules/string-width-cjs": {
2194
+ "name": "string-width",
2195
+ "version": "4.2.3",
2196
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
2197
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
2198
+ "dev": true,
2199
+ "license": "MIT",
2200
+ "dependencies": {
2201
+ "emoji-regex": "^8.0.0",
2202
+ "is-fullwidth-code-point": "^3.0.0",
2203
+ "strip-ansi": "^6.0.1"
2204
+ },
2205
+ "engines": {
2206
+ "node": ">=8"
2207
+ }
2208
+ },
2209
+ "node_modules/string-width-cjs/node_modules/ansi-regex": {
2210
+ "version": "5.0.1",
2211
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
2212
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
2213
+ "dev": true,
2214
+ "license": "MIT",
2215
+ "engines": {
2216
+ "node": ">=8"
2217
+ }
2218
+ },
2219
+ "node_modules/string-width-cjs/node_modules/emoji-regex": {
2220
+ "version": "8.0.0",
2221
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
2222
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
2223
+ "dev": true,
2224
+ "license": "MIT"
2225
+ },
2226
+ "node_modules/string-width-cjs/node_modules/strip-ansi": {
2227
+ "version": "6.0.1",
2228
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
2229
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
2230
+ "dev": true,
2231
+ "license": "MIT",
2232
+ "dependencies": {
2233
+ "ansi-regex": "^5.0.1"
2234
+ },
2235
+ "engines": {
2236
+ "node": ">=8"
2237
+ }
2238
+ },
2239
+ "node_modules/strip-ansi": {
2240
+ "version": "7.1.0",
2241
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
2242
+ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
2243
+ "dev": true,
2244
+ "license": "MIT",
2245
+ "dependencies": {
2246
+ "ansi-regex": "^6.0.1"
2247
+ },
2248
+ "engines": {
2249
+ "node": ">=12"
2250
+ },
2251
+ "funding": {
2252
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
2253
+ }
2254
+ },
2255
+ "node_modules/strip-ansi-cjs": {
2256
+ "name": "strip-ansi",
2257
+ "version": "6.0.1",
2258
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
2259
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
2260
+ "dev": true,
2261
+ "license": "MIT",
2262
+ "dependencies": {
2263
+ "ansi-regex": "^5.0.1"
2264
+ },
2265
+ "engines": {
2266
+ "node": ">=8"
2267
+ }
2268
+ },
2269
+ "node_modules/strip-ansi-cjs/node_modules/ansi-regex": {
2270
+ "version": "5.0.1",
2271
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
2272
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
2273
+ "dev": true,
2274
+ "license": "MIT",
2275
+ "engines": {
2276
+ "node": ">=8"
2277
+ }
2278
+ },
2279
  "node_modules/styled-jsx": {
2280
  "version": "5.1.6",
2281
  "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz",
 
2299
  }
2300
  }
2301
  },
2302
+ "node_modules/sucrase": {
2303
+ "version": "3.35.0",
2304
+ "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz",
2305
+ "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==",
2306
+ "dev": true,
2307
+ "license": "MIT",
2308
+ "dependencies": {
2309
+ "@jridgewell/gen-mapping": "^0.3.2",
2310
+ "commander": "^4.0.0",
2311
+ "glob": "^10.3.10",
2312
+ "lines-and-columns": "^1.1.6",
2313
+ "mz": "^2.7.0",
2314
+ "pirates": "^4.0.1",
2315
+ "ts-interface-checker": "^0.1.9"
2316
+ },
2317
+ "bin": {
2318
+ "sucrase": "bin/sucrase",
2319
+ "sucrase-node": "bin/sucrase-node"
2320
+ },
2321
+ "engines": {
2322
+ "node": ">=16 || 14 >=14.17"
2323
+ }
2324
+ },
2325
+ "node_modules/supports-preserve-symlinks-flag": {
2326
+ "version": "1.0.0",
2327
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
2328
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
2329
+ "dev": true,
2330
+ "license": "MIT",
2331
+ "engines": {
2332
+ "node": ">= 0.4"
2333
+ },
2334
+ "funding": {
2335
+ "url": "https://github.com/sponsors/ljharb"
2336
+ }
2337
+ },
2338
+ "node_modules/tailwindcss": {
2339
+ "version": "3.4.17",
2340
+ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz",
2341
+ "integrity": "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==",
2342
+ "dev": true,
2343
+ "license": "MIT",
2344
+ "dependencies": {
2345
+ "@alloc/quick-lru": "^5.2.0",
2346
+ "arg": "^5.0.2",
2347
+ "chokidar": "^3.6.0",
2348
+ "didyoumean": "^1.2.2",
2349
+ "dlv": "^1.1.3",
2350
+ "fast-glob": "^3.3.2",
2351
+ "glob-parent": "^6.0.2",
2352
+ "is-glob": "^4.0.3",
2353
+ "jiti": "^1.21.6",
2354
+ "lilconfig": "^3.1.3",
2355
+ "micromatch": "^4.0.8",
2356
+ "normalize-path": "^3.0.0",
2357
+ "object-hash": "^3.0.0",
2358
+ "picocolors": "^1.1.1",
2359
+ "postcss": "^8.4.47",
2360
+ "postcss-import": "^15.1.0",
2361
+ "postcss-js": "^4.0.1",
2362
+ "postcss-load-config": "^4.0.2",
2363
+ "postcss-nested": "^6.2.0",
2364
+ "postcss-selector-parser": "^6.1.2",
2365
+ "resolve": "^1.22.8",
2366
+ "sucrase": "^3.35.0"
2367
+ },
2368
+ "bin": {
2369
+ "tailwind": "lib/cli.js",
2370
+ "tailwindcss": "lib/cli.js"
2371
+ },
2372
+ "engines": {
2373
+ "node": ">=14.0.0"
2374
+ }
2375
+ },
2376
+ "node_modules/thenify": {
2377
+ "version": "3.3.1",
2378
+ "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
2379
+ "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
2380
+ "dev": true,
2381
+ "license": "MIT",
2382
+ "dependencies": {
2383
+ "any-promise": "^1.0.0"
2384
+ }
2385
+ },
2386
+ "node_modules/thenify-all": {
2387
+ "version": "1.6.0",
2388
+ "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
2389
+ "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==",
2390
+ "dev": true,
2391
+ "license": "MIT",
2392
+ "dependencies": {
2393
+ "thenify": ">= 3.1.0 < 4"
2394
+ },
2395
+ "engines": {
2396
+ "node": ">=0.8"
2397
+ }
2398
+ },
2399
+ "node_modules/to-regex-range": {
2400
+ "version": "5.0.1",
2401
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
2402
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
2403
+ "dev": true,
2404
+ "license": "MIT",
2405
+ "dependencies": {
2406
+ "is-number": "^7.0.0"
2407
+ },
2408
+ "engines": {
2409
+ "node": ">=8.0"
2410
+ }
2411
+ },
2412
+ "node_modules/ts-interface-checker": {
2413
+ "version": "0.1.13",
2414
+ "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz",
2415
+ "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==",
2416
+ "dev": true,
2417
+ "license": "Apache-2.0"
2418
+ },
2419
  "node_modules/tslib": {
2420
  "version": "2.8.1",
2421
  "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
2422
  "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
2423
  "license": "0BSD"
2424
+ },
2425
+ "node_modules/update-browserslist-db": {
2426
+ "version": "1.1.2",
2427
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz",
2428
+ "integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==",
2429
+ "dev": true,
2430
+ "funding": [
2431
+ {
2432
+ "type": "opencollective",
2433
+ "url": "https://opencollective.com/browserslist"
2434
+ },
2435
+ {
2436
+ "type": "tidelift",
2437
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
2438
+ },
2439
+ {
2440
+ "type": "github",
2441
+ "url": "https://github.com/sponsors/ai"
2442
+ }
2443
+ ],
2444
+ "license": "MIT",
2445
+ "dependencies": {
2446
+ "escalade": "^3.2.0",
2447
+ "picocolors": "^1.1.1"
2448
+ },
2449
+ "bin": {
2450
+ "update-browserslist-db": "cli.js"
2451
+ },
2452
+ "peerDependencies": {
2453
+ "browserslist": ">= 4.21.0"
2454
+ }
2455
+ },
2456
+ "node_modules/util-deprecate": {
2457
+ "version": "1.0.2",
2458
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
2459
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
2460
+ "dev": true,
2461
+ "license": "MIT"
2462
+ },
2463
+ "node_modules/which": {
2464
+ "version": "2.0.2",
2465
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
2466
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
2467
+ "dev": true,
2468
+ "license": "ISC",
2469
+ "dependencies": {
2470
+ "isexe": "^2.0.0"
2471
+ },
2472
+ "bin": {
2473
+ "node-which": "bin/node-which"
2474
+ },
2475
+ "engines": {
2476
+ "node": ">= 8"
2477
+ }
2478
+ },
2479
+ "node_modules/wrap-ansi": {
2480
+ "version": "8.1.0",
2481
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
2482
+ "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
2483
+ "dev": true,
2484
+ "license": "MIT",
2485
+ "dependencies": {
2486
+ "ansi-styles": "^6.1.0",
2487
+ "string-width": "^5.0.1",
2488
+ "strip-ansi": "^7.0.1"
2489
+ },
2490
+ "engines": {
2491
+ "node": ">=12"
2492
+ },
2493
+ "funding": {
2494
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
2495
+ }
2496
+ },
2497
+ "node_modules/wrap-ansi-cjs": {
2498
+ "name": "wrap-ansi",
2499
+ "version": "7.0.0",
2500
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
2501
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
2502
+ "dev": true,
2503
+ "license": "MIT",
2504
+ "dependencies": {
2505
+ "ansi-styles": "^4.0.0",
2506
+ "string-width": "^4.1.0",
2507
+ "strip-ansi": "^6.0.0"
2508
+ },
2509
+ "engines": {
2510
+ "node": ">=10"
2511
+ },
2512
+ "funding": {
2513
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
2514
+ }
2515
+ },
2516
+ "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": {
2517
+ "version": "5.0.1",
2518
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
2519
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
2520
+ "dev": true,
2521
+ "license": "MIT",
2522
+ "engines": {
2523
+ "node": ">=8"
2524
+ }
2525
+ },
2526
+ "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": {
2527
+ "version": "4.3.0",
2528
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
2529
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
2530
+ "dev": true,
2531
+ "license": "MIT",
2532
+ "dependencies": {
2533
+ "color-convert": "^2.0.1"
2534
+ },
2535
+ "engines": {
2536
+ "node": ">=8"
2537
+ },
2538
+ "funding": {
2539
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
2540
+ }
2541
+ },
2542
+ "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": {
2543
+ "version": "8.0.0",
2544
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
2545
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
2546
+ "dev": true,
2547
+ "license": "MIT"
2548
+ },
2549
+ "node_modules/wrap-ansi-cjs/node_modules/string-width": {
2550
+ "version": "4.2.3",
2551
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
2552
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
2553
+ "dev": true,
2554
+ "license": "MIT",
2555
+ "dependencies": {
2556
+ "emoji-regex": "^8.0.0",
2557
+ "is-fullwidth-code-point": "^3.0.0",
2558
+ "strip-ansi": "^6.0.1"
2559
+ },
2560
+ "engines": {
2561
+ "node": ">=8"
2562
+ }
2563
+ },
2564
+ "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": {
2565
+ "version": "6.0.1",
2566
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
2567
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
2568
+ "dev": true,
2569
+ "license": "MIT",
2570
+ "dependencies": {
2571
+ "ansi-regex": "^5.0.1"
2572
+ },
2573
+ "engines": {
2574
+ "node": ">=8"
2575
+ }
2576
+ },
2577
+ "node_modules/yaml": {
2578
+ "version": "2.7.0",
2579
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz",
2580
+ "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==",
2581
+ "dev": true,
2582
+ "license": "ISC",
2583
+ "bin": {
2584
+ "yaml": "bin.mjs"
2585
+ },
2586
+ "engines": {
2587
+ "node": ">= 14"
2588
+ }
2589
  }
2590
  }
2591
  }
frontend/package.json CHANGED
@@ -9,8 +9,16 @@
9
  "lint": "next lint"
10
  },
11
  "dependencies": {
 
 
 
12
  "react": "^19.0.0",
13
  "react-dom": "^19.0.0",
14
- "next": "15.1.5"
 
 
 
 
 
15
  }
16
  }
 
9
  "lint": "next lint"
10
  },
11
  "dependencies": {
12
+ "@heroicons/react": "^2.2.0",
13
+ "axios": "^1.7.9",
14
+ "next": "15.1.5",
15
  "react": "^19.0.0",
16
  "react-dom": "^19.0.0",
17
+ "react-toastify": "^11.0.3"
18
+ },
19
+ "devDependencies": {
20
+ "autoprefixer": "^10.4.20",
21
+ "postcss": "^8.5.1",
22
+ "tailwindcss": "^3.4.17"
23
  }
24
  }
frontend/postcss.config.js ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ module.exports = {
2
+ plugins: {
3
+ tailwindcss: {},
4
+ autoprefixer: {},
5
+ },
6
+ }
frontend/tailwind.config.js ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /** @type {import('tailwindcss').Config} */
2
+ module.exports = {
3
+ content: [
4
+ "./app/**/*.{js,ts,jsx,tsx,mdx}",
5
+ "./pages/**/*.{js,ts,jsx,tsx,mdx}",
6
+ "./components/**/*.{js,ts,jsx,tsx,mdx}",
7
+
8
+ ],
9
+ theme: {
10
+ extend: {},
11
+ },
12
+ plugins: [],
13
+ }