Stijnus
commited on
Commit
·
27eab59
1
Parent(s):
4e6f18e
UI fixes
Browse files- app/components/settings/connections/ConnectionsTab.tsx +75 -70
- app/components/settings/connections/components/ConnectionForm.tsx +180 -0
- app/components/settings/connections/components/CreateBranchDialog.tsx +150 -0
- app/components/settings/connections/types/GitHub.ts +59 -0
- app/components/settings/data/DataTab.tsx +8 -8
- app/components/settings/debug/DebugTab.tsx +83 -157
- app/components/settings/developer/DeveloperWindow.tsx +125 -16
- app/components/settings/developer/TabManagement.tsx +1 -1
- app/components/settings/providers/LocalProvidersTab.tsx +294 -40
- app/components/settings/settings/SettingsTab.tsx +35 -0
- app/components/settings/shared/DraggableTabList.tsx +8 -3
- app/components/settings/shared/TabTile.tsx +1 -1
- app/components/settings/user/UsersWindow.tsx +126 -21
- app/components/workbench/FileBreadcrumb.tsx +3 -1
- app/lib/stores/settings.ts +102 -5
- app/routes/api.system.git-info.ts +1 -1
- package.json +5 -4
- pages/api/system/git-info.ts +1 -1
- pnpm-lock.yaml +502 -263
app/components/settings/connections/ConnectionsTab.tsx
CHANGED
@@ -35,6 +35,7 @@ interface GitHubStats {
|
|
35 |
interface GitHubConnection {
|
36 |
user: GitHubUserResponse | null;
|
37 |
token: string;
|
|
|
38 |
stats?: GitHubStats;
|
39 |
}
|
40 |
|
@@ -42,6 +43,7 @@ export default function ConnectionsTab() {
|
|
42 |
const [connection, setConnection] = useState<GitHubConnection>({
|
43 |
user: null,
|
44 |
token: '',
|
|
|
45 |
});
|
46 |
const [isLoading, setIsLoading] = useState(true);
|
47 |
const [isConnecting, setIsConnecting] = useState(false);
|
@@ -53,7 +55,14 @@ export default function ConnectionsTab() {
|
|
53 |
|
54 |
if (savedConnection) {
|
55 |
const parsed = JSON.parse(savedConnection);
|
|
|
|
|
|
|
|
|
|
|
|
|
56 |
setConnection(parsed);
|
|
|
57 |
if (parsed.user && parsed.token) {
|
58 |
fetchGitHubStats(parsed.token);
|
59 |
}
|
@@ -73,7 +82,9 @@ export default function ConnectionsTab() {
|
|
73 |
},
|
74 |
});
|
75 |
|
76 |
-
if (!reposResponse.ok)
|
|
|
|
|
77 |
|
78 |
const repos = (await reposResponse.json()) as GitHubRepoInfo[];
|
79 |
|
@@ -107,10 +118,16 @@ export default function ConnectionsTab() {
|
|
107 |
},
|
108 |
});
|
109 |
|
110 |
-
if (!response.ok)
|
|
|
|
|
111 |
|
112 |
const data = (await response.json()) as GitHubUserResponse;
|
113 |
-
const newConnection = {
|
|
|
|
|
|
|
|
|
114 |
|
115 |
// Save connection
|
116 |
localStorage.setItem('github_connection', JSON.stringify(newConnection));
|
@@ -123,7 +140,7 @@ export default function ConnectionsTab() {
|
|
123 |
} catch (error) {
|
124 |
logStore.logError('Failed to authenticate with GitHub', { error });
|
125 |
toast.error('Failed to connect to GitHub');
|
126 |
-
setConnection({ user: null, token: '' });
|
127 |
} finally {
|
128 |
setIsConnecting(false);
|
129 |
}
|
@@ -136,11 +153,13 @@ export default function ConnectionsTab() {
|
|
136 |
|
137 |
const handleDisconnect = () => {
|
138 |
localStorage.removeItem('github_connection');
|
139 |
-
setConnection({ user: null, token: '' });
|
140 |
toast.success('Disconnected from GitHub');
|
141 |
};
|
142 |
|
143 |
-
if (isLoading)
|
|
|
|
|
144 |
|
145 |
return (
|
146 |
<div className="space-y-4">
|
@@ -174,31 +193,37 @@ export default function ConnectionsTab() {
|
|
174 |
|
175 |
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
|
176 |
<div>
|
177 |
-
<label className="block text-sm text-bolt-elements-textSecondary mb-2">
|
178 |
-
<
|
179 |
-
|
180 |
-
|
181 |
-
|
182 |
-
|
|
|
183 |
className={classNames(
|
184 |
'w-full px-3 py-2 rounded-lg text-sm',
|
185 |
'bg-[#F8F8F8] dark:bg-[#1A1A1A]',
|
186 |
'border border-[#E5E5E5] dark:border-[#333333]',
|
187 |
-
'text-bolt-elements-textPrimary
|
188 |
'focus:outline-none focus:ring-1 focus:ring-purple-500',
|
189 |
'disabled:opacity-50',
|
190 |
)}
|
191 |
-
|
|
|
|
|
|
|
192 |
</div>
|
193 |
|
194 |
<div>
|
195 |
-
<label className="block text-sm text-bolt-elements-textSecondary mb-2">
|
|
|
|
|
196 |
<input
|
197 |
type="password"
|
198 |
value={connection.token}
|
199 |
onChange={(e) => setConnection((prev) => ({ ...prev, token: e.target.value }))}
|
200 |
disabled={isConnecting || !!connection.user}
|
201 |
-
placeholder=
|
202 |
className={classNames(
|
203 |
'w-full px-3 py-2 rounded-lg text-sm',
|
204 |
'bg-[#F8F8F8] dark:bg-[#1A1A1A]',
|
@@ -257,69 +282,49 @@ export default function ConnectionsTab() {
|
|
257 |
)}
|
258 |
</div>
|
259 |
|
260 |
-
{connection.user &&
|
261 |
-
<div className="
|
262 |
-
<div className="flex items-center gap-4
|
263 |
<img
|
264 |
src={connection.user.avatar_url}
|
265 |
alt={connection.user.login}
|
266 |
-
className="w-
|
267 |
/>
|
268 |
<div>
|
269 |
-
<
|
270 |
-
|
271 |
-
</h3>
|
272 |
-
{connection.user.bio && (
|
273 |
-
<p className="text-sm text-bolt-elements-textSecondary">{connection.user.bio}</p>
|
274 |
-
)}
|
275 |
-
<div className="flex gap-4 mt-2 text-sm text-bolt-elements-textSecondary">
|
276 |
-
<span className="flex items-center gap-1">
|
277 |
-
<div className="i-ph:users w-4 h-4" />
|
278 |
-
{connection.user.followers} followers
|
279 |
-
</span>
|
280 |
-
<span className="flex items-center gap-1">
|
281 |
-
<div className="i-ph:star w-4 h-4" />
|
282 |
-
{connection.stats.totalStars} stars
|
283 |
-
</span>
|
284 |
-
<span className="flex items-center gap-1">
|
285 |
-
<div className="i-ph:git-fork w-4 h-4" />
|
286 |
-
{connection.stats.totalForks} forks
|
287 |
-
</span>
|
288 |
-
</div>
|
289 |
</div>
|
290 |
</div>
|
291 |
|
292 |
-
|
293 |
-
|
294 |
-
|
295 |
-
|
296 |
-
|
297 |
-
|
298 |
-
|
299 |
-
|
300 |
-
|
301 |
-
|
302 |
-
|
303 |
-
|
304 |
-
|
305 |
-
{repo.description && (
|
306 |
-
<p className="text-xs text-bolt-elements-textSecondary mt-1">{repo.description}</p>
|
307 |
-
)}
|
308 |
-
</div>
|
309 |
-
<div className="flex items-center gap-3 text-xs text-bolt-elements-textSecondary">
|
310 |
-
<span className="flex items-center gap-1">
|
311 |
-
<div className="i-ph:star w-3 h-3" />
|
312 |
-
{repo.stargazers_count}
|
313 |
-
</span>
|
314 |
-
<span className="flex items-center gap-1">
|
315 |
-
<div className="i-ph:git-fork w-3 h-3" />
|
316 |
-
{repo.forks_count}
|
317 |
-
</span>
|
318 |
-
</div>
|
319 |
</div>
|
320 |
-
|
321 |
-
|
322 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
323 |
</div>
|
324 |
)}
|
325 |
</div>
|
|
|
35 |
interface GitHubConnection {
|
36 |
user: GitHubUserResponse | null;
|
37 |
token: string;
|
38 |
+
tokenType: 'classic' | 'fine-grained';
|
39 |
stats?: GitHubStats;
|
40 |
}
|
41 |
|
|
|
43 |
const [connection, setConnection] = useState<GitHubConnection>({
|
44 |
user: null,
|
45 |
token: '',
|
46 |
+
tokenType: 'classic',
|
47 |
});
|
48 |
const [isLoading, setIsLoading] = useState(true);
|
49 |
const [isConnecting, setIsConnecting] = useState(false);
|
|
|
55 |
|
56 |
if (savedConnection) {
|
57 |
const parsed = JSON.parse(savedConnection);
|
58 |
+
|
59 |
+
// Ensure backward compatibility with existing connections
|
60 |
+
if (!parsed.tokenType) {
|
61 |
+
parsed.tokenType = 'classic';
|
62 |
+
}
|
63 |
+
|
64 |
setConnection(parsed);
|
65 |
+
|
66 |
if (parsed.user && parsed.token) {
|
67 |
fetchGitHubStats(parsed.token);
|
68 |
}
|
|
|
82 |
},
|
83 |
});
|
84 |
|
85 |
+
if (!reposResponse.ok) {
|
86 |
+
throw new Error('Failed to fetch repositories');
|
87 |
+
}
|
88 |
|
89 |
const repos = (await reposResponse.json()) as GitHubRepoInfo[];
|
90 |
|
|
|
118 |
},
|
119 |
});
|
120 |
|
121 |
+
if (!response.ok) {
|
122 |
+
throw new Error('Invalid token or unauthorized');
|
123 |
+
}
|
124 |
|
125 |
const data = (await response.json()) as GitHubUserResponse;
|
126 |
+
const newConnection: GitHubConnection = {
|
127 |
+
user: data,
|
128 |
+
token,
|
129 |
+
tokenType: connection.tokenType,
|
130 |
+
};
|
131 |
|
132 |
// Save connection
|
133 |
localStorage.setItem('github_connection', JSON.stringify(newConnection));
|
|
|
140 |
} catch (error) {
|
141 |
logStore.logError('Failed to authenticate with GitHub', { error });
|
142 |
toast.error('Failed to connect to GitHub');
|
143 |
+
setConnection({ user: null, token: '', tokenType: 'classic' });
|
144 |
} finally {
|
145 |
setIsConnecting(false);
|
146 |
}
|
|
|
153 |
|
154 |
const handleDisconnect = () => {
|
155 |
localStorage.removeItem('github_connection');
|
156 |
+
setConnection({ user: null, token: '', tokenType: 'classic' });
|
157 |
toast.success('Disconnected from GitHub');
|
158 |
};
|
159 |
|
160 |
+
if (isLoading) {
|
161 |
+
return <LoadingSpinner />;
|
162 |
+
}
|
163 |
|
164 |
return (
|
165 |
<div className="space-y-4">
|
|
|
193 |
|
194 |
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
|
195 |
<div>
|
196 |
+
<label className="block text-sm text-bolt-elements-textSecondary mb-2">Token Type</label>
|
197 |
+
<select
|
198 |
+
value={connection.tokenType}
|
199 |
+
onChange={(e) =>
|
200 |
+
setConnection((prev) => ({ ...prev, tokenType: e.target.value as 'classic' | 'fine-grained' }))
|
201 |
+
}
|
202 |
+
disabled={isConnecting || !!connection.user}
|
203 |
className={classNames(
|
204 |
'w-full px-3 py-2 rounded-lg text-sm',
|
205 |
'bg-[#F8F8F8] dark:bg-[#1A1A1A]',
|
206 |
'border border-[#E5E5E5] dark:border-[#333333]',
|
207 |
+
'text-bolt-elements-textPrimary',
|
208 |
'focus:outline-none focus:ring-1 focus:ring-purple-500',
|
209 |
'disabled:opacity-50',
|
210 |
)}
|
211 |
+
>
|
212 |
+
<option value="classic">Personal Access Token (Classic)</option>
|
213 |
+
<option value="fine-grained">Fine-grained Token</option>
|
214 |
+
</select>
|
215 |
</div>
|
216 |
|
217 |
<div>
|
218 |
+
<label className="block text-sm text-bolt-elements-textSecondary mb-2">
|
219 |
+
{connection.tokenType === 'classic' ? 'Personal Access Token' : 'Fine-grained Token'}
|
220 |
+
</label>
|
221 |
<input
|
222 |
type="password"
|
223 |
value={connection.token}
|
224 |
onChange={(e) => setConnection((prev) => ({ ...prev, token: e.target.value }))}
|
225 |
disabled={isConnecting || !!connection.user}
|
226 |
+
placeholder={`Enter your GitHub ${connection.tokenType === 'classic' ? 'personal access token' : 'fine-grained token'}`}
|
227 |
className={classNames(
|
228 |
'w-full px-3 py-2 rounded-lg text-sm',
|
229 |
'bg-[#F8F8F8] dark:bg-[#1A1A1A]',
|
|
|
282 |
)}
|
283 |
</div>
|
284 |
|
285 |
+
{connection.user && (
|
286 |
+
<div className="p-4 bg-[#F8F8F8] dark:bg-[#1A1A1A] rounded-lg">
|
287 |
+
<div className="flex items-center gap-4">
|
288 |
<img
|
289 |
src={connection.user.avatar_url}
|
290 |
alt={connection.user.login}
|
291 |
+
className="w-12 h-12 rounded-full"
|
292 |
/>
|
293 |
<div>
|
294 |
+
<h4 className="text-sm font-medium text-bolt-elements-textPrimary">{connection.user.name}</h4>
|
295 |
+
<p className="text-sm text-bolt-elements-textSecondary">@{connection.user.login}</p>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
296 |
</div>
|
297 |
</div>
|
298 |
|
299 |
+
{isFetchingStats ? (
|
300 |
+
<div className="mt-4 flex items-center gap-2 text-sm text-bolt-elements-textSecondary">
|
301 |
+
<div className="i-ph:spinner-gap w-4 h-4 animate-spin" />
|
302 |
+
Fetching GitHub stats...
|
303 |
+
</div>
|
304 |
+
) : (
|
305 |
+
connection.stats && (
|
306 |
+
<div className="mt-4 grid grid-cols-3 gap-4">
|
307 |
+
<div>
|
308 |
+
<p className="text-sm text-bolt-elements-textSecondary">Public Repos</p>
|
309 |
+
<p className="text-lg font-medium text-bolt-elements-textPrimary">
|
310 |
+
{connection.user.public_repos}
|
311 |
+
</p>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
312 |
</div>
|
313 |
+
<div>
|
314 |
+
<p className="text-sm text-bolt-elements-textSecondary">Total Stars</p>
|
315 |
+
<p className="text-lg font-medium text-bolt-elements-textPrimary">
|
316 |
+
{connection.stats.totalStars}
|
317 |
+
</p>
|
318 |
+
</div>
|
319 |
+
<div>
|
320 |
+
<p className="text-sm text-bolt-elements-textSecondary">Total Forks</p>
|
321 |
+
<p className="text-lg font-medium text-bolt-elements-textPrimary">
|
322 |
+
{connection.stats.totalForks}
|
323 |
+
</p>
|
324 |
+
</div>
|
325 |
+
</div>
|
326 |
+
)
|
327 |
+
)}
|
328 |
</div>
|
329 |
)}
|
330 |
</div>
|
app/components/settings/connections/components/ConnectionForm.tsx
ADDED
@@ -0,0 +1,180 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import React, { useEffect } from 'react';
|
2 |
+
import { classNames } from '~/utils/classNames';
|
3 |
+
import type { GitHubAuthState } from '~/components/settings/connections/types/GitHub';
|
4 |
+
import Cookies from 'js-cookie';
|
5 |
+
import { getLocalStorage } from '~/utils/localStorage';
|
6 |
+
|
7 |
+
const GITHUB_TOKEN_KEY = 'github_token';
|
8 |
+
|
9 |
+
interface ConnectionFormProps {
|
10 |
+
authState: GitHubAuthState;
|
11 |
+
setAuthState: React.Dispatch<React.SetStateAction<GitHubAuthState>>;
|
12 |
+
onSave: (e: React.FormEvent) => void;
|
13 |
+
onDisconnect: () => void;
|
14 |
+
}
|
15 |
+
|
16 |
+
export function ConnectionForm({ authState, setAuthState, onSave, onDisconnect }: ConnectionFormProps) {
|
17 |
+
// Check for saved token on mount
|
18 |
+
useEffect(() => {
|
19 |
+
const savedToken = Cookies.get(GITHUB_TOKEN_KEY) || getLocalStorage(GITHUB_TOKEN_KEY);
|
20 |
+
|
21 |
+
if (savedToken && !authState.tokenInfo?.token) {
|
22 |
+
setAuthState((prev: GitHubAuthState) => ({
|
23 |
+
...prev,
|
24 |
+
tokenInfo: {
|
25 |
+
token: savedToken,
|
26 |
+
scope: [],
|
27 |
+
avatar_url: '',
|
28 |
+
name: null,
|
29 |
+
created_at: new Date().toISOString(),
|
30 |
+
followers: 0,
|
31 |
+
},
|
32 |
+
}));
|
33 |
+
}
|
34 |
+
}, []);
|
35 |
+
|
36 |
+
return (
|
37 |
+
<div className="rounded-xl bg-white dark:bg-[#0A0A0A] border border-[#E5E5E5] dark:border-[#1A1A1A] overflow-hidden">
|
38 |
+
<div className="p-6">
|
39 |
+
<div className="flex items-center justify-between mb-6">
|
40 |
+
<div className="flex items-center gap-3">
|
41 |
+
<div className="p-2 rounded-lg bg-[#F5F5F5] dark:bg-[#1A1A1A] border border-[#E5E5E5] dark:border-[#1A1A1A]">
|
42 |
+
<div className="i-ph:plug-fill text-bolt-elements-textTertiary" />
|
43 |
+
</div>
|
44 |
+
<div>
|
45 |
+
<h3 className="text-lg font-medium text-bolt-elements-textPrimary">Connection Settings</h3>
|
46 |
+
<p className="text-sm text-bolt-elements-textSecondary">Configure your GitHub connection</p>
|
47 |
+
</div>
|
48 |
+
</div>
|
49 |
+
</div>
|
50 |
+
|
51 |
+
<form onSubmit={onSave} className="space-y-4">
|
52 |
+
<div>
|
53 |
+
<label htmlFor="username" className="block text-sm font-medium text-bolt-elements-textSecondary mb-2">
|
54 |
+
GitHub Username
|
55 |
+
</label>
|
56 |
+
<input
|
57 |
+
id="username"
|
58 |
+
type="text"
|
59 |
+
value={authState.username}
|
60 |
+
onChange={(e) => setAuthState((prev: GitHubAuthState) => ({ ...prev, username: e.target.value }))}
|
61 |
+
className={classNames(
|
62 |
+
'w-full px-4 py-2.5 bg-[#F5F5F5] dark:bg-[#1A1A1A] border rounded-lg',
|
63 |
+
'text-bolt-elements-textPrimary placeholder-bolt-elements-textTertiary text-base',
|
64 |
+
'border-[#E5E5E5] dark:border-[#1A1A1A]',
|
65 |
+
'focus:ring-2 focus:ring-purple-500/50 focus:border-purple-500',
|
66 |
+
'transition-all duration-200',
|
67 |
+
)}
|
68 |
+
placeholder="e.g., octocat"
|
69 |
+
/>
|
70 |
+
</div>
|
71 |
+
|
72 |
+
<div>
|
73 |
+
<div className="flex items-center justify-between mb-2">
|
74 |
+
<label htmlFor="token" className="block text-sm font-medium text-bolt-elements-textSecondary">
|
75 |
+
Personal Access Token
|
76 |
+
</label>
|
77 |
+
<a
|
78 |
+
href="https://github.com/settings/tokens/new?scopes=repo,user,read:org,workflow,delete_repo,write:packages,read:packages"
|
79 |
+
target="_blank"
|
80 |
+
rel="noopener noreferrer"
|
81 |
+
className={classNames(
|
82 |
+
'inline-flex items-center gap-1.5 text-xs',
|
83 |
+
'text-purple-500 hover:text-purple-600 dark:text-purple-400 dark:hover:text-purple-300',
|
84 |
+
'transition-colors duration-200',
|
85 |
+
)}
|
86 |
+
>
|
87 |
+
<span>Generate new token</span>
|
88 |
+
<div className="i-ph:plus-circle" />
|
89 |
+
</a>
|
90 |
+
</div>
|
91 |
+
<input
|
92 |
+
id="token"
|
93 |
+
type="password"
|
94 |
+
value={authState.tokenInfo?.token || ''}
|
95 |
+
onChange={(e) =>
|
96 |
+
setAuthState((prev: GitHubAuthState) => ({
|
97 |
+
...prev,
|
98 |
+
tokenInfo: {
|
99 |
+
token: e.target.value,
|
100 |
+
scope: [],
|
101 |
+
avatar_url: '',
|
102 |
+
name: null,
|
103 |
+
created_at: new Date().toISOString(),
|
104 |
+
followers: 0,
|
105 |
+
},
|
106 |
+
username: '',
|
107 |
+
isConnected: false,
|
108 |
+
isVerifying: false,
|
109 |
+
isLoadingRepos: false,
|
110 |
+
}))
|
111 |
+
}
|
112 |
+
className={classNames(
|
113 |
+
'w-full px-4 py-2.5 bg-[#F5F5F5] dark:bg-[#1A1A1A] border rounded-lg',
|
114 |
+
'text-bolt-elements-textPrimary placeholder-bolt-elements-textTertiary text-base',
|
115 |
+
'border-[#E5E5E5] dark:border-[#1A1A1A]',
|
116 |
+
'focus:ring-2 focus:ring-purple-500/50 focus:border-purple-500',
|
117 |
+
'transition-all duration-200',
|
118 |
+
)}
|
119 |
+
placeholder="ghp_xxxxxxxxxxxx"
|
120 |
+
/>
|
121 |
+
</div>
|
122 |
+
|
123 |
+
<div className="flex items-center justify-between pt-4 border-t border-[#E5E5E5] dark:border-[#1A1A1A]">
|
124 |
+
<div className="flex items-center gap-4">
|
125 |
+
{!authState.isConnected ? (
|
126 |
+
<button
|
127 |
+
type="submit"
|
128 |
+
disabled={authState.isVerifying || !authState.username || !authState.tokenInfo?.token}
|
129 |
+
className={classNames(
|
130 |
+
'inline-flex items-center gap-2 px-4 py-2 text-sm font-medium rounded-lg transition-colors',
|
131 |
+
'bg-purple-500 hover:bg-purple-600',
|
132 |
+
'text-white',
|
133 |
+
'disabled:opacity-50 disabled:cursor-not-allowed',
|
134 |
+
)}
|
135 |
+
>
|
136 |
+
{authState.isVerifying ? (
|
137 |
+
<>
|
138 |
+
<div className="i-ph:spinner animate-spin" />
|
139 |
+
<span>Verifying...</span>
|
140 |
+
</>
|
141 |
+
) : (
|
142 |
+
<>
|
143 |
+
<div className="i-ph:plug-fill" />
|
144 |
+
<span>Connect</span>
|
145 |
+
</>
|
146 |
+
)}
|
147 |
+
</button>
|
148 |
+
) : (
|
149 |
+
<>
|
150 |
+
<button
|
151 |
+
onClick={onDisconnect}
|
152 |
+
className={classNames(
|
153 |
+
'inline-flex items-center gap-2 px-4 py-2 text-sm font-medium rounded-lg transition-colors',
|
154 |
+
'bg-[#F5F5F5] hover:bg-red-500/10 hover:text-red-500',
|
155 |
+
'dark:bg-[#1A1A1A] dark:hover:bg-red-500/20 dark:hover:text-red-500',
|
156 |
+
'text-bolt-elements-textPrimary',
|
157 |
+
)}
|
158 |
+
>
|
159 |
+
<div className="i-ph:plug-fill" />
|
160 |
+
<span>Disconnect</span>
|
161 |
+
</button>
|
162 |
+
<span className="inline-flex items-center gap-2 px-3 py-1.5 text-sm text-green-600 dark:text-green-400 bg-green-500/5 rounded-lg border border-green-500/20">
|
163 |
+
<div className="i-ph:check-circle-fill" />
|
164 |
+
<span>Connected</span>
|
165 |
+
</span>
|
166 |
+
</>
|
167 |
+
)}
|
168 |
+
</div>
|
169 |
+
{authState.rateLimits && (
|
170 |
+
<div className="flex items-center gap-2 text-sm text-bolt-elements-textTertiary">
|
171 |
+
<div className="i-ph:clock-countdown opacity-60" />
|
172 |
+
<span>Rate limit resets at {authState.rateLimits.reset.toLocaleTimeString()}</span>
|
173 |
+
</div>
|
174 |
+
)}
|
175 |
+
</div>
|
176 |
+
</form>
|
177 |
+
</div>
|
178 |
+
</div>
|
179 |
+
);
|
180 |
+
}
|
app/components/settings/connections/components/CreateBranchDialog.tsx
ADDED
@@ -0,0 +1,150 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import { useState } from 'react';
|
2 |
+
import * as Dialog from '@radix-ui/react-dialog';
|
3 |
+
import { classNames } from '~/utils/classNames';
|
4 |
+
import type { GitHubRepoInfo } from '~/components/settings/connections/types/GitHub';
|
5 |
+
import { GitBranch } from '@phosphor-icons/react';
|
6 |
+
|
7 |
+
interface GitHubBranch {
|
8 |
+
name: string;
|
9 |
+
default?: boolean;
|
10 |
+
}
|
11 |
+
|
12 |
+
interface CreateBranchDialogProps {
|
13 |
+
isOpen: boolean;
|
14 |
+
onClose: () => void;
|
15 |
+
onConfirm: (branchName: string, sourceBranch: string) => void;
|
16 |
+
repository: GitHubRepoInfo;
|
17 |
+
branches?: GitHubBranch[];
|
18 |
+
}
|
19 |
+
|
20 |
+
export function CreateBranchDialog({ isOpen, onClose, onConfirm, repository, branches }: CreateBranchDialogProps) {
|
21 |
+
const [branchName, setBranchName] = useState('');
|
22 |
+
const [sourceBranch, setSourceBranch] = useState(branches?.find((b) => b.default)?.name || 'main');
|
23 |
+
|
24 |
+
const handleSubmit = (e: React.FormEvent) => {
|
25 |
+
e.preventDefault();
|
26 |
+
onConfirm(branchName, sourceBranch);
|
27 |
+
setBranchName('');
|
28 |
+
onClose();
|
29 |
+
};
|
30 |
+
|
31 |
+
return (
|
32 |
+
<Dialog.Root open={isOpen} onOpenChange={onClose}>
|
33 |
+
<Dialog.Portal>
|
34 |
+
<Dialog.Overlay className="fixed inset-0 bg-black/50 dark:bg-black/80" />
|
35 |
+
<Dialog.Content
|
36 |
+
className={classNames(
|
37 |
+
'fixed top-[50%] left-[50%] translate-x-[-50%] translate-y-[-50%]',
|
38 |
+
'w-full max-w-md p-6 rounded-xl shadow-lg',
|
39 |
+
'bg-white dark:bg-[#0A0A0A]',
|
40 |
+
'border border-[#E5E5E5] dark:border-[#1A1A1A]',
|
41 |
+
)}
|
42 |
+
>
|
43 |
+
<Dialog.Title className="text-lg font-medium text-bolt-elements-textPrimary mb-4">
|
44 |
+
Create New Branch
|
45 |
+
</Dialog.Title>
|
46 |
+
|
47 |
+
<form onSubmit={handleSubmit}>
|
48 |
+
<div className="space-y-4">
|
49 |
+
<div>
|
50 |
+
<label htmlFor="branchName" className="block text-sm font-medium text-bolt-elements-textSecondary mb-2">
|
51 |
+
Branch Name
|
52 |
+
</label>
|
53 |
+
<input
|
54 |
+
id="branchName"
|
55 |
+
type="text"
|
56 |
+
value={branchName}
|
57 |
+
onChange={(e) => setBranchName(e.target.value)}
|
58 |
+
placeholder="feature/my-new-branch"
|
59 |
+
className={classNames(
|
60 |
+
'w-full px-3 py-2 rounded-lg',
|
61 |
+
'bg-[#F5F5F5] dark:bg-[#1A1A1A]',
|
62 |
+
'border border-[#E5E5E5] dark:border-[#1A1A1A]',
|
63 |
+
'text-bolt-elements-textPrimary placeholder:text-bolt-elements-textTertiary',
|
64 |
+
'focus:outline-none focus:ring-2 focus:ring-purple-500/50',
|
65 |
+
)}
|
66 |
+
required
|
67 |
+
/>
|
68 |
+
</div>
|
69 |
+
|
70 |
+
<div>
|
71 |
+
<label
|
72 |
+
htmlFor="sourceBranch"
|
73 |
+
className="block text-sm font-medium text-bolt-elements-textSecondary mb-2"
|
74 |
+
>
|
75 |
+
Source Branch
|
76 |
+
</label>
|
77 |
+
<select
|
78 |
+
id="sourceBranch"
|
79 |
+
value={sourceBranch}
|
80 |
+
onChange={(e) => setSourceBranch(e.target.value)}
|
81 |
+
className={classNames(
|
82 |
+
'w-full px-3 py-2 rounded-lg',
|
83 |
+
'bg-[#F5F5F5] dark:bg-[#1A1A1A]',
|
84 |
+
'border border-[#E5E5E5] dark:border-[#1A1A1A]',
|
85 |
+
'text-bolt-elements-textPrimary',
|
86 |
+
'focus:outline-none focus:ring-2 focus:ring-purple-500/50',
|
87 |
+
)}
|
88 |
+
>
|
89 |
+
{branches?.map((branch) => (
|
90 |
+
<option key={branch.name} value={branch.name}>
|
91 |
+
{branch.name} {branch.default ? '(default)' : ''}
|
92 |
+
</option>
|
93 |
+
))}
|
94 |
+
</select>
|
95 |
+
</div>
|
96 |
+
|
97 |
+
<div className="mt-4 p-3 bg-[#F5F5F5] dark:bg-[#1A1A1A] rounded-lg">
|
98 |
+
<h4 className="text-sm font-medium text-bolt-elements-textSecondary mb-2">Branch Overview</h4>
|
99 |
+
<ul className="space-y-2 text-sm text-bolt-elements-textSecondary">
|
100 |
+
<li className="flex items-center gap-2">
|
101 |
+
<GitBranch className="text-lg" />
|
102 |
+
Repository: {repository.name}
|
103 |
+
</li>
|
104 |
+
{branchName && (
|
105 |
+
<li className="flex items-center gap-2">
|
106 |
+
<div className="i-ph:check-circle text-green-500" />
|
107 |
+
New branch will be created as: {branchName}
|
108 |
+
</li>
|
109 |
+
)}
|
110 |
+
<li className="flex items-center gap-2">
|
111 |
+
<div className="i-ph:check-circle text-green-500" />
|
112 |
+
Based on: {sourceBranch}
|
113 |
+
</li>
|
114 |
+
</ul>
|
115 |
+
</div>
|
116 |
+
</div>
|
117 |
+
|
118 |
+
<div className="mt-6 flex justify-end gap-3">
|
119 |
+
<button
|
120 |
+
type="button"
|
121 |
+
onClick={onClose}
|
122 |
+
className={classNames(
|
123 |
+
'px-4 py-2 rounded-lg text-sm font-medium',
|
124 |
+
'text-bolt-elements-textPrimary',
|
125 |
+
'bg-[#F5F5F5] dark:bg-[#1A1A1A]',
|
126 |
+
'hover:bg-purple-500/10 hover:text-purple-500',
|
127 |
+
'dark:hover:bg-purple-500/20 dark:hover:text-purple-500',
|
128 |
+
'transition-colors',
|
129 |
+
)}
|
130 |
+
>
|
131 |
+
Cancel
|
132 |
+
</button>
|
133 |
+
<button
|
134 |
+
type="submit"
|
135 |
+
className={classNames(
|
136 |
+
'px-4 py-2 rounded-lg text-sm font-medium',
|
137 |
+
'text-white bg-purple-500',
|
138 |
+
'hover:bg-purple-600',
|
139 |
+
'transition-colors',
|
140 |
+
)}
|
141 |
+
>
|
142 |
+
Create Branch
|
143 |
+
</button>
|
144 |
+
</div>
|
145 |
+
</form>
|
146 |
+
</Dialog.Content>
|
147 |
+
</Dialog.Portal>
|
148 |
+
</Dialog.Root>
|
149 |
+
);
|
150 |
+
}
|
app/components/settings/connections/types/GitHub.ts
ADDED
@@ -0,0 +1,59 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
export interface GitHubUserResponse {
|
2 |
+
login: string;
|
3 |
+
avatar_url: string;
|
4 |
+
html_url: string;
|
5 |
+
name: string;
|
6 |
+
bio: string;
|
7 |
+
public_repos: number;
|
8 |
+
followers: number;
|
9 |
+
following: number;
|
10 |
+
}
|
11 |
+
|
12 |
+
export interface GitHubRepoInfo {
|
13 |
+
name: string;
|
14 |
+
full_name: string;
|
15 |
+
html_url: string;
|
16 |
+
description: string;
|
17 |
+
stargazers_count: number;
|
18 |
+
forks_count: number;
|
19 |
+
default_branch: string;
|
20 |
+
updated_at: string;
|
21 |
+
}
|
22 |
+
|
23 |
+
export interface GitHubStats {
|
24 |
+
repos: GitHubRepoInfo[];
|
25 |
+
totalStars: number;
|
26 |
+
totalForks: number;
|
27 |
+
}
|
28 |
+
|
29 |
+
export interface GitHubConnection {
|
30 |
+
user: GitHubUserResponse | null;
|
31 |
+
token: string;
|
32 |
+
tokenType: 'classic' | 'fine-grained';
|
33 |
+
stats?: GitHubStats;
|
34 |
+
}
|
35 |
+
|
36 |
+
export interface GitHubTokenInfo {
|
37 |
+
token: string;
|
38 |
+
scope: string[];
|
39 |
+
avatar_url: string;
|
40 |
+
name: string | null;
|
41 |
+
created_at: string;
|
42 |
+
followers: number;
|
43 |
+
}
|
44 |
+
|
45 |
+
export interface GitHubRateLimits {
|
46 |
+
limit: number;
|
47 |
+
remaining: number;
|
48 |
+
reset: Date;
|
49 |
+
used: number;
|
50 |
+
}
|
51 |
+
|
52 |
+
export interface GitHubAuthState {
|
53 |
+
username: string;
|
54 |
+
tokenInfo: GitHubTokenInfo | null;
|
55 |
+
isConnected: boolean;
|
56 |
+
isVerifying: boolean;
|
57 |
+
isLoadingRepos: boolean;
|
58 |
+
rateLimits?: GitHubRateLimits;
|
59 |
+
}
|
app/components/settings/data/DataTab.tsx
CHANGED
@@ -305,9 +305,9 @@ export default function DataTab() {
|
|
305 |
>
|
306 |
<div className="flex items-center gap-2 mb-2">
|
307 |
<div className="i-ph:chat-circle-duotone w-5 h-5 text-purple-500" />
|
308 |
-
<h3 className="text-lg font-medium">Chat History</h3>
|
309 |
</div>
|
310 |
-
<p className="text-sm text-
|
311 |
<div className="flex gap-4">
|
312 |
<motion.button
|
313 |
className="inline-flex items-center gap-2 px-4 py-2 rounded-lg bg-purple-500 text-white text-sm hover:bg-purple-600"
|
@@ -339,9 +339,9 @@ export default function DataTab() {
|
|
339 |
>
|
340 |
<div className="flex items-center gap-2 mb-2">
|
341 |
<div className="i-ph:gear-duotone w-5 h-5 text-purple-500" />
|
342 |
-
<h3 className="text-lg font-medium">Settings Backup</h3>
|
343 |
</div>
|
344 |
-
<p className="text-sm text-
|
345 |
Export your settings to a JSON file or import settings from a previously exported file.
|
346 |
</p>
|
347 |
<div className="flex gap-4">
|
@@ -364,7 +364,7 @@ export default function DataTab() {
|
|
364 |
Import Settings
|
365 |
</motion.button>
|
366 |
<motion.button
|
367 |
-
className="inline-flex items-center gap-2 px-4 py-2 rounded-lg bg-yellow-50 text-yellow-600 text-sm hover:bg-yellow-100 dark:bg-yellow-500/10 dark:hover:bg-yellow-500/20"
|
368 |
whileHover={{ scale: 1.02 }}
|
369 |
whileTap={{ scale: 0.98 }}
|
370 |
onClick={() => setShowResetInlineConfirm(true)}
|
@@ -384,9 +384,9 @@ export default function DataTab() {
|
|
384 |
>
|
385 |
<div className="flex items-center gap-2 mb-2">
|
386 |
<div className="i-ph:key-duotone w-5 h-5 text-purple-500" />
|
387 |
-
<h3 className="text-lg font-medium">API Keys Management</h3>
|
388 |
</div>
|
389 |
-
<p className="text-sm text-
|
390 |
Import API keys from a JSON file or download a template to fill in your keys.
|
391 |
</p>
|
392 |
<div className="flex gap-4">
|
@@ -405,7 +405,7 @@ export default function DataTab() {
|
|
405 |
disabled={isDownloadingTemplate}
|
406 |
>
|
407 |
{isDownloadingTemplate ? (
|
408 |
-
<div className="i-ph:spinner-gap-bold animate-spin" />
|
409 |
) : (
|
410 |
<div className="i-ph:download-simple w-4 h-4" />
|
411 |
)}
|
|
|
305 |
>
|
306 |
<div className="flex items-center gap-2 mb-2">
|
307 |
<div className="i-ph:chat-circle-duotone w-5 h-5 text-purple-500" />
|
308 |
+
<h3 className="text-lg font-medium text-gray-900 dark:text-white">Chat History</h3>
|
309 |
</div>
|
310 |
+
<p className="text-sm text-gray-600 dark:text-gray-400 mb-4">Export or delete all your chat history.</p>
|
311 |
<div className="flex gap-4">
|
312 |
<motion.button
|
313 |
className="inline-flex items-center gap-2 px-4 py-2 rounded-lg bg-purple-500 text-white text-sm hover:bg-purple-600"
|
|
|
339 |
>
|
340 |
<div className="flex items-center gap-2 mb-2">
|
341 |
<div className="i-ph:gear-duotone w-5 h-5 text-purple-500" />
|
342 |
+
<h3 className="text-lg font-medium text-gray-900 dark:text-white">Settings Backup</h3>
|
343 |
</div>
|
344 |
+
<p className="text-sm text-gray-600 dark:text-gray-400 mb-4">
|
345 |
Export your settings to a JSON file or import settings from a previously exported file.
|
346 |
</p>
|
347 |
<div className="flex gap-4">
|
|
|
364 |
Import Settings
|
365 |
</motion.button>
|
366 |
<motion.button
|
367 |
+
className="inline-flex items-center gap-2 px-4 py-2 rounded-lg bg-yellow-50 text-yellow-600 text-sm hover:bg-yellow-100 dark:bg-yellow-500/10 dark:hover:bg-yellow-500/20 dark:text-yellow-500"
|
368 |
whileHover={{ scale: 1.02 }}
|
369 |
whileTap={{ scale: 0.98 }}
|
370 |
onClick={() => setShowResetInlineConfirm(true)}
|
|
|
384 |
>
|
385 |
<div className="flex items-center gap-2 mb-2">
|
386 |
<div className="i-ph:key-duotone w-5 h-5 text-purple-500" />
|
387 |
+
<h3 className="text-lg font-medium text-gray-900 dark:text-white">API Keys Management</h3>
|
388 |
</div>
|
389 |
+
<p className="text-sm text-gray-600 dark:text-gray-400 mb-4">
|
390 |
Import API keys from a JSON file or download a template to fill in your keys.
|
391 |
</p>
|
392 |
<div className="flex gap-4">
|
|
|
405 |
disabled={isDownloadingTemplate}
|
406 |
>
|
407 |
{isDownloadingTemplate ? (
|
408 |
+
<div className="i-ph:spinner-gap-bold animate-spin w-4 h-4" />
|
409 |
) : (
|
410 |
<div className="i-ph:download-simple w-4 h-4" />
|
411 |
)}
|
app/components/settings/debug/DebugTab.tsx
CHANGED
@@ -92,10 +92,12 @@ interface WebAppInfo {
|
|
92 |
nodeVersion: string;
|
93 |
dependencies: { [key: string]: string };
|
94 |
devDependencies: { [key: string]: string };
|
|
|
95 |
// Build Info
|
96 |
buildTime?: string;
|
97 |
buildNumber?: string;
|
98 |
environment?: string;
|
|
|
99 |
// Git Info
|
100 |
gitInfo?: {
|
101 |
branch: string;
|
@@ -104,6 +106,7 @@ interface WebAppInfo {
|
|
104 |
author: string;
|
105 |
remoteUrl: string;
|
106 |
};
|
|
|
107 |
// GitHub Repository Info
|
108 |
repoInfo?: {
|
109 |
name: string;
|
@@ -121,6 +124,39 @@ interface WebAppInfo {
|
|
121 |
};
|
122 |
}
|
123 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
124 |
export default function DebugTab() {
|
125 |
const [systemInfo, setSystemInfo] = useState<SystemInfo | null>(null);
|
126 |
const [webAppInfo, setWebAppInfo] = useState<WebAppInfo | null>(null);
|
@@ -328,23 +364,27 @@ export default function DebugTab() {
|
|
328 |
|
329 |
// Fetch local app info
|
330 |
const appInfoResponse = await fetch('/api/system/app-info');
|
|
|
331 |
if (!appInfoResponse.ok) {
|
332 |
throw new Error('Failed to fetch webapp info');
|
333 |
}
|
334 |
-
|
|
|
335 |
|
336 |
// Fetch git info
|
337 |
const gitInfoResponse = await fetch('/api/system/git-info');
|
338 |
-
let gitInfo
|
|
|
339 |
if (gitInfoResponse.ok) {
|
340 |
-
gitInfo = await gitInfoResponse.json();
|
341 |
}
|
342 |
|
343 |
// Fetch GitHub repository info
|
344 |
const repoInfoResponse = await fetch('https://api.github.com/repos/stackblitz-labs/bolt.diy');
|
345 |
-
let repoInfo
|
|
|
346 |
if (repoInfoResponse.ok) {
|
347 |
-
const repoData = await repoInfoResponse.json();
|
348 |
repoInfo = {
|
349 |
name: repoData.name,
|
350 |
fullName: repoData.full_name,
|
@@ -396,21 +436,6 @@ export default function DebugTab() {
|
|
396 |
return `${Math.round(size)} ${units[unitIndex]}`;
|
397 |
};
|
398 |
|
399 |
-
const handleLogSystemInfo = () => {
|
400 |
-
if (!systemInfo) {
|
401 |
-
return;
|
402 |
-
}
|
403 |
-
|
404 |
-
logStore.logSystem('System Information', {
|
405 |
-
os: systemInfo.os,
|
406 |
-
arch: systemInfo.arch,
|
407 |
-
cpus: systemInfo.cpus,
|
408 |
-
memory: systemInfo.memory,
|
409 |
-
node: systemInfo.node,
|
410 |
-
});
|
411 |
-
toast.success('System information logged');
|
412 |
-
};
|
413 |
-
|
414 |
const handleLogPerformance = () => {
|
415 |
try {
|
416 |
setLoading((prev) => ({ ...prev, performance: true }));
|
@@ -625,6 +650,26 @@ export default function DebugTab() {
|
|
625 |
Check Errors
|
626 |
</button>
|
627 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
628 |
<button
|
629 |
onClick={exportDebugInfo}
|
630 |
className={classNames(
|
@@ -640,67 +685,11 @@ export default function DebugTab() {
|
|
640 |
</button>
|
641 |
</div>
|
642 |
|
643 |
-
{/* Error Log Display */}
|
644 |
-
{errorLog.errors.length > 0 && (
|
645 |
-
<div className="mt-4">
|
646 |
-
<h3 className="text-lg font-semibold mb-2">Error Log</h3>
|
647 |
-
<div className="bg-gray-50 rounded-lg p-4 max-h-96 overflow-y-auto">
|
648 |
-
{errorLog.errors.map((error, index) => (
|
649 |
-
<div key={index} className="mb-4 last:mb-0 p-3 bg-white rounded border border-red-200">
|
650 |
-
<div className="flex items-center gap-2 text-sm text-gray-600">
|
651 |
-
<span className="font-medium">Type:</span> {error.type}
|
652 |
-
<span className="font-medium ml-4">Time:</span>
|
653 |
-
{new Date(error.timestamp).toLocaleString()}
|
654 |
-
</div>
|
655 |
-
<div className="mt-2 text-red-600">{error.message}</div>
|
656 |
-
{error.filename && (
|
657 |
-
<div className="mt-1 text-sm text-gray-500">
|
658 |
-
File: {error.filename} (Line: {error.lineNumber}, Column: {error.columnNumber})
|
659 |
-
</div>
|
660 |
-
)}
|
661 |
-
</div>
|
662 |
-
))}
|
663 |
-
</div>
|
664 |
-
</div>
|
665 |
-
)}
|
666 |
-
|
667 |
{/* System Information */}
|
668 |
<div className="p-6 rounded-xl bg-white dark:bg-[#0A0A0A] border border-[#E5E5E5] dark:border-[#1A1A1A]">
|
669 |
-
<div className="flex items-center
|
670 |
-
<div className="
|
671 |
-
|
672 |
-
<h3 className="text-base font-medium text-bolt-elements-textPrimary">System Information</h3>
|
673 |
-
</div>
|
674 |
-
<div className="flex items-center gap-2">
|
675 |
-
<button
|
676 |
-
onClick={handleLogSystemInfo}
|
677 |
-
className={classNames(
|
678 |
-
'flex items-center gap-2 px-3 py-2 rounded-lg text-sm',
|
679 |
-
'bg-[#F5F5F5] hover:bg-purple-500/10 hover:text-purple-500',
|
680 |
-
'dark:bg-[#1A1A1A] dark:hover:bg-purple-500/20',
|
681 |
-
'text-bolt-elements-textPrimary dark:hover:text-purple-500',
|
682 |
-
'transition-colors duration-200',
|
683 |
-
)}
|
684 |
-
>
|
685 |
-
<div className="i-ph:note text-bolt-elements-textSecondary w-4 h-4" />
|
686 |
-
Log
|
687 |
-
</button>
|
688 |
-
<button
|
689 |
-
onClick={getSystemInfo}
|
690 |
-
className={classNames(
|
691 |
-
'flex items-center gap-2 px-3 py-2 rounded-lg text-sm',
|
692 |
-
'bg-[#F5F5F5] hover:bg-purple-500/10 hover:text-purple-500',
|
693 |
-
'dark:bg-[#1A1A1A] dark:hover:bg-purple-500/20',
|
694 |
-
'text-bolt-elements-textPrimary dark:hover:text-purple-500',
|
695 |
-
'transition-colors duration-200',
|
696 |
-
{ 'opacity-50 cursor-not-allowed': loading.systemInfo },
|
697 |
-
)}
|
698 |
-
disabled={loading.systemInfo}
|
699 |
-
>
|
700 |
-
<div className={classNames('i-ph:arrows-clockwise w-4 h-4', loading.systemInfo ? 'animate-spin' : '')} />
|
701 |
-
Refresh
|
702 |
-
</button>
|
703 |
-
</div>
|
704 |
</div>
|
705 |
{systemInfo ? (
|
706 |
<div className="grid grid-cols-2 gap-6">
|
@@ -826,26 +815,9 @@ export default function DebugTab() {
|
|
826 |
|
827 |
{/* Performance Metrics */}
|
828 |
<div className="p-6 rounded-xl bg-white dark:bg-[#0A0A0A] border border-[#E5E5E5] dark:border-[#1A1A1A]">
|
829 |
-
<div className="flex items-center
|
830 |
-
<div className="
|
831 |
-
|
832 |
-
<h3 className="text-base font-medium text-bolt-elements-textPrimary">Performance Metrics</h3>
|
833 |
-
</div>
|
834 |
-
<button
|
835 |
-
onClick={handleLogPerformance}
|
836 |
-
className={classNames(
|
837 |
-
'flex items-center gap-2 px-3 py-2 rounded-lg text-sm',
|
838 |
-
'bg-[#F5F5F5] hover:bg-purple-500/10 hover:text-purple-500',
|
839 |
-
'dark:bg-[#1A1A1A] dark:hover:bg-purple-500/20',
|
840 |
-
'text-bolt-elements-textPrimary dark:hover:text-purple-500',
|
841 |
-
'focus:outline-none focus:ring-2 focus:ring-purple-500 focus:ring-offset-2 dark:focus:ring-offset-[#0A0A0A]',
|
842 |
-
{ 'opacity-50 cursor-not-allowed': loading.performance },
|
843 |
-
)}
|
844 |
-
disabled={loading.performance}
|
845 |
-
>
|
846 |
-
<div className={classNames('i-ph:note w-4 h-4', loading.performance ? 'animate-spin' : '')} />
|
847 |
-
Log Performance
|
848 |
-
</button>
|
849 |
</div>
|
850 |
{systemInfo && (
|
851 |
<div className="grid grid-cols-2 gap-4">
|
@@ -914,26 +886,9 @@ export default function DebugTab() {
|
|
914 |
|
915 |
{/* WebApp Information */}
|
916 |
<div className="p-6 rounded-xl bg-white dark:bg-[#0A0A0A] border border-[#E5E5E5] dark:border-[#1A1A1A]">
|
917 |
-
<div className="flex items-center
|
918 |
-
<div className="
|
919 |
-
|
920 |
-
<h3 className="text-base font-medium text-bolt-elements-textPrimary">WebApp Information</h3>
|
921 |
-
</div>
|
922 |
-
<button
|
923 |
-
onClick={getWebAppInfo}
|
924 |
-
className={classNames(
|
925 |
-
'flex items-center gap-2 px-3 py-2 rounded-lg text-sm',
|
926 |
-
'bg-[#F5F5F5] hover:bg-purple-500/10 hover:text-purple-500',
|
927 |
-
'dark:bg-[#1A1A1A] dark:hover:bg-purple-500/20',
|
928 |
-
'text-bolt-elements-textPrimary dark:hover:text-purple-500',
|
929 |
-
'focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 dark:focus:ring-offset-[#0A0A0A]',
|
930 |
-
{ 'opacity-50 cursor-not-allowed': loading.webAppInfo },
|
931 |
-
)}
|
932 |
-
disabled={loading.webAppInfo}
|
933 |
-
>
|
934 |
-
<div className={classNames('i-ph:arrows-clockwise w-4 h-4', loading.webAppInfo ? 'animate-spin' : '')} />
|
935 |
-
Refresh
|
936 |
-
</button>
|
937 |
</div>
|
938 |
{webAppInfo ? (
|
939 |
<div className="grid grid-cols-2 gap-4">
|
@@ -1008,18 +963,12 @@ export default function DebugTab() {
|
|
1008 |
<span className="text-bolt-elements-textSecondary">Git Info:</span>
|
1009 |
</div>
|
1010 |
<div className="pl-6 space-y-1">
|
1011 |
-
<div className="text-xs text-bolt-elements-textPrimary">
|
1012 |
-
|
1013 |
-
</div>
|
1014 |
-
<div className="text-xs text-bolt-elements-textPrimary">
|
1015 |
-
Commit: {webAppInfo.gitInfo.commit}
|
1016 |
-
</div>
|
1017 |
<div className="text-xs text-bolt-elements-textPrimary">
|
1018 |
Commit Time: {webAppInfo.gitInfo.commitTime}
|
1019 |
</div>
|
1020 |
-
<div className="text-xs text-bolt-elements-textPrimary">
|
1021 |
-
Author: {webAppInfo.gitInfo.author}
|
1022 |
-
</div>
|
1023 |
<div className="text-xs text-bolt-elements-textPrimary">
|
1024 |
Remote URL: {webAppInfo.gitInfo.remoteUrl}
|
1025 |
</div>
|
@@ -1033,21 +982,15 @@ export default function DebugTab() {
|
|
1033 |
<span className="text-bolt-elements-textSecondary">GitHub Repository:</span>
|
1034 |
</div>
|
1035 |
<div className="pl-6 space-y-1">
|
1036 |
-
<div className="text-xs text-bolt-elements-textPrimary">
|
1037 |
-
Name: {webAppInfo.repoInfo.name}
|
1038 |
-
</div>
|
1039 |
<div className="text-xs text-bolt-elements-textPrimary">
|
1040 |
Full Name: {webAppInfo.repoInfo.fullName}
|
1041 |
</div>
|
1042 |
<div className="text-xs text-bolt-elements-textPrimary">
|
1043 |
Description: {webAppInfo.repoInfo.description}
|
1044 |
</div>
|
1045 |
-
<div className="text-xs text-bolt-elements-textPrimary">
|
1046 |
-
|
1047 |
-
</div>
|
1048 |
-
<div className="text-xs text-bolt-elements-textPrimary">
|
1049 |
-
Forks: {webAppInfo.repoInfo.forks}
|
1050 |
-
</div>
|
1051 |
<div className="text-xs text-bolt-elements-textPrimary">
|
1052 |
Open Issues: {webAppInfo.repoInfo.openIssues}
|
1053 |
</div>
|
@@ -1077,26 +1020,9 @@ export default function DebugTab() {
|
|
1077 |
|
1078 |
{/* Error Check */}
|
1079 |
<div className="p-6 rounded-xl bg-white dark:bg-[#0A0A0A] border border-[#E5E5E5] dark:border-[#1A1A1A]">
|
1080 |
-
<div className="flex items-center
|
1081 |
-
<div className="
|
1082 |
-
|
1083 |
-
<h3 className="text-base font-medium text-bolt-elements-textPrimary">Error Check</h3>
|
1084 |
-
</div>
|
1085 |
-
<button
|
1086 |
-
onClick={checkErrors}
|
1087 |
-
className={classNames(
|
1088 |
-
'flex items-center gap-2 px-3 py-2 rounded-lg text-sm',
|
1089 |
-
'bg-[#F5F5F5] hover:bg-purple-500/10 hover:text-purple-500',
|
1090 |
-
'dark:bg-[#1A1A1A] dark:hover:bg-purple-500/20',
|
1091 |
-
'text-bolt-elements-textPrimary dark:hover:text-purple-500',
|
1092 |
-
'focus:outline-none focus:ring-2 focus:ring-purple-500 focus:ring-offset-2 dark:focus:ring-offset-[#0A0A0A]',
|
1093 |
-
{ 'opacity-50 cursor-not-allowed': loading.errors },
|
1094 |
-
)}
|
1095 |
-
disabled={loading.errors}
|
1096 |
-
>
|
1097 |
-
<div className={classNames('i-ph:magnifying-glass w-4 h-4', loading.errors ? 'animate-spin' : '')} />
|
1098 |
-
Check for Errors
|
1099 |
-
</button>
|
1100 |
</div>
|
1101 |
<div className="space-y-4">
|
1102 |
<div className="text-sm text-bolt-elements-textSecondary">
|
|
|
92 |
nodeVersion: string;
|
93 |
dependencies: { [key: string]: string };
|
94 |
devDependencies: { [key: string]: string };
|
95 |
+
|
96 |
// Build Info
|
97 |
buildTime?: string;
|
98 |
buildNumber?: string;
|
99 |
environment?: string;
|
100 |
+
|
101 |
// Git Info
|
102 |
gitInfo?: {
|
103 |
branch: string;
|
|
|
106 |
author: string;
|
107 |
remoteUrl: string;
|
108 |
};
|
109 |
+
|
110 |
// GitHub Repository Info
|
111 |
repoInfo?: {
|
112 |
name: string;
|
|
|
124 |
};
|
125 |
}
|
126 |
|
127 |
+
interface GitInfo {
|
128 |
+
branch: string;
|
129 |
+
commit: string;
|
130 |
+
commitTime: string;
|
131 |
+
author: string;
|
132 |
+
remoteUrl: string;
|
133 |
+
}
|
134 |
+
|
135 |
+
interface RepoData {
|
136 |
+
name: string;
|
137 |
+
full_name: string;
|
138 |
+
description: string;
|
139 |
+
stargazers_count: number;
|
140 |
+
forks_count: number;
|
141 |
+
open_issues_count: number;
|
142 |
+
default_branch: string;
|
143 |
+
updated_at: string;
|
144 |
+
owner: {
|
145 |
+
login: string;
|
146 |
+
avatar_url: string;
|
147 |
+
};
|
148 |
+
}
|
149 |
+
|
150 |
+
interface AppData {
|
151 |
+
name: string;
|
152 |
+
version: string;
|
153 |
+
description: string;
|
154 |
+
license: string;
|
155 |
+
nodeVersion: string;
|
156 |
+
dependencies: { [key: string]: string };
|
157 |
+
devDependencies: { [key: string]: string };
|
158 |
+
}
|
159 |
+
|
160 |
export default function DebugTab() {
|
161 |
const [systemInfo, setSystemInfo] = useState<SystemInfo | null>(null);
|
162 |
const [webAppInfo, setWebAppInfo] = useState<WebAppInfo | null>(null);
|
|
|
364 |
|
365 |
// Fetch local app info
|
366 |
const appInfoResponse = await fetch('/api/system/app-info');
|
367 |
+
|
368 |
if (!appInfoResponse.ok) {
|
369 |
throw new Error('Failed to fetch webapp info');
|
370 |
}
|
371 |
+
|
372 |
+
const appData = (await appInfoResponse.json()) as AppData;
|
373 |
|
374 |
// Fetch git info
|
375 |
const gitInfoResponse = await fetch('/api/system/git-info');
|
376 |
+
let gitInfo: GitInfo | undefined;
|
377 |
+
|
378 |
if (gitInfoResponse.ok) {
|
379 |
+
gitInfo = (await gitInfoResponse.json()) as GitInfo;
|
380 |
}
|
381 |
|
382 |
// Fetch GitHub repository info
|
383 |
const repoInfoResponse = await fetch('https://api.github.com/repos/stackblitz-labs/bolt.diy');
|
384 |
+
let repoInfo: WebAppInfo['repoInfo'] | undefined;
|
385 |
+
|
386 |
if (repoInfoResponse.ok) {
|
387 |
+
const repoData = (await repoInfoResponse.json()) as RepoData;
|
388 |
repoInfo = {
|
389 |
name: repoData.name,
|
390 |
fullName: repoData.full_name,
|
|
|
436 |
return `${Math.round(size)} ${units[unitIndex]}`;
|
437 |
};
|
438 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
439 |
const handleLogPerformance = () => {
|
440 |
try {
|
441 |
setLoading((prev) => ({ ...prev, performance: true }));
|
|
|
650 |
Check Errors
|
651 |
</button>
|
652 |
|
653 |
+
<button
|
654 |
+
onClick={getWebAppInfo}
|
655 |
+
disabled={loading.webAppInfo}
|
656 |
+
className={classNames(
|
657 |
+
'flex items-center gap-2 px-4 py-2 text-sm font-medium rounded-lg transition-colors',
|
658 |
+
'bg-[#F5F5F5] hover:bg-purple-500/10 hover:text-purple-500',
|
659 |
+
'dark:bg-[#1A1A1A] dark:hover:bg-purple-500/20',
|
660 |
+
'text-bolt-elements-textPrimary dark:hover:text-purple-500',
|
661 |
+
'focus:outline-none focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 dark:focus:ring-offset-[#0A0A0A]',
|
662 |
+
{ 'opacity-50 cursor-not-allowed': loading.webAppInfo },
|
663 |
+
)}
|
664 |
+
>
|
665 |
+
{loading.webAppInfo ? (
|
666 |
+
<div className="i-ph:spinner-gap w-4 h-4 animate-spin" />
|
667 |
+
) : (
|
668 |
+
<div className="i-ph:info w-4 h-4" />
|
669 |
+
)}
|
670 |
+
Fetch WebApp Info
|
671 |
+
</button>
|
672 |
+
|
673 |
<button
|
674 |
onClick={exportDebugInfo}
|
675 |
className={classNames(
|
|
|
685 |
</button>
|
686 |
</div>
|
687 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
688 |
{/* System Information */}
|
689 |
<div className="p-6 rounded-xl bg-white dark:bg-[#0A0A0A] border border-[#E5E5E5] dark:border-[#1A1A1A]">
|
690 |
+
<div className="flex items-center gap-3 mb-4">
|
691 |
+
<div className="i-ph:cpu text-purple-500 w-5 h-5" />
|
692 |
+
<h3 className="text-base font-medium text-bolt-elements-textPrimary">System Information</h3>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
693 |
</div>
|
694 |
{systemInfo ? (
|
695 |
<div className="grid grid-cols-2 gap-6">
|
|
|
815 |
|
816 |
{/* Performance Metrics */}
|
817 |
<div className="p-6 rounded-xl bg-white dark:bg-[#0A0A0A] border border-[#E5E5E5] dark:border-[#1A1A1A]">
|
818 |
+
<div className="flex items-center gap-3 mb-4">
|
819 |
+
<div className="i-ph:chart-line text-purple-500 w-5 h-5" />
|
820 |
+
<h3 className="text-base font-medium text-bolt-elements-textPrimary">Performance Metrics</h3>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
821 |
</div>
|
822 |
{systemInfo && (
|
823 |
<div className="grid grid-cols-2 gap-4">
|
|
|
886 |
|
887 |
{/* WebApp Information */}
|
888 |
<div className="p-6 rounded-xl bg-white dark:bg-[#0A0A0A] border border-[#E5E5E5] dark:border-[#1A1A1A]">
|
889 |
+
<div className="flex items-center gap-3 mb-4">
|
890 |
+
<div className="i-ph:info text-blue-500 w-5 h-5" />
|
891 |
+
<h3 className="text-base font-medium text-bolt-elements-textPrimary">WebApp Information</h3>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
892 |
</div>
|
893 |
{webAppInfo ? (
|
894 |
<div className="grid grid-cols-2 gap-4">
|
|
|
963 |
<span className="text-bolt-elements-textSecondary">Git Info:</span>
|
964 |
</div>
|
965 |
<div className="pl-6 space-y-1">
|
966 |
+
<div className="text-xs text-bolt-elements-textPrimary">Branch: {webAppInfo.gitInfo.branch}</div>
|
967 |
+
<div className="text-xs text-bolt-elements-textPrimary">Commit: {webAppInfo.gitInfo.commit}</div>
|
|
|
|
|
|
|
|
|
968 |
<div className="text-xs text-bolt-elements-textPrimary">
|
969 |
Commit Time: {webAppInfo.gitInfo.commitTime}
|
970 |
</div>
|
971 |
+
<div className="text-xs text-bolt-elements-textPrimary">Author: {webAppInfo.gitInfo.author}</div>
|
|
|
|
|
972 |
<div className="text-xs text-bolt-elements-textPrimary">
|
973 |
Remote URL: {webAppInfo.gitInfo.remoteUrl}
|
974 |
</div>
|
|
|
982 |
<span className="text-bolt-elements-textSecondary">GitHub Repository:</span>
|
983 |
</div>
|
984 |
<div className="pl-6 space-y-1">
|
985 |
+
<div className="text-xs text-bolt-elements-textPrimary">Name: {webAppInfo.repoInfo.name}</div>
|
|
|
|
|
986 |
<div className="text-xs text-bolt-elements-textPrimary">
|
987 |
Full Name: {webAppInfo.repoInfo.fullName}
|
988 |
</div>
|
989 |
<div className="text-xs text-bolt-elements-textPrimary">
|
990 |
Description: {webAppInfo.repoInfo.description}
|
991 |
</div>
|
992 |
+
<div className="text-xs text-bolt-elements-textPrimary">Stars: {webAppInfo.repoInfo.stars}</div>
|
993 |
+
<div className="text-xs text-bolt-elements-textPrimary">Forks: {webAppInfo.repoInfo.forks}</div>
|
|
|
|
|
|
|
|
|
994 |
<div className="text-xs text-bolt-elements-textPrimary">
|
995 |
Open Issues: {webAppInfo.repoInfo.openIssues}
|
996 |
</div>
|
|
|
1020 |
|
1021 |
{/* Error Check */}
|
1022 |
<div className="p-6 rounded-xl bg-white dark:bg-[#0A0A0A] border border-[#E5E5E5] dark:border-[#1A1A1A]">
|
1023 |
+
<div className="flex items-center gap-3 mb-4">
|
1024 |
+
<div className="i-ph:warning text-purple-500 w-5 h-5" />
|
1025 |
+
<h3 className="text-base font-medium text-bolt-elements-textPrimary">Error Check</h3>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1026 |
</div>
|
1027 |
<div className="space-y-4">
|
1028 |
<div className="text-sm text-bolt-elements-textSecondary">
|
app/components/settings/developer/DeveloperWindow.tsx
CHANGED
@@ -1,12 +1,18 @@
|
|
1 |
import * as RadixDialog from '@radix-ui/react-dialog';
|
2 |
import { motion } from 'framer-motion';
|
3 |
-
import { useState, useEffect } from 'react';
|
4 |
import { classNames } from '~/utils/classNames';
|
5 |
import { TabManagement } from './TabManagement';
|
6 |
import { TabTile } from '~/components/settings/shared/TabTile';
|
7 |
import { DialogTitle } from '~/components/ui/Dialog';
|
8 |
import type { TabType, TabVisibilityConfig } from '~/components/settings/settings.types';
|
9 |
-
import {
|
|
|
|
|
|
|
|
|
|
|
|
|
10 |
import { useStore } from '@nanostores/react';
|
11 |
import { DndProvider, useDrag, useDrop } from 'react-dnd';
|
12 |
import { HTML5Backend } from 'react-dnd-html5-backend';
|
@@ -24,6 +30,7 @@ import * as DropdownMenu from '@radix-ui/react-dropdown-menu';
|
|
24 |
import CloudProvidersTab from '~/components/settings/providers/CloudProvidersTab';
|
25 |
import LocalProvidersTab from '~/components/settings/providers/LocalProvidersTab';
|
26 |
import TaskManagerTab from '~/components/settings/task-manager/TaskManagerTab';
|
|
|
27 |
|
28 |
interface DraggableTabTileProps {
|
29 |
tab: TabVisibilityConfig;
|
@@ -83,8 +90,14 @@ const DraggableTabTile = ({
|
|
83 |
},
|
84 |
});
|
85 |
|
|
|
|
|
|
|
|
|
|
|
|
|
86 |
return (
|
87 |
-
<div ref={
|
88 |
<TabTile
|
89 |
tab={tab}
|
90 |
onClick={onClick}
|
@@ -104,15 +117,32 @@ interface DeveloperWindowProps {
|
|
104 |
}
|
105 |
|
106 |
export const DeveloperWindow = ({ open, onClose }: DeveloperWindowProps) => {
|
107 |
-
const tabConfiguration = useStore(tabConfigurationStore);
|
108 |
const [activeTab, setActiveTab] = useState<TabType | null>(null);
|
109 |
-
const [showTabManagement, setShowTabManagement] = useState(false);
|
110 |
const [loadingTab, setLoadingTab] = useState<TabType | null>(null);
|
|
|
|
|
|
|
111 |
const [profile, setProfile] = useState(() => {
|
112 |
const saved = localStorage.getItem('bolt_user_profile');
|
113 |
return saved ? JSON.parse(saved) : { avatar: null, notifications: true };
|
114 |
});
|
115 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
116 |
// Listen for profile changes
|
117 |
useEffect(() => {
|
118 |
const handleStorageChange = (e: StorageEvent) => {
|
@@ -134,6 +164,38 @@ export const DeveloperWindow = ({ open, onClose }: DeveloperWindowProps) => {
|
|
134 |
const { hasConnectionIssues, currentIssue, acknowledgeIssue } = useConnectionStatus();
|
135 |
const { hasActiveWarnings, activeIssues, acknowledgeAllIssues } = useDebugStatus();
|
136 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
137 |
const handleBack = () => {
|
138 |
if (showTabManagement) {
|
139 |
setShowTabManagement(false);
|
@@ -143,21 +205,55 @@ export const DeveloperWindow = ({ open, onClose }: DeveloperWindowProps) => {
|
|
143 |
};
|
144 |
|
145 |
// Only show tabs that are assigned to the developer window AND are visible
|
146 |
-
const visibleDeveloperTabs =
|
147 |
-
.
|
148 |
-
// Hide notifications tab if notifications are disabled
|
149 |
-
if (tab.id === 'notifications' && !profile.notifications) {
|
150 |
-
return false;
|
151 |
-
}
|
152 |
|
153 |
-
|
154 |
-
|
155 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
156 |
|
157 |
const moveTab = (dragIndex: number, hoverIndex: number) => {
|
158 |
const draggedTab = visibleDeveloperTabs[dragIndex];
|
159 |
const targetTab = visibleDeveloperTabs[hoverIndex];
|
160 |
|
|
|
|
|
161 |
// Update the order of the dragged and target tabs
|
162 |
const updatedDraggedTab = { ...draggedTab, order: targetTab.order };
|
163 |
const updatedTargetTab = { ...targetTab, order: draggedTab.order };
|
@@ -278,7 +374,10 @@ export const DeveloperWindow = ({ open, onClose }: DeveloperWindowProps) => {
|
|
278 |
<DndProvider backend={HTML5Backend}>
|
279 |
<RadixDialog.Root open={open}>
|
280 |
<RadixDialog.Portal>
|
281 |
-
<div
|
|
|
|
|
|
|
282 |
<RadixDialog.Overlay className="fixed inset-0">
|
283 |
<motion.div
|
284 |
className="absolute inset-0 bg-black/50 backdrop-blur-sm"
|
@@ -299,7 +398,7 @@ export const DeveloperWindow = ({ open, onClose }: DeveloperWindowProps) => {
|
|
299 |
'flex flex-col overflow-hidden',
|
300 |
)}
|
301 |
initial={{ opacity: 0, scale: 0.95, y: 20 }}
|
302 |
-
animate={{ opacity: 1, scale: 1, y: 0 }}
|
303 |
exit={{ opacity: 0, scale: 0.95, y: 20 }}
|
304 |
transition={{ duration: 0.2 }}
|
305 |
>
|
@@ -346,6 +445,16 @@ export const DeveloperWindow = ({ open, onClose }: DeveloperWindowProps) => {
|
|
346 |
</motion.button>
|
347 |
)}
|
348 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
349 |
<div className="relative">
|
350 |
<DropdownMenu.Root>
|
351 |
<DropdownMenu.Trigger asChild>
|
|
|
1 |
import * as RadixDialog from '@radix-ui/react-dialog';
|
2 |
import { motion } from 'framer-motion';
|
3 |
+
import { useState, useEffect, useMemo } from 'react';
|
4 |
import { classNames } from '~/utils/classNames';
|
5 |
import { TabManagement } from './TabManagement';
|
6 |
import { TabTile } from '~/components/settings/shared/TabTile';
|
7 |
import { DialogTitle } from '~/components/ui/Dialog';
|
8 |
import type { TabType, TabVisibilityConfig } from '~/components/settings/settings.types';
|
9 |
+
import {
|
10 |
+
tabConfigurationStore,
|
11 |
+
resetTabConfiguration,
|
12 |
+
updateTabConfiguration,
|
13 |
+
developerModeStore,
|
14 |
+
setDeveloperMode,
|
15 |
+
} from '~/lib/stores/settings';
|
16 |
import { useStore } from '@nanostores/react';
|
17 |
import { DndProvider, useDrag, useDrop } from 'react-dnd';
|
18 |
import { HTML5Backend } from 'react-dnd-html5-backend';
|
|
|
30 |
import CloudProvidersTab from '~/components/settings/providers/CloudProvidersTab';
|
31 |
import LocalProvidersTab from '~/components/settings/providers/LocalProvidersTab';
|
32 |
import TaskManagerTab from '~/components/settings/task-manager/TaskManagerTab';
|
33 |
+
import { Switch } from '~/components/ui/Switch';
|
34 |
|
35 |
interface DraggableTabTileProps {
|
36 |
tab: TabVisibilityConfig;
|
|
|
90 |
},
|
91 |
});
|
92 |
|
93 |
+
const dragDropRef = (node: HTMLDivElement | null) => {
|
94 |
+
if (node) {
|
95 |
+
drag(drop(node));
|
96 |
+
}
|
97 |
+
};
|
98 |
+
|
99 |
return (
|
100 |
+
<div ref={dragDropRef} style={{ opacity: isDragging ? 0.5 : 1 }}>
|
101 |
<TabTile
|
102 |
tab={tab}
|
103 |
onClick={onClick}
|
|
|
117 |
}
|
118 |
|
119 |
export const DeveloperWindow = ({ open, onClose }: DeveloperWindowProps) => {
|
|
|
120 |
const [activeTab, setActiveTab] = useState<TabType | null>(null);
|
|
|
121 |
const [loadingTab, setLoadingTab] = useState<TabType | null>(null);
|
122 |
+
const tabConfiguration = useStore(tabConfigurationStore);
|
123 |
+
const [showTabManagement, setShowTabManagement] = useState(false);
|
124 |
+
const developerMode = useStore(developerModeStore);
|
125 |
const [profile, setProfile] = useState(() => {
|
126 |
const saved = localStorage.getItem('bolt_user_profile');
|
127 |
return saved ? JSON.parse(saved) : { avatar: null, notifications: true };
|
128 |
});
|
129 |
|
130 |
+
// Handle developer mode change
|
131 |
+
const handleDeveloperModeChange = (checked: boolean) => {
|
132 |
+
setDeveloperMode(checked);
|
133 |
+
|
134 |
+
if (!checked) {
|
135 |
+
onClose();
|
136 |
+
}
|
137 |
+
};
|
138 |
+
|
139 |
+
// Ensure developer mode is true when window is opened
|
140 |
+
useEffect(() => {
|
141 |
+
if (open) {
|
142 |
+
setDeveloperMode(true);
|
143 |
+
}
|
144 |
+
}, [open]);
|
145 |
+
|
146 |
// Listen for profile changes
|
147 |
useEffect(() => {
|
148 |
const handleStorageChange = (e: StorageEvent) => {
|
|
|
164 |
const { hasConnectionIssues, currentIssue, acknowledgeIssue } = useConnectionStatus();
|
165 |
const { hasActiveWarnings, activeIssues, acknowledgeAllIssues } = useDebugStatus();
|
166 |
|
167 |
+
// Ensure tab configuration is properly initialized
|
168 |
+
useEffect(() => {
|
169 |
+
if (!tabConfiguration || !tabConfiguration.userTabs || !tabConfiguration.developerTabs) {
|
170 |
+
console.warn('Tab configuration is invalid in DeveloperWindow, resetting to defaults');
|
171 |
+
resetTabConfiguration();
|
172 |
+
} else {
|
173 |
+
// Validate tab configuration structure
|
174 |
+
const isValid =
|
175 |
+
tabConfiguration.userTabs.every(
|
176 |
+
(tab) =>
|
177 |
+
tab &&
|
178 |
+
typeof tab.id === 'string' &&
|
179 |
+
typeof tab.visible === 'boolean' &&
|
180 |
+
typeof tab.window === 'string' &&
|
181 |
+
typeof tab.order === 'number',
|
182 |
+
) &&
|
183 |
+
tabConfiguration.developerTabs.every(
|
184 |
+
(tab) =>
|
185 |
+
tab &&
|
186 |
+
typeof tab.id === 'string' &&
|
187 |
+
typeof tab.visible === 'boolean' &&
|
188 |
+
typeof tab.window === 'string' &&
|
189 |
+
typeof tab.order === 'number',
|
190 |
+
);
|
191 |
+
|
192 |
+
if (!isValid) {
|
193 |
+
console.warn('Tab configuration is malformed in DeveloperWindow, resetting to defaults');
|
194 |
+
resetTabConfiguration();
|
195 |
+
}
|
196 |
+
}
|
197 |
+
}, [tabConfiguration]);
|
198 |
+
|
199 |
const handleBack = () => {
|
200 |
if (showTabManagement) {
|
201 |
setShowTabManagement(false);
|
|
|
205 |
};
|
206 |
|
207 |
// Only show tabs that are assigned to the developer window AND are visible
|
208 |
+
const visibleDeveloperTabs = useMemo(() => {
|
209 |
+
console.log('Filtering developer tabs with configuration:', tabConfiguration);
|
|
|
|
|
|
|
|
|
210 |
|
211 |
+
if (!tabConfiguration?.developerTabs || !Array.isArray(tabConfiguration.developerTabs)) {
|
212 |
+
console.warn('Invalid tab configuration, using empty array');
|
213 |
+
return [];
|
214 |
+
}
|
215 |
+
|
216 |
+
return tabConfiguration.developerTabs
|
217 |
+
.filter((tab) => {
|
218 |
+
if (!tab || typeof tab.id !== 'string') {
|
219 |
+
console.warn('Invalid tab entry:', tab);
|
220 |
+
return false;
|
221 |
+
}
|
222 |
+
|
223 |
+
// Hide notifications tab if notifications are disabled
|
224 |
+
if (tab.id === 'notifications' && !profile.notifications) {
|
225 |
+
console.log('Hiding notifications tab due to disabled notifications');
|
226 |
+
return false;
|
227 |
+
}
|
228 |
+
|
229 |
+
// Ensure the tab has the required properties
|
230 |
+
if (typeof tab.visible !== 'boolean' || typeof tab.window !== 'string' || typeof tab.order !== 'number') {
|
231 |
+
console.warn('Tab missing required properties:', tab);
|
232 |
+
return false;
|
233 |
+
}
|
234 |
+
|
235 |
+
// Only show tabs that are explicitly visible and assigned to the developer window
|
236 |
+
const isVisible = tab.visible && tab.window === 'developer';
|
237 |
+
console.log(`Tab ${tab.id} visibility:`, isVisible);
|
238 |
+
|
239 |
+
return isVisible;
|
240 |
+
})
|
241 |
+
.sort((a: TabVisibilityConfig, b: TabVisibilityConfig) => {
|
242 |
+
const orderA = typeof a.order === 'number' ? a.order : 0;
|
243 |
+
const orderB = typeof b.order === 'number' ? b.order : 0;
|
244 |
+
|
245 |
+
return orderA - orderB;
|
246 |
+
});
|
247 |
+
}, [tabConfiguration, profile.notifications]);
|
248 |
+
|
249 |
+
console.log('Filtered visible developer tabs:', visibleDeveloperTabs);
|
250 |
|
251 |
const moveTab = (dragIndex: number, hoverIndex: number) => {
|
252 |
const draggedTab = visibleDeveloperTabs[dragIndex];
|
253 |
const targetTab = visibleDeveloperTabs[hoverIndex];
|
254 |
|
255 |
+
console.log('Moving developer tab:', { draggedTab, targetTab });
|
256 |
+
|
257 |
// Update the order of the dragged and target tabs
|
258 |
const updatedDraggedTab = { ...draggedTab, order: targetTab.order };
|
259 |
const updatedTargetTab = { ...targetTab, order: draggedTab.order };
|
|
|
374 |
<DndProvider backend={HTML5Backend}>
|
375 |
<RadixDialog.Root open={open}>
|
376 |
<RadixDialog.Portal>
|
377 |
+
<div
|
378 |
+
className="fixed inset-0 flex items-center justify-center z-[60]"
|
379 |
+
style={{ opacity: developerMode ? 1 : 0, transition: 'opacity 0.2s ease-in-out' }}
|
380 |
+
>
|
381 |
<RadixDialog.Overlay className="fixed inset-0">
|
382 |
<motion.div
|
383 |
className="absolute inset-0 bg-black/50 backdrop-blur-sm"
|
|
|
398 |
'flex flex-col overflow-hidden',
|
399 |
)}
|
400 |
initial={{ opacity: 0, scale: 0.95, y: 20 }}
|
401 |
+
animate={{ opacity: developerMode ? 1 : 0, scale: developerMode ? 1 : 0.95, y: developerMode ? 0 : 20 }}
|
402 |
exit={{ opacity: 0, scale: 0.95, y: 20 }}
|
403 |
transition={{ duration: 0.2 }}
|
404 |
>
|
|
|
445 |
</motion.button>
|
446 |
)}
|
447 |
|
448 |
+
<div className="flex items-center gap-2">
|
449 |
+
<Switch
|
450 |
+
checked={developerMode}
|
451 |
+
onCheckedChange={handleDeveloperModeChange}
|
452 |
+
className="data-[state=checked]:bg-purple-500"
|
453 |
+
aria-label="Toggle developer mode"
|
454 |
+
/>
|
455 |
+
<label className="text-sm text-gray-500 dark:text-gray-400">Switch to User Mode</label>
|
456 |
+
</div>
|
457 |
+
|
458 |
<div className="relative">
|
459 |
<DropdownMenu.Root>
|
460 |
<DropdownMenu.Trigger asChild>
|
app/components/settings/developer/TabManagement.tsx
CHANGED
@@ -37,7 +37,7 @@ const TabGroup = ({ title, description, tabs, onVisibilityChange, targetWindow }
|
|
37 |
const hiddenTabs = tabs.filter((tab) => !tab.visible).sort((a, b) => (a.order || 0) - (b.order || 0));
|
38 |
|
39 |
return (
|
40 |
-
<div className="mb-8 rounded-xl bg-white/5 p-6
|
41 |
<div className="mb-6">
|
42 |
<h3 className="flex items-center gap-2 text-lg font-medium text-gray-900 dark:text-white">
|
43 |
<span className="i-ph:layout-fill h-5 w-5 text-purple-500" />
|
|
|
37 |
const hiddenTabs = tabs.filter((tab) => !tab.visible).sort((a, b) => (a.order || 0) - (b.order || 0));
|
38 |
|
39 |
return (
|
40 |
+
<div className="mb-8 rounded-xl bg-white/5 p-6 dark:bg-gray-800/30">
|
41 |
<div className="mb-6">
|
42 |
<h3 className="flex items-center gap-2 text-lg font-medium text-gray-900 dark:text-white">
|
43 |
<span className="i-ph:layout-fill h-5 w-5 text-purple-500" />
|
app/components/settings/providers/LocalProvidersTab.tsx
CHANGED
@@ -10,8 +10,6 @@ import { settingsStyles } from '~/components/settings/settings.styles';
|
|
10 |
import { toast } from 'react-toastify';
|
11 |
import { BsBox, BsCodeSquare, BsRobot } from 'react-icons/bs';
|
12 |
import type { IconType } from 'react-icons';
|
13 |
-
import OllamaModelUpdater from './OllamaModelUpdater';
|
14 |
-
import { DialogRoot, Dialog } from '~/components/ui/Dialog';
|
15 |
import { BiChip } from 'react-icons/bi';
|
16 |
import { TbBrandOpenai } from 'react-icons/tb';
|
17 |
import { providerBaseUrlEnvKeys } from '~/utils/constants';
|
@@ -33,12 +31,33 @@ const PROVIDER_DESCRIPTIONS: Record<ProviderName, string> = {
|
|
33 |
OpenAILike: 'Connect to OpenAI-compatible API endpoints',
|
34 |
};
|
35 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
36 |
const LocalProvidersTab = () => {
|
37 |
const settings = useSettings();
|
38 |
const [filteredProviders, setFilteredProviders] = useState<IProviderConfig[]>([]);
|
39 |
const [categoryEnabled, setCategoryEnabled] = useState<boolean>(false);
|
40 |
-
const [showOllamaUpdater, setShowOllamaUpdater] = useState(false);
|
41 |
const [editingProvider, setEditingProvider] = useState<string | null>(null);
|
|
|
|
|
42 |
|
43 |
// Effect to filter and sort providers
|
44 |
useEffect(() => {
|
@@ -46,9 +65,32 @@ const LocalProvidersTab = () => {
|
|
46 |
.filter(([key]) => [...LOCAL_PROVIDERS, 'OpenAILike'].includes(key))
|
47 |
.map(([key, value]) => {
|
48 |
const provider = value as IProviderConfig;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
49 |
return {
|
50 |
name: key,
|
51 |
-
settings:
|
|
|
|
|
|
|
52 |
staticModels: provider.staticModels || [],
|
53 |
getDynamicModels: provider.getDynamicModels,
|
54 |
getApiKeyLink: provider.getApiKeyLink,
|
@@ -57,16 +99,135 @@ const LocalProvidersTab = () => {
|
|
57 |
} as IProviderConfig;
|
58 |
});
|
59 |
|
60 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
61 |
setFilteredProviders(sorted);
|
62 |
}, [settings.providers]);
|
63 |
|
|
|
|
|
|
|
|
|
|
|
|
|
64 |
// Add effect to update category toggle state based on provider states
|
65 |
useEffect(() => {
|
66 |
const newCategoryState = filteredProviders.every((p) => p.settings.enabled);
|
67 |
setCategoryEnabled(newCategoryState);
|
68 |
}, [filteredProviders]);
|
69 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
70 |
const handleToggleCategory = useCallback(
|
71 |
(enabled: boolean) => {
|
72 |
setCategoryEnabled(enabled);
|
@@ -106,6 +267,31 @@ const LocalProvidersTab = () => {
|
|
106 |
setEditingProvider(null);
|
107 |
};
|
108 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
109 |
return (
|
110 |
<div className="space-y-6">
|
111 |
<motion.div
|
@@ -139,7 +325,7 @@ const LocalProvidersTab = () => {
|
|
139 |
</div>
|
140 |
</div>
|
141 |
|
142 |
-
<div className="grid grid-cols-
|
143 |
{filteredProviders.map((provider, index) => (
|
144 |
<motion.div
|
145 |
key={provider.name}
|
@@ -150,6 +336,12 @@ const LocalProvidersTab = () => {
|
|
150 |
'transition-all duration-200',
|
151 |
'relative overflow-hidden group',
|
152 |
'flex flex-col',
|
|
|
|
|
|
|
|
|
|
|
|
|
153 |
)}
|
154 |
initial={{ opacity: 0, y: 20 }}
|
155 |
animate={{ opacity: 1, y: 0 }}
|
@@ -253,21 +445,109 @@ const LocalProvidersTab = () => {
|
|
253 |
</div>
|
254 |
</div>
|
255 |
)}
|
256 |
-
</div>
|
257 |
|
258 |
-
|
259 |
-
|
260 |
-
|
261 |
-
|
262 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
263 |
</div>
|
264 |
-
|
265 |
-
|
266 |
</motion.div>
|
267 |
)}
|
268 |
</div>
|
269 |
</div>
|
270 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
271 |
<motion.div
|
272 |
className="absolute inset-0 border-2 border-purple-500/0 rounded-lg pointer-events-none"
|
273 |
animate={{
|
@@ -276,36 +556,10 @@ const LocalProvidersTab = () => {
|
|
276 |
}}
|
277 |
transition={{ duration: 0.2 }}
|
278 |
/>
|
279 |
-
|
280 |
-
{provider.name === 'Ollama' && provider.settings.enabled && (
|
281 |
-
<motion.button
|
282 |
-
onClick={() => setShowOllamaUpdater(true)}
|
283 |
-
className={classNames(
|
284 |
-
settingsStyles.button.base,
|
285 |
-
settingsStyles.button.secondary,
|
286 |
-
'ml-2',
|
287 |
-
'hover:bg-purple-500/10 hover:text-purple-500',
|
288 |
-
'dark:bg-[#1A1A1A] dark:hover:bg-purple-500/20 dark:text-bolt-elements-textPrimary dark:hover:text-purple-500',
|
289 |
-
)}
|
290 |
-
whileHover={{ scale: 1.02 }}
|
291 |
-
whileTap={{ scale: 0.98 }}
|
292 |
-
>
|
293 |
-
<div className="i-ph:arrows-clockwise" />
|
294 |
-
Update Models
|
295 |
-
</motion.button>
|
296 |
-
)}
|
297 |
</motion.div>
|
298 |
))}
|
299 |
</div>
|
300 |
</motion.div>
|
301 |
-
|
302 |
-
<DialogRoot open={showOllamaUpdater} onOpenChange={setShowOllamaUpdater}>
|
303 |
-
<Dialog>
|
304 |
-
<div className="p-6">
|
305 |
-
<OllamaModelUpdater />
|
306 |
-
</div>
|
307 |
-
</Dialog>
|
308 |
-
</DialogRoot>
|
309 |
</div>
|
310 |
);
|
311 |
};
|
|
|
10 |
import { toast } from 'react-toastify';
|
11 |
import { BsBox, BsCodeSquare, BsRobot } from 'react-icons/bs';
|
12 |
import type { IconType } from 'react-icons';
|
|
|
|
|
13 |
import { BiChip } from 'react-icons/bi';
|
14 |
import { TbBrandOpenai } from 'react-icons/tb';
|
15 |
import { providerBaseUrlEnvKeys } from '~/utils/constants';
|
|
|
31 |
OpenAILike: 'Connect to OpenAI-compatible API endpoints',
|
32 |
};
|
33 |
|
34 |
+
interface OllamaModel {
|
35 |
+
name: string;
|
36 |
+
digest: string;
|
37 |
+
size: number;
|
38 |
+
modified_at: string;
|
39 |
+
details?: {
|
40 |
+
family: string;
|
41 |
+
parameter_size: string;
|
42 |
+
quantization_level: string;
|
43 |
+
};
|
44 |
+
status?: 'idle' | 'updating' | 'updated' | 'error' | 'checking';
|
45 |
+
error?: string;
|
46 |
+
newDigest?: string;
|
47 |
+
progress?: {
|
48 |
+
current: number;
|
49 |
+
total: number;
|
50 |
+
status: string;
|
51 |
+
};
|
52 |
+
}
|
53 |
+
|
54 |
const LocalProvidersTab = () => {
|
55 |
const settings = useSettings();
|
56 |
const [filteredProviders, setFilteredProviders] = useState<IProviderConfig[]>([]);
|
57 |
const [categoryEnabled, setCategoryEnabled] = useState<boolean>(false);
|
|
|
58 |
const [editingProvider, setEditingProvider] = useState<string | null>(null);
|
59 |
+
const [ollamaModels, setOllamaModels] = useState<OllamaModel[]>([]);
|
60 |
+
const [isLoadingModels, setIsLoadingModels] = useState(false);
|
61 |
|
62 |
// Effect to filter and sort providers
|
63 |
useEffect(() => {
|
|
|
65 |
.filter(([key]) => [...LOCAL_PROVIDERS, 'OpenAILike'].includes(key))
|
66 |
.map(([key, value]) => {
|
67 |
const provider = value as IProviderConfig;
|
68 |
+
const envKey = providerBaseUrlEnvKeys[key]?.baseUrlKey;
|
69 |
+
|
70 |
+
// Get environment URL safely
|
71 |
+
const envUrl = envKey ? (import.meta.env[envKey] as string | undefined) : undefined;
|
72 |
+
|
73 |
+
console.log(`Checking env URL for ${key}:`, {
|
74 |
+
envKey,
|
75 |
+
envUrl,
|
76 |
+
currentBaseUrl: provider.settings.baseUrl,
|
77 |
+
});
|
78 |
+
|
79 |
+
// If there's an environment URL and no base URL set, update it
|
80 |
+
if (envUrl && !provider.settings.baseUrl) {
|
81 |
+
console.log(`Setting base URL for ${key} from env:`, envUrl);
|
82 |
+
settings.updateProviderSettings(key, {
|
83 |
+
...provider.settings,
|
84 |
+
baseUrl: envUrl,
|
85 |
+
});
|
86 |
+
}
|
87 |
+
|
88 |
return {
|
89 |
name: key,
|
90 |
+
settings: {
|
91 |
+
...provider.settings,
|
92 |
+
baseUrl: provider.settings.baseUrl || envUrl,
|
93 |
+
},
|
94 |
staticModels: provider.staticModels || [],
|
95 |
getDynamicModels: provider.getDynamicModels,
|
96 |
getApiKeyLink: provider.getApiKeyLink,
|
|
|
99 |
} as IProviderConfig;
|
100 |
});
|
101 |
|
102 |
+
// Custom sort function to ensure LMStudio appears before OpenAILike
|
103 |
+
const sorted = newFilteredProviders.sort((a, b) => {
|
104 |
+
if (a.name === 'LMStudio') {
|
105 |
+
return -1;
|
106 |
+
}
|
107 |
+
|
108 |
+
if (b.name === 'LMStudio') {
|
109 |
+
return 1;
|
110 |
+
}
|
111 |
+
|
112 |
+
if (a.name === 'OpenAILike') {
|
113 |
+
return 1;
|
114 |
+
}
|
115 |
+
|
116 |
+
if (b.name === 'OpenAILike') {
|
117 |
+
return -1;
|
118 |
+
}
|
119 |
+
|
120 |
+
return a.name.localeCompare(b.name);
|
121 |
+
});
|
122 |
setFilteredProviders(sorted);
|
123 |
}, [settings.providers]);
|
124 |
|
125 |
+
// Helper function to safely get environment URL
|
126 |
+
const getEnvUrl = (provider: IProviderConfig): string | undefined => {
|
127 |
+
const envKey = providerBaseUrlEnvKeys[provider.name]?.baseUrlKey;
|
128 |
+
return envKey ? (import.meta.env[envKey] as string | undefined) : undefined;
|
129 |
+
};
|
130 |
+
|
131 |
// Add effect to update category toggle state based on provider states
|
132 |
useEffect(() => {
|
133 |
const newCategoryState = filteredProviders.every((p) => p.settings.enabled);
|
134 |
setCategoryEnabled(newCategoryState);
|
135 |
}, [filteredProviders]);
|
136 |
|
137 |
+
// Fetch Ollama models when enabled
|
138 |
+
useEffect(() => {
|
139 |
+
const ollamaProvider = filteredProviders.find((p) => p.name === 'Ollama');
|
140 |
+
|
141 |
+
if (ollamaProvider?.settings.enabled) {
|
142 |
+
fetchOllamaModels();
|
143 |
+
}
|
144 |
+
}, [filteredProviders]);
|
145 |
+
|
146 |
+
const fetchOllamaModels = async () => {
|
147 |
+
try {
|
148 |
+
setIsLoadingModels(true);
|
149 |
+
|
150 |
+
const response = await fetch('http://127.0.0.1:11434/api/tags');
|
151 |
+
const data = (await response.json()) as { models: OllamaModel[] };
|
152 |
+
|
153 |
+
setOllamaModels(
|
154 |
+
data.models.map((model) => ({
|
155 |
+
...model,
|
156 |
+
status: 'idle' as const,
|
157 |
+
})),
|
158 |
+
);
|
159 |
+
} catch (error) {
|
160 |
+
console.error('Error fetching Ollama models:', error);
|
161 |
+
} finally {
|
162 |
+
setIsLoadingModels(false);
|
163 |
+
}
|
164 |
+
};
|
165 |
+
|
166 |
+
const updateOllamaModel = async (modelName: string): Promise<{ success: boolean; newDigest?: string }> => {
|
167 |
+
try {
|
168 |
+
const response = await fetch('http://127.0.0.1:11434/api/pull', {
|
169 |
+
method: 'POST',
|
170 |
+
headers: { 'Content-Type': 'application/json' },
|
171 |
+
body: JSON.stringify({ name: modelName }),
|
172 |
+
});
|
173 |
+
|
174 |
+
if (!response.ok) {
|
175 |
+
throw new Error(`Failed to update ${modelName}`);
|
176 |
+
}
|
177 |
+
|
178 |
+
const reader = response.body?.getReader();
|
179 |
+
|
180 |
+
if (!reader) {
|
181 |
+
throw new Error('No response reader available');
|
182 |
+
}
|
183 |
+
|
184 |
+
while (true) {
|
185 |
+
const { done, value } = await reader.read();
|
186 |
+
|
187 |
+
if (done) {
|
188 |
+
break;
|
189 |
+
}
|
190 |
+
|
191 |
+
const text = new TextDecoder().decode(value);
|
192 |
+
const lines = text.split('\n').filter(Boolean);
|
193 |
+
|
194 |
+
for (const line of lines) {
|
195 |
+
const data = JSON.parse(line) as {
|
196 |
+
status: string;
|
197 |
+
completed?: number;
|
198 |
+
total?: number;
|
199 |
+
digest?: string;
|
200 |
+
};
|
201 |
+
|
202 |
+
setOllamaModels((current) =>
|
203 |
+
current.map((m) =>
|
204 |
+
m.name === modelName
|
205 |
+
? {
|
206 |
+
...m,
|
207 |
+
progress: {
|
208 |
+
current: data.completed || 0,
|
209 |
+
total: data.total || 0,
|
210 |
+
status: data.status,
|
211 |
+
},
|
212 |
+
newDigest: data.digest,
|
213 |
+
}
|
214 |
+
: m,
|
215 |
+
),
|
216 |
+
);
|
217 |
+
}
|
218 |
+
}
|
219 |
+
|
220 |
+
const updatedResponse = await fetch('http://127.0.0.1:11434/api/tags');
|
221 |
+
const updatedData = (await updatedResponse.json()) as { models: OllamaModel[] };
|
222 |
+
const updatedModel = updatedData.models.find((m) => m.name === modelName);
|
223 |
+
|
224 |
+
return { success: true, newDigest: updatedModel?.digest };
|
225 |
+
} catch (error) {
|
226 |
+
console.error(`Error updating ${modelName}:`, error);
|
227 |
+
return { success: false };
|
228 |
+
}
|
229 |
+
};
|
230 |
+
|
231 |
const handleToggleCategory = useCallback(
|
232 |
(enabled: boolean) => {
|
233 |
setCategoryEnabled(enabled);
|
|
|
267 |
setEditingProvider(null);
|
268 |
};
|
269 |
|
270 |
+
const handleUpdateOllamaModel = async (modelName: string) => {
|
271 |
+
setOllamaModels((current) => current.map((m) => (m.name === modelName ? { ...m, status: 'updating' } : m)));
|
272 |
+
|
273 |
+
const { success, newDigest } = await updateOllamaModel(modelName);
|
274 |
+
|
275 |
+
setOllamaModels((current) =>
|
276 |
+
current.map((m) =>
|
277 |
+
m.name === modelName
|
278 |
+
? {
|
279 |
+
...m,
|
280 |
+
status: success ? 'updated' : 'error',
|
281 |
+
error: success ? undefined : 'Update failed',
|
282 |
+
newDigest,
|
283 |
+
}
|
284 |
+
: m,
|
285 |
+
),
|
286 |
+
);
|
287 |
+
|
288 |
+
if (success) {
|
289 |
+
toast.success(`Updated ${modelName}`);
|
290 |
+
} else {
|
291 |
+
toast.error(`Failed to update ${modelName}`);
|
292 |
+
}
|
293 |
+
};
|
294 |
+
|
295 |
return (
|
296 |
<div className="space-y-6">
|
297 |
<motion.div
|
|
|
325 |
</div>
|
326 |
</div>
|
327 |
|
328 |
+
<div className="grid grid-cols-2 gap-4">
|
329 |
{filteredProviders.map((provider, index) => (
|
330 |
<motion.div
|
331 |
key={provider.name}
|
|
|
336 |
'transition-all duration-200',
|
337 |
'relative overflow-hidden group',
|
338 |
'flex flex-col',
|
339 |
+
|
340 |
+
// Make Ollama span 2 rows
|
341 |
+
provider.name === 'Ollama' ? 'row-span-2' : '',
|
342 |
+
|
343 |
+
// Place Ollama in the second column
|
344 |
+
provider.name === 'Ollama' ? 'col-start-2' : 'col-start-1',
|
345 |
)}
|
346 |
initial={{ opacity: 0, y: 20 }}
|
347 |
animate={{ opacity: 1, y: 0 }}
|
|
|
445 |
</div>
|
446 |
</div>
|
447 |
)}
|
|
|
448 |
|
449 |
+
{providerBaseUrlEnvKeys[provider.name]?.baseUrlKey && (
|
450 |
+
<div className="mt-2 text-xs">
|
451 |
+
<div className="flex items-center gap-1">
|
452 |
+
<div
|
453 |
+
className={
|
454 |
+
getEnvUrl(provider)
|
455 |
+
? 'i-ph:check-circle text-green-500'
|
456 |
+
: 'i-ph:warning-circle text-yellow-500'
|
457 |
+
}
|
458 |
+
/>
|
459 |
+
<span className={getEnvUrl(provider) ? 'text-green-500' : 'text-yellow-500'}>
|
460 |
+
{getEnvUrl(provider)
|
461 |
+
? 'Environment URL set in .env.local'
|
462 |
+
: 'Environment URL not set in .env.local'}
|
463 |
+
</span>
|
464 |
+
</div>
|
465 |
</div>
|
466 |
+
)}
|
467 |
+
</div>
|
468 |
</motion.div>
|
469 |
)}
|
470 |
</div>
|
471 |
</div>
|
472 |
|
473 |
+
{provider.name === 'Ollama' && provider.settings.enabled && (
|
474 |
+
<div className="mt-4 space-y-2">
|
475 |
+
<div className="flex items-center justify-between">
|
476 |
+
<div className="flex items-center gap-2">
|
477 |
+
<div className="i-ph:cube-duotone text-purple-500" />
|
478 |
+
<span className="text-sm font-medium text-bolt-elements-textPrimary">Installed Models</span>
|
479 |
+
</div>
|
480 |
+
{isLoadingModels ? (
|
481 |
+
<div className="flex items-center gap-2 text-sm text-bolt-elements-textSecondary">
|
482 |
+
<div className="i-ph:spinner-gap-bold animate-spin w-4 h-4" />
|
483 |
+
Loading models...
|
484 |
+
</div>
|
485 |
+
) : (
|
486 |
+
<span className="text-sm text-bolt-elements-textSecondary">
|
487 |
+
{ollamaModels.length} models available
|
488 |
+
</span>
|
489 |
+
)}
|
490 |
+
</div>
|
491 |
+
|
492 |
+
<div className="space-y-2">
|
493 |
+
{ollamaModels.map((model) => (
|
494 |
+
<div
|
495 |
+
key={model.name}
|
496 |
+
className="flex items-center justify-between p-2 rounded-lg bg-bolt-elements-background-depth-3"
|
497 |
+
>
|
498 |
+
<div className="flex flex-col gap-1">
|
499 |
+
<div className="flex items-center gap-2">
|
500 |
+
<span className="text-sm text-bolt-elements-textPrimary">{model.name}</span>
|
501 |
+
{model.status === 'updating' && (
|
502 |
+
<div className="i-ph:spinner-gap-bold animate-spin w-4 h-4 text-purple-500" />
|
503 |
+
)}
|
504 |
+
{model.status === 'updated' && <div className="i-ph:check-circle text-green-500" />}
|
505 |
+
{model.status === 'error' && <div className="i-ph:x-circle text-red-500" />}
|
506 |
+
</div>
|
507 |
+
<div className="flex items-center gap-2 text-xs text-bolt-elements-textSecondary">
|
508 |
+
<span>Version: {model.digest.substring(0, 7)}</span>
|
509 |
+
{model.status === 'updated' && model.newDigest && (
|
510 |
+
<>
|
511 |
+
<div className="i-ph:arrow-right w-3 h-3" />
|
512 |
+
<span className="text-green-500">{model.newDigest.substring(0, 7)}</span>
|
513 |
+
</>
|
514 |
+
)}
|
515 |
+
{model.progress && (
|
516 |
+
<span className="ml-2">
|
517 |
+
{model.progress.status}{' '}
|
518 |
+
{model.progress.total > 0 && (
|
519 |
+
<>({Math.round((model.progress.current / model.progress.total) * 100)}%)</>
|
520 |
+
)}
|
521 |
+
</span>
|
522 |
+
)}
|
523 |
+
{model.details && (
|
524 |
+
<span className="ml-2">
|
525 |
+
({model.details.parameter_size}, {model.details.quantization_level})
|
526 |
+
</span>
|
527 |
+
)}
|
528 |
+
</div>
|
529 |
+
</div>
|
530 |
+
<motion.button
|
531 |
+
onClick={() => handleUpdateOllamaModel(model.name)}
|
532 |
+
disabled={model.status === 'updating'}
|
533 |
+
className={classNames(
|
534 |
+
settingsStyles.button.base,
|
535 |
+
settingsStyles.button.secondary,
|
536 |
+
'hover:bg-purple-500/10 hover:text-purple-500',
|
537 |
+
'dark:bg-[#1A1A1A] dark:hover:bg-purple-500/20 dark:text-bolt-elements-textPrimary dark:hover:text-purple-500',
|
538 |
+
)}
|
539 |
+
whileHover={{ scale: 1.02 }}
|
540 |
+
whileTap={{ scale: 0.98 }}
|
541 |
+
>
|
542 |
+
<div className="i-ph:arrows-clockwise" />
|
543 |
+
Update
|
544 |
+
</motion.button>
|
545 |
+
</div>
|
546 |
+
))}
|
547 |
+
</div>
|
548 |
+
</div>
|
549 |
+
)}
|
550 |
+
|
551 |
<motion.div
|
552 |
className="absolute inset-0 border-2 border-purple-500/0 rounded-lg pointer-events-none"
|
553 |
animate={{
|
|
|
556 |
}}
|
557 |
transition={{ duration: 0.2 }}
|
558 |
/>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
559 |
</motion.div>
|
560 |
))}
|
561 |
</div>
|
562 |
</motion.div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
563 |
</div>
|
564 |
);
|
565 |
};
|
app/components/settings/settings/SettingsTab.tsx
CHANGED
@@ -6,6 +6,8 @@ import { Switch } from '~/components/ui/Switch';
|
|
6 |
import { themeStore, kTheme } from '~/lib/stores/theme';
|
7 |
import type { UserProfile } from '~/components/settings/settings.types';
|
8 |
import { settingsStyles } from '~/components/settings/settings.styles';
|
|
|
|
|
9 |
|
10 |
export default function SettingsTab() {
|
11 |
const [currentTimezone, setCurrentTimezone] = useState('');
|
@@ -212,6 +214,39 @@ export default function SettingsTab() {
|
|
212 |
</select>
|
213 |
</div>
|
214 |
</motion.div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
215 |
</div>
|
216 |
);
|
217 |
}
|
|
|
6 |
import { themeStore, kTheme } from '~/lib/stores/theme';
|
7 |
import type { UserProfile } from '~/components/settings/settings.types';
|
8 |
import { settingsStyles } from '~/components/settings/settings.styles';
|
9 |
+
import { useStore } from '@nanostores/react';
|
10 |
+
import { shortcutsStore } from '~/lib/stores/settings';
|
11 |
|
12 |
export default function SettingsTab() {
|
13 |
const [currentTimezone, setCurrentTimezone] = useState('');
|
|
|
214 |
</select>
|
215 |
</div>
|
216 |
</motion.div>
|
217 |
+
|
218 |
+
{/* Keyboard Shortcuts */}
|
219 |
+
<motion.div
|
220 |
+
className="bg-white dark:bg-[#0A0A0A] rounded-lg shadow-sm dark:shadow-none p-4"
|
221 |
+
initial={{ opacity: 0, y: 20 }}
|
222 |
+
animate={{ opacity: 1, y: 0 }}
|
223 |
+
transition={{ delay: 0.3 }}
|
224 |
+
>
|
225 |
+
<div className="flex items-center gap-2 mb-4">
|
226 |
+
<div className="i-ph:keyboard-fill w-4 h-4 text-purple-500" />
|
227 |
+
<span className="text-sm font-medium text-bolt-elements-textPrimary">Keyboard Shortcuts</span>
|
228 |
+
</div>
|
229 |
+
|
230 |
+
<div className="space-y-2">
|
231 |
+
{Object.entries(useStore(shortcutsStore)).map(([name, shortcut]) => (
|
232 |
+
<div key={name} className="flex items-center justify-between p-2 rounded-lg bg-[#FAFAFA] dark:bg-[#1A1A1A]">
|
233 |
+
<span className="text-sm text-bolt-elements-textPrimary capitalize">
|
234 |
+
{name.replace(/([A-Z])/g, ' $1').toLowerCase()}
|
235 |
+
</span>
|
236 |
+
<div className="flex items-center gap-1">
|
237 |
+
{shortcut.ctrlOrMetaKey && (
|
238 |
+
<kbd className="kdb">{navigator.platform.includes('Mac') ? '⌘' : 'Ctrl'}</kbd>
|
239 |
+
)}
|
240 |
+
{shortcut.ctrlKey && <kbd className="kdb">Ctrl</kbd>}
|
241 |
+
{shortcut.metaKey && <kbd className="kdb">⌘</kbd>}
|
242 |
+
{shortcut.shiftKey && <kbd className="kdb">⇧</kbd>}
|
243 |
+
{shortcut.altKey && <kbd className="kdb">⌥</kbd>}
|
244 |
+
<kbd className="kdb">{shortcut.key.toUpperCase()}</kbd>
|
245 |
+
</div>
|
246 |
+
</div>
|
247 |
+
))}
|
248 |
+
</div>
|
249 |
+
</motion.div>
|
250 |
</div>
|
251 |
);
|
252 |
}
|
app/components/settings/shared/DraggableTabList.tsx
CHANGED
@@ -36,7 +36,7 @@ const DraggableTabItem = ({
|
|
36 |
onWindowChange,
|
37 |
onVisibilityChange,
|
38 |
}: DraggableTabItemProps) => {
|
39 |
-
const [{ isDragging },
|
40 |
type: 'tab',
|
41 |
item: { type: 'tab', index, id: tab.id },
|
42 |
collect: (monitor) => ({
|
@@ -44,7 +44,7 @@ const DraggableTabItem = ({
|
|
44 |
}),
|
45 |
});
|
46 |
|
47 |
-
const [,
|
48 |
accept: 'tab',
|
49 |
hover: (item: DragItem, monitor) => {
|
50 |
if (!monitor.isOver({ shallow: true })) {
|
@@ -64,9 +64,14 @@ const DraggableTabItem = ({
|
|
64 |
},
|
65 |
});
|
66 |
|
|
|
|
|
|
|
|
|
|
|
67 |
return (
|
68 |
<motion.div
|
69 |
-
ref={
|
70 |
initial={false}
|
71 |
animate={{
|
72 |
scale: isDragging ? 1.02 : 1,
|
|
|
36 |
onWindowChange,
|
37 |
onVisibilityChange,
|
38 |
}: DraggableTabItemProps) => {
|
39 |
+
const [{ isDragging }, dragRef] = useDrag({
|
40 |
type: 'tab',
|
41 |
item: { type: 'tab', index, id: tab.id },
|
42 |
collect: (monitor) => ({
|
|
|
44 |
}),
|
45 |
});
|
46 |
|
47 |
+
const [, dropRef] = useDrop({
|
48 |
accept: 'tab',
|
49 |
hover: (item: DragItem, monitor) => {
|
50 |
if (!monitor.isOver({ shallow: true })) {
|
|
|
64 |
},
|
65 |
});
|
66 |
|
67 |
+
const ref = (node: HTMLDivElement | null) => {
|
68 |
+
dragRef(node);
|
69 |
+
dropRef(node);
|
70 |
+
};
|
71 |
+
|
72 |
return (
|
73 |
<motion.div
|
74 |
+
ref={ref}
|
75 |
initial={false}
|
76 |
animate={{
|
77 |
scale: isDragging ? 1.02 : 1,
|
app/components/settings/shared/TabTile.tsx
CHANGED
@@ -55,7 +55,7 @@ export const TabTile = ({
|
|
55 |
'border border-[#E5E5E5]/50 dark:border-[#333333]/50',
|
56 |
|
57 |
// Shadow and glass effect
|
58 |
-
'shadow-sm
|
59 |
'dark:shadow-[0_0_15px_rgba(0,0,0,0.1)]',
|
60 |
'dark:bg-opacity-50',
|
61 |
|
|
|
55 |
'border border-[#E5E5E5]/50 dark:border-[#333333]/50',
|
56 |
|
57 |
// Shadow and glass effect
|
58 |
+
'shadow-sm',
|
59 |
'dark:shadow-[0_0_15px_rgba(0,0,0,0.1)]',
|
60 |
'dark:bg-opacity-50',
|
61 |
|
app/components/settings/user/UsersWindow.tsx
CHANGED
@@ -1,7 +1,7 @@
|
|
1 |
import * as RadixDialog from '@radix-ui/react-dialog';
|
2 |
import * as DropdownMenu from '@radix-ui/react-dropdown-menu';
|
3 |
import { motion } from 'framer-motion';
|
4 |
-
import { useState, useEffect } from 'react';
|
5 |
import { classNames } from '~/utils/classNames';
|
6 |
import { DialogTitle } from '~/components/ui/Dialog';
|
7 |
import { Switch } from '~/components/ui/Switch';
|
@@ -9,7 +9,6 @@ import type { TabType, TabVisibilityConfig } from '~/components/settings/setting
|
|
9 |
import { TAB_LABELS } from '~/components/settings/settings.types';
|
10 |
import { DeveloperWindow } from '~/components/settings/developer/DeveloperWindow';
|
11 |
import { TabTile } from '~/components/settings/shared/TabTile';
|
12 |
-
import { tabConfigurationStore, updateTabConfiguration } from '~/lib/stores/settings';
|
13 |
import { useStore } from '@nanostores/react';
|
14 |
import { DndProvider, useDrag, useDrop } from 'react-dnd';
|
15 |
import { HTML5Backend } from 'react-dnd-html5-backend';
|
@@ -30,6 +29,13 @@ import { useDebugStatus } from '~/lib/hooks/useDebugStatus';
|
|
30 |
import CloudProvidersTab from '~/components/settings/providers/CloudProvidersTab';
|
31 |
import LocalProvidersTab from '~/components/settings/providers/LocalProvidersTab';
|
32 |
import TaskManagerTab from '~/components/settings/task-manager/TaskManagerTab';
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
33 |
|
34 |
interface DraggableTabTileProps {
|
35 |
tab: TabVisibilityConfig;
|
@@ -89,8 +95,14 @@ const DraggableTabTile = ({
|
|
89 |
},
|
90 |
});
|
91 |
|
|
|
|
|
|
|
|
|
|
|
|
|
92 |
return (
|
93 |
-
<div ref={
|
94 |
<TabTile
|
95 |
tab={tab}
|
96 |
onClick={onClick}
|
@@ -110,10 +122,15 @@ interface UsersWindowProps {
|
|
110 |
}
|
111 |
|
112 |
export const UsersWindow = ({ open, onClose }: UsersWindowProps) => {
|
113 |
-
const [developerMode, setDeveloperMode] = useState(false);
|
114 |
const [activeTab, setActiveTab] = useState<TabType | null>(null);
|
115 |
const [loadingTab, setLoadingTab] = useState<TabType | null>(null);
|
116 |
const tabConfiguration = useStore(tabConfigurationStore);
|
|
|
|
|
|
|
|
|
|
|
|
|
117 |
|
118 |
// Status hooks
|
119 |
const { hasUpdate, currentVersion, acknowledgeUpdate } = useUpdateCheck();
|
@@ -122,11 +139,7 @@ export const UsersWindow = ({ open, onClose }: UsersWindowProps) => {
|
|
122 |
const { hasConnectionIssues, currentIssue, acknowledgeIssue } = useConnectionStatus();
|
123 |
const { hasActiveWarnings, activeIssues, acknowledgeAllIssues } = useDebugStatus();
|
124 |
|
125 |
-
|
126 |
-
const saved = localStorage.getItem('bolt_user_profile');
|
127 |
-
return saved ? JSON.parse(saved) : { avatar: null, notifications: true };
|
128 |
-
});
|
129 |
-
|
130 |
useEffect(() => {
|
131 |
const handleStorageChange = (e: StorageEvent) => {
|
132 |
if (e.key === 'bolt_user_profile') {
|
@@ -140,8 +153,66 @@ export const UsersWindow = ({ open, onClose }: UsersWindowProps) => {
|
|
140 |
return () => window.removeEventListener('storage', handleStorageChange);
|
141 |
}, []);
|
142 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
143 |
const handleDeveloperModeChange = (checked: boolean) => {
|
144 |
setDeveloperMode(checked);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
145 |
};
|
146 |
|
147 |
const handleBack = () => {
|
@@ -149,21 +220,55 @@ export const UsersWindow = ({ open, onClose }: UsersWindowProps) => {
|
|
149 |
};
|
150 |
|
151 |
// Only show tabs that are assigned to the user window AND are visible
|
152 |
-
const visibleUserTabs =
|
153 |
-
.
|
154 |
-
// Hide notifications tab if notifications are disabled
|
155 |
-
if (tab.id === 'notifications' && !profile.notifications) {
|
156 |
-
return false;
|
157 |
-
}
|
158 |
|
159 |
-
|
160 |
-
|
161 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
162 |
|
163 |
const moveTab = (dragIndex: number, hoverIndex: number) => {
|
164 |
const draggedTab = visibleUserTabs[dragIndex];
|
165 |
const targetTab = visibleUserTabs[hoverIndex];
|
166 |
|
|
|
|
|
167 |
// Update the order of the dragged and target tabs
|
168 |
const updatedDraggedTab = { ...draggedTab, order: targetTab.order };
|
169 |
const updatedTargetTab = { ...targetTab, order: draggedTab.order };
|
@@ -310,7 +415,7 @@ export const UsersWindow = ({ open, onClose }: UsersWindowProps) => {
|
|
310 |
className="data-[state=checked]:bg-purple-500"
|
311 |
aria-label="Toggle developer mode"
|
312 |
/>
|
313 |
-
<label className="text-sm text-gray-500 dark:text-gray-400">Developer Mode</label>
|
314 |
</div>
|
315 |
|
316 |
<DropdownMenu.Root>
|
@@ -412,9 +517,9 @@ export const UsersWindow = ({ open, onClose }: UsersWindowProps) => {
|
|
412 |
|
413 |
return (
|
414 |
<>
|
415 |
-
<DeveloperWindow open={
|
416 |
<DndProvider backend={HTML5Backend}>
|
417 |
-
<RadixDialog.Root open={open}>
|
418 |
<RadixDialog.Portal>
|
419 |
<div className="fixed inset-0 flex items-center justify-center z-[50]">
|
420 |
<RadixDialog.Overlay asChild>
|
|
|
1 |
import * as RadixDialog from '@radix-ui/react-dialog';
|
2 |
import * as DropdownMenu from '@radix-ui/react-dropdown-menu';
|
3 |
import { motion } from 'framer-motion';
|
4 |
+
import React, { useState, useEffect, useMemo } from 'react';
|
5 |
import { classNames } from '~/utils/classNames';
|
6 |
import { DialogTitle } from '~/components/ui/Dialog';
|
7 |
import { Switch } from '~/components/ui/Switch';
|
|
|
9 |
import { TAB_LABELS } from '~/components/settings/settings.types';
|
10 |
import { DeveloperWindow } from '~/components/settings/developer/DeveloperWindow';
|
11 |
import { TabTile } from '~/components/settings/shared/TabTile';
|
|
|
12 |
import { useStore } from '@nanostores/react';
|
13 |
import { DndProvider, useDrag, useDrop } from 'react-dnd';
|
14 |
import { HTML5Backend } from 'react-dnd-html5-backend';
|
|
|
29 |
import CloudProvidersTab from '~/components/settings/providers/CloudProvidersTab';
|
30 |
import LocalProvidersTab from '~/components/settings/providers/LocalProvidersTab';
|
31 |
import TaskManagerTab from '~/components/settings/task-manager/TaskManagerTab';
|
32 |
+
import {
|
33 |
+
tabConfigurationStore,
|
34 |
+
resetTabConfiguration,
|
35 |
+
updateTabConfiguration,
|
36 |
+
developerModeStore,
|
37 |
+
setDeveloperMode,
|
38 |
+
} from '~/lib/stores/settings';
|
39 |
|
40 |
interface DraggableTabTileProps {
|
41 |
tab: TabVisibilityConfig;
|
|
|
95 |
},
|
96 |
});
|
97 |
|
98 |
+
const dragDropRef = (node: HTMLDivElement | null) => {
|
99 |
+
if (node) {
|
100 |
+
drag(drop(node));
|
101 |
+
}
|
102 |
+
};
|
103 |
+
|
104 |
return (
|
105 |
+
<div ref={dragDropRef} style={{ opacity: isDragging ? 0.5 : 1 }}>
|
106 |
<TabTile
|
107 |
tab={tab}
|
108 |
onClick={onClick}
|
|
|
122 |
}
|
123 |
|
124 |
export const UsersWindow = ({ open, onClose }: UsersWindowProps) => {
|
|
|
125 |
const [activeTab, setActiveTab] = useState<TabType | null>(null);
|
126 |
const [loadingTab, setLoadingTab] = useState<TabType | null>(null);
|
127 |
const tabConfiguration = useStore(tabConfigurationStore);
|
128 |
+
const developerMode = useStore(developerModeStore);
|
129 |
+
const [showDeveloperWindow, setShowDeveloperWindow] = useState(false);
|
130 |
+
const [profile, setProfile] = useState(() => {
|
131 |
+
const saved = localStorage.getItem('bolt_user_profile');
|
132 |
+
return saved ? JSON.parse(saved) : { avatar: null, notifications: true };
|
133 |
+
});
|
134 |
|
135 |
// Status hooks
|
136 |
const { hasUpdate, currentVersion, acknowledgeUpdate } = useUpdateCheck();
|
|
|
139 |
const { hasConnectionIssues, currentIssue, acknowledgeIssue } = useConnectionStatus();
|
140 |
const { hasActiveWarnings, activeIssues, acknowledgeAllIssues } = useDebugStatus();
|
141 |
|
142 |
+
// Listen for profile changes
|
|
|
|
|
|
|
|
|
143 |
useEffect(() => {
|
144 |
const handleStorageChange = (e: StorageEvent) => {
|
145 |
if (e.key === 'bolt_user_profile') {
|
|
|
153 |
return () => window.removeEventListener('storage', handleStorageChange);
|
154 |
}, []);
|
155 |
|
156 |
+
// Listen for settings toggle event
|
157 |
+
useEffect(() => {
|
158 |
+
const handleToggleSettings = () => {
|
159 |
+
if (!open) {
|
160 |
+
// Open settings panel
|
161 |
+
setActiveTab('settings');
|
162 |
+
onClose(); // Close any other open panels
|
163 |
+
}
|
164 |
+
};
|
165 |
+
|
166 |
+
document.addEventListener('toggle-settings', handleToggleSettings);
|
167 |
+
|
168 |
+
return () => document.removeEventListener('toggle-settings', handleToggleSettings);
|
169 |
+
}, [open, onClose]);
|
170 |
+
|
171 |
+
// Ensure tab configuration is properly initialized
|
172 |
+
useEffect(() => {
|
173 |
+
if (!tabConfiguration || !tabConfiguration.userTabs || !tabConfiguration.developerTabs) {
|
174 |
+
console.warn('Tab configuration is invalid, resetting to defaults');
|
175 |
+
resetTabConfiguration();
|
176 |
+
} else {
|
177 |
+
// Validate tab configuration structure
|
178 |
+
const isValid =
|
179 |
+
tabConfiguration.userTabs.every(
|
180 |
+
(tab) =>
|
181 |
+
tab &&
|
182 |
+
typeof tab.id === 'string' &&
|
183 |
+
typeof tab.visible === 'boolean' &&
|
184 |
+
typeof tab.window === 'string' &&
|
185 |
+
typeof tab.order === 'number',
|
186 |
+
) &&
|
187 |
+
tabConfiguration.developerTabs.every(
|
188 |
+
(tab) =>
|
189 |
+
tab &&
|
190 |
+
typeof tab.id === 'string' &&
|
191 |
+
typeof tab.visible === 'boolean' &&
|
192 |
+
typeof tab.window === 'string' &&
|
193 |
+
typeof tab.order === 'number',
|
194 |
+
);
|
195 |
+
|
196 |
+
if (!isValid) {
|
197 |
+
console.warn('Tab configuration is malformed, resetting to defaults');
|
198 |
+
resetTabConfiguration();
|
199 |
+
}
|
200 |
+
}
|
201 |
+
}, [tabConfiguration]);
|
202 |
+
|
203 |
+
// Handle developer mode changes
|
204 |
const handleDeveloperModeChange = (checked: boolean) => {
|
205 |
setDeveloperMode(checked);
|
206 |
+
|
207 |
+
if (checked) {
|
208 |
+
setShowDeveloperWindow(true);
|
209 |
+
}
|
210 |
+
};
|
211 |
+
|
212 |
+
// Handle developer window close
|
213 |
+
const handleDeveloperWindowClose = () => {
|
214 |
+
setShowDeveloperWindow(false);
|
215 |
+
setDeveloperMode(false);
|
216 |
};
|
217 |
|
218 |
const handleBack = () => {
|
|
|
220 |
};
|
221 |
|
222 |
// Only show tabs that are assigned to the user window AND are visible
|
223 |
+
const visibleUserTabs = useMemo(() => {
|
224 |
+
console.log('Filtering user tabs with configuration:', tabConfiguration);
|
|
|
|
|
|
|
|
|
225 |
|
226 |
+
if (!tabConfiguration?.userTabs || !Array.isArray(tabConfiguration.userTabs)) {
|
227 |
+
console.warn('Invalid tab configuration, using empty array');
|
228 |
+
return [];
|
229 |
+
}
|
230 |
+
|
231 |
+
return tabConfiguration.userTabs
|
232 |
+
.filter((tab) => {
|
233 |
+
if (!tab || typeof tab.id !== 'string') {
|
234 |
+
console.warn('Invalid tab entry:', tab);
|
235 |
+
return false;
|
236 |
+
}
|
237 |
+
|
238 |
+
// Hide notifications tab if notifications are disabled
|
239 |
+
if (tab.id === 'notifications' && !profile.notifications) {
|
240 |
+
console.log('Hiding notifications tab due to disabled notifications');
|
241 |
+
return false;
|
242 |
+
}
|
243 |
+
|
244 |
+
// Ensure the tab has the required properties
|
245 |
+
if (typeof tab.visible !== 'boolean' || typeof tab.window !== 'string' || typeof tab.order !== 'number') {
|
246 |
+
console.warn('Tab missing required properties:', tab);
|
247 |
+
return false;
|
248 |
+
}
|
249 |
+
|
250 |
+
// Only show tabs that are explicitly visible and assigned to the user window
|
251 |
+
const isVisible = tab.visible && tab.window === 'user';
|
252 |
+
console.log(`Tab ${tab.id} visibility:`, isVisible);
|
253 |
+
|
254 |
+
return isVisible;
|
255 |
+
})
|
256 |
+
.sort((a: TabVisibilityConfig, b: TabVisibilityConfig) => {
|
257 |
+
const orderA = typeof a.order === 'number' ? a.order : 0;
|
258 |
+
const orderB = typeof b.order === 'number' ? b.order : 0;
|
259 |
+
|
260 |
+
return orderA - orderB;
|
261 |
+
});
|
262 |
+
}, [tabConfiguration, profile.notifications]);
|
263 |
+
|
264 |
+
console.log('Filtered visible user tabs:', visibleUserTabs);
|
265 |
|
266 |
const moveTab = (dragIndex: number, hoverIndex: number) => {
|
267 |
const draggedTab = visibleUserTabs[dragIndex];
|
268 |
const targetTab = visibleUserTabs[hoverIndex];
|
269 |
|
270 |
+
console.log('Moving tab:', { draggedTab, targetTab });
|
271 |
+
|
272 |
// Update the order of the dragged and target tabs
|
273 |
const updatedDraggedTab = { ...draggedTab, order: targetTab.order };
|
274 |
const updatedTargetTab = { ...targetTab, order: draggedTab.order };
|
|
|
415 |
className="data-[state=checked]:bg-purple-500"
|
416 |
aria-label="Toggle developer mode"
|
417 |
/>
|
418 |
+
<label className="text-sm text-gray-500 dark:text-gray-400">Switch to Developer Mode</label>
|
419 |
</div>
|
420 |
|
421 |
<DropdownMenu.Root>
|
|
|
517 |
|
518 |
return (
|
519 |
<>
|
520 |
+
<DeveloperWindow open={showDeveloperWindow} onClose={handleDeveloperWindowClose} />
|
521 |
<DndProvider backend={HTML5Backend}>
|
522 |
+
<RadixDialog.Root open={open && !showDeveloperWindow}>
|
523 |
<RadixDialog.Portal>
|
524 |
<div className="fixed inset-0 flex items-center justify-center z-[50]">
|
525 |
<RadixDialog.Overlay asChild>
|
app/components/workbench/FileBreadcrumb.tsx
CHANGED
@@ -87,7 +87,9 @@ export const FileBreadcrumb = memo<FileBreadcrumbProps>(({ files, pathSegments =
|
|
87 |
<DropdownMenu.Root open={isActive} modal={false}>
|
88 |
<DropdownMenu.Trigger asChild>
|
89 |
<span
|
90 |
-
ref={(ref) =>
|
|
|
|
|
91 |
className={classNames('flex items-center gap-1.5 cursor-pointer shrink-0', {
|
92 |
'text-bolt-elements-textTertiary hover:text-bolt-elements-textPrimary': !isActive,
|
93 |
'text-bolt-elements-textPrimary underline': isActive,
|
|
|
87 |
<DropdownMenu.Root open={isActive} modal={false}>
|
88 |
<DropdownMenu.Trigger asChild>
|
89 |
<span
|
90 |
+
ref={(ref) => {
|
91 |
+
segmentRefs.current[index] = ref;
|
92 |
+
}}
|
93 |
className={classNames('flex items-center gap-1.5 cursor-pointer shrink-0', {
|
94 |
'text-bolt-elements-textTertiary hover:text-bolt-elements-textPrimary': !isActive,
|
95 |
'text-bolt-elements-textPrimary underline': isActive,
|
app/lib/stores/settings.ts
CHANGED
@@ -5,6 +5,8 @@ import type { IProviderConfig } from '~/types/model';
|
|
5 |
import type { TabVisibilityConfig, TabWindowConfig } from '~/components/settings/settings.types';
|
6 |
import { DEFAULT_TAB_CONFIG } from '~/components/settings/settings.types';
|
7 |
import Cookies from 'js-cookie';
|
|
|
|
|
8 |
|
9 |
export interface Shortcut {
|
10 |
key: string;
|
@@ -18,6 +20,9 @@ export interface Shortcut {
|
|
18 |
|
19 |
export interface Shortcuts {
|
20 |
toggleTerminal: Shortcut;
|
|
|
|
|
|
|
21 |
}
|
22 |
|
23 |
export const URL_CONFIGURABLE_PROVIDERS = ['Ollama', 'LMStudio', 'OpenAILike'];
|
@@ -31,6 +36,25 @@ export const shortcutsStore = map<Shortcuts>({
|
|
31 |
ctrlOrMetaKey: true,
|
32 |
action: () => workbenchStore.toggleTerminal(),
|
33 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
34 |
});
|
35 |
|
36 |
const initialProviderSettings: ProviderSetting = {};
|
@@ -70,18 +94,69 @@ export const enableContextOptimizationStore = atom(false);
|
|
70 |
|
71 |
// Initialize tab configuration from cookie or default
|
72 |
const savedTabConfig = Cookies.get('tabConfiguration');
|
73 |
-
|
74 |
-
|
75 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
76 |
userTabs: DEFAULT_TAB_CONFIG.filter((tab) => tab.window === 'user'),
|
77 |
developerTabs: DEFAULT_TAB_CONFIG.filter((tab) => tab.window === 'developer'),
|
78 |
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
79 |
|
80 |
export const tabConfigurationStore = map<TabWindowConfig>(initialTabConfig);
|
81 |
|
82 |
// Helper function to update tab configuration
|
83 |
export const updateTabConfiguration = (config: TabVisibilityConfig) => {
|
84 |
const currentConfig = tabConfigurationStore.get();
|
|
|
|
|
85 |
const isUserTab = config.window === 'user';
|
86 |
const targetArray = isUserTab ? 'userTabs' : 'developerTabs';
|
87 |
|
@@ -99,16 +174,38 @@ export const updateTabConfiguration = (config: TabVisibilityConfig) => {
|
|
99 |
[targetArray]: updatedTabs,
|
100 |
};
|
101 |
|
|
|
|
|
102 |
tabConfigurationStore.set(newConfig);
|
103 |
-
Cookies.set('tabConfiguration', JSON.stringify(newConfig)
|
|
|
|
|
|
|
|
|
104 |
};
|
105 |
|
106 |
// Helper function to reset tab configuration
|
107 |
export const resetTabConfiguration = () => {
|
|
|
|
|
108 |
const defaultConfig: TabWindowConfig = {
|
109 |
userTabs: DEFAULT_TAB_CONFIG.filter((tab) => tab.window === 'user'),
|
110 |
developerTabs: DEFAULT_TAB_CONFIG.filter((tab) => tab.window === 'developer'),
|
111 |
};
|
|
|
|
|
|
|
112 |
tabConfigurationStore.set(defaultConfig);
|
113 |
-
Cookies.set('tabConfiguration', JSON.stringify(defaultConfig)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
114 |
};
|
|
|
5 |
import type { TabVisibilityConfig, TabWindowConfig } from '~/components/settings/settings.types';
|
6 |
import { DEFAULT_TAB_CONFIG } from '~/components/settings/settings.types';
|
7 |
import Cookies from 'js-cookie';
|
8 |
+
import { toggleTheme } from './theme';
|
9 |
+
import { chatStore } from './chat';
|
10 |
|
11 |
export interface Shortcut {
|
12 |
key: string;
|
|
|
20 |
|
21 |
export interface Shortcuts {
|
22 |
toggleTerminal: Shortcut;
|
23 |
+
toggleTheme: Shortcut;
|
24 |
+
toggleChat: Shortcut;
|
25 |
+
toggleSettings: Shortcut;
|
26 |
}
|
27 |
|
28 |
export const URL_CONFIGURABLE_PROVIDERS = ['Ollama', 'LMStudio', 'OpenAILike'];
|
|
|
36 |
ctrlOrMetaKey: true,
|
37 |
action: () => workbenchStore.toggleTerminal(),
|
38 |
},
|
39 |
+
toggleTheme: {
|
40 |
+
key: 't',
|
41 |
+
ctrlOrMetaKey: true,
|
42 |
+
shiftKey: true,
|
43 |
+
action: () => toggleTheme(),
|
44 |
+
},
|
45 |
+
toggleChat: {
|
46 |
+
key: '/',
|
47 |
+
ctrlOrMetaKey: true,
|
48 |
+
action: () => chatStore.setKey('showChat', !chatStore.get().showChat),
|
49 |
+
},
|
50 |
+
toggleSettings: {
|
51 |
+
key: ',',
|
52 |
+
ctrlOrMetaKey: true,
|
53 |
+
action: () => {
|
54 |
+
// This will be connected to the settings panel toggle
|
55 |
+
document.dispatchEvent(new CustomEvent('toggle-settings'));
|
56 |
+
},
|
57 |
+
},
|
58 |
});
|
59 |
|
60 |
const initialProviderSettings: ProviderSetting = {};
|
|
|
94 |
|
95 |
// Initialize tab configuration from cookie or default
|
96 |
const savedTabConfig = Cookies.get('tabConfiguration');
|
97 |
+
console.log('Saved tab configuration:', savedTabConfig);
|
98 |
+
|
99 |
+
let initialTabConfig: TabWindowConfig;
|
100 |
+
|
101 |
+
try {
|
102 |
+
if (savedTabConfig) {
|
103 |
+
const parsedConfig = JSON.parse(savedTabConfig);
|
104 |
+
|
105 |
+
// Validate the parsed configuration
|
106 |
+
if (
|
107 |
+
parsedConfig &&
|
108 |
+
Array.isArray(parsedConfig.userTabs) &&
|
109 |
+
Array.isArray(parsedConfig.developerTabs) &&
|
110 |
+
parsedConfig.userTabs.every(
|
111 |
+
(tab: any) =>
|
112 |
+
tab &&
|
113 |
+
typeof tab.id === 'string' &&
|
114 |
+
typeof tab.visible === 'boolean' &&
|
115 |
+
typeof tab.window === 'string' &&
|
116 |
+
typeof tab.order === 'number',
|
117 |
+
) &&
|
118 |
+
parsedConfig.developerTabs.every(
|
119 |
+
(tab: any) =>
|
120 |
+
tab &&
|
121 |
+
typeof tab.id === 'string' &&
|
122 |
+
typeof tab.visible === 'boolean' &&
|
123 |
+
typeof tab.window === 'string' &&
|
124 |
+
typeof tab.order === 'number',
|
125 |
+
)
|
126 |
+
) {
|
127 |
+
initialTabConfig = parsedConfig;
|
128 |
+
console.log('Using saved tab configuration');
|
129 |
+
} else {
|
130 |
+
console.warn('Invalid saved tab configuration, using defaults');
|
131 |
+
initialTabConfig = {
|
132 |
+
userTabs: DEFAULT_TAB_CONFIG.filter((tab) => tab.window === 'user'),
|
133 |
+
developerTabs: DEFAULT_TAB_CONFIG.filter((tab) => tab.window === 'developer'),
|
134 |
+
};
|
135 |
+
}
|
136 |
+
} else {
|
137 |
+
console.log('No saved tab configuration found, using defaults');
|
138 |
+
initialTabConfig = {
|
139 |
userTabs: DEFAULT_TAB_CONFIG.filter((tab) => tab.window === 'user'),
|
140 |
developerTabs: DEFAULT_TAB_CONFIG.filter((tab) => tab.window === 'developer'),
|
141 |
};
|
142 |
+
}
|
143 |
+
} catch (error) {
|
144 |
+
console.error('Error loading tab configuration:', error);
|
145 |
+
initialTabConfig = {
|
146 |
+
userTabs: DEFAULT_TAB_CONFIG.filter((tab) => tab.window === 'user'),
|
147 |
+
developerTabs: DEFAULT_TAB_CONFIG.filter((tab) => tab.window === 'developer'),
|
148 |
+
};
|
149 |
+
}
|
150 |
+
|
151 |
+
console.log('Initial tab configuration:', initialTabConfig);
|
152 |
|
153 |
export const tabConfigurationStore = map<TabWindowConfig>(initialTabConfig);
|
154 |
|
155 |
// Helper function to update tab configuration
|
156 |
export const updateTabConfiguration = (config: TabVisibilityConfig) => {
|
157 |
const currentConfig = tabConfigurationStore.get();
|
158 |
+
console.log('Current tab configuration before update:', currentConfig);
|
159 |
+
|
160 |
const isUserTab = config.window === 'user';
|
161 |
const targetArray = isUserTab ? 'userTabs' : 'developerTabs';
|
162 |
|
|
|
174 |
[targetArray]: updatedTabs,
|
175 |
};
|
176 |
|
177 |
+
console.log('New tab configuration after update:', newConfig);
|
178 |
+
|
179 |
tabConfigurationStore.set(newConfig);
|
180 |
+
Cookies.set('tabConfiguration', JSON.stringify(newConfig), {
|
181 |
+
expires: 365, // Set cookie to expire in 1 year
|
182 |
+
path: '/',
|
183 |
+
sameSite: 'strict',
|
184 |
+
});
|
185 |
};
|
186 |
|
187 |
// Helper function to reset tab configuration
|
188 |
export const resetTabConfiguration = () => {
|
189 |
+
console.log('Resetting tab configuration to defaults');
|
190 |
+
|
191 |
const defaultConfig: TabWindowConfig = {
|
192 |
userTabs: DEFAULT_TAB_CONFIG.filter((tab) => tab.window === 'user'),
|
193 |
developerTabs: DEFAULT_TAB_CONFIG.filter((tab) => tab.window === 'developer'),
|
194 |
};
|
195 |
+
|
196 |
+
console.log('Default tab configuration:', defaultConfig);
|
197 |
+
|
198 |
tabConfigurationStore.set(defaultConfig);
|
199 |
+
Cookies.set('tabConfiguration', JSON.stringify(defaultConfig), {
|
200 |
+
expires: 365, // Set cookie to expire in 1 year
|
201 |
+
path: '/',
|
202 |
+
sameSite: 'strict',
|
203 |
+
});
|
204 |
+
};
|
205 |
+
|
206 |
+
// Developer mode store
|
207 |
+
export const developerModeStore = atom<boolean>(false);
|
208 |
+
|
209 |
+
export const setDeveloperMode = (value: boolean) => {
|
210 |
+
developerModeStore.set(value);
|
211 |
};
|
app/routes/api.system.git-info.ts
CHANGED
@@ -2,7 +2,7 @@ import { json } from '@remix-run/node';
|
|
2 |
import type { LoaderFunctionArgs } from '@remix-run/node';
|
3 |
import { execSync } from 'child_process';
|
4 |
|
5 |
-
export async function loader({ request }: LoaderFunctionArgs) {
|
6 |
try {
|
7 |
const branch = execSync('git rev-parse --abbrev-ref HEAD').toString().trim();
|
8 |
const commit = execSync('git rev-parse --short HEAD').toString().trim();
|
|
|
2 |
import type { LoaderFunctionArgs } from '@remix-run/node';
|
3 |
import { execSync } from 'child_process';
|
4 |
|
5 |
+
export async function loader({ request: _request }: LoaderFunctionArgs) {
|
6 |
try {
|
7 |
const branch = execSync('git rev-parse --abbrev-ref HEAD').toString().trim();
|
8 |
const commit = execSync('git rev-parse --short HEAD').toString().trim();
|
package.json
CHANGED
@@ -59,16 +59,17 @@
|
|
59 |
"@octokit/rest": "^21.0.2",
|
60 |
"@octokit/types": "^13.6.2",
|
61 |
"@openrouter/ai-sdk-provider": "^0.0.5",
|
|
|
62 |
"@radix-ui/react-context-menu": "^2.2.2",
|
63 |
"@radix-ui/react-dialog": "^1.1.2",
|
64 |
"@radix-ui/react-dropdown-menu": "^2.1.2",
|
65 |
"@radix-ui/react-separator": "^1.1.0",
|
66 |
"@radix-ui/react-switch": "^1.1.1",
|
67 |
"@radix-ui/react-tooltip": "^1.1.4",
|
68 |
-
"@remix-run/cloudflare": "^2.15.
|
69 |
-
"@remix-run/cloudflare-pages": "^2.15.
|
70 |
"@remix-run/node": "^2.15.2",
|
71 |
-
"@remix-run/react": "^2.15.
|
72 |
"@uiw/codemirror-theme-vscode": "^4.23.6",
|
73 |
"@unocss/reset": "^0.61.9",
|
74 |
"@webcontainer/api": "1.3.0-internal.10",
|
@@ -118,7 +119,7 @@
|
|
118 |
"@cloudflare/workers-types": "^4.20241127.0",
|
119 |
"@iconify-json/ph": "^1.2.1",
|
120 |
"@iconify/types": "^2.0.0",
|
121 |
-
"@remix-run/dev": "^2.15.
|
122 |
"@types/diff": "^5.2.3",
|
123 |
"@types/dom-speech-recognition": "^0.0.4",
|
124 |
"@types/file-saver": "^2.0.7",
|
|
|
59 |
"@octokit/rest": "^21.0.2",
|
60 |
"@octokit/types": "^13.6.2",
|
61 |
"@openrouter/ai-sdk-provider": "^0.0.5",
|
62 |
+
"@phosphor-icons/react": "^2.1.7",
|
63 |
"@radix-ui/react-context-menu": "^2.2.2",
|
64 |
"@radix-ui/react-dialog": "^1.1.2",
|
65 |
"@radix-ui/react-dropdown-menu": "^2.1.2",
|
66 |
"@radix-ui/react-separator": "^1.1.0",
|
67 |
"@radix-ui/react-switch": "^1.1.1",
|
68 |
"@radix-ui/react-tooltip": "^1.1.4",
|
69 |
+
"@remix-run/cloudflare": "^2.15.2",
|
70 |
+
"@remix-run/cloudflare-pages": "^2.15.2",
|
71 |
"@remix-run/node": "^2.15.2",
|
72 |
+
"@remix-run/react": "^2.15.2",
|
73 |
"@uiw/codemirror-theme-vscode": "^4.23.6",
|
74 |
"@unocss/reset": "^0.61.9",
|
75 |
"@webcontainer/api": "1.3.0-internal.10",
|
|
|
119 |
"@cloudflare/workers-types": "^4.20241127.0",
|
120 |
"@iconify-json/ph": "^1.2.1",
|
121 |
"@iconify/types": "^2.0.0",
|
122 |
+
"@remix-run/dev": "^2.15.2",
|
123 |
"@types/diff": "^5.2.3",
|
124 |
"@types/dom-speech-recognition": "^0.0.4",
|
125 |
"@types/file-saver": "^2.0.7",
|
pages/api/system/git-info.ts
CHANGED
@@ -1,4 +1,4 @@
|
|
1 |
-
import { NextApiRequest, NextApiResponse } from 'next';
|
2 |
import { execSync } from 'child_process';
|
3 |
|
4 |
export default async function handler(req: NextApiRequest, res: NextApiResponse) {
|
|
|
1 |
+
import type { NextApiRequest, NextApiResponse } from 'next';
|
2 |
import { execSync } from 'child_process';
|
3 |
|
4 |
export default async function handler(req: NextApiRequest, res: NextApiResponse) {
|
pnpm-lock.yaml
CHANGED
@@ -98,6 +98,9 @@ importers:
|
|
98 |
'@openrouter/ai-sdk-provider':
|
99 |
specifier: ^0.0.5
|
100 |
version: 0.0.5([email protected])
|
|
|
|
|
|
|
101 |
'@radix-ui/react-context-menu':
|
102 |
specifier: ^2.2.2
|
103 |
version: 2.2.2(@types/[email protected])(@types/[email protected])([email protected]([email protected]))([email protected])
|
@@ -117,17 +120,17 @@ importers:
|
|
117 |
specifier: ^1.1.4
|
118 |
version: 1.1.4(@types/[email protected])(@types/[email protected])([email protected]([email protected]))([email protected])
|
119 |
'@remix-run/cloudflare':
|
120 |
-
specifier: ^2.15.
|
121 |
-
version: 2.15.
|
122 |
'@remix-run/cloudflare-pages':
|
123 |
-
specifier: ^2.15.
|
124 |
-
version: 2.15.
|
125 |
'@remix-run/node':
|
126 |
specifier: ^2.15.2
|
127 |
version: 2.15.2([email protected])
|
128 |
'@remix-run/react':
|
129 |
-
specifier: ^2.15.
|
130 |
-
version: 2.15.
|
131 |
'@uiw/codemirror-theme-vscode':
|
132 |
specifier: ^4.23.6
|
133 |
version: 4.23.6(@codemirror/[email protected])(@codemirror/[email protected])(@codemirror/[email protected])
|
@@ -211,7 +214,7 @@ importers:
|
|
211 |
version: 5.3.0([email protected])([email protected])
|
212 |
react-dnd:
|
213 |
specifier: ^16.0.1
|
214 |
-
version: 16.0.1(@types/[email protected].
|
215 |
react-dnd-html5-backend:
|
216 |
specifier: ^16.0.1
|
217 |
version: 16.0.1
|
@@ -244,10 +247,10 @@ importers:
|
|
244 |
version: 4.0.0
|
245 |
remix-island:
|
246 |
specifier: ^0.2.0
|
247 |
-
version: 0.2.0(@remix-run/[email protected].
|
248 |
remix-utils:
|
249 |
specifier: ^7.7.0
|
250 |
-
version: 7.7.0(@remix-run/[email protected].
|
251 |
shiki:
|
252 |
specifier: ^1.24.0
|
253 |
version: 1.24.0
|
@@ -260,7 +263,7 @@ importers:
|
|
260 |
devDependencies:
|
261 |
'@blitz/eslint-plugin':
|
262 |
specifier: 0.1.0
|
263 |
-
version: 0.1.0(@types/[email protected])([email protected].
|
264 |
'@cloudflare/workers-types':
|
265 |
specifier: ^4.20241127.0
|
266 |
version: 4.20241127.0
|
@@ -271,8 +274,8 @@ importers:
|
|
271 |
specifier: ^2.0.0
|
272 |
version: 2.0.0
|
273 |
'@remix-run/dev':
|
274 |
-
specifier: ^2.15.
|
275 |
-
version: 2.15.
|
276 |
'@types/diff':
|
277 |
specifier: ^5.2.3
|
278 |
version: 5.2.3
|
@@ -320,22 +323,22 @@ importers:
|
|
320 |
version: 11.0.5
|
321 |
unocss:
|
322 |
specifier: ^0.61.9
|
323 |
-
version: 0.61.9(postcss@8.
|
324 |
vite:
|
325 |
specifier: ^5.4.11
|
326 |
-
version: 5.4.11(@types/[email protected].
|
327 |
vite-plugin-node-polyfills:
|
328 |
specifier: ^0.22.0
|
329 |
-
version: 0.22.0([email protected])([email protected](@types/[email protected].
|
330 |
vite-plugin-optimize-css-modules:
|
331 |
specifier: ^1.1.0
|
332 |
-
version: 1.1.0([email protected](@types/[email protected].
|
333 |
vite-tsconfig-paths:
|
334 |
specifier: ^4.3.2
|
335 |
-
version: 4.3.2([email protected])([email protected](@types/[email protected].
|
336 |
vitest:
|
337 |
specifier: ^2.1.7
|
338 |
-
version: 2.1.8(@types/[email protected].
|
339 |
wrangler:
|
340 |
specifier: ^3.91.0
|
341 |
version: 3.91.0(@cloudflare/[email protected])
|
@@ -627,6 +630,10 @@ packages:
|
|
627 |
resolution: {integrity: sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==}
|
628 |
engines: {node: '>=6.9.0'}
|
629 |
|
|
|
|
|
|
|
|
|
630 |
'@babel/[email protected]':
|
631 |
resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==}
|
632 |
engines: {node: '>=6.9.0'}
|
@@ -663,6 +670,10 @@ packages:
|
|
663 |
resolution: {integrity: sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==}
|
664 |
engines: {node: '>=6.9.0'}
|
665 |
|
|
|
|
|
|
|
|
|
666 |
'@babel/[email protected]':
|
667 |
resolution: {integrity: sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==}
|
668 |
engines: {node: '>=6.9.0'}
|
@@ -698,6 +709,11 @@ packages:
|
|
698 |
engines: {node: '>=6.0.0'}
|
699 |
hasBin: true
|
700 |
|
|
|
|
|
|
|
|
|
|
|
701 |
'@babel/[email protected]':
|
702 |
resolution: {integrity: sha512-ryzI0McXUPJnRCvMo4lumIKZUzhYUO/ScI+Mz4YVaTLt04DHNSjEUjKVvbzQjZFLuod/cYEc07mJWhzl6v4DPg==}
|
703 |
engines: {node: '>=6.9.0'}
|
@@ -746,10 +762,18 @@ packages:
|
|
746 |
resolution: {integrity: sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==}
|
747 |
engines: {node: '>=6.9.0'}
|
748 |
|
|
|
|
|
|
|
|
|
749 |
'@babel/[email protected]':
|
750 |
resolution: {integrity: sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==}
|
751 |
engines: {node: '>=6.9.0'}
|
752 |
|
|
|
|
|
|
|
|
|
753 |
'@blitz/[email protected]':
|
754 |
resolution: {integrity: sha512-mGEAFWCI5AQ4nrePhjp2WzvRen+UWR+SF4MvH70icIBClR08Gm3dT9MRa2jszOpfY00NyIYfm7/1CFZ37GvW4g==}
|
755 |
engines: {node: ^18.0.0 || ^20.0.0}
|
@@ -1634,6 +1658,10 @@ packages:
|
|
1634 |
resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==}
|
1635 |
engines: {node: '>=6.0.0'}
|
1636 |
|
|
|
|
|
|
|
|
|
1637 |
'@jridgewell/[email protected]':
|
1638 |
resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
|
1639 |
engines: {node: '>=6.0.0'}
|
@@ -1841,6 +1869,13 @@ packages:
|
|
1841 |
resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==}
|
1842 |
engines: {node: '>=8.0.0'}
|
1843 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1844 |
'@pkgjs/[email protected]':
|
1845 |
resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
|
1846 |
engines: {node: '>=14'}
|
@@ -2248,8 +2283,8 @@ packages:
|
|
2248 |
peerDependencies:
|
2249 |
react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
|
2250 |
|
2251 |
-
'@remix-run/[email protected].
|
2252 |
-
resolution: {integrity: sha512-
|
2253 |
engines: {node: '>=18.0.0'}
|
2254 |
peerDependencies:
|
2255 |
'@cloudflare/workers-types': ^4.0.0
|
@@ -2258,8 +2293,8 @@ packages:
|
|
2258 |
typescript:
|
2259 |
optional: true
|
2260 |
|
2261 |
-
'@remix-run/[email protected].
|
2262 |
-
resolution: {integrity: sha512-
|
2263 |
engines: {node: '>=18.0.0'}
|
2264 |
peerDependencies:
|
2265 |
'@cloudflare/workers-types': ^4.0.0
|
@@ -2268,13 +2303,13 @@ packages:
|
|
2268 |
typescript:
|
2269 |
optional: true
|
2270 |
|
2271 |
-
'@remix-run/[email protected].
|
2272 |
-
resolution: {integrity: sha512-
|
2273 |
engines: {node: '>=18.0.0'}
|
2274 |
hasBin: true
|
2275 |
peerDependencies:
|
2276 |
-
'@remix-run/react': ^2.15.
|
2277 |
-
'@remix-run/serve': ^2.15.
|
2278 |
typescript: ^5.1.0
|
2279 |
vite: ^5.1.0
|
2280 |
wrangler: ^3.28.2
|
@@ -2288,15 +2323,6 @@ packages:
|
|
2288 |
wrangler:
|
2289 |
optional: true
|
2290 |
|
2291 |
-
'@remix-run/[email protected]':
|
2292 |
-
resolution: {integrity: sha512-tWbR7pQ6gwj+MkGf6WVIYnjgfGfpdU8EOIa6xsCIRlrm0p3BtMz4jA3GvBWEpOuEnN5MV7CarVzhduaRzkZ0SQ==}
|
2293 |
-
engines: {node: '>=18.0.0'}
|
2294 |
-
peerDependencies:
|
2295 |
-
typescript: ^5.1.0
|
2296 |
-
peerDependenciesMeta:
|
2297 |
-
typescript:
|
2298 |
-
optional: true
|
2299 |
-
|
2300 |
'@remix-run/[email protected]':
|
2301 |
resolution: {integrity: sha512-NS/h5uxje7DYCNgcKqKAiUhf0r2HVnoYUBWLyIIMmCUP1ddWurBP6xTPcWzGhEvV/EvguniYi1wJZ5+X8sonWw==}
|
2302 |
engines: {node: '>=18.0.0'}
|
@@ -2306,8 +2332,8 @@ packages:
|
|
2306 |
typescript:
|
2307 |
optional: true
|
2308 |
|
2309 |
-
'@remix-run/[email protected].
|
2310 |
-
resolution: {integrity: sha512-
|
2311 |
engines: {node: '>=18.0.0'}
|
2312 |
peerDependencies:
|
2313 |
react: ^18.0.0
|
@@ -2321,15 +2347,6 @@ packages:
|
|
2321 |
resolution: {integrity: sha512-xfSkCAchbdG5PnbrKqFWwia4Bi61nH+wm8wLEqfHDyp7Y3dZzgqS2itV8i4gAq9pC2HsTpwyBC6Ds8VHZ96JlA==}
|
2322 |
engines: {node: '>=14.0.0'}
|
2323 |
|
2324 |
-
'@remix-run/[email protected]':
|
2325 |
-
resolution: {integrity: sha512-FuM8vAg1sPskf4wn0ivbuj/7s9Qdh2wnKu+sVXqYz0a95gH5b73TuMzk6n3NMSkFVKKc6+UmlG1WLYre7L2LTg==}
|
2326 |
-
engines: {node: '>=18.0.0'}
|
2327 |
-
peerDependencies:
|
2328 |
-
typescript: ^5.1.0
|
2329 |
-
peerDependenciesMeta:
|
2330 |
-
typescript:
|
2331 |
-
optional: true
|
2332 |
-
|
2333 |
'@remix-run/[email protected]':
|
2334 |
resolution: {integrity: sha512-OqiPcvEnnU88B8b1LIWHHkQ3Tz2GDAmQ1RihFNQsbrFKpDsQLkw0lJlnfgKA/uHd0CEEacpfV7C9qqJT3V6Z2g==}
|
2335 |
engines: {node: '>=18.0.0'}
|
@@ -2742,6 +2759,9 @@ packages:
|
|
2742 |
'@types/[email protected]':
|
2743 |
resolution: {integrity: sha512-qKgsUwfHZV2WCWLAnVP1JqnpE6Im6h3Y0+fYgMTasNQ7V++CBX5OT1as0g0f+OyubbFqhf6XVNIsmN4IIhEgGQ==}
|
2744 |
|
|
|
|
|
|
|
2745 |
'@types/[email protected]':
|
2746 |
resolution: {integrity: sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==}
|
2747 |
|
@@ -2921,11 +2941,11 @@ packages:
|
|
2921 |
peerDependencies:
|
2922 |
vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0
|
2923 |
|
2924 |
-
'@vanilla-extract/babel-plugin-debug-ids@1.
|
2925 |
-
resolution: {integrity: sha512-
|
2926 |
|
2927 |
-
'@vanilla-extract/css@1.
|
2928 |
-
resolution: {integrity: sha512-
|
2929 |
|
2930 |
'@vanilla-extract/[email protected]':
|
2931 |
resolution: {integrity: sha512-E2YcfO8vA+vs+ua+gpvy1HRqvgWbI+MTlUpxA8FvatOvybuNcWAY0CKwQ/Gpj7rswYKtC6C7+xw33emM6/ImdQ==}
|
@@ -3202,10 +3222,18 @@ packages:
|
|
3202 |
resolution: {integrity: sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==}
|
3203 |
engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
|
3204 |
|
|
|
|
|
|
|
|
|
3205 | |
3206 |
resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==}
|
3207 |
engines: {node: '>= 0.4'}
|
3208 |
|
|
|
|
|
|
|
|
|
3209 | |
3210 |
resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
|
3211 |
engines: {node: '>=6'}
|
@@ -3454,6 +3482,15 @@ packages:
|
|
3454 |
supports-color:
|
3455 |
optional: true
|
3456 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3457 | |
3458 |
resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==}
|
3459 |
|
@@ -3549,6 +3586,10 @@ packages:
|
|
3549 |
resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==}
|
3550 |
engines: {node: '>=12'}
|
3551 |
|
|
|
|
|
|
|
|
|
3552 | |
3553 |
resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==}
|
3554 |
|
@@ -3602,6 +3643,10 @@ packages:
|
|
3602 |
resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==}
|
3603 |
engines: {node: '>= 0.4'}
|
3604 |
|
|
|
|
|
|
|
|
|
3605 | |
3606 |
resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
|
3607 |
engines: {node: '>= 0.4'}
|
@@ -3609,6 +3654,13 @@ packages:
|
|
3609 | |
3610 |
resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==}
|
3611 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3612 | |
3613 |
resolution: {integrity: sha512-bRB4qbgUDWrdY1eMk123KiaCSW9VzQ+QLZrmU7D//cCFkmksPd9mUMpmWoFK/rxjIeTfTSOpKCoGoimlvI+AWw==}
|
3614 |
engines: {node: '>=14.0.0'}
|
@@ -3812,8 +3864,8 @@ packages:
|
|
3812 |
resolution: {integrity: sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==}
|
3813 |
engines: {node: '>=12.0.0'}
|
3814 |
|
3815 |
-
[email protected].
|
3816 |
-
resolution: {integrity: sha512-
|
3817 |
engines: {node: '>= 0.10.0'}
|
3818 |
|
3819 | |
@@ -3946,6 +3998,10 @@ packages:
|
|
3946 |
resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==}
|
3947 |
engines: {node: '>= 0.4'}
|
3948 |
|
|
|
|
|
|
|
|
|
3949 | |
3950 |
resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==}
|
3951 |
engines: {node: '>=6'}
|
@@ -3954,6 +4010,10 @@ packages:
|
|
3954 |
resolution: {integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==}
|
3955 |
engines: {node: '>=8'}
|
3956 |
|
|
|
|
|
|
|
|
|
3957 | |
3958 |
resolution: {integrity: sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w==}
|
3959 |
|
@@ -3998,6 +4058,10 @@ packages:
|
|
3998 |
resolution: {integrity: sha512-FQoVQnqcdk4hVM4JN1eromaun4iuS34oStkdlLENLdpULsuQcTyXj8w7ayhuUfPwEYZ1ZOooOTT6fdA9Vmx/RA==}
|
3999 |
engines: {node: '>= 0.4'}
|
4000 |
|
|
|
|
|
|
|
|
|
4001 | |
4002 |
resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
|
4003 |
|
@@ -4198,6 +4262,10 @@ packages:
|
|
4198 |
resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==}
|
4199 |
engines: {node: '>= 0.4'}
|
4200 |
|
|
|
|
|
|
|
|
|
4201 | |
4202 |
resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==}
|
4203 |
|
@@ -4294,8 +4362,8 @@ packages:
|
|
4294 | |
4295 |
resolution: {integrity: sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg==}
|
4296 |
|
4297 |
-
[email protected].
|
4298 |
-
resolution: {integrity: sha512
|
4299 |
hasBin: true
|
4300 |
|
4301 | |
@@ -4374,8 +4442,8 @@ packages:
|
|
4374 | |
4375 |
resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==}
|
4376 |
|
4377 |
-
[email protected].
|
4378 |
-
resolution: {integrity: sha512
|
4379 |
engines: {node: '>=14'}
|
4380 |
|
4381 | |
@@ -4443,6 +4511,10 @@ packages:
|
|
4443 | |
4444 |
resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==}
|
4445 |
|
|
|
|
|
|
|
|
|
4446 | |
4447 |
resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==}
|
4448 |
|
@@ -4821,6 +4893,9 @@ packages:
|
|
4821 | |
4822 |
resolution: {integrity: sha512-xUsx5n/mN0uQf4V548PKQ+YShA4/IW0KI1dZhrNrPCLG+xizETbHTkOa1f8/xut9JRPp8kQuMnz0oqwkTiLo/A==}
|
4823 |
|
|
|
|
|
|
|
4824 | |
4825 |
resolution: {integrity: sha512-sEKPVl2rM+MNVkGQt3ChdmD8YsigmXdn5NifZn6jiwn9LRJpWm8F3guhaqrJT/JOat6pwpbXEk6kv+b9DMIjsQ==}
|
4826 |
|
@@ -5032,6 +5107,9 @@ packages:
|
|
5032 | |
5033 |
resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==}
|
5034 |
|
|
|
|
|
|
|
5035 | |
5036 |
resolution: {integrity: sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==}
|
5037 |
engines: {node: '>=6'}
|
@@ -5064,8 +5142,8 @@ packages:
|
|
5064 |
resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==}
|
5065 |
engines: {node: '>=16 || 14 >=14.18'}
|
5066 |
|
5067 |
-
[email protected].
|
5068 |
-
resolution: {integrity: sha512-
|
5069 |
|
5070 | |
5071 |
resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==}
|
@@ -5073,6 +5151,9 @@ packages:
|
|
5073 | |
5074 |
resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==}
|
5075 |
|
|
|
|
|
|
|
5076 | |
5077 |
resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==}
|
5078 |
engines: {node: '>= 14.16'}
|
@@ -5117,6 +5198,9 @@ packages:
|
|
5117 | |
5118 |
resolution: {integrity: sha512-sQoqa8alT3nHjGuTjuKgOnvjo4cljkufdtLMnO2LBP/wRwuDlo1tkaEdMxCRhyGRPacv/ztlZgDPm2b7FAmEvw==}
|
5119 |
|
|
|
|
|
|
|
5120 | |
5121 |
resolution: {integrity: sha512-yBgLP75OS8oCyUI0cXiWtVKXQKbLrfGfp4JUJwQD6i8n1OHUagig9WyJtj3I6/0+5TMm2nICc3lOYgD88NGEqw==}
|
5122 |
engines: {node: '>=18.12'}
|
@@ -5150,8 +5234,8 @@ packages:
|
|
5150 |
peerDependencies:
|
5151 |
postcss: ^8.1.0
|
5152 |
|
5153 |
-
postcss-modules-local-by-default@4.
|
5154 |
-
resolution: {integrity: sha512-
|
5155 |
engines: {node: ^10 || ^12 || >= 14}
|
5156 |
peerDependencies:
|
5157 |
postcss: ^8.1.0
|
@@ -5188,6 +5272,10 @@ packages:
|
|
5188 |
resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==}
|
5189 |
engines: {node: ^10 || ^12 || >=14}
|
5190 |
|
|
|
|
|
|
|
|
|
5191 | |
5192 |
resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
|
5193 |
engines: {node: '>= 0.8.0'}
|
@@ -5370,15 +5458,15 @@ packages:
|
|
5370 |
react: ^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc
|
5371 |
react-dom: ^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc
|
5372 |
|
5373 |
-
[email protected].
|
5374 |
-
resolution: {integrity: sha512-
|
5375 |
engines: {node: '>=14.0.0'}
|
5376 |
peerDependencies:
|
5377 |
react: '>=16.8'
|
5378 |
react-dom: '>=16.8'
|
5379 |
|
5380 |
-
[email protected].
|
5381 |
-
resolution: {integrity: sha512-
|
5382 |
engines: {node: '>=14.0.0'}
|
5383 |
peerDependencies:
|
5384 |
react: '>=16.8'
|
@@ -5759,10 +5847,26 @@ packages:
|
|
5759 | |
5760 |
resolution: {integrity: sha512-qIneep7QRwxRd5oiHb8jaRzH15V/S8F3saCXOdjwRLgozZJr5x2yeBhQtqkO3FSzQDwYEFAYuifg4oHjpDghrg==}
|
5761 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
5762 | |
5763 |
resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==}
|
5764 |
engines: {node: '>= 0.4'}
|
5765 |
|
|
|
|
|
|
|
|
|
5766 | |
5767 |
resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==}
|
5768 |
|
@@ -5817,8 +5921,8 @@ packages:
|
|
5817 | |
5818 |
resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==}
|
5819 |
|
5820 |
-
[email protected].
|
5821 |
-
resolution: {integrity: sha512-
|
5822 |
|
5823 | |
5824 |
resolution: {integrity: sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==}
|
@@ -5961,8 +6065,8 @@ packages:
|
|
5961 | |
5962 |
resolution: {integrity: sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA==}
|
5963 |
|
5964 |
-
[email protected].
|
5965 |
-
resolution: {integrity: sha512-
|
5966 |
|
5967 | |
5968 |
resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==}
|
@@ -6470,8 +6574,8 @@ packages:
|
|
6470 | |
6471 |
resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
|
6472 |
|
6473 |
-
yaml@2.
|
6474 |
-
resolution: {integrity: sha512
|
6475 |
engines: {node: '>= 14'}
|
6476 |
hasBin: true
|
6477 |
|
@@ -7080,6 +7184,14 @@ snapshots:
|
|
7080 |
'@jridgewell/trace-mapping': 0.3.25
|
7081 |
jsesc: 3.0.2
|
7082 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
7083 |
'@babel/[email protected]':
|
7084 |
dependencies:
|
7085 |
'@babel/types': 7.26.0
|
@@ -7134,6 +7246,8 @@ snapshots:
|
|
7134 |
|
7135 |
'@babel/[email protected]': {}
|
7136 |
|
|
|
|
|
7137 |
'@babel/[email protected](@babel/[email protected])':
|
7138 |
dependencies:
|
7139 |
'@babel/core': 7.26.0
|
@@ -7172,10 +7286,14 @@ snapshots:
|
|
7172 |
dependencies:
|
7173 |
'@babel/types': 7.26.0
|
7174 |
|
|
|
|
|
|
|
|
|
7175 |
'@babel/[email protected](@babel/[email protected])':
|
7176 |
dependencies:
|
7177 |
'@babel/core': 7.26.0
|
7178 |
-
'@babel/helper-plugin-utils': 7.
|
7179 |
|
7180 |
'@babel/[email protected](@babel/[email protected])':
|
7181 |
dependencies:
|
@@ -7240,24 +7358,41 @@ snapshots:
|
|
7240 |
transitivePeerDependencies:
|
7241 |
- supports-color
|
7242 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
7243 |
'@babel/[email protected]':
|
7244 |
dependencies:
|
7245 |
'@babel/helper-string-parser': 7.25.9
|
7246 |
'@babel/helper-validator-identifier': 7.25.9
|
7247 |
|
7248 |
-
'@
|
7249 |
dependencies:
|
7250 |
-
'@
|
7251 |
-
'@
|
7252 |
-
|
7253 |
-
|
|
|
|
|
|
|
|
|
|
|
7254 |
common-tags: 1.8.2
|
7255 |
-
eslint: 9.16.0([email protected].
|
7256 |
-
eslint-config-prettier: 9.1.0([email protected]([email protected].
|
7257 |
-
eslint-plugin-jsonc: 2.18.2([email protected]([email protected].
|
7258 |
-
eslint-plugin-prettier: 5.2.1(@types/[email protected])([email protected]([email protected]([email protected].
|
7259 |
globals: 15.13.0
|
7260 |
-
typescript-eslint: 8.17.0([email protected]([email protected].
|
7261 |
transitivePeerDependencies:
|
7262 |
- '@eslint/json'
|
7263 |
- '@types/eslint'
|
@@ -7723,9 +7858,9 @@ snapshots:
|
|
7723 |
'@esbuild/[email protected]':
|
7724 |
optional: true
|
7725 |
|
7726 |
-
'@eslint-community/[email protected]([email protected]([email protected].
|
7727 |
dependencies:
|
7728 |
-
eslint: 9.16.0([email protected].
|
7729 |
eslint-visitor-keys: 3.4.3
|
7730 |
|
7731 |
'@eslint-community/[email protected]': {}
|
@@ -7923,6 +8058,12 @@ snapshots:
|
|
7923 |
'@jridgewell/sourcemap-codec': 1.5.0
|
7924 |
'@jridgewell/trace-mapping': 0.3.25
|
7925 |
|
|
|
|
|
|
|
|
|
|
|
|
|
7926 |
'@jridgewell/[email protected]': {}
|
7927 |
|
7928 |
'@jridgewell/[email protected]': {}
|
@@ -8167,6 +8308,11 @@ snapshots:
|
|
8167 |
|
8168 |
'@opentelemetry/[email protected]': {}
|
8169 |
|
|
|
|
|
|
|
|
|
|
|
8170 |
'@pkgjs/[email protected]':
|
8171 |
optional: true
|
8172 |
|
@@ -8556,51 +8702,51 @@ snapshots:
|
|
8556 |
dependencies:
|
8557 |
react: 18.3.1
|
8558 |
|
8559 |
-
'@remix-run/[email protected].
|
8560 |
dependencies:
|
8561 |
'@cloudflare/workers-types': 4.20241127.0
|
8562 |
-
'@remix-run/cloudflare': 2.15.
|
8563 |
optionalDependencies:
|
8564 |
typescript: 5.7.2
|
8565 |
|
8566 |
-
'@remix-run/[email protected].
|
8567 |
dependencies:
|
8568 |
'@cloudflare/kv-asset-handler': 0.1.3
|
8569 |
'@cloudflare/workers-types': 4.20241127.0
|
8570 |
-
'@remix-run/server-runtime': 2.15.
|
8571 |
optionalDependencies:
|
8572 |
typescript: 5.7.2
|
8573 |
|
8574 |
-
'@remix-run/[email protected].
|
8575 |
dependencies:
|
8576 |
'@babel/core': 7.26.0
|
8577 |
-
'@babel/generator': 7.26.
|
8578 |
-
'@babel/parser': 7.26.
|
8579 |
'@babel/plugin-syntax-decorators': 7.25.9(@babel/[email protected])
|
8580 |
'@babel/plugin-syntax-jsx': 7.25.9(@babel/[email protected])
|
8581 |
'@babel/preset-typescript': 7.26.0(@babel/[email protected])
|
8582 |
-
'@babel/traverse': 7.
|
8583 |
-
'@babel/types': 7.26.
|
8584 |
'@mdx-js/mdx': 2.3.0
|
8585 |
'@npmcli/package-json': 4.0.1
|
8586 |
-
'@remix-run/node': 2.15.
|
8587 |
-
'@remix-run/react': 2.15.
|
8588 |
'@remix-run/router': 1.21.0
|
8589 |
-
'@remix-run/server-runtime': 2.15.
|
8590 |
'@types/mdx': 2.0.13
|
8591 |
-
'@vanilla-extract/integration': 6.5.0(@types/[email protected].
|
8592 |
arg: 5.0.2
|
8593 |
cacache: 17.1.4
|
8594 |
chalk: 4.1.2
|
8595 |
chokidar: 3.6.0
|
8596 |
cross-spawn: 7.0.6
|
8597 |
dotenv: 16.4.7
|
8598 |
-
es-module-lexer: 1.
|
8599 |
esbuild: 0.17.6
|
8600 |
esbuild-plugins-node-modules-polyfill: 1.6.8([email protected])
|
8601 |
execa: 5.1.1
|
8602 |
exit-hook: 2.2.1
|
8603 |
-
express: 4.21.
|
8604 |
fs-extra: 10.1.0
|
8605 |
get-port: 5.1.1
|
8606 |
gunzip-maybe: 1.4.2
|
@@ -8613,10 +8759,10 @@ snapshots:
|
|
8613 |
picocolors: 1.1.1
|
8614 |
picomatch: 2.3.1
|
8615 |
pidtree: 0.6.0
|
8616 |
-
postcss: 8.
|
8617 |
-
postcss-discard-duplicates: 5.1.0(postcss@8.
|
8618 |
-
postcss-load-config: 4.0.2(postcss@8.
|
8619 |
-
postcss-modules: 6.0.1(postcss@8.
|
8620 |
prettier: 2.8.8
|
8621 |
pretty-ms: 7.0.1
|
8622 |
react-refresh: 0.14.2
|
@@ -8624,14 +8770,14 @@ snapshots:
|
|
8624 |
remark-mdx-frontmatter: 1.1.1
|
8625 |
semver: 7.6.3
|
8626 |
set-cookie-parser: 2.7.1
|
8627 |
-
tar-fs: 2.1.
|
8628 |
tsconfig-paths: 4.2.0
|
8629 |
valibot: 0.41.0([email protected])
|
8630 |
-
vite-node: 1.6.0(@types/[email protected].
|
8631 |
ws: 7.5.10
|
8632 |
optionalDependencies:
|
8633 |
typescript: 5.7.2
|
8634 |
-
vite: 5.4.11(@types/[email protected].
|
8635 |
wrangler: 3.91.0(@cloudflare/[email protected])
|
8636 |
transitivePeerDependencies:
|
8637 |
- '@types/node'
|
@@ -8649,18 +8795,6 @@ snapshots:
|
|
8649 |
- ts-node
|
8650 |
- utf-8-validate
|
8651 |
|
8652 |
-
'@remix-run/[email protected]([email protected])':
|
8653 |
-
dependencies:
|
8654 |
-
'@remix-run/server-runtime': 2.15.0([email protected])
|
8655 |
-
'@remix-run/web-fetch': 4.4.2
|
8656 |
-
'@web3-storage/multipart-parser': 1.0.0
|
8657 |
-
cookie-signature: 1.2.2
|
8658 |
-
source-map-support: 0.5.21
|
8659 |
-
stream-slice: 0.1.2
|
8660 |
-
undici: 6.21.0
|
8661 |
-
optionalDependencies:
|
8662 |
-
typescript: 5.7.2
|
8663 |
-
|
8664 |
'@remix-run/[email protected]([email protected])':
|
8665 |
dependencies:
|
8666 |
'@remix-run/server-runtime': 2.15.2([email protected])
|
@@ -8673,32 +8807,20 @@ snapshots:
|
|
8673 |
optionalDependencies:
|
8674 |
typescript: 5.7.2
|
8675 |
|
8676 |
-
'@remix-run/[email protected].
|
8677 |
dependencies:
|
8678 |
'@remix-run/router': 1.21.0
|
8679 |
-
'@remix-run/server-runtime': 2.15.
|
8680 |
react: 18.3.1
|
8681 |
react-dom: 18.3.1([email protected])
|
8682 |
-
react-router: 6.28.
|
8683 |
-
react-router-dom: 6.28.
|
8684 |
turbo-stream: 2.4.0
|
8685 |
optionalDependencies:
|
8686 |
typescript: 5.7.2
|
8687 |
|
8688 |
'@remix-run/[email protected]': {}
|
8689 |
|
8690 |
-
'@remix-run/[email protected]([email protected])':
|
8691 |
-
dependencies:
|
8692 |
-
'@remix-run/router': 1.21.0
|
8693 |
-
'@types/cookie': 0.6.0
|
8694 |
-
'@web3-storage/multipart-parser': 1.0.0
|
8695 |
-
cookie: 0.6.0
|
8696 |
-
set-cookie-parser: 2.7.1
|
8697 |
-
source-map: 0.7.4
|
8698 |
-
turbo-stream: 2.4.0
|
8699 |
-
optionalDependencies:
|
8700 |
-
typescript: 5.7.2
|
8701 |
-
|
8702 |
'@remix-run/[email protected]([email protected])':
|
8703 |
dependencies:
|
8704 |
'@remix-run/router': 1.21.0
|
@@ -9133,10 +9255,10 @@ snapshots:
|
|
9133 |
'@smithy/util-buffer-from': 3.0.0
|
9134 |
tslib: 2.8.1
|
9135 |
|
9136 |
-
'@stylistic/[email protected]([email protected]([email protected].
|
9137 |
dependencies:
|
9138 |
-
'@typescript-eslint/utils': 8.17.0([email protected]([email protected].
|
9139 |
-
eslint: 9.16.0([email protected].
|
9140 |
eslint-visitor-keys: 4.2.0
|
9141 |
espree: 10.3.0
|
9142 |
transitivePeerDependencies:
|
@@ -9219,6 +9341,10 @@ snapshots:
|
|
9219 |
dependencies:
|
9220 |
undici-types: 6.20.0
|
9221 |
|
|
|
|
|
|
|
|
|
9222 |
'@types/[email protected]': {}
|
9223 |
|
9224 |
'@types/[email protected]':
|
@@ -9236,15 +9362,15 @@ snapshots:
|
|
9236 |
|
9237 |
'@types/[email protected]': {}
|
9238 |
|
9239 |
-
'@typescript-eslint/[email protected](@typescript-eslint/[email protected]([email protected]([email protected].
|
9240 |
dependencies:
|
9241 |
'@eslint-community/regexpp': 4.12.1
|
9242 |
-
'@typescript-eslint/parser': 8.17.0([email protected]([email protected].
|
9243 |
'@typescript-eslint/scope-manager': 8.17.0
|
9244 |
-
'@typescript-eslint/type-utils': 8.17.0([email protected]([email protected].
|
9245 |
-
'@typescript-eslint/utils': 8.17.0([email protected]([email protected].
|
9246 |
'@typescript-eslint/visitor-keys': 8.17.0
|
9247 |
-
eslint: 9.16.0([email protected].
|
9248 |
graphemer: 1.4.0
|
9249 |
ignore: 5.3.2
|
9250 |
natural-compare: 1.4.0
|
@@ -9254,14 +9380,14 @@ snapshots:
|
|
9254 |
transitivePeerDependencies:
|
9255 |
- supports-color
|
9256 |
|
9257 |
-
'@typescript-eslint/[email protected]([email protected]([email protected].
|
9258 |
dependencies:
|
9259 |
'@typescript-eslint/scope-manager': 8.17.0
|
9260 |
'@typescript-eslint/types': 8.17.0
|
9261 |
'@typescript-eslint/typescript-estree': 8.17.0([email protected])
|
9262 |
'@typescript-eslint/visitor-keys': 8.17.0
|
9263 |
debug: 4.3.7
|
9264 |
-
eslint: 9.16.0([email protected].
|
9265 |
optionalDependencies:
|
9266 |
typescript: 5.7.2
|
9267 |
transitivePeerDependencies:
|
@@ -9272,12 +9398,12 @@ snapshots:
|
|
9272 |
'@typescript-eslint/types': 8.17.0
|
9273 |
'@typescript-eslint/visitor-keys': 8.17.0
|
9274 |
|
9275 |
-
'@typescript-eslint/[email protected]([email protected]([email protected].
|
9276 |
dependencies:
|
9277 |
'@typescript-eslint/typescript-estree': 8.17.0([email protected])
|
9278 |
-
'@typescript-eslint/utils': 8.17.0([email protected]([email protected].
|
9279 |
debug: 4.3.7
|
9280 |
-
eslint: 9.16.0([email protected].
|
9281 |
ts-api-utils: 1.4.3([email protected])
|
9282 |
optionalDependencies:
|
9283 |
typescript: 5.7.2
|
@@ -9301,13 +9427,13 @@ snapshots:
|
|
9301 |
transitivePeerDependencies:
|
9302 |
- supports-color
|
9303 |
|
9304 |
-
'@typescript-eslint/[email protected]([email protected]([email protected].
|
9305 |
dependencies:
|
9306 |
-
'@eslint-community/eslint-utils': 4.4.1([email protected]([email protected].
|
9307 |
'@typescript-eslint/scope-manager': 8.17.0
|
9308 |
'@typescript-eslint/types': 8.17.0
|
9309 |
'@typescript-eslint/typescript-estree': 8.17.0([email protected])
|
9310 |
-
eslint: 9.16.0([email protected].
|
9311 |
optionalDependencies:
|
9312 |
typescript: 5.7.2
|
9313 |
transitivePeerDependencies:
|
@@ -9334,13 +9460,13 @@ snapshots:
|
|
9334 |
|
9335 |
'@ungap/[email protected]': {}
|
9336 |
|
9337 |
-
'@unocss/[email protected]([email protected])([email protected](@types/[email protected].
|
9338 |
dependencies:
|
9339 |
'@unocss/core': 0.61.9
|
9340 |
'@unocss/reset': 0.61.9
|
9341 |
-
'@unocss/vite': 0.61.9([email protected])([email protected](@types/[email protected].
|
9342 |
optionalDependencies:
|
9343 |
-
vite: 5.4.11(@types/[email protected].
|
9344 |
transitivePeerDependencies:
|
9345 |
- rollup
|
9346 |
- supports-color
|
@@ -9384,7 +9510,7 @@ snapshots:
|
|
9384 |
gzip-size: 6.0.0
|
9385 |
sirv: 2.0.4
|
9386 |
|
9387 |
-
'@unocss/[email protected](postcss@8.
|
9388 |
dependencies:
|
9389 |
'@unocss/config': 0.61.9
|
9390 |
'@unocss/core': 0.61.9
|
@@ -9392,7 +9518,7 @@ snapshots:
|
|
9392 |
css-tree: 2.3.1
|
9393 |
fast-glob: 3.3.2
|
9394 |
magic-string: 0.30.14
|
9395 |
-
postcss: 8.
|
9396 |
transitivePeerDependencies:
|
9397 |
- supports-color
|
9398 |
|
@@ -9477,7 +9603,7 @@ snapshots:
|
|
9477 |
dependencies:
|
9478 |
'@unocss/core': 0.61.9
|
9479 |
|
9480 |
-
'@unocss/[email protected]([email protected])([email protected](@types/[email protected].
|
9481 |
dependencies:
|
9482 |
'@ampproject/remapping': 2.3.0
|
9483 |
'@rollup/pluginutils': 5.1.3([email protected])
|
@@ -9489,18 +9615,18 @@ snapshots:
|
|
9489 |
chokidar: 3.6.0
|
9490 |
fast-glob: 3.3.2
|
9491 |
magic-string: 0.30.14
|
9492 |
-
vite: 5.4.11(@types/[email protected].
|
9493 |
transitivePeerDependencies:
|
9494 |
- rollup
|
9495 |
- supports-color
|
9496 |
|
9497 |
-
'@vanilla-extract/babel-plugin-debug-ids@1.
|
9498 |
dependencies:
|
9499 |
'@babel/core': 7.26.0
|
9500 |
transitivePeerDependencies:
|
9501 |
- supports-color
|
9502 |
|
9503 |
-
'@vanilla-extract/css@1.
|
9504 |
dependencies:
|
9505 |
'@emotion/hash': 0.9.2
|
9506 |
'@vanilla-extract/private': 1.0.6
|
@@ -9517,21 +9643,21 @@ snapshots:
|
|
9517 |
transitivePeerDependencies:
|
9518 |
- babel-plugin-macros
|
9519 |
|
9520 |
-
'@vanilla-extract/[email protected](@types/[email protected].
|
9521 |
dependencies:
|
9522 |
'@babel/core': 7.26.0
|
9523 |
'@babel/plugin-syntax-typescript': 7.25.9(@babel/[email protected])
|
9524 |
-
'@vanilla-extract/babel-plugin-debug-ids': 1.
|
9525 |
-
'@vanilla-extract/css': 1.
|
9526 |
-
esbuild: 0.17.
|
9527 |
eval: 0.1.8
|
9528 |
find-up: 5.0.0
|
9529 |
javascript-stringify: 2.1.0
|
9530 |
lodash: 4.17.21
|
9531 |
-
mlly: 1.7.
|
9532 |
outdent: 0.8.0
|
9533 |
-
vite: 5.4.11(@types/[email protected].
|
9534 |
-
vite-node: 1.6.0(@types/[email protected].
|
9535 |
transitivePeerDependencies:
|
9536 |
- '@types/node'
|
9537 |
- babel-plugin-macros
|
@@ -9553,13 +9679,13 @@ snapshots:
|
|
9553 |
chai: 5.1.2
|
9554 |
tinyrainbow: 1.2.0
|
9555 |
|
9556 |
-
'@vitest/[email protected]([email protected](@types/[email protected].
|
9557 |
dependencies:
|
9558 |
'@vitest/spy': 2.1.8
|
9559 |
estree-walker: 3.0.3
|
9560 |
magic-string: 0.30.14
|
9561 |
optionalDependencies:
|
9562 |
-
vite: 5.4.11(@types/[email protected].
|
9563 |
|
9564 |
'@vitest/[email protected]':
|
9565 |
dependencies:
|
@@ -9861,6 +9987,11 @@ snapshots:
|
|
9861 |
tar: 6.2.1
|
9862 |
unique-filename: 3.0.0
|
9863 |
|
|
|
|
|
|
|
|
|
|
|
9864 | |
9865 |
dependencies:
|
9866 |
es-define-property: 1.0.0
|
@@ -9869,6 +10000,11 @@ snapshots:
|
|
9869 |
get-intrinsic: 1.2.4
|
9870 |
set-function-length: 1.2.2
|
9871 |
|
|
|
|
|
|
|
|
|
|
|
9872 | |
9873 |
|
9874 | |
@@ -10088,6 +10224,10 @@ snapshots:
|
|
10088 |
dependencies:
|
10089 |
ms: 2.1.3
|
10090 |
|
|
|
|
|
|
|
|
|
10091 | |
10092 |
dependencies:
|
10093 |
character-entities: 2.0.2
|
@@ -10168,6 +10308,12 @@ snapshots:
|
|
10168 |
|
10169 | |
10170 |
|
|
|
|
|
|
|
|
|
|
|
|
|
10171 | |
10172 |
|
10173 | |
@@ -10219,10 +10365,18 @@ snapshots:
|
|
10219 |
dependencies:
|
10220 |
get-intrinsic: 1.2.4
|
10221 |
|
|
|
|
|
10222 | |
10223 |
|
10224 | |
10225 |
|
|
|
|
|
|
|
|
|
|
|
|
|
10226 | |
10227 |
dependencies:
|
10228 |
'@jspm/core': 2.0.1
|
@@ -10341,27 +10495,27 @@ snapshots:
|
|
10341 |
|
10342 | |
10343 |
|
10344 | |
10345 |
dependencies:
|
10346 |
-
eslint: 9.16.0([email protected].
|
10347 |
semver: 7.6.3
|
10348 |
|
10349 | |
10350 |
dependencies:
|
10351 |
-
eslint: 9.16.0([email protected].
|
10352 |
|
10353 | |
10354 |
dependencies:
|
10355 |
-
eslint: 9.16.0([email protected].
|
10356 |
esquery: 1.6.0
|
10357 |
jsonc-eslint-parser: 2.4.0
|
10358 |
|
10359 | |
10360 |
dependencies:
|
10361 |
-
'@eslint-community/eslint-utils': 4.4.1([email protected]([email protected].
|
10362 |
-
eslint: 9.16.0([email protected].
|
10363 |
-
eslint-compat-utils: 0.6.4([email protected]([email protected].
|
10364 |
-
eslint-json-compat-utils: 0.2.1([email protected]([email protected].
|
10365 |
espree: 9.6.1
|
10366 |
graphemer: 1.4.0
|
10367 |
jsonc-eslint-parser: 2.4.0
|
@@ -10370,15 +10524,15 @@ snapshots:
|
|
10370 |
transitivePeerDependencies:
|
10371 |
- '@eslint/json'
|
10372 |
|
10373 | |
10374 |
dependencies:
|
10375 |
-
eslint: 9.16.0([email protected].
|
10376 |
prettier: 3.4.1
|
10377 |
prettier-linter-helpers: 1.0.0
|
10378 |
synckit: 0.9.2
|
10379 |
optionalDependencies:
|
10380 |
'@types/eslint': 8.56.10
|
10381 |
-
eslint-config-prettier: 9.1.0([email protected]([email protected].
|
10382 |
|
10383 | |
10384 |
dependencies:
|
@@ -10389,9 +10543,9 @@ snapshots:
|
|
10389 |
|
10390 | |
10391 |
|
10392 | |
10393 |
dependencies:
|
10394 |
-
'@eslint-community/eslint-utils': 4.4.1([email protected]([email protected].
|
10395 |
'@eslint-community/regexpp': 4.12.1
|
10396 |
'@eslint/config-array': 0.19.0
|
10397 |
'@eslint/core': 0.9.0
|
@@ -10426,7 +10580,7 @@ snapshots:
|
|
10426 |
natural-compare: 1.4.0
|
10427 |
optionator: 0.9.4
|
10428 |
optionalDependencies:
|
10429 |
-
jiti: 1.21.
|
10430 |
transitivePeerDependencies:
|
10431 |
- supports-color
|
10432 |
|
@@ -10497,7 +10651,7 @@ snapshots:
|
|
10497 |
|
10498 | |
10499 |
dependencies:
|
10500 |
-
'@types/node': 22.10.
|
10501 |
require-like: 0.1.2
|
10502 |
|
10503 | |
@@ -10529,7 +10683,7 @@ snapshots:
|
|
10529 |
|
10530 | |
10531 |
|
10532 |
-
[email protected].
|
10533 |
dependencies:
|
10534 |
accepts: 1.3.8
|
10535 |
array-flatten: 1.1.1
|
@@ -10550,7 +10704,7 @@ snapshots:
|
|
10550 |
methods: 1.1.2
|
10551 |
on-finished: 2.4.1
|
10552 |
parseurl: 1.3.3
|
10553 |
-
path-to-regexp: 0.1.
|
10554 |
proxy-addr: 2.0.7
|
10555 |
qs: 6.13.0
|
10556 |
range-parser: 1.2.1
|
@@ -10695,10 +10849,28 @@ snapshots:
|
|
10695 |
has-symbols: 1.1.0
|
10696 |
hasown: 2.0.2
|
10697 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
10698 | |
10699 |
|
10700 | |
10701 |
|
|
|
|
|
|
|
|
|
|
|
10702 | |
10703 |
dependencies:
|
10704 |
data-uri-to-buffer: 2.0.2
|
@@ -10741,6 +10913,8 @@ snapshots:
|
|
10741 |
dependencies:
|
10742 |
get-intrinsic: 1.2.4
|
10743 |
|
|
|
|
|
10744 | |
10745 |
|
10746 | |
@@ -10939,9 +11113,9 @@ snapshots:
|
|
10939 |
dependencies:
|
10940 |
safer-buffer: 2.1.2
|
10941 |
|
10942 |
-
[email protected](postcss@8.
|
10943 |
dependencies:
|
10944 |
-
postcss: 8.
|
10945 |
|
10946 | |
10947 |
|
@@ -10964,7 +11138,7 @@ snapshots:
|
|
10964 |
debug: 4.3.7
|
10965 |
esbuild: 0.23.1
|
10966 |
jiti: 2.0.0-beta.3
|
10967 |
-
jiti-v1: [email protected].
|
10968 |
pathe: 1.1.2
|
10969 |
tsx: 4.19.2
|
10970 |
transitivePeerDependencies:
|
@@ -11017,6 +11191,10 @@ snapshots:
|
|
11017 |
dependencies:
|
11018 |
hasown: 2.0.2
|
11019 |
|
|
|
|
|
|
|
|
|
11020 | |
11021 |
|
11022 | |
@@ -11101,7 +11279,7 @@ snapshots:
|
|
11101 |
|
11102 | |
11103 |
|
11104 |
-
[email protected].
|
11105 |
|
11106 | |
11107 |
|
@@ -11172,7 +11350,7 @@ snapshots:
|
|
11172 |
dependencies:
|
11173 |
immediate: 3.0.6
|
11174 |
|
11175 |
-
[email protected].
|
11176 |
|
11177 | |
11178 |
|
@@ -11228,6 +11406,8 @@ snapshots:
|
|
11228 |
|
11229 | |
11230 |
|
|
|
|
|
11231 | |
11232 |
dependencies:
|
11233 |
hash-base: 3.0.5
|
@@ -11374,7 +11554,7 @@ snapshots:
|
|
11374 |
ccount: 2.0.1
|
11375 |
mdast-util-from-markdown: 1.3.1
|
11376 |
mdast-util-to-markdown: 1.5.0
|
11377 |
-
parse-entities: 4.0.
|
11378 |
stringify-entities: 4.0.4
|
11379 |
unist-util-remove-position: 4.0.2
|
11380 |
unist-util-stringify-position: 3.0.3
|
@@ -11873,7 +12053,7 @@ snapshots:
|
|
11873 | |
11874 |
dependencies:
|
11875 |
'@types/debug': 4.1.12
|
11876 |
-
debug: 4.
|
11877 |
decode-named-character-reference: 1.0.2
|
11878 |
micromark-core-commonmark: 1.1.0
|
11879 |
micromark-factory-space: 1.1.0
|
@@ -12013,6 +12193,13 @@ snapshots:
|
|
12013 |
pkg-types: 1.2.1
|
12014 |
ufo: 1.5.4
|
12015 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
12016 | |
12017 |
|
12018 | |
@@ -12110,7 +12297,7 @@ snapshots:
|
|
12110 | |
12111 |
dependencies:
|
12112 |
hosted-git-info: 6.1.3
|
12113 |
-
is-core-module: 2.
|
12114 |
semver: 7.6.3
|
12115 |
validate-npm-package-license: 3.0.4
|
12116 |
|
@@ -12259,6 +12446,16 @@ snapshots:
|
|
12259 |
is-decimal: 2.0.1
|
12260 |
is-hexadecimal: 2.0.1
|
12261 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
12262 | |
12263 |
|
12264 | |
@@ -12282,12 +12479,14 @@ snapshots:
|
|
12282 |
lru-cache: 10.4.3
|
12283 |
minipass: 7.1.2
|
12284 |
|
12285 |
-
[email protected].
|
12286 |
|
12287 | |
12288 |
|
12289 | |
12290 |
|
|
|
|
|
12291 | |
12292 |
|
12293 | |
@@ -12332,52 +12531,58 @@ snapshots:
|
|
12332 |
mlly: 1.7.3
|
12333 |
pathe: 1.1.2
|
12334 |
|
|
|
|
|
|
|
|
|
|
|
|
|
12335 | |
12336 |
|
12337 | |
12338 |
|
12339 |
-
[email protected](postcss@8.
|
12340 |
dependencies:
|
12341 |
-
postcss: 8.
|
12342 |
|
12343 |
-
[email protected](postcss@8.
|
12344 |
dependencies:
|
12345 |
-
lilconfig: 3.1.
|
12346 |
-
yaml: 2.
|
12347 |
optionalDependencies:
|
12348 |
-
postcss: 8.
|
12349 |
|
12350 |
-
[email protected](postcss@8.
|
12351 |
dependencies:
|
12352 |
-
postcss: 8.
|
12353 |
|
12354 |
-
postcss-modules-local-by-default@4.
|
12355 |
dependencies:
|
12356 |
-
icss-utils: 5.1.0(postcss@8.
|
12357 |
-
postcss: 8.
|
12358 |
postcss-selector-parser: 7.0.0
|
12359 |
postcss-value-parser: 4.2.0
|
12360 |
|
12361 |
-
[email protected](postcss@8.
|
12362 |
dependencies:
|
12363 |
-
postcss: 8.
|
12364 |
postcss-selector-parser: 7.0.0
|
12365 |
|
12366 |
-
[email protected](postcss@8.
|
12367 |
dependencies:
|
12368 |
-
icss-utils: 5.1.0(postcss@8.
|
12369 |
-
postcss: 8.
|
12370 |
|
12371 |
-
[email protected](postcss@8.
|
12372 |
dependencies:
|
12373 |
generic-names: 4.0.0
|
12374 |
-
icss-utils: 5.1.0(postcss@8.
|
12375 |
lodash.camelcase: 4.3.0
|
12376 |
-
postcss: 8.
|
12377 |
-
postcss-modules-extract-imports: 3.1.0(postcss@8.
|
12378 |
-
postcss-modules-local-by-default: 4.
|
12379 |
-
postcss-modules-scope: 3.2.1(postcss@8.
|
12380 |
-
postcss-modules-values: 4.0.0(postcss@8.
|
12381 |
string-hash: 1.1.3
|
12382 |
|
12383 | |
@@ -12399,6 +12604,12 @@ snapshots:
|
|
12399 |
picocolors: 1.1.1
|
12400 |
source-map-js: 1.2.1
|
12401 |
|
|
|
|
|
|
|
|
|
|
|
|
|
12402 | |
12403 |
|
12404 | |
@@ -12466,7 +12677,7 @@ snapshots:
|
|
12466 |
|
12467 | |
12468 |
dependencies:
|
12469 |
-
side-channel: 1.0
|
12470 |
|
12471 | |
12472 |
dependencies:
|
@@ -12503,7 +12714,7 @@ snapshots:
|
|
12503 |
dependencies:
|
12504 |
dnd-core: 16.0.1
|
12505 |
|
12506 |
-
[email protected](@types/[email protected].
|
12507 |
dependencies:
|
12508 |
'@react-dnd/invariant': 4.0.2
|
12509 |
'@react-dnd/shallowequal': 4.0.2
|
@@ -12512,7 +12723,7 @@ snapshots:
|
|
12512 |
hoist-non-react-statics: 3.3.2
|
12513 |
react: 18.3.1
|
12514 |
optionalDependencies:
|
12515 |
-
'@types/node': 22.10.
|
12516 |
'@types/react': 18.3.12
|
12517 |
|
12518 | |
@@ -12575,14 +12786,14 @@ snapshots:
|
|
12575 |
react: 18.3.1
|
12576 |
react-dom: 18.3.1([email protected])
|
12577 |
|
12578 | |
12579 |
dependencies:
|
12580 |
'@remix-run/router': 1.21.0
|
12581 |
react: 18.3.1
|
12582 |
react-dom: 18.3.1([email protected])
|
12583 |
-
react-router: 6.28.
|
12584 |
|
12585 | |
12586 |
dependencies:
|
12587 |
'@remix-run/router': 1.21.0
|
12588 |
react: 18.3.1
|
@@ -12725,20 +12936,20 @@ snapshots:
|
|
12725 |
mdast-util-to-markdown: 2.1.2
|
12726 |
unified: 11.0.5
|
12727 |
|
12728 |
-
[email protected](@remix-run/[email protected].
|
12729 |
dependencies:
|
12730 |
-
'@remix-run/react': 2.15.
|
12731 |
'@remix-run/server-runtime': 2.15.2([email protected])
|
12732 |
react: 18.3.1
|
12733 |
react-dom: 18.3.1([email protected])
|
12734 |
|
12735 |
-
[email protected](@remix-run/[email protected].
|
12736 |
dependencies:
|
12737 |
type-fest: 4.30.0
|
12738 |
optionalDependencies:
|
12739 |
-
'@remix-run/cloudflare': 2.15.
|
12740 |
'@remix-run/node': 2.15.2([email protected])
|
12741 |
-
'@remix-run/react': 2.15.
|
12742 |
'@remix-run/router': 1.21.0
|
12743 |
react: 18.3.1
|
12744 |
zod: 3.23.8
|
@@ -13023,6 +13234,26 @@ snapshots:
|
|
13023 |
'@shikijs/vscode-textmate': 9.3.0
|
13024 |
'@types/hast': 3.0.4
|
13025 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
13026 | |
13027 |
dependencies:
|
13028 |
call-bind: 1.0.7
|
@@ -13030,6 +13261,14 @@ snapshots:
|
|
13030 |
get-intrinsic: 1.2.4
|
13031 |
object-inspect: 1.13.3
|
13032 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
13033 | |
13034 |
|
13035 | |
@@ -13073,16 +13312,16 @@ snapshots:
|
|
13073 | |
13074 |
dependencies:
|
13075 |
spdx-expression-parse: 3.0.1
|
13076 |
-
spdx-license-ids: 3.0.
|
13077 |
|
13078 | |
13079 |
|
13080 | |
13081 |
dependencies:
|
13082 |
spdx-exceptions: 2.5.0
|
13083 |
-
spdx-license-ids: 3.0.
|
13084 |
|
13085 |
-
[email protected].
|
13086 |
|
13087 | |
13088 |
dependencies:
|
@@ -13214,7 +13453,7 @@ snapshots:
|
|
13214 |
|
13215 | |
13216 |
|
13217 |
-
[email protected].
|
13218 |
dependencies:
|
13219 |
chownr: 1.1.4
|
13220 |
mkdirp-classic: 0.5.3
|
@@ -13315,12 +13554,12 @@ snapshots:
|
|
13315 |
media-typer: 0.3.0
|
13316 |
mime-types: 2.1.35
|
13317 |
|
13318 | |
13319 |
dependencies:
|
13320 |
-
'@typescript-eslint/eslint-plugin': 8.17.0(@typescript-eslint/[email protected]([email protected]([email protected].
|
13321 |
-
'@typescript-eslint/parser': 8.17.0([email protected]([email protected].
|
13322 |
-
'@typescript-eslint/utils': 8.17.0([email protected]([email protected].
|
13323 |
-
eslint: 9.16.0([email protected].
|
13324 |
optionalDependencies:
|
13325 |
typescript: 5.7.2
|
13326 |
transitivePeerDependencies:
|
@@ -13442,13 +13681,13 @@ snapshots:
|
|
13442 |
|
13443 | |
13444 |
|
13445 |
-
[email protected](postcss@8.
|
13446 |
dependencies:
|
13447 |
-
'@unocss/astro': 0.61.9([email protected])([email protected](@types/[email protected].
|
13448 |
'@unocss/cli': 0.61.9([email protected])
|
13449 |
'@unocss/core': 0.61.9
|
13450 |
'@unocss/extractor-arbitrary-variants': 0.61.9
|
13451 |
-
'@unocss/postcss': 0.61.9(postcss@8.
|
13452 |
'@unocss/preset-attributify': 0.61.9
|
13453 |
'@unocss/preset-icons': 0.61.9
|
13454 |
'@unocss/preset-mini': 0.61.9
|
@@ -13463,9 +13702,9 @@ snapshots:
|
|
13463 |
'@unocss/transformer-compile-class': 0.61.9
|
13464 |
'@unocss/transformer-directives': 0.61.9
|
13465 |
'@unocss/transformer-variant-group': 0.61.9
|
13466 |
-
'@unocss/vite': 0.61.9([email protected])([email protected](@types/[email protected].
|
13467 |
optionalDependencies:
|
13468 |
-
vite: 5.4.11(@types/[email protected].
|
13469 |
transitivePeerDependencies:
|
13470 |
- postcss
|
13471 |
- rollup
|
@@ -13572,13 +13811,13 @@ snapshots:
|
|
13572 |
'@types/unist': 3.0.3
|
13573 |
vfile-message: 4.0.2
|
13574 |
|
13575 |
-
[email protected](@types/[email protected].
|
13576 |
dependencies:
|
13577 |
cac: 6.7.14
|
13578 |
-
debug: 4.
|
13579 |
pathe: 1.1.2
|
13580 |
picocolors: 1.1.1
|
13581 |
-
vite: 5.4.11(@types/[email protected].
|
13582 |
transitivePeerDependencies:
|
13583 |
- '@types/node'
|
13584 |
- less
|
@@ -13590,13 +13829,13 @@ snapshots:
|
|
13590 |
- supports-color
|
13591 |
- terser
|
13592 |
|
13593 |
-
[email protected](@types/[email protected].
|
13594 |
dependencies:
|
13595 |
cac: 6.7.14
|
13596 |
debug: 4.3.7
|
13597 |
es-module-lexer: 1.5.4
|
13598 |
pathe: 1.1.2
|
13599 |
-
vite: 5.4.11(@types/[email protected].
|
13600 |
transitivePeerDependencies:
|
13601 |
- '@types/node'
|
13602 |
- less
|
@@ -13608,43 +13847,43 @@ snapshots:
|
|
13608 |
- supports-color
|
13609 |
- terser
|
13610 |
|
13611 | |
13612 |
dependencies:
|
13613 |
'@rollup/plugin-inject': 5.0.5([email protected])
|
13614 |
node-stdlib-browser: 1.3.0
|
13615 |
-
vite: 5.4.11(@types/[email protected].
|
13616 |
transitivePeerDependencies:
|
13617 |
- rollup
|
13618 |
|
13619 |
-
[email protected]([email protected](@types/[email protected].
|
13620 |
dependencies:
|
13621 |
-
vite: 5.4.11(@types/[email protected].
|
13622 |
|
13623 | |
13624 |
dependencies:
|
13625 |
debug: 4.3.7
|
13626 |
globrex: 0.1.2
|
13627 |
tsconfck: 3.1.4([email protected])
|
13628 |
optionalDependencies:
|
13629 |
-
vite: 5.4.11(@types/[email protected].
|
13630 |
transitivePeerDependencies:
|
13631 |
- supports-color
|
13632 |
- typescript
|
13633 |
|
13634 |
-
[email protected](@types/[email protected].
|
13635 |
dependencies:
|
13636 |
esbuild: 0.21.5
|
13637 |
postcss: 8.4.49
|
13638 |
rollup: 4.28.0
|
13639 |
optionalDependencies:
|
13640 |
-
'@types/node': 22.10.
|
13641 |
fsevents: 2.3.3
|
13642 |
sass-embedded: 1.81.0
|
13643 |
|
13644 |
-
[email protected](@types/[email protected].
|
13645 |
dependencies:
|
13646 |
'@vitest/expect': 2.1.8
|
13647 |
-
'@vitest/mocker': 2.1.8([email protected](@types/[email protected].
|
13648 |
'@vitest/pretty-format': 2.1.8
|
13649 |
'@vitest/runner': 2.1.8
|
13650 |
'@vitest/snapshot': 2.1.8
|
@@ -13660,11 +13899,11 @@ snapshots:
|
|
13660 |
tinyexec: 0.3.1
|
13661 |
tinypool: 1.0.2
|
13662 |
tinyrainbow: 1.2.0
|
13663 |
-
vite: 5.4.11(@types/[email protected].
|
13664 |
-
vite-node: 2.1.8(@types/[email protected].
|
13665 |
why-is-node-running: 2.3.0
|
13666 |
optionalDependencies:
|
13667 |
-
'@types/node': 22.10.
|
13668 |
transitivePeerDependencies:
|
13669 |
- less
|
13670 |
- lightningcss
|
@@ -13780,7 +14019,7 @@ snapshots:
|
|
13780 |
|
13781 | |
13782 |
|
13783 |
-
yaml@2.
|
13784 |
|
13785 | |
13786 |
|
|
|
98 |
'@openrouter/ai-sdk-provider':
|
99 |
specifier: ^0.0.5
|
100 |
version: 0.0.5([email protected])
|
101 |
+
'@phosphor-icons/react':
|
102 |
+
specifier: ^2.1.7
|
103 |
+
version: 2.1.7([email protected]([email protected]))([email protected])
|
104 |
'@radix-ui/react-context-menu':
|
105 |
specifier: ^2.2.2
|
106 |
version: 2.2.2(@types/[email protected])(@types/[email protected])([email protected]([email protected]))([email protected])
|
|
|
120 |
specifier: ^1.1.4
|
121 |
version: 1.1.4(@types/[email protected])(@types/[email protected])([email protected]([email protected]))([email protected])
|
122 |
'@remix-run/cloudflare':
|
123 |
+
specifier: ^2.15.2
|
124 |
+
version: 2.15.2(@cloudflare/[email protected])([email protected])
|
125 |
'@remix-run/cloudflare-pages':
|
126 |
+
specifier: ^2.15.2
|
127 |
+
version: 2.15.2(@cloudflare/[email protected])([email protected])
|
128 |
'@remix-run/node':
|
129 |
specifier: ^2.15.2
|
130 |
version: 2.15.2([email protected])
|
131 |
'@remix-run/react':
|
132 |
+
specifier: ^2.15.2
|
133 |
+
version: 2.15.2([email protected]([email protected]))([email protected])([email protected])
|
134 |
'@uiw/codemirror-theme-vscode':
|
135 |
specifier: ^4.23.6
|
136 |
version: 4.23.6(@codemirror/[email protected])(@codemirror/[email protected])(@codemirror/[email protected])
|
|
|
214 |
version: 5.3.0([email protected])([email protected])
|
215 |
react-dnd:
|
216 |
specifier: ^16.0.1
|
217 |
+
version: 16.0.1(@types/[email protected].10)(@types/[email protected])([email protected])
|
218 |
react-dnd-html5-backend:
|
219 |
specifier: ^16.0.1
|
220 |
version: 16.0.1
|
|
|
247 |
version: 4.0.0
|
248 |
remix-island:
|
249 |
specifier: ^0.2.0
|
250 |
+
version: 0.2.0(@remix-run/[email protected].2([email protected]([email protected]))([email protected])([email protected]))(@remix-run/[email protected]([email protected]))([email protected]([email protected]))([email protected])
|
251 |
remix-utils:
|
252 |
specifier: ^7.7.0
|
253 |
+
version: 7.7.0(@remix-run/[email protected].2(@cloudflare/[email protected])([email protected]))(@remix-run/[email protected]([email protected]))(@remix-run/[email protected].2([email protected]([email protected]))([email protected])([email protected]))(@remix-run/[email protected])([email protected])([email protected])
|
254 |
shiki:
|
255 |
specifier: ^1.24.0
|
256 |
version: 1.24.0
|
|
|
263 |
devDependencies:
|
264 |
'@blitz/eslint-plugin':
|
265 |
specifier: 0.1.0
|
266 |
+
version: 0.1.0(@types/[email protected])([email protected].7)([email protected])([email protected])
|
267 |
'@cloudflare/workers-types':
|
268 |
specifier: ^4.20241127.0
|
269 |
version: 4.20241127.0
|
|
|
274 |
specifier: ^2.0.0
|
275 |
version: 2.0.0
|
276 |
'@remix-run/dev':
|
277 |
+
specifier: ^2.15.2
|
278 |
+
version: 2.15.2(@remix-run/[email protected].2([email protected]([email protected]))([email protected])([email protected]))(@types/[email protected].10)([email protected])([email protected])([email protected](@types/[email protected].10)([email protected]))([email protected](@cloudflare/[email protected]))
|
279 |
'@types/diff':
|
280 |
specifier: ^5.2.3
|
281 |
version: 5.2.3
|
|
|
323 |
version: 11.0.5
|
324 |
unocss:
|
325 |
specifier: ^0.61.9
|
326 |
+
version: 0.61.9(postcss@8.5.1)([email protected])([email protected](@types/[email protected].10)([email protected]))
|
327 |
vite:
|
328 |
specifier: ^5.4.11
|
329 |
+
version: 5.4.11(@types/[email protected].10)([email protected])
|
330 |
vite-plugin-node-polyfills:
|
331 |
specifier: ^0.22.0
|
332 |
+
version: 0.22.0([email protected])([email protected](@types/[email protected].10)([email protected]))
|
333 |
vite-plugin-optimize-css-modules:
|
334 |
specifier: ^1.1.0
|
335 |
+
version: 1.1.0([email protected](@types/[email protected].10)([email protected]))
|
336 |
vite-tsconfig-paths:
|
337 |
specifier: ^4.3.2
|
338 |
+
version: 4.3.2([email protected])([email protected](@types/[email protected].10)([email protected]))
|
339 |
vitest:
|
340 |
specifier: ^2.1.7
|
341 |
+
version: 2.1.8(@types/[email protected].10)([email protected])
|
342 |
wrangler:
|
343 |
specifier: ^3.91.0
|
344 |
version: 3.91.0(@cloudflare/[email protected])
|
|
|
630 |
resolution: {integrity: sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==}
|
631 |
engines: {node: '>=6.9.0'}
|
632 |
|
633 |
+
'@babel/[email protected]':
|
634 |
+
resolution: {integrity: sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==}
|
635 |
+
engines: {node: '>=6.9.0'}
|
636 |
+
|
637 |
'@babel/[email protected]':
|
638 |
resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==}
|
639 |
engines: {node: '>=6.9.0'}
|
|
|
670 |
resolution: {integrity: sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==}
|
671 |
engines: {node: '>=6.9.0'}
|
672 |
|
673 |
+
'@babel/[email protected]':
|
674 |
+
resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==}
|
675 |
+
engines: {node: '>=6.9.0'}
|
676 |
+
|
677 |
'@babel/[email protected]':
|
678 |
resolution: {integrity: sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==}
|
679 |
engines: {node: '>=6.9.0'}
|
|
|
709 |
engines: {node: '>=6.0.0'}
|
710 |
hasBin: true
|
711 |
|
712 |
+
'@babel/[email protected]':
|
713 |
+
resolution: {integrity: sha512-SRJ4jYmXRqV1/Xc+TIVG84WjHBXKlxO9sHQnA2Pf12QQEAp1LOh6kDzNHXcUnbH1QI0FDoPPVOt+vyUDucxpaw==}
|
714 |
+
engines: {node: '>=6.0.0'}
|
715 |
+
hasBin: true
|
716 |
+
|
717 |
'@babel/[email protected]':
|
718 |
resolution: {integrity: sha512-ryzI0McXUPJnRCvMo4lumIKZUzhYUO/ScI+Mz4YVaTLt04DHNSjEUjKVvbzQjZFLuod/cYEc07mJWhzl6v4DPg==}
|
719 |
engines: {node: '>=6.9.0'}
|
|
|
762 |
resolution: {integrity: sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==}
|
763 |
engines: {node: '>=6.9.0'}
|
764 |
|
765 |
+
'@babel/[email protected]':
|
766 |
+
resolution: {integrity: sha512-rkOSPOw+AXbgtwUga3U4u8RpoK9FEFWBNAlTpcnkLFjL5CT+oyHNuUUC/xx6XefEJ16r38r8Bc/lfp6rYuHeJQ==}
|
767 |
+
engines: {node: '>=6.9.0'}
|
768 |
+
|
769 |
'@babel/[email protected]':
|
770 |
resolution: {integrity: sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==}
|
771 |
engines: {node: '>=6.9.0'}
|
772 |
|
773 |
+
'@babel/[email protected]':
|
774 |
+
resolution: {integrity: sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg==}
|
775 |
+
engines: {node: '>=6.9.0'}
|
776 |
+
|
777 |
'@blitz/[email protected]':
|
778 |
resolution: {integrity: sha512-mGEAFWCI5AQ4nrePhjp2WzvRen+UWR+SF4MvH70icIBClR08Gm3dT9MRa2jszOpfY00NyIYfm7/1CFZ37GvW4g==}
|
779 |
engines: {node: ^18.0.0 || ^20.0.0}
|
|
|
1658 |
resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==}
|
1659 |
engines: {node: '>=6.0.0'}
|
1660 |
|
1661 |
+
'@jridgewell/[email protected]':
|
1662 |
+
resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==}
|
1663 |
+
engines: {node: '>=6.0.0'}
|
1664 |
+
|
1665 |
'@jridgewell/[email protected]':
|
1666 |
resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
|
1667 |
engines: {node: '>=6.0.0'}
|
|
|
1869 |
resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==}
|
1870 |
engines: {node: '>=8.0.0'}
|
1871 |
|
1872 |
+
'@phosphor-icons/[email protected]':
|
1873 |
+
resolution: {integrity: sha512-g2e2eVAn1XG2a+LI09QU3IORLhnFNAFkNbo2iwbX6NOKSLOwvEMmTa7CgOzEbgNWR47z8i8kwjdvYZ5fkGx1mQ==}
|
1874 |
+
engines: {node: '>=10'}
|
1875 |
+
peerDependencies:
|
1876 |
+
react: '>= 16.8'
|
1877 |
+
react-dom: '>= 16.8'
|
1878 |
+
|
1879 |
'@pkgjs/[email protected]':
|
1880 |
resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
|
1881 |
engines: {node: '>=14'}
|
|
|
2283 |
peerDependencies:
|
2284 |
react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
|
2285 |
|
2286 |
+
'@remix-run/[email protected].2':
|
2287 |
+
resolution: {integrity: sha512-gjq20Hs3tWwhhrIXu18hSXDyjWiJXopZUQVbT35uULy/ACEnEbhO1DnVGJzov7NdeMHI4x0O4O0rWg6ZXLtD/Q==}
|
2288 |
engines: {node: '>=18.0.0'}
|
2289 |
peerDependencies:
|
2290 |
'@cloudflare/workers-types': ^4.0.0
|
|
|
2293 |
typescript:
|
2294 |
optional: true
|
2295 |
|
2296 |
+
'@remix-run/[email protected].2':
|
2297 |
+
resolution: {integrity: sha512-6D/WTx3IbQYCWQ/BVNRItXI2upgDvkcCVYwZhvIctF4o+5+IaF21ZA1HTekQEnBfmYTpffJ3Jko1sCkqoMeOdw==}
|
2298 |
engines: {node: '>=18.0.0'}
|
2299 |
peerDependencies:
|
2300 |
'@cloudflare/workers-types': ^4.0.0
|
|
|
2303 |
typescript:
|
2304 |
optional: true
|
2305 |
|
2306 |
+
'@remix-run/[email protected].2':
|
2307 |
+
resolution: {integrity: sha512-o8lix8t4GBhtXjo/G1IzwtHVW5GRMs7amtFtBHiR1bhSyK7VyX5qGtTDmJyny5QDv83pxaLOCiE0dUng2BCoyQ==}
|
2308 |
engines: {node: '>=18.0.0'}
|
2309 |
hasBin: true
|
2310 |
peerDependencies:
|
2311 |
+
'@remix-run/react': ^2.15.2
|
2312 |
+
'@remix-run/serve': ^2.15.2
|
2313 |
typescript: ^5.1.0
|
2314 |
vite: ^5.1.0
|
2315 |
wrangler: ^3.28.2
|
|
|
2323 |
wrangler:
|
2324 |
optional: true
|
2325 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2326 |
'@remix-run/[email protected]':
|
2327 |
resolution: {integrity: sha512-NS/h5uxje7DYCNgcKqKAiUhf0r2HVnoYUBWLyIIMmCUP1ddWurBP6xTPcWzGhEvV/EvguniYi1wJZ5+X8sonWw==}
|
2328 |
engines: {node: '>=18.0.0'}
|
|
|
2332 |
typescript:
|
2333 |
optional: true
|
2334 |
|
2335 |
+
'@remix-run/[email protected].2':
|
2336 |
+
resolution: {integrity: sha512-NAAMsSgoC/sdOgovUewwRCE/RUm3F+MBxxZKfwu3POCNeHaplY5qGkH/y8PUXvdN1EBG7Z0Ko43dyzCfcEy5PA==}
|
2337 |
engines: {node: '>=18.0.0'}
|
2338 |
peerDependencies:
|
2339 |
react: ^18.0.0
|
|
|
2347 |
resolution: {integrity: sha512-xfSkCAchbdG5PnbrKqFWwia4Bi61nH+wm8wLEqfHDyp7Y3dZzgqS2itV8i4gAq9pC2HsTpwyBC6Ds8VHZ96JlA==}
|
2348 |
engines: {node: '>=14.0.0'}
|
2349 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2350 |
'@remix-run/[email protected]':
|
2351 |
resolution: {integrity: sha512-OqiPcvEnnU88B8b1LIWHHkQ3Tz2GDAmQ1RihFNQsbrFKpDsQLkw0lJlnfgKA/uHd0CEEacpfV7C9qqJT3V6Z2g==}
|
2352 |
engines: {node: '>=18.0.0'}
|
|
|
2759 |
'@types/[email protected]':
|
2760 |
resolution: {integrity: sha512-qKgsUwfHZV2WCWLAnVP1JqnpE6Im6h3Y0+fYgMTasNQ7V++CBX5OT1as0g0f+OyubbFqhf6XVNIsmN4IIhEgGQ==}
|
2761 |
|
2762 |
+
'@types/[email protected]':
|
2763 |
+
resolution: {integrity: sha512-X47y/mPNzxviAGY5TcYPtYL8JsY3kAq2n8fMmKoRCxq/c4v4pyGNCzM2R6+M5/umG4ZfHuT+sgqDYqWc9rJ6ww==}
|
2764 |
+
|
2765 |
'@types/[email protected]':
|
2766 |
resolution: {integrity: sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==}
|
2767 |
|
|
|
2941 |
peerDependencies:
|
2942 |
vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0
|
2943 |
|
2944 |
+
'@vanilla-extract/babel-plugin-debug-ids@1.2.0':
|
2945 |
+
resolution: {integrity: sha512-z5nx2QBnOhvmlmBKeRX5sPVLz437wV30u+GJL+Hzj1rGiJYVNvgIIlzUpRNjVQ0MgAgiQIqIUbqPnmMc6HmDlQ==}
|
2946 |
|
2947 |
+
'@vanilla-extract/css@1.17.0':
|
2948 |
+
resolution: {integrity: sha512-W6FqVFDD+C71ZlKsuj0MxOXSvHb1tvQ9h/+79aYfi097wLsALrnnBzd0by8C///iurrpQ3S+SH74lXd7Lr9MvA==}
|
2949 |
|
2950 |
'@vanilla-extract/[email protected]':
|
2951 |
resolution: {integrity: sha512-E2YcfO8vA+vs+ua+gpvy1HRqvgWbI+MTlUpxA8FvatOvybuNcWAY0CKwQ/Gpj7rswYKtC6C7+xw33emM6/ImdQ==}
|
|
|
3222 |
resolution: {integrity: sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==}
|
3223 |
engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
|
3224 |
|
3225 | |
3226 |
+
resolution: {integrity: sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==}
|
3227 |
+
engines: {node: '>= 0.4'}
|
3228 |
+
|
3229 | |
3230 |
resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==}
|
3231 |
engines: {node: '>= 0.4'}
|
3232 |
|
3233 | |
3234 |
+
resolution: {integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==}
|
3235 |
+
engines: {node: '>= 0.4'}
|
3236 |
+
|
3237 | |
3238 |
resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
|
3239 |
engines: {node: '>=6'}
|
|
|
3482 |
supports-color:
|
3483 |
optional: true
|
3484 |
|
3485 | |
3486 |
+
resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==}
|
3487 |
+
engines: {node: '>=6.0'}
|
3488 |
+
peerDependencies:
|
3489 |
+
supports-color: '*'
|
3490 |
+
peerDependenciesMeta:
|
3491 |
+
supports-color:
|
3492 |
+
optional: true
|
3493 |
+
|
3494 | |
3495 |
resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==}
|
3496 |
|
|
|
3586 |
resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==}
|
3587 |
engines: {node: '>=12'}
|
3588 |
|
3589 | |
3590 |
+
resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==}
|
3591 |
+
engines: {node: '>= 0.4'}
|
3592 |
+
|
3593 | |
3594 |
resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==}
|
3595 |
|
|
|
3643 |
resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==}
|
3644 |
engines: {node: '>= 0.4'}
|
3645 |
|
3646 | |
3647 |
+
resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==}
|
3648 |
+
engines: {node: '>= 0.4'}
|
3649 |
+
|
3650 | |
3651 |
resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
|
3652 |
engines: {node: '>= 0.4'}
|
|
|
3654 | |
3655 |
resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==}
|
3656 |
|
3657 | |
3658 |
+
resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==}
|
3659 |
+
|
3660 | |
3661 |
+
resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==}
|
3662 |
+
engines: {node: '>= 0.4'}
|
3663 |
+
|
3664 | |
3665 |
resolution: {integrity: sha512-bRB4qbgUDWrdY1eMk123KiaCSW9VzQ+QLZrmU7D//cCFkmksPd9mUMpmWoFK/rxjIeTfTSOpKCoGoimlvI+AWw==}
|
3666 |
engines: {node: '>=14.0.0'}
|
|
|
3864 |
resolution: {integrity: sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==}
|
3865 |
engines: {node: '>=12.0.0'}
|
3866 |
|
3867 |
+
[email protected].2:
|
3868 |
+
resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==}
|
3869 |
engines: {node: '>= 0.10.0'}
|
3870 |
|
3871 | |
|
|
3998 |
resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==}
|
3999 |
engines: {node: '>= 0.4'}
|
4000 |
|
4001 | |
4002 |
+
resolution: {integrity: sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==}
|
4003 |
+
engines: {node: '>= 0.4'}
|
4004 |
+
|
4005 | |
4006 |
resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==}
|
4007 |
engines: {node: '>=6'}
|
|
|
4010 |
resolution: {integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==}
|
4011 |
engines: {node: '>=8'}
|
4012 |
|
4013 | |
4014 |
+
resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==}
|
4015 |
+
engines: {node: '>= 0.4'}
|
4016 |
+
|
4017 | |
4018 |
resolution: {integrity: sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w==}
|
4019 |
|
|
|
4058 |
resolution: {integrity: sha512-FQoVQnqcdk4hVM4JN1eromaun4iuS34oStkdlLENLdpULsuQcTyXj8w7ayhuUfPwEYZ1ZOooOTT6fdA9Vmx/RA==}
|
4059 |
engines: {node: '>= 0.4'}
|
4060 |
|
4061 | |
4062 |
+
resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==}
|
4063 |
+
engines: {node: '>= 0.4'}
|
4064 |
+
|
4065 | |
4066 |
resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
|
4067 |
|
|
|
4262 |
resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==}
|
4263 |
engines: {node: '>= 0.4'}
|
4264 |
|
4265 | |
4266 |
+
resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==}
|
4267 |
+
engines: {node: '>= 0.4'}
|
4268 |
+
|
4269 | |
4270 |
resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==}
|
4271 |
|
|
|
4362 | |
4363 |
resolution: {integrity: sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg==}
|
4364 |
|
4365 |
+
[email protected].7:
|
4366 |
+
resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==}
|
4367 |
hasBin: true
|
4368 |
|
4369 | |
|
|
4442 | |
4443 |
resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==}
|
4444 |
|
4445 |
+
[email protected].3:
|
4446 |
+
resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==}
|
4447 |
engines: {node: '>=14'}
|
4448 |
|
4449 | |
|
|
4511 | |
4512 |
resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==}
|
4513 |
|
4514 | |
4515 |
+
resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==}
|
4516 |
+
engines: {node: '>= 0.4'}
|
4517 |
+
|
4518 | |
4519 |
resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==}
|
4520 |
|
|
|
4893 | |
4894 |
resolution: {integrity: sha512-xUsx5n/mN0uQf4V548PKQ+YShA4/IW0KI1dZhrNrPCLG+xizETbHTkOa1f8/xut9JRPp8kQuMnz0oqwkTiLo/A==}
|
4895 |
|
4896 | |
4897 |
+
resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==}
|
4898 |
+
|
4899 | |
4900 |
resolution: {integrity: sha512-sEKPVl2rM+MNVkGQt3ChdmD8YsigmXdn5NifZn6jiwn9LRJpWm8F3guhaqrJT/JOat6pwpbXEk6kv+b9DMIjsQ==}
|
4901 |
|
|
|
5107 | |
5108 |
resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==}
|
5109 |
|
5110 | |
5111 |
+
resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==}
|
5112 |
+
|
5113 | |
5114 |
resolution: {integrity: sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==}
|
5115 |
engines: {node: '>=6'}
|
|
|
5142 |
resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==}
|
5143 |
engines: {node: '>=16 || 14 >=14.18'}
|
5144 |
|
5145 |
+
[email protected].12:
|
5146 |
+
resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==}
|
5147 |
|
5148 | |
5149 |
resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==}
|
|
|
5151 | |
5152 |
resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==}
|
5153 |
|
5154 | |
5155 |
+
resolution: {integrity: sha512-15Ztpk+nov8DR524R4BF7uEuzESgzUEAV4Ah7CUMNGXdE5ELuvxElxGXndBl32vMSsWa1jpNf22Z+Er3sKwq+w==}
|
5156 |
+
|
5157 | |
5158 |
resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==}
|
5159 |
engines: {node: '>= 14.16'}
|
|
|
5198 | |
5199 |
resolution: {integrity: sha512-sQoqa8alT3nHjGuTjuKgOnvjo4cljkufdtLMnO2LBP/wRwuDlo1tkaEdMxCRhyGRPacv/ztlZgDPm2b7FAmEvw==}
|
5200 |
|
5201 | |
5202 |
+
resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==}
|
5203 |
+
|
5204 | |
5205 |
resolution: {integrity: sha512-yBgLP75OS8oCyUI0cXiWtVKXQKbLrfGfp4JUJwQD6i8n1OHUagig9WyJtj3I6/0+5TMm2nICc3lOYgD88NGEqw==}
|
5206 |
engines: {node: '>=18.12'}
|
|
|
5234 |
peerDependencies:
|
5235 |
postcss: ^8.1.0
|
5236 |
|
5237 |
+
postcss-modules-local-by-default@4.2.0:
|
5238 |
+
resolution: {integrity: sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==}
|
5239 |
engines: {node: ^10 || ^12 || >= 14}
|
5240 |
peerDependencies:
|
5241 |
postcss: ^8.1.0
|
|
|
5272 |
resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==}
|
5273 |
engines: {node: ^10 || ^12 || >=14}
|
5274 |
|
5275 | |
5276 |
+
resolution: {integrity: sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==}
|
5277 |
+
engines: {node: ^10 || ^12 || >=14}
|
5278 |
+
|
5279 | |
5280 |
resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
|
5281 |
engines: {node: '>= 0.8.0'}
|
|
|
5458 |
react: ^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc
|
5459 |
react-dom: ^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc
|
5460 |
|
5461 |
+
[email protected].1:
|
5462 |
+
resolution: {integrity: sha512-YraE27C/RdjcZwl5UCqF/ffXnZDxpJdk9Q6jw38SZHjXs7NNdpViq2l2c7fO7+4uWaEfcwfGCv3RSg4e1By/fQ==}
|
5463 |
engines: {node: '>=14.0.0'}
|
5464 |
peerDependencies:
|
5465 |
react: '>=16.8'
|
5466 |
react-dom: '>=16.8'
|
5467 |
|
5468 |
+
[email protected].1:
|
5469 |
+
resolution: {integrity: sha512-2omQTA3rkMljmrvvo6WtewGdVh45SpL9hGiCI9uUrwGGfNFDIvGK4gYJsKlJoNVi6AQZcopSCballL+QGOm7fA==}
|
5470 |
engines: {node: '>=14.0.0'}
|
5471 |
peerDependencies:
|
5472 |
react: '>=16.8'
|
|
|
5847 | |
5848 |
resolution: {integrity: sha512-qIneep7QRwxRd5oiHb8jaRzH15V/S8F3saCXOdjwRLgozZJr5x2yeBhQtqkO3FSzQDwYEFAYuifg4oHjpDghrg==}
|
5849 |
|
5850 | |
5851 |
+
resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==}
|
5852 |
+
engines: {node: '>= 0.4'}
|
5853 |
+
|
5854 | |
5855 |
+
resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==}
|
5856 |
+
engines: {node: '>= 0.4'}
|
5857 |
+
|
5858 | |
5859 |
+
resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==}
|
5860 |
+
engines: {node: '>= 0.4'}
|
5861 |
+
|
5862 | |
5863 |
resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==}
|
5864 |
engines: {node: '>= 0.4'}
|
5865 |
|
5866 | |
5867 |
+
resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==}
|
5868 |
+
engines: {node: '>= 0.4'}
|
5869 |
+
|
5870 | |
5871 |
resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==}
|
5872 |
|
|
|
5921 | |
5922 |
resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==}
|
5923 |
|
5924 |
+
[email protected].21:
|
5925 |
+
resolution: {integrity: sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==}
|
5926 |
|
5927 | |
5928 |
resolution: {integrity: sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==}
|
|
|
6065 | |
6066 |
resolution: {integrity: sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA==}
|
6067 |
|
6068 |
+
[email protected].2:
|
6069 |
+
resolution: {integrity: sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA==}
|
6070 |
|
6071 | |
6072 |
resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==}
|
|
|
6574 | |
6575 |
resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
|
6576 |
|
6577 |
+
yaml@2.7.0:
|
6578 |
+
resolution: {integrity: sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==}
|
6579 |
engines: {node: '>= 14'}
|
6580 |
hasBin: true
|
6581 |
|
|
|
7184 |
'@jridgewell/trace-mapping': 0.3.25
|
7185 |
jsesc: 3.0.2
|
7186 |
|
7187 |
+
'@babel/[email protected]':
|
7188 |
+
dependencies:
|
7189 |
+
'@babel/parser': 7.26.5
|
7190 |
+
'@babel/types': 7.26.5
|
7191 |
+
'@jridgewell/gen-mapping': 0.3.8
|
7192 |
+
'@jridgewell/trace-mapping': 0.3.25
|
7193 |
+
jsesc: 3.0.2
|
7194 |
+
|
7195 |
'@babel/[email protected]':
|
7196 |
dependencies:
|
7197 |
'@babel/types': 7.26.0
|
|
|
7246 |
|
7247 |
'@babel/[email protected]': {}
|
7248 |
|
7249 |
+
'@babel/[email protected]': {}
|
7250 |
+
|
7251 |
'@babel/[email protected](@babel/[email protected])':
|
7252 |
dependencies:
|
7253 |
'@babel/core': 7.26.0
|
|
|
7286 |
dependencies:
|
7287 |
'@babel/types': 7.26.0
|
7288 |
|
7289 |
+
'@babel/[email protected]':
|
7290 |
+
dependencies:
|
7291 |
+
'@babel/types': 7.26.5
|
7292 |
+
|
7293 |
'@babel/[email protected](@babel/[email protected])':
|
7294 |
dependencies:
|
7295 |
'@babel/core': 7.26.0
|
7296 |
+
'@babel/helper-plugin-utils': 7.26.5
|
7297 |
|
7298 |
'@babel/[email protected](@babel/[email protected])':
|
7299 |
dependencies:
|
|
|
7358 |
transitivePeerDependencies:
|
7359 |
- supports-color
|
7360 |
|
7361 |
+
'@babel/[email protected]':
|
7362 |
+
dependencies:
|
7363 |
+
'@babel/code-frame': 7.26.2
|
7364 |
+
'@babel/generator': 7.26.5
|
7365 |
+
'@babel/parser': 7.26.5
|
7366 |
+
'@babel/template': 7.25.9
|
7367 |
+
'@babel/types': 7.26.5
|
7368 |
+
debug: 4.4.0
|
7369 |
+
globals: 11.12.0
|
7370 |
+
transitivePeerDependencies:
|
7371 |
+
- supports-color
|
7372 |
+
|
7373 |
'@babel/[email protected]':
|
7374 |
dependencies:
|
7375 |
'@babel/helper-string-parser': 7.25.9
|
7376 |
'@babel/helper-validator-identifier': 7.25.9
|
7377 |
|
7378 |
+
'@babel/types@7.26.5':
|
7379 |
dependencies:
|
7380 |
+
'@babel/helper-string-parser': 7.25.9
|
7381 |
+
'@babel/helper-validator-identifier': 7.25.9
|
7382 |
+
|
7383 |
+
'@blitz/eslint-plugin@0.1.0(@types/eslint@8.56.10)([email protected].7)([email protected])([email protected])':
|
7384 |
+
dependencies:
|
7385 |
+
'@stylistic/eslint-plugin-ts': 2.11.0([email protected]([email protected]))([email protected])
|
7386 |
+
'@typescript-eslint/eslint-plugin': 8.17.0(@typescript-eslint/[email protected]([email protected]([email protected]))([email protected]))([email protected]([email protected]))([email protected])
|
7387 |
+
'@typescript-eslint/parser': 8.17.0([email protected]([email protected]))([email protected])
|
7388 |
+
'@typescript-eslint/utils': 8.17.0([email protected]([email protected]))([email protected])
|
7389 |
common-tags: 1.8.2
|
7390 |
+
eslint: 9.16.0([email protected].7)
|
7391 |
+
eslint-config-prettier: 9.1.0([email protected]([email protected].7))
|
7392 |
+
eslint-plugin-jsonc: 2.18.2([email protected]([email protected].7))
|
7393 |
+
eslint-plugin-prettier: 5.2.1(@types/[email protected])([email protected]([email protected]([email protected].7)))([email protected]([email protected].7))([email protected])
|
7394 |
globals: 15.13.0
|
7395 |
+
typescript-eslint: 8.17.0([email protected]([email protected].7))([email protected])
|
7396 |
transitivePeerDependencies:
|
7397 |
- '@eslint/json'
|
7398 |
- '@types/eslint'
|
|
|
7858 |
'@esbuild/[email protected]':
|
7859 |
optional: true
|
7860 |
|
7861 |
+
'@eslint-community/[email protected]([email protected]([email protected].7))':
|
7862 |
dependencies:
|
7863 |
+
eslint: 9.16.0([email protected].7)
|
7864 |
eslint-visitor-keys: 3.4.3
|
7865 |
|
7866 |
'@eslint-community/[email protected]': {}
|
|
|
8058 |
'@jridgewell/sourcemap-codec': 1.5.0
|
8059 |
'@jridgewell/trace-mapping': 0.3.25
|
8060 |
|
8061 |
+
'@jridgewell/[email protected]':
|
8062 |
+
dependencies:
|
8063 |
+
'@jridgewell/set-array': 1.2.1
|
8064 |
+
'@jridgewell/sourcemap-codec': 1.5.0
|
8065 |
+
'@jridgewell/trace-mapping': 0.3.25
|
8066 |
+
|
8067 |
'@jridgewell/[email protected]': {}
|
8068 |
|
8069 |
'@jridgewell/[email protected]': {}
|
|
|
8308 |
|
8309 |
'@opentelemetry/[email protected]': {}
|
8310 |
|
8311 |
+
'@phosphor-icons/[email protected]([email protected]([email protected]))([email protected])':
|
8312 |
+
dependencies:
|
8313 |
+
react: 18.3.1
|
8314 |
+
react-dom: 18.3.1([email protected])
|
8315 |
+
|
8316 |
'@pkgjs/[email protected]':
|
8317 |
optional: true
|
8318 |
|
|
|
8702 |
dependencies:
|
8703 |
react: 18.3.1
|
8704 |
|
8705 |
+
'@remix-run/[email protected].2(@cloudflare/[email protected])([email protected])':
|
8706 |
dependencies:
|
8707 |
'@cloudflare/workers-types': 4.20241127.0
|
8708 |
+
'@remix-run/cloudflare': 2.15.2(@cloudflare/[email protected])([email protected])
|
8709 |
optionalDependencies:
|
8710 |
typescript: 5.7.2
|
8711 |
|
8712 |
+
'@remix-run/[email protected].2(@cloudflare/[email protected])([email protected])':
|
8713 |
dependencies:
|
8714 |
'@cloudflare/kv-asset-handler': 0.1.3
|
8715 |
'@cloudflare/workers-types': 4.20241127.0
|
8716 |
+
'@remix-run/server-runtime': 2.15.2([email protected])
|
8717 |
optionalDependencies:
|
8718 |
typescript: 5.7.2
|
8719 |
|
8720 |
+
'@remix-run/[email protected].2(@remix-run/[email protected].2([email protected]([email protected]))([email protected])([email protected]))(@types/[email protected].10)([email protected])([email protected])([email protected](@types/[email protected].10)([email protected]))([email protected](@cloudflare/[email protected]))':
|
8721 |
dependencies:
|
8722 |
'@babel/core': 7.26.0
|
8723 |
+
'@babel/generator': 7.26.5
|
8724 |
+
'@babel/parser': 7.26.5
|
8725 |
'@babel/plugin-syntax-decorators': 7.25.9(@babel/[email protected])
|
8726 |
'@babel/plugin-syntax-jsx': 7.25.9(@babel/[email protected])
|
8727 |
'@babel/preset-typescript': 7.26.0(@babel/[email protected])
|
8728 |
+
'@babel/traverse': 7.26.5
|
8729 |
+
'@babel/types': 7.26.5
|
8730 |
'@mdx-js/mdx': 2.3.0
|
8731 |
'@npmcli/package-json': 4.0.1
|
8732 |
+
'@remix-run/node': 2.15.2([email protected])
|
8733 |
+
'@remix-run/react': 2.15.2([email protected]([email protected]))([email protected])([email protected])
|
8734 |
'@remix-run/router': 1.21.0
|
8735 |
+
'@remix-run/server-runtime': 2.15.2([email protected])
|
8736 |
'@types/mdx': 2.0.13
|
8737 |
+
'@vanilla-extract/integration': 6.5.0(@types/[email protected].10)([email protected])
|
8738 |
arg: 5.0.2
|
8739 |
cacache: 17.1.4
|
8740 |
chalk: 4.1.2
|
8741 |
chokidar: 3.6.0
|
8742 |
cross-spawn: 7.0.6
|
8743 |
dotenv: 16.4.7
|
8744 |
+
es-module-lexer: 1.6.0
|
8745 |
esbuild: 0.17.6
|
8746 |
esbuild-plugins-node-modules-polyfill: 1.6.8([email protected])
|
8747 |
execa: 5.1.1
|
8748 |
exit-hook: 2.2.1
|
8749 |
+
express: 4.21.2
|
8750 |
fs-extra: 10.1.0
|
8751 |
get-port: 5.1.1
|
8752 |
gunzip-maybe: 1.4.2
|
|
|
8759 |
picocolors: 1.1.1
|
8760 |
picomatch: 2.3.1
|
8761 |
pidtree: 0.6.0
|
8762 |
+
postcss: 8.5.1
|
8763 |
+
postcss-discard-duplicates: 5.1.0(postcss@8.5.1)
|
8764 |
+
postcss-load-config: 4.0.2(postcss@8.5.1)
|
8765 |
+
postcss-modules: 6.0.1(postcss@8.5.1)
|
8766 |
prettier: 2.8.8
|
8767 |
pretty-ms: 7.0.1
|
8768 |
react-refresh: 0.14.2
|
|
|
8770 |
remark-mdx-frontmatter: 1.1.1
|
8771 |
semver: 7.6.3
|
8772 |
set-cookie-parser: 2.7.1
|
8773 |
+
tar-fs: 2.1.2
|
8774 |
tsconfig-paths: 4.2.0
|
8775 |
valibot: 0.41.0([email protected])
|
8776 |
+
vite-node: 1.6.0(@types/[email protected].10)([email protected])
|
8777 |
ws: 7.5.10
|
8778 |
optionalDependencies:
|
8779 |
typescript: 5.7.2
|
8780 |
+
vite: 5.4.11(@types/[email protected].10)([email protected])
|
8781 |
wrangler: 3.91.0(@cloudflare/[email protected])
|
8782 |
transitivePeerDependencies:
|
8783 |
- '@types/node'
|
|
|
8795 |
- ts-node
|
8796 |
- utf-8-validate
|
8797 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
8798 |
'@remix-run/[email protected]([email protected])':
|
8799 |
dependencies:
|
8800 |
'@remix-run/server-runtime': 2.15.2([email protected])
|
|
|
8807 |
optionalDependencies:
|
8808 |
typescript: 5.7.2
|
8809 |
|
8810 |
+
'@remix-run/[email protected].2([email protected]([email protected]))([email protected])([email protected])':
|
8811 |
dependencies:
|
8812 |
'@remix-run/router': 1.21.0
|
8813 |
+
'@remix-run/server-runtime': 2.15.2([email protected])
|
8814 |
react: 18.3.1
|
8815 |
react-dom: 18.3.1([email protected])
|
8816 |
+
react-router: 6.28.1([email protected])
|
8817 |
+
react-router-dom: 6.28.1([email protected]([email protected]))([email protected])
|
8818 |
turbo-stream: 2.4.0
|
8819 |
optionalDependencies:
|
8820 |
typescript: 5.7.2
|
8821 |
|
8822 |
'@remix-run/[email protected]': {}
|
8823 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
8824 |
'@remix-run/[email protected]([email protected])':
|
8825 |
dependencies:
|
8826 |
'@remix-run/router': 1.21.0
|
|
|
9255 |
'@smithy/util-buffer-from': 3.0.0
|
9256 |
tslib: 2.8.1
|
9257 |
|
9258 |
+
'@stylistic/[email protected]([email protected]([email protected].7))([email protected])':
|
9259 |
dependencies:
|
9260 |
+
'@typescript-eslint/utils': 8.17.0([email protected]([email protected].7))([email protected])
|
9261 |
+
eslint: 9.16.0([email protected].7)
|
9262 |
eslint-visitor-keys: 4.2.0
|
9263 |
espree: 10.3.0
|
9264 |
transitivePeerDependencies:
|
|
|
9341 |
dependencies:
|
9342 |
undici-types: 6.20.0
|
9343 |
|
9344 |
+
'@types/[email protected]':
|
9345 |
+
dependencies:
|
9346 |
+
undici-types: 6.20.0
|
9347 |
+
|
9348 |
'@types/[email protected]': {}
|
9349 |
|
9350 |
'@types/[email protected]':
|
|
|
9362 |
|
9363 |
'@types/[email protected]': {}
|
9364 |
|
9365 |
+
'@typescript-eslint/[email protected](@typescript-eslint/[email protected]([email protected]([email protected].7))([email protected]))([email protected]([email protected].7))([email protected])':
|
9366 |
dependencies:
|
9367 |
'@eslint-community/regexpp': 4.12.1
|
9368 |
+
'@typescript-eslint/parser': 8.17.0([email protected]([email protected].7))([email protected])
|
9369 |
'@typescript-eslint/scope-manager': 8.17.0
|
9370 |
+
'@typescript-eslint/type-utils': 8.17.0([email protected]([email protected].7))([email protected])
|
9371 |
+
'@typescript-eslint/utils': 8.17.0([email protected]([email protected].7))([email protected])
|
9372 |
'@typescript-eslint/visitor-keys': 8.17.0
|
9373 |
+
eslint: 9.16.0([email protected].7)
|
9374 |
graphemer: 1.4.0
|
9375 |
ignore: 5.3.2
|
9376 |
natural-compare: 1.4.0
|
|
|
9380 |
transitivePeerDependencies:
|
9381 |
- supports-color
|
9382 |
|
9383 |
+
'@typescript-eslint/[email protected]([email protected]([email protected].7))([email protected])':
|
9384 |
dependencies:
|
9385 |
'@typescript-eslint/scope-manager': 8.17.0
|
9386 |
'@typescript-eslint/types': 8.17.0
|
9387 |
'@typescript-eslint/typescript-estree': 8.17.0([email protected])
|
9388 |
'@typescript-eslint/visitor-keys': 8.17.0
|
9389 |
debug: 4.3.7
|
9390 |
+
eslint: 9.16.0([email protected].7)
|
9391 |
optionalDependencies:
|
9392 |
typescript: 5.7.2
|
9393 |
transitivePeerDependencies:
|
|
|
9398 |
'@typescript-eslint/types': 8.17.0
|
9399 |
'@typescript-eslint/visitor-keys': 8.17.0
|
9400 |
|
9401 |
+
'@typescript-eslint/[email protected]([email protected]([email protected].7))([email protected])':
|
9402 |
dependencies:
|
9403 |
'@typescript-eslint/typescript-estree': 8.17.0([email protected])
|
9404 |
+
'@typescript-eslint/utils': 8.17.0([email protected]([email protected].7))([email protected])
|
9405 |
debug: 4.3.7
|
9406 |
+
eslint: 9.16.0([email protected].7)
|
9407 |
ts-api-utils: 1.4.3([email protected])
|
9408 |
optionalDependencies:
|
9409 |
typescript: 5.7.2
|
|
|
9427 |
transitivePeerDependencies:
|
9428 |
- supports-color
|
9429 |
|
9430 |
+
'@typescript-eslint/[email protected]([email protected]([email protected].7))([email protected])':
|
9431 |
dependencies:
|
9432 |
+
'@eslint-community/eslint-utils': 4.4.1([email protected]([email protected].7))
|
9433 |
'@typescript-eslint/scope-manager': 8.17.0
|
9434 |
'@typescript-eslint/types': 8.17.0
|
9435 |
'@typescript-eslint/typescript-estree': 8.17.0([email protected])
|
9436 |
+
eslint: 9.16.0([email protected].7)
|
9437 |
optionalDependencies:
|
9438 |
typescript: 5.7.2
|
9439 |
transitivePeerDependencies:
|
|
|
9460 |
|
9461 |
'@ungap/[email protected]': {}
|
9462 |
|
9463 |
+
'@unocss/[email protected]([email protected])([email protected](@types/[email protected].10)([email protected]))':
|
9464 |
dependencies:
|
9465 |
'@unocss/core': 0.61.9
|
9466 |
'@unocss/reset': 0.61.9
|
9467 |
+
'@unocss/vite': 0.61.9([email protected])([email protected](@types/[email protected].10)([email protected]))
|
9468 |
optionalDependencies:
|
9469 |
+
vite: 5.4.11(@types/[email protected].10)([email protected])
|
9470 |
transitivePeerDependencies:
|
9471 |
- rollup
|
9472 |
- supports-color
|
|
|
9510 |
gzip-size: 6.0.0
|
9511 |
sirv: 2.0.4
|
9512 |
|
9513 |
+
'@unocss/[email protected](postcss@8.5.1)':
|
9514 |
dependencies:
|
9515 |
'@unocss/config': 0.61.9
|
9516 |
'@unocss/core': 0.61.9
|
|
|
9518 |
css-tree: 2.3.1
|
9519 |
fast-glob: 3.3.2
|
9520 |
magic-string: 0.30.14
|
9521 |
+
postcss: 8.5.1
|
9522 |
transitivePeerDependencies:
|
9523 |
- supports-color
|
9524 |
|
|
|
9603 |
dependencies:
|
9604 |
'@unocss/core': 0.61.9
|
9605 |
|
9606 |
+
'@unocss/[email protected]([email protected])([email protected](@types/[email protected].10)([email protected]))':
|
9607 |
dependencies:
|
9608 |
'@ampproject/remapping': 2.3.0
|
9609 |
'@rollup/pluginutils': 5.1.3([email protected])
|
|
|
9615 |
chokidar: 3.6.0
|
9616 |
fast-glob: 3.3.2
|
9617 |
magic-string: 0.30.14
|
9618 |
+
vite: 5.4.11(@types/[email protected].10)([email protected])
|
9619 |
transitivePeerDependencies:
|
9620 |
- rollup
|
9621 |
- supports-color
|
9622 |
|
9623 |
+
'@vanilla-extract/babel-plugin-debug-ids@1.2.0':
|
9624 |
dependencies:
|
9625 |
'@babel/core': 7.26.0
|
9626 |
transitivePeerDependencies:
|
9627 |
- supports-color
|
9628 |
|
9629 |
+
'@vanilla-extract/css@1.17.0':
|
9630 |
dependencies:
|
9631 |
'@emotion/hash': 0.9.2
|
9632 |
'@vanilla-extract/private': 1.0.6
|
|
|
9643 |
transitivePeerDependencies:
|
9644 |
- babel-plugin-macros
|
9645 |
|
9646 |
+
'@vanilla-extract/[email protected](@types/[email protected].10)([email protected])':
|
9647 |
dependencies:
|
9648 |
'@babel/core': 7.26.0
|
9649 |
'@babel/plugin-syntax-typescript': 7.25.9(@babel/[email protected])
|
9650 |
+
'@vanilla-extract/babel-plugin-debug-ids': 1.2.0
|
9651 |
+
'@vanilla-extract/css': 1.17.0
|
9652 |
+
esbuild: 0.17.6
|
9653 |
eval: 0.1.8
|
9654 |
find-up: 5.0.0
|
9655 |
javascript-stringify: 2.1.0
|
9656 |
lodash: 4.17.21
|
9657 |
+
mlly: 1.7.4
|
9658 |
outdent: 0.8.0
|
9659 |
+
vite: 5.4.11(@types/[email protected].10)([email protected])
|
9660 |
+
vite-node: 1.6.0(@types/[email protected].10)([email protected])
|
9661 |
transitivePeerDependencies:
|
9662 |
- '@types/node'
|
9663 |
- babel-plugin-macros
|
|
|
9679 |
chai: 5.1.2
|
9680 |
tinyrainbow: 1.2.0
|
9681 |
|
9682 |
+
'@vitest/[email protected]([email protected](@types/[email protected].10)([email protected]))':
|
9683 |
dependencies:
|
9684 |
'@vitest/spy': 2.1.8
|
9685 |
estree-walker: 3.0.3
|
9686 |
magic-string: 0.30.14
|
9687 |
optionalDependencies:
|
9688 |
+
vite: 5.4.11(@types/[email protected].10)([email protected])
|
9689 |
|
9690 |
'@vitest/[email protected]':
|
9691 |
dependencies:
|
|
|
9987 |
tar: 6.2.1
|
9988 |
unique-filename: 3.0.0
|
9989 |
|
9990 | |
9991 |
+
dependencies:
|
9992 |
+
es-errors: 1.3.0
|
9993 |
+
function-bind: 1.1.2
|
9994 |
+
|
9995 | |
9996 |
dependencies:
|
9997 |
es-define-property: 1.0.0
|
|
|
10000 |
get-intrinsic: 1.2.4
|
10001 |
set-function-length: 1.2.2
|
10002 |
|
10003 | |
10004 |
+
dependencies:
|
10005 |
+
call-bind-apply-helpers: 1.0.1
|
10006 |
+
get-intrinsic: 1.2.7
|
10007 |
+
|
10008 | |
10009 |
|
10010 | |
|
|
10224 |
dependencies:
|
10225 |
ms: 2.1.3
|
10226 |
|
10227 | |
10228 |
+
dependencies:
|
10229 |
+
ms: 2.1.3
|
10230 |
+
|
10231 | |
10232 |
dependencies:
|
10233 |
character-entities: 2.0.2
|
|
|
10308 |
|
10309 | |
10310 |
|
10311 | |
10312 |
+
dependencies:
|
10313 |
+
call-bind-apply-helpers: 1.0.1
|
10314 |
+
es-errors: 1.3.0
|
10315 |
+
gopd: 1.2.0
|
10316 |
+
|
10317 | |
10318 |
|
10319 | |
|
|
10365 |
dependencies:
|
10366 |
get-intrinsic: 1.2.4
|
10367 |
|
10368 |
+
[email protected]: {}
|
10369 |
+
|
10370 | |
10371 |
|
10372 | |
10373 |
|
10374 |
+
[email protected]: {}
|
10375 |
+
|
10376 | |
10377 |
+
dependencies:
|
10378 |
+
es-errors: 1.3.0
|
10379 |
+
|
10380 | |
10381 |
dependencies:
|
10382 |
'@jspm/core': 2.0.1
|
|
|
10495 |
|
10496 | |
10497 |
|
10498 | |
10499 |
dependencies:
|
10500 |
+
eslint: 9.16.0([email protected].7)
|
10501 |
semver: 7.6.3
|
10502 |
|
10503 | |
10504 |
dependencies:
|
10505 |
+
eslint: 9.16.0([email protected].7)
|
10506 |
|
10507 | |
10508 |
dependencies:
|
10509 |
+
eslint: 9.16.0([email protected].7)
|
10510 |
esquery: 1.6.0
|
10511 |
jsonc-eslint-parser: 2.4.0
|
10512 |
|
10513 | |
10514 |
dependencies:
|
10515 |
+
'@eslint-community/eslint-utils': 4.4.1([email protected]([email protected].7))
|
10516 |
+
eslint: 9.16.0([email protected].7)
|
10517 |
+
eslint-compat-utils: 0.6.4([email protected]([email protected].7))
|
10518 |
+
eslint-json-compat-utils: 0.2.1([email protected]([email protected].7))([email protected])
|
10519 |
espree: 9.6.1
|
10520 |
graphemer: 1.4.0
|
10521 |
jsonc-eslint-parser: 2.4.0
|
|
|
10524 |
transitivePeerDependencies:
|
10525 |
- '@eslint/json'
|
10526 |
|
10527 | |
10528 |
dependencies:
|
10529 |
+
eslint: 9.16.0([email protected].7)
|
10530 |
prettier: 3.4.1
|
10531 |
prettier-linter-helpers: 1.0.0
|
10532 |
synckit: 0.9.2
|
10533 |
optionalDependencies:
|
10534 |
'@types/eslint': 8.56.10
|
10535 |
+
eslint-config-prettier: 9.1.0([email protected]([email protected].7))
|
10536 |
|
10537 | |
10538 |
dependencies:
|
|
|
10543 |
|
10544 | |
10545 |
|
10546 | |
10547 |
dependencies:
|
10548 |
+
'@eslint-community/eslint-utils': 4.4.1([email protected]([email protected].7))
|
10549 |
'@eslint-community/regexpp': 4.12.1
|
10550 |
'@eslint/config-array': 0.19.0
|
10551 |
'@eslint/core': 0.9.0
|
|
|
10580 |
natural-compare: 1.4.0
|
10581 |
optionator: 0.9.4
|
10582 |
optionalDependencies:
|
10583 |
+
jiti: 1.21.7
|
10584 |
transitivePeerDependencies:
|
10585 |
- supports-color
|
10586 |
|
|
|
10651 |
|
10652 | |
10653 |
dependencies:
|
10654 |
+
'@types/node': 22.10.10
|
10655 |
require-like: 0.1.2
|
10656 |
|
10657 | |
|
|
10683 |
|
10684 | |
10685 |
|
10686 |
+
[email protected].2:
|
10687 |
dependencies:
|
10688 |
accepts: 1.3.8
|
10689 |
array-flatten: 1.1.1
|
|
|
10704 |
methods: 1.1.2
|
10705 |
on-finished: 2.4.1
|
10706 |
parseurl: 1.3.3
|
10707 |
+
path-to-regexp: 0.1.12
|
10708 |
proxy-addr: 2.0.7
|
10709 |
qs: 6.13.0
|
10710 |
range-parser: 1.2.1
|
|
|
10849 |
has-symbols: 1.1.0
|
10850 |
hasown: 2.0.2
|
10851 |
|
10852 | |
10853 |
+
dependencies:
|
10854 |
+
call-bind-apply-helpers: 1.0.1
|
10855 |
+
es-define-property: 1.0.1
|
10856 |
+
es-errors: 1.3.0
|
10857 |
+
es-object-atoms: 1.1.1
|
10858 |
+
function-bind: 1.1.2
|
10859 |
+
get-proto: 1.0.1
|
10860 |
+
gopd: 1.2.0
|
10861 |
+
has-symbols: 1.1.0
|
10862 |
+
hasown: 2.0.2
|
10863 |
+
math-intrinsics: 1.1.0
|
10864 |
+
|
10865 | |
10866 |
|
10867 | |
10868 |
|
10869 | |
10870 |
+
dependencies:
|
10871 |
+
dunder-proto: 1.0.1
|
10872 |
+
es-object-atoms: 1.1.1
|
10873 |
+
|
10874 | |
10875 |
dependencies:
|
10876 |
data-uri-to-buffer: 2.0.2
|
|
|
10913 |
dependencies:
|
10914 |
get-intrinsic: 1.2.4
|
10915 |
|
10916 |
+
[email protected]: {}
|
10917 |
+
|
10918 | |
10919 |
|
10920 | |
|
|
11113 |
dependencies:
|
11114 |
safer-buffer: 2.1.2
|
11115 |
|
11116 |
+
[email protected](postcss@8.5.1):
|
11117 |
dependencies:
|
11118 |
+
postcss: 8.5.1
|
11119 |
|
11120 | |
11121 |
|
|
|
11138 |
debug: 4.3.7
|
11139 |
esbuild: 0.23.1
|
11140 |
jiti: 2.0.0-beta.3
|
11141 |
+
jiti-v1: [email protected].7
|
11142 |
pathe: 1.1.2
|
11143 |
tsx: 4.19.2
|
11144 |
transitivePeerDependencies:
|
|
|
11191 |
dependencies:
|
11192 |
hasown: 2.0.2
|
11193 |
|
11194 | |
11195 |
+
dependencies:
|
11196 |
+
hasown: 2.0.2
|
11197 |
+
|
11198 | |
11199 |
|
11200 | |
|
|
11279 |
|
11280 | |
11281 |
|
11282 |
+
[email protected].7: {}
|
11283 |
|
11284 | |
11285 |
|
|
|
11350 |
dependencies:
|
11351 |
immediate: 3.0.6
|
11352 |
|
11353 |
+
[email protected].3: {}
|
11354 |
|
11355 | |
11356 |
|
|
|
11406 |
|
11407 | |
11408 |
|
11409 |
+
[email protected]: {}
|
11410 |
+
|
11411 | |
11412 |
dependencies:
|
11413 |
hash-base: 3.0.5
|
|
|
11554 |
ccount: 2.0.1
|
11555 |
mdast-util-from-markdown: 1.3.1
|
11556 |
mdast-util-to-markdown: 1.5.0
|
11557 |
+
parse-entities: 4.0.2
|
11558 |
stringify-entities: 4.0.4
|
11559 |
unist-util-remove-position: 4.0.2
|
11560 |
unist-util-stringify-position: 3.0.3
|
|
|
12053 | |
12054 |
dependencies:
|
12055 |
'@types/debug': 4.1.12
|
12056 |
+
debug: 4.4.0
|
12057 |
decode-named-character-reference: 1.0.2
|
12058 |
micromark-core-commonmark: 1.1.0
|
12059 |
micromark-factory-space: 1.1.0
|
|
|
12193 |
pkg-types: 1.2.1
|
12194 |
ufo: 1.5.4
|
12195 |
|
12196 | |
12197 |
+
dependencies:
|
12198 |
+
acorn: 8.14.0
|
12199 |
+
pathe: 2.0.2
|
12200 |
+
pkg-types: 1.3.1
|
12201 |
+
ufo: 1.5.4
|
12202 |
+
|
12203 | |
12204 |
|
12205 | |
|
|
12297 | |
12298 |
dependencies:
|
12299 |
hosted-git-info: 6.1.3
|
12300 |
+
is-core-module: 2.16.1
|
12301 |
semver: 7.6.3
|
12302 |
validate-npm-package-license: 3.0.4
|
12303 |
|
|
|
12446 |
is-decimal: 2.0.1
|
12447 |
is-hexadecimal: 2.0.1
|
12448 |
|
12449 | |
12450 |
+
dependencies:
|
12451 |
+
'@types/unist': 2.0.11
|
12452 |
+
character-entities-legacy: 3.0.0
|
12453 |
+
character-reference-invalid: 2.0.1
|
12454 |
+
decode-named-character-reference: 1.0.2
|
12455 |
+
is-alphanumerical: 2.0.1
|
12456 |
+
is-decimal: 2.0.1
|
12457 |
+
is-hexadecimal: 2.0.1
|
12458 |
+
|
12459 | |
12460 |
|
12461 | |
|
|
12479 |
lru-cache: 10.4.3
|
12480 |
minipass: 7.1.2
|
12481 |
|
12482 |
+
[email protected].12: {}
|
12483 |
|
12484 | |
12485 |
|
12486 | |
12487 |
|
12488 |
+
[email protected]: {}
|
12489 |
+
|
12490 | |
12491 |
|
12492 | |
|
|
12531 |
mlly: 1.7.3
|
12532 |
pathe: 1.1.2
|
12533 |
|
12534 | |
12535 |
+
dependencies:
|
12536 |
+
confbox: 0.1.8
|
12537 |
+
mlly: 1.7.4
|
12538 |
+
pathe: 2.0.2
|
12539 |
+
|
12540 | |
12541 |
|
12542 | |
12543 |
|
12544 |
+
[email protected](postcss@8.5.1):
|
12545 |
dependencies:
|
12546 |
+
postcss: 8.5.1
|
12547 |
|
12548 |
+
[email protected](postcss@8.5.1):
|
12549 |
dependencies:
|
12550 |
+
lilconfig: 3.1.3
|
12551 |
+
yaml: 2.7.0
|
12552 |
optionalDependencies:
|
12553 |
+
postcss: 8.5.1
|
12554 |
|
12555 |
+
[email protected](postcss@8.5.1):
|
12556 |
dependencies:
|
12557 |
+
postcss: 8.5.1
|
12558 |
|
12559 |
+
postcss-modules-local-by-default@4.2.0(postcss@8.5.1):
|
12560 |
dependencies:
|
12561 |
+
icss-utils: 5.1.0(postcss@8.5.1)
|
12562 |
+
postcss: 8.5.1
|
12563 |
postcss-selector-parser: 7.0.0
|
12564 |
postcss-value-parser: 4.2.0
|
12565 |
|
12566 |
+
[email protected](postcss@8.5.1):
|
12567 |
dependencies:
|
12568 |
+
postcss: 8.5.1
|
12569 |
postcss-selector-parser: 7.0.0
|
12570 |
|
12571 |
+
[email protected](postcss@8.5.1):
|
12572 |
dependencies:
|
12573 |
+
icss-utils: 5.1.0(postcss@8.5.1)
|
12574 |
+
postcss: 8.5.1
|
12575 |
|
12576 |
+
[email protected](postcss@8.5.1):
|
12577 |
dependencies:
|
12578 |
generic-names: 4.0.0
|
12579 |
+
icss-utils: 5.1.0(postcss@8.5.1)
|
12580 |
lodash.camelcase: 4.3.0
|
12581 |
+
postcss: 8.5.1
|
12582 |
+
postcss-modules-extract-imports: 3.1.0(postcss@8.5.1)
|
12583 |
+
postcss-modules-local-by-default: 4.2.0(postcss@8.5.1)
|
12584 |
+
postcss-modules-scope: 3.2.1(postcss@8.5.1)
|
12585 |
+
postcss-modules-values: 4.0.0(postcss@8.5.1)
|
12586 |
string-hash: 1.1.3
|
12587 |
|
12588 | |
|
|
12604 |
picocolors: 1.1.1
|
12605 |
source-map-js: 1.2.1
|
12606 |
|
12607 | |
12608 |
+
dependencies:
|
12609 |
+
nanoid: 3.3.8
|
12610 |
+
picocolors: 1.1.1
|
12611 |
+
source-map-js: 1.2.1
|
12612 |
+
|
12613 | |
12614 |
|
12615 | |
|
|
12677 |
|
12678 | |
12679 |
dependencies:
|
12680 |
+
side-channel: 1.1.0
|
12681 |
|
12682 | |
12683 |
dependencies:
|
|
|
12714 |
dependencies:
|
12715 |
dnd-core: 16.0.1
|
12716 |
|
12717 |
+
[email protected](@types/[email protected].10)(@types/[email protected])([email protected]):
|
12718 |
dependencies:
|
12719 |
'@react-dnd/invariant': 4.0.2
|
12720 |
'@react-dnd/shallowequal': 4.0.2
|
|
|
12723 |
hoist-non-react-statics: 3.3.2
|
12724 |
react: 18.3.1
|
12725 |
optionalDependencies:
|
12726 |
+
'@types/node': 22.10.10
|
12727 |
'@types/react': 18.3.12
|
12728 |
|
12729 | |
|
|
12786 |
react: 18.3.1
|
12787 |
react-dom: 18.3.1([email protected])
|
12788 |
|
12789 | |
12790 |
dependencies:
|
12791 |
'@remix-run/router': 1.21.0
|
12792 |
react: 18.3.1
|
12793 |
react-dom: 18.3.1([email protected])
|
12794 |
+
react-router: 6.28.1([email protected])
|
12795 |
|
12796 | |
12797 |
dependencies:
|
12798 |
'@remix-run/router': 1.21.0
|
12799 |
react: 18.3.1
|
|
|
12936 |
mdast-util-to-markdown: 2.1.2
|
12937 |
unified: 11.0.5
|
12938 |
|
12939 |
+
[email protected](@remix-run/[email protected].2([email protected]([email protected]))([email protected])([email protected]))(@remix-run/[email protected]([email protected]))([email protected]([email protected]))([email protected]):
|
12940 |
dependencies:
|
12941 |
+
'@remix-run/react': 2.15.2([email protected]([email protected]))([email protected])([email protected])
|
12942 |
'@remix-run/server-runtime': 2.15.2([email protected])
|
12943 |
react: 18.3.1
|
12944 |
react-dom: 18.3.1([email protected])
|
12945 |
|
12946 |
+
[email protected](@remix-run/[email protected].2(@cloudflare/[email protected])([email protected]))(@remix-run/[email protected]([email protected]))(@remix-run/[email protected].2([email protected]([email protected]))([email protected])([email protected]))(@remix-run/[email protected])([email protected])([email protected]):
|
12947 |
dependencies:
|
12948 |
type-fest: 4.30.0
|
12949 |
optionalDependencies:
|
12950 |
+
'@remix-run/cloudflare': 2.15.2(@cloudflare/[email protected])([email protected])
|
12951 |
'@remix-run/node': 2.15.2([email protected])
|
12952 |
+
'@remix-run/react': 2.15.2([email protected]([email protected]))([email protected])([email protected])
|
12953 |
'@remix-run/router': 1.21.0
|
12954 |
react: 18.3.1
|
12955 |
zod: 3.23.8
|
|
|
13234 |
'@shikijs/vscode-textmate': 9.3.0
|
13235 |
'@types/hast': 3.0.4
|
13236 |
|
13237 | |
13238 |
+
dependencies:
|
13239 |
+
es-errors: 1.3.0
|
13240 |
+
object-inspect: 1.13.3
|
13241 |
+
|
13242 | |
13243 |
+
dependencies:
|
13244 |
+
call-bound: 1.0.3
|
13245 |
+
es-errors: 1.3.0
|
13246 |
+
get-intrinsic: 1.2.7
|
13247 |
+
object-inspect: 1.13.3
|
13248 |
+
|
13249 | |
13250 |
+
dependencies:
|
13251 |
+
call-bound: 1.0.3
|
13252 |
+
es-errors: 1.3.0
|
13253 |
+
get-intrinsic: 1.2.7
|
13254 |
+
object-inspect: 1.13.3
|
13255 |
+
side-channel-map: 1.0.1
|
13256 |
+
|
13257 | |
13258 |
dependencies:
|
13259 |
call-bind: 1.0.7
|
|
|
13261 |
get-intrinsic: 1.2.4
|
13262 |
object-inspect: 1.13.3
|
13263 |
|
13264 | |
13265 |
+
dependencies:
|
13266 |
+
es-errors: 1.3.0
|
13267 |
+
object-inspect: 1.13.3
|
13268 |
+
side-channel-list: 1.0.0
|
13269 |
+
side-channel-map: 1.0.1
|
13270 |
+
side-channel-weakmap: 1.0.2
|
13271 |
+
|
13272 | |
13273 |
|
13274 | |
|
|
13312 | |
13313 |
dependencies:
|
13314 |
spdx-expression-parse: 3.0.1
|
13315 |
+
spdx-license-ids: 3.0.21
|
13316 |
|
13317 | |
13318 |
|
13319 | |
13320 |
dependencies:
|
13321 |
spdx-exceptions: 2.5.0
|
13322 |
+
spdx-license-ids: 3.0.21
|
13323 |
|
13324 |
+
[email protected].21: {}
|
13325 |
|
13326 | |
13327 |
dependencies:
|
|
|
13453 |
|
13454 | |
13455 |
|
13456 |
+
[email protected].2:
|
13457 |
dependencies:
|
13458 |
chownr: 1.1.4
|
13459 |
mkdirp-classic: 0.5.3
|
|
|
13554 |
media-typer: 0.3.0
|
13555 |
mime-types: 2.1.35
|
13556 |
|
13557 | |
13558 |
dependencies:
|
13559 |
+
'@typescript-eslint/eslint-plugin': 8.17.0(@typescript-eslint/[email protected]([email protected]([email protected].7))([email protected]))([email protected]([email protected].7))([email protected])
|
13560 |
+
'@typescript-eslint/parser': 8.17.0([email protected]([email protected].7))([email protected])
|
13561 |
+
'@typescript-eslint/utils': 8.17.0([email protected]([email protected].7))([email protected])
|
13562 |
+
eslint: 9.16.0([email protected].7)
|
13563 |
optionalDependencies:
|
13564 |
typescript: 5.7.2
|
13565 |
transitivePeerDependencies:
|
|
|
13681 |
|
13682 | |
13683 |
|
13684 |
+
[email protected](postcss@8.5.1)([email protected])([email protected](@types/[email protected].10)([email protected])):
|
13685 |
dependencies:
|
13686 |
+
'@unocss/astro': 0.61.9([email protected])([email protected](@types/[email protected].10)([email protected]))
|
13687 |
'@unocss/cli': 0.61.9([email protected])
|
13688 |
'@unocss/core': 0.61.9
|
13689 |
'@unocss/extractor-arbitrary-variants': 0.61.9
|
13690 |
+
'@unocss/postcss': 0.61.9(postcss@8.5.1)
|
13691 |
'@unocss/preset-attributify': 0.61.9
|
13692 |
'@unocss/preset-icons': 0.61.9
|
13693 |
'@unocss/preset-mini': 0.61.9
|
|
|
13702 |
'@unocss/transformer-compile-class': 0.61.9
|
13703 |
'@unocss/transformer-directives': 0.61.9
|
13704 |
'@unocss/transformer-variant-group': 0.61.9
|
13705 |
+
'@unocss/vite': 0.61.9([email protected])([email protected](@types/[email protected].10)([email protected]))
|
13706 |
optionalDependencies:
|
13707 |
+
vite: 5.4.11(@types/[email protected].10)([email protected])
|
13708 |
transitivePeerDependencies:
|
13709 |
- postcss
|
13710 |
- rollup
|
|
|
13811 |
'@types/unist': 3.0.3
|
13812 |
vfile-message: 4.0.2
|
13813 |
|
13814 |
+
[email protected](@types/[email protected].10)([email protected]):
|
13815 |
dependencies:
|
13816 |
cac: 6.7.14
|
13817 |
+
debug: 4.4.0
|
13818 |
pathe: 1.1.2
|
13819 |
picocolors: 1.1.1
|
13820 |
+
vite: 5.4.11(@types/[email protected].10)([email protected])
|
13821 |
transitivePeerDependencies:
|
13822 |
- '@types/node'
|
13823 |
- less
|
|
|
13829 |
- supports-color
|
13830 |
- terser
|
13831 |
|
13832 |
+
[email protected](@types/[email protected].10)([email protected]):
|
13833 |
dependencies:
|
13834 |
cac: 6.7.14
|
13835 |
debug: 4.3.7
|
13836 |
es-module-lexer: 1.5.4
|
13837 |
pathe: 1.1.2
|
13838 |
+
vite: 5.4.11(@types/[email protected].10)([email protected])
|
13839 |
transitivePeerDependencies:
|
13840 |
- '@types/node'
|
13841 |
- less
|
|
|
13847 |
- supports-color
|
13848 |
- terser
|
13849 |
|
13850 | |
13851 |
dependencies:
|
13852 |
'@rollup/plugin-inject': 5.0.5([email protected])
|
13853 |
node-stdlib-browser: 1.3.0
|
13854 |
+
vite: 5.4.11(@types/[email protected].10)([email protected])
|
13855 |
transitivePeerDependencies:
|
13856 |
- rollup
|
13857 |
|
13858 |
+
[email protected]([email protected](@types/[email protected].10)([email protected])):
|
13859 |
dependencies:
|
13860 |
+
vite: 5.4.11(@types/[email protected].10)([email protected])
|
13861 |
|
13862 | |
13863 |
dependencies:
|
13864 |
debug: 4.3.7
|
13865 |
globrex: 0.1.2
|
13866 |
tsconfck: 3.1.4([email protected])
|
13867 |
optionalDependencies:
|
13868 |
+
vite: 5.4.11(@types/[email protected].10)([email protected])
|
13869 |
transitivePeerDependencies:
|
13870 |
- supports-color
|
13871 |
- typescript
|
13872 |
|
13873 |
+
[email protected](@types/[email protected].10)([email protected]):
|
13874 |
dependencies:
|
13875 |
esbuild: 0.21.5
|
13876 |
postcss: 8.4.49
|
13877 |
rollup: 4.28.0
|
13878 |
optionalDependencies:
|
13879 |
+
'@types/node': 22.10.10
|
13880 |
fsevents: 2.3.3
|
13881 |
sass-embedded: 1.81.0
|
13882 |
|
13883 |
+
[email protected](@types/[email protected].10)([email protected]):
|
13884 |
dependencies:
|
13885 |
'@vitest/expect': 2.1.8
|
13886 |
+
'@vitest/mocker': 2.1.8([email protected](@types/[email protected].10)([email protected]))
|
13887 |
'@vitest/pretty-format': 2.1.8
|
13888 |
'@vitest/runner': 2.1.8
|
13889 |
'@vitest/snapshot': 2.1.8
|
|
|
13899 |
tinyexec: 0.3.1
|
13900 |
tinypool: 1.0.2
|
13901 |
tinyrainbow: 1.2.0
|
13902 |
+
vite: 5.4.11(@types/[email protected].10)([email protected])
|
13903 |
+
vite-node: 2.1.8(@types/[email protected].10)([email protected])
|
13904 |
why-is-node-running: 2.3.0
|
13905 |
optionalDependencies:
|
13906 |
+
'@types/node': 22.10.10
|
13907 |
transitivePeerDependencies:
|
13908 |
- less
|
13909 |
- lightningcss
|
|
|
14019 |
|
14020 | |
14021 |
|
14022 |
+
yaml@2.7.0: {}
|
14023 |
|
14024 | |
14025 |
|