diff --git a/app/components/settings/connections/ConnectionsTab.tsx b/app/components/settings/connections/ConnectionsTab.tsx index d381285..d5a9412 100644 --- a/app/components/settings/connections/ConnectionsTab.tsx +++ b/app/components/settings/connections/ConnectionsTab.tsx @@ -35,6 +35,7 @@ interface GitHubStats { interface GitHubConnection { user: GitHubUserResponse | null; token: string; + tokenType: 'classic' | 'fine-grained'; stats?: GitHubStats; } @@ -42,6 +43,7 @@ export default function ConnectionsTab() { const [connection, setConnection] = useState({ user: null, token: '', + tokenType: 'classic', }); const [isLoading, setIsLoading] = useState(true); const [isConnecting, setIsConnecting] = useState(false); @@ -53,7 +55,14 @@ export default function ConnectionsTab() { if (savedConnection) { const parsed = JSON.parse(savedConnection); + + // Ensure backward compatibility with existing connections + if (!parsed.tokenType) { + parsed.tokenType = 'classic'; + } + setConnection(parsed); + if (parsed.user && parsed.token) { fetchGitHubStats(parsed.token); } @@ -73,7 +82,9 @@ export default function ConnectionsTab() { }, }); - if (!reposResponse.ok) throw new Error('Failed to fetch repositories'); + if (!reposResponse.ok) { + throw new Error('Failed to fetch repositories'); + } const repos = (await reposResponse.json()) as GitHubRepoInfo[]; @@ -107,10 +118,16 @@ export default function ConnectionsTab() { }, }); - if (!response.ok) throw new Error('Invalid token or unauthorized'); + if (!response.ok) { + throw new Error('Invalid token or unauthorized'); + } const data = (await response.json()) as GitHubUserResponse; - const newConnection = { user: data, token }; + const newConnection: GitHubConnection = { + user: data, + token, + tokenType: connection.tokenType, + }; // Save connection localStorage.setItem('github_connection', JSON.stringify(newConnection)); @@ -123,7 +140,7 @@ export default function ConnectionsTab() { } catch (error) { logStore.logError('Failed to authenticate with GitHub', { error }); toast.error('Failed to connect to GitHub'); - setConnection({ user: null, token: '' }); + setConnection({ user: null, token: '', tokenType: 'classic' }); } finally { setIsConnecting(false); } @@ -136,11 +153,13 @@ export default function ConnectionsTab() { const handleDisconnect = () => { localStorage.removeItem('github_connection'); - setConnection({ user: null, token: '' }); + setConnection({ user: null, token: '', tokenType: 'classic' }); toast.success('Disconnected from GitHub'); }; - if (isLoading) return ; + if (isLoading) { + return ; + } return (
@@ -174,31 +193,37 @@ export default function ConnectionsTab() {
- - Token Type +
- + setConnection((prev) => ({ ...prev, token: e.target.value }))} disabled={isConnecting || !!connection.user} - placeholder="Enter your GitHub token" + placeholder={`Enter your GitHub ${connection.tokenType === 'classic' ? 'personal access token' : 'fine-grained token'}`} className={classNames( 'w-full px-3 py-2 rounded-lg text-sm', 'bg-[#F8F8F8] dark:bg-[#1A1A1A]', @@ -257,69 +282,49 @@ export default function ConnectionsTab() { )}
- {connection.user && connection.stats && ( -
-
+ {connection.user && ( +
+
{connection.user.login}
-

- {connection.user.name || connection.user.login} -

- {connection.user.bio && ( -

{connection.user.bio}

- )} -
- -
- {connection.user.followers} followers - - -
- {connection.stats.totalStars} stars - - -
- {connection.stats.totalForks} forks - -
+

{connection.user.name}

+

@{connection.user.login}

-

Recent Repositories

-
- {connection.stats.repos.map((repo) => ( - -
-
-
{repo.name}
- {repo.description && ( -

{repo.description}

- )} -
-
diff --git a/app/components/settings/connections/components/ConnectionForm.tsx b/app/components/settings/connections/components/ConnectionForm.tsx new file mode 100644 index 0000000..76f8700 --- /dev/null +++ b/app/components/settings/connections/components/ConnectionForm.tsx @@ -0,0 +1,180 @@ +import React, { useEffect } from 'react'; +import { classNames } from '~/utils/classNames'; +import type { GitHubAuthState } from '~/components/settings/connections/types/GitHub'; +import Cookies from 'js-cookie'; +import { getLocalStorage } from '~/utils/localStorage'; + +const GITHUB_TOKEN_KEY = 'github_token'; + +interface ConnectionFormProps { + authState: GitHubAuthState; + setAuthState: React.Dispatch>; + onSave: (e: React.FormEvent) => void; + onDisconnect: () => void; +} + +export function ConnectionForm({ authState, setAuthState, onSave, onDisconnect }: ConnectionFormProps) { + // Check for saved token on mount + useEffect(() => { + const savedToken = Cookies.get(GITHUB_TOKEN_KEY) || getLocalStorage(GITHUB_TOKEN_KEY); + + if (savedToken && !authState.tokenInfo?.token) { + setAuthState((prev: GitHubAuthState) => ({ + ...prev, + tokenInfo: { + token: savedToken, + scope: [], + avatar_url: '', + name: null, + created_at: new Date().toISOString(), + followers: 0, + }, + })); + } + }, []); + + return ( +
+
+
+
+
+
+
+
+

Connection Settings

+

Configure your GitHub connection

+
+
+
+ +
+
+ + setAuthState((prev: GitHubAuthState) => ({ ...prev, username: e.target.value }))} + className={classNames( + 'w-full px-4 py-2.5 bg-[#F5F5F5] dark:bg-[#1A1A1A] border rounded-lg', + 'text-bolt-elements-textPrimary placeholder-bolt-elements-textTertiary text-base', + 'border-[#E5E5E5] dark:border-[#1A1A1A]', + 'focus:ring-2 focus:ring-purple-500/50 focus:border-purple-500', + 'transition-all duration-200', + )} + placeholder="e.g., octocat" + /> +
+ +
+
+ + + Generate new token +
+ +
+ + setAuthState((prev: GitHubAuthState) => ({ + ...prev, + tokenInfo: { + token: e.target.value, + scope: [], + avatar_url: '', + name: null, + created_at: new Date().toISOString(), + followers: 0, + }, + username: '', + isConnected: false, + isVerifying: false, + isLoadingRepos: false, + })) + } + className={classNames( + 'w-full px-4 py-2.5 bg-[#F5F5F5] dark:bg-[#1A1A1A] border rounded-lg', + 'text-bolt-elements-textPrimary placeholder-bolt-elements-textTertiary text-base', + 'border-[#E5E5E5] dark:border-[#1A1A1A]', + 'focus:ring-2 focus:ring-purple-500/50 focus:border-purple-500', + 'transition-all duration-200', + )} + placeholder="ghp_xxxxxxxxxxxx" + /> +
+ +
+
+ {!authState.isConnected ? ( + + ) : ( + <> + + +
+ Connected + + + )} +
+ {authState.rateLimits && ( +
+
+ Rate limit resets at {authState.rateLimits.reset.toLocaleTimeString()} +
+ )} +
+ +
+
+ ); +} diff --git a/app/components/settings/connections/components/CreateBranchDialog.tsx b/app/components/settings/connections/components/CreateBranchDialog.tsx new file mode 100644 index 0000000..2f19126 --- /dev/null +++ b/app/components/settings/connections/components/CreateBranchDialog.tsx @@ -0,0 +1,150 @@ +import { useState } from 'react'; +import * as Dialog from '@radix-ui/react-dialog'; +import { classNames } from '~/utils/classNames'; +import type { GitHubRepoInfo } from '~/components/settings/connections/types/GitHub'; +import { GitBranch } from '@phosphor-icons/react'; + +interface GitHubBranch { + name: string; + default?: boolean; +} + +interface CreateBranchDialogProps { + isOpen: boolean; + onClose: () => void; + onConfirm: (branchName: string, sourceBranch: string) => void; + repository: GitHubRepoInfo; + branches?: GitHubBranch[]; +} + +export function CreateBranchDialog({ isOpen, onClose, onConfirm, repository, branches }: CreateBranchDialogProps) { + const [branchName, setBranchName] = useState(''); + const [sourceBranch, setSourceBranch] = useState(branches?.find((b) => b.default)?.name || 'main'); + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + onConfirm(branchName, sourceBranch); + setBranchName(''); + onClose(); + }; + + return ( + + + + + + Create New Branch + + +
+
+
+ + setBranchName(e.target.value)} + placeholder="feature/my-new-branch" + className={classNames( + 'w-full px-3 py-2 rounded-lg', + 'bg-[#F5F5F5] dark:bg-[#1A1A1A]', + 'border border-[#E5E5E5] dark:border-[#1A1A1A]', + 'text-bolt-elements-textPrimary placeholder:text-bolt-elements-textTertiary', + 'focus:outline-none focus:ring-2 focus:ring-purple-500/50', + )} + required + /> +
+ +
+ + +
+ +
+

Branch Overview

+
    +
  • + + Repository: {repository.name} +
  • + {branchName && ( +
  • +
    + New branch will be created as: {branchName} +
  • + )} +
  • +
    + Based on: {sourceBranch} +
  • +
+
+
+ +
+ + +
+
+
+
+
+ ); +} diff --git a/app/components/settings/connections/types/GitHub.ts b/app/components/settings/connections/types/GitHub.ts new file mode 100644 index 0000000..d260042 --- /dev/null +++ b/app/components/settings/connections/types/GitHub.ts @@ -0,0 +1,59 @@ +export interface GitHubUserResponse { + login: string; + avatar_url: string; + html_url: string; + name: string; + bio: string; + public_repos: number; + followers: number; + following: number; +} + +export interface GitHubRepoInfo { + name: string; + full_name: string; + html_url: string; + description: string; + stargazers_count: number; + forks_count: number; + default_branch: string; + updated_at: string; +} + +export interface GitHubStats { + repos: GitHubRepoInfo[]; + totalStars: number; + totalForks: number; +} + +export interface GitHubConnection { + user: GitHubUserResponse | null; + token: string; + tokenType: 'classic' | 'fine-grained'; + stats?: GitHubStats; +} + +export interface GitHubTokenInfo { + token: string; + scope: string[]; + avatar_url: string; + name: string | null; + created_at: string; + followers: number; +} + +export interface GitHubRateLimits { + limit: number; + remaining: number; + reset: Date; + used: number; +} + +export interface GitHubAuthState { + username: string; + tokenInfo: GitHubTokenInfo | null; + isConnected: boolean; + isVerifying: boolean; + isLoadingRepos: boolean; + rateLimits?: GitHubRateLimits; +} diff --git a/app/components/settings/data/DataTab.tsx b/app/components/settings/data/DataTab.tsx index 08ec75a..431805e 100644 --- a/app/components/settings/data/DataTab.tsx +++ b/app/components/settings/data/DataTab.tsx @@ -305,9 +305,9 @@ export default function DataTab() { >
-

Chat History

+

Chat History

-

Export or delete all your chat history.

+

Export or delete all your chat history.

-

Settings Backup

+

Settings Backup

-

+

Export your settings to a JSON file or import settings from a previously exported file.

@@ -364,7 +364,7 @@ export default function DataTab() { Import Settings setShowResetInlineConfirm(true)} @@ -384,9 +384,9 @@ export default function DataTab() { >
-

API Keys Management

+

API Keys Management

-

+

Import API keys from a JSON file or download a template to fill in your keys.

@@ -405,7 +405,7 @@ export default function DataTab() { disabled={isDownloadingTemplate} > {isDownloadingTemplate ? ( -
+
) : (
)} diff --git a/app/components/settings/debug/DebugTab.tsx b/app/components/settings/debug/DebugTab.tsx index 9ee8827..e3fbc3d 100644 --- a/app/components/settings/debug/DebugTab.tsx +++ b/app/components/settings/debug/DebugTab.tsx @@ -92,10 +92,12 @@ interface WebAppInfo { nodeVersion: string; dependencies: { [key: string]: string }; devDependencies: { [key: string]: string }; + // Build Info buildTime?: string; buildNumber?: string; environment?: string; + // Git Info gitInfo?: { branch: string; @@ -104,6 +106,7 @@ interface WebAppInfo { author: string; remoteUrl: string; }; + // GitHub Repository Info repoInfo?: { name: string; @@ -121,6 +124,39 @@ interface WebAppInfo { }; } +interface GitInfo { + branch: string; + commit: string; + commitTime: string; + author: string; + remoteUrl: string; +} + +interface RepoData { + name: string; + full_name: string; + description: string; + stargazers_count: number; + forks_count: number; + open_issues_count: number; + default_branch: string; + updated_at: string; + owner: { + login: string; + avatar_url: string; + }; +} + +interface AppData { + name: string; + version: string; + description: string; + license: string; + nodeVersion: string; + dependencies: { [key: string]: string }; + devDependencies: { [key: string]: string }; +} + export default function DebugTab() { const [systemInfo, setSystemInfo] = useState(null); const [webAppInfo, setWebAppInfo] = useState(null); @@ -328,23 +364,27 @@ export default function DebugTab() { // Fetch local app info const appInfoResponse = await fetch('/api/system/app-info'); + if (!appInfoResponse.ok) { throw new Error('Failed to fetch webapp info'); } - const appData = await appInfoResponse.json(); + + const appData = (await appInfoResponse.json()) as AppData; // Fetch git info const gitInfoResponse = await fetch('/api/system/git-info'); - let gitInfo = null; + let gitInfo: GitInfo | undefined; + if (gitInfoResponse.ok) { - gitInfo = await gitInfoResponse.json(); + gitInfo = (await gitInfoResponse.json()) as GitInfo; } // Fetch GitHub repository info const repoInfoResponse = await fetch('https://api.github.com/repos/stackblitz-labs/bolt.diy'); - let repoInfo = null; + let repoInfo: WebAppInfo['repoInfo'] | undefined; + if (repoInfoResponse.ok) { - const repoData = await repoInfoResponse.json(); + const repoData = (await repoInfoResponse.json()) as RepoData; repoInfo = { name: repoData.name, fullName: repoData.full_name, @@ -396,21 +436,6 @@ export default function DebugTab() { return `${Math.round(size)} ${units[unitIndex]}`; }; - const handleLogSystemInfo = () => { - if (!systemInfo) { - return; - } - - logStore.logSystem('System Information', { - os: systemInfo.os, - arch: systemInfo.arch, - cpus: systemInfo.cpus, - memory: systemInfo.memory, - node: systemInfo.node, - }); - toast.success('System information logged'); - }; - const handleLogPerformance = () => { try { setLoading((prev) => ({ ...prev, performance: true })); @@ -625,6 +650,26 @@ export default function DebugTab() { Check Errors + +
- {/* Error Log Display */} - {errorLog.errors.length > 0 && ( -
-

Error Log

-
- {errorLog.errors.map((error, index) => ( -
-
- Type: {error.type} - Time: - {new Date(error.timestamp).toLocaleString()} -
-
{error.message}
- {error.filename && ( -
- File: {error.filename} (Line: {error.lineNumber}, Column: {error.columnNumber}) -
- )} -
- ))} -
-
- )} - {/* System Information */}
-
-
-
-

System Information

-
-
- - -
+
+
+

System Information

{systemInfo ? (
@@ -826,26 +815,9 @@ export default function DebugTab() { {/* Performance Metrics */}
-
-
-
-

Performance Metrics

-
- +
+
+

Performance Metrics

{systemInfo && (
@@ -914,26 +886,9 @@ export default function DebugTab() { {/* WebApp Information */}
-
-
-
-

WebApp Information

-
- +
+
+

WebApp Information

{webAppInfo ? (
@@ -1008,18 +963,12 @@ export default function DebugTab() { Git Info:
-
- Branch: {webAppInfo.gitInfo.branch} -
-
- Commit: {webAppInfo.gitInfo.commit} -
+
Branch: {webAppInfo.gitInfo.branch}
+
Commit: {webAppInfo.gitInfo.commit}
Commit Time: {webAppInfo.gitInfo.commitTime}
-
- Author: {webAppInfo.gitInfo.author} -
+
Author: {webAppInfo.gitInfo.author}
Remote URL: {webAppInfo.gitInfo.remoteUrl}
@@ -1033,21 +982,15 @@ export default function DebugTab() { GitHub Repository:
-
- Name: {webAppInfo.repoInfo.name} -
+
Name: {webAppInfo.repoInfo.name}
Full Name: {webAppInfo.repoInfo.fullName}
Description: {webAppInfo.repoInfo.description}
-
- Stars: {webAppInfo.repoInfo.stars} -
-
- Forks: {webAppInfo.repoInfo.forks} -
+
Stars: {webAppInfo.repoInfo.stars}
+
Forks: {webAppInfo.repoInfo.forks}
Open Issues: {webAppInfo.repoInfo.openIssues}
@@ -1077,26 +1020,9 @@ export default function DebugTab() { {/* Error Check */}
-
-
-
-

Error Check

-
- +
+
+

Error Check

diff --git a/app/components/settings/developer/DeveloperWindow.tsx b/app/components/settings/developer/DeveloperWindow.tsx index 6463567..3045f4d 100644 --- a/app/components/settings/developer/DeveloperWindow.tsx +++ b/app/components/settings/developer/DeveloperWindow.tsx @@ -1,12 +1,18 @@ import * as RadixDialog from '@radix-ui/react-dialog'; import { motion } from 'framer-motion'; -import { useState, useEffect } from 'react'; +import { useState, useEffect, useMemo } from 'react'; import { classNames } from '~/utils/classNames'; import { TabManagement } from './TabManagement'; import { TabTile } from '~/components/settings/shared/TabTile'; import { DialogTitle } from '~/components/ui/Dialog'; import type { TabType, TabVisibilityConfig } from '~/components/settings/settings.types'; -import { tabConfigurationStore, updateTabConfiguration } from '~/lib/stores/settings'; +import { + tabConfigurationStore, + resetTabConfiguration, + updateTabConfiguration, + developerModeStore, + setDeveloperMode, +} from '~/lib/stores/settings'; import { useStore } from '@nanostores/react'; import { DndProvider, useDrag, useDrop } from 'react-dnd'; import { HTML5Backend } from 'react-dnd-html5-backend'; @@ -24,6 +30,7 @@ import * as DropdownMenu from '@radix-ui/react-dropdown-menu'; import CloudProvidersTab from '~/components/settings/providers/CloudProvidersTab'; import LocalProvidersTab from '~/components/settings/providers/LocalProvidersTab'; import TaskManagerTab from '~/components/settings/task-manager/TaskManagerTab'; +import { Switch } from '~/components/ui/Switch'; interface DraggableTabTileProps { tab: TabVisibilityConfig; @@ -83,8 +90,14 @@ const DraggableTabTile = ({ }, }); + const dragDropRef = (node: HTMLDivElement | null) => { + if (node) { + drag(drop(node)); + } + }; + return ( -
drag(drop(node))} style={{ opacity: isDragging ? 0.5 : 1 }}> +
{ - const tabConfiguration = useStore(tabConfigurationStore); const [activeTab, setActiveTab] = useState(null); - const [showTabManagement, setShowTabManagement] = useState(false); const [loadingTab, setLoadingTab] = useState(null); + const tabConfiguration = useStore(tabConfigurationStore); + const [showTabManagement, setShowTabManagement] = useState(false); + const developerMode = useStore(developerModeStore); const [profile, setProfile] = useState(() => { const saved = localStorage.getItem('bolt_user_profile'); return saved ? JSON.parse(saved) : { avatar: null, notifications: true }; }); + // Handle developer mode change + const handleDeveloperModeChange = (checked: boolean) => { + setDeveloperMode(checked); + + if (!checked) { + onClose(); + } + }; + + // Ensure developer mode is true when window is opened + useEffect(() => { + if (open) { + setDeveloperMode(true); + } + }, [open]); + // Listen for profile changes useEffect(() => { const handleStorageChange = (e: StorageEvent) => { @@ -134,6 +164,38 @@ export const DeveloperWindow = ({ open, onClose }: DeveloperWindowProps) => { const { hasConnectionIssues, currentIssue, acknowledgeIssue } = useConnectionStatus(); const { hasActiveWarnings, activeIssues, acknowledgeAllIssues } = useDebugStatus(); + // Ensure tab configuration is properly initialized + useEffect(() => { + if (!tabConfiguration || !tabConfiguration.userTabs || !tabConfiguration.developerTabs) { + console.warn('Tab configuration is invalid in DeveloperWindow, resetting to defaults'); + resetTabConfiguration(); + } else { + // Validate tab configuration structure + const isValid = + tabConfiguration.userTabs.every( + (tab) => + tab && + typeof tab.id === 'string' && + typeof tab.visible === 'boolean' && + typeof tab.window === 'string' && + typeof tab.order === 'number', + ) && + tabConfiguration.developerTabs.every( + (tab) => + tab && + typeof tab.id === 'string' && + typeof tab.visible === 'boolean' && + typeof tab.window === 'string' && + typeof tab.order === 'number', + ); + + if (!isValid) { + console.warn('Tab configuration is malformed in DeveloperWindow, resetting to defaults'); + resetTabConfiguration(); + } + } + }, [tabConfiguration]); + const handleBack = () => { if (showTabManagement) { setShowTabManagement(false); @@ -143,21 +205,55 @@ export const DeveloperWindow = ({ open, onClose }: DeveloperWindowProps) => { }; // Only show tabs that are assigned to the developer window AND are visible - const visibleDeveloperTabs = tabConfiguration.developerTabs - .filter((tab) => { - // Hide notifications tab if notifications are disabled - if (tab.id === 'notifications' && !profile.notifications) { - return false; - } + const visibleDeveloperTabs = useMemo(() => { + console.log('Filtering developer tabs with configuration:', tabConfiguration); - return tab.visible; - }) - .sort((a: TabVisibilityConfig, b: TabVisibilityConfig) => (a.order || 0) - (b.order || 0)); + if (!tabConfiguration?.developerTabs || !Array.isArray(tabConfiguration.developerTabs)) { + console.warn('Invalid tab configuration, using empty array'); + return []; + } + + return tabConfiguration.developerTabs + .filter((tab) => { + if (!tab || typeof tab.id !== 'string') { + console.warn('Invalid tab entry:', tab); + return false; + } + + // Hide notifications tab if notifications are disabled + if (tab.id === 'notifications' && !profile.notifications) { + console.log('Hiding notifications tab due to disabled notifications'); + return false; + } + + // Ensure the tab has the required properties + if (typeof tab.visible !== 'boolean' || typeof tab.window !== 'string' || typeof tab.order !== 'number') { + console.warn('Tab missing required properties:', tab); + return false; + } + + // Only show tabs that are explicitly visible and assigned to the developer window + const isVisible = tab.visible && tab.window === 'developer'; + console.log(`Tab ${tab.id} visibility:`, isVisible); + + return isVisible; + }) + .sort((a: TabVisibilityConfig, b: TabVisibilityConfig) => { + const orderA = typeof a.order === 'number' ? a.order : 0; + const orderB = typeof b.order === 'number' ? b.order : 0; + + return orderA - orderB; + }); + }, [tabConfiguration, profile.notifications]); + + console.log('Filtered visible developer tabs:', visibleDeveloperTabs); const moveTab = (dragIndex: number, hoverIndex: number) => { const draggedTab = visibleDeveloperTabs[dragIndex]; const targetTab = visibleDeveloperTabs[hoverIndex]; + console.log('Moving developer tab:', { draggedTab, targetTab }); + // Update the order of the dragged and target tabs const updatedDraggedTab = { ...draggedTab, order: targetTab.order }; const updatedTargetTab = { ...targetTab, order: draggedTab.order }; @@ -278,7 +374,10 @@ export const DeveloperWindow = ({ open, onClose }: DeveloperWindowProps) => { -
+
{ 'flex flex-col overflow-hidden', )} initial={{ opacity: 0, scale: 0.95, y: 20 }} - animate={{ opacity: 1, scale: 1, y: 0 }} + animate={{ opacity: developerMode ? 1 : 0, scale: developerMode ? 1 : 0.95, y: developerMode ? 0 : 20 }} exit={{ opacity: 0, scale: 0.95, y: 20 }} transition={{ duration: 0.2 }} > @@ -346,6 +445,16 @@ export const DeveloperWindow = ({ open, onClose }: DeveloperWindowProps) => { )} +
+ + +
+
diff --git a/app/components/settings/developer/TabManagement.tsx b/app/components/settings/developer/TabManagement.tsx index 457c17f..34b6e56 100644 --- a/app/components/settings/developer/TabManagement.tsx +++ b/app/components/settings/developer/TabManagement.tsx @@ -37,7 +37,7 @@ const TabGroup = ({ title, description, tabs, onVisibilityChange, targetWindow } const hiddenTabs = tabs.filter((tab) => !tab.visible).sort((a, b) => (a.order || 0) - (b.order || 0)); return ( -
+

diff --git a/app/components/settings/providers/LocalProvidersTab.tsx b/app/components/settings/providers/LocalProvidersTab.tsx index cda8833..c10a51b 100644 --- a/app/components/settings/providers/LocalProvidersTab.tsx +++ b/app/components/settings/providers/LocalProvidersTab.tsx @@ -10,8 +10,6 @@ import { settingsStyles } from '~/components/settings/settings.styles'; import { toast } from 'react-toastify'; import { BsBox, BsCodeSquare, BsRobot } from 'react-icons/bs'; import type { IconType } from 'react-icons'; -import OllamaModelUpdater from './OllamaModelUpdater'; -import { DialogRoot, Dialog } from '~/components/ui/Dialog'; import { BiChip } from 'react-icons/bi'; import { TbBrandOpenai } from 'react-icons/tb'; import { providerBaseUrlEnvKeys } from '~/utils/constants'; @@ -33,12 +31,33 @@ const PROVIDER_DESCRIPTIONS: Record = { OpenAILike: 'Connect to OpenAI-compatible API endpoints', }; +interface OllamaModel { + name: string; + digest: string; + size: number; + modified_at: string; + details?: { + family: string; + parameter_size: string; + quantization_level: string; + }; + status?: 'idle' | 'updating' | 'updated' | 'error' | 'checking'; + error?: string; + newDigest?: string; + progress?: { + current: number; + total: number; + status: string; + }; +} + const LocalProvidersTab = () => { const settings = useSettings(); const [filteredProviders, setFilteredProviders] = useState([]); const [categoryEnabled, setCategoryEnabled] = useState(false); - const [showOllamaUpdater, setShowOllamaUpdater] = useState(false); const [editingProvider, setEditingProvider] = useState(null); + const [ollamaModels, setOllamaModels] = useState([]); + const [isLoadingModels, setIsLoadingModels] = useState(false); // Effect to filter and sort providers useEffect(() => { @@ -46,9 +65,32 @@ const LocalProvidersTab = () => { .filter(([key]) => [...LOCAL_PROVIDERS, 'OpenAILike'].includes(key)) .map(([key, value]) => { const provider = value as IProviderConfig; + const envKey = providerBaseUrlEnvKeys[key]?.baseUrlKey; + + // Get environment URL safely + const envUrl = envKey ? (import.meta.env[envKey] as string | undefined) : undefined; + + console.log(`Checking env URL for ${key}:`, { + envKey, + envUrl, + currentBaseUrl: provider.settings.baseUrl, + }); + + // If there's an environment URL and no base URL set, update it + if (envUrl && !provider.settings.baseUrl) { + console.log(`Setting base URL for ${key} from env:`, envUrl); + settings.updateProviderSettings(key, { + ...provider.settings, + baseUrl: envUrl, + }); + } + return { name: key, - settings: provider.settings, + settings: { + ...provider.settings, + baseUrl: provider.settings.baseUrl || envUrl, + }, staticModels: provider.staticModels || [], getDynamicModels: provider.getDynamicModels, getApiKeyLink: provider.getApiKeyLink, @@ -57,16 +99,135 @@ const LocalProvidersTab = () => { } as IProviderConfig; }); - const sorted = newFilteredProviders.sort((a, b) => a.name.localeCompare(b.name)); + // Custom sort function to ensure LMStudio appears before OpenAILike + const sorted = newFilteredProviders.sort((a, b) => { + if (a.name === 'LMStudio') { + return -1; + } + + if (b.name === 'LMStudio') { + return 1; + } + + if (a.name === 'OpenAILike') { + return 1; + } + + if (b.name === 'OpenAILike') { + return -1; + } + + return a.name.localeCompare(b.name); + }); setFilteredProviders(sorted); }, [settings.providers]); + // Helper function to safely get environment URL + const getEnvUrl = (provider: IProviderConfig): string | undefined => { + const envKey = providerBaseUrlEnvKeys[provider.name]?.baseUrlKey; + return envKey ? (import.meta.env[envKey] as string | undefined) : undefined; + }; + // Add effect to update category toggle state based on provider states useEffect(() => { const newCategoryState = filteredProviders.every((p) => p.settings.enabled); setCategoryEnabled(newCategoryState); }, [filteredProviders]); + // Fetch Ollama models when enabled + useEffect(() => { + const ollamaProvider = filteredProviders.find((p) => p.name === 'Ollama'); + + if (ollamaProvider?.settings.enabled) { + fetchOllamaModels(); + } + }, [filteredProviders]); + + const fetchOllamaModels = async () => { + try { + setIsLoadingModels(true); + + const response = await fetch('http://127.0.0.1:11434/api/tags'); + const data = (await response.json()) as { models: OllamaModel[] }; + + setOllamaModels( + data.models.map((model) => ({ + ...model, + status: 'idle' as const, + })), + ); + } catch (error) { + console.error('Error fetching Ollama models:', error); + } finally { + setIsLoadingModels(false); + } + }; + + const updateOllamaModel = async (modelName: string): Promise<{ success: boolean; newDigest?: string }> => { + try { + const response = await fetch('http://127.0.0.1:11434/api/pull', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ name: modelName }), + }); + + if (!response.ok) { + throw new Error(`Failed to update ${modelName}`); + } + + const reader = response.body?.getReader(); + + if (!reader) { + throw new Error('No response reader available'); + } + + while (true) { + const { done, value } = await reader.read(); + + if (done) { + break; + } + + const text = new TextDecoder().decode(value); + const lines = text.split('\n').filter(Boolean); + + for (const line of lines) { + const data = JSON.parse(line) as { + status: string; + completed?: number; + total?: number; + digest?: string; + }; + + setOllamaModels((current) => + current.map((m) => + m.name === modelName + ? { + ...m, + progress: { + current: data.completed || 0, + total: data.total || 0, + status: data.status, + }, + newDigest: data.digest, + } + : m, + ), + ); + } + } + + const updatedResponse = await fetch('http://127.0.0.1:11434/api/tags'); + const updatedData = (await updatedResponse.json()) as { models: OllamaModel[] }; + const updatedModel = updatedData.models.find((m) => m.name === modelName); + + return { success: true, newDigest: updatedModel?.digest }; + } catch (error) { + console.error(`Error updating ${modelName}:`, error); + return { success: false }; + } + }; + const handleToggleCategory = useCallback( (enabled: boolean) => { setCategoryEnabled(enabled); @@ -106,6 +267,31 @@ const LocalProvidersTab = () => { setEditingProvider(null); }; + const handleUpdateOllamaModel = async (modelName: string) => { + setOllamaModels((current) => current.map((m) => (m.name === modelName ? { ...m, status: 'updating' } : m))); + + const { success, newDigest } = await updateOllamaModel(modelName); + + setOllamaModels((current) => + current.map((m) => + m.name === modelName + ? { + ...m, + status: success ? 'updated' : 'error', + error: success ? undefined : 'Update failed', + newDigest, + } + : m, + ), + ); + + if (success) { + toast.success(`Updated ${modelName}`); + } else { + toast.error(`Failed to update ${modelName}`); + } + }; + return (
{

-
+
{filteredProviders.map((provider, index) => ( { 'transition-all duration-200', 'relative overflow-hidden group', 'flex flex-col', + + // Make Ollama span 2 rows + provider.name === 'Ollama' ? 'row-span-2' : '', + + // Place Ollama in the second column + provider.name === 'Ollama' ? 'col-start-2' : 'col-start-1', )} initial={{ opacity: 0, y: 20 }} animate={{ opacity: 1, y: 0 }} @@ -253,21 +445,109 @@ const LocalProvidersTab = () => {
)} -
- {providerBaseUrlEnvKeys[provider.name]?.baseUrlKey && ( -
-
-
- Environment URL set in .env file + {providerBaseUrlEnvKeys[provider.name]?.baseUrlKey && ( +
+
+
+ + {getEnvUrl(provider) + ? 'Environment URL set in .env.local' + : 'Environment URL not set in .env.local'} + +
-
- )} + )} +
)}
+ {provider.name === 'Ollama' && provider.settings.enabled && ( +
+
+
+
+ Installed Models +
+ {isLoadingModels ? ( +
+
+ Loading models... +
+ ) : ( + + {ollamaModels.length} models available + + )} +
+ +
+ {ollamaModels.map((model) => ( +
+
+
+ {model.name} + {model.status === 'updating' && ( +
+ )} + {model.status === 'updated' &&
} + {model.status === 'error' &&
} +
+
+ Version: {model.digest.substring(0, 7)} + {model.status === 'updated' && model.newDigest && ( + <> +
+ {model.newDigest.substring(0, 7)} + + )} + {model.progress && ( + + {model.progress.status}{' '} + {model.progress.total > 0 && ( + <>({Math.round((model.progress.current / model.progress.total) * 100)}%) + )} + + )} + {model.details && ( + + ({model.details.parameter_size}, {model.details.quantization_level}) + + )} +
+
+ handleUpdateOllamaModel(model.name)} + disabled={model.status === 'updating'} + className={classNames( + settingsStyles.button.base, + settingsStyles.button.secondary, + 'hover:bg-purple-500/10 hover:text-purple-500', + 'dark:bg-[#1A1A1A] dark:hover:bg-purple-500/20 dark:text-bolt-elements-textPrimary dark:hover:text-purple-500', + )} + whileHover={{ scale: 1.02 }} + whileTap={{ scale: 0.98 }} + > +
+ Update + +
+ ))} +
+
+ )} + { }} transition={{ duration: 0.2 }} /> - - {provider.name === 'Ollama' && provider.settings.enabled && ( - setShowOllamaUpdater(true)} - className={classNames( - settingsStyles.button.base, - settingsStyles.button.secondary, - 'ml-2', - 'hover:bg-purple-500/10 hover:text-purple-500', - 'dark:bg-[#1A1A1A] dark:hover:bg-purple-500/20 dark:text-bolt-elements-textPrimary dark:hover:text-purple-500', - )} - whileHover={{ scale: 1.02 }} - whileTap={{ scale: 0.98 }} - > -
- Update Models - - )} ))}
- - - -
- -
-
-
); }; diff --git a/app/components/settings/settings/SettingsTab.tsx b/app/components/settings/settings/SettingsTab.tsx index a811143..bb3dcab 100644 --- a/app/components/settings/settings/SettingsTab.tsx +++ b/app/components/settings/settings/SettingsTab.tsx @@ -6,6 +6,8 @@ import { Switch } from '~/components/ui/Switch'; import { themeStore, kTheme } from '~/lib/stores/theme'; import type { UserProfile } from '~/components/settings/settings.types'; import { settingsStyles } from '~/components/settings/settings.styles'; +import { useStore } from '@nanostores/react'; +import { shortcutsStore } from '~/lib/stores/settings'; export default function SettingsTab() { const [currentTimezone, setCurrentTimezone] = useState(''); @@ -212,6 +214,39 @@ export default function SettingsTab() {
+ + {/* Keyboard Shortcuts */} + +
+
+ Keyboard Shortcuts +
+ +
+ {Object.entries(useStore(shortcutsStore)).map(([name, shortcut]) => ( +
+ + {name.replace(/([A-Z])/g, ' $1').toLowerCase()} + +
+ {shortcut.ctrlOrMetaKey && ( + {navigator.platform.includes('Mac') ? '⌘' : 'Ctrl'} + )} + {shortcut.ctrlKey && Ctrl} + {shortcut.metaKey && ⌘} + {shortcut.shiftKey && ⇧} + {shortcut.altKey && ⌥} + {shortcut.key.toUpperCase()} +
+
+ ))} +
+
); } diff --git a/app/components/settings/shared/DraggableTabList.tsx b/app/components/settings/shared/DraggableTabList.tsx index 9f2a83b..5a58374 100644 --- a/app/components/settings/shared/DraggableTabList.tsx +++ b/app/components/settings/shared/DraggableTabList.tsx @@ -36,7 +36,7 @@ const DraggableTabItem = ({ onWindowChange, onVisibilityChange, }: DraggableTabItemProps) => { - const [{ isDragging }, drag] = useDrag({ + const [{ isDragging }, dragRef] = useDrag({ type: 'tab', item: { type: 'tab', index, id: tab.id }, collect: (monitor) => ({ @@ -44,7 +44,7 @@ const DraggableTabItem = ({ }), }); - const [, drop] = useDrop({ + const [, dropRef] = useDrop({ accept: 'tab', hover: (item: DragItem, monitor) => { if (!monitor.isOver({ shallow: true })) { @@ -64,9 +64,14 @@ const DraggableTabItem = ({ }, }); + const ref = (node: HTMLDivElement | null) => { + dragRef(node); + dropRef(node); + }; + return ( drag(drop(node))} + ref={ref} initial={false} animate={{ scale: isDragging ? 1.02 : 1, diff --git a/app/components/settings/shared/TabTile.tsx b/app/components/settings/shared/TabTile.tsx index f4358cb..d93ab82 100644 --- a/app/components/settings/shared/TabTile.tsx +++ b/app/components/settings/shared/TabTile.tsx @@ -55,7 +55,7 @@ export const TabTile = ({ 'border border-[#E5E5E5]/50 dark:border-[#333333]/50', // Shadow and glass effect - 'shadow-sm backdrop-blur-sm', + 'shadow-sm', 'dark:shadow-[0_0_15px_rgba(0,0,0,0.1)]', 'dark:bg-opacity-50', diff --git a/app/components/settings/user/UsersWindow.tsx b/app/components/settings/user/UsersWindow.tsx index 6f31b3e..b1dc030 100644 --- a/app/components/settings/user/UsersWindow.tsx +++ b/app/components/settings/user/UsersWindow.tsx @@ -1,7 +1,7 @@ import * as RadixDialog from '@radix-ui/react-dialog'; import * as DropdownMenu from '@radix-ui/react-dropdown-menu'; import { motion } from 'framer-motion'; -import { useState, useEffect } from 'react'; +import React, { useState, useEffect, useMemo } from 'react'; import { classNames } from '~/utils/classNames'; import { DialogTitle } from '~/components/ui/Dialog'; import { Switch } from '~/components/ui/Switch'; @@ -9,7 +9,6 @@ import type { TabType, TabVisibilityConfig } from '~/components/settings/setting import { TAB_LABELS } from '~/components/settings/settings.types'; import { DeveloperWindow } from '~/components/settings/developer/DeveloperWindow'; import { TabTile } from '~/components/settings/shared/TabTile'; -import { tabConfigurationStore, updateTabConfiguration } from '~/lib/stores/settings'; import { useStore } from '@nanostores/react'; import { DndProvider, useDrag, useDrop } from 'react-dnd'; import { HTML5Backend } from 'react-dnd-html5-backend'; @@ -30,6 +29,13 @@ import { useDebugStatus } from '~/lib/hooks/useDebugStatus'; import CloudProvidersTab from '~/components/settings/providers/CloudProvidersTab'; import LocalProvidersTab from '~/components/settings/providers/LocalProvidersTab'; import TaskManagerTab from '~/components/settings/task-manager/TaskManagerTab'; +import { + tabConfigurationStore, + resetTabConfiguration, + updateTabConfiguration, + developerModeStore, + setDeveloperMode, +} from '~/lib/stores/settings'; interface DraggableTabTileProps { tab: TabVisibilityConfig; @@ -89,8 +95,14 @@ const DraggableTabTile = ({ }, }); + const dragDropRef = (node: HTMLDivElement | null) => { + if (node) { + drag(drop(node)); + } + }; + return ( -
drag(drop(node))} style={{ opacity: isDragging ? 0.5 : 1 }}> +
{ - const [developerMode, setDeveloperMode] = useState(false); const [activeTab, setActiveTab] = useState(null); const [loadingTab, setLoadingTab] = useState(null); const tabConfiguration = useStore(tabConfigurationStore); + const developerMode = useStore(developerModeStore); + const [showDeveloperWindow, setShowDeveloperWindow] = useState(false); + const [profile, setProfile] = useState(() => { + const saved = localStorage.getItem('bolt_user_profile'); + return saved ? JSON.parse(saved) : { avatar: null, notifications: true }; + }); // Status hooks const { hasUpdate, currentVersion, acknowledgeUpdate } = useUpdateCheck(); @@ -122,11 +139,7 @@ export const UsersWindow = ({ open, onClose }: UsersWindowProps) => { const { hasConnectionIssues, currentIssue, acknowledgeIssue } = useConnectionStatus(); const { hasActiveWarnings, activeIssues, acknowledgeAllIssues } = useDebugStatus(); - const [profile, setProfile] = useState(() => { - const saved = localStorage.getItem('bolt_user_profile'); - return saved ? JSON.parse(saved) : { avatar: null, notifications: true }; - }); - + // Listen for profile changes useEffect(() => { const handleStorageChange = (e: StorageEvent) => { if (e.key === 'bolt_user_profile') { @@ -140,8 +153,66 @@ export const UsersWindow = ({ open, onClose }: UsersWindowProps) => { return () => window.removeEventListener('storage', handleStorageChange); }, []); + // Listen for settings toggle event + useEffect(() => { + const handleToggleSettings = () => { + if (!open) { + // Open settings panel + setActiveTab('settings'); + onClose(); // Close any other open panels + } + }; + + document.addEventListener('toggle-settings', handleToggleSettings); + + return () => document.removeEventListener('toggle-settings', handleToggleSettings); + }, [open, onClose]); + + // Ensure tab configuration is properly initialized + useEffect(() => { + if (!tabConfiguration || !tabConfiguration.userTabs || !tabConfiguration.developerTabs) { + console.warn('Tab configuration is invalid, resetting to defaults'); + resetTabConfiguration(); + } else { + // Validate tab configuration structure + const isValid = + tabConfiguration.userTabs.every( + (tab) => + tab && + typeof tab.id === 'string' && + typeof tab.visible === 'boolean' && + typeof tab.window === 'string' && + typeof tab.order === 'number', + ) && + tabConfiguration.developerTabs.every( + (tab) => + tab && + typeof tab.id === 'string' && + typeof tab.visible === 'boolean' && + typeof tab.window === 'string' && + typeof tab.order === 'number', + ); + + if (!isValid) { + console.warn('Tab configuration is malformed, resetting to defaults'); + resetTabConfiguration(); + } + } + }, [tabConfiguration]); + + // Handle developer mode changes const handleDeveloperModeChange = (checked: boolean) => { setDeveloperMode(checked); + + if (checked) { + setShowDeveloperWindow(true); + } + }; + + // Handle developer window close + const handleDeveloperWindowClose = () => { + setShowDeveloperWindow(false); + setDeveloperMode(false); }; const handleBack = () => { @@ -149,21 +220,55 @@ export const UsersWindow = ({ open, onClose }: UsersWindowProps) => { }; // Only show tabs that are assigned to the user window AND are visible - const visibleUserTabs = tabConfiguration.userTabs - .filter((tab) => { - // Hide notifications tab if notifications are disabled - if (tab.id === 'notifications' && !profile.notifications) { - return false; - } + const visibleUserTabs = useMemo(() => { + console.log('Filtering user tabs with configuration:', tabConfiguration); - return tab.visible; - }) - .sort((a: TabVisibilityConfig, b: TabVisibilityConfig) => (a.order || 0) - (b.order || 0)); + if (!tabConfiguration?.userTabs || !Array.isArray(tabConfiguration.userTabs)) { + console.warn('Invalid tab configuration, using empty array'); + return []; + } + + return tabConfiguration.userTabs + .filter((tab) => { + if (!tab || typeof tab.id !== 'string') { + console.warn('Invalid tab entry:', tab); + return false; + } + + // Hide notifications tab if notifications are disabled + if (tab.id === 'notifications' && !profile.notifications) { + console.log('Hiding notifications tab due to disabled notifications'); + return false; + } + + // Ensure the tab has the required properties + if (typeof tab.visible !== 'boolean' || typeof tab.window !== 'string' || typeof tab.order !== 'number') { + console.warn('Tab missing required properties:', tab); + return false; + } + + // Only show tabs that are explicitly visible and assigned to the user window + const isVisible = tab.visible && tab.window === 'user'; + console.log(`Tab ${tab.id} visibility:`, isVisible); + + return isVisible; + }) + .sort((a: TabVisibilityConfig, b: TabVisibilityConfig) => { + const orderA = typeof a.order === 'number' ? a.order : 0; + const orderB = typeof b.order === 'number' ? b.order : 0; + + return orderA - orderB; + }); + }, [tabConfiguration, profile.notifications]); + + console.log('Filtered visible user tabs:', visibleUserTabs); const moveTab = (dragIndex: number, hoverIndex: number) => { const draggedTab = visibleUserTabs[dragIndex]; const targetTab = visibleUserTabs[hoverIndex]; + console.log('Moving tab:', { draggedTab, targetTab }); + // Update the order of the dragged and target tabs const updatedDraggedTab = { ...draggedTab, order: targetTab.order }; const updatedTargetTab = { ...targetTab, order: draggedTab.order }; @@ -310,7 +415,7 @@ export const UsersWindow = ({ open, onClose }: UsersWindowProps) => { className="data-[state=checked]:bg-purple-500" aria-label="Toggle developer mode" /> - +
@@ -412,9 +517,9 @@ export const UsersWindow = ({ open, onClose }: UsersWindowProps) => { return ( <> - setDeveloperMode(false)} /> + - +
diff --git a/app/components/workbench/FileBreadcrumb.tsx b/app/components/workbench/FileBreadcrumb.tsx index 0ffbb2f..46a3948 100644 --- a/app/components/workbench/FileBreadcrumb.tsx +++ b/app/components/workbench/FileBreadcrumb.tsx @@ -87,7 +87,9 @@ export const FileBreadcrumb = memo(({ files, pathSegments = (segmentRefs.current[index] = ref)} + ref={(ref) => { + segmentRefs.current[index] = ref; + }} className={classNames('flex items-center gap-1.5 cursor-pointer shrink-0', { 'text-bolt-elements-textTertiary hover:text-bolt-elements-textPrimary': !isActive, 'text-bolt-elements-textPrimary underline': isActive, diff --git a/app/lib/stores/settings.ts b/app/lib/stores/settings.ts index 26c1435..7c96392 100644 --- a/app/lib/stores/settings.ts +++ b/app/lib/stores/settings.ts @@ -5,6 +5,8 @@ import type { IProviderConfig } from '~/types/model'; import type { TabVisibilityConfig, TabWindowConfig } from '~/components/settings/settings.types'; import { DEFAULT_TAB_CONFIG } from '~/components/settings/settings.types'; import Cookies from 'js-cookie'; +import { toggleTheme } from './theme'; +import { chatStore } from './chat'; export interface Shortcut { key: string; @@ -18,6 +20,9 @@ export interface Shortcut { export interface Shortcuts { toggleTerminal: Shortcut; + toggleTheme: Shortcut; + toggleChat: Shortcut; + toggleSettings: Shortcut; } export const URL_CONFIGURABLE_PROVIDERS = ['Ollama', 'LMStudio', 'OpenAILike']; @@ -31,6 +36,25 @@ export const shortcutsStore = map({ ctrlOrMetaKey: true, action: () => workbenchStore.toggleTerminal(), }, + toggleTheme: { + key: 't', + ctrlOrMetaKey: true, + shiftKey: true, + action: () => toggleTheme(), + }, + toggleChat: { + key: '/', + ctrlOrMetaKey: true, + action: () => chatStore.setKey('showChat', !chatStore.get().showChat), + }, + toggleSettings: { + key: ',', + ctrlOrMetaKey: true, + action: () => { + // This will be connected to the settings panel toggle + document.dispatchEvent(new CustomEvent('toggle-settings')); + }, + }, }); const initialProviderSettings: ProviderSetting = {}; @@ -70,18 +94,69 @@ export const enableContextOptimizationStore = atom(false); // Initialize tab configuration from cookie or default const savedTabConfig = Cookies.get('tabConfiguration'); -const initialTabConfig: TabWindowConfig = savedTabConfig - ? JSON.parse(savedTabConfig) - : { +console.log('Saved tab configuration:', savedTabConfig); + +let initialTabConfig: TabWindowConfig; + +try { + if (savedTabConfig) { + const parsedConfig = JSON.parse(savedTabConfig); + + // Validate the parsed configuration + if ( + parsedConfig && + Array.isArray(parsedConfig.userTabs) && + Array.isArray(parsedConfig.developerTabs) && + parsedConfig.userTabs.every( + (tab: any) => + tab && + typeof tab.id === 'string' && + typeof tab.visible === 'boolean' && + typeof tab.window === 'string' && + typeof tab.order === 'number', + ) && + parsedConfig.developerTabs.every( + (tab: any) => + tab && + typeof tab.id === 'string' && + typeof tab.visible === 'boolean' && + typeof tab.window === 'string' && + typeof tab.order === 'number', + ) + ) { + initialTabConfig = parsedConfig; + console.log('Using saved tab configuration'); + } else { + console.warn('Invalid saved tab configuration, using defaults'); + initialTabConfig = { + userTabs: DEFAULT_TAB_CONFIG.filter((tab) => tab.window === 'user'), + developerTabs: DEFAULT_TAB_CONFIG.filter((tab) => tab.window === 'developer'), + }; + } + } else { + console.log('No saved tab configuration found, using defaults'); + initialTabConfig = { userTabs: DEFAULT_TAB_CONFIG.filter((tab) => tab.window === 'user'), developerTabs: DEFAULT_TAB_CONFIG.filter((tab) => tab.window === 'developer'), }; + } +} catch (error) { + console.error('Error loading tab configuration:', error); + initialTabConfig = { + userTabs: DEFAULT_TAB_CONFIG.filter((tab) => tab.window === 'user'), + developerTabs: DEFAULT_TAB_CONFIG.filter((tab) => tab.window === 'developer'), + }; +} + +console.log('Initial tab configuration:', initialTabConfig); export const tabConfigurationStore = map(initialTabConfig); // Helper function to update tab configuration export const updateTabConfiguration = (config: TabVisibilityConfig) => { const currentConfig = tabConfigurationStore.get(); + console.log('Current tab configuration before update:', currentConfig); + const isUserTab = config.window === 'user'; const targetArray = isUserTab ? 'userTabs' : 'developerTabs'; @@ -99,16 +174,38 @@ export const updateTabConfiguration = (config: TabVisibilityConfig) => { [targetArray]: updatedTabs, }; + console.log('New tab configuration after update:', newConfig); + tabConfigurationStore.set(newConfig); - Cookies.set('tabConfiguration', JSON.stringify(newConfig)); + Cookies.set('tabConfiguration', JSON.stringify(newConfig), { + expires: 365, // Set cookie to expire in 1 year + path: '/', + sameSite: 'strict', + }); }; // Helper function to reset tab configuration export const resetTabConfiguration = () => { + console.log('Resetting tab configuration to defaults'); + const defaultConfig: TabWindowConfig = { userTabs: DEFAULT_TAB_CONFIG.filter((tab) => tab.window === 'user'), developerTabs: DEFAULT_TAB_CONFIG.filter((tab) => tab.window === 'developer'), }; + + console.log('Default tab configuration:', defaultConfig); + tabConfigurationStore.set(defaultConfig); - Cookies.set('tabConfiguration', JSON.stringify(defaultConfig)); + Cookies.set('tabConfiguration', JSON.stringify(defaultConfig), { + expires: 365, // Set cookie to expire in 1 year + path: '/', + sameSite: 'strict', + }); +}; + +// Developer mode store +export const developerModeStore = atom(false); + +export const setDeveloperMode = (value: boolean) => { + developerModeStore.set(value); }; diff --git a/app/routes/api.system.git-info.ts b/app/routes/api.system.git-info.ts index e30c262..b71f770 100644 --- a/app/routes/api.system.git-info.ts +++ b/app/routes/api.system.git-info.ts @@ -2,7 +2,7 @@ import { json } from '@remix-run/node'; import type { LoaderFunctionArgs } from '@remix-run/node'; import { execSync } from 'child_process'; -export async function loader({ request }: LoaderFunctionArgs) { +export async function loader({ request: _request }: LoaderFunctionArgs) { try { const branch = execSync('git rev-parse --abbrev-ref HEAD').toString().trim(); const commit = execSync('git rev-parse --short HEAD').toString().trim(); diff --git a/package.json b/package.json index 6ea47a5..7954f5c 100644 --- a/package.json +++ b/package.json @@ -59,16 +59,17 @@ "@octokit/rest": "^21.0.2", "@octokit/types": "^13.6.2", "@openrouter/ai-sdk-provider": "^0.0.5", + "@phosphor-icons/react": "^2.1.7", "@radix-ui/react-context-menu": "^2.2.2", "@radix-ui/react-dialog": "^1.1.2", "@radix-ui/react-dropdown-menu": "^2.1.2", "@radix-ui/react-separator": "^1.1.0", "@radix-ui/react-switch": "^1.1.1", "@radix-ui/react-tooltip": "^1.1.4", - "@remix-run/cloudflare": "^2.15.0", - "@remix-run/cloudflare-pages": "^2.15.0", + "@remix-run/cloudflare": "^2.15.2", + "@remix-run/cloudflare-pages": "^2.15.2", "@remix-run/node": "^2.15.2", - "@remix-run/react": "^2.15.0", + "@remix-run/react": "^2.15.2", "@uiw/codemirror-theme-vscode": "^4.23.6", "@unocss/reset": "^0.61.9", "@webcontainer/api": "1.3.0-internal.10", @@ -118,7 +119,7 @@ "@cloudflare/workers-types": "^4.20241127.0", "@iconify-json/ph": "^1.2.1", "@iconify/types": "^2.0.0", - "@remix-run/dev": "^2.15.0", + "@remix-run/dev": "^2.15.2", "@types/diff": "^5.2.3", "@types/dom-speech-recognition": "^0.0.4", "@types/file-saver": "^2.0.7", diff --git a/pages/api/system/git-info.ts b/pages/api/system/git-info.ts index 0261910..a14dc27 100644 --- a/pages/api/system/git-info.ts +++ b/pages/api/system/git-info.ts @@ -1,4 +1,4 @@ -import { NextApiRequest, NextApiResponse } from 'next'; +import type { NextApiRequest, NextApiResponse } from 'next'; import { execSync } from 'child_process'; export default async function handler(req: NextApiRequest, res: NextApiResponse) { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b1714f4..82a8b1c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -98,6 +98,9 @@ importers: '@openrouter/ai-sdk-provider': specifier: ^0.0.5 version: 0.0.5(zod@3.23.8) + '@phosphor-icons/react': + specifier: ^2.1.7 + version: 2.1.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@radix-ui/react-context-menu': specifier: ^2.2.2 version: 2.2.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -117,17 +120,17 @@ importers: specifier: ^1.1.4 version: 1.1.4(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@remix-run/cloudflare': - specifier: ^2.15.0 - version: 2.15.0(@cloudflare/workers-types@4.20241127.0)(typescript@5.7.2) + specifier: ^2.15.2 + version: 2.15.2(@cloudflare/workers-types@4.20241127.0)(typescript@5.7.2) '@remix-run/cloudflare-pages': - specifier: ^2.15.0 - version: 2.15.0(@cloudflare/workers-types@4.20241127.0)(typescript@5.7.2) + specifier: ^2.15.2 + version: 2.15.2(@cloudflare/workers-types@4.20241127.0)(typescript@5.7.2) '@remix-run/node': specifier: ^2.15.2 version: 2.15.2(typescript@5.7.2) '@remix-run/react': - specifier: ^2.15.0 - version: 2.15.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.2) + specifier: ^2.15.2 + version: 2.15.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.2) '@uiw/codemirror-theme-vscode': specifier: ^4.23.6 version: 4.23.6(@codemirror/language@6.10.6)(@codemirror/state@6.4.1)(@codemirror/view@6.35.0) @@ -211,7 +214,7 @@ importers: version: 5.3.0(chart.js@4.4.7)(react@18.3.1) react-dnd: specifier: ^16.0.1 - version: 16.0.1(@types/node@22.10.1)(@types/react@18.3.12)(react@18.3.1) + version: 16.0.1(@types/node@22.10.10)(@types/react@18.3.12)(react@18.3.1) react-dnd-html5-backend: specifier: ^16.0.1 version: 16.0.1 @@ -244,10 +247,10 @@ importers: version: 4.0.0 remix-island: specifier: ^0.2.0 - version: 0.2.0(@remix-run/react@2.15.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.2))(@remix-run/server-runtime@2.15.2(typescript@5.7.2))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + version: 0.2.0(@remix-run/react@2.15.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.2))(@remix-run/server-runtime@2.15.2(typescript@5.7.2))(react-dom@18.3.1(react@18.3.1))(react@18.3.1) remix-utils: specifier: ^7.7.0 - version: 7.7.0(@remix-run/cloudflare@2.15.0(@cloudflare/workers-types@4.20241127.0)(typescript@5.7.2))(@remix-run/node@2.15.2(typescript@5.7.2))(@remix-run/react@2.15.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.2))(@remix-run/router@1.21.0)(react@18.3.1)(zod@3.23.8) + version: 7.7.0(@remix-run/cloudflare@2.15.2(@cloudflare/workers-types@4.20241127.0)(typescript@5.7.2))(@remix-run/node@2.15.2(typescript@5.7.2))(@remix-run/react@2.15.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.2))(@remix-run/router@1.21.0)(react@18.3.1)(zod@3.23.8) shiki: specifier: ^1.24.0 version: 1.24.0 @@ -260,7 +263,7 @@ importers: devDependencies: '@blitz/eslint-plugin': specifier: 0.1.0 - version: 0.1.0(@types/eslint@8.56.10)(jiti@1.21.6)(prettier@3.4.1)(typescript@5.7.2) + version: 0.1.0(@types/eslint@8.56.10)(jiti@1.21.7)(prettier@3.4.1)(typescript@5.7.2) '@cloudflare/workers-types': specifier: ^4.20241127.0 version: 4.20241127.0 @@ -271,8 +274,8 @@ importers: specifier: ^2.0.0 version: 2.0.0 '@remix-run/dev': - specifier: ^2.15.0 - version: 2.15.0(@remix-run/react@2.15.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.2))(@types/node@22.10.1)(sass-embedded@1.81.0)(typescript@5.7.2)(vite@5.4.11(@types/node@22.10.1)(sass-embedded@1.81.0))(wrangler@3.91.0(@cloudflare/workers-types@4.20241127.0)) + specifier: ^2.15.2 + version: 2.15.2(@remix-run/react@2.15.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.2))(@types/node@22.10.10)(sass-embedded@1.81.0)(typescript@5.7.2)(vite@5.4.11(@types/node@22.10.10)(sass-embedded@1.81.0))(wrangler@3.91.0(@cloudflare/workers-types@4.20241127.0)) '@types/diff': specifier: ^5.2.3 version: 5.2.3 @@ -320,22 +323,22 @@ importers: version: 11.0.5 unocss: specifier: ^0.61.9 - version: 0.61.9(postcss@8.4.49)(rollup@4.28.0)(vite@5.4.11(@types/node@22.10.1)(sass-embedded@1.81.0)) + version: 0.61.9(postcss@8.5.1)(rollup@4.28.0)(vite@5.4.11(@types/node@22.10.10)(sass-embedded@1.81.0)) vite: specifier: ^5.4.11 - version: 5.4.11(@types/node@22.10.1)(sass-embedded@1.81.0) + version: 5.4.11(@types/node@22.10.10)(sass-embedded@1.81.0) vite-plugin-node-polyfills: specifier: ^0.22.0 - version: 0.22.0(rollup@4.28.0)(vite@5.4.11(@types/node@22.10.1)(sass-embedded@1.81.0)) + version: 0.22.0(rollup@4.28.0)(vite@5.4.11(@types/node@22.10.10)(sass-embedded@1.81.0)) vite-plugin-optimize-css-modules: specifier: ^1.1.0 - version: 1.1.0(vite@5.4.11(@types/node@22.10.1)(sass-embedded@1.81.0)) + version: 1.1.0(vite@5.4.11(@types/node@22.10.10)(sass-embedded@1.81.0)) vite-tsconfig-paths: specifier: ^4.3.2 - version: 4.3.2(typescript@5.7.2)(vite@5.4.11(@types/node@22.10.1)(sass-embedded@1.81.0)) + version: 4.3.2(typescript@5.7.2)(vite@5.4.11(@types/node@22.10.10)(sass-embedded@1.81.0)) vitest: specifier: ^2.1.7 - version: 2.1.8(@types/node@22.10.1)(sass-embedded@1.81.0) + version: 2.1.8(@types/node@22.10.10)(sass-embedded@1.81.0) wrangler: specifier: ^3.91.0 version: 3.91.0(@cloudflare/workers-types@4.20241127.0) @@ -627,6 +630,10 @@ packages: resolution: {integrity: sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==} engines: {node: '>=6.9.0'} + '@babel/generator@7.26.5': + resolution: {integrity: sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==} + engines: {node: '>=6.9.0'} + '@babel/helper-annotate-as-pure@7.25.9': resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==} engines: {node: '>=6.9.0'} @@ -663,6 +670,10 @@ packages: resolution: {integrity: sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==} engines: {node: '>=6.9.0'} + '@babel/helper-plugin-utils@7.26.5': + resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==} + engines: {node: '>=6.9.0'} + '@babel/helper-replace-supers@7.25.9': resolution: {integrity: sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==} engines: {node: '>=6.9.0'} @@ -698,6 +709,11 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + '@babel/parser@7.26.5': + resolution: {integrity: sha512-SRJ4jYmXRqV1/Xc+TIVG84WjHBXKlxO9sHQnA2Pf12QQEAp1LOh6kDzNHXcUnbH1QI0FDoPPVOt+vyUDucxpaw==} + engines: {node: '>=6.0.0'} + hasBin: true + '@babel/plugin-syntax-decorators@7.25.9': resolution: {integrity: sha512-ryzI0McXUPJnRCvMo4lumIKZUzhYUO/ScI+Mz4YVaTLt04DHNSjEUjKVvbzQjZFLuod/cYEc07mJWhzl6v4DPg==} engines: {node: '>=6.9.0'} @@ -746,10 +762,18 @@ packages: resolution: {integrity: sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==} engines: {node: '>=6.9.0'} + '@babel/traverse@7.26.5': + resolution: {integrity: sha512-rkOSPOw+AXbgtwUga3U4u8RpoK9FEFWBNAlTpcnkLFjL5CT+oyHNuUUC/xx6XefEJ16r38r8Bc/lfp6rYuHeJQ==} + engines: {node: '>=6.9.0'} + '@babel/types@7.26.0': resolution: {integrity: sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==} engines: {node: '>=6.9.0'} + '@babel/types@7.26.5': + resolution: {integrity: sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg==} + engines: {node: '>=6.9.0'} + '@blitz/eslint-plugin@0.1.0': resolution: {integrity: sha512-mGEAFWCI5AQ4nrePhjp2WzvRen+UWR+SF4MvH70icIBClR08Gm3dT9MRa2jszOpfY00NyIYfm7/1CFZ37GvW4g==} engines: {node: ^18.0.0 || ^20.0.0} @@ -1634,6 +1658,10 @@ packages: resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} engines: {node: '>=6.0.0'} + '@jridgewell/gen-mapping@0.3.8': + resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} + engines: {node: '>=6.0.0'} + '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} @@ -1841,6 +1869,13 @@ packages: resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} engines: {node: '>=8.0.0'} + '@phosphor-icons/react@2.1.7': + resolution: {integrity: sha512-g2e2eVAn1XG2a+LI09QU3IORLhnFNAFkNbo2iwbX6NOKSLOwvEMmTa7CgOzEbgNWR47z8i8kwjdvYZ5fkGx1mQ==} + engines: {node: '>=10'} + peerDependencies: + react: '>= 16.8' + react-dom: '>= 16.8' + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -2248,8 +2283,8 @@ packages: peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - '@remix-run/cloudflare-pages@2.15.0': - resolution: {integrity: sha512-3FjiON0BmEH3fwGdmP6eEf9TL5BejCt9LOMnszefDGdwY7kgXCodJNr8TAYseor6m7LlC4xgSkgkgj/YRIZTGA==} + '@remix-run/cloudflare-pages@2.15.2': + resolution: {integrity: sha512-gjq20Hs3tWwhhrIXu18hSXDyjWiJXopZUQVbT35uULy/ACEnEbhO1DnVGJzov7NdeMHI4x0O4O0rWg6ZXLtD/Q==} engines: {node: '>=18.0.0'} peerDependencies: '@cloudflare/workers-types': ^4.0.0 @@ -2258,8 +2293,8 @@ packages: typescript: optional: true - '@remix-run/cloudflare@2.15.0': - resolution: {integrity: sha512-X8Z3EDdlh/8Gjpu27gnJenN06Q9BtkxMEFt5op3y/qahCt0FH9A64DZQ5N47+WnFhySy6mOpzFwCAzPmGIuIeQ==} + '@remix-run/cloudflare@2.15.2': + resolution: {integrity: sha512-6D/WTx3IbQYCWQ/BVNRItXI2upgDvkcCVYwZhvIctF4o+5+IaF21ZA1HTekQEnBfmYTpffJ3Jko1sCkqoMeOdw==} engines: {node: '>=18.0.0'} peerDependencies: '@cloudflare/workers-types': ^4.0.0 @@ -2268,13 +2303,13 @@ packages: typescript: optional: true - '@remix-run/dev@2.15.0': - resolution: {integrity: sha512-iXV6u9PBwFc7KriDpVcjqLGJzZZd6ZOrxewen7hoH0OBzGwjkhtm46BTQEJrZ/e/dzlU1IU/0ylH29tN9BZoyg==} + '@remix-run/dev@2.15.2': + resolution: {integrity: sha512-o8lix8t4GBhtXjo/G1IzwtHVW5GRMs7amtFtBHiR1bhSyK7VyX5qGtTDmJyny5QDv83pxaLOCiE0dUng2BCoyQ==} engines: {node: '>=18.0.0'} hasBin: true peerDependencies: - '@remix-run/react': ^2.15.0 - '@remix-run/serve': ^2.15.0 + '@remix-run/react': ^2.15.2 + '@remix-run/serve': ^2.15.2 typescript: ^5.1.0 vite: ^5.1.0 wrangler: ^3.28.2 @@ -2288,15 +2323,6 @@ packages: wrangler: optional: true - '@remix-run/node@2.15.0': - resolution: {integrity: sha512-tWbR7pQ6gwj+MkGf6WVIYnjgfGfpdU8EOIa6xsCIRlrm0p3BtMz4jA3GvBWEpOuEnN5MV7CarVzhduaRzkZ0SQ==} - engines: {node: '>=18.0.0'} - peerDependencies: - typescript: ^5.1.0 - peerDependenciesMeta: - typescript: - optional: true - '@remix-run/node@2.15.2': resolution: {integrity: sha512-NS/h5uxje7DYCNgcKqKAiUhf0r2HVnoYUBWLyIIMmCUP1ddWurBP6xTPcWzGhEvV/EvguniYi1wJZ5+X8sonWw==} engines: {node: '>=18.0.0'} @@ -2306,8 +2332,8 @@ packages: typescript: optional: true - '@remix-run/react@2.15.0': - resolution: {integrity: sha512-puqDbi9N/WfaUhzDnw2pACXtCB7ukrtFJ9ILwpEuhlaTBpjefifJ89igokW+tt1ePphIFMivAm/YspcbZdCQsA==} + '@remix-run/react@2.15.2': + resolution: {integrity: sha512-NAAMsSgoC/sdOgovUewwRCE/RUm3F+MBxxZKfwu3POCNeHaplY5qGkH/y8PUXvdN1EBG7Z0Ko43dyzCfcEy5PA==} engines: {node: '>=18.0.0'} peerDependencies: react: ^18.0.0 @@ -2321,15 +2347,6 @@ packages: resolution: {integrity: sha512-xfSkCAchbdG5PnbrKqFWwia4Bi61nH+wm8wLEqfHDyp7Y3dZzgqS2itV8i4gAq9pC2HsTpwyBC6Ds8VHZ96JlA==} engines: {node: '>=14.0.0'} - '@remix-run/server-runtime@2.15.0': - resolution: {integrity: sha512-FuM8vAg1sPskf4wn0ivbuj/7s9Qdh2wnKu+sVXqYz0a95gH5b73TuMzk6n3NMSkFVKKc6+UmlG1WLYre7L2LTg==} - engines: {node: '>=18.0.0'} - peerDependencies: - typescript: ^5.1.0 - peerDependenciesMeta: - typescript: - optional: true - '@remix-run/server-runtime@2.15.2': resolution: {integrity: sha512-OqiPcvEnnU88B8b1LIWHHkQ3Tz2GDAmQ1RihFNQsbrFKpDsQLkw0lJlnfgKA/uHd0CEEacpfV7C9qqJT3V6Z2g==} engines: {node: '>=18.0.0'} @@ -2742,6 +2759,9 @@ packages: '@types/node@22.10.1': resolution: {integrity: sha512-qKgsUwfHZV2WCWLAnVP1JqnpE6Im6h3Y0+fYgMTasNQ7V++CBX5OT1as0g0f+OyubbFqhf6XVNIsmN4IIhEgGQ==} + '@types/node@22.10.10': + resolution: {integrity: sha512-X47y/mPNzxviAGY5TcYPtYL8JsY3kAq2n8fMmKoRCxq/c4v4pyGNCzM2R6+M5/umG4ZfHuT+sgqDYqWc9rJ6ww==} + '@types/prop-types@15.7.13': resolution: {integrity: sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==} @@ -2921,11 +2941,11 @@ packages: peerDependencies: vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 - '@vanilla-extract/babel-plugin-debug-ids@1.1.0': - resolution: {integrity: sha512-Zy9bKjaL2P5zsrFYQJ8IjWGlFODmZrpvFmjFE0Zv8om55Pz1JtpJtL6DvlxlWUxbVaP1HKCqsmEfFOZN8fX/ZQ==} + '@vanilla-extract/babel-plugin-debug-ids@1.2.0': + resolution: {integrity: sha512-z5nx2QBnOhvmlmBKeRX5sPVLz437wV30u+GJL+Hzj1rGiJYVNvgIIlzUpRNjVQ0MgAgiQIqIUbqPnmMc6HmDlQ==} - '@vanilla-extract/css@1.16.1': - resolution: {integrity: sha512-3jKxH5ty/ZjmGoLAx8liY7e87FRCIJfnuufX/K9fQklu0YHP3ClrNisU++LkZuD+GZleqMSAQMF0r8Otln+OPQ==} + '@vanilla-extract/css@1.17.0': + resolution: {integrity: sha512-W6FqVFDD+C71ZlKsuj0MxOXSvHb1tvQ9h/+79aYfi097wLsALrnnBzd0by8C///iurrpQ3S+SH74lXd7Lr9MvA==} '@vanilla-extract/integration@6.5.0': resolution: {integrity: sha512-E2YcfO8vA+vs+ua+gpvy1HRqvgWbI+MTlUpxA8FvatOvybuNcWAY0CKwQ/Gpj7rswYKtC6C7+xw33emM6/ImdQ==} @@ -3202,10 +3222,18 @@ packages: resolution: {integrity: sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + call-bind-apply-helpers@1.0.1: + resolution: {integrity: sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==} + engines: {node: '>= 0.4'} + call-bind@1.0.7: resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} engines: {node: '>= 0.4'} + call-bound@1.0.3: + resolution: {integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==} + engines: {node: '>= 0.4'} + callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} @@ -3454,6 +3482,15 @@ packages: supports-color: optional: true + debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + decode-named-character-reference@1.0.2: resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} @@ -3549,6 +3586,10 @@ packages: resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} engines: {node: '>=12'} + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + duplexer@0.1.2: resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} @@ -3602,6 +3643,10 @@ packages: resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} engines: {node: '>= 0.4'} + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + es-errors@1.3.0: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} @@ -3609,6 +3654,13 @@ packages: es-module-lexer@1.5.4: resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==} + es-module-lexer@1.6.0: + resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + esbuild-plugins-node-modules-polyfill@1.6.8: resolution: {integrity: sha512-bRB4qbgUDWrdY1eMk123KiaCSW9VzQ+QLZrmU7D//cCFkmksPd9mUMpmWoFK/rxjIeTfTSOpKCoGoimlvI+AWw==} engines: {node: '>=14.0.0'} @@ -3812,8 +3864,8 @@ packages: resolution: {integrity: sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==} engines: {node: '>=12.0.0'} - express@4.21.1: - resolution: {integrity: sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==} + express@4.21.2: + resolution: {integrity: sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==} engines: {node: '>= 0.10.0'} extend@3.0.2: @@ -3946,6 +3998,10 @@ packages: resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} engines: {node: '>= 0.4'} + get-intrinsic@1.2.7: + resolution: {integrity: sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==} + engines: {node: '>= 0.4'} + get-nonce@1.0.1: resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} engines: {node: '>=6'} @@ -3954,6 +4010,10 @@ packages: resolution: {integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==} engines: {node: '>=8'} + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + get-source@2.0.12: resolution: {integrity: sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w==} @@ -3998,6 +4058,10 @@ packages: resolution: {integrity: sha512-FQoVQnqcdk4hVM4JN1eromaun4iuS34oStkdlLENLdpULsuQcTyXj8w7ayhuUfPwEYZ1ZOooOTT6fdA9Vmx/RA==} engines: {node: '>= 0.4'} + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} @@ -4198,6 +4262,10 @@ packages: resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} engines: {node: '>= 0.4'} + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + is-decimal@2.0.1: resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} @@ -4294,8 +4362,8 @@ packages: javascript-stringify@2.1.0: resolution: {integrity: sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg==} - jiti@1.21.6: - resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==} + jiti@1.21.7: + resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} hasBin: true jiti@2.0.0-beta.3: @@ -4374,8 +4442,8 @@ packages: lie@3.3.0: resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} - lilconfig@3.1.2: - resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==} + lilconfig@3.1.3: + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} engines: {node: '>=14'} load-tsconfig@0.2.5: @@ -4443,6 +4511,10 @@ packages: markdown-table@3.0.4: resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + md5.js@1.3.5: resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==} @@ -4821,6 +4893,9 @@ packages: mlly@1.7.3: resolution: {integrity: sha512-xUsx5n/mN0uQf4V548PKQ+YShA4/IW0KI1dZhrNrPCLG+xizETbHTkOa1f8/xut9JRPp8kQuMnz0oqwkTiLo/A==} + mlly@1.7.4: + resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} + modern-ahocorasick@1.1.0: resolution: {integrity: sha512-sEKPVl2rM+MNVkGQt3ChdmD8YsigmXdn5NifZn6jiwn9LRJpWm8F3guhaqrJT/JOat6pwpbXEk6kv+b9DMIjsQ==} @@ -5032,6 +5107,9 @@ packages: parse-entities@4.0.1: resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==} + parse-entities@4.0.2: + resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} + parse-ms@2.1.0: resolution: {integrity: sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==} engines: {node: '>=6'} @@ -5064,8 +5142,8 @@ packages: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} - path-to-regexp@0.1.10: - resolution: {integrity: sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==} + path-to-regexp@0.1.12: + resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==} path-to-regexp@6.3.0: resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} @@ -5073,6 +5151,9 @@ packages: pathe@1.1.2: resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + pathe@2.0.2: + resolution: {integrity: sha512-15Ztpk+nov8DR524R4BF7uEuzESgzUEAV4Ah7CUMNGXdE5ELuvxElxGXndBl32vMSsWa1jpNf22Z+Er3sKwq+w==} + pathval@2.0.0: resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} engines: {node: '>= 14.16'} @@ -5117,6 +5198,9 @@ packages: pkg-types@1.2.1: resolution: {integrity: sha512-sQoqa8alT3nHjGuTjuKgOnvjo4cljkufdtLMnO2LBP/wRwuDlo1tkaEdMxCRhyGRPacv/ztlZgDPm2b7FAmEvw==} + pkg-types@1.3.1: + resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + pnpm@9.14.4: resolution: {integrity: sha512-yBgLP75OS8oCyUI0cXiWtVKXQKbLrfGfp4JUJwQD6i8n1OHUagig9WyJtj3I6/0+5TMm2nICc3lOYgD88NGEqw==} engines: {node: '>=18.12'} @@ -5150,8 +5234,8 @@ packages: peerDependencies: postcss: ^8.1.0 - postcss-modules-local-by-default@4.1.0: - resolution: {integrity: sha512-rm0bdSv4jC3BDma3s9H19ZddW0aHX6EoqwDYU2IfZhRN+53QrufTRo2IdkAbRqLx4R2IYbZnbjKKxg4VN5oU9Q==} + postcss-modules-local-by-default@4.2.0: + resolution: {integrity: sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==} engines: {node: ^10 || ^12 || >= 14} peerDependencies: postcss: ^8.1.0 @@ -5188,6 +5272,10 @@ packages: resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==} engines: {node: ^10 || ^12 || >=14} + postcss@8.5.1: + resolution: {integrity: sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==} + engines: {node: ^10 || ^12 || >=14} + prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} @@ -5370,15 +5458,15 @@ packages: react: ^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc react-dom: ^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc - react-router-dom@6.28.0: - resolution: {integrity: sha512-kQ7Unsl5YdyOltsPGl31zOjLrDv+m2VcIEcIHqYYD3Lp0UppLjrzcfJqDJwXxFw3TH/yvapbnUvPlAj7Kx5nbg==} + react-router-dom@6.28.1: + resolution: {integrity: sha512-YraE27C/RdjcZwl5UCqF/ffXnZDxpJdk9Q6jw38SZHjXs7NNdpViq2l2c7fO7+4uWaEfcwfGCv3RSg4e1By/fQ==} engines: {node: '>=14.0.0'} peerDependencies: react: '>=16.8' react-dom: '>=16.8' - react-router@6.28.0: - resolution: {integrity: sha512-HrYdIFqdrnhDw0PqG/AKjAqEqM7AvxCz0DQ4h2W8k6nqmc5uRBYDag0SBxx9iYz5G8gnuNVLzUe13wl9eAsXXg==} + react-router@6.28.1: + resolution: {integrity: sha512-2omQTA3rkMljmrvvo6WtewGdVh45SpL9hGiCI9uUrwGGfNFDIvGK4gYJsKlJoNVi6AQZcopSCballL+QGOm7fA==} engines: {node: '>=14.0.0'} peerDependencies: react: '>=16.8' @@ -5759,10 +5847,26 @@ packages: shiki@1.24.0: resolution: {integrity: sha512-qIneep7QRwxRd5oiHb8jaRzH15V/S8F3saCXOdjwRLgozZJr5x2yeBhQtqkO3FSzQDwYEFAYuifg4oHjpDghrg==} + side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + + side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + + side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + side-channel@1.0.6: resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} engines: {node: '>= 0.4'} + side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} @@ -5817,8 +5921,8 @@ packages: spdx-expression-parse@3.0.1: resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} - spdx-license-ids@3.0.20: - resolution: {integrity: sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==} + spdx-license-ids@3.0.21: + resolution: {integrity: sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==} ssri@10.0.6: resolution: {integrity: sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==} @@ -5961,8 +6065,8 @@ packages: tailwind-merge@2.6.0: resolution: {integrity: sha512-P+Vu1qXfzediirmHOC3xKGAYeZtPcV9g76X+xg2FD4tYgR71ewMA35Y3sCz3zhiN/dwefRpJX0yBcgwi1fXNQA==} - tar-fs@2.1.1: - resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} + tar-fs@2.1.2: + resolution: {integrity: sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA==} tar-stream@2.2.0: resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} @@ -6470,8 +6574,8 @@ packages: yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - yaml@2.6.1: - resolution: {integrity: sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==} + yaml@2.7.0: + resolution: {integrity: sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==} engines: {node: '>= 14'} hasBin: true @@ -7080,6 +7184,14 @@ snapshots: '@jridgewell/trace-mapping': 0.3.25 jsesc: 3.0.2 + '@babel/generator@7.26.5': + dependencies: + '@babel/parser': 7.26.5 + '@babel/types': 7.26.5 + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 3.0.2 + '@babel/helper-annotate-as-pure@7.25.9': dependencies: '@babel/types': 7.26.0 @@ -7134,6 +7246,8 @@ snapshots: '@babel/helper-plugin-utils@7.25.9': {} + '@babel/helper-plugin-utils@7.26.5': {} + '@babel/helper-replace-supers@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 @@ -7172,10 +7286,14 @@ snapshots: dependencies: '@babel/types': 7.26.0 + '@babel/parser@7.26.5': + dependencies: + '@babel/types': 7.26.5 + '@babel/plugin-syntax-decorators@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.0)': dependencies: @@ -7240,24 +7358,41 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/traverse@7.26.5': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.5 + '@babel/parser': 7.26.5 + '@babel/template': 7.25.9 + '@babel/types': 7.26.5 + debug: 4.4.0 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + '@babel/types@7.26.0': dependencies: '@babel/helper-string-parser': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 - '@blitz/eslint-plugin@0.1.0(@types/eslint@8.56.10)(jiti@1.21.6)(prettier@3.4.1)(typescript@5.7.2)': + '@babel/types@7.26.5': dependencies: - '@stylistic/eslint-plugin-ts': 2.11.0(eslint@9.16.0(jiti@1.21.6))(typescript@5.7.2) - '@typescript-eslint/eslint-plugin': 8.17.0(@typescript-eslint/parser@8.17.0(eslint@9.16.0(jiti@1.21.6))(typescript@5.7.2))(eslint@9.16.0(jiti@1.21.6))(typescript@5.7.2) - '@typescript-eslint/parser': 8.17.0(eslint@9.16.0(jiti@1.21.6))(typescript@5.7.2) - '@typescript-eslint/utils': 8.17.0(eslint@9.16.0(jiti@1.21.6))(typescript@5.7.2) + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + + '@blitz/eslint-plugin@0.1.0(@types/eslint@8.56.10)(jiti@1.21.7)(prettier@3.4.1)(typescript@5.7.2)': + dependencies: + '@stylistic/eslint-plugin-ts': 2.11.0(eslint@9.16.0(jiti@1.21.7))(typescript@5.7.2) + '@typescript-eslint/eslint-plugin': 8.17.0(@typescript-eslint/parser@8.17.0(eslint@9.16.0(jiti@1.21.7))(typescript@5.7.2))(eslint@9.16.0(jiti@1.21.7))(typescript@5.7.2) + '@typescript-eslint/parser': 8.17.0(eslint@9.16.0(jiti@1.21.7))(typescript@5.7.2) + '@typescript-eslint/utils': 8.17.0(eslint@9.16.0(jiti@1.21.7))(typescript@5.7.2) common-tags: 1.8.2 - eslint: 9.16.0(jiti@1.21.6) - eslint-config-prettier: 9.1.0(eslint@9.16.0(jiti@1.21.6)) - eslint-plugin-jsonc: 2.18.2(eslint@9.16.0(jiti@1.21.6)) - eslint-plugin-prettier: 5.2.1(@types/eslint@8.56.10)(eslint-config-prettier@9.1.0(eslint@9.16.0(jiti@1.21.6)))(eslint@9.16.0(jiti@1.21.6))(prettier@3.4.1) + eslint: 9.16.0(jiti@1.21.7) + eslint-config-prettier: 9.1.0(eslint@9.16.0(jiti@1.21.7)) + eslint-plugin-jsonc: 2.18.2(eslint@9.16.0(jiti@1.21.7)) + eslint-plugin-prettier: 5.2.1(@types/eslint@8.56.10)(eslint-config-prettier@9.1.0(eslint@9.16.0(jiti@1.21.7)))(eslint@9.16.0(jiti@1.21.7))(prettier@3.4.1) globals: 15.13.0 - typescript-eslint: 8.17.0(eslint@9.16.0(jiti@1.21.6))(typescript@5.7.2) + typescript-eslint: 8.17.0(eslint@9.16.0(jiti@1.21.7))(typescript@5.7.2) transitivePeerDependencies: - '@eslint/json' - '@types/eslint' @@ -7723,9 +7858,9 @@ snapshots: '@esbuild/win32-x64@0.23.1': optional: true - '@eslint-community/eslint-utils@4.4.1(eslint@9.16.0(jiti@1.21.6))': + '@eslint-community/eslint-utils@4.4.1(eslint@9.16.0(jiti@1.21.7))': dependencies: - eslint: 9.16.0(jiti@1.21.6) + eslint: 9.16.0(jiti@1.21.7) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} @@ -7923,6 +8058,12 @@ snapshots: '@jridgewell/sourcemap-codec': 1.5.0 '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/gen-mapping@0.3.8': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/resolve-uri@3.1.2': {} '@jridgewell/set-array@1.2.1': {} @@ -8167,6 +8308,11 @@ snapshots: '@opentelemetry/api@1.9.0': {} + '@phosphor-icons/react@2.1.7(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + '@pkgjs/parseargs@0.11.0': optional: true @@ -8556,51 +8702,51 @@ snapshots: dependencies: react: 18.3.1 - '@remix-run/cloudflare-pages@2.15.0(@cloudflare/workers-types@4.20241127.0)(typescript@5.7.2)': + '@remix-run/cloudflare-pages@2.15.2(@cloudflare/workers-types@4.20241127.0)(typescript@5.7.2)': dependencies: '@cloudflare/workers-types': 4.20241127.0 - '@remix-run/cloudflare': 2.15.0(@cloudflare/workers-types@4.20241127.0)(typescript@5.7.2) + '@remix-run/cloudflare': 2.15.2(@cloudflare/workers-types@4.20241127.0)(typescript@5.7.2) optionalDependencies: typescript: 5.7.2 - '@remix-run/cloudflare@2.15.0(@cloudflare/workers-types@4.20241127.0)(typescript@5.7.2)': + '@remix-run/cloudflare@2.15.2(@cloudflare/workers-types@4.20241127.0)(typescript@5.7.2)': dependencies: '@cloudflare/kv-asset-handler': 0.1.3 '@cloudflare/workers-types': 4.20241127.0 - '@remix-run/server-runtime': 2.15.0(typescript@5.7.2) + '@remix-run/server-runtime': 2.15.2(typescript@5.7.2) optionalDependencies: typescript: 5.7.2 - '@remix-run/dev@2.15.0(@remix-run/react@2.15.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.2))(@types/node@22.10.1)(sass-embedded@1.81.0)(typescript@5.7.2)(vite@5.4.11(@types/node@22.10.1)(sass-embedded@1.81.0))(wrangler@3.91.0(@cloudflare/workers-types@4.20241127.0))': + '@remix-run/dev@2.15.2(@remix-run/react@2.15.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.2))(@types/node@22.10.10)(sass-embedded@1.81.0)(typescript@5.7.2)(vite@5.4.11(@types/node@22.10.10)(sass-embedded@1.81.0))(wrangler@3.91.0(@cloudflare/workers-types@4.20241127.0))': dependencies: '@babel/core': 7.26.0 - '@babel/generator': 7.26.2 - '@babel/parser': 7.26.2 + '@babel/generator': 7.26.5 + '@babel/parser': 7.26.5 '@babel/plugin-syntax-decorators': 7.25.9(@babel/core@7.26.0) '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.0) '@babel/preset-typescript': 7.26.0(@babel/core@7.26.0) - '@babel/traverse': 7.25.9 - '@babel/types': 7.26.0 + '@babel/traverse': 7.26.5 + '@babel/types': 7.26.5 '@mdx-js/mdx': 2.3.0 '@npmcli/package-json': 4.0.1 - '@remix-run/node': 2.15.0(typescript@5.7.2) - '@remix-run/react': 2.15.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.2) + '@remix-run/node': 2.15.2(typescript@5.7.2) + '@remix-run/react': 2.15.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.2) '@remix-run/router': 1.21.0 - '@remix-run/server-runtime': 2.15.0(typescript@5.7.2) + '@remix-run/server-runtime': 2.15.2(typescript@5.7.2) '@types/mdx': 2.0.13 - '@vanilla-extract/integration': 6.5.0(@types/node@22.10.1)(sass-embedded@1.81.0) + '@vanilla-extract/integration': 6.5.0(@types/node@22.10.10)(sass-embedded@1.81.0) arg: 5.0.2 cacache: 17.1.4 chalk: 4.1.2 chokidar: 3.6.0 cross-spawn: 7.0.6 dotenv: 16.4.7 - es-module-lexer: 1.5.4 + es-module-lexer: 1.6.0 esbuild: 0.17.6 esbuild-plugins-node-modules-polyfill: 1.6.8(esbuild@0.17.6) execa: 5.1.1 exit-hook: 2.2.1 - express: 4.21.1 + express: 4.21.2 fs-extra: 10.1.0 get-port: 5.1.1 gunzip-maybe: 1.4.2 @@ -8613,10 +8759,10 @@ snapshots: picocolors: 1.1.1 picomatch: 2.3.1 pidtree: 0.6.0 - postcss: 8.4.49 - postcss-discard-duplicates: 5.1.0(postcss@8.4.49) - postcss-load-config: 4.0.2(postcss@8.4.49) - postcss-modules: 6.0.1(postcss@8.4.49) + postcss: 8.5.1 + postcss-discard-duplicates: 5.1.0(postcss@8.5.1) + postcss-load-config: 4.0.2(postcss@8.5.1) + postcss-modules: 6.0.1(postcss@8.5.1) prettier: 2.8.8 pretty-ms: 7.0.1 react-refresh: 0.14.2 @@ -8624,14 +8770,14 @@ snapshots: remark-mdx-frontmatter: 1.1.1 semver: 7.6.3 set-cookie-parser: 2.7.1 - tar-fs: 2.1.1 + tar-fs: 2.1.2 tsconfig-paths: 4.2.0 valibot: 0.41.0(typescript@5.7.2) - vite-node: 1.6.0(@types/node@22.10.1)(sass-embedded@1.81.0) + vite-node: 1.6.0(@types/node@22.10.10)(sass-embedded@1.81.0) ws: 7.5.10 optionalDependencies: typescript: 5.7.2 - vite: 5.4.11(@types/node@22.10.1)(sass-embedded@1.81.0) + vite: 5.4.11(@types/node@22.10.10)(sass-embedded@1.81.0) wrangler: 3.91.0(@cloudflare/workers-types@4.20241127.0) transitivePeerDependencies: - '@types/node' @@ -8649,18 +8795,6 @@ snapshots: - ts-node - utf-8-validate - '@remix-run/node@2.15.0(typescript@5.7.2)': - dependencies: - '@remix-run/server-runtime': 2.15.0(typescript@5.7.2) - '@remix-run/web-fetch': 4.4.2 - '@web3-storage/multipart-parser': 1.0.0 - cookie-signature: 1.2.2 - source-map-support: 0.5.21 - stream-slice: 0.1.2 - undici: 6.21.0 - optionalDependencies: - typescript: 5.7.2 - '@remix-run/node@2.15.2(typescript@5.7.2)': dependencies: '@remix-run/server-runtime': 2.15.2(typescript@5.7.2) @@ -8673,32 +8807,20 @@ snapshots: optionalDependencies: typescript: 5.7.2 - '@remix-run/react@2.15.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.2)': + '@remix-run/react@2.15.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.2)': dependencies: '@remix-run/router': 1.21.0 - '@remix-run/server-runtime': 2.15.0(typescript@5.7.2) + '@remix-run/server-runtime': 2.15.2(typescript@5.7.2) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-router: 6.28.0(react@18.3.1) - react-router-dom: 6.28.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react-router: 6.28.1(react@18.3.1) + react-router-dom: 6.28.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) turbo-stream: 2.4.0 optionalDependencies: typescript: 5.7.2 '@remix-run/router@1.21.0': {} - '@remix-run/server-runtime@2.15.0(typescript@5.7.2)': - dependencies: - '@remix-run/router': 1.21.0 - '@types/cookie': 0.6.0 - '@web3-storage/multipart-parser': 1.0.0 - cookie: 0.6.0 - set-cookie-parser: 2.7.1 - source-map: 0.7.4 - turbo-stream: 2.4.0 - optionalDependencies: - typescript: 5.7.2 - '@remix-run/server-runtime@2.15.2(typescript@5.7.2)': dependencies: '@remix-run/router': 1.21.0 @@ -9133,10 +9255,10 @@ snapshots: '@smithy/util-buffer-from': 3.0.0 tslib: 2.8.1 - '@stylistic/eslint-plugin-ts@2.11.0(eslint@9.16.0(jiti@1.21.6))(typescript@5.7.2)': + '@stylistic/eslint-plugin-ts@2.11.0(eslint@9.16.0(jiti@1.21.7))(typescript@5.7.2)': dependencies: - '@typescript-eslint/utils': 8.17.0(eslint@9.16.0(jiti@1.21.6))(typescript@5.7.2) - eslint: 9.16.0(jiti@1.21.6) + '@typescript-eslint/utils': 8.17.0(eslint@9.16.0(jiti@1.21.7))(typescript@5.7.2) + eslint: 9.16.0(jiti@1.21.7) eslint-visitor-keys: 4.2.0 espree: 10.3.0 transitivePeerDependencies: @@ -9219,6 +9341,10 @@ snapshots: dependencies: undici-types: 6.20.0 + '@types/node@22.10.10': + dependencies: + undici-types: 6.20.0 + '@types/prop-types@15.7.13': {} '@types/react-dom@18.3.1': @@ -9236,15 +9362,15 @@ snapshots: '@types/uuid@9.0.8': {} - '@typescript-eslint/eslint-plugin@8.17.0(@typescript-eslint/parser@8.17.0(eslint@9.16.0(jiti@1.21.6))(typescript@5.7.2))(eslint@9.16.0(jiti@1.21.6))(typescript@5.7.2)': + '@typescript-eslint/eslint-plugin@8.17.0(@typescript-eslint/parser@8.17.0(eslint@9.16.0(jiti@1.21.7))(typescript@5.7.2))(eslint@9.16.0(jiti@1.21.7))(typescript@5.7.2)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.17.0(eslint@9.16.0(jiti@1.21.6))(typescript@5.7.2) + '@typescript-eslint/parser': 8.17.0(eslint@9.16.0(jiti@1.21.7))(typescript@5.7.2) '@typescript-eslint/scope-manager': 8.17.0 - '@typescript-eslint/type-utils': 8.17.0(eslint@9.16.0(jiti@1.21.6))(typescript@5.7.2) - '@typescript-eslint/utils': 8.17.0(eslint@9.16.0(jiti@1.21.6))(typescript@5.7.2) + '@typescript-eslint/type-utils': 8.17.0(eslint@9.16.0(jiti@1.21.7))(typescript@5.7.2) + '@typescript-eslint/utils': 8.17.0(eslint@9.16.0(jiti@1.21.7))(typescript@5.7.2) '@typescript-eslint/visitor-keys': 8.17.0 - eslint: 9.16.0(jiti@1.21.6) + eslint: 9.16.0(jiti@1.21.7) graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 @@ -9254,14 +9380,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.17.0(eslint@9.16.0(jiti@1.21.6))(typescript@5.7.2)': + '@typescript-eslint/parser@8.17.0(eslint@9.16.0(jiti@1.21.7))(typescript@5.7.2)': dependencies: '@typescript-eslint/scope-manager': 8.17.0 '@typescript-eslint/types': 8.17.0 '@typescript-eslint/typescript-estree': 8.17.0(typescript@5.7.2) '@typescript-eslint/visitor-keys': 8.17.0 debug: 4.3.7 - eslint: 9.16.0(jiti@1.21.6) + eslint: 9.16.0(jiti@1.21.7) optionalDependencies: typescript: 5.7.2 transitivePeerDependencies: @@ -9272,12 +9398,12 @@ snapshots: '@typescript-eslint/types': 8.17.0 '@typescript-eslint/visitor-keys': 8.17.0 - '@typescript-eslint/type-utils@8.17.0(eslint@9.16.0(jiti@1.21.6))(typescript@5.7.2)': + '@typescript-eslint/type-utils@8.17.0(eslint@9.16.0(jiti@1.21.7))(typescript@5.7.2)': dependencies: '@typescript-eslint/typescript-estree': 8.17.0(typescript@5.7.2) - '@typescript-eslint/utils': 8.17.0(eslint@9.16.0(jiti@1.21.6))(typescript@5.7.2) + '@typescript-eslint/utils': 8.17.0(eslint@9.16.0(jiti@1.21.7))(typescript@5.7.2) debug: 4.3.7 - eslint: 9.16.0(jiti@1.21.6) + eslint: 9.16.0(jiti@1.21.7) ts-api-utils: 1.4.3(typescript@5.7.2) optionalDependencies: typescript: 5.7.2 @@ -9301,13 +9427,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.17.0(eslint@9.16.0(jiti@1.21.6))(typescript@5.7.2)': + '@typescript-eslint/utils@8.17.0(eslint@9.16.0(jiti@1.21.7))(typescript@5.7.2)': dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.16.0(jiti@1.21.6)) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.16.0(jiti@1.21.7)) '@typescript-eslint/scope-manager': 8.17.0 '@typescript-eslint/types': 8.17.0 '@typescript-eslint/typescript-estree': 8.17.0(typescript@5.7.2) - eslint: 9.16.0(jiti@1.21.6) + eslint: 9.16.0(jiti@1.21.7) optionalDependencies: typescript: 5.7.2 transitivePeerDependencies: @@ -9334,13 +9460,13 @@ snapshots: '@ungap/structured-clone@1.2.0': {} - '@unocss/astro@0.61.9(rollup@4.28.0)(vite@5.4.11(@types/node@22.10.1)(sass-embedded@1.81.0))': + '@unocss/astro@0.61.9(rollup@4.28.0)(vite@5.4.11(@types/node@22.10.10)(sass-embedded@1.81.0))': dependencies: '@unocss/core': 0.61.9 '@unocss/reset': 0.61.9 - '@unocss/vite': 0.61.9(rollup@4.28.0)(vite@5.4.11(@types/node@22.10.1)(sass-embedded@1.81.0)) + '@unocss/vite': 0.61.9(rollup@4.28.0)(vite@5.4.11(@types/node@22.10.10)(sass-embedded@1.81.0)) optionalDependencies: - vite: 5.4.11(@types/node@22.10.1)(sass-embedded@1.81.0) + vite: 5.4.11(@types/node@22.10.10)(sass-embedded@1.81.0) transitivePeerDependencies: - rollup - supports-color @@ -9384,7 +9510,7 @@ snapshots: gzip-size: 6.0.0 sirv: 2.0.4 - '@unocss/postcss@0.61.9(postcss@8.4.49)': + '@unocss/postcss@0.61.9(postcss@8.5.1)': dependencies: '@unocss/config': 0.61.9 '@unocss/core': 0.61.9 @@ -9392,7 +9518,7 @@ snapshots: css-tree: 2.3.1 fast-glob: 3.3.2 magic-string: 0.30.14 - postcss: 8.4.49 + postcss: 8.5.1 transitivePeerDependencies: - supports-color @@ -9477,7 +9603,7 @@ snapshots: dependencies: '@unocss/core': 0.61.9 - '@unocss/vite@0.61.9(rollup@4.28.0)(vite@5.4.11(@types/node@22.10.1)(sass-embedded@1.81.0))': + '@unocss/vite@0.61.9(rollup@4.28.0)(vite@5.4.11(@types/node@22.10.10)(sass-embedded@1.81.0))': dependencies: '@ampproject/remapping': 2.3.0 '@rollup/pluginutils': 5.1.3(rollup@4.28.0) @@ -9489,18 +9615,18 @@ snapshots: chokidar: 3.6.0 fast-glob: 3.3.2 magic-string: 0.30.14 - vite: 5.4.11(@types/node@22.10.1)(sass-embedded@1.81.0) + vite: 5.4.11(@types/node@22.10.10)(sass-embedded@1.81.0) transitivePeerDependencies: - rollup - supports-color - '@vanilla-extract/babel-plugin-debug-ids@1.1.0': + '@vanilla-extract/babel-plugin-debug-ids@1.2.0': dependencies: '@babel/core': 7.26.0 transitivePeerDependencies: - supports-color - '@vanilla-extract/css@1.16.1': + '@vanilla-extract/css@1.17.0': dependencies: '@emotion/hash': 0.9.2 '@vanilla-extract/private': 1.0.6 @@ -9517,21 +9643,21 @@ snapshots: transitivePeerDependencies: - babel-plugin-macros - '@vanilla-extract/integration@6.5.0(@types/node@22.10.1)(sass-embedded@1.81.0)': + '@vanilla-extract/integration@6.5.0(@types/node@22.10.10)(sass-embedded@1.81.0)': dependencies: '@babel/core': 7.26.0 '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.0) - '@vanilla-extract/babel-plugin-debug-ids': 1.1.0 - '@vanilla-extract/css': 1.16.1 - esbuild: 0.17.19 + '@vanilla-extract/babel-plugin-debug-ids': 1.2.0 + '@vanilla-extract/css': 1.17.0 + esbuild: 0.17.6 eval: 0.1.8 find-up: 5.0.0 javascript-stringify: 2.1.0 lodash: 4.17.21 - mlly: 1.7.3 + mlly: 1.7.4 outdent: 0.8.0 - vite: 5.4.11(@types/node@22.10.1)(sass-embedded@1.81.0) - vite-node: 1.6.0(@types/node@22.10.1)(sass-embedded@1.81.0) + vite: 5.4.11(@types/node@22.10.10)(sass-embedded@1.81.0) + vite-node: 1.6.0(@types/node@22.10.10)(sass-embedded@1.81.0) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -9553,13 +9679,13 @@ snapshots: chai: 5.1.2 tinyrainbow: 1.2.0 - '@vitest/mocker@2.1.8(vite@5.4.11(@types/node@22.10.1)(sass-embedded@1.81.0))': + '@vitest/mocker@2.1.8(vite@5.4.11(@types/node@22.10.10)(sass-embedded@1.81.0))': dependencies: '@vitest/spy': 2.1.8 estree-walker: 3.0.3 magic-string: 0.30.14 optionalDependencies: - vite: 5.4.11(@types/node@22.10.1)(sass-embedded@1.81.0) + vite: 5.4.11(@types/node@22.10.10)(sass-embedded@1.81.0) '@vitest/pretty-format@2.1.8': dependencies: @@ -9861,6 +9987,11 @@ snapshots: tar: 6.2.1 unique-filename: 3.0.0 + call-bind-apply-helpers@1.0.1: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + call-bind@1.0.7: dependencies: es-define-property: 1.0.0 @@ -9869,6 +10000,11 @@ snapshots: get-intrinsic: 1.2.4 set-function-length: 1.2.2 + call-bound@1.0.3: + dependencies: + call-bind-apply-helpers: 1.0.1 + get-intrinsic: 1.2.7 + callsites@3.1.0: {} caniuse-lite@1.0.30001685: {} @@ -10088,6 +10224,10 @@ snapshots: dependencies: ms: 2.1.3 + debug@4.4.0: + dependencies: + ms: 2.1.3 + decode-named-character-reference@1.0.2: dependencies: character-entities: 2.0.2 @@ -10168,6 +10308,12 @@ snapshots: dotenv@16.4.7: {} + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.1 + es-errors: 1.3.0 + gopd: 1.2.0 + duplexer@0.1.2: {} duplexify@3.7.1: @@ -10219,10 +10365,18 @@ snapshots: dependencies: get-intrinsic: 1.2.4 + es-define-property@1.0.1: {} + es-errors@1.3.0: {} es-module-lexer@1.5.4: {} + es-module-lexer@1.6.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + esbuild-plugins-node-modules-polyfill@1.6.8(esbuild@0.17.6): dependencies: '@jspm/core': 2.0.1 @@ -10341,27 +10495,27 @@ snapshots: escape-string-regexp@5.0.0: {} - eslint-compat-utils@0.6.4(eslint@9.16.0(jiti@1.21.6)): + eslint-compat-utils@0.6.4(eslint@9.16.0(jiti@1.21.7)): dependencies: - eslint: 9.16.0(jiti@1.21.6) + eslint: 9.16.0(jiti@1.21.7) semver: 7.6.3 - eslint-config-prettier@9.1.0(eslint@9.16.0(jiti@1.21.6)): + eslint-config-prettier@9.1.0(eslint@9.16.0(jiti@1.21.7)): dependencies: - eslint: 9.16.0(jiti@1.21.6) + eslint: 9.16.0(jiti@1.21.7) - eslint-json-compat-utils@0.2.1(eslint@9.16.0(jiti@1.21.6))(jsonc-eslint-parser@2.4.0): + eslint-json-compat-utils@0.2.1(eslint@9.16.0(jiti@1.21.7))(jsonc-eslint-parser@2.4.0): dependencies: - eslint: 9.16.0(jiti@1.21.6) + eslint: 9.16.0(jiti@1.21.7) esquery: 1.6.0 jsonc-eslint-parser: 2.4.0 - eslint-plugin-jsonc@2.18.2(eslint@9.16.0(jiti@1.21.6)): + eslint-plugin-jsonc@2.18.2(eslint@9.16.0(jiti@1.21.7)): dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.16.0(jiti@1.21.6)) - eslint: 9.16.0(jiti@1.21.6) - eslint-compat-utils: 0.6.4(eslint@9.16.0(jiti@1.21.6)) - eslint-json-compat-utils: 0.2.1(eslint@9.16.0(jiti@1.21.6))(jsonc-eslint-parser@2.4.0) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.16.0(jiti@1.21.7)) + eslint: 9.16.0(jiti@1.21.7) + eslint-compat-utils: 0.6.4(eslint@9.16.0(jiti@1.21.7)) + eslint-json-compat-utils: 0.2.1(eslint@9.16.0(jiti@1.21.7))(jsonc-eslint-parser@2.4.0) espree: 9.6.1 graphemer: 1.4.0 jsonc-eslint-parser: 2.4.0 @@ -10370,15 +10524,15 @@ snapshots: transitivePeerDependencies: - '@eslint/json' - eslint-plugin-prettier@5.2.1(@types/eslint@8.56.10)(eslint-config-prettier@9.1.0(eslint@9.16.0(jiti@1.21.6)))(eslint@9.16.0(jiti@1.21.6))(prettier@3.4.1): + eslint-plugin-prettier@5.2.1(@types/eslint@8.56.10)(eslint-config-prettier@9.1.0(eslint@9.16.0(jiti@1.21.7)))(eslint@9.16.0(jiti@1.21.7))(prettier@3.4.1): dependencies: - eslint: 9.16.0(jiti@1.21.6) + eslint: 9.16.0(jiti@1.21.7) prettier: 3.4.1 prettier-linter-helpers: 1.0.0 synckit: 0.9.2 optionalDependencies: '@types/eslint': 8.56.10 - eslint-config-prettier: 9.1.0(eslint@9.16.0(jiti@1.21.6)) + eslint-config-prettier: 9.1.0(eslint@9.16.0(jiti@1.21.7)) eslint-scope@8.2.0: dependencies: @@ -10389,9 +10543,9 @@ snapshots: eslint-visitor-keys@4.2.0: {} - eslint@9.16.0(jiti@1.21.6): + eslint@9.16.0(jiti@1.21.7): dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.16.0(jiti@1.21.6)) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.16.0(jiti@1.21.7)) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.19.0 '@eslint/core': 0.9.0 @@ -10426,7 +10580,7 @@ snapshots: natural-compare: 1.4.0 optionator: 0.9.4 optionalDependencies: - jiti: 1.21.6 + jiti: 1.21.7 transitivePeerDependencies: - supports-color @@ -10497,7 +10651,7 @@ snapshots: eval@0.1.8: dependencies: - '@types/node': 22.10.1 + '@types/node': 22.10.10 require-like: 0.1.2 event-target-shim@5.0.1: {} @@ -10529,7 +10683,7 @@ snapshots: expect-type@1.1.0: {} - express@4.21.1: + express@4.21.2: dependencies: accepts: 1.3.8 array-flatten: 1.1.1 @@ -10550,7 +10704,7 @@ snapshots: methods: 1.1.2 on-finished: 2.4.1 parseurl: 1.3.3 - path-to-regexp: 0.1.10 + path-to-regexp: 0.1.12 proxy-addr: 2.0.7 qs: 6.13.0 range-parser: 1.2.1 @@ -10695,10 +10849,28 @@ snapshots: has-symbols: 1.1.0 hasown: 2.0.2 + get-intrinsic@1.2.7: + dependencies: + call-bind-apply-helpers: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + get-nonce@1.0.1: {} get-port@5.1.1: {} + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + get-source@2.0.12: dependencies: data-uri-to-buffer: 2.0.2 @@ -10741,6 +10913,8 @@ snapshots: dependencies: get-intrinsic: 1.2.4 + gopd@1.2.0: {} + graceful-fs@4.2.11: {} graphemer@1.4.0: {} @@ -10939,9 +11113,9 @@ snapshots: dependencies: safer-buffer: 2.1.2 - icss-utils@5.1.0(postcss@8.4.49): + icss-utils@5.1.0(postcss@8.5.1): dependencies: - postcss: 8.4.49 + postcss: 8.5.1 ieee754@1.2.1: {} @@ -10964,7 +11138,7 @@ snapshots: debug: 4.3.7 esbuild: 0.23.1 jiti: 2.0.0-beta.3 - jiti-v1: jiti@1.21.6 + jiti-v1: jiti@1.21.7 pathe: 1.1.2 tsx: 4.19.2 transitivePeerDependencies: @@ -11017,6 +11191,10 @@ snapshots: dependencies: hasown: 2.0.2 + is-core-module@2.16.1: + dependencies: + hasown: 2.0.2 + is-decimal@2.0.1: {} is-deflate@1.0.0: {} @@ -11101,7 +11279,7 @@ snapshots: javascript-stringify@2.1.0: {} - jiti@1.21.6: {} + jiti@1.21.7: {} jiti@2.0.0-beta.3: {} @@ -11172,7 +11350,7 @@ snapshots: dependencies: immediate: 3.0.6 - lilconfig@3.1.2: {} + lilconfig@3.1.3: {} load-tsconfig@0.2.5: {} @@ -11228,6 +11406,8 @@ snapshots: markdown-table@3.0.4: {} + math-intrinsics@1.1.0: {} + md5.js@1.3.5: dependencies: hash-base: 3.0.5 @@ -11374,7 +11554,7 @@ snapshots: ccount: 2.0.1 mdast-util-from-markdown: 1.3.1 mdast-util-to-markdown: 1.5.0 - parse-entities: 4.0.1 + parse-entities: 4.0.2 stringify-entities: 4.0.4 unist-util-remove-position: 4.0.2 unist-util-stringify-position: 3.0.3 @@ -11873,7 +12053,7 @@ snapshots: micromark@3.2.0: dependencies: '@types/debug': 4.1.12 - debug: 4.3.7 + debug: 4.4.0 decode-named-character-reference: 1.0.2 micromark-core-commonmark: 1.1.0 micromark-factory-space: 1.1.0 @@ -12013,6 +12193,13 @@ snapshots: pkg-types: 1.2.1 ufo: 1.5.4 + mlly@1.7.4: + dependencies: + acorn: 8.14.0 + pathe: 2.0.2 + pkg-types: 1.3.1 + ufo: 1.5.4 + modern-ahocorasick@1.1.0: {} mri@1.2.0: {} @@ -12110,7 +12297,7 @@ snapshots: normalize-package-data@5.0.0: dependencies: hosted-git-info: 6.1.3 - is-core-module: 2.15.1 + is-core-module: 2.16.1 semver: 7.6.3 validate-npm-package-license: 3.0.4 @@ -12259,6 +12446,16 @@ snapshots: is-decimal: 2.0.1 is-hexadecimal: 2.0.1 + parse-entities@4.0.2: + dependencies: + '@types/unist': 2.0.11 + character-entities-legacy: 3.0.0 + character-reference-invalid: 2.0.1 + decode-named-character-reference: 1.0.2 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + is-hexadecimal: 2.0.1 + parse-ms@2.1.0: {} parse5@7.2.1: @@ -12282,12 +12479,14 @@ snapshots: lru-cache: 10.4.3 minipass: 7.1.2 - path-to-regexp@0.1.10: {} + path-to-regexp@0.1.12: {} path-to-regexp@6.3.0: {} pathe@1.1.2: {} + pathe@2.0.2: {} + pathval@2.0.0: {} pbkdf2@3.1.2: @@ -12332,52 +12531,58 @@ snapshots: mlly: 1.7.3 pathe: 1.1.2 + pkg-types@1.3.1: + dependencies: + confbox: 0.1.8 + mlly: 1.7.4 + pathe: 2.0.2 + pnpm@9.14.4: {} possible-typed-array-names@1.0.0: {} - postcss-discard-duplicates@5.1.0(postcss@8.4.49): + postcss-discard-duplicates@5.1.0(postcss@8.5.1): dependencies: - postcss: 8.4.49 + postcss: 8.5.1 - postcss-load-config@4.0.2(postcss@8.4.49): + postcss-load-config@4.0.2(postcss@8.5.1): dependencies: - lilconfig: 3.1.2 - yaml: 2.6.1 + lilconfig: 3.1.3 + yaml: 2.7.0 optionalDependencies: - postcss: 8.4.49 + postcss: 8.5.1 - postcss-modules-extract-imports@3.1.0(postcss@8.4.49): + postcss-modules-extract-imports@3.1.0(postcss@8.5.1): dependencies: - postcss: 8.4.49 + postcss: 8.5.1 - postcss-modules-local-by-default@4.1.0(postcss@8.4.49): + postcss-modules-local-by-default@4.2.0(postcss@8.5.1): dependencies: - icss-utils: 5.1.0(postcss@8.4.49) - postcss: 8.4.49 + icss-utils: 5.1.0(postcss@8.5.1) + postcss: 8.5.1 postcss-selector-parser: 7.0.0 postcss-value-parser: 4.2.0 - postcss-modules-scope@3.2.1(postcss@8.4.49): + postcss-modules-scope@3.2.1(postcss@8.5.1): dependencies: - postcss: 8.4.49 + postcss: 8.5.1 postcss-selector-parser: 7.0.0 - postcss-modules-values@4.0.0(postcss@8.4.49): + postcss-modules-values@4.0.0(postcss@8.5.1): dependencies: - icss-utils: 5.1.0(postcss@8.4.49) - postcss: 8.4.49 + icss-utils: 5.1.0(postcss@8.5.1) + postcss: 8.5.1 - postcss-modules@6.0.1(postcss@8.4.49): + postcss-modules@6.0.1(postcss@8.5.1): dependencies: generic-names: 4.0.0 - icss-utils: 5.1.0(postcss@8.4.49) + icss-utils: 5.1.0(postcss@8.5.1) lodash.camelcase: 4.3.0 - postcss: 8.4.49 - postcss-modules-extract-imports: 3.1.0(postcss@8.4.49) - postcss-modules-local-by-default: 4.1.0(postcss@8.4.49) - postcss-modules-scope: 3.2.1(postcss@8.4.49) - postcss-modules-values: 4.0.0(postcss@8.4.49) + postcss: 8.5.1 + postcss-modules-extract-imports: 3.1.0(postcss@8.5.1) + postcss-modules-local-by-default: 4.2.0(postcss@8.5.1) + postcss-modules-scope: 3.2.1(postcss@8.5.1) + postcss-modules-values: 4.0.0(postcss@8.5.1) string-hash: 1.1.3 postcss-selector-parser@7.0.0: @@ -12399,6 +12604,12 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 + postcss@8.5.1: + dependencies: + nanoid: 3.3.8 + picocolors: 1.1.1 + source-map-js: 1.2.1 + prelude-ls@1.2.1: {} prettier-linter-helpers@1.0.0: @@ -12466,7 +12677,7 @@ snapshots: qs@6.13.0: dependencies: - side-channel: 1.0.6 + side-channel: 1.1.0 qs@6.13.1: dependencies: @@ -12503,7 +12714,7 @@ snapshots: dependencies: dnd-core: 16.0.1 - react-dnd@16.0.1(@types/node@22.10.1)(@types/react@18.3.12)(react@18.3.1): + react-dnd@16.0.1(@types/node@22.10.10)(@types/react@18.3.12)(react@18.3.1): dependencies: '@react-dnd/invariant': 4.0.2 '@react-dnd/shallowequal': 4.0.2 @@ -12512,7 +12723,7 @@ snapshots: hoist-non-react-statics: 3.3.2 react: 18.3.1 optionalDependencies: - '@types/node': 22.10.1 + '@types/node': 22.10.10 '@types/react': 18.3.12 react-dom@18.3.1(react@18.3.1): @@ -12575,14 +12786,14 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-router-dom@6.28.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + react-router-dom@6.28.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: '@remix-run/router': 1.21.0 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - react-router: 6.28.0(react@18.3.1) + react-router: 6.28.1(react@18.3.1) - react-router@6.28.0(react@18.3.1): + react-router@6.28.1(react@18.3.1): dependencies: '@remix-run/router': 1.21.0 react: 18.3.1 @@ -12725,20 +12936,20 @@ snapshots: mdast-util-to-markdown: 2.1.2 unified: 11.0.5 - remix-island@0.2.0(@remix-run/react@2.15.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.2))(@remix-run/server-runtime@2.15.2(typescript@5.7.2))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + remix-island@0.2.0(@remix-run/react@2.15.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.2))(@remix-run/server-runtime@2.15.2(typescript@5.7.2))(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: - '@remix-run/react': 2.15.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.2) + '@remix-run/react': 2.15.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.2) '@remix-run/server-runtime': 2.15.2(typescript@5.7.2) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - remix-utils@7.7.0(@remix-run/cloudflare@2.15.0(@cloudflare/workers-types@4.20241127.0)(typescript@5.7.2))(@remix-run/node@2.15.2(typescript@5.7.2))(@remix-run/react@2.15.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.2))(@remix-run/router@1.21.0)(react@18.3.1)(zod@3.23.8): + remix-utils@7.7.0(@remix-run/cloudflare@2.15.2(@cloudflare/workers-types@4.20241127.0)(typescript@5.7.2))(@remix-run/node@2.15.2(typescript@5.7.2))(@remix-run/react@2.15.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.2))(@remix-run/router@1.21.0)(react@18.3.1)(zod@3.23.8): dependencies: type-fest: 4.30.0 optionalDependencies: - '@remix-run/cloudflare': 2.15.0(@cloudflare/workers-types@4.20241127.0)(typescript@5.7.2) + '@remix-run/cloudflare': 2.15.2(@cloudflare/workers-types@4.20241127.0)(typescript@5.7.2) '@remix-run/node': 2.15.2(typescript@5.7.2) - '@remix-run/react': 2.15.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.2) + '@remix-run/react': 2.15.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.7.2) '@remix-run/router': 1.21.0 react: 18.3.1 zod: 3.23.8 @@ -13023,6 +13234,26 @@ snapshots: '@shikijs/vscode-textmate': 9.3.0 '@types/hast': 3.0.4 + side-channel-list@1.0.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.3 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.7 + object-inspect: 1.13.3 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.7 + object-inspect: 1.13.3 + side-channel-map: 1.0.1 + side-channel@1.0.6: dependencies: call-bind: 1.0.7 @@ -13030,6 +13261,14 @@ snapshots: get-intrinsic: 1.2.4 object-inspect: 1.13.3 + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.3 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + siginfo@2.0.0: {} signal-exit@3.0.7: {} @@ -13073,16 +13312,16 @@ snapshots: spdx-correct@3.2.0: dependencies: spdx-expression-parse: 3.0.1 - spdx-license-ids: 3.0.20 + spdx-license-ids: 3.0.21 spdx-exceptions@2.5.0: {} spdx-expression-parse@3.0.1: dependencies: spdx-exceptions: 2.5.0 - spdx-license-ids: 3.0.20 + spdx-license-ids: 3.0.21 - spdx-license-ids@3.0.20: {} + spdx-license-ids@3.0.21: {} ssri@10.0.6: dependencies: @@ -13214,7 +13453,7 @@ snapshots: tailwind-merge@2.6.0: {} - tar-fs@2.1.1: + tar-fs@2.1.2: dependencies: chownr: 1.1.4 mkdirp-classic: 0.5.3 @@ -13315,12 +13554,12 @@ snapshots: media-typer: 0.3.0 mime-types: 2.1.35 - typescript-eslint@8.17.0(eslint@9.16.0(jiti@1.21.6))(typescript@5.7.2): + typescript-eslint@8.17.0(eslint@9.16.0(jiti@1.21.7))(typescript@5.7.2): dependencies: - '@typescript-eslint/eslint-plugin': 8.17.0(@typescript-eslint/parser@8.17.0(eslint@9.16.0(jiti@1.21.6))(typescript@5.7.2))(eslint@9.16.0(jiti@1.21.6))(typescript@5.7.2) - '@typescript-eslint/parser': 8.17.0(eslint@9.16.0(jiti@1.21.6))(typescript@5.7.2) - '@typescript-eslint/utils': 8.17.0(eslint@9.16.0(jiti@1.21.6))(typescript@5.7.2) - eslint: 9.16.0(jiti@1.21.6) + '@typescript-eslint/eslint-plugin': 8.17.0(@typescript-eslint/parser@8.17.0(eslint@9.16.0(jiti@1.21.7))(typescript@5.7.2))(eslint@9.16.0(jiti@1.21.7))(typescript@5.7.2) + '@typescript-eslint/parser': 8.17.0(eslint@9.16.0(jiti@1.21.7))(typescript@5.7.2) + '@typescript-eslint/utils': 8.17.0(eslint@9.16.0(jiti@1.21.7))(typescript@5.7.2) + eslint: 9.16.0(jiti@1.21.7) optionalDependencies: typescript: 5.7.2 transitivePeerDependencies: @@ -13442,13 +13681,13 @@ snapshots: universalify@2.0.1: {} - unocss@0.61.9(postcss@8.4.49)(rollup@4.28.0)(vite@5.4.11(@types/node@22.10.1)(sass-embedded@1.81.0)): + unocss@0.61.9(postcss@8.5.1)(rollup@4.28.0)(vite@5.4.11(@types/node@22.10.10)(sass-embedded@1.81.0)): dependencies: - '@unocss/astro': 0.61.9(rollup@4.28.0)(vite@5.4.11(@types/node@22.10.1)(sass-embedded@1.81.0)) + '@unocss/astro': 0.61.9(rollup@4.28.0)(vite@5.4.11(@types/node@22.10.10)(sass-embedded@1.81.0)) '@unocss/cli': 0.61.9(rollup@4.28.0) '@unocss/core': 0.61.9 '@unocss/extractor-arbitrary-variants': 0.61.9 - '@unocss/postcss': 0.61.9(postcss@8.4.49) + '@unocss/postcss': 0.61.9(postcss@8.5.1) '@unocss/preset-attributify': 0.61.9 '@unocss/preset-icons': 0.61.9 '@unocss/preset-mini': 0.61.9 @@ -13463,9 +13702,9 @@ snapshots: '@unocss/transformer-compile-class': 0.61.9 '@unocss/transformer-directives': 0.61.9 '@unocss/transformer-variant-group': 0.61.9 - '@unocss/vite': 0.61.9(rollup@4.28.0)(vite@5.4.11(@types/node@22.10.1)(sass-embedded@1.81.0)) + '@unocss/vite': 0.61.9(rollup@4.28.0)(vite@5.4.11(@types/node@22.10.10)(sass-embedded@1.81.0)) optionalDependencies: - vite: 5.4.11(@types/node@22.10.1)(sass-embedded@1.81.0) + vite: 5.4.11(@types/node@22.10.10)(sass-embedded@1.81.0) transitivePeerDependencies: - postcss - rollup @@ -13572,13 +13811,13 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vite-node@1.6.0(@types/node@22.10.1)(sass-embedded@1.81.0): + vite-node@1.6.0(@types/node@22.10.10)(sass-embedded@1.81.0): dependencies: cac: 6.7.14 - debug: 4.3.7 + debug: 4.4.0 pathe: 1.1.2 picocolors: 1.1.1 - vite: 5.4.11(@types/node@22.10.1)(sass-embedded@1.81.0) + vite: 5.4.11(@types/node@22.10.10)(sass-embedded@1.81.0) transitivePeerDependencies: - '@types/node' - less @@ -13590,13 +13829,13 @@ snapshots: - supports-color - terser - vite-node@2.1.8(@types/node@22.10.1)(sass-embedded@1.81.0): + vite-node@2.1.8(@types/node@22.10.10)(sass-embedded@1.81.0): dependencies: cac: 6.7.14 debug: 4.3.7 es-module-lexer: 1.5.4 pathe: 1.1.2 - vite: 5.4.11(@types/node@22.10.1)(sass-embedded@1.81.0) + vite: 5.4.11(@types/node@22.10.10)(sass-embedded@1.81.0) transitivePeerDependencies: - '@types/node' - less @@ -13608,43 +13847,43 @@ snapshots: - supports-color - terser - vite-plugin-node-polyfills@0.22.0(rollup@4.28.0)(vite@5.4.11(@types/node@22.10.1)(sass-embedded@1.81.0)): + vite-plugin-node-polyfills@0.22.0(rollup@4.28.0)(vite@5.4.11(@types/node@22.10.10)(sass-embedded@1.81.0)): dependencies: '@rollup/plugin-inject': 5.0.5(rollup@4.28.0) node-stdlib-browser: 1.3.0 - vite: 5.4.11(@types/node@22.10.1)(sass-embedded@1.81.0) + vite: 5.4.11(@types/node@22.10.10)(sass-embedded@1.81.0) transitivePeerDependencies: - rollup - vite-plugin-optimize-css-modules@1.1.0(vite@5.4.11(@types/node@22.10.1)(sass-embedded@1.81.0)): + vite-plugin-optimize-css-modules@1.1.0(vite@5.4.11(@types/node@22.10.10)(sass-embedded@1.81.0)): dependencies: - vite: 5.4.11(@types/node@22.10.1)(sass-embedded@1.81.0) + vite: 5.4.11(@types/node@22.10.10)(sass-embedded@1.81.0) - vite-tsconfig-paths@4.3.2(typescript@5.7.2)(vite@5.4.11(@types/node@22.10.1)(sass-embedded@1.81.0)): + vite-tsconfig-paths@4.3.2(typescript@5.7.2)(vite@5.4.11(@types/node@22.10.10)(sass-embedded@1.81.0)): dependencies: debug: 4.3.7 globrex: 0.1.2 tsconfck: 3.1.4(typescript@5.7.2) optionalDependencies: - vite: 5.4.11(@types/node@22.10.1)(sass-embedded@1.81.0) + vite: 5.4.11(@types/node@22.10.10)(sass-embedded@1.81.0) transitivePeerDependencies: - supports-color - typescript - vite@5.4.11(@types/node@22.10.1)(sass-embedded@1.81.0): + vite@5.4.11(@types/node@22.10.10)(sass-embedded@1.81.0): dependencies: esbuild: 0.21.5 postcss: 8.4.49 rollup: 4.28.0 optionalDependencies: - '@types/node': 22.10.1 + '@types/node': 22.10.10 fsevents: 2.3.3 sass-embedded: 1.81.0 - vitest@2.1.8(@types/node@22.10.1)(sass-embedded@1.81.0): + vitest@2.1.8(@types/node@22.10.10)(sass-embedded@1.81.0): dependencies: '@vitest/expect': 2.1.8 - '@vitest/mocker': 2.1.8(vite@5.4.11(@types/node@22.10.1)(sass-embedded@1.81.0)) + '@vitest/mocker': 2.1.8(vite@5.4.11(@types/node@22.10.10)(sass-embedded@1.81.0)) '@vitest/pretty-format': 2.1.8 '@vitest/runner': 2.1.8 '@vitest/snapshot': 2.1.8 @@ -13660,11 +13899,11 @@ snapshots: tinyexec: 0.3.1 tinypool: 1.0.2 tinyrainbow: 1.2.0 - vite: 5.4.11(@types/node@22.10.1)(sass-embedded@1.81.0) - vite-node: 2.1.8(@types/node@22.10.1)(sass-embedded@1.81.0) + vite: 5.4.11(@types/node@22.10.10)(sass-embedded@1.81.0) + vite-node: 2.1.8(@types/node@22.10.10)(sass-embedded@1.81.0) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 22.10.1 + '@types/node': 22.10.10 transitivePeerDependencies: - less - lightningcss @@ -13780,7 +14019,7 @@ snapshots: yallist@4.0.0: {} - yaml@2.6.1: {} + yaml@2.7.0: {} yocto-queue@0.1.0: {}