From 791a1815d79a9e6c287a09665fc6904c6263261c Mon Sep 17 00:00:00 2001 From: hmmhmmhm Date: Tue, 19 May 2026 09:01:21 +0900 Subject: [PATCH] chore: resolve aka-browser triage --- README.md | 2 +- apps/browser/package.json | 25 +- apps/browser/src/main/app-lifecycle.ts | 15 +- apps/browser/src/main/index.ts | 9 +- apps/browser/src/main/ipc-handlers.ts | 115 +- .../src/main/ipc/bookmark-favicon-handlers.ts | 77 + apps/browser/src/main/language-manager.ts | 73 + apps/browser/src/main/types.ts | 2 + apps/browser/src/preload.ts | 8 + apps/browser/src/renderer/app.tsx | 569 +--- .../src/renderer/components/menu-overlay.tsx | 6 +- .../src/renderer/components/settings.tsx | 845 +---- .../components/settings/about-view.tsx | 150 + .../components/settings/bookmark-dialog.tsx | 155 + .../components/settings/bookmarks-view.tsx | 212 ++ .../components/settings/language-view.tsx | 82 + .../components/settings/main-view.tsx | 123 + .../src/renderer/components/settings/types.ts | 62 + .../components/settings/use-bookmarks.ts | 93 + .../src/renderer/components/top-bar.tsx | 4 +- .../renderer/hooks/use-browser-page-state.ts | 231 ++ .../src/renderer/i18n/i18n-context.tsx | 81 + .../browser/src/renderer/i18n/translations.ts | 70 + apps/browser/src/renderer/lib/app-utils.ts | 75 + apps/browser/src/renderer/main.tsx | 5 +- apps/browser/src/shared/language.ts | 43 + apps/browser/src/types/electron-api.d.ts | 12 + apps/browser/src/webview-preload.ts | 643 +--- apps/browser/src/webview/corner-mask.ts | 178 + apps/browser/src/webview/exposed-api.ts | 33 + .../src/webview/fullscreen-polyfill.ts | 105 + .../src/webview/navigation-gestures.ts | 57 + apps/browser/src/webview/theme-color.ts | 90 + apps/browser/tsconfig.json | 1 + apps/browser/tsconfig.renderer.json | 7 +- apps/browser/tsconfig.webview.json | 2 +- docs/TRANSLATING.md | 15 + package.json | 20 +- pnpm-lock.yaml | 3024 +++++------------ turbo.json | 2 +- 40 files changed, 3158 insertions(+), 4163 deletions(-) create mode 100644 apps/browser/src/main/ipc/bookmark-favicon-handlers.ts create mode 100644 apps/browser/src/main/language-manager.ts create mode 100644 apps/browser/src/renderer/components/settings/about-view.tsx create mode 100644 apps/browser/src/renderer/components/settings/bookmark-dialog.tsx create mode 100644 apps/browser/src/renderer/components/settings/bookmarks-view.tsx create mode 100644 apps/browser/src/renderer/components/settings/language-view.tsx create mode 100644 apps/browser/src/renderer/components/settings/main-view.tsx create mode 100644 apps/browser/src/renderer/components/settings/types.ts create mode 100644 apps/browser/src/renderer/components/settings/use-bookmarks.ts create mode 100644 apps/browser/src/renderer/hooks/use-browser-page-state.ts create mode 100644 apps/browser/src/renderer/i18n/i18n-context.tsx create mode 100644 apps/browser/src/renderer/i18n/translations.ts create mode 100644 apps/browser/src/renderer/lib/app-utils.ts create mode 100644 apps/browser/src/shared/language.ts create mode 100644 apps/browser/src/webview/corner-mask.ts create mode 100644 apps/browser/src/webview/exposed-api.ts create mode 100644 apps/browser/src/webview/fullscreen-polyfill.ts create mode 100644 apps/browser/src/webview/navigation-gestures.ts create mode 100644 apps/browser/src/webview/theme-color.ts create mode 100644 docs/TRANSLATING.md diff --git a/README.md b/README.md index 573cf8a..50a4805 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ **Your companion browser for Netflix, Twitter(X), and everything in between.** -🌐 **[Visit our website](https://browser.aka.page)** | πŸ“š **[Technical Wiki](https://deepwiki.com/hmmhmmhm/aka-browser)** | πŸš€ **Currently in Beta** β€” Stable Release coming in November! +🌐 **[Visit our website](https://browser.aka.page)** | πŸ“š **[Technical Wiki](https://deepwiki.com/hmmhmmhm/aka-browser)** | πŸš€ **Stage-0 Beta** β€” Stable release schedule will be announced after beta validation. aka-browser screenshot diff --git a/apps/browser/package.json b/apps/browser/package.json index 2179953..93ed62e 100644 --- a/apps/browser/package.json +++ b/apps/browser/package.json @@ -20,6 +20,7 @@ "evs:setup": "bash scripts/setup-evs.sh", "evs:verify": "node scripts/evs-sign.js --verify", "check-types": "tsc --noEmit", + "lint": "tsc --noEmit --pretty false", "audit": "npm audit", "audit:fix": "npm audit fix", "outdated": "npm outdated" @@ -32,26 +33,28 @@ "author": "hmmhmmhm", "license": "MIT", "devDependencies": { - "@electron/notarize": "^2.5.0", - "@tailwindcss/vite": "^4.1.14", + "@electron/notarize": "^3.1.1", + "@tailwindcss/vite": "^4.3.0", "@types/node": "^20.11.0", - "@types/react": "^19.2.2", - "@types/react-dom": "^19.2.2", - "@vitejs/plugin-react": "^5.0.4", + "@types/react": "^19.2.14", + "@types/react-dom": "^19.2.3", + "@vitejs/plugin-react": "^6.0.2", "concurrently": "^8.2.2", "cross-env": "^10.1.0", - "dotenv": "^17.2.3", - "electron": "github:castlabs/electron-releases#v38.0.0+wvcus", - "electron-builder": "^26.0.12", - "tailwindcss": "^4.1.14", + "dotenv": "^17.4.2", + "electron": "github:castlabs/electron-releases#v39.8.10+wvcus", + "electron-builder": "^26.8.1", + "electron-builder-squirrel-windows": "26.8.1", + "esbuild": "^0.28.0", + "tailwindcss": "^4.3.0", "typescript": "5.9.2", - "vite": "^7.1.11" + "vite": "^8.0.13" }, "build": { "appId": "com.aka-browser.app", "productName": "aka-browser", "electronDist": "node_modules/electron/dist", - "electronVersion": "38.0.0", + "electronVersion": "39.8.10", "npmRebuild": false, "asar": true, "asarUnpack": [ diff --git a/apps/browser/src/main/app-lifecycle.ts b/apps/browser/src/main/app-lifecycle.ts index 2ace7c6..261bc73 100644 --- a/apps/browser/src/main/app-lifecycle.ts +++ b/apps/browser/src/main/app-lifecycle.ts @@ -2,11 +2,12 @@ * Application lifecycle management */ -import { app, BrowserWindow, nativeImage, components } from "electron"; +import { app, BrowserWindow, nativeImage, components, session } from "electron"; import path from "path"; import { AppState } from "./types"; import { WindowManager } from "./window-manager"; import { TrayManager } from "./tray-manager"; +import { toAcceptLanguage } from "../shared/language"; export class AppLifecycle { private state: AppState; @@ -89,6 +90,8 @@ export class AppLifecycle { "[Widevine] Using castlabs electron-releases with built-in Widevine CDM" ); + this.configureLanguageHeaders(); + // Set dock icon for macOS if (process.platform === "darwin") { const iconPath = path.join(__dirname, "../assets/icon.png"); @@ -125,4 +128,14 @@ export class AppLifecycle { this.trayManager.destroy(); }); } + + private configureLanguageHeaders(): void { + const webSession = session.fromPartition("persist:main"); + webSession.webRequest.onBeforeSendHeaders((details, callback) => { + details.requestHeaders["Accept-Language"] = toAcceptLanguage( + this.state.language + ); + callback({ requestHeaders: details.requestHeaders }); + }); + } } diff --git a/apps/browser/src/main/index.ts b/apps/browser/src/main/index.ts index 3030dc2..b692d48 100644 --- a/apps/browser/src/main/index.ts +++ b/apps/browser/src/main/index.ts @@ -12,6 +12,12 @@ import { FaviconCache } from "./favicon-cache"; import { IPCHandlers } from "./ipc-handlers"; import { TrayManager } from "./tray-manager"; import { AppLifecycle } from "./app-lifecycle"; +import { LanguageManager } from "./language-manager"; +import { toChromiumLocale } from "../shared/language"; + +const languageManager = new LanguageManager(); +const initialLanguage = languageManager.getState().effectiveLanguage; +app.commandLine.appendSwitch("lang", toChromiumLocale(initialLanguage)); // Initialize application state const appState: AppState = { @@ -23,6 +29,7 @@ const appState: AppState = { tabs: [], activeTabId: null, latestThemeColor: null, + language: initialLanguage, }; // Initialize managers @@ -32,7 +39,7 @@ const faviconCache = new FaviconCache(); const tabManager = new TabManager(appState, themeColorCache); const windowManager = new WindowManager(appState, tabManager); const trayManager = new TrayManager(appState, windowManager); -const ipcHandlers = new IPCHandlers(appState, tabManager, windowManager, bookmarkManager, faviconCache, themeColorCache); +const ipcHandlers = new IPCHandlers(appState, tabManager, windowManager, bookmarkManager, faviconCache, themeColorCache, languageManager); const appLifecycle = new AppLifecycle(appState, windowManager, trayManager); // Initialize Widevine diff --git a/apps/browser/src/main/ipc-handlers.ts b/apps/browser/src/main/ipc-handlers.ts index dc6f332..47496fc 100644 --- a/apps/browser/src/main/ipc-handlers.ts +++ b/apps/browser/src/main/ipc-handlers.ts @@ -10,6 +10,11 @@ import { BookmarkManager } from "./bookmark-manager"; import { FaviconCache } from "./favicon-cache"; import { isValidUrl, sanitizeUrl, getUserAgentForUrl, logSecurityEvent } from "./security"; import { ThemeColorCache } from "./theme-cache"; +import { + registerBookmarkHandlers, + registerFaviconHandlers, +} from "./ipc/bookmark-favicon-handlers"; +import { LanguageManager } from "./language-manager"; export class IPCHandlers { private state: AppState; @@ -18,6 +23,7 @@ export class IPCHandlers { private bookmarkManager: BookmarkManager; private faviconCache: FaviconCache; private themeColorCache: ThemeColorCache; + private languageManager: LanguageManager; constructor( state: AppState, @@ -25,7 +31,8 @@ export class IPCHandlers { windowManager: WindowManager, bookmarkManager: BookmarkManager, faviconCache: FaviconCache, - themeColorCache: ThemeColorCache + themeColorCache: ThemeColorCache, + languageManager: LanguageManager ) { this.state = state; this.tabManager = tabManager; @@ -33,6 +40,7 @@ export class IPCHandlers { this.bookmarkManager = bookmarkManager; this.faviconCache = faviconCache; this.themeColorCache = themeColorCache; + this.languageManager = languageManager; } /** @@ -45,8 +53,8 @@ export class IPCHandlers { this.registerThemeHandlers(); this.registerOrientationHandlers(); this.registerAppHandlers(); - this.registerBookmarkHandlers(); - this.registerFaviconHandlers(); + registerBookmarkHandlers(this.state, this.bookmarkManager); + registerFaviconHandlers(this.faviconCache); } /** @@ -385,104 +393,21 @@ export class IPCHandlers { ipcMain.handle("get-app-version", () => { return app.getVersion(); }); - } - - /** - * Notify all windows about bookmark updates - */ - private notifyBookmarkUpdate(): void { - // Notify main window - if (this.state.mainWindow && !this.state.mainWindow.isDestroyed()) { - this.state.mainWindow.webContents.send("bookmarks-updated"); - } - - // Notify WebContentsView - if (this.state.webContentsView && !this.state.webContentsView.webContents.isDestroyed()) { - this.state.webContentsView.webContents.send("bookmarks-updated"); - } - } - - /** - * Register bookmark management handlers - */ - private registerBookmarkHandlers(): void { - // Get all bookmarks - ipcMain.handle("bookmarks-get-all", () => { - return this.bookmarkManager.getAll(); - }); - - // Get bookmark by ID - ipcMain.handle("bookmarks-get-by-id", (_event, id: string) => { - return this.bookmarkManager.getById(id); - }); - - // Check if URL is bookmarked - ipcMain.handle("bookmarks-is-bookmarked", (_event, url: string) => { - return this.bookmarkManager.isBookmarked(url); - }); - - // Add bookmark - ipcMain.handle("bookmarks-add", (_event, title: string, url: string, favicon?: string) => { - const bookmark = this.bookmarkManager.add(title, url, favicon); - this.notifyBookmarkUpdate(); - return bookmark; - }); - // Update bookmark - ipcMain.handle("bookmarks-update", (_event, id: string, updates: any) => { - const bookmark = this.bookmarkManager.update(id, updates); - this.notifyBookmarkUpdate(); - return bookmark; + ipcMain.handle("get-language-state", () => { + return this.languageManager.getState(); }); - // Remove bookmark - ipcMain.handle("bookmarks-remove", (_event, id: string) => { - const result = this.bookmarkManager.remove(id); - this.notifyBookmarkUpdate(); - return result; - }); + ipcMain.handle("set-preferred-language", (_event, language: any) => { + const nextState = this.languageManager.setPreferredLanguage(language); + this.state.language = nextState.effectiveLanguage; - // Remove bookmark by URL - ipcMain.handle("bookmarks-remove-by-url", (_event, url: string) => { - const result = this.bookmarkManager.removeByUrl(url); - this.notifyBookmarkUpdate(); - return result; - }); + if (this.state.mainWindow && !this.state.mainWindow.isDestroyed()) { + this.state.mainWindow.webContents.send("language-changed", nextState); + } - // Clear all bookmarks - ipcMain.handle("bookmarks-clear", () => { - this.bookmarkManager.clear(); - this.notifyBookmarkUpdate(); + return nextState; }); } - /** - * Register favicon cache handlers - */ - private registerFaviconHandlers(): void { - // Get favicon with caching - ipcMain.handle("favicon-get", async (_event, url: string) => { - return this.faviconCache.getFavicon(url); - }); - - // Get favicon with fallback sources - ipcMain.handle("favicon-get-with-fallback", async (_event, pageUrl: string) => { - return this.faviconCache.getFaviconWithFallback(pageUrl); - }); - - // Check if favicon is cached - ipcMain.handle("favicon-is-cached", (_event, url: string) => { - return this.faviconCache.isCached(url); - }); - - // Clear favicon cache - ipcMain.handle("favicon-clear-cache", () => { - this.faviconCache.clearCache(); - }); - - // Get cache size - ipcMain.handle("favicon-get-cache-size", () => { - return this.faviconCache.getCacheSize(); - }); - } } diff --git a/apps/browser/src/main/ipc/bookmark-favicon-handlers.ts b/apps/browser/src/main/ipc/bookmark-favicon-handlers.ts new file mode 100644 index 0000000..6db69bf --- /dev/null +++ b/apps/browser/src/main/ipc/bookmark-favicon-handlers.ts @@ -0,0 +1,77 @@ +import { ipcMain, WebContentsView, BrowserWindow } from "electron"; +import { BookmarkManager } from "../bookmark-manager"; +import { FaviconCache } from "../favicon-cache"; + +interface BookmarkHandlersState { + mainWindow: BrowserWindow | null; + webContentsView: WebContentsView | null; +} + +export function registerBookmarkHandlers( + state: BookmarkHandlersState, + bookmarkManager: BookmarkManager +): void { + const notifyBookmarkUpdate = () => { + if (state.mainWindow && !state.mainWindow.isDestroyed()) { + state.mainWindow.webContents.send("bookmarks-updated"); + } + + if ( + state.webContentsView && + !state.webContentsView.webContents.isDestroyed() + ) { + state.webContentsView.webContents.send("bookmarks-updated"); + } + }; + + ipcMain.handle("bookmarks-get-all", () => bookmarkManager.getAll()); + ipcMain.handle("bookmarks-get-by-id", (_event, id: string) => + bookmarkManager.getById(id) + ); + ipcMain.handle("bookmarks-is-bookmarked", (_event, url: string) => + bookmarkManager.isBookmarked(url) + ); + ipcMain.handle( + "bookmarks-add", + (_event, title: string, url: string, favicon?: string) => { + const bookmark = bookmarkManager.add(title, url, favicon); + notifyBookmarkUpdate(); + return bookmark; + } + ); + ipcMain.handle("bookmarks-update", (_event, id: string, updates: any) => { + const bookmark = bookmarkManager.update(id, updates); + notifyBookmarkUpdate(); + return bookmark; + }); + ipcMain.handle("bookmarks-remove", (_event, id: string) => { + const result = bookmarkManager.remove(id); + notifyBookmarkUpdate(); + return result; + }); + ipcMain.handle("bookmarks-remove-by-url", (_event, url: string) => { + const result = bookmarkManager.removeByUrl(url); + notifyBookmarkUpdate(); + return result; + }); + ipcMain.handle("bookmarks-clear", () => { + bookmarkManager.clear(); + notifyBookmarkUpdate(); + }); +} + +export function registerFaviconHandlers(faviconCache: FaviconCache): void { + ipcMain.handle("favicon-get", async (_event, url: string) => + faviconCache.getFavicon(url) + ); + ipcMain.handle("favicon-get-with-fallback", async (_event, pageUrl: string) => + faviconCache.getFaviconWithFallback(pageUrl) + ); + ipcMain.handle("favicon-is-cached", (_event, url: string) => + faviconCache.isCached(url) + ); + ipcMain.handle("favicon-clear-cache", () => { + faviconCache.clearCache(); + }); + ipcMain.handle("favicon-get-cache-size", () => faviconCache.getCacheSize()); +} diff --git a/apps/browser/src/main/language-manager.ts b/apps/browser/src/main/language-manager.ts new file mode 100644 index 0000000..fe5a9e4 --- /dev/null +++ b/apps/browser/src/main/language-manager.ts @@ -0,0 +1,73 @@ +import { app } from "electron"; +import fs from "fs"; +import path from "path"; +import { + EffectiveLanguage, + LanguageState, + PreferredLanguage, + isPreferredLanguage, + resolveEffectiveLanguage, +} from "../shared/language"; + +interface StoredPreferences { + preferredLanguage?: PreferredLanguage; +} + +export class LanguageManager { + private preferencesPath: string; + private preferredLanguage: PreferredLanguage; + private systemLanguage: EffectiveLanguage; + + constructor() { + this.preferencesPath = path.join(app.getPath("userData"), "preferences.json"); + this.systemLanguage = resolveEffectiveLanguage("system", getSystemLocale()); + this.preferredLanguage = this.loadPreferredLanguage(); + } + + getState(): LanguageState { + return { + effectiveLanguage: resolveEffectiveLanguage( + this.preferredLanguage, + this.systemLanguage + ), + preferredLanguage: this.preferredLanguage, + systemLanguage: this.systemLanguage, + }; + } + + setPreferredLanguage(language: unknown): LanguageState { + if (!isPreferredLanguage(language)) { + throw new Error("Unsupported language"); + } + + this.preferredLanguage = language; + this.savePreferences({ preferredLanguage: language }); + return this.getState(); + } + + private loadPreferredLanguage(): PreferredLanguage { + try { + if (!fs.existsSync(this.preferencesPath)) return "system"; + + const preferences = JSON.parse( + fs.readFileSync(this.preferencesPath, "utf8") + ) as StoredPreferences; + + return isPreferredLanguage(preferences.preferredLanguage) + ? preferences.preferredLanguage + : "system"; + } catch { + return "system"; + } + } + + private savePreferences(preferences: StoredPreferences): void { + const directory = path.dirname(this.preferencesPath); + fs.mkdirSync(directory, { recursive: true }); + fs.writeFileSync(this.preferencesPath, JSON.stringify(preferences, null, 2)); + } +} + +function getSystemLocale(): string { + return Intl.DateTimeFormat().resolvedOptions().locale || "en-US"; +} diff --git a/apps/browser/src/main/types.ts b/apps/browser/src/main/types.ts index b29bd75..1d4a683 100644 --- a/apps/browser/src/main/types.ts +++ b/apps/browser/src/main/types.ts @@ -3,6 +3,7 @@ */ import { WebContentsView } from "electron"; +import { EffectiveLanguage } from "../shared/language"; export interface Tab { id: string; @@ -23,4 +24,5 @@ export interface AppState { tabs: Tab[]; activeTabId: string | null; latestThemeColor: string | null; + language: EffectiveLanguage; } diff --git a/apps/browser/src/preload.ts b/apps/browser/src/preload.ts index a00aaef..6283203 100644 --- a/apps/browser/src/preload.ts +++ b/apps/browser/src/preload.ts @@ -56,6 +56,14 @@ contextBridge.exposeInMainWorld("electronAPI", { // App version getAppVersion: () => ipcRenderer.invoke("get-app-version"), + getLanguageState: () => ipcRenderer.invoke("get-language-state"), + setPreferredLanguage: (language: "system" | "en" | "ko") => + ipcRenderer.invoke("set-preferred-language", language), + onLanguageChanged: (callback: (state: any) => void) => { + const listener = (_event: any, state: any) => callback(state); + ipcRenderer.on("language-changed", listener); + return () => ipcRenderer.removeListener("language-changed", listener); + }, // Tab management APIs tabs: { diff --git a/apps/browser/src/renderer/app.tsx b/apps/browser/src/renderer/app.tsx index d849a60..e071ed9 100644 --- a/apps/browser/src/renderer/app.tsx +++ b/apps/browser/src/renderer/app.tsx @@ -1,102 +1,56 @@ /// -import { useState, useEffect, useRef } from "react"; +import { useEffect, useRef, useState } from "react"; import TopBar from "./components/top-bar"; import PhoneFrame from "./components/phone-frame"; import TabOverview from "./components/tab-overview"; import Settings from "./components/settings"; import MenuOverlay from "./components/menu-overlay"; +import { useBrowserPageState } from "./hooks/use-browser-page-state"; +import { getWebContentsBounds, normalizeNavigationUrl } from "./lib/app-utils"; function App() { const [_time, setTime] = useState("9:41"); - const [pageTitle, setPageTitle] = useState("New Tab"); - const [pageDomain, setPageDomain] = useState(""); - const [themeColor, setThemeColor] = useState("#1c1c1e"); // Start with blank-page color - const [textColor, setTextColor] = useState("#ffffff"); // White text for dark background const [systemTheme, setSystemTheme] = useState<"light" | "dark">("dark"); - const [currentUrl, setCurrentUrl] = useState(""); const [orientation, setOrientation] = useState<"portrait" | "landscape">( "portrait" ); const [showTabOverview, setShowTabOverview] = useState(false); const [showSettings, setShowSettings] = useState(false); const [showMenu, setShowMenu] = useState(false); - const [tabCount, setTabCount] = useState(1); const [isFullscreen, setIsFullscreen] = useState(false); const webContainerRef = useRef(null); + const pageState = useBrowserPageState(orientation); - // Initialize and listen for system theme changes useEffect(() => { - // Get initial themeγ…‡ - window.electronAPI?.getSystemTheme().then((theme: "light" | "dark") => { - setSystemTheme(theme); - }); - - // Listen for theme changes - const cleanup = window.electronAPI?.onThemeChanged( - (theme: "light" | "dark") => { - setSystemTheme(theme); - } - ); + window.electronAPI?.getSystemTheme().then(setSystemTheme); + const cleanup = window.electronAPI?.onThemeChanged(setSystemTheme); return () => { if (cleanup) cleanup(); }; }, []); - // Initialize and listen for orientation changes useEffect(() => { - // Get initial orientation - window.electronAPI - ?.getOrientation() - .then((orient: "portrait" | "landscape") => { - setOrientation(orient); - }); - - // Listen for orientation changes - const cleanup = window.electronAPI?.onOrientationChanged( - (orient: "portrait" | "landscape") => { - setOrientation(orient); - } - ); + window.electronAPI?.getOrientation().then(setOrientation); + const cleanup = window.electronAPI?.onOrientationChanged(setOrientation); return () => { if (cleanup) cleanup(); }; }, []); - // Listen for fullscreen mode changes useEffect(() => { const cleanup = window.electronAPI?.onFullscreenModeChanged( - (fullscreen: boolean) => { - setIsFullscreen(fullscreen); - } - ); - - return () => { - if (cleanup) cleanup(); - }; - }, []); - - // Listen for theme color updates from main process - useEffect(() => { - const cleanup = window.electronAPI?.webContents.onThemeColorUpdated( - (color: string) => { - setThemeColor(color); - const luminance = getLuminance(color); - setTextColor(luminance > 0.5 ? "#000000" : "#ffffff"); - } + setIsFullscreen ); - return () => { if (cleanup) cleanup(); }; }, []); - // Listen for settings open request useEffect(() => { const cleanup = window.electronAPI?.onOpenSettings(() => { setShowSettings(true); - // Hide WebContentsView when showing settings window.electronAPI?.webContents.setVisible(false); }); @@ -105,58 +59,6 @@ function App() { }; }, []); - // Track tab count - useEffect(() => { - // Get initial tab count - window.electronAPI?.tabs - .getAll() - .then((data: { tabs: any[]; activeTabId: string | null }) => { - setTabCount(data.tabs.length); - }); - - // Listen for tab updates - const cleanupTabChanged = window.electronAPI?.tabs.onTabChanged( - (data: { tabId: string; tabs: any[] }) => { - setTabCount(data.tabs.length); - - // Set bounds from renderer when tab changes (skip in fullscreen mode) - // TEMPORARILY DISABLED FOR DEBUGGING - // if (webContainerRef.current && !isFullscreen) { - // const rect = webContainerRef.current.getBoundingClientRect(); - // const statusBarHeight = 58; - // const statusBarWidth = 58; - - // window.electronAPI?.webContents.setBounds({ - // x: Math.round( - // rect.x + (orientation === "landscape" ? statusBarWidth : 0) - // ), - // y: Math.round( - // rect.y + (orientation === "landscape" ? 0 : statusBarHeight) - // ), - // width: Math.round( - // rect.width - (orientation === "landscape" ? statusBarWidth : 0) - // ), - // height: Math.round( - // rect.height - (orientation === "landscape" ? 0 : statusBarHeight) - // ), - // }); - // } - } - ); - - const cleanupTabsUpdated = window.electronAPI?.tabs.onTabsUpdated( - (data: { tabs: any[]; activeTabId: string | null }) => { - setTabCount(data.tabs.length); - } - ); - - return () => { - if (cleanupTabChanged) cleanupTabChanged(); - if (cleanupTabsUpdated) cleanupTabsUpdated(); - }; - }, [orientation]); - - // Update time useEffect(() => { const updateTime = () => { const now = new Date(); @@ -164,202 +66,54 @@ function App() { const minutes = now.getMinutes().toString().padStart(2, "0"); setTime(`${hours}:${minutes}`); }; + updateTime(); const interval = setInterval(updateTime, 60000); return () => clearInterval(interval); }, []); - // Calculate luminance to determine if color is light or dark - const getLuminance = (color: string): number => { - let r: number, g: number, b: number; - - if (color.startsWith("#")) { - const hex = color.replace("#", ""); - r = parseInt(hex.substr(0, 2), 16); - g = parseInt(hex.substr(2, 2), 16); - b = parseInt(hex.substr(4, 2), 16); - } else if (color.startsWith("rgb")) { - const matches = color.match(/\d+/g); - if (matches) { - r = parseInt(matches[0]); - g = parseInt(matches[1]); - b = parseInt(matches[2]); - } else { - return 0; - } - } else { - return 0; - } - - const rsRGB = r / 255; - const gsRGB = g / 255; - const bsRGB = b / 255; - - const rLinear = - rsRGB <= 0.03928 ? rsRGB / 12.92 : Math.pow((rsRGB + 0.055) / 1.055, 2.4); - const gLinear = - gsRGB <= 0.03928 ? gsRGB / 12.92 : Math.pow((gsRGB + 0.055) / 1.055, 2.4); - const bLinear = - bsRGB <= 0.03928 ? bsRGB / 12.92 : Math.pow((bsRGB + 0.055) / 1.055, 2.4); - - return 0.2126 * rLinear + 0.7152 * gLinear + 0.0722 * bLinear; - }; - - // Update theme color - const updateThemeColor = async () => { - // Prevent concurrent API calls - if (isExecutingJavaScriptRef.current) return; - - try { - isExecutingJavaScriptRef.current = true; - const themeColor = await window.electronAPI?.webContents.getThemeColor(); - - isExecutingJavaScriptRef.current = false; - if ( - themeColor && - themeColor !== "rgba(0, 0, 0, 0)" && - themeColor !== "transparent" - ) { - setThemeColor(themeColor); - const luminance = getLuminance(themeColor); - setTextColor(luminance > 0.5 ? "#000000" : "#ffffff"); - } else { - // Default to white background with black text when no theme color is found - setThemeColor("#ffffff"); - setTextColor("#000000"); - } - } catch (err) { - isExecutingJavaScriptRef.current = false; - // Silently ignore errors during page transitions - } - }; - - // Update page info - const updatePageInfo = async () => { - try { - let url = await window.electronAPI?.webContents.getURL(); - const title = await window.electronAPI?.webContents.getTitle(); - - console.log("[App] Raw URL from IPC:", url); - - // Filter out temporary file paths for blank-page and error-page - if (url && (url.includes("blank-page-tab-") || url.includes("error-page-tab-"))) { - console.log("[App] Filtering temporary file path to /"); - url = "/"; - } - - console.log("[App] Final URL:", url); - - setPageTitle(title || "Untitled"); - setCurrentUrl(url || "/"); - - if (url && url !== "/") { - try { - const urlObj = new URL(url); - setPageDomain(urlObj.hostname); - } catch (e) { - setPageDomain(url); - } - } else { - setPageDomain(""); - } - } catch (err) { - // Silently ignore errors during page transitions - } - }; - - // Interval refs for cleanup - const themeMonitoringIntervalRef = useRef | null>(null); - const isExecutingJavaScriptRef = useRef(false); - const crashCountRef = useRef(0); - const lastCrashTimeRef = useRef(0); - - // Start theme color monitoring - const startThemeColorMonitoring = () => { - // Clear any existing intervals - if (themeMonitoringIntervalRef.current) { - clearInterval(themeMonitoringIntervalRef.current); - themeMonitoringIntervalRef.current = null; - } - - updateThemeColor(); - - let pollCount = 0; - const fastInterval = setInterval(() => { - updateThemeColor(); - pollCount++; - if (pollCount >= 20) { - clearInterval(fastInterval); - // Switch to slower polling - themeMonitoringIntervalRef.current = setInterval(updateThemeColor, 500); - } - }, 50); - - // Store the fast interval temporarily - themeMonitoringIntervalRef.current = fastInterval; - }; - - // Stop theme color monitoring - const stopThemeColorMonitoring = () => { - if (themeMonitoringIntervalRef.current) { - clearInterval(themeMonitoringIntervalRef.current); - themeMonitoringIntervalRef.current = null; - } - }; - - // Setup webview reload listener for Cmd+R shortcut useEffect(() => { - const handleWebviewReload = () => { + const cleanup = window.electronAPI?.onWebviewReload(() => { window.electronAPI?.webContents.reload(); - }; - - const cleanup = window.electronAPI?.onWebviewReload(handleWebviewReload); + }); return () => { if (cleanup) cleanup(); }; }, []); - // Setup gesture navigation listeners using wheel events useEffect(() => { let accumulatedDeltaX = 0; let isNavigating = false; - const SWIPE_THRESHOLD = 100; - const RESET_TIMEOUT = 300; + const swipeThreshold = 100; + const resetTimeout = 300; let resetTimer: ReturnType | null = null; - const handleWheel = async (e: WheelEvent) => { - if (Math.abs(e.deltaY) > Math.abs(e.deltaX)) { - return; - } + const handleWheel = async (event: WheelEvent) => { + if (Math.abs(event.deltaY) > Math.abs(event.deltaX)) return; - accumulatedDeltaX += e.deltaX; - - if (resetTimer) { - clearTimeout(resetTimer); - } + accumulatedDeltaX += event.deltaX; + if (resetTimer) clearTimeout(resetTimer); resetTimer = setTimeout(() => { accumulatedDeltaX = 0; isNavigating = false; - }, RESET_TIMEOUT) as ReturnType; + }, resetTimeout); - if (!isNavigating) { - const canGoBack = await window.electronAPI?.webContents.canGoBack(); - const canGoForward = - await window.electronAPI?.webContents.canGoForward(); + if (isNavigating) return; - if (accumulatedDeltaX < -SWIPE_THRESHOLD && canGoBack) { - window.electronAPI?.webContents.goBack(); - isNavigating = true; - accumulatedDeltaX = 0; - } else if (accumulatedDeltaX > SWIPE_THRESHOLD && canGoForward) { - window.electronAPI?.webContents.goForward(); - isNavigating = true; - accumulatedDeltaX = 0; - } + const canGoBack = await window.electronAPI?.webContents.canGoBack(); + const canGoForward = + await window.electronAPI?.webContents.canGoForward(); + + if (accumulatedDeltaX < -swipeThreshold && canGoBack) { + window.electronAPI?.webContents.goBack(); + isNavigating = true; + accumulatedDeltaX = 0; + } else if (accumulatedDeltaX > swipeThreshold && canGoForward) { + window.electronAPI?.webContents.goForward(); + isNavigating = true; + accumulatedDeltaX = 0; } }; @@ -367,280 +121,71 @@ function App() { return () => { window.removeEventListener("wheel", handleWheel); - if (resetTimer) { - clearTimeout(resetTimer); - } + if (resetTimer) clearTimeout(resetTimer); }; }, []); - // Setup WebContents event listeners via IPC - useEffect(() => { - const handleDomReady = () => { - updatePageInfo(); - startThemeColorMonitoring(); - }; - - const handleDidNavigate = () => { - stopThemeColorMonitoring(); - startThemeColorMonitoring(); - updatePageInfo(); - }; - - const handleDidNavigateInPage = () => { - updateThemeColor(); - setTimeout(updateThemeColor, 50); - updatePageInfo(); - }; - - const handleDidStartLoading = () => { - stopThemeColorMonitoring(); - // Don't reset theme color here - keep previous color to avoid flashing - // The new theme color will be applied when the page loads - }; - - const handleDidStopLoading = () => { - startThemeColorMonitoring(); - }; - - const handleRenderProcessGone = (_details: any) => { - stopThemeColorMonitoring(); - - const now = Date.now(); - if (now - lastCrashTimeRef.current > 10000) { - crashCountRef.current = 0; - } - - crashCountRef.current++; - lastCrashTimeRef.current = now; - - setPageTitle(`Page Crashed (${crashCountRef.current})`); - setPageDomain("Please navigate to another page"); - setThemeColor("#ffffff"); - setTextColor("#000000"); - - if (crashCountRef.current < 3) { - setTimeout(() => { - window.electronAPI?.webContents.reload(); - }, 2000); - } - }; - - const handleDidFailLoad = () => { - stopThemeColorMonitoring(); - }; - - const handleHttpError = ( - statusCode: number, - statusText: string, - url: string - ) => { - console.log( - `[App] HTTP Error: ${statusCode} ${statusText} for ${url}` - ); - stopThemeColorMonitoring(); - }; - - const cleanupDomReady = - window.electronAPI?.webContents.onDomReady(handleDomReady); - const cleanupDidNavigate = - window.electronAPI?.webContents.onDidNavigate(handleDidNavigate); - const cleanupDidNavigateInPage = - window.electronAPI?.webContents.onDidNavigateInPage( - handleDidNavigateInPage - ); - const cleanupDidStartLoading = - window.electronAPI?.webContents.onDidStartLoading(handleDidStartLoading); - const cleanupDidStopLoading = - window.electronAPI?.webContents.onDidStopLoading(handleDidStopLoading); - const cleanupRenderProcessGone = - window.electronAPI?.webContents.onRenderProcessGone( - handleRenderProcessGone - ); - const cleanupDidFailLoad = - window.electronAPI?.webContents.onDidFailLoad(handleDidFailLoad); - const cleanupHttpError = - window.electronAPI?.webContents.onHttpError(handleHttpError); - - // Initial page info fetch after a delay to ensure WebContentsView is ready - setTimeout(() => { - updatePageInfo(); - startThemeColorMonitoring(); - }, 1000); - - return () => { - stopThemeColorMonitoring(); - if (cleanupDomReady) cleanupDomReady(); - if (cleanupDidNavigate) cleanupDidNavigate(); - if (cleanupDidNavigateInPage) cleanupDidNavigateInPage(); - if (cleanupDidStartLoading) cleanupDidStartLoading(); - if (cleanupDidStopLoading) cleanupDidStopLoading(); - if (cleanupRenderProcessGone) cleanupRenderProcessGone(); - if (cleanupDidFailLoad) cleanupDidFailLoad(); - if (cleanupHttpError) cleanupHttpError(); - }; - }, []); + const syncWebContentsBounds = () => { + if (!webContainerRef.current) return; + const rect = webContainerRef.current.getBoundingClientRect(); + window.electronAPI?.webContents.setBounds( + getWebContentsBounds(rect, orientation) + ); + }; const handleNavigate = (url: string) => { - let finalUrl = url.trim(); - - // If already has a valid protocol, use as-is - if ( - finalUrl.startsWith("http://") || - finalUrl.startsWith("https://") || - finalUrl.startsWith("file://") - ) { - window.electronAPI?.webContents.loadURL(finalUrl); - return; - } - - // Check if it's a local URL (localhost or private IP) - const isLocalUrl = - /^(localhost|127\.\d+\.\d+\.\d+|192\.168\.\d+\.\d+|10\.\d+\.\d+\.\d+|172\.(1[6-9]|2\d|3[01])\.\d+\.\d+)(:\d+)?/i.test( - finalUrl - ); - - if (isLocalUrl) { - // Use http:// for local development servers - finalUrl = "http://" + finalUrl; - } else { - // Use https:// for external sites - finalUrl = "https://" + finalUrl; - } - - window.electronAPI?.webContents.loadURL(finalUrl); + window.electronAPI?.webContents.loadURL(normalizeNavigationUrl(url)); }; const handleToggleTabs = () => { const newState = !showTabOverview; setShowTabOverview(newState); - // If closing tab overview, set bounds before showing view - if (!newState && webContainerRef.current) { - const rect = webContainerRef.current.getBoundingClientRect(); - const statusBarHeight = 58; - const statusBarWidth = 58; - - window.electronAPI?.webContents.setBounds({ - x: Math.round( - rect.x + (orientation === "landscape" ? statusBarWidth : 0) - ), - y: Math.round( - rect.y + (orientation === "landscape" ? 0 : statusBarHeight) - ), - width: Math.round( - rect.width - (orientation === "landscape" ? statusBarWidth : 0) - ), - height: Math.round( - rect.height - (orientation === "landscape" ? 0 : statusBarHeight) - ), - }); - } - - // Toggle WebContentsView visibility + if (!newState) syncWebContentsBounds(); window.electronAPI?.webContents.setVisible(!newState); }; const handleCloseTabOverview = () => { setShowTabOverview(false); - - // Set bounds before showing view - if (webContainerRef.current) { - const rect = webContainerRef.current.getBoundingClientRect(); - const statusBarHeight = 58; - const statusBarWidth = 58; - - window.electronAPI?.webContents.setBounds({ - x: Math.round( - rect.x + (orientation === "landscape" ? statusBarWidth : 0) - ), - y: Math.round( - rect.y + (orientation === "landscape" ? 0 : statusBarHeight) - ), - width: Math.round( - rect.width - (orientation === "landscape" ? statusBarWidth : 0) - ), - height: Math.round( - rect.height - (orientation === "landscape" ? 0 : statusBarHeight) - ), - }); - } - - // Show WebContentsView when closing tab overview + syncWebContentsBounds(); window.electronAPI?.webContents.setVisible(true); }; - const handleRefresh = () => { - window.electronAPI?.webContents.reload(); - }; - const handleCloseSettings = () => { setShowSettings(false); - - // Set bounds before showing view - if (webContainerRef.current) { - const rect = webContainerRef.current.getBoundingClientRect(); - const statusBarHeight = 58; - const statusBarWidth = 58; - - window.electronAPI?.webContents.setBounds({ - x: Math.round( - rect.x + (orientation === "landscape" ? statusBarWidth : 0) - ), - y: Math.round( - rect.y + (orientation === "landscape" ? 0 : statusBarHeight) - ), - width: Math.round( - rect.width - (orientation === "landscape" ? statusBarWidth : 0) - ), - height: Math.round( - rect.height - (orientation === "landscape" ? 0 : statusBarHeight) - ), - }); - } - - // Show WebContentsView when closing settings + syncWebContentsBounds(); window.electronAPI?.webContents.setVisible(true); }; const handleShowMenu = () => { if (showSettings) { - // If settings is open, close it and show WebContentsView handleCloseSettings(); - } else { - // Hide WebContentsView and show settings directly - window.electronAPI?.webContents.setVisible(false); - setShowSettings(true); + return; } - }; - - const handleCloseMenu = () => { - setShowMenu(false); - }; - const handleOpenSettingsFromMenu = () => { + window.electronAPI?.webContents.setVisible(false); setShowSettings(true); - // WebContentsView is already hidden }; return (
window.electronAPI?.webContents.reload()} theme={systemTheme} orientation={orientation} - tabCount={tabCount} + tabCount={pageState.tabCount} /> setShowMenu(false)} + onOpenSettings={() => setShowSettings(true)} /> )}
diff --git a/apps/browser/src/renderer/components/menu-overlay.tsx b/apps/browser/src/renderer/components/menu-overlay.tsx index 7469692..39a8a43 100644 --- a/apps/browser/src/renderer/components/menu-overlay.tsx +++ b/apps/browser/src/renderer/components/menu-overlay.tsx @@ -1,5 +1,6 @@ import { useState, useEffect } from "react"; import { Star, Settings } from "lucide-react"; +import { useI18n } from "../i18n/i18n-context"; interface MenuOverlayProps { theme: "light" | "dark"; @@ -18,6 +19,7 @@ function MenuOverlay({ }: MenuOverlayProps) { const [isBookmarked, setIsBookmarked] = useState(false); const isDark = theme === "dark"; + const { t } = useI18n(); useEffect(() => { checkBookmarkStatus(); @@ -106,7 +108,7 @@ function MenuOverlay({ fill={isBookmarked ? "currentColor" : "none"} /> - {isBookmarked ? "Remove from Favorites" : "Add to Favorites"} + {isBookmarked ? t("removeFromFavorites") : t("addToFavorites")} )} @@ -119,7 +121,7 @@ function MenuOverlay({ }`} > - Settings + {t("settings")} diff --git a/apps/browser/src/renderer/components/settings.tsx b/apps/browser/src/renderer/components/settings.tsx index 128237c..511510a 100644 --- a/apps/browser/src/renderer/components/settings.tsx +++ b/apps/browser/src/renderer/components/settings.tsx @@ -1,6 +1,14 @@ -import { useState, useEffect } from "react"; -import { Info, ChevronRight, ChevronLeft, Star, Trash2, Plus, Edit2, X } from "lucide-react"; +import { useEffect, useState } from "react"; +import { Info, Star } from "lucide-react"; import appIcon from "../../../assets/icon.png"; +import { AboutView } from "./settings/about-view"; +import { BookmarkDialog } from "./settings/bookmark-dialog"; +import { BookmarksView } from "./settings/bookmarks-view"; +import { LanguageView } from "./settings/language-view"; +import { MainView } from "./settings/main-view"; +import { Bookmark, SettingsSection, SettingsView } from "./settings/types"; +import { useBookmarks } from "./settings/use-bookmarks"; +import { useI18n } from "../i18n/i18n-context"; interface SettingsProps { theme: "light" | "dark"; @@ -8,792 +16,153 @@ interface SettingsProps { onClose: () => void; } -interface SettingsSection { - id: string; - title: string; - items: SettingsItem[]; -} - -interface SettingsItem { - id: string; - label: string; - value?: string; - icon?: React.ReactNode; - hasDetail?: boolean; - onClick?: () => void; -} - -interface Bookmark { - id: string; - title: string; - url: string; - favicon?: string; - createdAt: number; - updatedAt: number; -} - -// Default bookmarks (same as blank-page.html) -const defaultBookmarks: Bookmark[] = [ - { - id: "default-google", - title: "Google", - url: "https://www.google.com", - favicon: "https://www.google.com/s2/favicons?domain=google.com&sz=128", - createdAt: 0, - updatedAt: 0, - }, - { - id: "default-youtube", - title: "YouTube", - url: "https://www.youtube.com", - favicon: "https://www.google.com/s2/favicons?domain=youtube.com&sz=128", - createdAt: 0, - updatedAt: 0, - }, - { - id: "default-netflix", - title: "Netflix", - url: "https://www.netflix.com", - favicon: "https://www.google.com/s2/favicons?domain=netflix.com&sz=128", - createdAt: 0, - updatedAt: 0, - }, - { - id: "default-x", - title: "X", - url: "https://x.com", - favicon: "https://www.google.com/s2/favicons?domain=x.com&sz=128", - createdAt: 0, - updatedAt: 0, - }, -]; - function Settings({ theme, orientation, onClose }: SettingsProps) { - const [currentView, setCurrentView] = useState<"main" | "about" | "bookmarks">("main"); - const [appVersion, setAppVersion] = useState("0.0.0"); - const [appIconPath, setAppIconPath] = useState(""); - const [bookmarks, setBookmarks] = useState([]); - const [hiddenDefaultBookmarks, setHiddenDefaultBookmarks] = useState>(new Set()); + const [currentView, setCurrentView] = useState("main"); + const [appVersion, setAppVersion] = useState("0.0.0"); + const [appIconPath, setAppIconPath] = useState(""); const [showBookmarkDialog, setShowBookmarkDialog] = useState(false); const [editingBookmark, setEditingBookmark] = useState(null); const [bookmarkTitle, setBookmarkTitle] = useState(""); const [bookmarkUrl, setBookmarkUrl] = useState(""); + const { allBookmarks, deleteBookmark } = useBookmarks(); + const isDark = theme === "dark"; + const { effectiveLanguage, preferredLanguage, t } = useI18n(); useEffect(() => { - // Get app version - window.electronAPI?.getAppVersion().then((version: string) => { - setAppVersion(version); - }); - - // Set app icon path from imported image + window.electronAPI?.getAppVersion().then(setAppVersion); setAppIconPath(appIcon); - - // Load hidden default bookmarks from localStorage - try { - const hidden = localStorage.getItem("hiddenDefaultBookmarks"); - if (hidden) { - setHiddenDefaultBookmarks(new Set(JSON.parse(hidden))); - } - } catch (error) { - console.error("Failed to load hidden bookmarks:", error); - } - - // Load bookmarks - loadBookmarks(); - - // Listen for bookmark updates - const unsubscribe = window.electronAPI?.bookmarks?.onUpdate(() => { - loadBookmarks(); - }); - - return () => { - if (unsubscribe) unsubscribe(); - }; }, []); - const loadBookmarks = async () => { - try { - const allBookmarks = await window.electronAPI?.bookmarks?.getAll(); - - // Load cached favicons for bookmarks that don't have data URLs - if (allBookmarks) { - const bookmarksWithFavicons = await Promise.all( - allBookmarks.map(async (bookmark) => { - // If favicon exists and is not a data URL, try to get cached version - if (bookmark.favicon && !bookmark.favicon.startsWith('data:')) { - try { - const cachedFavicon = await window.electronAPI?.favicon?.getWithFallback(bookmark.url); - if (cachedFavicon) { - return { ...bookmark, favicon: cachedFavicon }; - } - } catch (error) { - console.error("Failed to load cached favicon:", error); - } - } - return bookmark; - }) - ); - setBookmarks(bookmarksWithFavicons); - } else { - setBookmarks([]); - } - } catch (error) { - console.error("Failed to load bookmarks:", error); - setBookmarks([]); - } - }; - - // Get all bookmarks (user + visible default bookmarks) - const getAllBookmarks = (): Bookmark[] => { - const visibleDefaults = defaultBookmarks.filter( - (bookmark) => !hiddenDefaultBookmarks.has(bookmark.id) - ); - - console.log("[Settings] User bookmarks:", bookmarks.length, bookmarks); - console.log("[Settings] Visible defaults:", visibleDefaults.length, visibleDefaults); - console.log("[Settings] Hidden defaults:", Array.from(hiddenDefaultBookmarks)); - - // Show user bookmarks + visible default bookmarks - // User bookmarks first, then default bookmarks - const allBookmarks = [...bookmarks, ...visibleDefaults]; - console.log("[Settings] Total bookmarks:", allBookmarks.length, allBookmarks); - - return allBookmarks; - }; - - const handleDeleteBookmark = async (id: string) => { - try { - // Check if it's a default bookmark - if (id.startsWith("default-")) { - // Hide default bookmark - const newHidden = new Set(hiddenDefaultBookmarks); - newHidden.add(id); - setHiddenDefaultBookmarks(newHidden); - - // Save to localStorage - localStorage.setItem( - "hiddenDefaultBookmarks", - JSON.stringify(Array.from(newHidden)) - ); - } else { - // Remove user bookmark - await window.electronAPI?.bookmarks?.remove(id); - // Bookmarks will be reloaded via onUpdate listener - } - } catch (error) { - console.error("Failed to delete bookmark:", error); - } - }; + const settingsSections: SettingsSection[] = [ + { + id: "general", + title: t("general"), + items: [ + { + id: "bookmarks", + label: t("favorites"), + value: t("favoritesCount", { count: allBookmarks.length }), + icon: , + hasDetail: true, + onClick: () => setCurrentView("bookmarks"), + }, + { + id: "language", + label: t("language"), + value: + preferredLanguage === "system" + ? t("systemDefault") + : effectiveLanguage.toUpperCase(), + icon: , + hasDetail: true, + onClick: () => setCurrentView("language"), + }, + { + id: "about", + label: t("about"), + value: "Aka Browser", + icon: , + hasDetail: true, + onClick: () => setCurrentView("about"), + }, + ], + }, + ]; - const handleAddBookmark = () => { + const openAddBookmarkDialog = () => { setEditingBookmark(null); setBookmarkTitle(""); setBookmarkUrl(""); setShowBookmarkDialog(true); }; - const handleEditBookmark = (bookmark: Bookmark) => { - // Don't allow editing default bookmarks - if (bookmark.id.startsWith("default-")) { - return; - } - + const openEditBookmarkDialog = (bookmark: Bookmark) => { + if (bookmark.id.startsWith("default-")) return; + setEditingBookmark(bookmark); setBookmarkTitle(bookmark.title); setBookmarkUrl(bookmark.url); setShowBookmarkDialog(true); }; - const handleSaveBookmark = async () => { - if (!bookmarkTitle.trim() || !bookmarkUrl.trim()) { - return; - } + const closeBookmarkDialog = () => { + setShowBookmarkDialog(false); + setEditingBookmark(null); + setBookmarkTitle(""); + setBookmarkUrl(""); + }; + + const saveBookmark = async () => { + if (!bookmarkTitle.trim() || !bookmarkUrl.trim()) return; try { if (editingBookmark) { - // Update existing bookmark await window.electronAPI?.bookmarks?.update(editingBookmark.id, { title: bookmarkTitle.trim(), url: bookmarkUrl.trim(), }); } else { - // Add new bookmark await window.electronAPI?.bookmarks?.add( bookmarkTitle.trim(), bookmarkUrl.trim() ); } - setShowBookmarkDialog(false); - setEditingBookmark(null); - setBookmarkTitle(""); - setBookmarkUrl(""); + closeBookmarkDialog(); } catch (error) { console.error("Failed to save bookmark:", error); } }; - const handleCancelBookmarkDialog = () => { - setShowBookmarkDialog(false); - setEditingBookmark(null); - setBookmarkTitle(""); - setBookmarkUrl(""); - }; - - const isDark = theme === "dark"; - - const settingsSections: SettingsSection[] = [ - { - id: "general", - title: "General", - items: [ - { - id: "bookmarks", - label: "Favorites", - value: `${getAllBookmarks().length} items`, - icon: , - hasDetail: true, - onClick: () => setCurrentView("bookmarks"), - }, - { - id: "about", - label: "About", - value: "Aka Browser", - icon: , - hasDetail: true, - onClick: () => setCurrentView("about"), - }, - ], - }, - ]; - - const renderMainView = () => ( - <> - {/* Header */} -
-

- Settings -

- -
- - {/* Settings List */} -
-
- {settingsSections.map((section) => ( -
- {/* Section Title */} -
- {section.title} -
- - {/* Section Items */} -
- {section.items.map((item, index) => ( -
- {index > 0 && ( -
- )} - -
- ))} -
-
- ))} -
-
- - ); - - const renderAboutView = () => ( - <> - {/* Header */} -
- -

- About -

-
-
- - {/* About Content */} -
-
- {/* App Icon and Name */} -
-
- {appIconPath ? ( - Aka Browser - ) : ( -
- -
- )} -
-

- Aka Browser -

-

- Version {appVersion} -

-
- - {/* Info Section */} -
-
- Information -
-
-
-
- - Name - - - Aka Browser - -
-
-
-
-
- - Version - - - {appVersion} - -
-
-
-
-
- - Description - - - A lightweight, elegant web browser - -
-
-
-
-
-
- - ); - - const renderBookmarksView = () => ( - <> - {/* Header */} -
- -

- Favorites -

- -
- - {/* Bookmarks Content */} -
- {getAllBookmarks().length === 0 ? ( -
- -

- No favorites yet.
- Add your favorite sites from the menu. -

-
- ) : ( -
- {getAllBookmarks().map((bookmark) => ( -
-
- {bookmark.favicon ? ( - { - const target = e.target as HTMLImageElement; - target.style.display = "none"; - const parent = target.parentElement; - if (parent) { - parent.textContent = bookmark.title.charAt(0).toUpperCase(); - } - }} - /> - ) : ( - - {bookmark.title.charAt(0).toUpperCase()} - - )} -
-
-
- {bookmark.title} -
-
- {(() => { - try { - return new URL(bookmark.url).hostname; - } catch { - return bookmark.url; - } - })()} -
-
-
- {!bookmark.id.startsWith("default-") && ( - - )} - -
-
- ))} -
- )} -
- - ); - return (
{ - // Only close if clicking the background - if (e.target === e.currentTarget) { - onClose(); - } + data-orientation={orientation} + onClick={(event) => { + if (event.target === event.currentTarget) onClose(); }} > - {currentView === "main" - ? renderMainView() - : currentView === "about" - ? renderAboutView() - : renderBookmarksView()} + {currentView === "main" && ( + + )} + {currentView === "about" && ( + setCurrentView("main")} + /> + )} + {currentView === "bookmarks" && ( + setCurrentView("main")} + onDelete={deleteBookmark} + onEdit={openEditBookmarkDialog} + /> + )} + {currentView === "language" && ( + setCurrentView("main")} /> + )} - {/* Bookmark Add/Edit Dialog */} {showBookmarkDialog && ( -
-
e.stopPropagation()} - > - {/* Dialog Header */} -
-

- {editingBookmark ? "Edit Favorite" : "Add Favorite"} -

- -
- - {/* Dialog Content */} -
-
- - setBookmarkTitle(e.target.value)} - placeholder="Enter title" - className={`w-full px-4 py-2 rounded-lg border ${ - isDark - ? "bg-zinc-700 border-zinc-600 text-white placeholder-zinc-400" - : "bg-white border-zinc-300 text-zinc-900 placeholder-zinc-500" - } focus:outline-none focus:ring-2 focus:ring-blue-500`} - autoFocus - /> -
- -
- - setBookmarkUrl(e.target.value)} - placeholder="https://example.com" - className={`w-full px-4 py-2 rounded-lg border ${ - isDark - ? "bg-zinc-700 border-zinc-600 text-white placeholder-zinc-400" - : "bg-white border-zinc-300 text-zinc-900 placeholder-zinc-500" - } focus:outline-none focus:ring-2 focus:ring-blue-500`} - /> -
-
- - {/* Dialog Footer */} -
- - -
-
-
+ )}
); diff --git a/apps/browser/src/renderer/components/settings/about-view.tsx b/apps/browser/src/renderer/components/settings/about-view.tsx new file mode 100644 index 0000000..ef8704c --- /dev/null +++ b/apps/browser/src/renderer/components/settings/about-view.tsx @@ -0,0 +1,150 @@ +import { ChevronLeft, Info } from "lucide-react"; +import { useI18n } from "../../i18n/i18n-context"; + +interface AboutViewProps { + appIconPath: string; + appVersion: string; + isDark: boolean; + onBack: () => void; +} + +export function AboutView({ + appIconPath, + appVersion, + isDark, + onBack, +}: AboutViewProps) { + const { t } = useI18n(); + + return ( + <> +
+ +

+ {t("about")} +

+
+
+ +
+
+
+
+ {appIconPath ? ( + Aka Browser + ) : ( +
+ +
+ )} +
+

+ Aka Browser +

+

+ {t("version")} {appVersion} +

+
+ +
+
+ {t("information")} +
+
+ + + + + +
+
+
+
+ + ); +} + +function Divider({ isDark }: { isDark: boolean }) { + return ( +
+ ); +} + +function InfoRow({ + isDark, + label, + value, + wrap, +}: { + isDark: boolean; + label: string; + value: string; + wrap?: boolean; +}) { + return ( +
+
+ + {label} + + + {value} + +
+
+ ); +} diff --git a/apps/browser/src/renderer/components/settings/bookmark-dialog.tsx b/apps/browser/src/renderer/components/settings/bookmark-dialog.tsx new file mode 100644 index 0000000..136504f --- /dev/null +++ b/apps/browser/src/renderer/components/settings/bookmark-dialog.tsx @@ -0,0 +1,155 @@ +import { X } from "lucide-react"; +import { useI18n } from "../../i18n/i18n-context"; +import { Bookmark } from "./types"; + +interface BookmarkDialogProps { + editingBookmark: Bookmark | null; + isDark: boolean; + onCancel: () => void; + onSave: () => void; + setTitle: (title: string) => void; + setUrl: (url: string) => void; + title: string; + url: string; +} + +export function BookmarkDialog({ + editingBookmark, + isDark, + onCancel, + onSave, + setTitle, + setUrl, + title, + url, +}: BookmarkDialogProps) { + const isDisabled = !title.trim() || !url.trim(); + const { t } = useI18n(); + + return ( +
+
event.stopPropagation()} + > +
+

+ {editingBookmark ? t("editFavorite") : t("addFavorite")} +

+ +
+ +
+ + +
+ +
+ + +
+
+
+ ); +} + +function Field({ + autoFocus, + isDark, + label, + onChange, + placeholder, + type, + value, +}: { + autoFocus?: boolean; + isDark: boolean; + label: string; + onChange: (value: string) => void; + placeholder: string; + type: string; + value: string; +}) { + return ( +
+ + onChange(event.target.value)} + placeholder={placeholder} + className={`w-full px-4 py-2 rounded-lg border ${ + isDark + ? "bg-zinc-700 border-zinc-600 text-white placeholder-zinc-400" + : "bg-white border-zinc-300 text-zinc-900 placeholder-zinc-500" + } focus:outline-none focus:ring-2 focus:ring-blue-500`} + autoFocus={autoFocus} + /> +
+ ); +} diff --git a/apps/browser/src/renderer/components/settings/bookmarks-view.tsx b/apps/browser/src/renderer/components/settings/bookmarks-view.tsx new file mode 100644 index 0000000..96376c1 --- /dev/null +++ b/apps/browser/src/renderer/components/settings/bookmarks-view.tsx @@ -0,0 +1,212 @@ +import { ChevronLeft, Edit2, Plus, Star, Trash2 } from "lucide-react"; +import { useI18n } from "../../i18n/i18n-context"; +import { Bookmark } from "./types"; + +interface BookmarksViewProps { + bookmarks: Bookmark[]; + isDark: boolean; + onAdd: () => void; + onBack: () => void; + onDelete: (id: string) => void; + onEdit: (bookmark: Bookmark) => void; +} + +export function BookmarksView({ + bookmarks, + isDark, + onAdd, + onBack, + onDelete, + onEdit, +}: BookmarksViewProps) { + const { t } = useI18n(); + + return ( + <> +
+ +

+ {t("favorites")} +

+ +
+ +
+ {bookmarks.length === 0 ? ( + + ) : ( +
+ {bookmarks.map((bookmark) => ( + + ))} +
+ )} +
+ + ); +} + +function EmptyState({ isDark }: { isDark: boolean }) { + const { t } = useI18n(); + + return ( +
+ +

+ {t("noFavorites")} +
+ {t("noFavoritesHint")} +

+
+ ); +} + +function BookmarkRow({ + bookmark, + isDark, + onDelete, + onEdit, +}: { + bookmark: Bookmark; + isDark: boolean; + onDelete: (id: string) => void; + onEdit: (bookmark: Bookmark) => void; +}) { + const isDefault = bookmark.id.startsWith("default-"); + const { t } = useI18n(); + + return ( +
+ +
+
+ {bookmark.title} +
+
+ {formatBookmarkHost(bookmark.url)} +
+
+
+ {!isDefault && ( + + )} + +
+
+ ); +} + +function BookmarkIcon({ + bookmark, + isDark, +}: { + bookmark: Bookmark; + isDark: boolean; +}) { + return ( +
+ {bookmark.favicon ? ( + { + const target = event.target as HTMLImageElement; + target.style.display = "none"; + const parent = target.parentElement; + if (parent) parent.textContent = bookmark.title.charAt(0).toUpperCase(); + }} + /> + ) : ( + + {bookmark.title.charAt(0).toUpperCase()} + + )} +
+ ); +} + +function formatBookmarkHost(url: string): string { + try { + return new URL(url).hostname; + } catch { + return url; + } +} diff --git a/apps/browser/src/renderer/components/settings/language-view.tsx b/apps/browser/src/renderer/components/settings/language-view.tsx new file mode 100644 index 0000000..82d126b --- /dev/null +++ b/apps/browser/src/renderer/components/settings/language-view.tsx @@ -0,0 +1,82 @@ +import { ChevronLeft, Check } from "lucide-react"; +import { languageOptions, useI18n } from "../../i18n/i18n-context"; + +interface LanguageViewProps { + isDark: boolean; + onBack: () => void; +} + +export function LanguageView({ isDark, onBack }: LanguageViewProps) { + const { preferredLanguage, setPreferredLanguage, t } = useI18n(); + + return ( + <> +
+ +

+ {t("language")} +

+
+
+ +
+
+ {languageOptions.map((option, index) => ( +
+ {index > 0 && ( +
+ )} + +
+ ))} +
+ + + {t("contributionHelp")} + +
+ + ); +} diff --git a/apps/browser/src/renderer/components/settings/main-view.tsx b/apps/browser/src/renderer/components/settings/main-view.tsx new file mode 100644 index 0000000..71be21d --- /dev/null +++ b/apps/browser/src/renderer/components/settings/main-view.tsx @@ -0,0 +1,123 @@ +import { ChevronRight } from "lucide-react"; +import { useI18n } from "../../i18n/i18n-context"; +import { SettingsSection } from "./types"; + +interface MainViewProps { + isDark: boolean; + onClose: () => void; + sections: SettingsSection[]; +} + +export function MainView({ isDark, onClose, sections }: MainViewProps) { + const { t } = useI18n(); + + return ( + <> +
+

+ {t("settings")} +

+ +
+ +
+
+ {sections.map((section) => ( +
+
+ {section.title} +
+ +
+ {section.items.map((item, index) => ( +
+ {index > 0 && ( +
+ )} + +
+ ))} +
+
+ ))} +
+
+ + ); +} diff --git a/apps/browser/src/renderer/components/settings/types.ts b/apps/browser/src/renderer/components/settings/types.ts new file mode 100644 index 0000000..42cf0c0 --- /dev/null +++ b/apps/browser/src/renderer/components/settings/types.ts @@ -0,0 +1,62 @@ +import type { ReactNode } from "react"; + +export type SettingsView = "main" | "about" | "bookmarks" | "language"; + +export interface SettingsSection { + id: string; + title: string; + items: SettingsItem[]; +} + +export interface SettingsItem { + id: string; + label: string; + value?: string; + icon?: ReactNode; + hasDetail?: boolean; + onClick?: () => void; +} + +export interface Bookmark { + id: string; + title: string; + url: string; + favicon?: string; + createdAt: number; + updatedAt: number; +} + +export const defaultBookmarks: Bookmark[] = [ + { + id: "default-google", + title: "Google", + url: "https://www.google.com", + favicon: "https://www.google.com/s2/favicons?domain=google.com&sz=128", + createdAt: 0, + updatedAt: 0, + }, + { + id: "default-youtube", + title: "YouTube", + url: "https://www.youtube.com", + favicon: "https://www.google.com/s2/favicons?domain=youtube.com&sz=128", + createdAt: 0, + updatedAt: 0, + }, + { + id: "default-netflix", + title: "Netflix", + url: "https://www.netflix.com", + favicon: "https://www.google.com/s2/favicons?domain=netflix.com&sz=128", + createdAt: 0, + updatedAt: 0, + }, + { + id: "default-x", + title: "X", + url: "https://x.com", + favicon: "https://www.google.com/s2/favicons?domain=x.com&sz=128", + createdAt: 0, + updatedAt: 0, + }, +]; diff --git a/apps/browser/src/renderer/components/settings/use-bookmarks.ts b/apps/browser/src/renderer/components/settings/use-bookmarks.ts new file mode 100644 index 0000000..9d208b5 --- /dev/null +++ b/apps/browser/src/renderer/components/settings/use-bookmarks.ts @@ -0,0 +1,93 @@ +import { useEffect, useMemo, useState } from "react"; +import { Bookmark, defaultBookmarks } from "./types"; + +const hiddenDefaultsKey = "hiddenDefaultBookmarks"; + +export function useBookmarks() { + const [bookmarks, setBookmarks] = useState([]); + const [hiddenDefaultBookmarks, setHiddenDefaultBookmarks] = useState< + Set + >(new Set()); + + const loadBookmarks = async () => { + try { + const allBookmarks = await window.electronAPI?.bookmarks?.getAll(); + if (!allBookmarks) { + setBookmarks([]); + return; + } + + const withFavicons = await Promise.all( + allBookmarks.map(async (bookmark) => { + if (!bookmark.favicon || bookmark.favicon.startsWith("data:")) { + return bookmark; + } + + try { + const cachedFavicon = + await window.electronAPI?.favicon?.getWithFallback(bookmark.url); + return cachedFavicon + ? { ...bookmark, favicon: cachedFavicon } + : bookmark; + } catch (error) { + console.error("Failed to load cached favicon:", error); + return bookmark; + } + }) + ); + + setBookmarks(withFavicons); + } catch (error) { + console.error("Failed to load bookmarks:", error); + setBookmarks([]); + } + }; + + useEffect(() => { + try { + const hidden = localStorage.getItem(hiddenDefaultsKey); + if (hidden) { + setHiddenDefaultBookmarks(new Set(JSON.parse(hidden))); + } + } catch (error) { + console.error("Failed to load hidden bookmarks:", error); + } + + loadBookmarks(); + const unsubscribe = window.electronAPI?.bookmarks?.onUpdate(loadBookmarks); + return () => { + if (unsubscribe) unsubscribe(); + }; + }, []); + + const allBookmarks = useMemo(() => { + const visibleDefaults = defaultBookmarks.filter( + (bookmark) => !hiddenDefaultBookmarks.has(bookmark.id) + ); + return [...bookmarks, ...visibleDefaults]; + }, [bookmarks, hiddenDefaultBookmarks]); + + const deleteBookmark = async (id: string) => { + try { + if (id.startsWith("default-")) { + const newHidden = new Set(hiddenDefaultBookmarks); + newHidden.add(id); + setHiddenDefaultBookmarks(newHidden); + localStorage.setItem( + hiddenDefaultsKey, + JSON.stringify(Array.from(newHidden)) + ); + return; + } + + await window.electronAPI?.bookmarks?.remove(id); + } catch (error) { + console.error("Failed to delete bookmark:", error); + } + }; + + return { + allBookmarks, + deleteBookmark, + }; +} diff --git a/apps/browser/src/renderer/components/top-bar.tsx b/apps/browser/src/renderer/components/top-bar.tsx index 81976a2..849ee19 100644 --- a/apps/browser/src/renderer/components/top-bar.tsx +++ b/apps/browser/src/renderer/components/top-bar.tsx @@ -1,6 +1,7 @@ import { useState } from "react"; import WindowControls from "./window-controls"; import NavigationControls from "./navigation-controls"; +import { useI18n } from "../i18n/i18n-context"; interface TopBarProps { pageTitle: string; @@ -29,6 +30,7 @@ function TopBar({ }: TopBarProps) { const [isEditing, setIsEditing] = useState(false); const [urlInput, setUrlInput] = useState(""); + const { t } = useI18n(); const handleTitleClick = () => { setIsEditing(true); @@ -90,7 +92,7 @@ function TopBar({ ? 'text-[rgba(255,255,255,0.85)] placeholder:text-[rgba(255,255,255,0.4)]' : 'text-[rgba(0,0,0,0.85)] placeholder:text-[rgba(0,0,0,0.4)]' }`} - placeholder="Enter URL..." + placeholder={t("enterUrl")} /> ) : ( <> diff --git a/apps/browser/src/renderer/hooks/use-browser-page-state.ts b/apps/browser/src/renderer/hooks/use-browser-page-state.ts new file mode 100644 index 0000000..8c11f09 --- /dev/null +++ b/apps/browser/src/renderer/hooks/use-browser-page-state.ts @@ -0,0 +1,231 @@ +import { useEffect, useRef, useState } from "react"; +import { getLuminance } from "../lib/app-utils"; + +interface TabListData { + tabs: any[]; + activeTabId: string | null; +} + +export function useBrowserPageState(orientation: "portrait" | "landscape") { + const [pageTitle, setPageTitle] = useState("New Tab"); + const [pageDomain, setPageDomain] = useState(""); + const [themeColor, setThemeColor] = useState("#1c1c1e"); + const [textColor, setTextColor] = useState("#ffffff"); + const [currentUrl, setCurrentUrl] = useState(""); + const [tabCount, setTabCount] = useState(1); + const themeMonitoringIntervalRef = useRef | null>(null); + const isExecutingJavaScriptRef = useRef(false); + const crashCountRef = useRef(0); + const lastCrashTimeRef = useRef(0); + + const setReadableThemeColor = (color: string) => { + setThemeColor(color); + setTextColor(getLuminance(color) > 0.5 ? "#000000" : "#ffffff"); + }; + + const updateThemeColor = async () => { + if (isExecutingJavaScriptRef.current) return; + + try { + isExecutingJavaScriptRef.current = true; + const nextThemeColor = + await window.electronAPI?.webContents.getThemeColor(); + isExecutingJavaScriptRef.current = false; + + if ( + nextThemeColor && + nextThemeColor !== "rgba(0, 0, 0, 0)" && + nextThemeColor !== "transparent" + ) { + setReadableThemeColor(nextThemeColor); + } else { + setThemeColor("#ffffff"); + setTextColor("#000000"); + } + } catch { + isExecutingJavaScriptRef.current = false; + } + }; + + const updatePageInfo = async () => { + try { + let url = await window.electronAPI?.webContents.getURL(); + const title = await window.electronAPI?.webContents.getTitle(); + + if (url && (url.includes("blank-page-tab-") || url.includes("error-page-tab-"))) { + url = "/"; + } + + setPageTitle(title || "Untitled"); + setCurrentUrl(url || "/"); + + if (url && url !== "/") { + try { + setPageDomain(new URL(url).hostname); + } catch { + setPageDomain(url); + } + } else { + setPageDomain(""); + } + } catch { + // Ignore page transitions where the WebContentsView is unavailable. + } + }; + + const startThemeColorMonitoring = () => { + stopThemeColorMonitoring(); + updateThemeColor(); + + let pollCount = 0; + const fastInterval = setInterval(() => { + updateThemeColor(); + pollCount++; + if (pollCount >= 20) { + clearInterval(fastInterval); + themeMonitoringIntervalRef.current = setInterval(updateThemeColor, 500); + } + }, 50); + + themeMonitoringIntervalRef.current = fastInterval; + }; + + const stopThemeColorMonitoring = () => { + if (themeMonitoringIntervalRef.current) { + clearInterval(themeMonitoringIntervalRef.current); + themeMonitoringIntervalRef.current = null; + } + }; + + useEffect(() => { + const cleanup = window.electronAPI?.webContents.onThemeColorUpdated( + setReadableThemeColor + ); + + return () => { + if (cleanup) cleanup(); + }; + }, []); + + useEffect(() => { + window.electronAPI?.tabs.getAll().then((data: TabListData) => { + setTabCount(data.tabs.length); + }); + + const cleanupTabChanged = window.electronAPI?.tabs.onTabChanged((data) => { + setTabCount(data.tabs.length); + }); + const cleanupTabsUpdated = window.electronAPI?.tabs.onTabsUpdated( + (data: TabListData) => { + setTabCount(data.tabs.length); + } + ); + + return () => { + if (cleanupTabChanged) cleanupTabChanged(); + if (cleanupTabsUpdated) cleanupTabsUpdated(); + }; + }, [orientation]); + + useEffect(() => { + const handleDomReady = () => { + updatePageInfo(); + startThemeColorMonitoring(); + }; + const handleDidNavigate = () => { + stopThemeColorMonitoring(); + startThemeColorMonitoring(); + updatePageInfo(); + }; + const handleDidNavigateInPage = () => { + updateThemeColor(); + setTimeout(updateThemeColor, 50); + updatePageInfo(); + }; + const handleDidStartLoading = () => { + stopThemeColorMonitoring(); + }; + const handleDidStopLoading = () => { + startThemeColorMonitoring(); + }; + const handleRenderProcessGone = () => { + stopThemeColorMonitoring(); + + const now = Date.now(); + if (now - lastCrashTimeRef.current > 10000) { + crashCountRef.current = 0; + } + + crashCountRef.current++; + lastCrashTimeRef.current = now; + setPageTitle(`Page Crashed (${crashCountRef.current})`); + setPageDomain("Please navigate to another page"); + setThemeColor("#ffffff"); + setTextColor("#000000"); + + if (crashCountRef.current < 3) { + setTimeout(() => window.electronAPI?.webContents.reload(), 2000); + } + }; + const handleDidFailLoad = () => { + stopThemeColorMonitoring(); + }; + const handleHttpError = ( + statusCode: number, + statusText: string, + url: string + ) => { + console.log(`[App] HTTP Error: ${statusCode} ${statusText} for ${url}`); + stopThemeColorMonitoring(); + }; + + const cleanupDomReady = + window.electronAPI?.webContents.onDomReady(handleDomReady); + const cleanupDidNavigate = + window.electronAPI?.webContents.onDidNavigate(handleDidNavigate); + const cleanupDidNavigateInPage = + window.electronAPI?.webContents.onDidNavigateInPage( + handleDidNavigateInPage + ); + const cleanupDidStartLoading = + window.electronAPI?.webContents.onDidStartLoading(handleDidStartLoading); + const cleanupDidStopLoading = + window.electronAPI?.webContents.onDidStopLoading(handleDidStopLoading); + const cleanupRenderProcessGone = + window.electronAPI?.webContents.onRenderProcessGone( + handleRenderProcessGone + ); + const cleanupDidFailLoad = + window.electronAPI?.webContents.onDidFailLoad(handleDidFailLoad); + const cleanupHttpError = + window.electronAPI?.webContents.onHttpError(handleHttpError); + + setTimeout(() => { + updatePageInfo(); + startThemeColorMonitoring(); + }, 1000); + + return () => { + stopThemeColorMonitoring(); + if (cleanupDomReady) cleanupDomReady(); + if (cleanupDidNavigate) cleanupDidNavigate(); + if (cleanupDidNavigateInPage) cleanupDidNavigateInPage(); + if (cleanupDidStartLoading) cleanupDidStartLoading(); + if (cleanupDidStopLoading) cleanupDidStopLoading(); + if (cleanupRenderProcessGone) cleanupRenderProcessGone(); + if (cleanupDidFailLoad) cleanupDidFailLoad(); + if (cleanupHttpError) cleanupHttpError(); + }; + }, []); + + return { + currentUrl, + pageDomain, + pageTitle, + tabCount, + textColor, + themeColor, + }; +} diff --git a/apps/browser/src/renderer/i18n/i18n-context.tsx b/apps/browser/src/renderer/i18n/i18n-context.tsx new file mode 100644 index 0000000..d33cbe1 --- /dev/null +++ b/apps/browser/src/renderer/i18n/i18n-context.tsx @@ -0,0 +1,81 @@ +import { + createContext, + ReactNode, + useContext, + useEffect, + useMemo, + useState, +} from "react"; +import { + EffectiveLanguage, + languageOptions, + LanguageState, + PreferredLanguage, + resolveEffectiveLanguage, +} from "../../shared/language"; +import { translations, TranslationKey } from "./translations"; + +interface I18nContextValue extends LanguageState { + setPreferredLanguage: (language: PreferredLanguage) => Promise; + t: (key: TranslationKey, values?: Record) => string; +} + +const fallbackLanguageState: LanguageState = { + effectiveLanguage: resolveEffectiveLanguage( + "system", + navigator.language || "en-US" + ), + preferredLanguage: "system", + systemLanguage: resolveEffectiveLanguage("system", navigator.language || "en-US"), +}; + +const I18nContext = createContext(null); + +export function I18nProvider({ children }: { children: ReactNode }) { + const [languageState, setLanguageState] = + useState(fallbackLanguageState); + + useEffect(() => { + window.electronAPI?.getLanguageState().then(setLanguageState); + const cleanup = window.electronAPI?.onLanguageChanged(setLanguageState); + return () => { + if (cleanup) cleanup(); + }; + }, []); + + const value = useMemo(() => { + const t = ( + key: TranslationKey, + values: Record = {} + ) => { + let text = translations[languageState.effectiveLanguage][key]; + Object.entries(values).forEach(([name, value]) => { + text = text.replace(`{${name}}`, String(value)); + }); + return text; + }; + + return { + ...languageState, + setPreferredLanguage: async (language: PreferredLanguage) => { + const nextState = + await window.electronAPI?.setPreferredLanguage(language); + if (nextState) setLanguageState(nextState); + }, + t, + }; + }, [languageState]); + + return {children}; +} + +export function useI18n(): I18nContextValue { + const context = useContext(I18nContext); + if (!context) { + throw new Error("useI18n must be used within I18nProvider"); + } + return context; +} + +export { languageOptions }; +export type { EffectiveLanguage, PreferredLanguage }; diff --git a/apps/browser/src/renderer/i18n/translations.ts b/apps/browser/src/renderer/i18n/translations.ts new file mode 100644 index 0000000..13a62a3 --- /dev/null +++ b/apps/browser/src/renderer/i18n/translations.ts @@ -0,0 +1,70 @@ +import { EffectiveLanguage } from "../../shared/language"; + +export const translations = { + en: { + addFavorite: "Add Favorite", + addToFavorites: "Add to Favorites", + appDescription: "A lightweight, elegant web browser", + about: "About", + back: "Back", + cancel: "Cancel", + contributionHelp: + "Do not see your language? Help translate aka-browser on GitHub.", + description: "Description", + done: "Done", + editFavorite: "Edit Favorite", + englishName: "English name", + enterTitle: "Enter title", + enterUrl: "Enter URL...", + favorites: "Favorites", + favoritesCount: "{count} items", + general: "General", + information: "Information", + language: "Language", + languageContribution: "Translation guide", + name: "Name", + noFavorites: "No favorites yet.", + noFavoritesHint: "Add your favorite sites from the menu.", + removeFromFavorites: "Remove from Favorites", + save: "Save", + settings: "Settings", + systemDefault: "System Default", + title: "Title", + url: "URL", + version: "Version", + }, + ko: { + addFavorite: "즐겨찾기 μΆ”κ°€", + addToFavorites: "즐겨찾기에 μΆ”κ°€", + appDescription: "가볍고 μš°μ•„ν•œ μ›Ή λΈŒλΌμš°μ €", + about: "정보", + back: "λ’€λ‘œ", + cancel: "μ·¨μ†Œ", + contributionHelp: + "μ›ν•˜λŠ” μ–Έμ–΄κ°€ μ—†λ‚˜μš”? GitHubμ—μ„œ aka-browser λ²ˆμ—­μ— μ°Έμ—¬ν•΄ μ£Όμ„Έμš”.", + description: "μ„€λͺ…", + done: "μ™„λ£Œ", + editFavorite: "즐겨찾기 νŽΈμ§‘", + englishName: "영문 이름", + enterTitle: "제λͺ© μž…λ ₯", + enterUrl: "URL μž…λ ₯...", + favorites: "즐겨찾기", + favoritesCount: "{count}개", + general: "일반", + information: "정보", + language: "μ–Έμ–΄", + languageContribution: "λ²ˆμ—­ μ°Έμ—¬ μ•ˆλ‚΄", + name: "이름", + noFavorites: "아직 즐겨찾기가 μ—†μŠ΅λ‹ˆλ‹€.", + noFavoritesHint: "λ©”λ‰΄μ—μ„œ 자주 μ“°λŠ” μ‚¬μ΄νŠΈλ₯Ό μΆ”κ°€ν•˜μ„Έμš”.", + removeFromFavorites: "μ¦κ²¨μ°ΎκΈ°μ—μ„œ 제거", + save: "μ €μž₯", + settings: "μ„€μ •", + systemDefault: "μ‹œμŠ€ν…œ κΈ°λ³Έκ°’", + title: "제λͺ©", + url: "URL", + version: "버전", + }, +} satisfies Record>; + +export type TranslationKey = keyof typeof translations.en; diff --git a/apps/browser/src/renderer/lib/app-utils.ts b/apps/browser/src/renderer/lib/app-utils.ts new file mode 100644 index 0000000..c87d8ae --- /dev/null +++ b/apps/browser/src/renderer/lib/app-utils.ts @@ -0,0 +1,75 @@ +export interface Bounds { + x: number; + y: number; + width: number; + height: number; +} + +export function getLuminance(color: string): number { + let r: number; + let g: number; + let b: number; + + if (color.startsWith("#")) { + const hex = color.replace("#", ""); + r = parseInt(hex.substring(0, 2), 16); + g = parseInt(hex.substring(2, 4), 16); + b = parseInt(hex.substring(4, 6), 16); + } else if (color.startsWith("rgb")) { + const matches = color.match(/\d+/g); + if (!matches) return 0; + r = parseInt(matches[0]); + g = parseInt(matches[1]); + b = parseInt(matches[2]); + } else { + return 0; + } + + const [rLinear, gLinear, bLinear] = [r, g, b].map((value) => { + const srgb = value / 255; + return srgb <= 0.03928 + ? srgb / 12.92 + : Math.pow((srgb + 0.055) / 1.055, 2.4); + }); + + return 0.2126 * rLinear + 0.7152 * gLinear + 0.0722 * bLinear; +} + +export function getWebContentsBounds( + rect: DOMRect, + orientation: "portrait" | "landscape" +): Bounds { + const statusBarHeight = 58; + const statusBarWidth = 58; + + return { + x: Math.round(rect.x + (orientation === "landscape" ? statusBarWidth : 0)), + y: Math.round(rect.y + (orientation === "landscape" ? 0 : statusBarHeight)), + width: Math.round( + rect.width - (orientation === "landscape" ? statusBarWidth : 0) + ), + height: Math.round( + rect.height - (orientation === "landscape" ? 0 : statusBarHeight) + ), + }; +} + +export function normalizeNavigationUrl(url: string): string { + let finalUrl = url.trim(); + + if ( + finalUrl.startsWith("http://") || + finalUrl.startsWith("https://") || + finalUrl.startsWith("file://") + ) { + return finalUrl; + } + + const isLocalUrl = + /^(localhost|127\.\d+\.\d+\.\d+|192\.168\.\d+\.\d+|10\.\d+\.\d+\.\d+|172\.(1[6-9]|2\d|3[01])\.\d+\.\d+)(:\d+)?/i.test( + finalUrl + ); + + finalUrl = `${isLocalUrl ? "http" : "https"}://${finalUrl}`; + return finalUrl; +} diff --git a/apps/browser/src/renderer/main.tsx b/apps/browser/src/renderer/main.tsx index a0741ce..795d3b6 100644 --- a/apps/browser/src/renderer/main.tsx +++ b/apps/browser/src/renderer/main.tsx @@ -1,10 +1,13 @@ import { StrictMode } from 'react'; import { createRoot } from 'react-dom/client'; import App from './app'; +import { I18nProvider } from './i18n/i18n-context'; import './index.css'; createRoot(document.getElementById('root')!).render( - + + + ); diff --git a/apps/browser/src/shared/language.ts b/apps/browser/src/shared/language.ts new file mode 100644 index 0000000..6d850b0 --- /dev/null +++ b/apps/browser/src/shared/language.ts @@ -0,0 +1,43 @@ +export type PreferredLanguage = "system" | "en" | "ko"; +export type EffectiveLanguage = "en" | "ko"; + +export interface LanguageOption { + code: PreferredLanguage; + englishName: string; + nativeName: string; +} + +export interface LanguageState { + effectiveLanguage: EffectiveLanguage; + preferredLanguage: PreferredLanguage; + systemLanguage: EffectiveLanguage; +} + +export const languageOptions: LanguageOption[] = [ + { code: "system", englishName: "System Default", nativeName: "System Default" }, + { code: "en", englishName: "English", nativeName: "English" }, + { code: "ko", englishName: "Korean", nativeName: "ν•œκ΅­μ–΄" }, +]; + +export function resolveEffectiveLanguage( + preferredLanguage: PreferredLanguage, + systemLocale: string +): EffectiveLanguage { + if (preferredLanguage === "en" || preferredLanguage === "ko") { + return preferredLanguage; + } + + return systemLocale.toLowerCase().startsWith("ko") ? "ko" : "en"; +} + +export function toChromiumLocale(language: EffectiveLanguage): string { + return language === "ko" ? "ko-KR" : "en-US"; +} + +export function toAcceptLanguage(language: EffectiveLanguage): string { + return language === "ko" ? "ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7" : "en-US,en;q=0.9"; +} + +export function isPreferredLanguage(value: unknown): value is PreferredLanguage { + return value === "system" || value === "en" || value === "ko"; +} diff --git a/apps/browser/src/types/electron-api.d.ts b/apps/browser/src/types/electron-api.d.ts index bba9e19..1b23eb7 100644 --- a/apps/browser/src/types/electron-api.d.ts +++ b/apps/browser/src/types/electron-api.d.ts @@ -35,6 +35,15 @@ interface Bookmark { updatedAt: number; } +type PreferredLanguage = "system" | "en" | "ko"; +type EffectiveLanguage = "en" | "ko"; + +interface LanguageState { + effectiveLanguage: EffectiveLanguage; + preferredLanguage: PreferredLanguage; + systemLanguage: EffectiveLanguage; +} + export interface ElectronAPI { platform: NodeJS.Platform; closeWindow: () => void; @@ -69,6 +78,9 @@ export interface ElectronAPI { // App version getAppVersion: () => Promise; + getLanguageState: () => Promise; + setPreferredLanguage: (language: PreferredLanguage) => Promise; + onLanguageChanged: (callback: (state: LanguageState) => void) => () => void; // Tab management APIs tabs: { diff --git a/apps/browser/src/webview-preload.ts b/apps/browser/src/webview-preload.ts index e5ad821..473560c 100644 --- a/apps/browser/src/webview-preload.ts +++ b/apps/browser/src/webview-preload.ts @@ -1,629 +1,14 @@ -// Preload script for WebContentsView (embedded web content) -// This runs in the context of loaded web pages with limited privileges - -import { ipcRenderer, contextBridge } from "electron"; - -// ============================================================================ -// Fullscreen API Polyfill (Plan 1.5 - Final) -// ============================================================================ -// We need to polyfill the Fullscreen API so web pages think they're in fullscreen -// even though the window doesn't actually go fullscreen - -console.log("[Preload] βœ“ Loaded - Fullscreen API polyfill active"); - -// Track fullscreen state -let isFullscreenActive = false; -let fullscreenElement: Element | null = null; - -// Helper function to apply object-fit style to video elements -function applyVideoFitStyle(fitValue: string) { - const videos = document.querySelectorAll('video'); - videos.forEach((video) => { - if (fitValue) { - video.style.objectFit = fitValue; - } else { - video.style.objectFit = ''; - } - }); - - // Also observe for dynamically added videos - if (fitValue === 'contain') { - startVideoObserver(); - } else { - stopVideoObserver(); - } -} - -// MutationObserver to handle dynamically added videos -let videoObserver: MutationObserver | null = null; - -function startVideoObserver() { - if (videoObserver) return; - - videoObserver = new MutationObserver((mutations) => { - mutations.forEach((mutation) => { - mutation.addedNodes.forEach((node) => { - if (node instanceof HTMLVideoElement) { - node.style.objectFit = 'contain'; - } else if (node instanceof Element) { - const videos = node.querySelectorAll('video'); - videos.forEach((video) => { - (video as HTMLVideoElement).style.objectFit = 'contain'; - }); - } - }); - }); - }); - - videoObserver.observe(document.body, { - childList: true, - subtree: true, - }); -} - -function stopVideoObserver() { - if (videoObserver) { - videoObserver.disconnect(); - videoObserver = null; - } -} - -// Listen for fullscreen state from main process -ipcRenderer.on("set-fullscreen-state", (_event, state: boolean) => { - const wasFullscreen = isFullscreenActive; - isFullscreenActive = state; - - if (state && !wasFullscreen) { - // Entering fullscreen - fullscreenElement = document.documentElement; // Assume whole document - - // Apply object-fit: contain to all video elements to prevent cropping - applyVideoFitStyle('contain'); - - // Force a resize event to make sure the page knows about the new size - window.dispatchEvent(new Event('resize')); - - const event = new Event("fullscreenchange", { bubbles: true }); - document.dispatchEvent(event); - } else if (!state && wasFullscreen) { - // Exiting fullscreen - fullscreenElement = null; - - // Restore original object-fit style - applyVideoFitStyle(''); - - // Force a resize event - window.dispatchEvent(new Event('resize')); - - const event = new Event("fullscreenchange", { bubbles: true }); - document.dispatchEvent(event); - } -}); - -// Override fullscreenElement getter -Object.defineProperty(Document.prototype, "fullscreenElement", { - get: function(this: Document): Element | null { - return fullscreenElement; - }, - configurable: true, -}); - -// Override webkitFullscreenElement getter -Object.defineProperty(Document.prototype, "webkitFullscreenElement", { - get: function(this: Document): Element | null { - return fullscreenElement; - }, - configurable: true, -}); - -// Store original screen dimensions -const originalScreenWidth = window.screen.width; -const originalScreenHeight = window.screen.height; - -// Override screen.width and screen.height to match window size in fullscreen -Object.defineProperty(window.screen, "width", { - get: function(): number { - // In fullscreen mode, return window size instead of actual screen size - if (isFullscreenActive) { - return window.innerWidth; - } - return originalScreenWidth; - }, - configurable: true, -}); - -Object.defineProperty(window.screen, "height", { - get: function(): number { - // In fullscreen mode, return window size instead of actual screen size - if (isFullscreenActive) { - return window.innerHeight; - } - return originalScreenHeight; - }, - configurable: true, -}); - -// Also override availWidth and availHeight -Object.defineProperty(window.screen, "availWidth", { - get: function(): number { - if (isFullscreenActive) { - return window.innerWidth; - } - return originalScreenWidth; - }, - configurable: true, -}); - -Object.defineProperty(window.screen, "availHeight", { - get: function(): number { - if (isFullscreenActive) { - return window.innerHeight; - } - return originalScreenHeight; - }, - configurable: true, -}); - -console.log("[Preload] βœ“ Fullscreen API polyfill installed (with screen size override)"); - -// ============================================================================ -// Theme Color Extraction -// ============================================================================ - -// Extract theme color safely when DOM is ready -function extractThemeColor(): string | null { - try { - // Check for meta theme-color tag - const metaThemeColor = document.querySelector('meta[name="theme-color"]'); - if (metaThemeColor) { - const content = metaThemeColor.getAttribute("content"); - if (content) return content; - } - - // Fallback to body background color - const bodyBg = window.getComputedStyle(document.body).backgroundColor; - if (bodyBg && bodyBg !== "rgba(0, 0, 0, 0)" && bodyBg !== "transparent") { - return bodyBg; - } - - return null; - } catch (error) { - return null; - } -} - -// Send theme color to main process when available -function notifyThemeColor() { - const themeColor = extractThemeColor(); - if (themeColor) { - // Extract domain from current URL - let domain = ""; - try { - domain = window.location.hostname; - } catch (error) { - // Fallback if hostname is not accessible - domain = ""; - } - - ipcRenderer.send("webview-theme-color-extracted", { - themeColor, - domain, - }); - } -} - -// Setup observer and notification when DOM is ready -function setupThemeColorMonitoring() { - // Initial notification - setTimeout(notifyThemeColor, 100); - - // Watch for meta tag changes (some sites update theme-color dynamically) - // Only observe to avoid excessive body re-renders - try { - if (document.head) { - const observer = new MutationObserver((mutations) => { - // Only notify if meta tag with name="theme-color" was actually changed - const hasThemeColorChange = mutations.some((mutation) => { - if ( - mutation.type === "attributes" && - mutation.target.nodeName === "META" - ) { - const meta = mutation.target as HTMLMetaElement; - return meta.name === "theme-color"; - } - if (mutation.type === "childList") { - return Array.from(mutation.addedNodes).some( - (node) => - node.nodeName === "META" && - (node as HTMLMetaElement).name === "theme-color" - ); - } - return false; - }); - - if (hasThemeColorChange) { - notifyThemeColor(); - } - }); - - // Only observe , not the entire document - observer.observe(document.head, { - childList: true, - subtree: false, - attributes: true, - attributeFilter: ["content"], - }); - } - } catch (error) { - // Silently ignore if observer setup fails - } -} - -// Track current orientation -let currentOrientation: "portrait" | "landscape" = "portrait"; - -// Shadow DOM container reference for cleanup -let shadowContainer: HTMLElement | null = null; - -// MutationObserver reference for cleanup -let maskProtectionObserver: MutationObserver | null = null; - -// Inject corner masks using Shadow DOM for complete style isolation -function injectCornerMask() { - // Disconnect existing observer - if (maskProtectionObserver) { - maskProtectionObserver.disconnect(); - maskProtectionObserver = null; - } - - // Remove existing container if present (check both body and html) - const existingContainers = document.querySelectorAll("#webview-corner-mask-container"); - existingContainers.forEach(container => { - if (container.parentNode) { - container.parentNode.removeChild(container); - } - }); - - shadowContainer = null; - - // Create container element - const container = document.createElement("div"); - container.id = "webview-corner-mask-container"; - container.setAttribute("data-webview-mask", "true"); - - // Container styles (applied to light DOM) - container.style.cssText = ` - position: fixed !important; - top: 0 !important; - left: 0 !important; - width: 100% !important; - height: 100% !important; - pointer-events: none !important; - z-index: 2147483647 !important; - overflow: hidden !important; - `; - - // Create Shadow DOM for complete style isolation - const shadow = container.attachShadow({ mode: "closed" }); - - // Create style element inside Shadow DOM - const style = document.createElement("style"); - - if (currentOrientation === "portrait") { - // Portrait mode: bottom-left and bottom-right corners - style.textContent = ` - :host { - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - pointer-events: none; - } - - .corner-mask { - position: absolute; - width: 48px; - height: 48px; - pointer-events: none; - } - - .corner-mask-bottom-left { - bottom: -1px; - left: -1px; - background: - radial-gradient(circle at 44px 1px, transparent 32px, #000100 32px, #000100 38px, transparent 40px), - radial-gradient(circle at 41px 0px, transparent 34px, #2b2c2c 30px); - background-position: -11px 14px; - background-repeat: no-repeat; - } - - .corner-mask-bottom-right { - bottom: -1px; - right: -1px; - background: - radial-gradient(circle at 2px 1px, transparent 32px, #000100 32px, #000100 38px, transparent 40px), - radial-gradient(circle at 0px 1px, transparent 40px, #2b2c2c 40px); - background-position: 13px 14px; - background-repeat: no-repeat; - } - `; - - // Create mask elements - const maskLeft = document.createElement("div"); - maskLeft.className = "corner-mask corner-mask-bottom-left"; - - const maskRight = document.createElement("div"); - maskRight.className = "corner-mask corner-mask-bottom-right"; - - shadow.appendChild(style); - shadow.appendChild(maskLeft); - shadow.appendChild(maskRight); - } else { - // Landscape mode: top-right and bottom-right corners - style.textContent = ` - :host { - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - pointer-events: none; - } - - .corner-mask { - position: absolute; - width: 48px; - height: 48px; - pointer-events: none; - } - - .corner-mask-top-right { - top: -1px; - right: -1px; - background: - radial-gradient(circle at 2px 44px, transparent 32px, #000100 32px, #000100 38px, transparent 40px), - radial-gradient(circle at 0px 47px, transparent 34px, #2b2c2c 30px); - background-position: 13px -11px; - background-repeat: no-repeat; - } - - .corner-mask-bottom-right { - bottom: -1px; - right: -1px; - background: - radial-gradient(circle at 2px 1px, transparent 32px, #000100 32px, #000100 38px, transparent 40px), - radial-gradient(circle at 0px 1px, transparent 40px, #2b2c2c 40px); - background-position: 13px 14px; - background-repeat: no-repeat; - } - `; - - // Create mask elements - const maskTopRight = document.createElement("div"); - maskTopRight.className = "corner-mask corner-mask-top-right"; - - const maskBottomRight = document.createElement("div"); - maskBottomRight.className = "corner-mask corner-mask-bottom-right"; - - shadow.appendChild(style); - shadow.appendChild(maskTopRight); - shadow.appendChild(maskBottomRight); - } - - // Store reference for cleanup - shadowContainer = container; - - // Insert into DOM - const insertContainer = () => { - if (document.body) { - document.body.appendChild(container); - } else if (document.documentElement) { - document.documentElement.appendChild(container); - } else { - // Wait for document to be ready - const observer = new MutationObserver(() => { - if (document.body) { - document.body.appendChild(container); - observer.disconnect(); - } else if (document.documentElement) { - document.documentElement.appendChild(container); - observer.disconnect(); - } - }); - observer.observe(document, { - childList: true, - subtree: true, - }); - } - }; - - insertContainer(); - - // Setup MutationObserver to restore if removed by page scripts - setupMaskProtection(); -} - -// Protect corner mask from being removed by page scripts -function setupMaskProtection() { - // Don't create duplicate observers - if (maskProtectionObserver) { - maskProtectionObserver.disconnect(); - } - - // Debounce restoration to avoid infinite loops - let restorationTimeout: NodeJS.Timeout | null = null; - - maskProtectionObserver = new MutationObserver((mutations) => { - // Check if our container was removed - const containerExists = document.getElementById("webview-corner-mask-container"); - - if (!containerExists && shadowContainer) { - // Container was removed, schedule restoration - if (restorationTimeout) { - clearTimeout(restorationTimeout); - } - - restorationTimeout = setTimeout(() => { - // Re-inject if still missing - if (!document.getElementById("webview-corner-mask-container")) { - injectCornerMask(); - } - }, 100); - } - }); - - // Observe both body and documentElement for removals - if (document.body) { - maskProtectionObserver.observe(document.body, { - childList: true, - subtree: false, // Only watch direct children - }); - } - if (document.documentElement) { - maskProtectionObserver.observe(document.documentElement, { - childList: true, - subtree: false, // Only watch direct children - }); - } -} - -// Listen for orientation changes from main process -ipcRenderer.on("orientation-changed", (_event, orientation: "portrait" | "landscape") => { - currentOrientation = orientation; - injectCornerMask(); -}); - -// Request initial orientation from main process -ipcRenderer.invoke("get-orientation").then((orientation: "portrait" | "landscape") => { - currentOrientation = orientation; - injectCornerMask(); -}).catch(() => { - // Fallback to portrait if request fails - injectCornerMask(); -}); - -// Inject corner mask immediately with default orientation -injectCornerMask(); - -// Wait for DOM to be ready for theme monitoring -if (document.readyState === "loading") { - document.addEventListener("DOMContentLoaded", () => { - setupThemeColorMonitoring(); - // Re-inject to ensure it's still there after DOM is ready - injectCornerMask(); - }); -} else { - // DOM is already ready - setupThemeColorMonitoring(); - // Re-inject to ensure it's still there - injectCornerMask(); -} - -// Also check when page is fully loaded -window.addEventListener("load", () => { - setTimeout(notifyThemeColor, 200); - // Re-inject one more time to ensure persistence - injectCornerMask(); -}); - -// Trackpad gesture detection for navigation -function setupNavigationGestures() { - let isGesturing = false; - let gestureStartX = 0; - let gestureStartY = 0; - let accumulatedDeltaX = 0; - let accumulatedDeltaY = 0; - const GESTURE_THRESHOLD = 100; // Pixels to trigger navigation - const VERTICAL_TOLERANCE = 50; // Allow some vertical movement - - window.addEventListener( - "wheel", - (event: WheelEvent) => { - // Only handle horizontal gestures on macOS trackpad - // Trackpad gestures have ctrlKey set to false and are smooth - if (Math.abs(event.deltaX) < 1) return; - - // Detect start of gesture (large initial delta) - if (!isGesturing && Math.abs(event.deltaX) > 4) { - isGesturing = true; - gestureStartX = event.pageX; - gestureStartY = event.pageY; - accumulatedDeltaX = 0; - accumulatedDeltaY = 0; - } - - if (isGesturing) { - accumulatedDeltaX += event.deltaX; - accumulatedDeltaY += Math.abs(event.deltaY); - - // Check if gesture is primarily horizontal - if (accumulatedDeltaY > VERTICAL_TOLERANCE) { - // Too much vertical movement, cancel gesture - isGesturing = false; - return; - } - - // Swipe right (negative deltaX) = go back - if (accumulatedDeltaX < -GESTURE_THRESHOLD) { - event.preventDefault(); - ipcRenderer.send("webview-navigate-back"); - isGesturing = false; - accumulatedDeltaX = 0; - accumulatedDeltaY = 0; - } - // Swipe left (positive deltaX) = go forward - else if (accumulatedDeltaX > GESTURE_THRESHOLD) { - event.preventDefault(); - ipcRenderer.send("webview-navigate-forward"); - isGesturing = false; - accumulatedDeltaX = 0; - accumulatedDeltaY = 0; - } - } - }, - { passive: false } - ); - - // Reset gesture state when wheel event stops - let gestureTimeout: NodeJS.Timeout | null = null; - window.addEventListener("wheel", () => { - if (gestureTimeout) clearTimeout(gestureTimeout); - gestureTimeout = setTimeout(() => { - isGesturing = false; - accumulatedDeltaX = 0; - accumulatedDeltaY = 0; - }, 100); - }); -} - -// Setup gesture detection immediately -setupNavigationGestures(); - -// ============================================================================ -// Expose Bookmark API to webview (for blank-page.html) -// ============================================================================ - -contextBridge.exposeInMainWorld("electronAPI", { - bookmarks: { - getAll: () => ipcRenderer.invoke("bookmarks-get-all"), - add: (title: string, url: string, favicon?: string) => - ipcRenderer.invoke("bookmarks-add", title, url, favicon), - remove: (id: string) => ipcRenderer.invoke("bookmarks-remove", id), - update: (id: string, updates: { title?: string; url?: string; favicon?: string }) => - ipcRenderer.invoke("bookmarks-update", id, updates), - clear: () => ipcRenderer.invoke("bookmarks-clear"), - onUpdate: (callback: () => void) => { - const listener = () => callback(); - ipcRenderer.on("bookmarks-updated", listener); - return () => ipcRenderer.removeListener("bookmarks-updated", listener); - }, - }, - favicon: { - get: (url: string) => ipcRenderer.invoke("favicon-get", url), - getWithFallback: (pageUrl: string) => ipcRenderer.invoke("favicon-get-with-fallback", pageUrl), - isCached: (url: string) => ipcRenderer.invoke("favicon-is-cached", url), - clearCache: () => ipcRenderer.invoke("favicon-clear-cache"), - getCacheSize: () => ipcRenderer.invoke("favicon-get-cache-size"), - }, -}); +import { contextBridge, ipcRenderer } from "electron"; +import { installCornerMask } from "./webview/corner-mask"; +import { exposeWebviewApi } from "./webview/exposed-api"; +import { installFullscreenPolyfill } from "./webview/fullscreen-polyfill"; +import { installNavigationGestures } from "./webview/navigation-gestures"; +import { installThemeColorMonitoring } from "./webview/theme-color"; + +console.log("[Preload] Loaded webview preload"); + +installFullscreenPolyfill(ipcRenderer); +installThemeColorMonitoring(ipcRenderer); +installCornerMask(ipcRenderer); +installNavigationGestures(ipcRenderer); +exposeWebviewApi(contextBridge, ipcRenderer); diff --git a/apps/browser/src/webview/corner-mask.ts b/apps/browser/src/webview/corner-mask.ts new file mode 100644 index 0000000..acf9440 --- /dev/null +++ b/apps/browser/src/webview/corner-mask.ts @@ -0,0 +1,178 @@ +import type { IpcRenderer } from "electron"; + +let currentOrientation: "portrait" | "landscape" = "portrait"; +let shadowContainer: HTMLElement | null = null; +let maskProtectionObserver: MutationObserver | null = null; + +export function installCornerMask(ipcRenderer: IpcRenderer): void { + ipcRenderer.on( + "orientation-changed", + (_event, orientation: "portrait" | "landscape") => { + currentOrientation = orientation; + injectCornerMask(); + } + ); + + ipcRenderer + .invoke("get-orientation") + .then((orientation: "portrait" | "landscape") => { + currentOrientation = orientation; + injectCornerMask(); + }) + .catch(injectCornerMask); + + injectCornerMask(); + + const reinject = () => injectCornerMask(); + if (document.readyState === "loading") { + document.addEventListener("DOMContentLoaded", reinject); + } else { + reinject(); + } + window.addEventListener("load", reinject); +} + +function injectCornerMask(): void { + maskProtectionObserver?.disconnect(); + maskProtectionObserver = null; + + document + .querySelectorAll("#webview-corner-mask-container") + .forEach((container) => container.parentNode?.removeChild(container)); + + const container = document.createElement("div"); + container.id = "webview-corner-mask-container"; + container.setAttribute("data-webview-mask", "true"); + container.style.cssText = [ + "position: fixed !important", + "top: 0 !important", + "left: 0 !important", + "width: 100% !important", + "height: 100% !important", + "pointer-events: none !important", + "z-index: 2147483647 !important", + "overflow: hidden !important", + ].join(";"); + + const shadow = container.attachShadow({ mode: "closed" }); + const style = document.createElement("style"); + style.textContent = + currentOrientation === "portrait" + ? portraitMaskStyles() + : landscapeMaskStyles(); + shadow.appendChild(style); + createMaskElements(shadow); + shadowContainer = container; + insertContainer(container); + setupMaskProtection(); +} + +function createMaskElements(shadow: ShadowRoot): void { + const classes = + currentOrientation === "portrait" + ? ["bottom-left", "bottom-right"] + : ["top-right", "bottom-right"]; + + classes.forEach((position) => { + const mask = document.createElement("div"); + mask.className = `corner-mask corner-mask-${position}`; + shadow.appendChild(mask); + }); +} + +function insertContainer(container: HTMLElement): void { + if (document.body) { + document.body.appendChild(container); + return; + } + + if (document.documentElement) { + document.documentElement.appendChild(container); + return; + } + + const observer = new MutationObserver(() => { + const parent = document.body || document.documentElement; + if (!parent) return; + parent.appendChild(container); + observer.disconnect(); + }); + observer.observe(document, { childList: true, subtree: true }); +} + +function setupMaskProtection(): void { + maskProtectionObserver?.disconnect(); + let restorationTimeout: ReturnType | null = null; + + maskProtectionObserver = new MutationObserver(() => { + const containerExists = document.getElementById( + "webview-corner-mask-container" + ); + if (containerExists || !shadowContainer) return; + + if (restorationTimeout) clearTimeout(restorationTimeout); + restorationTimeout = setTimeout(() => { + if (!document.getElementById("webview-corner-mask-container")) { + injectCornerMask(); + } + }, 100); + }); + + [document.body, document.documentElement].forEach((target) => { + if (target) { + maskProtectionObserver?.observe(target, { + childList: true, + subtree: false, + }); + } + }); +} + +function baseMaskStyles(): string { + return ` + :host { position: fixed; top: 0; left: 0; width: 100%; height: 100%; pointer-events: none; } + .corner-mask { position: absolute; width: 48px; height: 48px; pointer-events: none; } + `; +} + +function portraitMaskStyles(): string { + return `${baseMaskStyles()} + .corner-mask-bottom-left { + bottom: -1px; left: -1px; + background: + radial-gradient(circle at 44px 1px, transparent 32px, #000100 32px, #000100 38px, transparent 40px), + radial-gradient(circle at 41px 0px, transparent 34px, #2b2c2c 30px); + background-position: -11px 14px; + background-repeat: no-repeat; + } + .corner-mask-bottom-right { + bottom: -1px; right: -1px; + background: + radial-gradient(circle at 2px 1px, transparent 32px, #000100 32px, #000100 38px, transparent 40px), + radial-gradient(circle at 0px 1px, transparent 40px, #2b2c2c 40px); + background-position: 13px 14px; + background-repeat: no-repeat; + } + `; +} + +function landscapeMaskStyles(): string { + return `${baseMaskStyles()} + .corner-mask-top-right { + top: -1px; right: -1px; + background: + radial-gradient(circle at 2px 44px, transparent 32px, #000100 32px, #000100 38px, transparent 40px), + radial-gradient(circle at 0px 47px, transparent 34px, #2b2c2c 30px); + background-position: 13px -11px; + background-repeat: no-repeat; + } + .corner-mask-bottom-right { + bottom: -1px; right: -1px; + background: + radial-gradient(circle at 2px 1px, transparent 32px, #000100 32px, #000100 38px, transparent 40px), + radial-gradient(circle at 0px 1px, transparent 40px, #2b2c2c 40px); + background-position: 13px 14px; + background-repeat: no-repeat; + } + `; +} diff --git a/apps/browser/src/webview/exposed-api.ts b/apps/browser/src/webview/exposed-api.ts new file mode 100644 index 0000000..e56ae77 --- /dev/null +++ b/apps/browser/src/webview/exposed-api.ts @@ -0,0 +1,33 @@ +import type { ContextBridge, IpcRenderer } from "electron"; + +export function exposeWebviewApi( + contextBridge: ContextBridge, + ipcRenderer: IpcRenderer +): void { + contextBridge.exposeInMainWorld("electronAPI", { + bookmarks: { + getAll: () => ipcRenderer.invoke("bookmarks-get-all"), + add: (title: string, url: string, favicon?: string) => + ipcRenderer.invoke("bookmarks-add", title, url, favicon), + remove: (id: string) => ipcRenderer.invoke("bookmarks-remove", id), + update: ( + id: string, + updates: { title?: string; url?: string; favicon?: string } + ) => ipcRenderer.invoke("bookmarks-update", id, updates), + clear: () => ipcRenderer.invoke("bookmarks-clear"), + onUpdate: (callback: () => void) => { + const listener = () => callback(); + ipcRenderer.on("bookmarks-updated", listener); + return () => ipcRenderer.removeListener("bookmarks-updated", listener); + }, + }, + favicon: { + get: (url: string) => ipcRenderer.invoke("favicon-get", url), + getWithFallback: (pageUrl: string) => + ipcRenderer.invoke("favicon-get-with-fallback", pageUrl), + isCached: (url: string) => ipcRenderer.invoke("favicon-is-cached", url), + clearCache: () => ipcRenderer.invoke("favicon-clear-cache"), + getCacheSize: () => ipcRenderer.invoke("favicon-get-cache-size"), + }, + }); +} diff --git a/apps/browser/src/webview/fullscreen-polyfill.ts b/apps/browser/src/webview/fullscreen-polyfill.ts new file mode 100644 index 0000000..6fa6d73 --- /dev/null +++ b/apps/browser/src/webview/fullscreen-polyfill.ts @@ -0,0 +1,105 @@ +import type { IpcRenderer } from "electron"; + +let isFullscreenActive = false; +let fullscreenElement: Element | null = null; +let videoObserver: MutationObserver | null = null; + +export function installFullscreenPolyfill(ipcRenderer: IpcRenderer): void { + ipcRenderer.on("set-fullscreen-state", (_event, state: boolean) => { + const wasFullscreen = isFullscreenActive; + isFullscreenActive = state; + + if (state && !wasFullscreen) { + fullscreenElement = document.documentElement; + applyVideoFitStyle("contain"); + dispatchFullscreenEvents(); + } else if (!state && wasFullscreen) { + fullscreenElement = null; + applyVideoFitStyle(""); + dispatchFullscreenEvents(); + } + }); + + Object.defineProperty(Document.prototype, "fullscreenElement", { + get: () => fullscreenElement, + configurable: true, + }); + Object.defineProperty(Document.prototype, "webkitFullscreenElement", { + get: () => fullscreenElement, + configurable: true, + }); + + overrideScreenDimensions(); +} + +function applyVideoFitStyle(fitValue: string): void { + document.querySelectorAll("video").forEach((video) => { + video.style.objectFit = fitValue; + }); + + if (fitValue === "contain") { + startVideoObserver(); + } else { + stopVideoObserver(); + } +} + +function startVideoObserver(): void { + if (videoObserver) return; + + videoObserver = new MutationObserver((mutations) => { + mutations.forEach((mutation) => { + mutation.addedNodes.forEach((node) => { + if (node instanceof HTMLVideoElement) { + node.style.objectFit = "contain"; + } else if (node instanceof Element) { + node.querySelectorAll("video").forEach((video) => { + video.style.objectFit = "contain"; + }); + } + }); + }); + }); + + videoObserver.observe(document.body, { + childList: true, + subtree: true, + }); +} + +function stopVideoObserver(): void { + if (!videoObserver) return; + videoObserver.disconnect(); + videoObserver = null; +} + +function dispatchFullscreenEvents(): void { + window.dispatchEvent(new Event("resize")); + document.dispatchEvent(new Event("fullscreenchange", { bubbles: true })); +} + +function overrideScreenDimensions(): void { + const originalScreenWidth = window.screen.width; + const originalScreenHeight = window.screen.height; + const readWidth = () => + isFullscreenActive ? window.innerWidth : originalScreenWidth; + const readHeight = () => + isFullscreenActive ? window.innerHeight : originalScreenHeight; + + Object.defineProperty(window.screen, "width", { + get: readWidth, + configurable: true, + }); + Object.defineProperty(window.screen, "height", { + get: readHeight, + configurable: true, + }); + Object.defineProperty(window.screen, "availWidth", { + get: readWidth, + configurable: true, + }); + Object.defineProperty(window.screen, "availHeight", { + get: readHeight, + configurable: true, + }); +} diff --git a/apps/browser/src/webview/navigation-gestures.ts b/apps/browser/src/webview/navigation-gestures.ts new file mode 100644 index 0000000..7ad1601 --- /dev/null +++ b/apps/browser/src/webview/navigation-gestures.ts @@ -0,0 +1,57 @@ +import type { IpcRenderer } from "electron"; + +export function installNavigationGestures(ipcRenderer: IpcRenderer): void { + let isGesturing = false; + let accumulatedDeltaX = 0; + let accumulatedDeltaY = 0; + let gestureTimeout: ReturnType | null = null; + const gestureThreshold = 100; + const verticalTolerance = 50; + + window.addEventListener( + "wheel", + (event: WheelEvent) => { + if (Math.abs(event.deltaX) < 1) return; + + if (!isGesturing && Math.abs(event.deltaX) > 4) { + isGesturing = true; + accumulatedDeltaX = 0; + accumulatedDeltaY = 0; + } + + if (isGesturing) { + accumulatedDeltaX += event.deltaX; + accumulatedDeltaY += Math.abs(event.deltaY); + + if (accumulatedDeltaY > verticalTolerance) { + isGesturing = false; + return; + } + + if (accumulatedDeltaX < -gestureThreshold) { + event.preventDefault(); + ipcRenderer.send("webview-navigate-back"); + isGesturing = false; + accumulatedDeltaX = 0; + accumulatedDeltaY = 0; + } else if (accumulatedDeltaX > gestureThreshold) { + event.preventDefault(); + ipcRenderer.send("webview-navigate-forward"); + isGesturing = false; + accumulatedDeltaX = 0; + accumulatedDeltaY = 0; + } + } + }, + { passive: false } + ); + + window.addEventListener("wheel", () => { + if (gestureTimeout) clearTimeout(gestureTimeout); + gestureTimeout = setTimeout(() => { + isGesturing = false; + accumulatedDeltaX = 0; + accumulatedDeltaY = 0; + }, 100); + }); +} diff --git a/apps/browser/src/webview/theme-color.ts b/apps/browser/src/webview/theme-color.ts new file mode 100644 index 0000000..6fb913f --- /dev/null +++ b/apps/browser/src/webview/theme-color.ts @@ -0,0 +1,90 @@ +import type { IpcRenderer } from "electron"; + +export function installThemeColorMonitoring(ipcRenderer: IpcRenderer): void { + const setup = () => { + setupThemeColorMonitoring(ipcRenderer); + }; + + if (document.readyState === "loading") { + document.addEventListener("DOMContentLoaded", setup); + } else { + setup(); + } + + window.addEventListener("load", () => { + setTimeout(() => notifyThemeColor(ipcRenderer), 200); + }); +} + +function extractThemeColor(): string | null { + try { + const metaThemeColor = document.querySelector('meta[name="theme-color"]'); + const content = metaThemeColor?.getAttribute("content"); + if (content) return content; + + const bodyBg = window.getComputedStyle(document.body).backgroundColor; + if (bodyBg && bodyBg !== "rgba(0, 0, 0, 0)" && bodyBg !== "transparent") { + return bodyBg; + } + return null; + } catch { + return null; + } +} + +function notifyThemeColor(ipcRenderer: IpcRenderer): void { + const themeColor = extractThemeColor(); + if (!themeColor) return; + + let domain = ""; + try { + domain = window.location.hostname; + } catch { + domain = ""; + } + + ipcRenderer.send("webview-theme-color-extracted", { + themeColor, + domain, + }); +} + +function setupThemeColorMonitoring(ipcRenderer: IpcRenderer): void { + setTimeout(() => notifyThemeColor(ipcRenderer), 100); + + try { + if (!document.head) return; + + const observer = new MutationObserver((mutations) => { + const hasThemeColorChange = mutations.some((mutation) => { + if ( + mutation.type === "attributes" && + mutation.target.nodeName === "META" + ) { + return (mutation.target as HTMLMetaElement).name === "theme-color"; + } + + if (mutation.type === "childList") { + return Array.from(mutation.addedNodes).some( + (node) => + node.nodeName === "META" && + (node as HTMLMetaElement).name === "theme-color" + ); + } + + return false; + }); + + if (hasThemeColorChange) notifyThemeColor(ipcRenderer); + }); + + observer.observe(document.head, { + childList: true, + subtree: false, + attributes: true, + attributeFilter: ["content"], + }); + } catch { + // Ignore pages that block observer setup. + } +} diff --git a/apps/browser/tsconfig.json b/apps/browser/tsconfig.json index dbe856d..56e2fc8 100644 --- a/apps/browser/tsconfig.json +++ b/apps/browser/tsconfig.json @@ -17,6 +17,7 @@ "src/main.ts", "src/main/**/*.ts", "src/preload.ts", + "src/shared/**/*.ts", "src/types/**/*.d.ts" ], "exclude": [ diff --git a/apps/browser/tsconfig.renderer.json b/apps/browser/tsconfig.renderer.json index ff863d5..c25f596 100644 --- a/apps/browser/tsconfig.renderer.json +++ b/apps/browser/tsconfig.renderer.json @@ -20,6 +20,11 @@ "noUnusedParameters": true, "noFallthroughCasesInSwitch": true }, - "include": ["src/renderer", "src/types/**/*.d.ts", "src/renderer/vite-env.d.ts"], + "include": [ + "src/renderer", + "src/shared/**/*.ts", + "src/types/**/*.d.ts", + "src/renderer/vite-env.d.ts" + ], "references": [{ "path": "./tsconfig.node.json" }] } diff --git a/apps/browser/tsconfig.webview.json b/apps/browser/tsconfig.webview.json index 059c539..8a25bb9 100644 --- a/apps/browser/tsconfig.webview.json +++ b/apps/browser/tsconfig.webview.json @@ -13,6 +13,6 @@ "types": ["node"], "composite": true }, - "include": ["src/webview-preload.ts"], + "include": ["src/webview-preload.ts", "src/webview/**/*.ts"], "exclude": ["node_modules", "dist", "dist-renderer", "release"] } diff --git a/docs/TRANSLATING.md b/docs/TRANSLATING.md new file mode 100644 index 0000000..4ae81bc --- /dev/null +++ b/docs/TRANSLATING.md @@ -0,0 +1,15 @@ +# Translating aka-browser + +aka-browser keeps user-interface strings in JSON-like TypeScript resources at: + +- `apps/browser/src/renderer/i18n/translations.ts` + +## Add Or Update A Language + +1. Add the language code to `apps/browser/src/shared/language.ts`. +2. Add every translation key to `translations.ts`. +3. Add the language to the Settings language list. +4. Run `pnpm check-types` and `pnpm build`. + +English names should stay visible in the language picker so users can identify +languages even when they cannot read the native name yet. diff --git a/package.json b/package.json index b3e2aa6..398119c 100644 --- a/package.json +++ b/package.json @@ -9,10 +9,26 @@ "check-types": "turbo run check-types" }, "devDependencies": { - "prettier": "^3.6.2", - "turbo": "^2.5.8", + "prettier": "^3.8.3", + "turbo": "^2.9.14", "typescript": "5.9.2" }, + "pnpm": { + "overrides": { + "@isaacs/brace-expansion": "5.0.1", + "ajv": "6.14.0", + "brace-expansion@<1.1.13": "1.1.13", + "brace-expansion@>=2.0.0 <2.0.3": "2.0.3", + "js-yaml": "4.1.1", + "lodash": "4.18.1", + "minimatch@<3.1.4": "3.1.4", + "minimatch@>=5.0.0 <5.1.8": "5.1.8", + "minimatch@>=9.0.0 <9.0.6": "9.0.9", + "minimatch@>=10.0.0 <10.2.1": "10.2.5", + "@xmldom/xmldom": "0.8.13", + "picomatch": "4.0.4" + } + }, "packageManager": "pnpm@9.0.0", "engines": { "node": ">=18" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cb27c4f..b0a7b82 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,16 +4,30 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false +overrides: + '@isaacs/brace-expansion': 5.0.1 + ajv: 6.14.0 + brace-expansion@<1.1.13: 1.1.13 + brace-expansion@>=2.0.0 <2.0.3: 2.0.3 + js-yaml: 4.1.1 + lodash: 4.18.1 + minimatch@<3.1.4: 3.1.4 + minimatch@>=5.0.0 <5.1.8: 5.1.8 + minimatch@>=9.0.0 <9.0.6: 9.0.9 + minimatch@>=10.0.0 <10.2.1: 10.2.5 + '@xmldom/xmldom': 0.8.13 + picomatch: 4.0.4 + importers: .: devDependencies: prettier: - specifier: ^3.6.2 - version: 3.6.2 + specifier: ^3.8.3 + version: 3.8.3 turbo: - specifier: ^2.5.8 - version: 2.5.8 + specifier: ^2.9.14 + version: 2.9.14 typescript: specifier: 5.9.2 version: 5.9.2 @@ -31,23 +45,23 @@ importers: version: 18.3.1(react@18.3.1) devDependencies: '@electron/notarize': - specifier: ^2.5.0 - version: 2.5.0 + specifier: ^3.1.1 + version: 3.1.1 '@tailwindcss/vite': - specifier: ^4.1.14 - version: 4.1.14(vite@7.1.11(@types/node@20.19.21)(jiti@2.6.1)(lightningcss@1.30.2)) + specifier: ^4.3.0 + version: 4.3.0(vite@8.0.13(@types/node@20.19.21)(esbuild@0.28.0)(jiti@2.6.1)) '@types/node': specifier: ^20.11.0 version: 20.19.21 '@types/react': - specifier: ^19.2.2 - version: 19.2.2 + specifier: ^19.2.14 + version: 19.2.14 '@types/react-dom': - specifier: ^19.2.2 - version: 19.2.2(@types/react@19.2.2) + specifier: ^19.2.3 + version: 19.2.3(@types/react@19.2.14) '@vitejs/plugin-react': - specifier: ^5.0.4 - version: 5.0.4(vite@7.1.11(@types/node@20.19.21)(jiti@2.6.1)(lightningcss@1.30.2)) + specifier: ^6.0.2 + version: 6.0.2(vite@8.0.13(@types/node@20.19.21)(esbuild@0.28.0)(jiti@2.6.1)) concurrently: specifier: ^8.2.2 version: 8.2.2 @@ -55,125 +69,43 @@ importers: specifier: ^10.1.0 version: 10.1.0 dotenv: - specifier: ^17.2.3 - version: 17.2.3 + specifier: ^17.4.2 + version: 17.4.2 electron: - specifier: github:castlabs/electron-releases#v38.0.0+wvcus - version: https://codeload.github.com/castlabs/electron-releases/tar.gz/678b5c7761825c5af936f5c67a9101f3fc6ab750 + specifier: github:castlabs/electron-releases#v39.8.10+wvcus + version: https://codeload.github.com/castlabs/electron-releases/tar.gz/b5480283432a0523f4f3a9c62b130fe8dcde5299 electron-builder: - specifier: ^26.0.12 - version: 26.0.12(electron-builder-squirrel-windows@24.13.3(dmg-builder@26.0.12)) + specifier: ^26.8.1 + version: 26.8.1(electron-builder-squirrel-windows@26.8.1(dmg-builder@26.8.1)) + electron-builder-squirrel-windows: + specifier: 26.8.1 + version: 26.8.1(dmg-builder@26.8.1) + esbuild: + specifier: ^0.28.0 + version: 0.28.0 tailwindcss: - specifier: ^4.1.14 - version: 4.1.14 + specifier: ^4.3.0 + version: 4.3.0 typescript: specifier: 5.9.2 version: 5.9.2 vite: - specifier: ^7.1.11 - version: 7.1.11(@types/node@20.19.21)(jiti@2.6.1)(lightningcss@1.30.2) + specifier: ^8.0.13 + version: 8.0.13(@types/node@20.19.21)(esbuild@0.28.0)(jiti@2.6.1) packages: 7zip-bin@5.2.0: resolution: {integrity: sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A==} - '@babel/code-frame@7.27.1': - resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} - engines: {node: '>=6.9.0'} - - '@babel/compat-data@7.28.4': - resolution: {integrity: sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==} - engines: {node: '>=6.9.0'} - - '@babel/core@7.28.4': - resolution: {integrity: sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==} - engines: {node: '>=6.9.0'} - - '@babel/generator@7.28.3': - resolution: {integrity: sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-compilation-targets@7.27.2': - resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} - engines: {node: '>=6.9.0'} - - '@babel/helper-globals@7.28.0': - resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-module-imports@7.27.1': - resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} - engines: {node: '>=6.9.0'} - - '@babel/helper-module-transforms@7.28.3': - resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-plugin-utils@7.27.1': - resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-string-parser@7.27.1': - resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-identifier@7.27.1': - resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-option@7.27.1': - resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} - engines: {node: '>=6.9.0'} - - '@babel/helpers@7.28.4': - resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==} - engines: {node: '>=6.9.0'} - - '@babel/parser@7.28.4': - resolution: {integrity: sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==} - engines: {node: '>=6.0.0'} - hasBin: true - - '@babel/plugin-transform-react-jsx-self@7.27.1': - resolution: {integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-react-jsx-source@7.27.1': - resolution: {integrity: sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/runtime@7.28.4': resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==} engines: {node: '>=6.9.0'} - '@babel/template@7.27.2': - resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} - engines: {node: '>=6.9.0'} - - '@babel/traverse@7.28.4': - resolution: {integrity: sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==} - engines: {node: '>=6.9.0'} - - '@babel/types@7.28.4': - resolution: {integrity: sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==} - engines: {node: '>=6.9.0'} - '@develar/schema-utils@2.6.5': resolution: {integrity: sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig==} engines: {node: '>= 8.9.0'} - '@electron/asar@3.2.18': - resolution: {integrity: sha512-2XyvMe3N3Nrs8cV39IKELRHTYUWFKrmqqSY1U+GMlc0jvqjIVnoxhNd2H4JolWQncbJi1DCvb5TNxZuI2fEjWg==} - engines: {node: '>=10.12.0'} - hasBin: true - '@electron/asar@3.4.1': resolution: {integrity: sha512-i4/rNPRS84t0vSRa2HorerGRXWyF4vThfHesw0dmcWHp+cspK743UanA0suA5Q5y8kzY2y6YKrvbIUn69BCAiA==} engines: {node: '>=10.12.0'} @@ -187,217 +119,205 @@ packages: resolution: {integrity: sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==} engines: {node: '>=12'} - '@electron/node-gyp@https://codeload.github.com/electron/node-gyp/tar.gz/06b29aafb7708acef8b3669835c8a7857ebc92d2': - resolution: {tarball: https://codeload.github.com/electron/node-gyp/tar.gz/06b29aafb7708acef8b3669835c8a7857ebc92d2} - version: 10.2.0-electron.1 - engines: {node: '>=12.13.0'} - hasBin: true - - '@electron/notarize@2.2.1': - resolution: {integrity: sha512-aL+bFMIkpR0cmmj5Zgy0LMKEpgy43/hw5zadEArgmAMWWlKc5buwFvFT9G/o/YJkvXAJm5q3iuTuLaiaXW39sg==} - engines: {node: '>= 10.0.0'} + '@electron/get@3.1.0': + resolution: {integrity: sha512-F+nKc0xW+kVbBRhFzaMgPy3KwmuNTYX1fx6+FxxoSnNgwYX6LD7AKBTWkU0MQ6IBoe7dz069CNkR673sPAgkCQ==} + engines: {node: '>=14'} '@electron/notarize@2.5.0': resolution: {integrity: sha512-jNT8nwH1f9X5GEITXaQ8IF/KdskvIkOFfB2CvwumsveVidzpSc+mvhhTMdAGSYF3O+Nq49lJ7y+ssODRXu06+A==} engines: {node: '>= 10.0.0'} - '@electron/osx-sign@1.0.5': - resolution: {integrity: sha512-k9ZzUQtamSoweGQDV2jILiRIHUu7lYlJ3c6IEmjv1hC17rclE+eb9U+f6UFlOOETo0JzY1HNlXy4YOlCvl+Lww==} + '@electron/notarize@3.1.1': + resolution: {integrity: sha512-uQQSlOiJnqRkTL1wlEBAxe90nVN/Fc/hEmk0bqpKk8nKjV1if/tXLHKUPePtv9Xsx90PtZU8aidx5lAiOpjkQQ==} + engines: {node: '>= 22.12.0'} + + '@electron/osx-sign@1.3.3': + resolution: {integrity: sha512-KZ8mhXvWv2rIEgMbWZ4y33bDHyUKMXnx4M0sTyPNK/vcB81ImdeY9Ggdqy0SWbMDgmbqyQ+phgejh6V3R2QuSg==} engines: {node: '>=12.0.0'} hasBin: true - '@electron/osx-sign@1.3.1': - resolution: {integrity: sha512-BAfviURMHpmb1Yb50YbCxnOY0wfwaLXH5KJ4+80zS0gUkzDX3ec23naTlEqKsN+PwYn+a1cCzM7BJ4Wcd3sGzw==} - engines: {node: '>=12.0.0'} + '@electron/rebuild@4.0.4': + resolution: {integrity: sha512-Rzc39XPdk/+/wBG8MfwAHohXflep0ITUfulb6Rgz3R0NeSB1noE+E9/M/cb8ftCAiyDD9PPhLuuWgE1GaInbKg==} + engines: {node: '>=22.12.0'} hasBin: true - '@electron/rebuild@3.7.0': - resolution: {integrity: sha512-VW++CNSlZwMYP7MyXEbrKjpzEwhB5kDNbzGtiPEjwYysqyTCF+YbNJ210Dj3AjWsGSV4iEEwNkmJN9yGZmVvmw==} - engines: {node: '>=12.13.0'} + '@electron/universal@2.0.3': + resolution: {integrity: sha512-Wn9sPYIVFRFl5HmwMJkARCCf7rqK/EurkfQ/rJZ14mHP3iYTjZSIOSVonEAnhWeAXwtw7zOekGRlc6yTtZ0t+g==} + engines: {node: '>=16.4'} + + '@electron/windows-sign@1.2.2': + resolution: {integrity: sha512-dfZeox66AvdPtb2lD8OsIIQh12Tp0GNCRUDfBHIKGpbmopZto2/A8nSpYYLoedPIHpqkeblZ/k8OV0Gy7PYuyQ==} + engines: {node: '>=14.14'} hasBin: true - '@electron/universal@1.5.1': - resolution: {integrity: sha512-kbgXxyEauPJiQQUNG2VgUeyfQNFk6hBF11ISN2PNI6agUgPl55pv4eQmaqHzTAzchBvqZ2tQuRVaPStGf0mxGw==} - engines: {node: '>=8.6'} + '@emnapi/core@1.10.0': + resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} - '@electron/universal@2.0.1': - resolution: {integrity: sha512-fKpv9kg4SPmt+hY7SVBnIYULE9QJl8L3sCfcBsnqbJwwBwAeTLokJ9TRt9y7bK0JAzIW2y78TVVjvnQEms/yyA==} - engines: {node: '>=16.4'} + '@emnapi/runtime@1.10.0': + resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} + + '@emnapi/wasi-threads@1.2.1': + resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} '@epic-web/invariant@1.0.0': resolution: {integrity: sha512-lrTPqgvfFQtR/eY/qkIzp98OGdNJu0m5ji3q/nJI8v3SXkRKEnWiOxMmbvcSoAIzv/cGiuvRy57k4suKQSAdwA==} - '@esbuild/aix-ppc64@0.25.11': - resolution: {integrity: sha512-Xt1dOL13m8u0WE8iplx9Ibbm+hFAO0GsU2P34UNoDGvZYkY8ifSiy6Zuc1lYxfG7svWE2fzqCUmFp5HCn51gJg==} + '@esbuild/aix-ppc64@0.28.0': + resolution: {integrity: sha512-lhRUCeuOyJQURhTxl4WkpFTjIsbDayJHih5kZC1giwE+MhIzAb7mEsQMqMf18rHLsrb5qI1tafG20mLxEWcWlA==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.25.11': - resolution: {integrity: sha512-9slpyFBc4FPPz48+f6jyiXOx/Y4v34TUeDDXJpZqAWQn/08lKGeD8aDp9TMn9jDz2CiEuHwfhRmGBvpnd/PWIQ==} + '@esbuild/android-arm64@0.28.0': + resolution: {integrity: sha512-+WzIXQOSaGs33tLEgYPYe/yQHf0WTU0X42Jca3y8NWMbUVhp7rUnw+vAsRC/QiDrdD31IszMrZy+qwPOPjd+rw==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.25.11': - resolution: {integrity: sha512-uoa7dU+Dt3HYsethkJ1k6Z9YdcHjTrSb5NUy66ZfZaSV8hEYGD5ZHbEMXnqLFlbBflLsl89Zke7CAdDJ4JI+Gg==} + '@esbuild/android-arm@0.28.0': + resolution: {integrity: sha512-wqh0ByljabXLKHeWXYLqoJ5jKC4XBaw6Hk08OfMrCRd2nP2ZQ5eleDZC41XHyCNgktBGYMbqnrJKq/K/lzPMSQ==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.25.11': - resolution: {integrity: sha512-Sgiab4xBjPU1QoPEIqS3Xx+R2lezu0LKIEcYe6pftr56PqPygbB7+szVnzoShbx64MUupqoE0KyRlN7gezbl8g==} + '@esbuild/android-x64@0.28.0': + resolution: {integrity: sha512-+VJggoaKhk2VNNqVL7f6S189UzShHC/mR9EE8rDdSkdpN0KflSwWY/gWjDrNxxisg8Fp1ZCD9jLMo4m0OUfeUA==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.25.11': - resolution: {integrity: sha512-VekY0PBCukppoQrycFxUqkCojnTQhdec0vevUL/EDOCnXd9LKWqD/bHwMPzigIJXPhC59Vd1WFIL57SKs2mg4w==} + '@esbuild/darwin-arm64@0.28.0': + resolution: {integrity: sha512-0T+A9WZm+bZ84nZBtk1ckYsOvyA3x7e2Acj1KdVfV4/2tdG4fzUp91YHx+GArWLtwqp77pBXVCPn2We7Letr0Q==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.25.11': - resolution: {integrity: sha512-+hfp3yfBalNEpTGp9loYgbknjR695HkqtY3d3/JjSRUyPg/xd6q+mQqIb5qdywnDxRZykIHs3axEqU6l1+oWEQ==} + '@esbuild/darwin-x64@0.28.0': + resolution: {integrity: sha512-fyzLm/DLDl/84OCfp2f/XQ4flmORsjU7VKt8HLjvIXChJoFFOIL6pLJPH4Yhd1n1gGFF9mPwtlN5Wf82DZs+LQ==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.25.11': - resolution: {integrity: sha512-CmKjrnayyTJF2eVuO//uSjl/K3KsMIeYeyN7FyDBjsR3lnSJHaXlVoAK8DZa7lXWChbuOk7NjAc7ygAwrnPBhA==} + '@esbuild/freebsd-arm64@0.28.0': + resolution: {integrity: sha512-l9GeW5UZBT9k9brBYI+0WDffcRxgHQD8ShN2Ur4xWq/NFzUKm3k5lsH4PdaRgb2w7mI9u61nr2gI2mLI27Nh3Q==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.11': - resolution: {integrity: sha512-Dyq+5oscTJvMaYPvW3x3FLpi2+gSZTCE/1ffdwuM6G1ARang/mb3jvjxs0mw6n3Lsw84ocfo9CrNMqc5lTfGOw==} + '@esbuild/freebsd-x64@0.28.0': + resolution: {integrity: sha512-BXoQai/A0wPO6Es3yFJ7APCiKGc1tdAEOgeTNy3SsB491S3aHn4S4r3e976eUnPdU+NbdtmBuLncYir2tMU9Nw==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.25.11': - resolution: {integrity: sha512-Qr8AzcplUhGvdyUF08A1kHU3Vr2O88xxP0Tm8GcdVOUm25XYcMPp2YqSVHbLuXzYQMf9Bh/iKx7YPqECs6ffLA==} + '@esbuild/linux-arm64@0.28.0': + resolution: {integrity: sha512-RVyzfb3FWsGA55n6WY0MEIEPURL1FcbhFE6BffZEMEekfCzCIMtB5yyDcFnVbTnwk+CLAgTujmV/Lgvih56W+A==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.25.11': - resolution: {integrity: sha512-TBMv6B4kCfrGJ8cUPo7vd6NECZH/8hPpBHHlYI3qzoYFvWu2AdTvZNuU/7hsbKWqu/COU7NIK12dHAAqBLLXgw==} + '@esbuild/linux-arm@0.28.0': + resolution: {integrity: sha512-CjaaREJagqJp7iTaNQjjidaNbCKYcd4IDkzbwwxtSvjI7NZm79qiHc8HqciMddQ6CKvJT6aBd8lO9kN/ZudLlw==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.25.11': - resolution: {integrity: sha512-TmnJg8BMGPehs5JKrCLqyWTVAvielc615jbkOirATQvWWB1NMXY77oLMzsUjRLa0+ngecEmDGqt5jiDC6bfvOw==} + '@esbuild/linux-ia32@0.28.0': + resolution: {integrity: sha512-KBnSTt1kxl9x70q+ydterVdl+Cn0H18ngRMRCEQfrbqdUuntQQ0LoMZv47uB97NljZFzY6HcfqEZ2SAyIUTQBQ==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.25.11': - resolution: {integrity: sha512-DIGXL2+gvDaXlaq8xruNXUJdT5tF+SBbJQKbWy/0J7OhU8gOHOzKmGIlfTTl6nHaCOoipxQbuJi7O++ldrxgMw==} + '@esbuild/linux-loong64@0.28.0': + resolution: {integrity: sha512-zpSlUce1mnxzgBADvxKXX5sl8aYQHo2ezvMNI8I0lbblJtp8V4odlm3Yzlj7gPyt3T8ReksE6bK+pT3WD+aJRg==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.25.11': - resolution: {integrity: sha512-Osx1nALUJu4pU43o9OyjSCXokFkFbyzjXb6VhGIJZQ5JZi8ylCQ9/LFagolPsHtgw6himDSyb5ETSfmp4rpiKQ==} + '@esbuild/linux-mips64el@0.28.0': + resolution: {integrity: sha512-2jIfP6mmjkdmeTlsX/9vmdmhBmKADrWqN7zcdtHIeNSCH1SqIoNI63cYsjQR8J+wGa4Y5izRcSHSm8K3QWmk3w==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.25.11': - resolution: {integrity: sha512-nbLFgsQQEsBa8XSgSTSlrnBSrpoWh7ioFDUmwo158gIm5NNP+17IYmNWzaIzWmgCxq56vfr34xGkOcZ7jX6CPw==} + '@esbuild/linux-ppc64@0.28.0': + resolution: {integrity: sha512-bc0FE9wWeC0WBm49IQMPSPILRocGTQt3j5KPCA8os6VprfuJ7KD+5PzESSrJ6GmPIPJK965ZJHTUlSA6GNYEhg==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.25.11': - resolution: {integrity: sha512-HfyAmqZi9uBAbgKYP1yGuI7tSREXwIb438q0nqvlpxAOs3XnZ8RsisRfmVsgV486NdjD7Mw2UrFSw51lzUk1ww==} + '@esbuild/linux-riscv64@0.28.0': + resolution: {integrity: sha512-SQPZOwoTTT/HXFXQJG/vBX8sOFagGqvZyXcgLA3NhIqcBv1BJU1d46c0rGcrij2B56Z2rNiSLaZOYW5cUk7yLQ==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.25.11': - resolution: {integrity: sha512-HjLqVgSSYnVXRisyfmzsH6mXqyvj0SA7pG5g+9W7ESgwA70AXYNpfKBqh1KbTxmQVaYxpzA/SvlB9oclGPbApw==} + '@esbuild/linux-s390x@0.28.0': + resolution: {integrity: sha512-SCfR0HN8CEEjnYnySJTd2cw0k9OHB/YFzt5zgJEwa+wL/T/raGWYMBqwDNAC6dqFKmJYZoQBRfHjgwLHGSrn3Q==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.25.11': - resolution: {integrity: sha512-HSFAT4+WYjIhrHxKBwGmOOSpphjYkcswF449j6EjsjbinTZbp8PJtjsVK1XFJStdzXdy/jaddAep2FGY+wyFAQ==} + '@esbuild/linux-x64@0.28.0': + resolution: {integrity: sha512-us0dSb9iFxIi8srnpl931Nvs65it/Jd2a2K3qs7fz2WfGPHqzfzZTfec7oxZJRNPXPnNYZtanmRc4AL/JwVzHQ==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.25.11': - resolution: {integrity: sha512-hr9Oxj1Fa4r04dNpWr3P8QKVVsjQhqrMSUzZzf+LZcYjZNqhA3IAfPQdEh1FLVUJSiu6sgAwp3OmwBfbFgG2Xg==} + '@esbuild/netbsd-arm64@0.28.0': + resolution: {integrity: sha512-CR/RYotgtCKwtftMwJlUU7xCVNg3lMYZ0RzTmAHSfLCXw3NtZtNpswLEj/Kkf6kEL3Gw+BpOekRX0BYCtklhUw==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.11': - resolution: {integrity: sha512-u7tKA+qbzBydyj0vgpu+5h5AeudxOAGncb8N6C9Kh1N4n7wU1Xw1JDApsRjpShRpXRQlJLb9wY28ELpwdPcZ7A==} + '@esbuild/netbsd-x64@0.28.0': + resolution: {integrity: sha512-nU1yhmYutL+fQ71Kxnhg8uEOdC0pwEW9entHykTgEbna2pw2dkbFSMeqjjyHZoCmt8SBkOSvV+yNmm94aUrrqw==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.25.11': - resolution: {integrity: sha512-Qq6YHhayieor3DxFOoYM1q0q1uMFYb7cSpLD2qzDSvK1NAvqFi8Xgivv0cFC6J+hWVw2teCYltyy9/m/14ryHg==} + '@esbuild/openbsd-arm64@0.28.0': + resolution: {integrity: sha512-cXb5vApOsRsxsEl4mcZ1XY3D4DzcoMxR/nnc4IyqYs0rTI8ZKmW6kyyg+11Z8yvgMfAEldKzP7AdP64HnSC/6g==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.11': - resolution: {integrity: sha512-CN+7c++kkbrckTOz5hrehxWN7uIhFFlmS/hqziSFVWpAzpWrQoAG4chH+nN3Be+Kzv/uuo7zhX716x3Sn2Jduw==} + '@esbuild/openbsd-x64@0.28.0': + resolution: {integrity: sha512-8wZM2qqtv9UP3mzy7HiGYNH/zjTA355mpeuA+859TyR+e+Tc08IHYpLJuMsfpDJwoLo1ikIJI8jC3GFjnRClzA==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/openharmony-arm64@0.25.11': - resolution: {integrity: sha512-rOREuNIQgaiR+9QuNkbkxubbp8MSO9rONmwP5nKncnWJ9v5jQ4JxFnLu4zDSRPf3x4u+2VN4pM4RdyIzDty/wQ==} + '@esbuild/openharmony-arm64@0.28.0': + resolution: {integrity: sha512-FLGfyizszcef5C3YtoyQDACyg95+dndv79i2EekILBofh5wpCa1KuBqOWKrEHZg3zrL3t5ouE5jgr94vA+Wb2w==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] - '@esbuild/sunos-x64@0.25.11': - resolution: {integrity: sha512-nq2xdYaWxyg9DcIyXkZhcYulC6pQ2FuCgem3LI92IwMgIZ69KHeY8T4Y88pcwoLIjbed8n36CyKoYRDygNSGhA==} + '@esbuild/sunos-x64@0.28.0': + resolution: {integrity: sha512-1ZgjUoEdHZZl/YlV76TSCz9Hqj9h9YmMGAgAPYd+q4SicWNX3G5GCyx9uhQWSLcbvPW8Ni7lj4gDa1T40akdlw==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.25.11': - resolution: {integrity: sha512-3XxECOWJq1qMZ3MN8srCJ/QfoLpL+VaxD/WfNRm1O3B4+AZ/BnLVgFbUV3eiRYDMXetciH16dwPbbHqwe1uU0Q==} + '@esbuild/win32-arm64@0.28.0': + resolution: {integrity: sha512-Q9StnDmQ/enxnpxCCLSg0oo4+34B9TdXpuyPeTedN/6+iXBJ4J+zwfQI28u/Jl40nOYAxGoNi7mFP40RUtkmUA==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.25.11': - resolution: {integrity: sha512-3ukss6gb9XZ8TlRyJlgLn17ecsK4NSQTmdIXRASVsiS2sQ6zPPZklNJT5GR5tE/MUarymmy8kCEf5xPCNCqVOA==} + '@esbuild/win32-ia32@0.28.0': + resolution: {integrity: sha512-zF3ag/gfiCe6U2iczcRzSYJKH1DCI+ByzSENHlM2FcDbEeo5Zd2C86Aq0tKUYAJJ1obRP84ymxIAksZUcdztHA==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.25.11': - resolution: {integrity: sha512-D7Hpz6A2L4hzsRpPaCYkQnGOotdUpDzSGRIv9I+1ITdHROSFUWW95ZPZWQmGka1Fg7W3zFJowyn9WGwMJ0+KPA==} + '@esbuild/win32-x64@0.28.0': + resolution: {integrity: sha512-pEl1bO9mfAmIC+tW5btTmrKaujg3zGtUmWNdCw/xs70FBjwAL3o9OEKNHvNmnyylD6ubxUERiEhdsL0xBQ9efw==} engines: {node: '>=18'} cpu: [x64] os: [win32] - '@gar/promisify@1.1.3': - resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} - - '@isaacs/balanced-match@4.0.1': - resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} - engines: {node: 20 || >=22} - - '@isaacs/brace-expansion@5.0.0': - resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} - engines: {node: 20 || >=22} - - '@isaacs/cliui@8.0.2': - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} - '@isaacs/fs-minipass@4.0.1': resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} engines: {node: '>=18.0.0'} @@ -418,10 +338,6 @@ packages: '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} - '@malept/cross-spawn-promise@1.1.1': - resolution: {integrity: sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==} - engines: {node: '>= 10'} - '@malept/cross-spawn-promise@2.0.0': resolution: {integrity: sha512-1DpKU0Z5ThltBwjNySMC14g0CkbyhCaz9FkhxqNsZI6uAPJXFS8cMXlBKo26FJ8ZuW6S9GCMcR9IO5k2X5/9Fg==} engines: {node: '>= 12.13.0'} @@ -430,131 +346,106 @@ packages: resolution: {integrity: sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==} engines: {node: '>= 10.0.0'} - '@npmcli/fs@2.1.2': - resolution: {integrity: sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - - '@npmcli/move-file@2.0.1': - resolution: {integrity: sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - deprecated: This functionality has been moved to @npmcli/fs - - '@pkgjs/parseargs@0.11.0': - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - - '@rolldown/pluginutils@1.0.0-beta.38': - resolution: {integrity: sha512-N/ICGKleNhA5nc9XXQG/kkKHJ7S55u0x0XUJbbkmdCnFuoRkM1Il12q9q0eX19+M7KKUEPw/daUPIRnxhcxAIw==} + '@napi-rs/wasm-runtime@1.1.4': + resolution: {integrity: sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==} + peerDependencies: + '@emnapi/core': ^1.7.1 + '@emnapi/runtime': ^1.7.1 - '@rollup/rollup-android-arm-eabi@4.52.5': - resolution: {integrity: sha512-8c1vW4ocv3UOMp9K+gToY5zL2XiiVw3k7f1ksf4yO1FlDFQ1C2u72iACFnSOceJFsWskc2WZNqeRhFRPzv+wtQ==} - cpu: [arm] - os: [android] + '@oxc-project/types@0.130.0': + resolution: {integrity: sha512-ibD2usx9JRu7f5pu2tMKMI4cpA4NgXJQoYRP4pQ7Pxmn1l6k/53qWtQWZayhYy3X4QZkt90Ot+mJEaeXouio6Q==} - '@rollup/rollup-android-arm64@4.52.5': - resolution: {integrity: sha512-mQGfsIEFcu21mvqkEKKu2dYmtuSZOBMmAl5CFlPGLY94Vlcm+zWApK7F/eocsNzp8tKmbeBP8yXyAbx0XHsFNA==} + '@rolldown/binding-android-arm64@1.0.1': + resolution: {integrity: sha512-fJI3I0r3C3Oj/zdBCpaCmBRZYf07xpaq4yCfDDoSFm+beWNzbIl26puW8RraUdugoJw/95zerNOn6jasAhzSmg==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.52.5': - resolution: {integrity: sha512-takF3CR71mCAGA+v794QUZ0b6ZSrgJkArC+gUiG6LB6TQty9T0Mqh3m2ImRBOxS2IeYBo4lKWIieSvnEk2OQWA==} + '@rolldown/binding-darwin-arm64@1.0.1': + resolution: {integrity: sha512-cKnAhWEsV7TPcA/5EAteDp6KcJZBQ2G+BqE7zayMMi7kMvwRsbv7WT9aOnn0WNl4SKEIf43vjS31iUPu80nzXg==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.52.5': - resolution: {integrity: sha512-W901Pla8Ya95WpxDn//VF9K9u2JbocwV/v75TE0YIHNTbhqUTv9w4VuQ9MaWlNOkkEfFwkdNhXgcLqPSmHy0fA==} + '@rolldown/binding-darwin-x64@1.0.1': + resolution: {integrity: sha512-YKrVwQjIRBPo+5G/u03wGjbdy4q7pyzCe93DK9VJ7zkVmeg8LJ7GbgsiHWdR4xSoe4CAXRD7Bcjgbtr64bkXNg==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.52.5': - resolution: {integrity: sha512-QofO7i7JycsYOWxe0GFqhLmF6l1TqBswJMvICnRUjqCx8b47MTo46W8AoeQwiokAx3zVryVnxtBMcGcnX12LvA==} - cpu: [arm64] - os: [freebsd] - - '@rollup/rollup-freebsd-x64@4.52.5': - resolution: {integrity: sha512-jr21b/99ew8ujZubPo9skbrItHEIE50WdV86cdSoRkKtmWa+DDr6fu2c/xyRT0F/WazZpam6kk7IHBerSL7LDQ==} + '@rolldown/binding-freebsd-x64@1.0.1': + resolution: {integrity: sha512-z/oBsREo46SsFqBwYtFe0kpJeBijAT48O/WXLI4suiCLBkr03RTtTJMCzSdDd2znlh8VJizL09XVkQgk8IZonw==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.52.5': - resolution: {integrity: sha512-PsNAbcyv9CcecAUagQefwX8fQn9LQ4nZkpDboBOttmyffnInRy8R8dSg6hxxl2Re5QhHBf6FYIDhIj5v982ATQ==} - cpu: [arm] - os: [linux] - - '@rollup/rollup-linux-arm-musleabihf@4.52.5': - resolution: {integrity: sha512-Fw4tysRutyQc/wwkmcyoqFtJhh0u31K+Q6jYjeicsGJJ7bbEq8LwPWV/w0cnzOqR2m694/Af6hpFayLJZkG2VQ==} + '@rolldown/binding-linux-arm-gnueabihf@1.0.1': + resolution: {integrity: sha512-ik8q7GM11zxvYxFc2PeDcT6TBvhCQMaUxfph/M5l9sKuTs/Sjg3L+Byw0F7w0ZVLBZmx30P+gG0ECzzN+MFcmQ==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.52.5': - resolution: {integrity: sha512-a+3wVnAYdQClOTlyapKmyI6BLPAFYs0JM8HRpgYZQO02rMR09ZcV9LbQB+NL6sljzG38869YqThrRnfPMCDtZg==} + '@rolldown/binding-linux-arm64-gnu@1.0.1': + resolution: {integrity: sha512-QoSx2EkyrrdZ6kcyE8stqZ62t0Yra8Fs5ia9lOxJrh6TMQJK7gQKmscdTHf7pOXKREKrVwOtJcQG3qVSfc866A==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.52.5': - resolution: {integrity: sha512-AvttBOMwO9Pcuuf7m9PkC1PUIKsfaAJ4AYhy944qeTJgQOqJYJ9oVl2nYgY7Rk0mkbsuOpCAYSs6wLYB2Xiw0Q==} + '@rolldown/binding-linux-arm64-musl@1.0.1': + resolution: {integrity: sha512-uwNwFpwKeNiZawfAWBgg0VIztPTV3ihhh1vV334h9ivnNLorxnQMU6Fz8wG1Zb4Qh9LC1/MkcyT3YlDXG3Rsgg==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loong64-gnu@4.52.5': - resolution: {integrity: sha512-DkDk8pmXQV2wVrF6oq5tONK6UHLz/XcEVow4JTTerdeV1uqPeHxwcg7aFsfnSm9L+OO8WJsWotKM2JJPMWrQtA==} - cpu: [loong64] - os: [linux] - - '@rollup/rollup-linux-ppc64-gnu@4.52.5': - resolution: {integrity: sha512-W/b9ZN/U9+hPQVvlGwjzi+Wy4xdoH2I8EjaCkMvzpI7wJUs8sWJ03Rq96jRnHkSrcHTpQe8h5Tg3ZzUPGauvAw==} + '@rolldown/binding-linux-ppc64-gnu@1.0.1': + resolution: {integrity: sha512-zY1bul7OWr7DFBiJ++wofXvnr8B45ce3QsQUhKrIhXsygAh7bTkwyeM1bi1a2g5C/yC/N8TZyGDEoMfm/l9mpg==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.52.5': - resolution: {integrity: sha512-sjQLr9BW7R/ZiXnQiWPkErNfLMkkWIoCz7YMn27HldKsADEKa5WYdobaa1hmN6slu9oWQbB6/jFpJ+P2IkVrmw==} - cpu: [riscv64] - os: [linux] - - '@rollup/rollup-linux-riscv64-musl@4.52.5': - resolution: {integrity: sha512-hq3jU/kGyjXWTvAh2awn8oHroCbrPm8JqM7RUpKjalIRWWXE01CQOf/tUNWNHjmbMHg/hmNCwc/Pz3k1T/j/Lg==} - cpu: [riscv64] - os: [linux] - - '@rollup/rollup-linux-s390x-gnu@4.52.5': - resolution: {integrity: sha512-gn8kHOrku8D4NGHMK1Y7NA7INQTRdVOntt1OCYypZPRt6skGbddska44K8iocdpxHTMMNui5oH4elPH4QOLrFQ==} + '@rolldown/binding-linux-s390x-gnu@1.0.1': + resolution: {integrity: sha512-0frlsT/f4Ft6I7SMESTKnF3cZsdicQn1dCMkF/jT9wDLE+gGoiQfv1nmT9e+s7s/fekvvy6tZM2jHvI2tkbJDQ==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.52.5': - resolution: {integrity: sha512-hXGLYpdhiNElzN770+H2nlx+jRog8TyynpTVzdlc6bndktjKWyZyiCsuDAlpd+j+W+WNqfcyAWz9HxxIGfZm1Q==} + '@rolldown/binding-linux-x64-gnu@1.0.1': + resolution: {integrity: sha512-XABVmGp9Tg0WspTVvwduTc4fpqy6JnAUrSQe6OuyqD/03nI7r0O9OWUkMIwFrjKAIqolvqoA4ZrJppgwE0Gxmw==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.52.5': - resolution: {integrity: sha512-arCGIcuNKjBoKAXD+y7XomR9gY6Mw7HnFBv5Rw7wQRvwYLR7gBAgV7Mb2QTyjXfTveBNFAtPt46/36vV9STLNg==} + '@rolldown/binding-linux-x64-musl@1.0.1': + resolution: {integrity: sha512-bV4fzswuzVcKD90o/VM6QqKxnxlDq0g2BISDLNVmxrnhpv1DDbyPhCIjYfvzYLV+MvkKKnQt2Q6AO86SEBULUQ==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] - '@rollup/rollup-openharmony-arm64@4.52.5': - resolution: {integrity: sha512-QoFqB6+/9Rly/RiPjaomPLmR/13cgkIGfA40LHly9zcH1S0bN2HVFYk3a1eAyHQyjs3ZJYlXvIGtcCs5tko9Cw==} + '@rolldown/binding-openharmony-arm64@1.0.1': + resolution: {integrity: sha512-/Mh0Zhq3OP7fVs0kcQHZP6lZEthMGTaSf8UBQYSFEZDWGXXlEC+nJ6EqenaK2t4LBXMe3A+K/G2BVXXdtOr4PQ==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.52.5': - resolution: {integrity: sha512-w0cDWVR6MlTstla1cIfOGyl8+qb93FlAVutcor14Gf5Md5ap5ySfQ7R9S/NjNaMLSFdUnKGEasmVnu3lCMqB7w==} - cpu: [arm64] - os: [win32] + '@rolldown/binding-wasm32-wasi@1.0.1': + resolution: {integrity: sha512-+1xc9X45l8ufsBAm6Gjvx2qDRIY9lTVt0cgWNcJ+1gdhXvkbxePA60yRTwSTuXL09CMhyJmjpV7E3NoyxbqFQQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [wasm32] - '@rollup/rollup-win32-ia32-msvc@4.52.5': - resolution: {integrity: sha512-Aufdpzp7DpOTULJCuvzqcItSGDH73pF3ko/f+ckJhxQyHtp67rHw3HMNxoIdDMUITJESNE6a8uh4Lo4SLouOUg==} - cpu: [ia32] + '@rolldown/binding-win32-arm64-msvc@1.0.1': + resolution: {integrity: sha512-1D+UqZdfnuR+Jy1GgMJwi85bD40H21uNmOPRWQhw4oRSuolZ/B5rixZ45DK2KXOTCvmVCecauWgEhbw8bI7tOw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] os: [win32] - '@rollup/rollup-win32-x64-gnu@4.52.5': - resolution: {integrity: sha512-UGBUGPFp1vkj6p8wCRraqNhqwX/4kNQPS57BCFc8wYh0g94iVIW33wJtQAx3G7vrjjNtRaxiMUylM0ktp/TRSQ==} + '@rolldown/binding-win32-x64-msvc@1.0.1': + resolution: {integrity: sha512-INAycaWuhlOK3wk4mRHGsdgwYWmd9cChdPdE9bwWmy6rn9VqVNYNFGhOdXrofXUxwHIncSiPNb8tNm8knDVIeQ==} + engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.52.5': - resolution: {integrity: sha512-TAcgQh2sSkykPRWLrdyy2AiceMckNf5loITqXxFI5VuQjS5tSuw3WlwdN8qv8vzjLAUTvYaH/mVjSFpbkFbpTg==} - cpu: [x64] - os: [win32] + '@rolldown/pluginutils@1.0.1': + resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==} '@sindresorhus/is@4.6.0': resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} @@ -564,65 +455,65 @@ packages: resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} engines: {node: '>=10'} - '@tailwindcss/node@4.1.14': - resolution: {integrity: sha512-hpz+8vFk3Ic2xssIA3e01R6jkmsAhvkQdXlEbRTk6S10xDAtiQiM3FyvZVGsucefq764euO/b8WUW9ysLdThHw==} + '@tailwindcss/node@4.3.0': + resolution: {integrity: sha512-aFb4gUhFOgdh9AXo4IzBEOzBkkAxm9VigwDJnMIYv3lcfXCJVesNfbEaBl4BNgVRyid92AmdviqwBUBRKSeY3g==} - '@tailwindcss/oxide-android-arm64@4.1.14': - resolution: {integrity: sha512-a94ifZrGwMvbdeAxWoSuGcIl6/DOP5cdxagid7xJv6bwFp3oebp7y2ImYsnZBMTwjn5Ev5xESvS3FFYUGgPODQ==} - engines: {node: '>= 10'} + '@tailwindcss/oxide-android-arm64@4.3.0': + resolution: {integrity: sha512-TJPiq67tKlLuObP6RkwvVGDoxCMBVtDgKkLfa/uyj7/FyxvQwHS+UOnVrXXgbEsfUaMgiVvC4KbJnRr26ho4Ng==} + engines: {node: '>= 20'} cpu: [arm64] os: [android] - '@tailwindcss/oxide-darwin-arm64@4.1.14': - resolution: {integrity: sha512-HkFP/CqfSh09xCnrPJA7jud7hij5ahKyWomrC3oiO2U9i0UjP17o9pJbxUN0IJ471GTQQmzwhp0DEcpbp4MZTA==} - engines: {node: '>= 10'} + '@tailwindcss/oxide-darwin-arm64@4.3.0': + resolution: {integrity: sha512-oMN/WZRb+SO37BmUElEgeEWuU8E/HXRkiODxJxLe1UTHVXLrdVSgfaJV7pSlhRGMSOiXLuxTIjfsF3wYvz8cgQ==} + engines: {node: '>= 20'} cpu: [arm64] os: [darwin] - '@tailwindcss/oxide-darwin-x64@4.1.14': - resolution: {integrity: sha512-eVNaWmCgdLf5iv6Qd3s7JI5SEFBFRtfm6W0mphJYXgvnDEAZ5sZzqmI06bK6xo0IErDHdTA5/t7d4eTfWbWOFw==} - engines: {node: '>= 10'} + '@tailwindcss/oxide-darwin-x64@4.3.0': + resolution: {integrity: sha512-N6CUmu4a6bKVADfw77p+iw6Yd9Q3OBhe0veaDX+QazfuVYlQsHfDgxBrsjQ/IW+zywL8mTrNd0SdJT/zgtvMdA==} + engines: {node: '>= 20'} cpu: [x64] os: [darwin] - '@tailwindcss/oxide-freebsd-x64@4.1.14': - resolution: {integrity: sha512-QWLoRXNikEuqtNb0dhQN6wsSVVjX6dmUFzuuiL09ZeXju25dsei2uIPl71y2Ic6QbNBsB4scwBoFnlBfabHkEw==} - engines: {node: '>= 10'} + '@tailwindcss/oxide-freebsd-x64@4.3.0': + resolution: {integrity: sha512-zDL5hBkQdH5C6MpqbK3gQAgP80tsMwSI26vjOzjJtNCMUo0lFgOItzHKBIupOZNQxt3ouPH7RPhvNhiTfCe5CQ==} + engines: {node: '>= 20'} cpu: [x64] os: [freebsd] - '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.14': - resolution: {integrity: sha512-VB4gjQni9+F0VCASU+L8zSIyjrLLsy03sjcR3bM0V2g4SNamo0FakZFKyUQ96ZVwGK4CaJsc9zd/obQy74o0Fw==} - engines: {node: '>= 10'} + '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.0': + resolution: {integrity: sha512-R06HdNi7A7OEoMsf6d4tjZ71RCWnZQPHj2mnotSFURjNLdBC+cIgXQ7l81CqeoiQftjf6OOblxXMInMgN2VzMA==} + engines: {node: '>= 20'} cpu: [arm] os: [linux] - '@tailwindcss/oxide-linux-arm64-gnu@4.1.14': - resolution: {integrity: sha512-qaEy0dIZ6d9vyLnmeg24yzA8XuEAD9WjpM5nIM1sUgQ/Zv7cVkharPDQcmm/t/TvXoKo/0knI3me3AGfdx6w1w==} - engines: {node: '>= 10'} + '@tailwindcss/oxide-linux-arm64-gnu@4.3.0': + resolution: {integrity: sha512-qTJHELX8jetjhRQHCLilkVLmybpzNQAtaI/gaoVoidn/ufbNDbAo8KlK2J+yPoc8wQxvDxCmh/5lr8nC1+lTbg==} + engines: {node: '>= 20'} cpu: [arm64] os: [linux] - '@tailwindcss/oxide-linux-arm64-musl@4.1.14': - resolution: {integrity: sha512-ISZjT44s59O8xKsPEIesiIydMG/sCXoMBCqsphDm/WcbnuWLxxb+GcvSIIA5NjUw6F8Tex7s5/LM2yDy8RqYBQ==} - engines: {node: '>= 10'} + '@tailwindcss/oxide-linux-arm64-musl@4.3.0': + resolution: {integrity: sha512-Z6sukiQsngnWO+l39X4pPbiWT81IC+PLKF+PHxIlyZbGNb9MODfYlXEVlFvej5BOZInWX01kVyzeLvHsXhfczQ==} + engines: {node: '>= 20'} cpu: [arm64] os: [linux] - '@tailwindcss/oxide-linux-x64-gnu@4.1.14': - resolution: {integrity: sha512-02c6JhLPJj10L2caH4U0zF8Hji4dOeahmuMl23stk0MU1wfd1OraE7rOloidSF8W5JTHkFdVo/O7uRUJJnUAJg==} - engines: {node: '>= 10'} + '@tailwindcss/oxide-linux-x64-gnu@4.3.0': + resolution: {integrity: sha512-DRNdQRpSGzRGfARVuVkxvM8Q12nh19l4BF/G7zGA1oe+9wcC6saFBHTISrpIcKzhiXtSrlSrluCfvMuledoCTQ==} + engines: {node: '>= 20'} cpu: [x64] os: [linux] - '@tailwindcss/oxide-linux-x64-musl@4.1.14': - resolution: {integrity: sha512-TNGeLiN1XS66kQhxHG/7wMeQDOoL0S33x9BgmydbrWAb9Qw0KYdd8o1ifx4HOGDWhVmJ+Ul+JQ7lyknQFilO3Q==} - engines: {node: '>= 10'} + '@tailwindcss/oxide-linux-x64-musl@4.3.0': + resolution: {integrity: sha512-Z0IADbDo8bh6I7h2IQMx601AdXBLfFpEdUotft86evd/8ZPflZe9COPO8Q1vw+pfLWIUo9zN/JGZvwuAJqduqg==} + engines: {node: '>= 20'} cpu: [x64] os: [linux] - '@tailwindcss/oxide-wasm32-wasi@4.1.14': - resolution: {integrity: sha512-uZYAsaW/jS/IYkd6EWPJKW/NlPNSkWkBlaeVBi/WsFQNP05/bzkebUL8FH1pdsqx4f2fH/bWFcUABOM9nfiJkQ==} + '@tailwindcss/oxide-wasm32-wasi@4.3.0': + resolution: {integrity: sha512-HNZGOUxEmElksYR7S6sC5jTeNGpobAsy9u7Gu0AskJ8/20FR9GqebUyB+HBcU/ax6BHuiuJi+Oda4B+YX6H1yA==} engines: {node: '>=14.0.0'} cpu: [wasm32] bundledDependencies: @@ -633,42 +524,59 @@ packages: - '@emnapi/wasi-threads' - tslib - '@tailwindcss/oxide-win32-arm64-msvc@4.1.14': - resolution: {integrity: sha512-Az0RnnkcvRqsuoLH2Z4n3JfAef0wElgzHD5Aky/e+0tBUxUhIeIqFBTMNQvmMRSP15fWwmvjBxZ3Q8RhsDnxAA==} - engines: {node: '>= 10'} + '@tailwindcss/oxide-win32-arm64-msvc@4.3.0': + resolution: {integrity: sha512-Pe+RPVTi1T+qymuuRpcdvwSVZjnll/f7n8gBxMMh3xLTctMDKqpdfGimbMyioqtLhUYZxdJ9wGNhV7MKHvgZsQ==} + engines: {node: '>= 20'} cpu: [arm64] os: [win32] - '@tailwindcss/oxide-win32-x64-msvc@4.1.14': - resolution: {integrity: sha512-ttblVGHgf68kEE4om1n/n44I0yGPkCPbLsqzjvybhpwa6mKKtgFfAzy6btc3HRmuW7nHe0OOrSeNP9sQmmH9XA==} - engines: {node: '>= 10'} + '@tailwindcss/oxide-win32-x64-msvc@4.3.0': + resolution: {integrity: sha512-Mvrf2kXW/yeW/OTezZlCGOirXRcUuLIBx/5Y12BaPM7wJoryG6dfS/NJL8aBPqtTEx/Vm4T4vKzFUcKDT+TKUA==} + engines: {node: '>= 20'} cpu: [x64] os: [win32] - '@tailwindcss/oxide@4.1.14': - resolution: {integrity: sha512-23yx+VUbBwCg2x5XWdB8+1lkPajzLmALEfMb51zZUBYaYVPDQvBSD/WYDqiVyBIo2BZFa3yw1Rpy3G2Jp+K0dw==} - engines: {node: '>= 10'} + '@tailwindcss/oxide@4.3.0': + resolution: {integrity: sha512-F7HZGBeN9I0/AuuJS5PwcD8xayx5ri5GhjYUDBEVYUkexyA/giwbDNjRVrxSezE3T250OU2K/wp/ltWx3UOefg==} + engines: {node: '>= 20'} - '@tailwindcss/vite@4.1.14': - resolution: {integrity: sha512-BoFUoU0XqgCUS1UXWhmDJroKKhNXeDzD7/XwabjkDIAbMnc4ULn5e2FuEuBbhZ6ENZoSYzKlzvZ44Yr6EUDUSA==} + '@tailwindcss/vite@4.3.0': + resolution: {integrity: sha512-t6J3OrB5Fc0ExuhohouH0fWUGMYL6PTLhW+E7zIk/pdbnJARZDCwjBznFnkh5ynRnIRSI4YjtTH0t6USjJISrw==} peerDependencies: - vite: ^5.2.0 || ^6 || ^7 + vite: ^5.2.0 || ^6 || ^7 || ^8 + + '@turbo/darwin-64@2.9.14': + resolution: {integrity: sha512-t7QiPflaEyBE4oayeZtSmu4mEfjgIrcNlNNl1z1dmIVPqEdtA7+CfTf8d7KXsOGPh6aNgWjKxyvQg9uGfDQF+A==} + cpu: [x64] + os: [darwin] + + '@turbo/darwin-arm64@2.9.14': + resolution: {integrity: sha512-d23147mC9BsCPA9mJ0h/ubcpbRgcJBXbcG3+Vq7YLhjz3IXuvQsJ1UXH8f4MD76ZjJ4m/E4aRdJV+MW88CDfbw==} + cpu: [arm64] + os: [darwin] - '@tootallnate/once@2.0.0': - resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} - engines: {node: '>= 10'} + '@turbo/linux-64@2.9.14': + resolution: {integrity: sha512-P3ZKB5tuUDdDQWuAsACGUR1qv9W7BNWxdxqVJ0kZNuNNPRaVYTPPikLcp79+GiEcW3npsR+KyP38lnQiBc5aSA==} + cpu: [x64] + os: [linux] - '@types/babel__core@7.20.5': - resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + '@turbo/linux-arm64@2.9.14': + resolution: {integrity: sha512-ZRTlzcUMrrPv9ZuDzRF9n60Ym13bKeG9jDB8WjxyLhWNzV+AJQN+zdpIk3NJYf2zQsGUm1mNar2P0elRzLw25g==} + cpu: [arm64] + os: [linux] - '@types/babel__generator@7.27.0': - resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} + '@turbo/windows-64@2.9.14': + resolution: {integrity: sha512-exanwN6sIduZwykYeiTQj8kCmOhazP5WOz3bvXMcYtjhL6Z3iRWLewKrXCBq0bqwSP3iBMb/AerRCnHI4lx46A==} + cpu: [x64] + os: [win32] - '@types/babel__template@7.4.4': - resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + '@turbo/windows-arm64@2.9.14': + resolution: {integrity: sha512-fVdCsnmYoKICsycbWuuGp6Jvi51/3G/UluFWuAUCvR8PIW5IJkAk5BM9UF8PSm0Q2IphWHFZjYEgjHsh3B9y/g==} + cpu: [arm64] + os: [win32] - '@types/babel__traverse@7.28.0': - resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} + '@tybys/wasm-util@0.10.2': + resolution: {integrity: sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==} '@types/cacheable-request@6.0.3': resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} @@ -676,9 +584,6 @@ packages: '@types/debug@4.1.12': resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} - '@types/estree@1.0.8': - resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} - '@types/fs-extra@9.0.13': resolution: {integrity: sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==} @@ -700,13 +605,13 @@ packages: '@types/plist@3.0.5': resolution: {integrity: sha512-E6OCaRmAe4WDmWNsL/9RMqdkkzDCY1etutkflWk4c+AcjDU07Pcz1fQwTX0TQz+Pxqn9i4L1TU3UFpjnrcDgxA==} - '@types/react-dom@19.2.2': - resolution: {integrity: sha512-9KQPoO6mZCi7jcIStSnlOWn2nEF3mNmyr3rIAsGnAbQKYbRLyqmeSc39EVgtxXVia+LMT8j3knZLAZAh+xLmrw==} + '@types/react-dom@19.2.3': + resolution: {integrity: sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==} peerDependencies: '@types/react': ^19.2.0 - '@types/react@19.2.2': - resolution: {integrity: sha512-6mDvHUFSjyT2B2yeNx2nUgMxh9LtOWvkhIU3uePn2I2oyNymUAX1NIsdgviM4CH+JSrp2D2hsMvJOkxY+0wNRA==} + '@types/react@19.2.14': + resolution: {integrity: sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==} '@types/responselike@1.0.3': resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} @@ -717,90 +622,56 @@ packages: '@types/yauzl@2.10.3': resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} - '@vitejs/plugin-react@5.0.4': - resolution: {integrity: sha512-La0KD0vGkVkSk6K+piWDKRUyg8Rl5iAIKRMH0vMJI0Eg47bq1eOxmoObAaQG37WMW9MSyk7Cs8EIWwJC1PtzKA==} + '@vitejs/plugin-react@6.0.2': + resolution: {integrity: sha512-DlSMqo4WhThw4vB8Mpn0Woe9J+Jfq1geJ61AKW0QEgLzGMNwtIMdxbDUzLxcun8W7NbJO0e2Jg/Nxm3cCSVzzg==} engines: {node: ^20.19.0 || >=22.12.0} peerDependencies: - vite: ^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 + '@rolldown/plugin-babel': ^0.1.7 || ^0.2.0 + babel-plugin-react-compiler: ^1.0.0 + vite: ^8.0.0 + peerDependenciesMeta: + '@rolldown/plugin-babel': + optional: true + babel-plugin-react-compiler: + optional: true - '@xmldom/xmldom@0.8.11': - resolution: {integrity: sha512-cQzWCtO6C8TQiYl1ruKNn2U6Ao4o4WBBcbL61yJl84x+j5sOWWFU9X7DpND8XZG3daDppSsigMdfAIl2upQBRw==} + '@xmldom/xmldom@0.8.13': + resolution: {integrity: sha512-KRYzxepc14G/CEpEGc3Yn+JKaAeT63smlDr+vjB8jRfgTBBI9wRj/nkQEO+ucV8p8I9bfKLWp37uHgFrbntPvw==} engines: {node: '>=10.0.0'} - abbrev@1.1.1: - resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} - - agent-base@6.0.2: - resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} - engines: {node: '>= 6.0.0'} + abbrev@4.0.0: + resolution: {integrity: sha512-a1wflyaL0tHtJSmLSOVybYhy22vRih4eduhhrkcjgrWGnRfrZtovJ2FRjxuTtkkj47O/baf0R86QU5OuYpz8fA==} + engines: {node: ^20.17.0 || >=22.9.0} agent-base@7.1.4: resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} engines: {node: '>= 14'} - agentkeepalive@4.6.0: - resolution: {integrity: sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ==} - engines: {node: '>= 8.0.0'} - - aggregate-error@3.1.0: - resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} - engines: {node: '>=8'} - ajv-keywords@3.5.2: resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} peerDependencies: - ajv: ^6.9.1 + ajv: 6.14.0 - ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + ajv@6.14.0: + resolution: {integrity: sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==} ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - ansi-regex@6.2.2: - resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} - engines: {node: '>=12'} - ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} - ansi-styles@6.2.3: - resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} - engines: {node: '>=12'} - - app-builder-bin@4.0.0: - resolution: {integrity: sha512-xwdG0FJPQMe0M0UA4Tz0zEB8rBJTRA5a476ZawAqiBkMv16GRK5xpXThOjMaEOFnZ6zabejjG4J3da0SXG63KA==} - app-builder-bin@5.0.0-alpha.12: resolution: {integrity: sha512-j87o0j6LqPL3QRr8yid6c+Tt5gC7xNfYo6uQIQkorAC6MpeayVMZrEDzKmJJ/Hlv7EnOQpaRm53k6ktDYZyB6w==} - app-builder-lib@24.13.3: - resolution: {integrity: sha512-FAzX6IBit2POXYGnTCT8YHFO/lr5AapAII6zzhQO3Rw4cEDOgK+t1xhLc5tNcKlicTHlo9zxIwnYCX9X2DLkig==} - engines: {node: '>=14.0.0'} - peerDependencies: - dmg-builder: 24.13.3 - electron-builder-squirrel-windows: 24.13.3 - - app-builder-lib@26.0.12: - resolution: {integrity: sha512-+/CEPH1fVKf6HowBUs6LcAIoRcjeqgvAeoSE+cl7Y7LndyQ9ViGPYibNk7wmhMHzNgHIuIbw4nWADPO+4mjgWw==} + app-builder-lib@26.8.1: + resolution: {integrity: sha512-p0Im/Dx5C4tmz8QEE1Yn4MkuPC8PrnlRneMhWJj7BBXQfNTJUshM/bp3lusdEsDbvvfJZpXWnYesgSLvwtM2Zw==} engines: {node: '>=14.0.0'} peerDependencies: - dmg-builder: 26.0.12 - electron-builder-squirrel-windows: 26.0.12 - - archiver-utils@2.1.0: - resolution: {integrity: sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==} - engines: {node: '>= 6'} - - archiver-utils@3.0.4: - resolution: {integrity: sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==} - engines: {node: '>= 10'} - - archiver@5.3.2: - resolution: {integrity: sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw==} - engines: {node: '>= 10'} + dmg-builder: 26.8.1 + electron-builder-squirrel-windows: 26.8.1 argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} @@ -830,67 +701,42 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + balanced-match@4.0.4: + resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} + engines: {node: 18 || 20 || >=22} + base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - baseline-browser-mapping@2.8.16: - resolution: {integrity: sha512-OMu3BGQ4E7P1ErFsIPpbJh0qvDudM/UuJeHgkAvfWe+0HFJCXh+t/l8L6fVLR55RI/UbKrVLnAXZSVwd9ysWYw==} - hasBin: true - - bl@4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} - - bluebird-lst@1.0.9: - resolution: {integrity: sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw==} - - bluebird@3.7.2: - resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} - boolean@3.2.0: resolution: {integrity: sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==} deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - brace-expansion@1.1.12: - resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} + brace-expansion@1.1.13: + resolution: {integrity: sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==} - brace-expansion@2.0.2: - resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + brace-expansion@2.0.3: + resolution: {integrity: sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==} - browserslist@4.26.3: - resolution: {integrity: sha512-lAUU+02RFBuCKQPj/P6NgjlbCnLBMp4UtgTx7vNHd3XSIJF87s9a5rA3aH2yw3GS9DqZAUbOtZdCCiZeVRqt0w==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true + brace-expansion@5.0.6: + resolution: {integrity: sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==} + engines: {node: 18 || 20 || >=22} buffer-crc32@0.2.13: resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} - buffer-equal@1.0.1: - resolution: {integrity: sha512-QoV3ptgEaQpvVwbXdSO39iqPQTCxSF7A5U99AxbHYqUdCizL/lH2Z0A2y6nbZucxMEOtNyZfG2s6gsVugGpKkg==} - engines: {node: '>=0.4'} - buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} - builder-util-runtime@9.2.4: - resolution: {integrity: sha512-upp+biKpN/XZMLim7aguUyW8s0FUpDvOtK6sbanMFDAMBzpHDqdhgVYm6zc9HJ6nWo7u2Lxk60i2M6Jd3aiNrA==} - engines: {node: '>=12.0.0'} - - builder-util-runtime@9.3.1: - resolution: {integrity: sha512-2/egrNDDnRaxVwK3A+cJq6UOlqOdedGA7JPqCeJjN2Zjk1/QB/6QUi3b714ScIGS7HafFXTyzJEOr5b44I3kvQ==} + builder-util-runtime@9.5.1: + resolution: {integrity: sha512-qt41tMfgHTllhResqM5DcnHyDIWNgzHvuY2jDcYP9iaGpkWxTUzV6GQjDeLnlR1/DtdlcsWQbA7sByMpmJFTLQ==} engines: {node: '>=12.0.0'} - builder-util@24.13.1: - resolution: {integrity: sha512-NhbCSIntruNDTOVI9fdXz0dihaqX2YuE1D6zZMrwiErzH4ELZHE6mdiB40wEgZNprDia+FghRFgKoAqMZRRjSA==} - - builder-util@26.0.11: - resolution: {integrity: sha512-xNjXfsldUEe153h1DraD0XvDOpqGR0L5eKFkdReB7eFW5HqysDZFfly4rckda6y9dF39N3pkPlOblcfHKGw+uA==} - - cacache@16.1.3: - resolution: {integrity: sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + builder-util@26.8.1: + resolution: {integrity: sha512-pm1lTYbGyc90DHgCDO7eo8Rl4EqKLciayNbZqGziqnH9jrlKe8ZANGdityLZU+pJh16dfzjAx2xQq9McuIPEtw==} cacheable-lookup@5.0.4: resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} @@ -904,17 +750,10 @@ packages: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} - caniuse-lite@1.0.30001750: - resolution: {integrity: sha512-cuom0g5sdX6rw00qOoLNSFCJ9/mYIsuSOA+yzpDw8eopiFqcVwQvZHqov0vmEighRxX++cfC0Vg1G+1Iy/mSpQ==} - chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} - chownr@2.0.0: - resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} - engines: {node: '>=10'} - chownr@3.0.0: resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} engines: {node: '>=18'} @@ -922,22 +761,14 @@ packages: chromium-pickle-js@0.2.0: resolution: {integrity: sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==} - ci-info@3.9.0: - resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + ci-info@4.3.1: + resolution: {integrity: sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==} engines: {node: '>=8'} - clean-stack@2.2.0: - resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} - engines: {node: '>=6'} - - cli-cursor@3.1.0: - resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + ci-info@4.4.0: + resolution: {integrity: sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==} engines: {node: '>=8'} - cli-spinners@2.9.2: - resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} - engines: {node: '>=6'} - cli-truncate@2.1.0: resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==} engines: {node: '>=8'} @@ -949,10 +780,6 @@ packages: clone-response@1.0.3: resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} - clone@1.0.4: - resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} - engines: {node: '>=0.8'} - color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} @@ -968,14 +795,14 @@ packages: resolution: {integrity: sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==} engines: {node: '>= 6'} + commander@9.5.0: + resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} + engines: {node: ^12.20.0 || >=14} + compare-version@0.1.2: resolution: {integrity: sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==} engines: {node: '>=0.10.0'} - compress-commons@4.1.2: - resolution: {integrity: sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==} - engines: {node: '>= 10'} - concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} @@ -984,33 +811,15 @@ packages: engines: {node: ^14.13.0 || >=16.0.0} hasBin: true - config-file-ts@0.2.6: - resolution: {integrity: sha512-6boGVaglwblBgJqGyxm4+xCmEGcWgnWHSWHY5jad58awQhB6gftq0G8HbzU39YqCIYHMLAiL1yjwiZ36m/CL8w==} - - config-file-ts@0.2.8-rc1: - resolution: {integrity: sha512-GtNECbVI82bT4RiDIzBSVuTKoSHufnU7Ce7/42bkWZJZFLjmDF2WBpVsvRkhKCfKBnTBb3qZrBwPpFBU/Myvhg==} - - convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - core-util-is@1.0.2: resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} - core-util-is@1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - - crc-32@1.2.2: - resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} - engines: {node: '>=0.8'} - hasBin: true - - crc32-stream@4.0.3: - resolution: {integrity: sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==} - engines: {node: '>= 10'} - crc@3.8.0: resolution: {integrity: sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==} + cross-dirname@0.1.0: + resolution: {integrity: sha512-+R08/oI0nl3vfPcqftZRpytksBXDzOUveBq/NBVx0sUp1axwzPQrKinNx5yd5sxPu8j1wIy8AfnVQ+5eFdha6Q==} + cross-env@10.1.0: resolution: {integrity: sha512-GsYosgnACZTADcmEyJctkJIoqAhHjttw7RsFrVoJNXbsWWqaq6Ym+7kZjq6mS45O0jij6vtiReppKQEtqWy6Dw==} engines: {node: '>=20'} @@ -1020,22 +829,13 @@ packages: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} - csstype@3.1.3: - resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} date-fns@2.30.0: resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} engines: {node: '>=0.11'} - debug@4.4.1: - resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - debug@4.4.3: resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} @@ -1049,9 +849,6 @@ packages: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} engines: {node: '>=10'} - defaults@1.0.4: - resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} - defer-to-connect@2.0.1: resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} engines: {node: '>=10'} @@ -1075,14 +872,11 @@ packages: detect-node@2.1.0: resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} - dir-compare@3.3.0: - resolution: {integrity: sha512-J7/et3WlGUCxjdnD3HAAzQ6nsnc0WL6DD7WcwJb7c39iH1+AWfg+9OqzJNaI6PkBwBvm1mhZNL9iY/nRiZXlPg==} - dir-compare@4.2.0: resolution: {integrity: sha512-2xMCmOoMrdQIPHdsTawECdNPwlVFB9zGcz3kuhmBO6U3oU+UQjsue0i8ayLKpgBcm+hcXPMVSGUN9d+pvJ6+VQ==} - dmg-builder@26.0.12: - resolution: {integrity: sha512-59CAAjAhTaIMCN8y9kD573vDkxbs1uhDcrFLHSgutYdPcGOU35Rf95725snvzEOy4BFB7+eLJ8djCNPmGwG67w==} + dmg-builder@26.8.1: + resolution: {integrity: sha512-glMJgnTreo8CFINujtAhCgN96QAqApDMZ8Vl1r8f0QT8QprvC1UCltV4CcWj20YoIyLZx6IUskaJZ0NV8fokcg==} dmg-license@1.0.11: resolution: {integrity: sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q==} @@ -1094,70 +888,52 @@ packages: resolution: {integrity: sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==} engines: {node: '>=12'} - dotenv-expand@5.1.0: - resolution: {integrity: sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==} - dotenv@16.6.1: resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} engines: {node: '>=12'} - dotenv@17.2.3: - resolution: {integrity: sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==} + dotenv@17.4.2: + resolution: {integrity: sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==} engines: {node: '>=12'} - dotenv@9.0.2: - resolution: {integrity: sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg==} - engines: {node: '>=10'} - dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} - eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - ejs@3.1.10: resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} engines: {node: '>=0.10.0'} hasBin: true - electron-builder-squirrel-windows@24.13.3: - resolution: {integrity: sha512-oHkV0iogWfyK+ah9ZIvMDpei1m9ZRpdXcvde1wTpra2U8AFDNNpqJdnin5z+PM1GbQ5BoaKCWas2HSjtR0HwMg==} + electron-builder-squirrel-windows@26.8.1: + resolution: {integrity: sha512-o288fIdgPLHA76eDrFADHPoo7VyGkDCYbLV1GzndaMSAVBoZrGvM9m2IehdcVMzdAZJ2eV9bgyissQXHv5tGzA==} - electron-builder@26.0.12: - resolution: {integrity: sha512-cD1kz5g2sgPTMFHjLxfMjUK5JABq3//J4jPswi93tOPFz6btzXYtK5NrDt717NRbukCUDOrrvmYVOWERlqoiXA==} + electron-builder@26.8.1: + resolution: {integrity: sha512-uWhx1r74NGpCagG0ULs/P9Nqv2nsoo+7eo4fLUOB8L8MdWltq9odW/uuLXMFCDGnPafknYLZgjNX0ZIFRzOQAw==} engines: {node: '>=14.0.0'} hasBin: true - electron-publish@24.13.1: - resolution: {integrity: sha512-2ZgdEqJ8e9D17Hwp5LEq5mLQPjqU3lv/IALvgp+4W8VeNhryfGhYEQC/PgDPMrnWUp+l60Ou5SJLsu+k4mhQ8A==} - - electron-publish@26.0.11: - resolution: {integrity: sha512-a8QRH0rAPIWH9WyyS5LbNvW9Ark6qe63/LqDB7vu2JXYpi0Gma5Q60Dh4tmTqhOBQt0xsrzD8qE7C+D7j+B24A==} + electron-publish@26.8.1: + resolution: {integrity: sha512-q+jrSTIh/Cv4eGZa7oVR+grEJo/FoLMYBAnSL5GCtqwUpr1T+VgKB/dn1pnzxIxqD8S/jP1yilT9VrwCqINR4w==} - electron-to-chromium@1.5.237: - resolution: {integrity: sha512-icUt1NvfhGLar5lSWH3tHNzablaA5js3HVHacQimfP8ViEBOQv+L7DKEuHdbTZ0SKCO1ogTJTIL1Gwk9S6Qvcg==} + electron-winstaller@5.4.0: + resolution: {integrity: sha512-bO3y10YikuUwUuDUQRM4KfwNkKhnpVO7IPdbsrejwN9/AABJzzTQ4GeHwyzNSrVO+tEH3/Np255a3sVZpZDjvg==} + engines: {node: '>=8.0.0'} - electron@https://codeload.github.com/castlabs/electron-releases/tar.gz/678b5c7761825c5af936f5c67a9101f3fc6ab750: - resolution: {tarball: https://codeload.github.com/castlabs/electron-releases/tar.gz/678b5c7761825c5af936f5c67a9101f3fc6ab750} - version: 38.0.0 + electron@https://codeload.github.com/castlabs/electron-releases/tar.gz/b5480283432a0523f4f3a9c62b130fe8dcde5299: + resolution: {tarball: https://codeload.github.com/castlabs/electron-releases/tar.gz/b5480283432a0523f4f3a9c62b130fe8dcde5299} + version: 39.8.10 engines: {node: '>= 12.20.55'} hasBin: true emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - - encoding@0.1.13: - resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} - end-of-stream@1.4.5: resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} - enhanced-resolve@5.18.3: - resolution: {integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==} + enhanced-resolve@5.21.4: + resolution: {integrity: sha512-wE4fDO8OjJhrPFH69HUQStq5oKvGRTNXEyW+k5C/pUQLASSsTu7obd2V3GvCDgPcY9AWjhJ4jz9Kh7iRvrxhJg==} engines: {node: '>=10.13.0'} env-paths@2.2.1: @@ -1186,8 +962,8 @@ packages: es6-error@4.1.1: resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} - esbuild@0.25.11: - resolution: {integrity: sha512-KohQwyzrKTQmhXDW1PjCv3Tyspn9n5GcY2RTDqeORIdIJY8yKIF7sTSopFmn/wpMPW4rdPXI0UE5LJLuq3bx0Q==} + esbuild@0.28.0: + resolution: {integrity: sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw==} engines: {node: '>=18'} hasBin: true @@ -1224,7 +1000,7 @@ packages: resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} engines: {node: '>=12.0.0'} peerDependencies: - picomatch: ^3 || ^4 + picomatch: 4.0.4 peerDependenciesMeta: picomatch: optional: true @@ -1232,17 +1008,10 @@ packages: filelist@1.0.4: resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} - foreground-child@3.3.1: - resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} - engines: {node: '>=14'} - - form-data@4.0.4: - resolution: {integrity: sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==} + form-data@4.0.5: + resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} engines: {node: '>= 6'} - fs-constants@1.0.0: - resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - fs-extra@10.1.0: resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} engines: {node: '>=12'} @@ -1251,6 +1020,10 @@ packages: resolution: {integrity: sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==} engines: {node: '>=14.14'} + fs-extra@7.0.1: + resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} + engines: {node: '>=6 <7 || >=8'} + fs-extra@8.1.0: resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} engines: {node: '>=6 <7 || >=8'} @@ -1259,10 +1032,6 @@ packages: resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} engines: {node: '>=10'} - fs-minipass@2.1.0: - resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} - engines: {node: '>= 8'} - fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} @@ -1274,10 +1043,6 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} - get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} @@ -1294,18 +1059,9 @@ packages: resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} engines: {node: '>=8'} - glob@10.4.5: - resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} - hasBin: true - glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported - - glob@8.1.0: - resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} - engines: {node: '>=12'} - deprecated: Glob versions prior to v9 are no longer supported + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me global-agent@3.0.0: resolution: {integrity: sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==} @@ -1352,10 +1108,6 @@ packages: http-cache-semantics@4.2.0: resolution: {integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==} - http-proxy-agent@5.0.0: - resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} - engines: {node: '>= 6'} - http-proxy-agent@7.0.2: resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} engines: {node: '>= 14'} @@ -1364,17 +1116,10 @@ packages: resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} engines: {node: '>=10.19.0'} - https-proxy-agent@5.0.1: - resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} - engines: {node: '>= 6'} - https-proxy-agent@7.0.6: resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} engines: {node: '>= 14'} - humanize-ms@1.2.1: - resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} - iconv-corefoundation@1.1.7: resolution: {integrity: sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ==} engines: {node: ^8.11.2 || >=10} @@ -1387,17 +1132,6 @@ packages: ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - - indent-string@4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} - engines: {node: '>=8'} - - infer-owner@1.0.4: - resolution: {integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==} - inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. @@ -1405,32 +1139,10 @@ packages: inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - ip-address@10.0.1: - resolution: {integrity: sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==} - engines: {node: '>= 12'} - - is-ci@3.0.1: - resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} - hasBin: true - is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} - is-interactive@1.0.0: - resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} - engines: {node: '>=8'} - - is-lambda@1.0.1: - resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} - - is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} - - isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - isbinaryfile@4.0.10: resolution: {integrity: sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==} engines: {node: '>= 8.0.0'} @@ -1442,8 +1154,13 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - jackspeak@3.4.3: - resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + isexe@3.1.5: + resolution: {integrity: sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==} + engines: {node: '>=18'} + + isexe@4.0.0: + resolution: {integrity: sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==} + engines: {node: '>=20'} jake@10.9.4: resolution: {integrity: sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==} @@ -1457,13 +1174,8 @@ packages: js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - - jsesc@3.1.0: - resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} - engines: {node: '>=6'} + js-yaml@4.1.1: + resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} hasBin: true json-buffer@3.0.1: @@ -1492,165 +1204,78 @@ packages: lazy-val@1.0.5: resolution: {integrity: sha512-0/BnGCCfyUMkBpeDgWihanIAF9JmZhHBgUhEqzvf+adhNGLoP6TaiI5oF8oyb3I45P+PcnrqihSf01M0l0G5+Q==} - lazystream@1.0.1: - resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} - engines: {node: '>= 0.6.3'} - - lightningcss-android-arm64@1.30.2: - resolution: {integrity: sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==} + lightningcss-android-arm64@1.32.0: + resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [android] - lightningcss-darwin-arm64@1.30.1: - resolution: {integrity: sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [darwin] - - lightningcss-darwin-arm64@1.30.2: - resolution: {integrity: sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==} + lightningcss-darwin-arm64@1.32.0: + resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [darwin] - lightningcss-darwin-x64@1.30.1: - resolution: {integrity: sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==} + lightningcss-darwin-x64@1.32.0: + resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [darwin] - lightningcss-darwin-x64@1.30.2: - resolution: {integrity: sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [darwin] - - lightningcss-freebsd-x64@1.30.1: - resolution: {integrity: sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [freebsd] - - lightningcss-freebsd-x64@1.30.2: - resolution: {integrity: sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==} + lightningcss-freebsd-x64@1.32.0: + resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==} engines: {node: '>= 12.0.0'} cpu: [x64] os: [freebsd] - lightningcss-linux-arm-gnueabihf@1.30.1: - resolution: {integrity: sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==} + lightningcss-linux-arm-gnueabihf@1.32.0: + resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==} engines: {node: '>= 12.0.0'} cpu: [arm] os: [linux] - lightningcss-linux-arm-gnueabihf@1.30.2: - resolution: {integrity: sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==} + lightningcss-linux-arm64-gnu@1.32.0: + resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==} engines: {node: '>= 12.0.0'} - cpu: [arm] + cpu: [arm64] os: [linux] - lightningcss-linux-arm64-gnu@1.30.1: - resolution: {integrity: sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==} + lightningcss-linux-arm64-musl@1.32.0: + resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} engines: {node: '>= 12.0.0'} cpu: [arm64] os: [linux] - lightningcss-linux-arm64-gnu@1.30.2: - resolution: {integrity: sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==} + lightningcss-linux-x64-gnu@1.32.0: + resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} engines: {node: '>= 12.0.0'} - cpu: [arm64] + cpu: [x64] os: [linux] - lightningcss-linux-arm64-musl@1.30.1: - resolution: {integrity: sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==} + lightningcss-linux-x64-musl@1.32.0: + resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} engines: {node: '>= 12.0.0'} - cpu: [arm64] + cpu: [x64] os: [linux] - lightningcss-linux-arm64-musl@1.30.2: - resolution: {integrity: sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==} + lightningcss-win32-arm64-msvc@1.32.0: + resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} engines: {node: '>= 12.0.0'} cpu: [arm64] - os: [linux] + os: [win32] - lightningcss-linux-x64-gnu@1.30.1: - resolution: {integrity: sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==} + lightningcss-win32-x64-msvc@1.32.0: + resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==} engines: {node: '>= 12.0.0'} cpu: [x64] - os: [linux] + os: [win32] - lightningcss-linux-x64-gnu@1.30.2: - resolution: {integrity: sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==} + lightningcss@1.32.0: + resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [linux] - lightningcss-linux-x64-musl@1.30.1: - resolution: {integrity: sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [linux] - - lightningcss-linux-x64-musl@1.30.2: - resolution: {integrity: sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [linux] - - lightningcss-win32-arm64-msvc@1.30.1: - resolution: {integrity: sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [win32] - - lightningcss-win32-arm64-msvc@1.30.2: - resolution: {integrity: sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==} - engines: {node: '>= 12.0.0'} - cpu: [arm64] - os: [win32] - - lightningcss-win32-x64-msvc@1.30.1: - resolution: {integrity: sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [win32] - - lightningcss-win32-x64-msvc@1.30.2: - resolution: {integrity: sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==} - engines: {node: '>= 12.0.0'} - cpu: [x64] - os: [win32] - - lightningcss@1.30.1: - resolution: {integrity: sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==} - engines: {node: '>= 12.0.0'} - - lightningcss@1.30.2: - resolution: {integrity: sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==} - engines: {node: '>= 12.0.0'} - - lodash.defaults@4.2.0: - resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} - - lodash.difference@4.5.0: - resolution: {integrity: sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==} - - lodash.flatten@4.4.0: - resolution: {integrity: sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==} - - lodash.isplainobject@4.0.6: - resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} - - lodash.union@4.6.0: - resolution: {integrity: sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==} - - lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - - log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} + lodash@4.18.1: + resolution: {integrity: sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==} loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} @@ -1660,31 +1285,17 @@ packages: resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} engines: {node: '>=8'} - lru-cache@10.4.3: - resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - - lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - lru-cache@6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} - lru-cache@7.18.3: - resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} - engines: {node: '>=12'} - lucide-react@0.546.0: resolution: {integrity: sha512-Z94u6fKT43lKeYHiVyvyR8fT7pwCzDu7RyMPpTvh054+xahSgj4HFQ+NmflvzdXsoAjYGdCguGaFKYuvq0ThCQ==} peerDependencies: react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 - magic-string@0.30.19: - resolution: {integrity: sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==} - - make-fetch-happen@10.2.1: - resolution: {integrity: sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} matcher@3.0.0: resolution: {integrity: sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==} @@ -1707,10 +1318,6 @@ packages: engines: {node: '>=4.0.0'} hasBin: true - mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} - mimic-response@1.0.1: resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} engines: {node: '>=4'} @@ -1719,67 +1326,34 @@ packages: resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} engines: {node: '>=10'} - minimatch@10.0.3: - resolution: {integrity: sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==} - engines: {node: 20 || >=22} + minimatch@10.2.5: + resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} + engines: {node: 18 || 20 || >=22} - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + minimatch@3.1.4: + resolution: {integrity: sha512-twmL+S8+7yIsE9wsqgzU3E8/LumN3M3QELrBZ20OdmQ9jB2JvW5oZtBEmft84k/Gs5CG9mqtWc6Y9vW+JEzGxw==} - minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + minimatch@5.1.8: + resolution: {integrity: sha512-7RN35vit8DeBclkofOVmBY0eDAZZQd1HzmukRdSyz95CRh8FT54eqnbj0krQr3mrHR6sfRyYkyhwBWjoV5uqlQ==} engines: {node: '>=10'} - minimatch@9.0.5: - resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + minimatch@9.0.9: + resolution: {integrity: sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==} engines: {node: '>=16 || 14 >=14.17'} minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - minipass-collect@1.0.2: - resolution: {integrity: sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==} - engines: {node: '>= 8'} - - minipass-fetch@2.1.2: - resolution: {integrity: sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - - minipass-flush@1.0.5: - resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} - engines: {node: '>= 8'} - - minipass-pipeline@1.2.4: - resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} - engines: {node: '>=8'} - - minipass-sized@1.0.3: - resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} - engines: {node: '>=8'} - - minipass@3.3.6: - resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} - engines: {node: '>=8'} - - minipass@5.0.0: - resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} - engines: {node: '>=8'} - minipass@7.1.2: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} - minizlib@2.1.2: - resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} - engines: {node: '>= 8'} - minizlib@3.1.0: resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==} engines: {node: '>= 18'} - mkdirp@1.0.4: - resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} - engines: {node: '>=10'} + mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} hasBin: true ms@2.1.3: @@ -1790,13 +1364,9 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - negotiator@0.6.4: - resolution: {integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==} - engines: {node: '>= 0.6'} - - node-abi@3.78.0: - resolution: {integrity: sha512-E2wEyrgX/CqvicaQYU3Ze1PFGjc4QYPGsjUrlYkqAE0WjHEZwgOsGMPMzkMse4LjJbDmaEuDX3CM036j5K2DSQ==} - engines: {node: '>=10'} + node-abi@4.31.0: + resolution: {integrity: sha512-Erq5w/t3syw3s4sDsUaX4QttIdBPsGKTT1DTRsCkTonGggczhlDKm/wDX3o+HPJpQ41EjXCbcmXf0tgr5YZJXw==} + engines: {node: '>=22.12.0'} node-addon-api@1.7.2: resolution: {integrity: sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==} @@ -1804,17 +1374,15 @@ packages: node-api-version@0.2.1: resolution: {integrity: sha512-2xP/IGGMmmSQpI1+O/k72jF/ykvZ89JeuKX3TLJAYPDVLUalrshrLHkeVcCCZqG/eEa635cr8IBYzgnDvM2O8Q==} - node-releases@2.0.23: - resolution: {integrity: sha512-cCmFDMSm26S6tQSDpBCg/NR8NENrVPhAJSf+XbxBG4rPFaaonlEoE9wHQmun+cls499TQGSb7ZyPBRlzgKfpeg==} - - nopt@6.0.0: - resolution: {integrity: sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + node-gyp@12.3.0: + resolution: {integrity: sha512-QNcUWM+HgJplcPzBvFBZ9VXacyGZ4+VTOb80PwWR+TlVzoHbRKULNEzpRsnaoxG3Wzr7Qh7BYxGDU3CbKib2Yg==} + engines: {node: ^20.17.0 || >=22.9.0} hasBin: true - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} + nopt@9.0.0: + resolution: {integrity: sha512-Zhq3a+yFKrYwSBluL4H9XP3m3y5uvQkB/09CwDruCiRmR/UJYnn9W4R48ry0uGC70aeTPKLynBtscP9efFFcPw==} + engines: {node: ^20.17.0 || >=22.9.0} + hasBin: true normalize-url@6.1.0: resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} @@ -1827,14 +1395,6 @@ packages: once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} - - ora@5.4.1: - resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} - engines: {node: '>=10'} - p-cancelable@2.1.1: resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} engines: {node: '>=8'} @@ -1843,13 +1403,6 @@ packages: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} - p-map@4.0.0: - resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} - engines: {node: '>=10'} - - package-json-from-dist@1.0.1: - resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} - path-is-absolute@1.0.1: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} @@ -1858,10 +1411,6 @@ packages: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} - path-scurry@1.11.1: - resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} - engines: {node: '>=16 || 14 >=14.18'} - pe-library@0.4.1: resolution: {integrity: sha512-eRWB5LBz7PpDu4PUlwT0PhnQfTQJlDDdPa35urV4Osrm0t0AqQFGn+UIkU3klZvwJ8KPO3VbBFsXquA6p6kqZw==} engines: {node: '>=12', npm: '>=6'} @@ -1872,45 +1421,43 @@ packages: picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - picomatch@4.0.3: - resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + picomatch@4.0.4: + resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} engines: {node: '>=12'} plist@3.1.0: resolution: {integrity: sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==} engines: {node: '>=10.4.0'} - postcss@8.5.6: - resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + postcss@8.5.14: + resolution: {integrity: sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==} engines: {node: ^10 || ^12 || >=14} - prettier@3.6.2: - resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} - engines: {node: '>=14'} + postject@1.0.0-alpha.6: + resolution: {integrity: sha512-b9Eb8h2eVqNE8edvKdwqkrY6O7kAwmI8kcnBv1NScolYJbo59XUF0noFq+lxbC1yN20bmC0WBEbDC5H/7ASb0A==} + engines: {node: '>=14.0.0'} + hasBin: true - proc-log@2.0.1: - resolution: {integrity: sha512-Kcmo2FhfDTXdcbfDH76N7uBYHINxc/8GW7UAVuVP9I+Va3uHSerrnKV6dLooga/gh7GlgzuCCr/eoldnL1muGw==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + prettier@3.8.3: + resolution: {integrity: sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==} + engines: {node: '>=14'} + hasBin: true - process-nextick-args@2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + proc-log@6.1.0: + resolution: {integrity: sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ==} + engines: {node: ^20.17.0 || >=22.9.0} progress@2.0.3: resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} engines: {node: '>=0.4.0'} - promise-inflight@1.0.1: - resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} - peerDependencies: - bluebird: '*' - peerDependenciesMeta: - bluebird: - optional: true - promise-retry@2.0.1: resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} engines: {node: '>=10'} + proper-lockfile@4.1.2: + resolution: {integrity: sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==} + pump@3.0.3: resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==} @@ -1927,10 +1474,6 @@ packages: peerDependencies: react: ^18.3.1 - react-refresh@0.17.0: - resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==} - engines: {node: '>=0.10.0'} - react@18.3.1: resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} engines: {node: '>=0.10.0'} @@ -1939,20 +1482,6 @@ packages: resolution: {integrity: sha512-BNg9EN3DD3GsDXX7Aa8O4p92sryjkmzYYgmgTAc6CA4uGLEDzFfxOxugu21akOxpcXHiEgsYkC6nPsQvLLLmEg==} hasBin: true - read-config-file@6.3.2: - resolution: {integrity: sha512-M80lpCjnE6Wt6zb98DoW8WHR09nzMSpu8XHtPkiTHrJ5Az9CybfeQhTJ8D7saeBHpGhLPIVyA8lcL6ZmdKwY6Q==} - engines: {node: '>=12.0.0'} - - readable-stream@2.3.8: - resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} - - readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} - - readdir-glob@1.1.3: - resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==} - require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} @@ -1967,16 +1496,12 @@ packages: responselike@2.0.1: resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} - restore-cursor@3.1.0: - resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} - engines: {node: '>=8'} - retry@0.12.0: resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} engines: {node: '>= 4'} - rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + rimraf@2.6.3: + resolution: {integrity: sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==} deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true @@ -1984,20 +1509,14 @@ packages: resolution: {integrity: sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==} engines: {node: '>=8.0'} - rollup@4.52.5: - resolution: {integrity: sha512-3GuObel8h7Kqdjt0gxkEzaifHTqLVW56Y/bjN7PSQtkKr0w3V/QYSdt6QWYtd7A1xUtYQigtdUfgj1RvWVtorw==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} + rolldown@1.0.1: + resolution: {integrity: sha512-X0KQHljNnEkWNqqiz9zJrGunh1B0HgOxLXvnFpCOcadzcy5qohZ3tqMEUg00vncoRovXuK3ZqCT9KnnKzoInFQ==} + engines: {node: ^20.19.0 || >=22.12.0} hasBin: true rxjs@7.8.2: resolution: {integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==} - safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} @@ -2021,11 +1540,6 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - semver@7.7.2: - resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} - engines: {node: '>=10'} - hasBin: true - semver@7.7.3: resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} engines: {node: '>=10'} @@ -2050,10 +1564,6 @@ packages: signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} - simple-update-notifier@2.0.0: resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} engines: {node: '>=10'} @@ -2066,14 +1576,6 @@ packages: resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} - socks-proxy-agent@7.0.0: - resolution: {integrity: sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==} - engines: {node: '>= 10'} - - socks@2.8.7: - resolution: {integrity: sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A==} - engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} - source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} @@ -2091,10 +1593,6 @@ packages: sprintf-js@1.1.3: resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} - ssri@9.0.1: - resolution: {integrity: sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - stat-mode@1.0.0: resolution: {integrity: sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==} engines: {node: '>= 6'} @@ -2103,24 +1601,10 @@ packages: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} - string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} - - string_decoder@1.1.1: - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} - - string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} - strip-ansi@7.1.2: - resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} - engines: {node: '>=12'} - sumchecker@3.0.1: resolution: {integrity: sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==} engines: {node: '>= 8.0'} @@ -2133,28 +1617,24 @@ packages: resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} engines: {node: '>=10'} - tailwindcss@4.1.14: - resolution: {integrity: sha512-b7pCxjGO98LnxVkKjaZSDeNuljC4ueKUddjENJOADtubtdo8llTaJy7HwBMeLNSSo2N5QIAgklslK1+Ir8r6CA==} + tailwindcss@4.3.0: + resolution: {integrity: sha512-y6nxMGB1nMW9R6k96e5gdIFzcfL/gTJRNaqGes1YvkLnPVXzWgbqFF2yLC0T8G774n24cx3Pe8XrKoniCOAH+Q==} - tapable@2.3.0: - resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} + tapable@2.3.3: + resolution: {integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==} engines: {node: '>=6'} - tar-stream@2.2.0: - resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} - engines: {node: '>=6'} - - tar@6.2.1: - resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} - engines: {node: '>=10'} - - tar@7.5.1: - resolution: {integrity: sha512-nlGpxf+hv0v7GkWBK2V9spgactGOp0qvfWRxUMjqHyzrt3SgwE48DIv/FhqPHJYLHpgW1opq3nERbz5Anq7n1g==} + tar@7.5.15: + resolution: {integrity: sha512-dzGK0boVlC4W5QFuQN1EFSl3bIDYsk7Tj40U6eIBnK2k/8ml7TZ5agbI5j5+qnoVcAA+rNtBml8SEiLxZpNqRQ==} engines: {node: '>=18'} temp-file@3.4.0: resolution: {integrity: sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==} + temp@0.9.4: + resolution: {integrity: sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA==} + engines: {node: '>=6.0.0'} + tiny-async-pool@1.3.0: resolution: {integrity: sha512-01EAw5EDrcVrdgyCLgoSPvqznC0sVxDSVeiOz09FUpjh71G79VCqneOr+xvt7T1r76CF6ZZfPjHorN2+d+3mqA==} @@ -2162,6 +1642,10 @@ packages: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} + tinyglobby@0.2.16: + resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} + engines: {node: '>=12.0.0'} + tmp-promise@3.0.3: resolution: {integrity: sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==} @@ -2179,38 +1663,8 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - turbo-darwin-64@2.5.8: - resolution: {integrity: sha512-Dh5bCACiHO8rUXZLpKw+m3FiHtAp2CkanSyJre+SInEvEr5kIxjGvCK/8MFX8SFRjQuhjtvpIvYYZJB4AGCxNQ==} - cpu: [x64] - os: [darwin] - - turbo-darwin-arm64@2.5.8: - resolution: {integrity: sha512-f1H/tQC9px7+hmXn6Kx/w8Jd/FneIUnvLlcI/7RGHunxfOkKJKvsoiNzySkoHQ8uq1pJnhJ0xNGTlYM48ZaJOQ==} - cpu: [arm64] - os: [darwin] - - turbo-linux-64@2.5.8: - resolution: {integrity: sha512-hMyvc7w7yadBlZBGl/bnR6O+dJTx3XkTeyTTH4zEjERO6ChEs0SrN8jTFj1lueNXKIHh1SnALmy6VctKMGnWfw==} - cpu: [x64] - os: [linux] - - turbo-linux-arm64@2.5.8: - resolution: {integrity: sha512-LQELGa7bAqV2f+3rTMRPnj5G/OHAe2U+0N9BwsZvfMvHSUbsQ3bBMWdSQaYNicok7wOZcHjz2TkESn1hYK6xIQ==} - cpu: [arm64] - os: [linux] - - turbo-windows-64@2.5.8: - resolution: {integrity: sha512-3YdcaW34TrN1AWwqgYL9gUqmZsMT4T7g8Y5Azz+uwwEJW+4sgcJkIi9pYFyU4ZBSjBvkfuPZkGgfStir5BBDJQ==} - cpu: [x64] - os: [win32] - - turbo-windows-arm64@2.5.8: - resolution: {integrity: sha512-eFC5XzLmgXJfnAK3UMTmVECCwuBcORrWdewoiXBnUm934DY6QN8YowC/srhNnROMpaKaqNeRpoB5FxCww3eteQ==} - cpu: [arm64] - os: [win32] - - turbo@2.5.8: - resolution: {integrity: sha512-5c9Fdsr9qfpT3hA0EyYSFRZj1dVVsb6KIWubA9JBYZ/9ZEAijgUEae0BBR/Xl/wekt4w65/lYLTFaP3JmwSO8w==} + turbo@2.9.14: + resolution: {integrity: sha512-BQqXRr4UoWI3UPFrtznCLykYHxwxWh53iCB57x092jPMjIlW1wnm3N895g5irpiXmnxUhREBB0n6+y8BHhs4nw==} hasBin: true type-fest@0.13.1: @@ -2225,13 +1679,9 @@ packages: undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - unique-filename@2.0.1: - resolution: {integrity: sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - - unique-slug@3.0.0: - resolution: {integrity: sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + undici@6.25.0: + resolution: {integrity: sha512-ZgpWDC5gmNiuY9CnLVXEH8rl50xhRCuLNA97fAUnKi8RRuV4E6KG31pDTsLVUKnohJE0I3XDrTeEydAXRw47xg==} + engines: {node: '>=18.17'} universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} @@ -2241,34 +1691,26 @@ packages: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} - update-browserslist-db@1.1.3: - resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} utf8-byte-length@1.0.5: resolution: {integrity: sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==} - util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - verror@1.10.1: resolution: {integrity: sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==} engines: {node: '>=0.6.0'} - vite@7.1.11: - resolution: {integrity: sha512-uzcxnSDVjAopEUjljkWh8EIrg6tlzrjFUfMcR1EVsRDGwf/ccef0qQPRyOrROwhrTDaApueq+ja+KLPlzR/zdg==} + vite@8.0.13: + resolution: {integrity: sha512-MFtjBYgzmSxmgA4RAfjIyXWpGe1oALnjgUTzzV7QLx/TKxCzjtMH6Fd9/eVK+5Fg1qNoz5VAwsmMs/NofrmJvw==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: '@types/node': ^20.19.0 || >=22.12.0 + '@vitejs/devtools': ^0.1.18 + esbuild: ^0.27.0 || ^0.28.0 jiti: '>=1.21.0' less: ^4.0.0 - lightningcss: ^1.21.0 sass: ^1.70.0 sass-embedded: ^1.70.0 stylus: '>=0.54.8' @@ -2279,12 +1721,14 @@ packages: peerDependenciesMeta: '@types/node': optional: true + '@vitejs/devtools': + optional: true + esbuild: + optional: true jiti: optional: true less: optional: true - lightningcss: - optional: true sass: optional: true sass-embedded: @@ -2300,22 +1744,25 @@ packages: yaml: optional: true - wcwidth@1.0.1: - resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} - which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} hasBin: true + which@5.0.0: + resolution: {integrity: sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==} + engines: {node: ^18.17.0 || >=20.5.0} + hasBin: true + + which@6.0.1: + resolution: {integrity: sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg==} + engines: {node: ^20.17.0 || >=22.9.0} + hasBin: true + wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} - wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} - wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} @@ -2327,9 +1774,6 @@ packages: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} - yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} @@ -2352,144 +1796,22 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - zip-stream@4.1.1: - resolution: {integrity: sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==} - engines: {node: '>= 10'} - snapshots: 7zip-bin@5.2.0: {} - '@babel/code-frame@7.27.1': - dependencies: - '@babel/helper-validator-identifier': 7.27.1 - js-tokens: 4.0.0 - picocolors: 1.1.1 - - '@babel/compat-data@7.28.4': {} - - '@babel/core@7.28.4': - dependencies: - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.3 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.4) - '@babel/helpers': 7.28.4 - '@babel/parser': 7.28.4 - '@babel/template': 7.27.2 - '@babel/traverse': 7.28.4 - '@babel/types': 7.28.4 - '@jridgewell/remapping': 2.3.5 - convert-source-map: 2.0.0 - debug: 4.4.1 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - '@babel/generator@7.28.3': - dependencies: - '@babel/parser': 7.28.4 - '@babel/types': 7.28.4 - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 - jsesc: 3.1.0 - - '@babel/helper-compilation-targets@7.27.2': - dependencies: - '@babel/compat-data': 7.28.4 - '@babel/helper-validator-option': 7.27.1 - browserslist: 4.26.3 - lru-cache: 5.1.1 - semver: 6.3.1 - - '@babel/helper-globals@7.28.0': {} - - '@babel/helper-module-imports@7.27.1': - dependencies: - '@babel/traverse': 7.28.4 - '@babel/types': 7.28.4 - transitivePeerDependencies: - - supports-color - - '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.4)': - dependencies: - '@babel/core': 7.28.4 - '@babel/helper-module-imports': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 - '@babel/traverse': 7.28.4 - transitivePeerDependencies: - - supports-color - - '@babel/helper-plugin-utils@7.27.1': {} - - '@babel/helper-string-parser@7.27.1': {} - - '@babel/helper-validator-identifier@7.27.1': {} - - '@babel/helper-validator-option@7.27.1': {} - - '@babel/helpers@7.28.4': - dependencies: - '@babel/template': 7.27.2 - '@babel/types': 7.28.4 - - '@babel/parser@7.28.4': - dependencies: - '@babel/types': 7.28.4 - - '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.28.4)': - dependencies: - '@babel/core': 7.28.4 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.28.4)': - dependencies: - '@babel/core': 7.28.4 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/runtime@7.28.4': {} - '@babel/template@7.27.2': - dependencies: - '@babel/code-frame': 7.27.1 - '@babel/parser': 7.28.4 - '@babel/types': 7.28.4 - - '@babel/traverse@7.28.4': - dependencies: - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.3 - '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.28.4 - '@babel/template': 7.27.2 - '@babel/types': 7.28.4 - debug: 4.4.3 - transitivePeerDependencies: - - supports-color - - '@babel/types@7.28.4': - dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 - '@develar/schema-utils@2.6.5': dependencies: - ajv: 6.12.6 - ajv-keywords: 3.5.2(ajv@6.12.6) - - '@electron/asar@3.2.18': - dependencies: - commander: 5.1.0 - glob: 7.2.3 - minimatch: 3.1.2 + ajv: 6.14.0 + ajv-keywords: 3.5.2(ajv@6.14.0) '@electron/asar@3.4.1': dependencies: commander: 5.1.0 glob: 7.2.3 - minimatch: 3.1.2 + minimatch: 3.1.4 '@electron/fuses@1.8.0': dependencies: @@ -2511,27 +1833,17 @@ snapshots: transitivePeerDependencies: - supports-color - '@electron/node-gyp@https://codeload.github.com/electron/node-gyp/tar.gz/06b29aafb7708acef8b3669835c8a7857ebc92d2': - dependencies: - env-paths: 2.2.1 - exponential-backoff: 3.1.3 - glob: 8.1.0 - graceful-fs: 4.2.11 - make-fetch-happen: 10.2.1 - nopt: 6.0.0 - proc-log: 2.0.1 - semver: 7.7.3 - tar: 6.2.1 - which: 2.0.2 - transitivePeerDependencies: - - bluebird - - supports-color - - '@electron/notarize@2.2.1': + '@electron/get@3.1.0': dependencies: debug: 4.4.3 - fs-extra: 9.1.0 - promise-retry: 2.0.1 + env-paths: 2.2.1 + fs-extra: 8.1.0 + got: 11.8.6 + progress: 2.0.3 + semver: 6.3.1 + sumchecker: 3.0.1 + optionalDependencies: + global-agent: 3.0.0 transitivePeerDependencies: - supports-color @@ -2543,18 +1855,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@electron/osx-sign@1.0.5': + '@electron/notarize@3.1.1': dependencies: - compare-version: 0.1.2 debug: 4.4.3 - fs-extra: 10.1.0 - isbinaryfile: 4.0.10 - minimist: 1.2.8 - plist: 3.1.0 + promise-retry: 2.0.1 transitivePeerDependencies: - supports-color - '@electron/osx-sign@1.3.1': + '@electron/osx-sign@1.3.3': dependencies: compare-version: 0.1.2 debug: 4.4.3 @@ -2565,146 +1873,135 @@ snapshots: transitivePeerDependencies: - supports-color - '@electron/rebuild@3.7.0': + '@electron/rebuild@4.0.4': dependencies: - '@electron/node-gyp': https://codeload.github.com/electron/node-gyp/tar.gz/06b29aafb7708acef8b3669835c8a7857ebc92d2 '@malept/cross-spawn-promise': 2.0.0 - chalk: 4.1.2 debug: 4.4.3 - detect-libc: 2.1.2 - fs-extra: 10.1.0 - got: 11.8.6 - node-abi: 3.78.0 + node-abi: 4.31.0 node-api-version: 0.2.1 - ora: 5.4.1 + node-gyp: 12.3.0 read-binary-file-arch: 1.0.6 - semver: 7.7.3 - tar: 6.2.1 - yargs: 17.7.2 transitivePeerDependencies: - - bluebird - supports-color - '@electron/universal@1.5.1': + '@electron/universal@2.0.3': dependencies: '@electron/asar': 3.4.1 - '@malept/cross-spawn-promise': 1.1.1 + '@malept/cross-spawn-promise': 2.0.0 debug: 4.4.3 - dir-compare: 3.3.0 - fs-extra: 9.1.0 - minimatch: 3.1.2 + dir-compare: 4.2.0 + fs-extra: 11.3.2 + minimatch: 9.0.9 plist: 3.1.0 transitivePeerDependencies: - supports-color - '@electron/universal@2.0.1': + '@electron/windows-sign@1.2.2': dependencies: - '@electron/asar': 3.4.1 - '@malept/cross-spawn-promise': 2.0.0 + cross-dirname: 0.1.0 debug: 4.4.3 - dir-compare: 4.2.0 fs-extra: 11.3.2 - minimatch: 9.0.5 - plist: 3.1.0 + minimist: 1.2.8 + postject: 1.0.0-alpha.6 transitivePeerDependencies: - supports-color - - '@epic-web/invariant@1.0.0': {} - - '@esbuild/aix-ppc64@0.25.11': optional: true - '@esbuild/android-arm64@0.25.11': + '@emnapi/core@1.10.0': + dependencies: + '@emnapi/wasi-threads': 1.2.1 + tslib: 2.8.1 optional: true - '@esbuild/android-arm@0.25.11': + '@emnapi/runtime@1.10.0': + dependencies: + tslib: 2.8.1 optional: true - '@esbuild/android-x64@0.25.11': + '@emnapi/wasi-threads@1.2.1': + dependencies: + tslib: 2.8.1 optional: true - '@esbuild/darwin-arm64@0.25.11': + '@epic-web/invariant@1.0.0': {} + + '@esbuild/aix-ppc64@0.28.0': optional: true - '@esbuild/darwin-x64@0.25.11': + '@esbuild/android-arm64@0.28.0': optional: true - '@esbuild/freebsd-arm64@0.25.11': + '@esbuild/android-arm@0.28.0': optional: true - '@esbuild/freebsd-x64@0.25.11': + '@esbuild/android-x64@0.28.0': optional: true - '@esbuild/linux-arm64@0.25.11': + '@esbuild/darwin-arm64@0.28.0': optional: true - '@esbuild/linux-arm@0.25.11': + '@esbuild/darwin-x64@0.28.0': optional: true - '@esbuild/linux-ia32@0.25.11': + '@esbuild/freebsd-arm64@0.28.0': optional: true - '@esbuild/linux-loong64@0.25.11': + '@esbuild/freebsd-x64@0.28.0': optional: true - '@esbuild/linux-mips64el@0.25.11': + '@esbuild/linux-arm64@0.28.0': optional: true - '@esbuild/linux-ppc64@0.25.11': + '@esbuild/linux-arm@0.28.0': optional: true - '@esbuild/linux-riscv64@0.25.11': + '@esbuild/linux-ia32@0.28.0': optional: true - '@esbuild/linux-s390x@0.25.11': + '@esbuild/linux-loong64@0.28.0': optional: true - '@esbuild/linux-x64@0.25.11': + '@esbuild/linux-mips64el@0.28.0': optional: true - '@esbuild/netbsd-arm64@0.25.11': + '@esbuild/linux-ppc64@0.28.0': optional: true - '@esbuild/netbsd-x64@0.25.11': + '@esbuild/linux-riscv64@0.28.0': optional: true - '@esbuild/openbsd-arm64@0.25.11': + '@esbuild/linux-s390x@0.28.0': optional: true - '@esbuild/openbsd-x64@0.25.11': + '@esbuild/linux-x64@0.28.0': optional: true - '@esbuild/openharmony-arm64@0.25.11': + '@esbuild/netbsd-arm64@0.28.0': optional: true - '@esbuild/sunos-x64@0.25.11': + '@esbuild/netbsd-x64@0.28.0': optional: true - '@esbuild/win32-arm64@0.25.11': + '@esbuild/openbsd-arm64@0.28.0': optional: true - '@esbuild/win32-ia32@0.25.11': + '@esbuild/openbsd-x64@0.28.0': optional: true - '@esbuild/win32-x64@0.25.11': + '@esbuild/openharmony-arm64@0.28.0': optional: true - '@gar/promisify@1.1.3': {} + '@esbuild/sunos-x64@0.28.0': + optional: true - '@isaacs/balanced-match@4.0.1': {} + '@esbuild/win32-arm64@0.28.0': + optional: true - '@isaacs/brace-expansion@5.0.0': - dependencies: - '@isaacs/balanced-match': 4.0.1 + '@esbuild/win32-ia32@0.28.0': + optional: true - '@isaacs/cliui@8.0.2': - dependencies: - string-width: 5.1.2 - string-width-cjs: string-width@4.2.3 - strip-ansi: 7.1.2 - strip-ansi-cjs: strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: wrap-ansi@7.0.0 + '@esbuild/win32-x64@0.28.0': + optional: true '@isaacs/fs-minipass@4.0.1': dependencies: @@ -2729,10 +2026,6 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 - '@malept/cross-spawn-promise@1.1.1': - dependencies: - cross-spawn: 7.0.6 - '@malept/cross-spawn-promise@2.0.0': dependencies: cross-spawn: 7.0.6 @@ -2741,91 +2034,70 @@ snapshots: dependencies: debug: 4.4.3 fs-extra: 9.1.0 - lodash: 4.17.21 + lodash: 4.18.1 tmp-promise: 3.0.3 transitivePeerDependencies: - supports-color - '@npmcli/fs@2.1.2': - dependencies: - '@gar/promisify': 1.1.3 - semver: 7.7.3 - - '@npmcli/move-file@2.0.1': + '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': dependencies: - mkdirp: 1.0.4 - rimraf: 3.0.2 - - '@pkgjs/parseargs@0.11.0': + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@tybys/wasm-util': 0.10.2 optional: true - '@rolldown/pluginutils@1.0.0-beta.38': {} - - '@rollup/rollup-android-arm-eabi@4.52.5': - optional: true - - '@rollup/rollup-android-arm64@4.52.5': - optional: true - - '@rollup/rollup-darwin-arm64@4.52.5': - optional: true + '@oxc-project/types@0.130.0': {} - '@rollup/rollup-darwin-x64@4.52.5': + '@rolldown/binding-android-arm64@1.0.1': optional: true - '@rollup/rollup-freebsd-arm64@4.52.5': + '@rolldown/binding-darwin-arm64@1.0.1': optional: true - '@rollup/rollup-freebsd-x64@4.52.5': + '@rolldown/binding-darwin-x64@1.0.1': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.52.5': + '@rolldown/binding-freebsd-x64@1.0.1': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.52.5': + '@rolldown/binding-linux-arm-gnueabihf@1.0.1': optional: true - '@rollup/rollup-linux-arm64-gnu@4.52.5': + '@rolldown/binding-linux-arm64-gnu@1.0.1': optional: true - '@rollup/rollup-linux-arm64-musl@4.52.5': + '@rolldown/binding-linux-arm64-musl@1.0.1': optional: true - '@rollup/rollup-linux-loong64-gnu@4.52.5': + '@rolldown/binding-linux-ppc64-gnu@1.0.1': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.52.5': + '@rolldown/binding-linux-s390x-gnu@1.0.1': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.52.5': + '@rolldown/binding-linux-x64-gnu@1.0.1': optional: true - '@rollup/rollup-linux-riscv64-musl@4.52.5': + '@rolldown/binding-linux-x64-musl@1.0.1': optional: true - '@rollup/rollup-linux-s390x-gnu@4.52.5': + '@rolldown/binding-openharmony-arm64@1.0.1': optional: true - '@rollup/rollup-linux-x64-gnu@4.52.5': - optional: true - - '@rollup/rollup-linux-x64-musl@4.52.5': - optional: true - - '@rollup/rollup-openharmony-arm64@4.52.5': - optional: true - - '@rollup/rollup-win32-arm64-msvc@4.52.5': + '@rolldown/binding-wasm32-wasi@1.0.1': + dependencies: + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) optional: true - '@rollup/rollup-win32-ia32-msvc@4.52.5': + '@rolldown/binding-win32-arm64-msvc@1.0.1': optional: true - '@rollup/rollup-win32-x64-gnu@4.52.5': + '@rolldown/binding-win32-x64-msvc@1.0.1': optional: true - '@rollup/rollup-win32-x64-msvc@4.52.5': - optional: true + '@rolldown/pluginutils@1.0.1': {} '@sindresorhus/is@4.6.0': {} @@ -2833,99 +2105,96 @@ snapshots: dependencies: defer-to-connect: 2.0.1 - '@tailwindcss/node@4.1.14': + '@tailwindcss/node@4.3.0': dependencies: '@jridgewell/remapping': 2.3.5 - enhanced-resolve: 5.18.3 + enhanced-resolve: 5.21.4 jiti: 2.6.1 - lightningcss: 1.30.1 - magic-string: 0.30.19 + lightningcss: 1.32.0 + magic-string: 0.30.21 source-map-js: 1.2.1 - tailwindcss: 4.1.14 + tailwindcss: 4.3.0 - '@tailwindcss/oxide-android-arm64@4.1.14': + '@tailwindcss/oxide-android-arm64@4.3.0': optional: true - '@tailwindcss/oxide-darwin-arm64@4.1.14': + '@tailwindcss/oxide-darwin-arm64@4.3.0': optional: true - '@tailwindcss/oxide-darwin-x64@4.1.14': + '@tailwindcss/oxide-darwin-x64@4.3.0': optional: true - '@tailwindcss/oxide-freebsd-x64@4.1.14': + '@tailwindcss/oxide-freebsd-x64@4.3.0': optional: true - '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.14': + '@tailwindcss/oxide-linux-arm-gnueabihf@4.3.0': optional: true - '@tailwindcss/oxide-linux-arm64-gnu@4.1.14': + '@tailwindcss/oxide-linux-arm64-gnu@4.3.0': optional: true - '@tailwindcss/oxide-linux-arm64-musl@4.1.14': + '@tailwindcss/oxide-linux-arm64-musl@4.3.0': optional: true - '@tailwindcss/oxide-linux-x64-gnu@4.1.14': + '@tailwindcss/oxide-linux-x64-gnu@4.3.0': optional: true - '@tailwindcss/oxide-linux-x64-musl@4.1.14': + '@tailwindcss/oxide-linux-x64-musl@4.3.0': optional: true - '@tailwindcss/oxide-wasm32-wasi@4.1.14': + '@tailwindcss/oxide-wasm32-wasi@4.3.0': optional: true - '@tailwindcss/oxide-win32-arm64-msvc@4.1.14': + '@tailwindcss/oxide-win32-arm64-msvc@4.3.0': optional: true - '@tailwindcss/oxide-win32-x64-msvc@4.1.14': + '@tailwindcss/oxide-win32-x64-msvc@4.3.0': optional: true - '@tailwindcss/oxide@4.1.14': - dependencies: - detect-libc: 2.1.2 - tar: 7.5.1 + '@tailwindcss/oxide@4.3.0': optionalDependencies: - '@tailwindcss/oxide-android-arm64': 4.1.14 - '@tailwindcss/oxide-darwin-arm64': 4.1.14 - '@tailwindcss/oxide-darwin-x64': 4.1.14 - '@tailwindcss/oxide-freebsd-x64': 4.1.14 - '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.14 - '@tailwindcss/oxide-linux-arm64-gnu': 4.1.14 - '@tailwindcss/oxide-linux-arm64-musl': 4.1.14 - '@tailwindcss/oxide-linux-x64-gnu': 4.1.14 - '@tailwindcss/oxide-linux-x64-musl': 4.1.14 - '@tailwindcss/oxide-wasm32-wasi': 4.1.14 - '@tailwindcss/oxide-win32-arm64-msvc': 4.1.14 - '@tailwindcss/oxide-win32-x64-msvc': 4.1.14 + '@tailwindcss/oxide-android-arm64': 4.3.0 + '@tailwindcss/oxide-darwin-arm64': 4.3.0 + '@tailwindcss/oxide-darwin-x64': 4.3.0 + '@tailwindcss/oxide-freebsd-x64': 4.3.0 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.3.0 + '@tailwindcss/oxide-linux-arm64-gnu': 4.3.0 + '@tailwindcss/oxide-linux-arm64-musl': 4.3.0 + '@tailwindcss/oxide-linux-x64-gnu': 4.3.0 + '@tailwindcss/oxide-linux-x64-musl': 4.3.0 + '@tailwindcss/oxide-wasm32-wasi': 4.3.0 + '@tailwindcss/oxide-win32-arm64-msvc': 4.3.0 + '@tailwindcss/oxide-win32-x64-msvc': 4.3.0 - '@tailwindcss/vite@4.1.14(vite@7.1.11(@types/node@20.19.21)(jiti@2.6.1)(lightningcss@1.30.2))': + '@tailwindcss/vite@4.3.0(vite@8.0.13(@types/node@20.19.21)(esbuild@0.28.0)(jiti@2.6.1))': dependencies: - '@tailwindcss/node': 4.1.14 - '@tailwindcss/oxide': 4.1.14 - tailwindcss: 4.1.14 - vite: 7.1.11(@types/node@20.19.21)(jiti@2.6.1)(lightningcss@1.30.2) + '@tailwindcss/node': 4.3.0 + '@tailwindcss/oxide': 4.3.0 + tailwindcss: 4.3.0 + vite: 8.0.13(@types/node@20.19.21)(esbuild@0.28.0)(jiti@2.6.1) - '@tootallnate/once@2.0.0': {} + '@turbo/darwin-64@2.9.14': + optional: true - '@types/babel__core@7.20.5': - dependencies: - '@babel/parser': 7.28.4 - '@babel/types': 7.28.4 - '@types/babel__generator': 7.27.0 - '@types/babel__template': 7.4.4 - '@types/babel__traverse': 7.28.0 + '@turbo/darwin-arm64@2.9.14': + optional: true - '@types/babel__generator@7.27.0': - dependencies: - '@babel/types': 7.28.4 + '@turbo/linux-64@2.9.14': + optional: true - '@types/babel__template@7.4.4': - dependencies: - '@babel/parser': 7.28.4 - '@babel/types': 7.28.4 + '@turbo/linux-arm64@2.9.14': + optional: true + + '@turbo/windows-64@2.9.14': + optional: true + + '@turbo/windows-arm64@2.9.14': + optional: true - '@types/babel__traverse@7.28.0': + '@tybys/wasm-util@0.10.2': dependencies: - '@babel/types': 7.28.4 + tslib: 2.8.1 + optional: true '@types/cacheable-request@6.0.3': dependencies: @@ -2938,8 +2207,6 @@ snapshots: dependencies: '@types/ms': 2.1.0 - '@types/estree@1.0.8': {} - '@types/fs-extra@9.0.13': dependencies: '@types/node': 20.19.21 @@ -2966,13 +2233,13 @@ snapshots: xmlbuilder: 15.1.1 optional: true - '@types/react-dom@19.2.2(@types/react@19.2.2)': + '@types/react-dom@19.2.3(@types/react@19.2.14)': dependencies: - '@types/react': 19.2.2 + '@types/react': 19.2.14 - '@types/react@19.2.2': + '@types/react@19.2.14': dependencies: - csstype: 3.1.3 + csstype: 3.2.3 '@types/responselike@1.0.3': dependencies: @@ -2986,44 +2253,22 @@ snapshots: '@types/node': 20.19.21 optional: true - '@vitejs/plugin-react@5.0.4(vite@7.1.11(@types/node@20.19.21)(jiti@2.6.1)(lightningcss@1.30.2))': + '@vitejs/plugin-react@6.0.2(vite@8.0.13(@types/node@20.19.21)(esbuild@0.28.0)(jiti@2.6.1))': dependencies: - '@babel/core': 7.28.4 - '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.28.4) - '@rolldown/pluginutils': 1.0.0-beta.38 - '@types/babel__core': 7.20.5 - react-refresh: 0.17.0 - vite: 7.1.11(@types/node@20.19.21)(jiti@2.6.1)(lightningcss@1.30.2) - transitivePeerDependencies: - - supports-color + '@rolldown/pluginutils': 1.0.1 + vite: 8.0.13(@types/node@20.19.21)(esbuild@0.28.0)(jiti@2.6.1) - '@xmldom/xmldom@0.8.11': {} + '@xmldom/xmldom@0.8.13': {} - abbrev@1.1.1: {} - - agent-base@6.0.2: - dependencies: - debug: 4.4.3 - transitivePeerDependencies: - - supports-color + abbrev@4.0.0: {} agent-base@7.1.4: {} - agentkeepalive@4.6.0: + ajv-keywords@3.5.2(ajv@6.14.0): dependencies: - humanize-ms: 1.2.1 + ajv: 6.14.0 - aggregate-error@3.1.0: - dependencies: - clean-stack: 2.2.0 - indent-string: 4.0.0 - - ajv-keywords@3.5.2(ajv@6.12.6): - dependencies: - ajv: 6.12.6 - - ajv@6.12.6: + ajv@6.14.0: dependencies: fast-deep-equal: 3.1.3 fast-json-stable-stringify: 2.1.0 @@ -3032,129 +2277,55 @@ snapshots: ansi-regex@5.0.1: {} - ansi-regex@6.2.2: {} - ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 - ansi-styles@6.2.3: {} - - app-builder-bin@4.0.0: {} - app-builder-bin@5.0.0-alpha.12: {} - app-builder-lib@24.13.3(dmg-builder@26.0.12(electron-builder-squirrel-windows@24.13.3(dmg-builder@26.0.12)))(electron-builder-squirrel-windows@24.13.3(dmg-builder@26.0.12)): + app-builder-lib@26.8.1(dmg-builder@26.8.1(electron-builder-squirrel-windows@26.8.1(dmg-builder@26.8.1)))(electron-builder-squirrel-windows@26.8.1(dmg-builder@26.8.1)): dependencies: '@develar/schema-utils': 2.6.5 - '@electron/notarize': 2.2.1 - '@electron/osx-sign': 1.0.5 - '@electron/universal': 1.5.1 - '@malept/flatpak-bundler': 0.4.0 - '@types/fs-extra': 9.0.13 - async-exit-hook: 2.0.1 - bluebird-lst: 1.0.9 - builder-util: 24.13.1 - builder-util-runtime: 9.2.4 - chromium-pickle-js: 0.2.0 - debug: 4.4.3 - dmg-builder: 26.0.12(electron-builder-squirrel-windows@24.13.3(dmg-builder@26.0.12)) - ejs: 3.1.10 - electron-builder-squirrel-windows: 24.13.3(dmg-builder@26.0.12) - electron-publish: 24.13.1 - form-data: 4.0.4 - fs-extra: 10.1.0 - hosted-git-info: 4.1.0 - is-ci: 3.0.1 - isbinaryfile: 5.0.6 - js-yaml: 4.1.0 - lazy-val: 1.0.5 - minimatch: 5.1.6 - read-config-file: 6.3.2 - sanitize-filename: 1.6.3 - semver: 7.7.3 - tar: 6.2.1 - temp-file: 3.4.0 - transitivePeerDependencies: - - supports-color - - app-builder-lib@26.0.12(dmg-builder@26.0.12(electron-builder-squirrel-windows@24.13.3(dmg-builder@26.0.12)))(electron-builder-squirrel-windows@24.13.3(dmg-builder@26.0.12)): - dependencies: - '@develar/schema-utils': 2.6.5 - '@electron/asar': 3.2.18 + '@electron/asar': 3.4.1 '@electron/fuses': 1.8.0 + '@electron/get': 3.1.0 '@electron/notarize': 2.5.0 - '@electron/osx-sign': 1.3.1 - '@electron/rebuild': 3.7.0 - '@electron/universal': 2.0.1 + '@electron/osx-sign': 1.3.3 + '@electron/rebuild': 4.0.4 + '@electron/universal': 2.0.3 '@malept/flatpak-bundler': 0.4.0 '@types/fs-extra': 9.0.13 async-exit-hook: 2.0.1 - builder-util: 26.0.11 - builder-util-runtime: 9.3.1 + builder-util: 26.8.1 + builder-util-runtime: 9.5.1 chromium-pickle-js: 0.2.0 - config-file-ts: 0.2.8-rc1 - debug: 4.4.1 - dmg-builder: 26.0.12(electron-builder-squirrel-windows@24.13.3(dmg-builder@26.0.12)) + ci-info: 4.3.1 + debug: 4.4.3 + dmg-builder: 26.8.1(electron-builder-squirrel-windows@26.8.1(dmg-builder@26.8.1)) dotenv: 16.6.1 dotenv-expand: 11.0.7 ejs: 3.1.10 - electron-builder-squirrel-windows: 24.13.3(dmg-builder@26.0.12) - electron-publish: 26.0.11 + electron-builder-squirrel-windows: 26.8.1(dmg-builder@26.8.1) + electron-publish: 26.8.1 fs-extra: 10.1.0 hosted-git-info: 4.1.0 - is-ci: 3.0.1 isbinaryfile: 5.0.6 - js-yaml: 4.1.0 + jiti: 2.6.1 + js-yaml: 4.1.1 json5: 2.2.3 lazy-val: 1.0.5 - minimatch: 10.0.3 + minimatch: 10.2.5 plist: 3.1.0 + proper-lockfile: 4.1.2 resedit: 1.7.2 - semver: 7.7.2 - tar: 6.2.1 + semver: 7.7.3 + tar: 7.5.15 temp-file: 3.4.0 tiny-async-pool: 1.3.0 + which: 5.0.0 transitivePeerDependencies: - - bluebird - supports-color - archiver-utils@2.1.0: - dependencies: - glob: 7.2.3 - graceful-fs: 4.2.11 - lazystream: 1.0.1 - lodash.defaults: 4.2.0 - lodash.difference: 4.5.0 - lodash.flatten: 4.4.0 - lodash.isplainobject: 4.0.6 - lodash.union: 4.6.0 - normalize-path: 3.0.0 - readable-stream: 2.3.8 - - archiver-utils@3.0.4: - dependencies: - glob: 7.2.3 - graceful-fs: 4.2.11 - lazystream: 1.0.1 - lodash.defaults: 4.2.0 - lodash.difference: 4.5.0 - lodash.flatten: 4.4.0 - lodash.isplainobject: 4.0.6 - lodash.union: 4.6.0 - normalize-path: 3.0.0 - readable-stream: 3.6.2 - - archiver@5.3.2: - dependencies: - archiver-utils: 2.1.0 - async: 3.2.6 - buffer-crc32: 0.2.13 - readable-stream: 3.6.2 - readdir-glob: 1.1.3 - tar-stream: 2.2.0 - zip-stream: 4.1.1 - argparse@2.0.1: {} assert-plus@1.0.0: @@ -3173,102 +2344,56 @@ snapshots: balanced-match@1.0.2: {} - base64-js@1.5.1: {} - - baseline-browser-mapping@2.8.16: {} - - bl@4.1.0: - dependencies: - buffer: 5.7.1 - inherits: 2.0.4 - readable-stream: 3.6.2 + balanced-match@4.0.4: {} - bluebird-lst@1.0.9: - dependencies: - bluebird: 3.7.2 - - bluebird@3.7.2: {} + base64-js@1.5.1: {} boolean@3.2.0: optional: true - brace-expansion@1.1.12: + brace-expansion@1.1.13: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - brace-expansion@2.0.2: + brace-expansion@2.0.3: dependencies: balanced-match: 1.0.2 - browserslist@4.26.3: + brace-expansion@5.0.6: dependencies: - baseline-browser-mapping: 2.8.16 - caniuse-lite: 1.0.30001750 - electron-to-chromium: 1.5.237 - node-releases: 2.0.23 - update-browserslist-db: 1.1.3(browserslist@4.26.3) + balanced-match: 4.0.4 buffer-crc32@0.2.13: {} - buffer-equal@1.0.1: {} - buffer-from@1.1.2: {} buffer@5.7.1: dependencies: base64-js: 1.5.1 ieee754: 1.2.1 + optional: true - builder-util-runtime@9.2.4: + builder-util-runtime@9.5.1: dependencies: debug: 4.4.3 sax: 1.4.1 transitivePeerDependencies: - supports-color - builder-util-runtime@9.3.1: - dependencies: - debug: 4.4.1 - sax: 1.4.1 - transitivePeerDependencies: - - supports-color - - builder-util@24.13.1: - dependencies: - 7zip-bin: 5.2.0 - '@types/debug': 4.1.12 - app-builder-bin: 4.0.0 - bluebird-lst: 1.0.9 - builder-util-runtime: 9.2.4 - chalk: 4.1.2 - cross-spawn: 7.0.6 - debug: 4.4.3 - fs-extra: 10.1.0 - http-proxy-agent: 5.0.0 - https-proxy-agent: 5.0.1 - is-ci: 3.0.1 - js-yaml: 4.1.0 - source-map-support: 0.5.21 - stat-mode: 1.0.0 - temp-file: 3.4.0 - transitivePeerDependencies: - - supports-color - - builder-util@26.0.11: + builder-util@26.8.1: dependencies: 7zip-bin: 5.2.0 '@types/debug': 4.1.12 app-builder-bin: 5.0.0-alpha.12 - builder-util-runtime: 9.3.1 + builder-util-runtime: 9.5.1 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.1 + debug: 4.4.3 fs-extra: 10.1.0 http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 - is-ci: 3.0.1 - js-yaml: 4.1.0 + js-yaml: 4.1.1 sanitize-filename: 1.6.3 source-map-support: 0.5.21 stat-mode: 1.0.0 @@ -3277,29 +2402,6 @@ snapshots: transitivePeerDependencies: - supports-color - cacache@16.1.3: - dependencies: - '@npmcli/fs': 2.1.2 - '@npmcli/move-file': 2.0.1 - chownr: 2.0.0 - fs-minipass: 2.1.0 - glob: 8.1.0 - infer-owner: 1.0.4 - lru-cache: 7.18.3 - minipass: 3.3.6 - minipass-collect: 1.0.2 - minipass-flush: 1.0.5 - minipass-pipeline: 1.2.4 - mkdirp: 1.0.4 - p-map: 4.0.0 - promise-inflight: 1.0.1 - rimraf: 3.0.2 - ssri: 9.0.1 - tar: 6.2.1 - unique-filename: 2.0.1 - transitivePeerDependencies: - - bluebird - cacheable-lookup@5.0.4: {} cacheable-request@7.0.4: @@ -3317,28 +2419,18 @@ snapshots: es-errors: 1.3.0 function-bind: 1.1.2 - caniuse-lite@1.0.30001750: {} - chalk@4.1.2: dependencies: ansi-styles: 4.3.0 supports-color: 7.2.0 - chownr@2.0.0: {} - chownr@3.0.0: {} chromium-pickle-js@0.2.0: {} - ci-info@3.9.0: {} + ci-info@4.3.1: {} - clean-stack@2.2.0: {} - - cli-cursor@3.1.0: - dependencies: - restore-cursor: 3.1.0 - - cli-spinners@2.9.2: {} + ci-info@4.4.0: {} cli-truncate@2.1.0: dependencies: @@ -3356,8 +2448,6 @@ snapshots: dependencies: mimic-response: 1.0.1 - clone@1.0.4: {} - color-convert@2.0.1: dependencies: color-name: 1.1.4 @@ -3370,14 +2460,10 @@ snapshots: commander@5.1.0: {} - compare-version@0.1.2: {} + commander@9.5.0: + optional: true - compress-commons@4.1.2: - dependencies: - buffer-crc32: 0.2.13 - crc32-stream: 4.0.3 - normalize-path: 3.0.0 - readable-stream: 3.6.2 + compare-version@0.1.2: {} concat-map@0.0.1: {} @@ -3385,7 +2471,7 @@ snapshots: dependencies: chalk: 4.1.2 date-fns: 2.30.0 - lodash: 4.17.21 + lodash: 4.18.1 rxjs: 7.8.2 shell-quote: 1.8.3 spawn-command: 0.0.2 @@ -3393,35 +2479,17 @@ snapshots: tree-kill: 1.2.2 yargs: 17.7.2 - config-file-ts@0.2.6: - dependencies: - glob: 10.4.5 - typescript: 5.9.2 - - config-file-ts@0.2.8-rc1: - dependencies: - glob: 10.4.5 - typescript: 5.9.2 - - convert-source-map@2.0.0: {} - core-util-is@1.0.2: optional: true - core-util-is@1.0.3: {} - - crc-32@1.2.2: {} - - crc32-stream@4.0.3: - dependencies: - crc-32: 1.2.2 - readable-stream: 3.6.2 - crc@3.8.0: dependencies: buffer: 5.7.1 optional: true + cross-dirname@0.1.0: + optional: true + cross-env@10.1.0: dependencies: '@epic-web/invariant': 1.0.0 @@ -3433,16 +2501,12 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 - csstype@3.1.3: {} + csstype@3.2.3: {} date-fns@2.30.0: dependencies: '@babel/runtime': 7.28.4 - debug@4.4.1: - dependencies: - ms: 2.1.3 - debug@4.4.3: dependencies: ms: 2.1.3 @@ -3451,10 +2515,6 @@ snapshots: dependencies: mimic-response: 3.1.0 - defaults@1.0.4: - dependencies: - clone: 1.0.4 - defer-to-connect@2.0.1: {} define-data-property@1.1.4: @@ -3478,28 +2538,21 @@ snapshots: detect-node@2.1.0: optional: true - dir-compare@3.3.0: - dependencies: - buffer-equal: 1.0.1 - minimatch: 3.1.2 - dir-compare@4.2.0: dependencies: - minimatch: 3.1.2 + minimatch: 3.1.4 p-limit: 3.1.0 - dmg-builder@26.0.12(electron-builder-squirrel-windows@24.13.3(dmg-builder@26.0.12)): + dmg-builder@26.8.1(electron-builder-squirrel-windows@26.8.1(dmg-builder@26.8.1)): dependencies: - app-builder-lib: 26.0.12(dmg-builder@26.0.12(electron-builder-squirrel-windows@24.13.3(dmg-builder@26.0.12)))(electron-builder-squirrel-windows@24.13.3(dmg-builder@26.0.12)) - builder-util: 26.0.11 - builder-util-runtime: 9.3.1 + app-builder-lib: 26.8.1(dmg-builder@26.8.1(electron-builder-squirrel-windows@26.8.1(dmg-builder@26.8.1)))(electron-builder-squirrel-windows@26.8.1(dmg-builder@26.8.1)) + builder-util: 26.8.1 fs-extra: 10.1.0 iconv-lite: 0.6.3 - js-yaml: 4.1.0 + js-yaml: 4.1.1 optionalDependencies: dmg-license: 1.0.11 transitivePeerDependencies: - - bluebird - electron-builder-squirrel-windows - supports-color @@ -3507,7 +2560,7 @@ snapshots: dependencies: '@types/plist': 3.0.5 '@types/verror': 1.10.11 - ajv: 6.12.6 + ajv: 6.14.0 crc: 3.8.0 iconv-corefoundation: 1.1.7 plist: 3.1.0 @@ -3519,13 +2572,9 @@ snapshots: dependencies: dotenv: 16.6.1 - dotenv-expand@5.1.0: {} - dotenv@16.6.1: {} - dotenv@17.2.3: {} - - dotenv@9.0.2: {} + dotenv@17.4.2: {} dunder-proto@1.0.1: dependencies: @@ -3533,67 +2582,61 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 - eastasianwidth@0.2.0: {} - ejs@3.1.10: dependencies: jake: 10.9.4 - electron-builder-squirrel-windows@24.13.3(dmg-builder@26.0.12): + electron-builder-squirrel-windows@26.8.1(dmg-builder@26.8.1): dependencies: - app-builder-lib: 24.13.3(dmg-builder@26.0.12(electron-builder-squirrel-windows@24.13.3(dmg-builder@26.0.12)))(electron-builder-squirrel-windows@24.13.3(dmg-builder@26.0.12)) - archiver: 5.3.2 - builder-util: 24.13.1 - fs-extra: 10.1.0 + app-builder-lib: 26.8.1(dmg-builder@26.8.1(electron-builder-squirrel-windows@26.8.1(dmg-builder@26.8.1)))(electron-builder-squirrel-windows@26.8.1(dmg-builder@26.8.1)) + builder-util: 26.8.1 + electron-winstaller: 5.4.0 transitivePeerDependencies: - dmg-builder - supports-color - electron-builder@26.0.12(electron-builder-squirrel-windows@24.13.3(dmg-builder@26.0.12)): + electron-builder@26.8.1(electron-builder-squirrel-windows@26.8.1(dmg-builder@26.8.1)): dependencies: - app-builder-lib: 26.0.12(dmg-builder@26.0.12(electron-builder-squirrel-windows@24.13.3(dmg-builder@26.0.12)))(electron-builder-squirrel-windows@24.13.3(dmg-builder@26.0.12)) - builder-util: 26.0.11 - builder-util-runtime: 9.3.1 + app-builder-lib: 26.8.1(dmg-builder@26.8.1(electron-builder-squirrel-windows@26.8.1(dmg-builder@26.8.1)))(electron-builder-squirrel-windows@26.8.1(dmg-builder@26.8.1)) + builder-util: 26.8.1 + builder-util-runtime: 9.5.1 chalk: 4.1.2 - dmg-builder: 26.0.12(electron-builder-squirrel-windows@24.13.3(dmg-builder@26.0.12)) + ci-info: 4.4.0 + dmg-builder: 26.8.1(electron-builder-squirrel-windows@26.8.1(dmg-builder@26.8.1)) fs-extra: 10.1.0 - is-ci: 3.0.1 lazy-val: 1.0.5 simple-update-notifier: 2.0.0 yargs: 17.7.2 transitivePeerDependencies: - - bluebird - electron-builder-squirrel-windows - supports-color - electron-publish@24.13.1: + electron-publish@26.8.1: dependencies: '@types/fs-extra': 9.0.13 - builder-util: 24.13.1 - builder-util-runtime: 9.2.4 + builder-util: 26.8.1 + builder-util-runtime: 9.5.1 chalk: 4.1.2 + form-data: 4.0.5 fs-extra: 10.1.0 lazy-val: 1.0.5 mime: 2.6.0 transitivePeerDependencies: - supports-color - electron-publish@26.0.11: + electron-winstaller@5.4.0: dependencies: - '@types/fs-extra': 9.0.13 - builder-util: 26.0.11 - builder-util-runtime: 9.3.1 - chalk: 4.1.2 - form-data: 4.0.4 - fs-extra: 10.1.0 - lazy-val: 1.0.5 - mime: 2.6.0 + '@electron/asar': 3.4.1 + debug: 4.4.3 + fs-extra: 7.0.1 + lodash: 4.18.1 + temp: 0.9.4 + optionalDependencies: + '@electron/windows-sign': 1.2.2 transitivePeerDependencies: - supports-color - electron-to-chromium@1.5.237: {} - - electron@https://codeload.github.com/castlabs/electron-releases/tar.gz/678b5c7761825c5af936f5c67a9101f3fc6ab750: + electron@https://codeload.github.com/castlabs/electron-releases/tar.gz/b5480283432a0523f4f3a9c62b130fe8dcde5299: dependencies: '@electron/get': 2.0.3 '@types/node': 22.18.12 @@ -3603,21 +2646,14 @@ snapshots: emoji-regex@8.0.0: {} - emoji-regex@9.2.2: {} - - encoding@0.1.13: - dependencies: - iconv-lite: 0.6.3 - optional: true - end-of-stream@1.4.5: dependencies: once: 1.4.0 - enhanced-resolve@5.18.3: + enhanced-resolve@5.21.4: dependencies: graceful-fs: 4.2.11 - tapable: 2.3.0 + tapable: 2.3.3 env-paths@2.2.1: {} @@ -3641,34 +2677,34 @@ snapshots: es6-error@4.1.1: optional: true - esbuild@0.25.11: + esbuild@0.28.0: optionalDependencies: - '@esbuild/aix-ppc64': 0.25.11 - '@esbuild/android-arm': 0.25.11 - '@esbuild/android-arm64': 0.25.11 - '@esbuild/android-x64': 0.25.11 - '@esbuild/darwin-arm64': 0.25.11 - '@esbuild/darwin-x64': 0.25.11 - '@esbuild/freebsd-arm64': 0.25.11 - '@esbuild/freebsd-x64': 0.25.11 - '@esbuild/linux-arm': 0.25.11 - '@esbuild/linux-arm64': 0.25.11 - '@esbuild/linux-ia32': 0.25.11 - '@esbuild/linux-loong64': 0.25.11 - '@esbuild/linux-mips64el': 0.25.11 - '@esbuild/linux-ppc64': 0.25.11 - '@esbuild/linux-riscv64': 0.25.11 - '@esbuild/linux-s390x': 0.25.11 - '@esbuild/linux-x64': 0.25.11 - '@esbuild/netbsd-arm64': 0.25.11 - '@esbuild/netbsd-x64': 0.25.11 - '@esbuild/openbsd-arm64': 0.25.11 - '@esbuild/openbsd-x64': 0.25.11 - '@esbuild/openharmony-arm64': 0.25.11 - '@esbuild/sunos-x64': 0.25.11 - '@esbuild/win32-arm64': 0.25.11 - '@esbuild/win32-ia32': 0.25.11 - '@esbuild/win32-x64': 0.25.11 + '@esbuild/aix-ppc64': 0.28.0 + '@esbuild/android-arm': 0.28.0 + '@esbuild/android-arm64': 0.28.0 + '@esbuild/android-x64': 0.28.0 + '@esbuild/darwin-arm64': 0.28.0 + '@esbuild/darwin-x64': 0.28.0 + '@esbuild/freebsd-arm64': 0.28.0 + '@esbuild/freebsd-x64': 0.28.0 + '@esbuild/linux-arm': 0.28.0 + '@esbuild/linux-arm64': 0.28.0 + '@esbuild/linux-ia32': 0.28.0 + '@esbuild/linux-loong64': 0.28.0 + '@esbuild/linux-mips64el': 0.28.0 + '@esbuild/linux-ppc64': 0.28.0 + '@esbuild/linux-riscv64': 0.28.0 + '@esbuild/linux-s390x': 0.28.0 + '@esbuild/linux-x64': 0.28.0 + '@esbuild/netbsd-arm64': 0.28.0 + '@esbuild/netbsd-x64': 0.28.0 + '@esbuild/openbsd-arm64': 0.28.0 + '@esbuild/openbsd-x64': 0.28.0 + '@esbuild/openharmony-arm64': 0.28.0 + '@esbuild/sunos-x64': 0.28.0 + '@esbuild/win32-arm64': 0.28.0 + '@esbuild/win32-ia32': 0.28.0 + '@esbuild/win32-x64': 0.28.0 escalade@3.2.0: {} @@ -3698,20 +2734,15 @@ snapshots: dependencies: pend: 1.2.0 - fdir@6.5.0(picomatch@4.0.3): + fdir@6.5.0(picomatch@4.0.4): optionalDependencies: - picomatch: 4.0.3 + picomatch: 4.0.4 filelist@1.0.4: dependencies: - minimatch: 5.1.6 - - foreground-child@3.3.1: - dependencies: - cross-spawn: 7.0.6 - signal-exit: 4.1.0 + minimatch: 5.1.8 - form-data@4.0.4: + form-data@4.0.5: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 @@ -3719,8 +2750,6 @@ snapshots: hasown: 2.0.2 mime-types: 2.1.35 - fs-constants@1.0.0: {} - fs-extra@10.1.0: dependencies: graceful-fs: 4.2.11 @@ -3733,6 +2762,12 @@ snapshots: jsonfile: 6.2.0 universalify: 2.0.1 + fs-extra@7.0.1: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + fs-extra@8.1.0: dependencies: graceful-fs: 4.2.11 @@ -3746,10 +2781,6 @@ snapshots: jsonfile: 6.2.0 universalify: 2.0.1 - fs-minipass@2.1.0: - dependencies: - minipass: 3.3.6 - fs.realpath@1.0.0: {} fsevents@2.3.3: @@ -3757,8 +2788,6 @@ snapshots: function-bind@1.1.2: {} - gensync@1.0.0-beta.2: {} - get-caller-file@2.0.5: {} get-intrinsic@1.3.0: @@ -3783,32 +2812,15 @@ snapshots: dependencies: pump: 3.0.3 - glob@10.4.5: - dependencies: - foreground-child: 3.3.1 - jackspeak: 3.4.3 - minimatch: 9.0.5 - minipass: 7.1.2 - package-json-from-dist: 1.0.1 - path-scurry: 1.11.1 - glob@7.2.3: dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 inherits: 2.0.4 - minimatch: 3.1.2 + minimatch: 3.1.4 once: 1.4.0 path-is-absolute: 1.0.1 - glob@8.1.0: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 5.1.6 - once: 1.4.0 - global-agent@3.0.0: dependencies: boolean: 3.2.0 @@ -3866,14 +2878,6 @@ snapshots: http-cache-semantics@4.2.0: {} - http-proxy-agent@5.0.0: - dependencies: - '@tootallnate/once': 2.0.0 - agent-base: 6.0.2 - debug: 4.4.3 - transitivePeerDependencies: - - supports-color - http-proxy-agent@7.0.2: dependencies: agent-base: 7.1.4 @@ -3886,13 +2890,6 @@ snapshots: quick-lru: 5.1.1 resolve-alpn: 1.2.1 - https-proxy-agent@5.0.1: - dependencies: - agent-base: 6.0.2 - debug: 4.4.3 - transitivePeerDependencies: - - supports-color - https-proxy-agent@7.0.6: dependencies: agent-base: 7.1.4 @@ -3900,10 +2897,6 @@ snapshots: transitivePeerDependencies: - supports-color - humanize-ms@1.2.1: - dependencies: - ms: 2.1.3 - iconv-corefoundation@1.1.7: dependencies: cli-truncate: 2.1.0 @@ -3914,13 +2907,8 @@ snapshots: dependencies: safer-buffer: 2.1.2 - ieee754@1.2.1: {} - - imurmurhash@0.1.4: {} - - indent-string@4.0.0: {} - - infer-owner@1.0.4: {} + ieee754@1.2.1: + optional: true inflight@1.0.6: dependencies: @@ -3929,33 +2917,17 @@ snapshots: inherits@2.0.4: {} - ip-address@10.0.1: {} - - is-ci@3.0.1: - dependencies: - ci-info: 3.9.0 - is-fullwidth-code-point@3.0.0: {} - is-interactive@1.0.0: {} - - is-lambda@1.0.1: {} - - is-unicode-supported@0.1.0: {} - - isarray@1.0.0: {} - isbinaryfile@4.0.10: {} isbinaryfile@5.0.6: {} isexe@2.0.0: {} - jackspeak@3.4.3: - dependencies: - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 + isexe@3.1.5: {} + + isexe@4.0.0: {} jake@10.9.4: dependencies: @@ -3967,12 +2939,10 @@ snapshots: js-tokens@4.0.0: {} - js-yaml@4.1.0: + js-yaml@4.1.1: dependencies: argparse: 2.0.1 - jsesc@3.1.0: {} - json-buffer@3.0.1: {} json-schema-traverse@0.4.1: {} @@ -3998,121 +2968,56 @@ snapshots: lazy-val@1.0.5: {} - lazystream@1.0.1: - dependencies: - readable-stream: 2.3.8 - - lightningcss-android-arm64@1.30.2: - optional: true - - lightningcss-darwin-arm64@1.30.1: - optional: true - - lightningcss-darwin-arm64@1.30.2: - optional: true - - lightningcss-darwin-x64@1.30.1: - optional: true - - lightningcss-darwin-x64@1.30.2: - optional: true - - lightningcss-freebsd-x64@1.30.1: - optional: true - - lightningcss-freebsd-x64@1.30.2: - optional: true - - lightningcss-linux-arm-gnueabihf@1.30.1: - optional: true - - lightningcss-linux-arm-gnueabihf@1.30.2: - optional: true - - lightningcss-linux-arm64-gnu@1.30.1: - optional: true - - lightningcss-linux-arm64-gnu@1.30.2: + lightningcss-android-arm64@1.32.0: optional: true - lightningcss-linux-arm64-musl@1.30.1: + lightningcss-darwin-arm64@1.32.0: optional: true - lightningcss-linux-arm64-musl@1.30.2: + lightningcss-darwin-x64@1.32.0: optional: true - lightningcss-linux-x64-gnu@1.30.1: + lightningcss-freebsd-x64@1.32.0: optional: true - lightningcss-linux-x64-gnu@1.30.2: + lightningcss-linux-arm-gnueabihf@1.32.0: optional: true - lightningcss-linux-x64-musl@1.30.1: + lightningcss-linux-arm64-gnu@1.32.0: optional: true - lightningcss-linux-x64-musl@1.30.2: + lightningcss-linux-arm64-musl@1.32.0: optional: true - lightningcss-win32-arm64-msvc@1.30.1: + lightningcss-linux-x64-gnu@1.32.0: optional: true - lightningcss-win32-arm64-msvc@1.30.2: + lightningcss-linux-x64-musl@1.32.0: optional: true - lightningcss-win32-x64-msvc@1.30.1: + lightningcss-win32-arm64-msvc@1.32.0: optional: true - lightningcss-win32-x64-msvc@1.30.2: + lightningcss-win32-x64-msvc@1.32.0: optional: true - lightningcss@1.30.1: - dependencies: - detect-libc: 2.1.2 - optionalDependencies: - lightningcss-darwin-arm64: 1.30.1 - lightningcss-darwin-x64: 1.30.1 - lightningcss-freebsd-x64: 1.30.1 - lightningcss-linux-arm-gnueabihf: 1.30.1 - lightningcss-linux-arm64-gnu: 1.30.1 - lightningcss-linux-arm64-musl: 1.30.1 - lightningcss-linux-x64-gnu: 1.30.1 - lightningcss-linux-x64-musl: 1.30.1 - lightningcss-win32-arm64-msvc: 1.30.1 - lightningcss-win32-x64-msvc: 1.30.1 - - lightningcss@1.30.2: + lightningcss@1.32.0: dependencies: detect-libc: 2.1.2 optionalDependencies: - lightningcss-android-arm64: 1.30.2 - lightningcss-darwin-arm64: 1.30.2 - lightningcss-darwin-x64: 1.30.2 - lightningcss-freebsd-x64: 1.30.2 - lightningcss-linux-arm-gnueabihf: 1.30.2 - lightningcss-linux-arm64-gnu: 1.30.2 - lightningcss-linux-arm64-musl: 1.30.2 - lightningcss-linux-x64-gnu: 1.30.2 - lightningcss-linux-x64-musl: 1.30.2 - lightningcss-win32-arm64-msvc: 1.30.2 - lightningcss-win32-x64-msvc: 1.30.2 - optional: true - - lodash.defaults@4.2.0: {} - - lodash.difference@4.5.0: {} - - lodash.flatten@4.4.0: {} - - lodash.isplainobject@4.0.6: {} - - lodash.union@4.6.0: {} - - lodash@4.17.21: {} - - log-symbols@4.1.0: - dependencies: - chalk: 4.1.2 - is-unicode-supported: 0.1.0 + lightningcss-android-arm64: 1.32.0 + lightningcss-darwin-arm64: 1.32.0 + lightningcss-darwin-x64: 1.32.0 + lightningcss-freebsd-x64: 1.32.0 + lightningcss-linux-arm-gnueabihf: 1.32.0 + lightningcss-linux-arm64-gnu: 1.32.0 + lightningcss-linux-arm64-musl: 1.32.0 + lightningcss-linux-x64-gnu: 1.32.0 + lightningcss-linux-x64-musl: 1.32.0 + lightningcss-win32-arm64-msvc: 1.32.0 + lightningcss-win32-x64-msvc: 1.32.0 + + lodash@4.18.1: {} loose-envify@1.4.0: dependencies: @@ -4120,48 +3025,18 @@ snapshots: lowercase-keys@2.0.0: {} - lru-cache@10.4.3: {} - - lru-cache@5.1.1: - dependencies: - yallist: 3.1.1 - lru-cache@6.0.0: dependencies: yallist: 4.0.0 - lru-cache@7.18.3: {} - lucide-react@0.546.0(react@18.3.1): dependencies: react: 18.3.1 - magic-string@0.30.19: + magic-string@0.30.21: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 - make-fetch-happen@10.2.1: - dependencies: - agentkeepalive: 4.6.0 - cacache: 16.1.3 - http-cache-semantics: 4.2.0 - http-proxy-agent: 5.0.0 - https-proxy-agent: 5.0.1 - is-lambda: 1.0.1 - lru-cache: 7.18.3 - minipass: 3.3.6 - minipass-collect: 1.0.2 - minipass-fetch: 2.1.2 - minipass-flush: 1.0.5 - minipass-pipeline: 1.2.4 - negotiator: 0.6.4 - promise-retry: 2.0.1 - socks-proxy-agent: 7.0.0 - ssri: 9.0.1 - transitivePeerDependencies: - - bluebird - - supports-color - matcher@3.0.0: dependencies: escape-string-regexp: 4.0.0 @@ -4177,80 +3052,43 @@ snapshots: mime@2.6.0: {} - mimic-fn@2.1.0: {} - mimic-response@1.0.1: {} mimic-response@3.1.0: {} - minimatch@10.0.3: + minimatch@10.2.5: dependencies: - '@isaacs/brace-expansion': 5.0.0 + brace-expansion: 5.0.6 - minimatch@3.1.2: + minimatch@3.1.4: dependencies: - brace-expansion: 1.1.12 + brace-expansion: 1.1.13 - minimatch@5.1.6: + minimatch@5.1.8: dependencies: - brace-expansion: 2.0.2 + brace-expansion: 2.0.3 - minimatch@9.0.5: + minimatch@9.0.9: dependencies: - brace-expansion: 2.0.2 + brace-expansion: 2.0.3 minimist@1.2.8: {} - minipass-collect@1.0.2: - dependencies: - minipass: 3.3.6 - - minipass-fetch@2.1.2: - dependencies: - minipass: 3.3.6 - minipass-sized: 1.0.3 - minizlib: 2.1.2 - optionalDependencies: - encoding: 0.1.13 - - minipass-flush@1.0.5: - dependencies: - minipass: 3.3.6 - - minipass-pipeline@1.2.4: - dependencies: - minipass: 3.3.6 - - minipass-sized@1.0.3: - dependencies: - minipass: 3.3.6 - - minipass@3.3.6: - dependencies: - yallist: 4.0.0 - - minipass@5.0.0: {} - minipass@7.1.2: {} - minizlib@2.1.2: - dependencies: - minipass: 3.3.6 - yallist: 4.0.0 - minizlib@3.1.0: dependencies: minipass: 7.1.2 - mkdirp@1.0.4: {} + mkdirp@0.5.6: + dependencies: + minimist: 1.2.8 ms@2.1.3: {} nanoid@3.3.11: {} - negotiator@0.6.4: {} - - node-abi@3.78.0: + node-abi@4.31.0: dependencies: semver: 7.7.3 @@ -4261,13 +3099,22 @@ snapshots: dependencies: semver: 7.7.3 - node-releases@2.0.23: {} - - nopt@6.0.0: + node-gyp@12.3.0: dependencies: - abbrev: 1.1.1 + env-paths: 2.2.1 + exponential-backoff: 3.1.3 + graceful-fs: 4.2.11 + nopt: 9.0.0 + proc-log: 6.1.0 + semver: 7.7.3 + tar: 7.5.15 + tinyglobby: 0.2.15 + undici: 6.25.0 + which: 6.0.1 - normalize-path@3.0.0: {} + nopt@9.0.0: + dependencies: + abbrev: 4.0.0 normalize-url@6.1.0: {} @@ -4278,78 +3125,58 @@ snapshots: dependencies: wrappy: 1.0.2 - onetime@5.1.2: - dependencies: - mimic-fn: 2.1.0 - - ora@5.4.1: - dependencies: - bl: 4.1.0 - chalk: 4.1.2 - cli-cursor: 3.1.0 - cli-spinners: 2.9.2 - is-interactive: 1.0.0 - is-unicode-supported: 0.1.0 - log-symbols: 4.1.0 - strip-ansi: 6.0.1 - wcwidth: 1.0.1 - p-cancelable@2.1.1: {} p-limit@3.1.0: dependencies: yocto-queue: 0.1.0 - p-map@4.0.0: - dependencies: - aggregate-error: 3.1.0 - - package-json-from-dist@1.0.1: {} - path-is-absolute@1.0.1: {} path-key@3.1.1: {} - path-scurry@1.11.1: - dependencies: - lru-cache: 10.4.3 - minipass: 7.1.2 - pe-library@0.4.1: {} pend@1.2.0: {} picocolors@1.1.1: {} - picomatch@4.0.3: {} + picomatch@4.0.4: {} plist@3.1.0: dependencies: - '@xmldom/xmldom': 0.8.11 + '@xmldom/xmldom': 0.8.13 base64-js: 1.5.1 xmlbuilder: 15.1.1 - postcss@8.5.6: + postcss@8.5.14: dependencies: nanoid: 3.3.11 picocolors: 1.1.1 source-map-js: 1.2.1 - prettier@3.6.2: {} + postject@1.0.0-alpha.6: + dependencies: + commander: 9.5.0 + optional: true - proc-log@2.0.1: {} + prettier@3.8.3: {} - process-nextick-args@2.0.1: {} + proc-log@6.1.0: {} progress@2.0.3: {} - promise-inflight@1.0.1: {} - promise-retry@2.0.1: dependencies: err-code: 2.0.3 retry: 0.12.0 + proper-lockfile@4.1.2: + dependencies: + graceful-fs: 4.2.11 + retry: 0.12.0 + signal-exit: 3.0.7 + pump@3.0.3: dependencies: end-of-stream: 1.4.5 @@ -4365,8 +3192,6 @@ snapshots: react: 18.3.1 scheduler: 0.23.2 - react-refresh@0.17.0: {} - react@18.3.1: dependencies: loose-envify: 1.4.0 @@ -4377,35 +3202,6 @@ snapshots: transitivePeerDependencies: - supports-color - read-config-file@6.3.2: - dependencies: - config-file-ts: 0.2.6 - dotenv: 9.0.2 - dotenv-expand: 5.1.0 - js-yaml: 4.1.0 - json5: 2.2.3 - lazy-val: 1.0.5 - - readable-stream@2.3.8: - dependencies: - core-util-is: 1.0.3 - inherits: 2.0.4 - isarray: 1.0.0 - process-nextick-args: 2.0.1 - safe-buffer: 5.1.2 - string_decoder: 1.1.1 - util-deprecate: 1.0.2 - - readable-stream@3.6.2: - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 - - readdir-glob@1.1.3: - dependencies: - minimatch: 5.1.6 - require-directory@2.1.1: {} resedit@1.7.2: @@ -4418,14 +3214,9 @@ snapshots: dependencies: lowercase-keys: 2.0.0 - restore-cursor@3.1.0: - dependencies: - onetime: 5.1.2 - signal-exit: 3.0.7 - retry@0.12.0: {} - rimraf@3.0.2: + rimraf@2.6.3: dependencies: glob: 7.2.3 @@ -4439,42 +3230,31 @@ snapshots: sprintf-js: 1.1.3 optional: true - rollup@4.52.5: + rolldown@1.0.1: dependencies: - '@types/estree': 1.0.8 + '@oxc-project/types': 0.130.0 + '@rolldown/pluginutils': 1.0.1 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.52.5 - '@rollup/rollup-android-arm64': 4.52.5 - '@rollup/rollup-darwin-arm64': 4.52.5 - '@rollup/rollup-darwin-x64': 4.52.5 - '@rollup/rollup-freebsd-arm64': 4.52.5 - '@rollup/rollup-freebsd-x64': 4.52.5 - '@rollup/rollup-linux-arm-gnueabihf': 4.52.5 - '@rollup/rollup-linux-arm-musleabihf': 4.52.5 - '@rollup/rollup-linux-arm64-gnu': 4.52.5 - '@rollup/rollup-linux-arm64-musl': 4.52.5 - '@rollup/rollup-linux-loong64-gnu': 4.52.5 - '@rollup/rollup-linux-ppc64-gnu': 4.52.5 - '@rollup/rollup-linux-riscv64-gnu': 4.52.5 - '@rollup/rollup-linux-riscv64-musl': 4.52.5 - '@rollup/rollup-linux-s390x-gnu': 4.52.5 - '@rollup/rollup-linux-x64-gnu': 4.52.5 - '@rollup/rollup-linux-x64-musl': 4.52.5 - '@rollup/rollup-openharmony-arm64': 4.52.5 - '@rollup/rollup-win32-arm64-msvc': 4.52.5 - '@rollup/rollup-win32-ia32-msvc': 4.52.5 - '@rollup/rollup-win32-x64-gnu': 4.52.5 - '@rollup/rollup-win32-x64-msvc': 4.52.5 - fsevents: 2.3.3 + '@rolldown/binding-android-arm64': 1.0.1 + '@rolldown/binding-darwin-arm64': 1.0.1 + '@rolldown/binding-darwin-x64': 1.0.1 + '@rolldown/binding-freebsd-x64': 1.0.1 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.1 + '@rolldown/binding-linux-arm64-gnu': 1.0.1 + '@rolldown/binding-linux-arm64-musl': 1.0.1 + '@rolldown/binding-linux-ppc64-gnu': 1.0.1 + '@rolldown/binding-linux-s390x-gnu': 1.0.1 + '@rolldown/binding-linux-x64-gnu': 1.0.1 + '@rolldown/binding-linux-x64-musl': 1.0.1 + '@rolldown/binding-openharmony-arm64': 1.0.1 + '@rolldown/binding-wasm32-wasi': 1.0.1 + '@rolldown/binding-win32-arm64-msvc': 1.0.1 + '@rolldown/binding-win32-x64-msvc': 1.0.1 rxjs@7.8.2: dependencies: tslib: 2.8.1 - safe-buffer@5.1.2: {} - - safe-buffer@5.2.1: {} - safer-buffer@2.1.2: {} sanitize-filename@1.6.3: @@ -4494,8 +3274,6 @@ snapshots: semver@6.3.1: {} - semver@7.7.2: {} - semver@7.7.3: {} serialize-error@7.0.1: @@ -4513,11 +3291,9 @@ snapshots: signal-exit@3.0.7: {} - signal-exit@4.1.0: {} - simple-update-notifier@2.0.0: dependencies: - semver: 7.7.2 + semver: 7.7.3 slice-ansi@3.0.0: dependencies: @@ -4526,20 +3302,8 @@ snapshots: is-fullwidth-code-point: 3.0.0 optional: true - smart-buffer@4.2.0: {} - - socks-proxy-agent@7.0.0: - dependencies: - agent-base: 6.0.2 - debug: 4.4.3 - socks: 2.8.7 - transitivePeerDependencies: - - supports-color - - socks@2.8.7: - dependencies: - ip-address: 10.0.1 - smart-buffer: 4.2.0 + smart-buffer@4.2.0: + optional: true source-map-js@1.2.1: {} @@ -4555,10 +3319,6 @@ snapshots: sprintf-js@1.1.3: optional: true - ssri@9.0.1: - dependencies: - minipass: 3.3.6 - stat-mode@1.0.0: {} string-width@4.2.3: @@ -4567,28 +3327,10 @@ snapshots: is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - string-width@5.1.2: - dependencies: - eastasianwidth: 0.2.0 - emoji-regex: 9.2.2 - strip-ansi: 7.1.2 - - string_decoder@1.1.1: - dependencies: - safe-buffer: 5.1.2 - - string_decoder@1.3.0: - dependencies: - safe-buffer: 5.2.1 - strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 - strip-ansi@7.1.2: - dependencies: - ansi-regex: 6.2.2 - sumchecker@3.0.1: dependencies: debug: 4.4.3 @@ -4603,28 +3345,11 @@ snapshots: dependencies: has-flag: 4.0.0 - tailwindcss@4.1.14: {} - - tapable@2.3.0: {} - - tar-stream@2.2.0: - dependencies: - bl: 4.1.0 - end-of-stream: 1.4.5 - fs-constants: 1.0.0 - inherits: 2.0.4 - readable-stream: 3.6.2 + tailwindcss@4.3.0: {} - tar@6.2.1: - dependencies: - chownr: 2.0.0 - fs-minipass: 2.1.0 - minipass: 5.0.0 - minizlib: 2.1.2 - mkdirp: 1.0.4 - yallist: 4.0.0 + tapable@2.3.3: {} - tar@7.5.1: + tar@7.5.15: dependencies: '@isaacs/fs-minipass': 4.0.1 chownr: 3.0.0 @@ -4637,14 +3362,24 @@ snapshots: async-exit-hook: 2.0.1 fs-extra: 10.1.0 + temp@0.9.4: + dependencies: + mkdirp: 0.5.6 + rimraf: 2.6.3 + tiny-async-pool@1.3.0: dependencies: semver: 5.7.2 tinyglobby@0.2.15: dependencies: - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 + + tinyglobby@0.2.16: + dependencies: + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 tmp-promise@3.0.3: dependencies: @@ -4660,32 +3395,14 @@ snapshots: tslib@2.8.1: {} - turbo-darwin-64@2.5.8: - optional: true - - turbo-darwin-arm64@2.5.8: - optional: true - - turbo-linux-64@2.5.8: - optional: true - - turbo-linux-arm64@2.5.8: - optional: true - - turbo-windows-64@2.5.8: - optional: true - - turbo-windows-arm64@2.5.8: - optional: true - - turbo@2.5.8: + turbo@2.9.14: optionalDependencies: - turbo-darwin-64: 2.5.8 - turbo-darwin-arm64: 2.5.8 - turbo-linux-64: 2.5.8 - turbo-linux-arm64: 2.5.8 - turbo-windows-64: 2.5.8 - turbo-windows-arm64: 2.5.8 + '@turbo/darwin-64': 2.9.14 + '@turbo/darwin-arm64': 2.9.14 + '@turbo/linux-64': 2.9.14 + '@turbo/linux-arm64': 2.9.14 + '@turbo/windows-64': 2.9.14 + '@turbo/windows-arm64': 2.9.14 type-fest@0.13.1: optional: true @@ -4694,32 +3411,18 @@ snapshots: undici-types@6.21.0: {} - unique-filename@2.0.1: - dependencies: - unique-slug: 3.0.0 - - unique-slug@3.0.0: - dependencies: - imurmurhash: 0.1.4 + undici@6.25.0: {} universalify@0.1.2: {} universalify@2.0.1: {} - update-browserslist-db@1.1.3(browserslist@4.26.3): - dependencies: - browserslist: 4.26.3 - escalade: 3.2.0 - picocolors: 1.1.1 - uri-js@4.4.1: dependencies: punycode: 2.3.1 utf8-byte-length@1.0.5: {} - util-deprecate@1.0.2: {} - verror@1.10.1: dependencies: assert-plus: 1.0.0 @@ -4727,48 +3430,43 @@ snapshots: extsprintf: 1.4.1 optional: true - vite@7.1.11(@types/node@20.19.21)(jiti@2.6.1)(lightningcss@1.30.2): + vite@8.0.13(@types/node@20.19.21)(esbuild@0.28.0)(jiti@2.6.1): dependencies: - esbuild: 0.25.11 - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 - postcss: 8.5.6 - rollup: 4.52.5 - tinyglobby: 0.2.15 + lightningcss: 1.32.0 + picomatch: 4.0.4 + postcss: 8.5.14 + rolldown: 1.0.1 + tinyglobby: 0.2.16 optionalDependencies: '@types/node': 20.19.21 + esbuild: 0.28.0 fsevents: 2.3.3 jiti: 2.6.1 - lightningcss: 1.30.2 - - wcwidth@1.0.1: - dependencies: - defaults: 1.0.4 which@2.0.2: dependencies: isexe: 2.0.0 + which@5.0.0: + dependencies: + isexe: 3.1.5 + + which@6.0.1: + dependencies: + isexe: 4.0.0 + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 string-width: 4.2.3 strip-ansi: 6.0.1 - wrap-ansi@8.1.0: - dependencies: - ansi-styles: 6.2.3 - string-width: 5.1.2 - strip-ansi: 7.1.2 - wrappy@1.0.2: {} xmlbuilder@15.1.1: {} y18n@5.0.8: {} - yallist@3.1.1: {} - yallist@4.0.0: {} yallist@5.0.0: {} @@ -4791,9 +3489,3 @@ snapshots: fd-slicer: 1.1.0 yocto-queue@0.1.0: {} - - zip-stream@4.1.1: - dependencies: - archiver-utils: 3.0.4 - compress-commons: 4.1.2 - readable-stream: 3.6.2 diff --git a/turbo.json b/turbo.json index d508947..db837f5 100644 --- a/turbo.json +++ b/turbo.json @@ -5,7 +5,7 @@ "build": { "dependsOn": ["^build"], "inputs": ["$TURBO_DEFAULT$", ".env*"], - "outputs": [".next/**", "!.next/cache/**"] + "outputs": ["dist/**", "dist-renderer/**"] }, "lint": { "dependsOn": ["^lint"]