{
if (isLoading) return;
setIsLoading(true);
try {
- const modifiers = new Modifiers();
- modifiers.leftCtrl = true;
- modifiers.leftAlt = true;
- await send(modifiers, KeyboardCodes.get('Delete')!);
+ const mods = new Modifiers();
+ Object.assign(mods, modifiers);
+ await send(mods, KeyboardCodes.get(keyCode)!);
} catch (e) {
console.log(e);
} finally {
@@ -26,20 +29,19 @@ export const CtrlAltDel = () => {
}
}
- async function send(modifiers: Modifiers, code: number) {
+ async function send(mods: Modifiers, code: number) {
const keys = [0x00, 0x00, code, 0x00, 0x00, 0x00];
- await device.sendKeyboardData(modifiers, keys);
-
+ await device.sendKeyboardData(mods, keys);
await device.sendKeyboardData(new Modifiers(), [0x00, 0x00, 0x00, 0x00, 0x00, 0x00]);
}
return (
- {t('keyboard.ctrlAltDel')}
+ {label}
);
};
diff --git a/browser/src/components/menu/keyboard/shortcuts-menu.tsx b/browser/src/components/menu/keyboard/shortcuts-menu.tsx
new file mode 100644
index 0000000..6f960cf
--- /dev/null
+++ b/browser/src/components/menu/keyboard/shortcuts-menu.tsx
@@ -0,0 +1,55 @@
+import { useState } from 'react';
+import { SendHorizonal } from 'lucide-react';
+import { useTranslation } from 'react-i18next';
+import { Popover } from 'antd';
+
+import { Shortcut } from './shortcut.tsx';
+
+export const KeyboardShortcutsMenu = () => {
+ const { t } = useTranslation();
+ const [open, setOpen] = useState(false);
+
+ return (
+
+ {[
+ {
+ label: t('keyboard.ctrlAltDel'),
+ modifiers: { leftCtrl: true, leftAlt: true },
+ keyCode: 'Delete',
+ },
+ {
+ label: t('keyboard.ctrlD'),
+ modifiers: { leftCtrl: true },
+ keyCode: 'KeyD',
+ },
+ {
+ label: t('keyboard.winTab'),
+ modifiers: { leftWindows: true },
+ keyCode: 'Tab',
+ },
+ ].map((shortcut) => (
+
+ ))}
+
+ }
+ trigger="click"
+ placement="rightTop"
+ align={{ offset: [14, 0] }}
+ open={open}
+ onOpenChange={setOpen}
+ arrow={false}
+ >
+
+
+ {t('keyboard.shortcuts')}
+
+
+ );
+};
diff --git a/browser/src/components/menu/mouse/index.tsx b/browser/src/components/menu/mouse/index.tsx
index 4c0bbf4..d5ba87a 100644
--- a/browser/src/components/menu/mouse/index.tsx
+++ b/browser/src/components/menu/mouse/index.tsx
@@ -4,6 +4,7 @@ import { useAtom, useSetAtom } from 'jotai';
import { MouseIcon } from 'lucide-react';
import {
+ mouseJigglerModeAtom,
mouseModeAtom,
mouseStyleAtom,
scrollDirectionAtom,
@@ -12,6 +13,7 @@ import {
import * as storage from '@/libs/storage';
import { Direction } from './direction.tsx';
+import { Jiggler } from './jiggler.tsx';
import { Mode } from './mode.tsx';
import { Speed } from './speed.tsx';
import { Style } from './style.tsx';
@@ -21,6 +23,7 @@ export const Mouse = () => {
const [mouseMode, setMouseMode] = useAtom(mouseModeAtom);
const setScrollDirection = useSetAtom(scrollDirectionAtom);
const setScrollInterval = useSetAtom(scrollIntervalAtom);
+ const [mouseJigglerMode, setMouseJigglerMode] = useAtom(mouseJigglerModeAtom);
const [isPopoverOpen, setIsPopoverOpen] = useState(false);
@@ -48,6 +51,11 @@ export const Mouse = () => {
if (interval) {
setScrollInterval(interval);
}
+
+ const jiggler = storage.getMouseJigglerMode();
+ if (mouseJigglerMode !== jiggler) {
+ setMouseJigglerMode(jiggler);
+ }
}
const content = (
@@ -56,6 +64,7 @@ export const Mouse = () => {
+
>
);
diff --git a/browser/src/components/menu/mouse/jiggler.tsx b/browser/src/components/menu/mouse/jiggler.tsx
new file mode 100644
index 0000000..b3c74f5
--- /dev/null
+++ b/browser/src/components/menu/mouse/jiggler.tsx
@@ -0,0 +1,49 @@
+import { Popover } from 'antd';
+import clsx from 'clsx';
+import { useAtom } from 'jotai';
+import { MousePointerIcon } from 'lucide-react';
+import { useTranslation } from 'react-i18next';
+
+import { mouseJigglerModeAtom } from '@/jotai/mouse.ts';
+import * as storage from '@/libs/storage';
+
+export const Jiggler = () => {
+ const { t } = useTranslation();
+ const [mouseJigglerMode, setMouseJigglerMode] = useAtom(mouseJigglerModeAtom);
+ const mouseJigglerModes = [
+ { name: t('mouse.jiggler.enable'), value: 'enable' },
+ { name: t('mouse.jiggler.disable'), value: 'disable' }
+ ];
+
+ function update(mode: string) {
+ setMouseJigglerMode(mode);
+ storage.setMouseJigglerMode(mode);
+ }
+
+ const content = (
+ <>
+ {mouseJigglerModes.map((mode) => (
+ update(mode.value)}
+ >
+ {mode.name}
+
+ ))}
+ >
+ );
+ return (
+
+
+
+
+
+
{t('mouse.jiggler.title')}
+
+
+ );
+};
diff --git a/browser/src/components/menu/video/index.tsx b/browser/src/components/menu/video/index.tsx
index 8b78ed9..dd44766 100644
--- a/browser/src/components/menu/video/index.tsx
+++ b/browser/src/components/menu/video/index.tsx
@@ -3,11 +3,13 @@ import { MonitorIcon } from 'lucide-react';
import { Device } from './device.tsx';
import { Resolution } from './resolution.tsx';
+import { Scale } from './scale.tsx';
export const Video = () => {
const content = (
+
);
diff --git a/browser/src/components/menu/video/scale.tsx b/browser/src/components/menu/video/scale.tsx
new file mode 100644
index 0000000..d21f5e3
--- /dev/null
+++ b/browser/src/components/menu/video/scale.tsx
@@ -0,0 +1,58 @@
+import { ReactElement, useEffect } from 'react'
+import { Popover, Slider } from 'antd'
+import { useAtom } from 'jotai'
+import { ScalingIcon } from 'lucide-react'
+import { useTranslation } from 'react-i18next'
+
+import { videoScaleAtom } from '@/jotai/device.ts';
+import * as storage from '@/libs/storage';
+
+export const Scale = (): ReactElement => {
+ const { t } = useTranslation()
+
+ const [videoScale, setVideoScale] = useAtom(videoScaleAtom)
+
+ useEffect(() => {
+ const scale = storage.getVideoScale()
+ if (scale) {
+ setVideoScale(scale)
+ }
+ }, [])
+
+ async function updateScale(scale: number): Promise {
+ setVideoScale(scale)
+ storage.setVideoScale(scale)
+ }
+
+ const content = (
+
+ x0.5,
+ 1: x1.0,
+ 1.5: x1.5,
+ 2: x2.0
+ }}
+ range={false}
+ included={false}
+ min={0.5}
+ max={2}
+ step={0.1}
+ defaultValue={videoScale}
+ onChange={updateScale}
+ />
+
+ )
+
+ return (
+
+
+
+
+
+
{t('video.scale')}
+
+
+ )
+}
diff --git a/browser/src/components/mouse/absolute.tsx b/browser/src/components/mouse/absolute.tsx
index d5a9bd0..7f4ab4b 100644
--- a/browser/src/components/mouse/absolute.tsx
+++ b/browser/src/components/mouse/absolute.tsx
@@ -1,8 +1,13 @@
import { useEffect, useRef } from 'react';
-import { useAtomValue } from 'jotai';
+import { useAtomValue, useSetAtom } from 'jotai';
import { resolutionAtom } from '@/jotai/device.ts';
-import { scrollDirectionAtom, scrollIntervalAtom } from '@/jotai/mouse.ts';
+import {
+ mouseJigglerModeAtom,
+ mouseLastMoveTimeAtom,
+ scrollDirectionAtom,
+ scrollIntervalAtom
+} from '@/jotai/mouse.ts';
import { device } from '@/libs/device';
import { Key } from '@/libs/device/mouse.ts';
@@ -10,6 +15,8 @@ export const Absolute = () => {
const resolution = useAtomValue(resolutionAtom);
const scrollDirection = useAtomValue(scrollDirectionAtom);
const scrollInterval = useAtomValue(scrollIntervalAtom);
+ const mouseJigglerMode = useAtomValue(mouseJigglerModeAtom);
+ const setMouseLastMoveTime = useSetAtom(mouseLastMoveTimeAtom);
const keyRef = useRef(new Key());
const lastScrollTimeRef = useRef(0);
@@ -74,6 +81,11 @@ export const Absolute = () => {
async function handleMouseMove(event: any) {
disableEvent(event);
await send(event);
+
+ // mouse jiggler record last move time
+ if (mouseJigglerMode === 'enable') {
+ setMouseLastMoveTime(Date.now());
+ }
}
// mouse scroll
@@ -109,7 +121,7 @@ export const Absolute = () => {
canvas.removeEventListener('click', disableEvent);
canvas.removeEventListener('contextmenu', disableEvent);
};
- }, [resolution, scrollDirection, scrollInterval]);
+ }, [resolution, scrollDirection, scrollInterval, mouseJigglerMode, setMouseLastMoveTime]);
// disable default events
function disableEvent(event: any) {
diff --git a/browser/src/components/mouse/index.tsx b/browser/src/components/mouse/index.tsx
index ddbd4ae..32e558a 100644
--- a/browser/src/components/mouse/index.tsx
+++ b/browser/src/components/mouse/index.tsx
@@ -1,6 +1,15 @@
-import { useAtomValue } from 'jotai';
+import { useEffect, useRef } from 'react';
+import { useAtom, useAtomValue } from 'jotai';
-import { mouseModeAtom } from '@/jotai/mouse.ts';
+import {
+ mouseJigglerIntervalAtom,
+ mouseJigglerModeAtom,
+ mouseJigglerTimerAtom,
+ mouseLastMoveTimeAtom,
+ mouseModeAtom
+} from '@/jotai/mouse.ts';
+import { device } from '@/libs/device/index.ts';
+import { Key } from '@/libs/device/mouse.ts';
import { Absolute } from './absolute.tsx';
import { Relative } from './relative.tsx';
@@ -8,5 +17,48 @@ import { Relative } from './relative.tsx';
export const Mouse = () => {
const mouseMode = useAtomValue(mouseModeAtom);
+ // mouse jiggler
+ const mouseJigglerMode = useAtomValue(mouseJigglerModeAtom);
+ const [mouseJigglerTimer, setMouseJigglerTimer] = useAtom(mouseJigglerTimerAtom);
+ const mouseJigglerInterval = useAtomValue(mouseJigglerIntervalAtom);
+ const mouseLastMoveTime = useAtomValue(mouseLastMoveTimeAtom);
+ const mouseLastMoveTimeRef = useRef(mouseLastMoveTime);
+ const emptyKeyRef = useRef(new Key());
+ useEffect(() => {
+ // sync mouseLastMoveTime through ref
+ mouseLastMoveTimeRef.current = mouseLastMoveTime;
+ }, [mouseLastMoveTime]);
+ useEffect(() => {
+ async function jigglerTimerCallback() {
+ if (Date.now() - mouseLastMoveTimeRef.current < mouseJigglerInterval) {
+ return;
+ }
+
+ const rect = document.getElementById('video')!.getBoundingClientRect();
+
+ await device.sendMouseAbsoluteData(
+ emptyKeyRef.current,
+ rect.width,
+ rect.height,
+ rect.width / 2,
+ rect.height / 2,
+ 0
+ );
+ }
+
+ // configure interval timer
+ if (mouseJigglerMode === 'enable') {
+ if (mouseJigglerTimer === null) {
+ const timer = setInterval(jigglerTimerCallback, mouseJigglerInterval);
+ setMouseJigglerTimer(timer);
+ }
+ } else {
+ if (mouseJigglerTimer) {
+ clearInterval(mouseJigglerTimer);
+ setMouseJigglerTimer(null);
+ }
+ }
+ }, [mouseJigglerMode]);
+
return <>{mouseMode === 'relative' ? : }>;
};
diff --git a/browser/src/components/mouse/relative.tsx b/browser/src/components/mouse/relative.tsx
index 0caecba..22bf8d6 100644
--- a/browser/src/components/mouse/relative.tsx
+++ b/browser/src/components/mouse/relative.tsx
@@ -1,10 +1,15 @@
import { useEffect, useRef } from 'react';
import { message } from 'antd';
-import { useAtomValue } from 'jotai';
+import { useAtomValue, useSetAtom } from 'jotai';
import { useTranslation } from 'react-i18next';
import { resolutionAtom } from '@/jotai/device.ts';
-import { scrollDirectionAtom, scrollIntervalAtom } from '@/jotai/mouse.ts';
+import {
+ mouseJigglerModeAtom,
+ mouseLastMoveTimeAtom,
+ scrollDirectionAtom,
+ scrollIntervalAtom
+} from '@/jotai/mouse.ts';
import { device } from '@/libs/device';
import { Key } from '@/libs/device/mouse.ts';
@@ -15,6 +20,8 @@ export const Relative = () => {
const resolution = useAtomValue(resolutionAtom);
const scrollDirection = useAtomValue(scrollDirectionAtom);
const scrollInterval = useAtomValue(scrollIntervalAtom);
+ const mouseJigglerMode = useAtomValue(mouseJigglerModeAtom);
+ const setMouseLastMoveTime = useSetAtom(mouseLastMoveTimeAtom);
const isLockedRef = useRef(false);
const keyRef = useRef(new Key());
@@ -110,6 +117,11 @@ export const Relative = () => {
if (x === 0 && y === 0) return;
await send(Math.abs(x) < 10 ? x * 2 : x, Math.abs(y) < 10 ? y * 2 : y, 0);
+
+ // mouse jiggler record last move time
+ if (mouseJigglerMode === 'enable') {
+ setMouseLastMoveTime(Date.now());
+ }
}
// mouse scroll
@@ -138,7 +150,7 @@ export const Relative = () => {
canvas.removeEventListener('wheel', handleWheel);
canvas.removeEventListener('contextmenu', disableEvent);
};
- }, [resolution, scrollDirection, scrollInterval]);
+ }, [resolution, scrollDirection, scrollInterval, mouseJigglerMode, setMouseLastMoveTime]);
async function send(x: number, y: number, scroll: number) {
await device.sendMouseRelativeData(keyRef.current, x, y, scroll);
diff --git a/browser/src/i18n/languages.ts b/browser/src/i18n/languages.ts
index 59019eb..e3f696b 100644
--- a/browser/src/i18n/languages.ts
+++ b/browser/src/i18n/languages.ts
@@ -1,10 +1,14 @@
const languages = [
{ key: 'en', name: 'English' },
{ key: 'ru', name: 'Русский' },
- { key: 'zh', name: '中文' },
+ { key: 'zh', name: '简体中文' },
+ { key: 'zh_tw', name: '繁體中文' },
{ key: 'de', name: 'Deutsch' },
{ key: 'nl', name: 'Nederlands' },
- { key: 'be', name: 'België' }
+ { key: 'be', name: 'België' },
+ { key: 'ko', name: '한국어' },
+ { key: 'pt_br', name: 'Português (Brasil)' },
+ { key: 'pl', name: 'Polski' }
];
languages.sort((a, b) => a.name.localeCompare(b.name, 'en', { sensitivity: 'base' }));
diff --git a/browser/src/i18n/locales/be.ts b/browser/src/i18n/locales/be.ts
index 094db16..d08ed39 100644
--- a/browser/src/i18n/locales/be.ts
+++ b/browser/src/i18n/locales/be.ts
@@ -24,6 +24,7 @@ const be = {
},
video: {
resolution: 'Resolutie',
+ scale: 'Schaal',
customResolution: 'Aangepast',
device: 'Toestel',
custom: {
@@ -37,7 +38,10 @@ const be = {
keyboard: {
paste: 'Plakken',
virtualKeyboard: 'Virtueel klavier',
- ctrlAltDel: 'Ctrl + Alt + Delete'
+ shortcuts: 'Sneltoetsen',
+ ctrlAltDel: 'Ctrl + Alt + Delete',
+ ctrlD: 'Ctrl + D',
+ winTab: 'Win + Tab',
},
mouse: {
cursor: {
@@ -62,5 +66,5 @@ const be = {
}
}
};
-
- export default be;
\ No newline at end of file
+
+ export default be;
diff --git a/browser/src/i18n/locales/de.ts b/browser/src/i18n/locales/de.ts
index 79dbb70..9d23237 100644
--- a/browser/src/i18n/locales/de.ts
+++ b/browser/src/i18n/locales/de.ts
@@ -24,6 +24,7 @@ const de = {
},
video: {
resolution: 'Auflösung',
+ scale: 'Skalierung',
customResolution: 'Benutzerdefiniert',
device: 'Gerät',
custom: {
@@ -37,7 +38,10 @@ const de = {
keyboard: {
paste: 'Einfügen',
virtualKeyboard: 'Virtuelle Tastatur',
- ctrlAltDel: 'Strg + Alt + Entfernen'
+ shortcuts: 'Tastenkürzel',
+ ctrlAltDel: 'Strg + Alt + Entfernen',
+ ctrlD: 'Strg + D',
+ winTab: 'Win + Tab',
},
mouse: {
cursor: {
@@ -53,6 +57,9 @@ const de = {
direction: 'Scrollrichtung',
scrollUp: 'Hochscrollen',
scrollDown: 'Runterscrollen',
+ speed: 'Scrollgeschwindigkeit',
+ fast: 'Schnell',
+ slow: 'Langsam',
requestPointer: 'Benutze relativen Modus. Bitte auf den Desktop klicken, um den Mauszeiger anzuzeigen.'
},
settings: {
@@ -62,5 +69,5 @@ const de = {
}
}
};
-
- export default de;
\ No newline at end of file
+
+ export default de;
diff --git a/browser/src/i18n/locales/en.ts b/browser/src/i18n/locales/en.ts
index 59ea63b..daa9767 100644
--- a/browser/src/i18n/locales/en.ts
+++ b/browser/src/i18n/locales/en.ts
@@ -24,6 +24,7 @@ const en = {
},
video: {
resolution: 'Resolution',
+ scale: 'Scale',
customResolution: 'Custom',
device: 'Device',
custom: {
@@ -37,7 +38,10 @@ const en = {
keyboard: {
paste: 'Paste',
virtualKeyboard: 'Keyboard',
- ctrlAltDel: 'Ctrl + Alt + Delete'
+ shortcuts: 'Shortcuts',
+ ctrlAltDel: 'Ctrl + Alt + Delete',
+ ctrlD: 'Ctrl + D',
+ winTab: 'Win + Tab',
},
mouse: {
cursor: {
@@ -56,7 +60,12 @@ const en = {
speed: 'Wheel speed',
fast: 'Fast',
slow: 'Slow',
- requestPointer: 'Using relative mode. Please click desktop to get mouse pointer.'
+ requestPointer: 'Using relative mode. Please click desktop to get mouse pointer.',
+ jiggler: {
+ title: 'Mouse Jiggler',
+ enable: 'Enable',
+ disable: 'Disable'
+ }
},
settings: {
language: 'Language',
diff --git a/browser/src/i18n/locales/ko.ts b/browser/src/i18n/locales/ko.ts
new file mode 100644
index 0000000..d1be2ed
--- /dev/null
+++ b/browser/src/i18n/locales/ko.ts
@@ -0,0 +1,70 @@
+const ko = {
+ translation: {
+ serial: {
+ notSupported:
+ '시리얼이 지원되지 않습니다. 마우스와 키보드를 사용하려면 Chrome 브라우저를 사용하세요.',
+ failed: '시리얼 연결에 실패했습니다. 다시 시도해 주세요.'
+ },
+ camera: {
+ tip: '권한을 기다리는 중...',
+ denied: '권한이 거부되었습니다.',
+ authorize:
+ 'Target PC 연결에 카메라 권한이 필요합니다. 브라우저 설정에서 카메라 권한을 허용해 주세요.',
+ failed: '카메라 연결에 실패했습니다. 다시 시도해 주세요.'
+ },
+ modal: {
+ title: 'USB 장치 선택',
+ selectVideo: '비디오 입력 장치를 선택해 주세요.',
+ selectSerial: '시리얼 장치를 선택해 주세요.'
+ },
+ menu: {
+ serial: '시리얼',
+ keyboard: '키보드',
+ mouse: '마우스'
+ },
+ video: {
+ resolution: '해상도',
+ scale: '배율',
+ customResolution: '사용자 정의',
+ device: '장치',
+ custom: {
+ title: '사용자 정의 해상도',
+ width: '가로',
+ height: '세로',
+ confirm: '확인',
+ cancel: '취소'
+ }
+ },
+ keyboard: {
+ paste: '붙여넣기',
+ virtualKeyboard: '가상 키보드',
+ ctrlAltDel: 'Ctrl + Alt + Delete'
+ },
+ mouse: {
+ cursor: {
+ title: '커서 모양',
+ pointer: '포인터',
+ grab: '손',
+ cell: '플러스',
+ hide: '숨기기'
+ },
+ mode: '마우스 모드',
+ absolute: '절대 모드',
+ relative: '상대 모드',
+ direction: '휠 방향',
+ scrollUp: '위로 스크롤',
+ scrollDown: '아래로 스크롤',
+ speed: '휠 속도',
+ fast: '빠르게',
+ slow: '느리게',
+ requestPointer: '상대 모드를 사용 중입니다. 마우스 포인터를 가져오려면 스크린을 클릭하세요.'
+ },
+ settings: {
+ language: '언어',
+ document: '문서',
+ download: '다운로드'
+ }
+ }
+};
+
+export default ko;
diff --git a/browser/src/i18n/locales/nl.ts b/browser/src/i18n/locales/nl.ts
index abab0ea..2235d17 100644
--- a/browser/src/i18n/locales/nl.ts
+++ b/browser/src/i18n/locales/nl.ts
@@ -24,6 +24,7 @@ const nl = {
},
video: {
resolution: 'Resolutie',
+ scale: 'Schaal',
customResolution: 'Aangepast',
device: 'Apparaat',
custom: {
@@ -37,7 +38,10 @@ const nl = {
keyboard: {
paste: 'Plakken',
virtualKeyboard: 'Virtueel toetsenbord',
- ctrlAltDel: 'Ctrl + Alt + Delete'
+ shortcuts: 'Sneltoetsen',
+ ctrlAltDel: 'Ctrl + Alt + Delete',
+ ctrlD: 'Ctrl + D',
+ winTab: 'Win + Tab',
},
mouse: {
cursor: {
@@ -62,5 +66,5 @@ const nl = {
}
}
};
-
- export default nl;
\ No newline at end of file
+
+ export default nl;
diff --git a/browser/src/i18n/locales/pl.ts b/browser/src/i18n/locales/pl.ts
new file mode 100644
index 0000000..8f9bdb0
--- /dev/null
+++ b/browser/src/i18n/locales/pl.ts
@@ -0,0 +1,70 @@
+const pl = {
+ translation: {
+ serial: {
+ notSupported:
+ 'Przeglądarka nie obsługuje portu szeregowego. Proszę użyć przeglądarki Chrome (desktop) aby włączyć obsługę myszy i klawiatury.',
+ failed: 'Nie udało połączyć się z portem szeregowym. Spróbuj ponownie.'
+ },
+ camera: {
+ tip: 'Oczekiwanie na autoryzację...',
+ denied: 'Brak uprawnień',
+ authorize:
+ 'Zdalny pulpit wymaga uprawnienia dostępu do kamery. Zezwól na dostęp do kamery w ustawieniach przeglądarki.',
+ failed: 'Nie udało połączyć się z kamerą. Spróbuj ponownie.'
+ },
+ modal: {
+ title: 'Wybierz urządzenie USB',
+ selectVideo: 'Wybierz urządzenie wejścia wideo',
+ selectSerial: 'Wybierz urządzenie portu szeregowego'
+ },
+ menu: {
+ serial: 'Port szeregowy',
+ keyboard: 'Klawiatura',
+ mouse: 'Mysz'
+ },
+ video: {
+ resolution: 'Rozdzielczość',
+ customResolution: 'Niestandardowa',
+ device: 'Urządzenie',
+ custom: {
+ title: 'Niestandardowa rozdzielczość',
+ width: 'Szerokość',
+ height: 'Wysokość',
+ confirm: 'Ok',
+ cancel: 'Anuluj'
+ }
+ },
+ keyboard: {
+ paste: 'Wklej',
+ virtualKeyboard: 'Klawiatura',
+ ctrlAltDel: 'Ctrl + Alt + Delete'
+ },
+ mouse: {
+ cursor: {
+ title: 'Kursor',
+ pointer: 'Wskaźnik',
+ grab: 'Chwyć',
+ cell: 'Zaznacz',
+ hide: 'Ukryj'
+ },
+ mode: 'Tryb myszy',
+ absolute: 'Tryb absolutny',
+ relative: 'Tryb względny',
+ direction: 'Kierunek kółka przewijania',
+ scrollUp: 'Przewijanie w górę',
+ scrollDown: 'Przewijanie w dół',
+ speed: 'Szybkość kółka',
+ fast: 'Szybko',
+ slow: 'Powoli',
+ requestPointer:
+ 'Użycie trybu względnego. Proszę kliknij na pulpicie aby aktywować wskaźnik myszy.'
+ },
+ settings: {
+ language: 'Język',
+ document: 'Dokumentacja',
+ download: 'Pobieranie'
+ }
+ }
+};
+
+export default pl;
diff --git a/browser/src/i18n/locales/pt_br.ts b/browser/src/i18n/locales/pt_br.ts
new file mode 100644
index 0000000..2204d1e
--- /dev/null
+++ b/browser/src/i18n/locales/pt_br.ts
@@ -0,0 +1,69 @@
+const pt_br = {
+ translation: {
+ serial: {
+ notSupported:
+ 'Serial não suportado. Use o navegador Chrome para habilitar o mouse e teclado.',
+ failed: 'Falha ao se conectar na porta serial. Tente novamente'
+ },
+ camera: {
+ tip: 'Esperando autorização...',
+ denied: 'Permissão negada',
+ authorize:
+ 'A área de trabalho remota requer permissão de uso da câmera. Por favor, conceda as permissões de câmera nos ajustes do navegador.',
+ failed: 'Falha ao se conectar à câmera. Tente novamente.'
+ },
+ modal: {
+ title: 'Selecione o dispositivo USB',
+ selectVideo: 'Selecione um dispositivo de vídeo de entrada',
+ selectSerial: 'Selecione um dispositivo serial'
+ },
+ menu: {
+ serial: 'Serial',
+ keyboard: 'Teclado',
+ mouse: 'Mouse'
+ },
+ video: {
+ resolution: 'Resolução',
+ customResolution: 'Personalizada',
+ device: 'Dispositivo',
+ custom: {
+ title: 'Resolução Personalizada',
+ width: 'Largura',
+ height: 'Altura',
+ confirm: 'Ok',
+ cancel: 'Cancelar'
+ }
+ },
+ keyboard: {
+ paste: 'Colar',
+ virtualKeyboard: 'Teclado Virtual',
+ ctrlAltDel: 'Ctrl + Alt + Delete'
+ },
+ mouse: {
+ cursor: {
+ title: 'Cursor',
+ pointer: 'Ponteiro',
+ grab: 'Mão',
+ cell: 'Célula',
+ hide: 'Esconder'
+ },
+ mode: 'Modo do mouse',
+ absolute: 'Modo absoluto',
+ relative: 'Modo relativo',
+ direction: 'Direção do scroll',
+ scrollUp: 'Scroll para cima',
+ scrollDown: 'Scroll para baixo',
+ speed: 'Velocidade do scroll',
+ fast: 'Rápido',
+ slow: 'Lento',
+ requestPointer: 'Usando modo relativo. Por favor, clique na área de trabalho para restaurar o ponteiro do mouse.'
+ },
+ settings: {
+ language: 'Linguagem',
+ document: 'Documentação',
+ download: 'Download'
+ }
+ }
+};
+
+export default pt_br;
diff --git a/browser/src/i18n/locales/ru.ts b/browser/src/i18n/locales/ru.ts
index c1ee4c8..0e8a299 100644
--- a/browser/src/i18n/locales/ru.ts
+++ b/browser/src/i18n/locales/ru.ts
@@ -24,6 +24,7 @@ const ru = {
},
video: {
resolution: 'Разрешение',
+ scale: 'Масштаб',
customResolution: 'Пользовательское',
device: 'Видеоустройство',
custom: {
@@ -37,7 +38,10 @@ const ru = {
keyboard: {
paste: 'Вставить текст',
virtualKeyboard: 'Виртуальная клавиатура',
- ctrlAltDel: 'Ctrl + Alt + Delete'
+ shortcuts: 'Сочетания клавиш',
+ ctrlAltDel: 'Ctrl + Alt + Delete',
+ ctrlD: 'Ctrl + D',
+ winTab: 'Win + Tab',
},
mouse: {
cursor: {
@@ -53,6 +57,9 @@ const ru = {
direction: 'Направление прокрутки',
scrollUp: 'Обычное',
scrollDown: 'Инвертированное',
+ speed: 'Скорость прокрутки',
+ fast: 'Быстро',
+ slow: 'Медленно',
requestPointer: 'Используется относительное позиционирование мыши. Чтобы захватить курсор, щелкните по видео на экране'
},
settings: {
diff --git a/browser/src/i18n/locales/zh.ts b/browser/src/i18n/locales/zh.ts
index e7f1f85..51a5ce9 100644
--- a/browser/src/i18n/locales/zh.ts
+++ b/browser/src/i18n/locales/zh.ts
@@ -22,6 +22,7 @@ const zh = {
},
video: {
resolution: '分辨率',
+ scale: '缩放',
customResolution: '自定义',
device: '设备',
custom: {
@@ -35,7 +36,10 @@ const zh = {
keyboard: {
paste: '粘贴',
virtualKeyboard: '虚拟键盘',
- ctrlAltDel: 'Ctrl + Alt + Delete'
+ shortcuts: '快捷键',
+ ctrlAltDel: 'Ctrl + Alt + Delete',
+ ctrlD: 'Ctrl + D',
+ winTab: 'Win + Tab',
},
mouse: {
cursor: {
@@ -54,7 +58,12 @@ const zh = {
speed: '滚轮速度',
fast: '快',
slow: '慢',
- requestPointer: '正在使用鼠标相对模式,请点击桌面获取鼠标指针。'
+ requestPointer: '正在使用鼠标相对模式,请点击桌面获取鼠标指针。',
+ jiggler: {
+ title: '闲时晃动',
+ enable: '启用',
+ disable: '禁用'
+ }
},
settings: {
language: '语言',
diff --git a/browser/src/i18n/locales/zh_tw.ts b/browser/src/i18n/locales/zh_tw.ts
new file mode 100644
index 0000000..714070f
--- /dev/null
+++ b/browser/src/i18n/locales/zh_tw.ts
@@ -0,0 +1,67 @@
+const zh_tw = {
+ translation: {
+ serial: {
+ notSupported: '當前瀏覽器不支援序列埠,無法使用鍵鼠。請使用桌面版 Chrome 瀏覽器。',
+ failed: '序列埠連線失敗,請重試。'
+ },
+ camera: {
+ tip: '等待授權中...',
+ denied: '權限不足',
+ authorize: '遠端桌面需要取得攝影機權限,請在瀏覽器設定中允許使用攝影機。',
+ failed: '攝影機連線失敗,請重試。'
+ },
+ modal: {
+ title: '選擇 USB 裝置',
+ selectVideo: '請選擇視訊輸入裝置',
+ selectSerial: '選擇序列埠裝置'
+ },
+ menu: {
+ serial: '序列埠',
+ keyboard: '鍵盤',
+ mouse: '滑鼠'
+ },
+ video: {
+ resolution: '解析度',
+ customResolution: '自訂',
+ device: '裝置',
+ custom: {
+ title: '自訂解析度',
+ width: '寬度',
+ height: '高度',
+ confirm: '確定',
+ cancel: '取消'
+ }
+ },
+ keyboard: {
+ paste: '貼上',
+ virtualKeyboard: '虛擬鍵盤',
+ ctrlAltDel: 'Ctrl + Alt + Delete'
+ },
+ mouse: {
+ cursor: {
+ title: '滑鼠指標',
+ pointer: '箭頭',
+ grab: '抓取',
+ cell: '格線',
+ hide: '隱藏'
+ },
+ mode: '滑鼠模式',
+ absolute: '絕對模式',
+ relative: '相對模式',
+ direction: '滾輪方向',
+ scrollUp: '向上',
+ scrollDown: '向下',
+ speed: '滾輪速度',
+ fast: '快',
+ slow: '慢',
+ requestPointer: '正在使用滑鼠相對模式,請點擊桌面取得滑鼠指標。'
+ },
+ settings: {
+ language: '語言',
+ document: '文件',
+ download: '下載'
+ }
+ }
+};
+
+export default zh_tw;
diff --git a/browser/src/jotai/device.ts b/browser/src/jotai/device.ts
index a768ee3..195dc28 100644
--- a/browser/src/jotai/device.ts
+++ b/browser/src/jotai/device.ts
@@ -10,6 +10,8 @@ export const resolutionAtom = atom({
height: 1080
});
+export const videoScaleAtom = atom(1.0)
+
export const videoDeviceIdAtom = atom('');
export const videoStateAtom = atom('disconnected');
diff --git a/browser/src/jotai/mouse.ts b/browser/src/jotai/mouse.ts
index 7678c93..162484a 100644
--- a/browser/src/jotai/mouse.ts
+++ b/browser/src/jotai/mouse.ts
@@ -9,6 +9,17 @@ export const mouseModeAtom = atom('absolute');
// mouse scroll direction: 1 or -1
export const scrollDirectionAtom = atom(1);
-// mouse scroll interval (unit: ms)
// mouse scroll interval (unit: ms)
export const scrollIntervalAtom = atom(0);
+
+// mouse jiggler mode: enable or disable
+export const mouseJigglerModeAtom = atom('disable');
+
+// mouse jiggler timer id
+export const mouseJigglerTimerAtom = atom(null);
+
+// mouse jiggler interval (unit: ms)
+export const mouseJigglerIntervalAtom = atom(15_000);
+
+// mouse jiggler last move time
+export const mouseLastMoveTimeAtom = atom(0);
diff --git a/browser/src/libs/storage/index.ts b/browser/src/libs/storage/index.ts
index 9397942..01543d7 100644
--- a/browser/src/libs/storage/index.ts
+++ b/browser/src/libs/storage/index.ts
@@ -4,11 +4,13 @@ const LANGUAGE_KEY = 'nanokvm-usb-language';
const VIDEO_DEVICE_ID_KEY = 'nanokvm-usb-video-device-id';
const VIDEO_RESOLUTION_KEY = 'nanokvm-usb-video-resolution';
const CUSTOM_RESOLUTION_KEY = 'nanokvm-usb-custom-resolution';
+const VIDEO_SCALE_KEY = 'nanokvm-usb-video-scale'
const IS_MENU_OPEN_KEY = 'nanokvm-is-menu-open';
const MOUSE_STYLE_KEY = 'nanokvm-usb-mouse-style';
const MOUSE_MODE_KEY = 'nanokvm-usb-mouse-mode';
const MOUSE_SCROLL_DIRECTION_KEY = 'nanokvm-usb-mouse-scroll-direction';
const MOUSE_SCROLL_INTERVAL_KEY = 'nanokvm-usb-mouse-scroll-interval';
+const MOUSE_JIGGLER_MODE_KEY = 'nanokvm-usb-mouse-jiggler-mode';
export function getLanguage() {
return localStorage.getItem(LANGUAGE_KEY);
@@ -56,6 +58,18 @@ export function removeCustomResolutions() {
localStorage.removeItem(CUSTOM_RESOLUTION_KEY);
}
+export function getVideoScale(): number | null {
+ const scale = localStorage.getItem(VIDEO_SCALE_KEY)
+ if (scale && Number(scale)) {
+ return Number(scale)
+ }
+ return null
+}
+
+export function setVideoScale(scale: number): void {
+ localStorage.setItem(VIDEO_SCALE_KEY, String(scale))
+}
+
export function getIsMenuOpen(): boolean {
const state = localStorage.getItem(IS_MENU_OPEN_KEY);
if (!state) {
@@ -107,3 +121,12 @@ export function getMouseScrollInterval(): number | null {
export function setMouseScrollInterval(interval: number): void {
localStorage.setItem(MOUSE_SCROLL_INTERVAL_KEY, String(interval));
}
+
+export function getMouseJigglerMode(): string {
+ const jiggler = localStorage.getItem(MOUSE_JIGGLER_MODE_KEY);
+ return jiggler && jiggler === 'enable' ? 'enable' : 'disable';
+}
+
+export function setMouseJigglerMode(jiggler: string): void {
+ localStorage.setItem(MOUSE_JIGGLER_MODE_KEY, jiggler);
+}
diff --git a/desktop/package.json b/desktop/package.json
index 2839a59..d2a8017 100644
--- a/desktop/package.json
+++ b/desktop/package.json
@@ -50,7 +50,7 @@
"@vitejs/plugin-react": "^4.3.4",
"electron": "^34.2.0",
"electron-builder": "^25.1.8",
- "electron-vite": "^3.0.0",
+ "electron-vite": "^4.0.1",
"eslint": "^9.20.1",
"eslint-plugin-react": "^7.37.4",
"eslint-plugin-react-hooks": "^5.1.0",
@@ -65,6 +65,24 @@
"pnpm": {
"onlyBuiltDependencies": [
"electron"
- ]
+ ],
+ "overrides": {
+ "esbuild@<=0.24.2": ">=0.25.0",
+ "vite@>=6.1.0 <6.1.2": ">=6.1.2",
+ "vite@>=6.1.0 <6.1.3": ">=6.1.3",
+ "vite@>=6.1.0 <6.1.5": ">=6.1.5",
+ "@babel/runtime@<7.26.10": ">=7.26.10",
+ "@babel/helpers@<7.26.10": ">=7.26.10",
+ "vite@>=6.0.0 <=6.1.5": ">=6.1.6",
+ "vite@>=6.1.0 <6.1.4": ">=6.1.4",
+ "brace-expansion@>=1.0.0 <=1.1.11": ">=1.1.12",
+ "brace-expansion@>=2.0.0 <=2.0.1": ">=2.0.2",
+ "form-data@>=4.0.0 <4.0.4": ">=4.0.4",
+ "@eslint/plugin-kit@<0.3.4": ">=0.3.4",
+ "tmp@<=0.2.3": ">=0.2.4",
+ "electron@<35.7.5": ">=35.7.5",
+ "vite@>=6.0.0 <=6.3.5": ">=6.3.6",
+ "vite@>=6.0.0 <=6.4.0": ">=6.4.1"
+ }
}
}
diff --git a/desktop/pnpm-lock.yaml b/desktop/pnpm-lock.yaml
index 0952b12..1223200 100644
--- a/desktop/pnpm-lock.yaml
+++ b/desktop/pnpm-lock.yaml
@@ -4,6 +4,24 @@ settings:
autoInstallPeers: true
excludeLinksFromLockfile: false
+overrides:
+ esbuild@<=0.24.2: '>=0.25.0'
+ vite@>=6.1.0 <6.1.2: '>=6.1.2'
+ vite@>=6.1.0 <6.1.3: '>=6.1.3'
+ vite@>=6.1.0 <6.1.5: '>=6.1.5'
+ '@babel/runtime@<7.26.10': '>=7.26.10'
+ '@babel/helpers@<7.26.10': '>=7.26.10'
+ vite@>=6.0.0 <=6.1.5: '>=6.1.6'
+ vite@>=6.1.0 <6.1.4: '>=6.1.4'
+ brace-expansion@>=1.0.0 <=1.1.11: '>=1.1.12'
+ brace-expansion@>=2.0.0 <=2.0.1: '>=2.0.2'
+ form-data@>=4.0.0 <4.0.4: '>=4.0.4'
+ '@eslint/plugin-kit@<0.3.4': '>=0.3.4'
+ tmp@<=0.2.3: '>=0.2.4'
+ electron@<35.7.5: '>=35.7.5'
+ vite@>=6.0.0 <=6.3.5: '>=6.3.6'
+ vite@>=6.0.0 <=6.4.0: '>=6.4.1'
+
importers:
.:
@@ -13,13 +31,13 @@ importers:
version: 5.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
'@electron-toolkit/preload':
specifier: ^3.0.1
- version: 3.0.1(electron@34.2.0)
+ version: 3.0.1(electron@39.0.0)
'@electron-toolkit/utils':
specifier: ^4.0.0
- version: 4.0.0(electron@34.2.0)
+ version: 4.0.0(electron@39.0.0)
'@tailwindcss/vite':
specifier: ^4.0.6
- version: 4.0.6(vite@6.1.0(@types/node@22.13.4)(jiti@2.4.2)(lightningcss@1.29.1))
+ version: 4.0.6(vite@7.1.12(@types/node@22.13.4)(jiti@2.4.2)(lightningcss@1.29.1))
antd:
specifier: ^5.24.1
version: 5.24.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
@@ -86,16 +104,16 @@ importers:
version: 18.3.5(@types/react@18.3.18)
'@vitejs/plugin-react':
specifier: ^4.3.4
- version: 4.3.4(vite@6.1.0(@types/node@22.13.4)(jiti@2.4.2)(lightningcss@1.29.1))
+ version: 4.3.4(vite@7.1.12(@types/node@22.13.4)(jiti@2.4.2)(lightningcss@1.29.1))
electron:
- specifier: ^34.2.0
- version: 34.2.0
+ specifier: '>=35.7.5'
+ version: 39.0.0
electron-builder:
specifier: ^25.1.8
version: 25.1.8(electron-builder-squirrel-windows@25.1.8)
electron-vite:
- specifier: ^3.0.0
- version: 3.0.0(vite@6.1.0(@types/node@22.13.4)(jiti@2.4.2)(lightningcss@1.29.1))
+ specifier: ^4.0.1
+ version: 4.0.1(vite@7.1.12(@types/node@22.13.4)(jiti@2.4.2)(lightningcss@1.29.1))
eslint:
specifier: ^9.20.1
version: 9.20.1(jiti@2.4.2)
@@ -124,8 +142,8 @@ importers:
specifier: ^5.7.3
version: 5.7.3
vite:
- specifier: ^6.1.0
- version: 6.1.0(@types/node@22.13.4)(jiti@2.4.2)(lightningcss@1.29.1)
+ specifier: '>=6.4.1'
+ version: 7.1.12(@types/node@22.13.4)(jiti@2.4.2)(lightningcss@1.29.1)
packages:
@@ -174,50 +192,100 @@ packages:
resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==}
engines: {node: '>=6.9.0'}
+ '@babel/code-frame@7.27.1':
+ resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==}
+ engines: {node: '>=6.9.0'}
+
'@babel/compat-data@7.26.8':
resolution: {integrity: sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==}
engines: {node: '>=6.9.0'}
+ '@babel/compat-data@7.28.5':
+ resolution: {integrity: sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==}
+ engines: {node: '>=6.9.0'}
+
'@babel/core@7.26.9':
resolution: {integrity: sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw==}
engines: {node: '>=6.9.0'}
+ '@babel/core@7.28.5':
+ resolution: {integrity: sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==}
+ engines: {node: '>=6.9.0'}
+
'@babel/generator@7.26.9':
resolution: {integrity: sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg==}
engines: {node: '>=6.9.0'}
+ '@babel/generator@7.28.5':
+ resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==}
+ engines: {node: '>=6.9.0'}
+
'@babel/helper-compilation-targets@7.26.5':
resolution: {integrity: sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==}
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.25.9':
resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==}
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.26.0':
resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.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.26.5':
resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==}
engines: {node: '>=6.9.0'}
+ '@babel/helper-plugin-utils@7.27.1':
+ resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==}
+ engines: {node: '>=6.9.0'}
+
'@babel/helper-string-parser@7.25.9':
resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==}
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.25.9':
resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==}
engines: {node: '>=6.9.0'}
+ '@babel/helper-validator-identifier@7.28.5':
+ resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==}
+ engines: {node: '>=6.9.0'}
+
'@babel/helper-validator-option@7.25.9':
resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==}
engines: {node: '>=6.9.0'}
- '@babel/helpers@7.26.9':
- resolution: {integrity: sha512-Mz/4+y8udxBKdmzt/UjPACs4G3j5SshJJEFFKxlCGPydG4JAHXxjWjAwjd09tf6oINvl1VfMJo+nB7H2YKQ0dA==}
+ '@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.26.9':
@@ -225,8 +293,13 @@ packages:
engines: {node: '>=6.0.0'}
hasBin: true
- '@babel/plugin-transform-arrow-functions@7.25.9':
- resolution: {integrity: sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==}
+ '@babel/parser@7.28.5':
+ resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==}
+ engines: {node: '>=6.0.0'}
+ hasBin: true
+
+ '@babel/plugin-transform-arrow-functions@7.27.1':
+ resolution: {integrity: sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==}
engines: {node: '>=6.9.0'}
peerDependencies:
'@babel/core': ^7.0.0-0
@@ -243,22 +316,34 @@ packages:
peerDependencies:
'@babel/core': ^7.0.0-0
- '@babel/runtime@7.26.9':
- resolution: {integrity: sha512-aA63XwOkcl4xxQa3HjPMqOP6LiK0ZDv3mUPYEFXkpHbaFjtGggE1A61FjFzJnB+p7/oy2gA8E+rcBNl/zC1tMg==}
+ '@babel/runtime@7.28.4':
+ resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==}
engines: {node: '>=6.9.0'}
'@babel/template@7.26.9':
resolution: {integrity: sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==}
engines: {node: '>=6.9.0'}
+ '@babel/template@7.27.2':
+ resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==}
+ engines: {node: '>=6.9.0'}
+
'@babel/traverse@7.26.9':
resolution: {integrity: sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg==}
engines: {node: '>=6.9.0'}
+ '@babel/traverse@7.28.5':
+ resolution: {integrity: sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==}
+ engines: {node: '>=6.9.0'}
+
'@babel/types@7.26.9':
resolution: {integrity: sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==}
engines: {node: '>=6.9.0'}
+ '@babel/types@7.28.5':
+ resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==}
+ engines: {node: '>=6.9.0'}
+
'@develar/schema-utils@2.6.5':
resolution: {integrity: sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig==}
engines: {node: '>= 8.9.0'}
@@ -281,7 +366,7 @@ packages:
'@electron-toolkit/preload@3.0.1':
resolution: {integrity: sha512-EzoQmpK8jqqU8YnM5jRe0GJjGVJPke2KtANqz8QtN2JPT96ViOvProBdK5C6riCm0j1T8jjAGVQCZLQy9OVoIA==}
peerDependencies:
- electron: '>=13.0.0'
+ electron: '>=35.7.5'
'@electron-toolkit/tsconfig@1.0.1':
resolution: {integrity: sha512-M0Mol3odspvtCuheyujLNAW7bXq7KFNYVMRtpjFa4ZfES4MuklXBC7Nli/omvc+PRKlrklgAGx3l4VakjNo8jg==}
@@ -291,7 +376,7 @@ packages:
'@electron-toolkit/utils@4.0.0':
resolution: {integrity: sha512-qXSntwEzluSzKl4z5yFNBknmPGjPa3zFhE4mp9+h0cgokY5ornAeP+CJQDBhKsL1S58aOQfcwkD3NwLZCl+64g==}
peerDependencies:
- electron: '>=13.0.0'
+ electron: '>=35.7.5'
'@electron/asar@3.3.1':
resolution: {integrity: sha512-WtpC/+34p0skWZiarRjLAyqaAX78DofhDxnREy/V5XHfu1XEXbFCSSMcDQ6hNCPJFaPy8/NnUgYuf9uiCkvKPg==}
@@ -326,152 +411,158 @@ packages:
'@emotion/unitless@0.7.5':
resolution: {integrity: sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==}
- '@esbuild/aix-ppc64@0.24.2':
- resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==}
+ '@esbuild/aix-ppc64@0.25.11':
+ resolution: {integrity: sha512-Xt1dOL13m8u0WE8iplx9Ibbm+hFAO0GsU2P34UNoDGvZYkY8ifSiy6Zuc1lYxfG7svWE2fzqCUmFp5HCn51gJg==}
engines: {node: '>=18'}
cpu: [ppc64]
os: [aix]
- '@esbuild/android-arm64@0.24.2':
- resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==}
+ '@esbuild/android-arm64@0.25.11':
+ resolution: {integrity: sha512-9slpyFBc4FPPz48+f6jyiXOx/Y4v34TUeDDXJpZqAWQn/08lKGeD8aDp9TMn9jDz2CiEuHwfhRmGBvpnd/PWIQ==}
engines: {node: '>=18'}
cpu: [arm64]
os: [android]
- '@esbuild/android-arm@0.24.2':
- resolution: {integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==}
+ '@esbuild/android-arm@0.25.11':
+ resolution: {integrity: sha512-uoa7dU+Dt3HYsethkJ1k6Z9YdcHjTrSb5NUy66ZfZaSV8hEYGD5ZHbEMXnqLFlbBflLsl89Zke7CAdDJ4JI+Gg==}
engines: {node: '>=18'}
cpu: [arm]
os: [android]
- '@esbuild/android-x64@0.24.2':
- resolution: {integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==}
+ '@esbuild/android-x64@0.25.11':
+ resolution: {integrity: sha512-Sgiab4xBjPU1QoPEIqS3Xx+R2lezu0LKIEcYe6pftr56PqPygbB7+szVnzoShbx64MUupqoE0KyRlN7gezbl8g==}
engines: {node: '>=18'}
cpu: [x64]
os: [android]
- '@esbuild/darwin-arm64@0.24.2':
- resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==}
+ '@esbuild/darwin-arm64@0.25.11':
+ resolution: {integrity: sha512-VekY0PBCukppoQrycFxUqkCojnTQhdec0vevUL/EDOCnXd9LKWqD/bHwMPzigIJXPhC59Vd1WFIL57SKs2mg4w==}
engines: {node: '>=18'}
cpu: [arm64]
os: [darwin]
- '@esbuild/darwin-x64@0.24.2':
- resolution: {integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==}
+ '@esbuild/darwin-x64@0.25.11':
+ resolution: {integrity: sha512-+hfp3yfBalNEpTGp9loYgbknjR695HkqtY3d3/JjSRUyPg/xd6q+mQqIb5qdywnDxRZykIHs3axEqU6l1+oWEQ==}
engines: {node: '>=18'}
cpu: [x64]
os: [darwin]
- '@esbuild/freebsd-arm64@0.24.2':
- resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==}
+ '@esbuild/freebsd-arm64@0.25.11':
+ resolution: {integrity: sha512-CmKjrnayyTJF2eVuO//uSjl/K3KsMIeYeyN7FyDBjsR3lnSJHaXlVoAK8DZa7lXWChbuOk7NjAc7ygAwrnPBhA==}
engines: {node: '>=18'}
cpu: [arm64]
os: [freebsd]
- '@esbuild/freebsd-x64@0.24.2':
- resolution: {integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==}
+ '@esbuild/freebsd-x64@0.25.11':
+ resolution: {integrity: sha512-Dyq+5oscTJvMaYPvW3x3FLpi2+gSZTCE/1ffdwuM6G1ARang/mb3jvjxs0mw6n3Lsw84ocfo9CrNMqc5lTfGOw==}
engines: {node: '>=18'}
cpu: [x64]
os: [freebsd]
- '@esbuild/linux-arm64@0.24.2':
- resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==}
+ '@esbuild/linux-arm64@0.25.11':
+ resolution: {integrity: sha512-Qr8AzcplUhGvdyUF08A1kHU3Vr2O88xxP0Tm8GcdVOUm25XYcMPp2YqSVHbLuXzYQMf9Bh/iKx7YPqECs6ffLA==}
engines: {node: '>=18'}
cpu: [arm64]
os: [linux]
- '@esbuild/linux-arm@0.24.2':
- resolution: {integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==}
+ '@esbuild/linux-arm@0.25.11':
+ resolution: {integrity: sha512-TBMv6B4kCfrGJ8cUPo7vd6NECZH/8hPpBHHlYI3qzoYFvWu2AdTvZNuU/7hsbKWqu/COU7NIK12dHAAqBLLXgw==}
engines: {node: '>=18'}
cpu: [arm]
os: [linux]
- '@esbuild/linux-ia32@0.24.2':
- resolution: {integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==}
+ '@esbuild/linux-ia32@0.25.11':
+ resolution: {integrity: sha512-TmnJg8BMGPehs5JKrCLqyWTVAvielc615jbkOirATQvWWB1NMXY77oLMzsUjRLa0+ngecEmDGqt5jiDC6bfvOw==}
engines: {node: '>=18'}
cpu: [ia32]
os: [linux]
- '@esbuild/linux-loong64@0.24.2':
- resolution: {integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==}
+ '@esbuild/linux-loong64@0.25.11':
+ resolution: {integrity: sha512-DIGXL2+gvDaXlaq8xruNXUJdT5tF+SBbJQKbWy/0J7OhU8gOHOzKmGIlfTTl6nHaCOoipxQbuJi7O++ldrxgMw==}
engines: {node: '>=18'}
cpu: [loong64]
os: [linux]
- '@esbuild/linux-mips64el@0.24.2':
- resolution: {integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==}
+ '@esbuild/linux-mips64el@0.25.11':
+ resolution: {integrity: sha512-Osx1nALUJu4pU43o9OyjSCXokFkFbyzjXb6VhGIJZQ5JZi8ylCQ9/LFagolPsHtgw6himDSyb5ETSfmp4rpiKQ==}
engines: {node: '>=18'}
cpu: [mips64el]
os: [linux]
- '@esbuild/linux-ppc64@0.24.2':
- resolution: {integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==}
+ '@esbuild/linux-ppc64@0.25.11':
+ resolution: {integrity: sha512-nbLFgsQQEsBa8XSgSTSlrnBSrpoWh7ioFDUmwo158gIm5NNP+17IYmNWzaIzWmgCxq56vfr34xGkOcZ7jX6CPw==}
engines: {node: '>=18'}
cpu: [ppc64]
os: [linux]
- '@esbuild/linux-riscv64@0.24.2':
- resolution: {integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==}
+ '@esbuild/linux-riscv64@0.25.11':
+ resolution: {integrity: sha512-HfyAmqZi9uBAbgKYP1yGuI7tSREXwIb438q0nqvlpxAOs3XnZ8RsisRfmVsgV486NdjD7Mw2UrFSw51lzUk1ww==}
engines: {node: '>=18'}
cpu: [riscv64]
os: [linux]
- '@esbuild/linux-s390x@0.24.2':
- resolution: {integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==}
+ '@esbuild/linux-s390x@0.25.11':
+ resolution: {integrity: sha512-HjLqVgSSYnVXRisyfmzsH6mXqyvj0SA7pG5g+9W7ESgwA70AXYNpfKBqh1KbTxmQVaYxpzA/SvlB9oclGPbApw==}
engines: {node: '>=18'}
cpu: [s390x]
os: [linux]
- '@esbuild/linux-x64@0.24.2':
- resolution: {integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==}
+ '@esbuild/linux-x64@0.25.11':
+ resolution: {integrity: sha512-HSFAT4+WYjIhrHxKBwGmOOSpphjYkcswF449j6EjsjbinTZbp8PJtjsVK1XFJStdzXdy/jaddAep2FGY+wyFAQ==}
engines: {node: '>=18'}
cpu: [x64]
os: [linux]
- '@esbuild/netbsd-arm64@0.24.2':
- resolution: {integrity: sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==}
+ '@esbuild/netbsd-arm64@0.25.11':
+ resolution: {integrity: sha512-hr9Oxj1Fa4r04dNpWr3P8QKVVsjQhqrMSUzZzf+LZcYjZNqhA3IAfPQdEh1FLVUJSiu6sgAwp3OmwBfbFgG2Xg==}
engines: {node: '>=18'}
cpu: [arm64]
os: [netbsd]
- '@esbuild/netbsd-x64@0.24.2':
- resolution: {integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==}
+ '@esbuild/netbsd-x64@0.25.11':
+ resolution: {integrity: sha512-u7tKA+qbzBydyj0vgpu+5h5AeudxOAGncb8N6C9Kh1N4n7wU1Xw1JDApsRjpShRpXRQlJLb9wY28ELpwdPcZ7A==}
engines: {node: '>=18'}
cpu: [x64]
os: [netbsd]
- '@esbuild/openbsd-arm64@0.24.2':
- resolution: {integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==}
+ '@esbuild/openbsd-arm64@0.25.11':
+ resolution: {integrity: sha512-Qq6YHhayieor3DxFOoYM1q0q1uMFYb7cSpLD2qzDSvK1NAvqFi8Xgivv0cFC6J+hWVw2teCYltyy9/m/14ryHg==}
engines: {node: '>=18'}
cpu: [arm64]
os: [openbsd]
- '@esbuild/openbsd-x64@0.24.2':
- resolution: {integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==}
+ '@esbuild/openbsd-x64@0.25.11':
+ resolution: {integrity: sha512-CN+7c++kkbrckTOz5hrehxWN7uIhFFlmS/hqziSFVWpAzpWrQoAG4chH+nN3Be+Kzv/uuo7zhX716x3Sn2Jduw==}
engines: {node: '>=18'}
cpu: [x64]
os: [openbsd]
- '@esbuild/sunos-x64@0.24.2':
- resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==}
+ '@esbuild/openharmony-arm64@0.25.11':
+ resolution: {integrity: sha512-rOREuNIQgaiR+9QuNkbkxubbp8MSO9rONmwP5nKncnWJ9v5jQ4JxFnLu4zDSRPf3x4u+2VN4pM4RdyIzDty/wQ==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [openharmony]
+
+ '@esbuild/sunos-x64@0.25.11':
+ resolution: {integrity: sha512-nq2xdYaWxyg9DcIyXkZhcYulC6pQ2FuCgem3LI92IwMgIZ69KHeY8T4Y88pcwoLIjbed8n36CyKoYRDygNSGhA==}
engines: {node: '>=18'}
cpu: [x64]
os: [sunos]
- '@esbuild/win32-arm64@0.24.2':
- resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==}
+ '@esbuild/win32-arm64@0.25.11':
+ resolution: {integrity: sha512-3XxECOWJq1qMZ3MN8srCJ/QfoLpL+VaxD/WfNRm1O3B4+AZ/BnLVgFbUV3eiRYDMXetciH16dwPbbHqwe1uU0Q==}
engines: {node: '>=18'}
cpu: [arm64]
os: [win32]
- '@esbuild/win32-ia32@0.24.2':
- resolution: {integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==}
+ '@esbuild/win32-ia32@0.25.11':
+ resolution: {integrity: sha512-3ukss6gb9XZ8TlRyJlgLn17ecsK4NSQTmdIXRASVsiS2sQ6zPPZklNJT5GR5tE/MUarymmy8kCEf5xPCNCqVOA==}
engines: {node: '>=18'}
cpu: [ia32]
os: [win32]
- '@esbuild/win32-x64@0.24.2':
- resolution: {integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==}
+ '@esbuild/win32-x64@0.25.11':
+ resolution: {integrity: sha512-D7Hpz6A2L4hzsRpPaCYkQnGOotdUpDzSGRIv9I+1ITdHROSFUWW95ZPZWQmGka1Fg7W3zFJowyn9WGwMJ0+KPA==}
engines: {node: '>=18'}
cpu: [x64]
os: [win32]
@@ -490,14 +581,14 @@ packages:
resolution: {integrity: sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@eslint/core@0.10.0':
- resolution: {integrity: sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw==}
- engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
-
'@eslint/core@0.11.0':
resolution: {integrity: sha512-DWUB2pksgNEb6Bz2fggIy1wh6fGgZP4Xyy/Mt0QZPiloKKXerbqq9D3SBQTlCRYOrcRPu4vuz+CGjwdfqxnoWA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ '@eslint/core@0.17.0':
+ resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==}
+ engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+
'@eslint/eslintrc@3.2.0':
resolution: {integrity: sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
@@ -510,8 +601,8 @@ packages:
resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@eslint/plugin-kit@0.2.5':
- resolution: {integrity: sha512-lB05FkqEdUg2AA0xEbUz0SnkXT1LcCTa438W4IWTUh4hdOnVbQyOJ81OrDXsJk/LSiJHubgGEFoR5EHq1NsH1A==}
+ '@eslint/plugin-kit@0.4.1':
+ resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@gar/promisify@1.1.3':
@@ -550,10 +641,16 @@ packages:
resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==}
engines: {node: '>=12'}
+ '@jridgewell/gen-mapping@0.3.13':
+ resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==}
+
'@jridgewell/gen-mapping@0.3.8':
resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==}
engines: {node: '>=6.0.0'}
+ '@jridgewell/remapping@2.3.5':
+ resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==}
+
'@jridgewell/resolve-uri@3.1.2':
resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
engines: {node: '>=6.0.0'}
@@ -565,9 +662,15 @@ packages:
'@jridgewell/sourcemap-codec@1.5.0':
resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==}
+ '@jridgewell/sourcemap-codec@1.5.5':
+ resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==}
+
'@jridgewell/trace-mapping@0.3.25':
resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==}
+ '@jridgewell/trace-mapping@0.3.31':
+ resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==}
+
'@malept/cross-spawn-promise@2.0.0':
resolution: {integrity: sha512-1DpKU0Z5ThltBwjNySMC14g0CkbyhCaz9FkhxqNsZI6uAPJXFS8cMXlBKo26FJ8ZuW6S9GCMcR9IO5k2X5/9Fg==}
engines: {node: '>= 12.13.0'}
@@ -822,98 +925,113 @@ packages:
react: '>=16.9.0'
react-dom: '>=16.9.0'
- '@rollup/rollup-android-arm-eabi@4.34.8':
- resolution: {integrity: sha512-q217OSE8DTp8AFHuNHXo0Y86e1wtlfVrXiAlwkIvGRQv9zbc6mE3sjIVfwI8sYUyNxwOg0j/Vm1RKM04JcWLJw==}
+ '@rollup/rollup-android-arm-eabi@4.52.5':
+ resolution: {integrity: sha512-8c1vW4ocv3UOMp9K+gToY5zL2XiiVw3k7f1ksf4yO1FlDFQ1C2u72iACFnSOceJFsWskc2WZNqeRhFRPzv+wtQ==}
cpu: [arm]
os: [android]
- '@rollup/rollup-android-arm64@4.34.8':
- resolution: {integrity: sha512-Gigjz7mNWaOL9wCggvoK3jEIUUbGul656opstjaUSGC3eT0BM7PofdAJaBfPFWWkXNVAXbaQtC99OCg4sJv70Q==}
+ '@rollup/rollup-android-arm64@4.52.5':
+ resolution: {integrity: sha512-mQGfsIEFcu21mvqkEKKu2dYmtuSZOBMmAl5CFlPGLY94Vlcm+zWApK7F/eocsNzp8tKmbeBP8yXyAbx0XHsFNA==}
cpu: [arm64]
os: [android]
- '@rollup/rollup-darwin-arm64@4.34.8':
- resolution: {integrity: sha512-02rVdZ5tgdUNRxIUrFdcMBZQoaPMrxtwSb+/hOfBdqkatYHR3lZ2A2EGyHq2sGOd0Owk80oV3snlDASC24He3Q==}
+ '@rollup/rollup-darwin-arm64@4.52.5':
+ resolution: {integrity: sha512-takF3CR71mCAGA+v794QUZ0b6ZSrgJkArC+gUiG6LB6TQty9T0Mqh3m2ImRBOxS2IeYBo4lKWIieSvnEk2OQWA==}
cpu: [arm64]
os: [darwin]
- '@rollup/rollup-darwin-x64@4.34.8':
- resolution: {integrity: sha512-qIP/elwR/tq/dYRx3lgwK31jkZvMiD6qUtOycLhTzCvrjbZ3LjQnEM9rNhSGpbLXVJYQ3rq39A6Re0h9tU2ynw==}
+ '@rollup/rollup-darwin-x64@4.52.5':
+ resolution: {integrity: sha512-W901Pla8Ya95WpxDn//VF9K9u2JbocwV/v75TE0YIHNTbhqUTv9w4VuQ9MaWlNOkkEfFwkdNhXgcLqPSmHy0fA==}
cpu: [x64]
os: [darwin]
- '@rollup/rollup-freebsd-arm64@4.34.8':
- resolution: {integrity: sha512-IQNVXL9iY6NniYbTaOKdrlVP3XIqazBgJOVkddzJlqnCpRi/yAeSOa8PLcECFSQochzqApIOE1GHNu3pCz+BDA==}
+ '@rollup/rollup-freebsd-arm64@4.52.5':
+ resolution: {integrity: sha512-QofO7i7JycsYOWxe0GFqhLmF6l1TqBswJMvICnRUjqCx8b47MTo46W8AoeQwiokAx3zVryVnxtBMcGcnX12LvA==}
cpu: [arm64]
os: [freebsd]
- '@rollup/rollup-freebsd-x64@4.34.8':
- resolution: {integrity: sha512-TYXcHghgnCqYFiE3FT5QwXtOZqDj5GmaFNTNt3jNC+vh22dc/ukG2cG+pi75QO4kACohZzidsq7yKTKwq/Jq7Q==}
+ '@rollup/rollup-freebsd-x64@4.52.5':
+ resolution: {integrity: sha512-jr21b/99ew8ujZubPo9skbrItHEIE50WdV86cdSoRkKtmWa+DDr6fu2c/xyRT0F/WazZpam6kk7IHBerSL7LDQ==}
cpu: [x64]
os: [freebsd]
- '@rollup/rollup-linux-arm-gnueabihf@4.34.8':
- resolution: {integrity: sha512-A4iphFGNkWRd+5m3VIGuqHnG3MVnqKe7Al57u9mwgbyZ2/xF9Jio72MaY7xxh+Y87VAHmGQr73qoKL9HPbXj1g==}
+ '@rollup/rollup-linux-arm-gnueabihf@4.52.5':
+ resolution: {integrity: sha512-PsNAbcyv9CcecAUagQefwX8fQn9LQ4nZkpDboBOttmyffnInRy8R8dSg6hxxl2Re5QhHBf6FYIDhIj5v982ATQ==}
cpu: [arm]
os: [linux]
- '@rollup/rollup-linux-arm-musleabihf@4.34.8':
- resolution: {integrity: sha512-S0lqKLfTm5u+QTxlFiAnb2J/2dgQqRy/XvziPtDd1rKZFXHTyYLoVL58M/XFwDI01AQCDIevGLbQrMAtdyanpA==}
+ '@rollup/rollup-linux-arm-musleabihf@4.52.5':
+ resolution: {integrity: sha512-Fw4tysRutyQc/wwkmcyoqFtJhh0u31K+Q6jYjeicsGJJ7bbEq8LwPWV/w0cnzOqR2m694/Af6hpFayLJZkG2VQ==}
cpu: [arm]
os: [linux]
- '@rollup/rollup-linux-arm64-gnu@4.34.8':
- resolution: {integrity: sha512-jpz9YOuPiSkL4G4pqKrus0pn9aYwpImGkosRKwNi+sJSkz+WU3anZe6hi73StLOQdfXYXC7hUfsQlTnjMd3s1A==}
+ '@rollup/rollup-linux-arm64-gnu@4.52.5':
+ resolution: {integrity: sha512-a+3wVnAYdQClOTlyapKmyI6BLPAFYs0JM8HRpgYZQO02rMR09ZcV9LbQB+NL6sljzG38869YqThrRnfPMCDtZg==}
cpu: [arm64]
os: [linux]
- '@rollup/rollup-linux-arm64-musl@4.34.8':
- resolution: {integrity: sha512-KdSfaROOUJXgTVxJNAZ3KwkRc5nggDk+06P6lgi1HLv1hskgvxHUKZ4xtwHkVYJ1Rep4GNo+uEfycCRRxht7+Q==}
+ '@rollup/rollup-linux-arm64-musl@4.52.5':
+ resolution: {integrity: sha512-AvttBOMwO9Pcuuf7m9PkC1PUIKsfaAJ4AYhy944qeTJgQOqJYJ9oVl2nYgY7Rk0mkbsuOpCAYSs6wLYB2Xiw0Q==}
cpu: [arm64]
os: [linux]
- '@rollup/rollup-linux-loongarch64-gnu@4.34.8':
- resolution: {integrity: sha512-NyF4gcxwkMFRjgXBM6g2lkT58OWztZvw5KkV2K0qqSnUEqCVcqdh2jN4gQrTn/YUpAcNKyFHfoOZEer9nwo6uQ==}
+ '@rollup/rollup-linux-loong64-gnu@4.52.5':
+ resolution: {integrity: sha512-DkDk8pmXQV2wVrF6oq5tONK6UHLz/XcEVow4JTTerdeV1uqPeHxwcg7aFsfnSm9L+OO8WJsWotKM2JJPMWrQtA==}
cpu: [loong64]
os: [linux]
- '@rollup/rollup-linux-powerpc64le-gnu@4.34.8':
- resolution: {integrity: sha512-LMJc999GkhGvktHU85zNTDImZVUCJ1z/MbAJTnviiWmmjyckP5aQsHtcujMjpNdMZPT2rQEDBlJfubhs3jsMfw==}
+ '@rollup/rollup-linux-ppc64-gnu@4.52.5':
+ resolution: {integrity: sha512-W/b9ZN/U9+hPQVvlGwjzi+Wy4xdoH2I8EjaCkMvzpI7wJUs8sWJ03Rq96jRnHkSrcHTpQe8h5Tg3ZzUPGauvAw==}
cpu: [ppc64]
os: [linux]
- '@rollup/rollup-linux-riscv64-gnu@4.34.8':
- resolution: {integrity: sha512-xAQCAHPj8nJq1PI3z8CIZzXuXCstquz7cIOL73HHdXiRcKk8Ywwqtx2wrIy23EcTn4aZ2fLJNBB8d0tQENPCmw==}
+ '@rollup/rollup-linux-riscv64-gnu@4.52.5':
+ resolution: {integrity: sha512-sjQLr9BW7R/ZiXnQiWPkErNfLMkkWIoCz7YMn27HldKsADEKa5WYdobaa1hmN6slu9oWQbB6/jFpJ+P2IkVrmw==}
cpu: [riscv64]
os: [linux]
- '@rollup/rollup-linux-s390x-gnu@4.34.8':
- resolution: {integrity: sha512-DdePVk1NDEuc3fOe3dPPTb+rjMtuFw89gw6gVWxQFAuEqqSdDKnrwzZHrUYdac7A7dXl9Q2Vflxpme15gUWQFA==}
+ '@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==}
cpu: [s390x]
os: [linux]
- '@rollup/rollup-linux-x64-gnu@4.34.8':
- resolution: {integrity: sha512-8y7ED8gjxITUltTUEJLQdgpbPh1sUQ0kMTmufRF/Ns5tI9TNMNlhWtmPKKHCU0SilX+3MJkZ0zERYYGIVBYHIA==}
+ '@rollup/rollup-linux-x64-gnu@4.52.5':
+ resolution: {integrity: sha512-hXGLYpdhiNElzN770+H2nlx+jRog8TyynpTVzdlc6bndktjKWyZyiCsuDAlpd+j+W+WNqfcyAWz9HxxIGfZm1Q==}
cpu: [x64]
os: [linux]
- '@rollup/rollup-linux-x64-musl@4.34.8':
- resolution: {integrity: sha512-SCXcP0ZpGFIe7Ge+McxY5zKxiEI5ra+GT3QRxL0pMMtxPfpyLAKleZODi1zdRHkz5/BhueUrYtYVgubqe9JBNQ==}
+ '@rollup/rollup-linux-x64-musl@4.52.5':
+ resolution: {integrity: sha512-arCGIcuNKjBoKAXD+y7XomR9gY6Mw7HnFBv5Rw7wQRvwYLR7gBAgV7Mb2QTyjXfTveBNFAtPt46/36vV9STLNg==}
cpu: [x64]
os: [linux]
- '@rollup/rollup-win32-arm64-msvc@4.34.8':
- resolution: {integrity: sha512-YHYsgzZgFJzTRbth4h7Or0m5O74Yda+hLin0irAIobkLQFRQd1qWmnoVfwmKm9TXIZVAD0nZ+GEb2ICicLyCnQ==}
+ '@rollup/rollup-openharmony-arm64@4.52.5':
+ resolution: {integrity: sha512-QoFqB6+/9Rly/RiPjaomPLmR/13cgkIGfA40LHly9zcH1S0bN2HVFYk3a1eAyHQyjs3ZJYlXvIGtcCs5tko9Cw==}
+ cpu: [arm64]
+ os: [openharmony]
+
+ '@rollup/rollup-win32-arm64-msvc@4.52.5':
+ resolution: {integrity: sha512-w0cDWVR6MlTstla1cIfOGyl8+qb93FlAVutcor14Gf5Md5ap5ySfQ7R9S/NjNaMLSFdUnKGEasmVnu3lCMqB7w==}
cpu: [arm64]
os: [win32]
- '@rollup/rollup-win32-ia32-msvc@4.34.8':
- resolution: {integrity: sha512-r3NRQrXkHr4uWy5TOjTpTYojR9XmF0j/RYgKCef+Ag46FWUTltm5ziticv8LdNsDMehjJ543x/+TJAek/xBA2w==}
+ '@rollup/rollup-win32-ia32-msvc@4.52.5':
+ resolution: {integrity: sha512-Aufdpzp7DpOTULJCuvzqcItSGDH73pF3ko/f+ckJhxQyHtp67rHw3HMNxoIdDMUITJESNE6a8uh4Lo4SLouOUg==}
cpu: [ia32]
os: [win32]
- '@rollup/rollup-win32-x64-msvc@4.34.8':
- resolution: {integrity: sha512-U0FaE5O1BCpZSeE6gBl3c5ObhePQSfk9vDRToMmTkbhCOgW4jqvtS5LGyQ76L1fH8sM0keRp4uDTsbjiUyjk0g==}
+ '@rollup/rollup-win32-x64-gnu@4.52.5':
+ resolution: {integrity: sha512-UGBUGPFp1vkj6p8wCRraqNhqwX/4kNQPS57BCFc8wYh0g94iVIW33wJtQAx3G7vrjjNtRaxiMUylM0ktp/TRSQ==}
+ cpu: [x64]
+ os: [win32]
+
+ '@rollup/rollup-win32-x64-msvc@4.52.5':
+ resolution: {integrity: sha512-TAcgQh2sSkykPRWLrdyy2AiceMckNf5loITqXxFI5VuQjS5tSuw3WlwdN8qv8vzjLAUTvYaH/mVjSFpbkFbpTg==}
cpu: [x64]
os: [win32]
@@ -1065,7 +1183,7 @@ packages:
'@tailwindcss/vite@4.0.6':
resolution: {integrity: sha512-O25vZ/URWbZ2JHdk2o8wH7jOKqEGCsYmX3GwGmYS5DjE4X3mpf93a72Rn7VRnefldNauBzr5z2hfZptmBNtTUQ==}
peerDependencies:
- vite: ^5.2.0 || ^6
+ vite: '>=6.4.1'
'@tootallnate/once@2.0.0':
resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==}
@@ -1092,6 +1210,9 @@ packages:
'@types/estree@1.0.6':
resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==}
+ '@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==}
@@ -1107,9 +1228,6 @@ packages:
'@types/ms@2.1.0':
resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==}
- '@types/node@20.17.19':
- resolution: {integrity: sha512-LEwC7o1ifqg/6r2gn9Dns0f1rhK+fPFDoMiceTJ6kWmVk6bgXBI/9IOWfVan4WiAavK9pIVWdX0/e3J+eEUh5A==}
-
'@types/node@22.13.4':
resolution: {integrity: sha512-ywP2X0DYtX3y08eFVx5fNIw7/uIv8hYUKgXoK8oayJlLnKcRfEYCxWMVE1XagUdVtCJlZT1AU4LXEABW+L1Peg==}
@@ -1187,7 +1305,7 @@ packages:
resolution: {integrity: sha512-SCCPBJtYLdE8PX/7ZQAs1QAZ8Jqwih+0VBLum1EGqmCCQal+MIUqLCzj3ZUy8ufbC0cAM4LRlSTm7IQJwWT4ug==}
engines: {node: ^14.18.0 || >=16.0.0}
peerDependencies:
- vite: ^4.2.0 || ^5.0.0 || ^6.0.0
+ vite: '>=6.4.1'
'@xmldom/xmldom@0.8.10':
resolution: {integrity: sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==}
@@ -1347,12 +1465,17 @@ packages:
resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==}
engines: {node: '>= 0.4'}
- balanced-match@1.0.2:
- resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
+ balanced-match@3.0.1:
+ resolution: {integrity: sha512-vjtV3hiLqYDNRoiAv0zC4QaGAMPomEoq83PRmYIofPswwZurCeWR5LByXm7SyoL0Zh5+2z0+HC7jG8gSZJUh0w==}
+ engines: {node: '>= 16'}
base64-js@1.5.1:
resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
+ baseline-browser-mapping@2.8.21:
+ resolution: {integrity: sha512-JU0h5APyQNsHOlAM7HnQnPToSDQoEBZqzu/YBlqDnEeymPnZDREeXJA3KBMQee+dKteAxZ2AtvQEvVYdZf241Q==}
+ hasBin: true
+
bl@4.1.0:
resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==}
@@ -1366,11 +1489,9 @@ packages:
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.11:
- resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
-
- brace-expansion@2.0.1:
- resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==}
+ brace-expansion@4.0.1:
+ resolution: {integrity: sha512-YClrbvTCXGe70pU2JiEiPLYXO9gQkyxYeKpJIQHVS/gOs6EWMQP2RYBwjFLNT322Ji8TOC3IMPfsYCedNpzKfA==}
+ engines: {node: '>= 18'}
braces@3.0.3:
resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
@@ -1381,6 +1502,11 @@ packages:
engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
hasBin: true
+ browserslist@4.27.0:
+ resolution: {integrity: sha512-AXVQwdhot1eqLihwasPElhX2tAZiBjWdJ9i/Zcj2S6QYIjkx62OKSfnobkriB81C3l4w0rVy3Nt4jaTBltYEpw==}
+ engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
+ hasBin: true
+
buffer-crc32@0.2.13:
resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==}
@@ -1432,6 +1558,9 @@ packages:
caniuse-lite@1.0.30001700:
resolution: {integrity: sha512-2S6XIXwaE7K7erT8dY+kLQcpa5ms63XlRkMkReXjle+kf6c5g38vyMl+Z5y8dSxOFDhcFe+nxnn261PLxBSQsQ==}
+ caniuse-lite@1.0.30001751:
+ resolution: {integrity: sha512-A0QJhug0Ly64Ii3eIqHu5X51ebln3k4yTUkY1j8drqpWHVreg/VLijN48cZ1bYPiqOQuqpkIKnzr/Ul8V+p6Cw==}
+
chalk@4.1.2:
resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
engines: {node: '>=10'}
@@ -1511,9 +1640,6 @@ packages:
compute-scroll-into-view@3.1.1:
resolution: {integrity: sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw==}
- concat-map@0.0.1:
- resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
-
config-file-ts@0.2.8-rc1:
resolution: {integrity: sha512-GtNECbVI82bT4RiDIzBSVuTKoSHufnU7Ce7/42bkWZJZFLjmDF2WBpVsvRkhKCfKBnTBb3qZrBwPpFBU/Myvhg==}
@@ -1578,6 +1704,15 @@ packages:
supports-color:
optional: true
+ debug@4.4.3:
+ resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==}
+ engines: {node: '>=6.0'}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+
decompress-response@6.0.0:
resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==}
engines: {node: '>=10'}
@@ -1676,22 +1811,25 @@ packages:
electron-to-chromium@1.5.102:
resolution: {integrity: sha512-eHhqaja8tE/FNpIiBrvBjFV/SSKpyWHLvxuR9dPTdo+3V9ppdLmFB7ZZQ98qNovcngPLYIz0oOBF9P0FfZef5Q==}
+ electron-to-chromium@1.5.243:
+ resolution: {integrity: sha512-ZCphxFW3Q1TVhcgS9blfut1PX8lusVi2SvXQgmEEnK4TCmE1JhH2JkjJN+DNt0pJJwfBri5AROBnz2b/C+YU9g==}
+
electron-updater@6.3.9:
resolution: {integrity: sha512-2PJNONi+iBidkoC5D1nzT9XqsE8Q1X28Fn6xRQhO3YX8qRRyJ3mkV4F1aQsuRnYPqq6Hw+E51y27W75WgDoofw==}
- electron-vite@3.0.0:
- resolution: {integrity: sha512-Uf8NpF4OB2Juo1Vq8pobkLVp9BZTO70VwkW7fKXSCkod0SRkc7Dkw7ddR6b1fbsgT7lcZ0HD29WRxsCcbkHXUw==}
- engines: {node: ^18.0.0 || >=20.0.0}
+ electron-vite@4.0.1:
+ resolution: {integrity: sha512-QqacJbA8f1pmwUTqki1qLL5vIBaOQmeq13CZZefZ3r3vKVaIoC7cpoTgE+KPKxJDFTax+iFZV0VYvLVWPiQ8Aw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
hasBin: true
peerDependencies:
'@swc/core': ^1.0.0
- vite: ^4.0.0 || ^5.0.0 || ^6.0.0
+ vite: '>=6.4.1'
peerDependenciesMeta:
'@swc/core':
optional: true
- electron@34.2.0:
- resolution: {integrity: sha512-SYwBJNeXBTm1q/ErybQMUBZAYqEreBUqBwTrNkw1rV4YatDZk5Aittpcus3PPeC4UoI/tqmJ946uG8AKHTd6CA==}
+ electron@39.0.0:
+ resolution: {integrity: sha512-UejnuOK4jpRZUq7MkEAnR/szsRWLKBJAdvn6j3xdQLT57fVv13VSNdaUHHjSheaqGzNhCGIdkPsPJnGJVh5kiA==}
engines: {node: '>= 12.20.55'}
hasBin: true
@@ -1707,6 +1845,9 @@ packages:
end-of-stream@1.4.4:
resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==}
+ end-of-stream@1.4.5:
+ resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==}
+
enhanced-resolve@5.18.1:
resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==}
engines: {node: '>=10.13.0'}
@@ -1753,8 +1894,8 @@ packages:
es6-error@4.1.1:
resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==}
- esbuild@0.24.2:
- resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==}
+ esbuild@0.25.11:
+ resolution: {integrity: sha512-KohQwyzrKTQmhXDW1PjCv3Tyspn9n5GcY2RTDqeORIdIJY8yKIF7sTSopFmn/wpMPW4rdPXI0UE5LJLuq3bx0Q==}
engines: {node: '>=18'}
hasBin: true
@@ -1879,6 +2020,15 @@ packages:
fd-slicer@1.1.0:
resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==}
+ fdir@6.5.0:
+ resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==}
+ engines: {node: '>=12.0.0'}
+ peerDependencies:
+ picomatch: ^3 || ^4
+ peerDependenciesMeta:
+ picomatch:
+ optional: true
+
file-entry-cache@8.0.0:
resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==}
engines: {node: '>=16.0.0'}
@@ -1909,8 +2059,8 @@ packages:
resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==}
engines: {node: '>=14'}
- form-data@4.0.2:
- resolution: {integrity: sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==}
+ form-data@4.0.4:
+ resolution: {integrity: sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==}
engines: {node: '>= 6'}
fs-constants@1.0.0:
@@ -2508,8 +2658,8 @@ packages:
peerDependencies:
react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0
- magic-string@0.30.17:
- resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==}
+ magic-string@0.30.21:
+ resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==}
make-fetch-happen@10.2.1:
resolution: {integrity: sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==}
@@ -2621,8 +2771,8 @@ packages:
ms@2.1.3:
resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
- nanoid@3.3.8:
- resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==}
+ nanoid@3.3.11:
+ resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==}
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
hasBin: true
@@ -2659,6 +2809,9 @@ packages:
node-releases@2.0.19:
resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==}
+ node-releases@2.0.27:
+ resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==}
+
nopt@6.0.0:
resolution: {integrity: sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==}
engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
@@ -2780,6 +2933,10 @@ packages:
resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
engines: {node: '>=8.6'}
+ picomatch@4.0.3:
+ resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==}
+ engines: {node: '>=12'}
+
plist@3.1.0:
resolution: {integrity: sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==}
engines: {node: '>=10.4.0'}
@@ -2788,8 +2945,8 @@ packages:
resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==}
engines: {node: '>= 0.4'}
- postcss@8.5.2:
- resolution: {integrity: sha512-MjOadfU3Ys9KYoX0AdkBlFEF1Vx37uCCeN4ZHnmwm9FfpbsGWMZeBLMmmpY+6Ocqod7mkdZ0DT31OlbsFrLlkA==}
+ postcss@8.5.6:
+ resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==}
engines: {node: ^10 || ^12 || >=14}
prelude-ls@1.2.1:
@@ -3216,9 +3373,6 @@ packages:
resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==}
engines: {node: '>= 0.4'}
- regenerator-runtime@0.14.1:
- resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==}
-
regexp.prototype.flags@1.5.4:
resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==}
engines: {node: '>= 0.4'}
@@ -3269,8 +3423,8 @@ packages:
resolution: {integrity: sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==}
engines: {node: '>=8.0'}
- rollup@4.34.8:
- resolution: {integrity: sha512-489gTVMzAYdiZHFVA/ig/iYFllCcWFHMvUHI1rpFmkoUtRlQxqh6/yiNqnYibjMZ2b/+FUQwldG+aLsEt6bglQ==}
+ rollup@4.52.5:
+ resolution: {integrity: sha512-3GuObel8h7Kqdjt0gxkEzaifHTqLVW56Y/bjN7PSQtkKr0w3V/QYSdt6QWYtd7A1xUtYQigtdUfgj1RvWVtorw==}
engines: {node: '>=18.0.0', npm: '>=8.0.0'}
hasBin: true
@@ -3513,11 +3667,15 @@ packages:
tiny-typed-emitter@2.1.0:
resolution: {integrity: sha512-qVtvMxeXbVej0cQWKqVSSAHmKZEHAvxdF8HEUBFWts8h+xEo5m/lEiPakuyZ3BnCBjOD8i24kzNOiOLLgsSxhA==}
+ tinyglobby@0.2.15:
+ resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==}
+ engines: {node: '>=12.0.0'}
+
tmp-promise@3.0.3:
resolution: {integrity: sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==}
- tmp@0.2.3:
- resolution: {integrity: sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==}
+ tmp@0.2.5:
+ resolution: {integrity: sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==}
engines: {node: '>=14.14'}
to-regex-range@5.0.1:
@@ -3579,9 +3737,6 @@ packages:
resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==}
engines: {node: '>= 0.4'}
- undici-types@6.19.8:
- resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==}
-
undici-types@6.20.0:
resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==}
@@ -3607,6 +3762,12 @@ packages:
peerDependencies:
browserslist: '>= 4.21.0'
+ update-browserslist-db@1.1.4:
+ resolution: {integrity: sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==}
+ hasBin: true
+ peerDependencies:
+ browserslist: '>= 4.21.0'
+
uri-js@4.4.1:
resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
@@ -3646,19 +3807,19 @@ packages:
resolution: {integrity: sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==}
engines: {node: '>=0.6.0'}
- vite@6.1.0:
- resolution: {integrity: sha512-RjjMipCKVoR4hVfPY6GQTgveinjNuyLw+qruksLDvA5ktI1150VmcMBKmQaEWJhg/j6Uaf6dNCNA0AfdzUb/hQ==}
- engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0}
+ vite@7.1.12:
+ resolution: {integrity: sha512-ZWyE8YXEXqJrrSLvYgrRP7p62OziLW7xI5HYGWFzOvupfAlrLvURSzv/FyGyy0eidogEM3ujU+kUG1zuHgb6Ug==}
+ engines: {node: ^20.19.0 || >=22.12.0}
hasBin: true
peerDependencies:
- '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0
+ '@types/node': ^20.19.0 || >=22.12.0
jiti: '>=1.21.0'
- less: '*'
+ less: ^4.0.0
lightningcss: ^1.21.0
- sass: '*'
- sass-embedded: '*'
- stylus: '*'
- sugarss: '*'
+ sass: ^1.70.0
+ sass-embedded: ^1.70.0
+ stylus: '>=0.54.8'
+ sugarss: ^5.0.0
terser: ^5.16.0
tsx: ^4.8.1
yaml: ^2.4.2
@@ -3781,14 +3942,14 @@ snapshots:
'@ant-design/cssinjs-utils@1.1.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
dependencies:
'@ant-design/cssinjs': 1.23.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@babel/runtime': 7.26.9
+ '@babel/runtime': 7.28.4
rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
'@ant-design/cssinjs@1.23.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
dependencies:
- '@babel/runtime': 7.26.9
+ '@babel/runtime': 7.28.4
'@emotion/hash': 0.8.0
'@emotion/unitless': 0.7.5
classnames: 2.5.1
@@ -3800,7 +3961,7 @@ snapshots:
'@ant-design/fast-color@2.0.6':
dependencies:
- '@babel/runtime': 7.26.9
+ '@babel/runtime': 7.28.4
'@ant-design/icons-svg@4.4.2': {}
@@ -3808,7 +3969,7 @@ snapshots:
dependencies:
'@ant-design/colors': 7.2.0
'@ant-design/icons-svg': 4.4.2
- '@babel/runtime': 7.26.9
+ '@babel/runtime': 7.28.4
classnames: 2.5.1
rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
react: 18.3.1
@@ -3816,7 +3977,7 @@ snapshots:
'@ant-design/react-slick@1.1.2(react@18.3.1)':
dependencies:
- '@babel/runtime': 7.26.9
+ '@babel/runtime': 7.28.4
classnames: 2.5.1
json2mq: 0.2.0
react: 18.3.1
@@ -3829,8 +3990,16 @@ snapshots:
js-tokens: 4.0.0
picocolors: 1.1.1
+ '@babel/code-frame@7.27.1':
+ dependencies:
+ '@babel/helper-validator-identifier': 7.28.5
+ js-tokens: 4.0.0
+ picocolors: 1.1.1
+
'@babel/compat-data@7.26.8': {}
+ '@babel/compat-data@7.28.5': {}
+
'@babel/core@7.26.9':
dependencies:
'@ampproject/remapping': 2.3.0
@@ -3838,7 +4007,7 @@ snapshots:
'@babel/generator': 7.26.9
'@babel/helper-compilation-targets': 7.26.5
'@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.9)
- '@babel/helpers': 7.26.9
+ '@babel/helpers': 7.28.4
'@babel/parser': 7.26.9
'@babel/template': 7.26.9
'@babel/traverse': 7.26.9
@@ -3851,6 +4020,26 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ '@babel/core@7.28.5':
+ dependencies:
+ '@babel/code-frame': 7.27.1
+ '@babel/generator': 7.28.5
+ '@babel/helper-compilation-targets': 7.27.2
+ '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5)
+ '@babel/helpers': 7.28.4
+ '@babel/parser': 7.28.5
+ '@babel/template': 7.27.2
+ '@babel/traverse': 7.28.5
+ '@babel/types': 7.28.5
+ '@jridgewell/remapping': 2.3.5
+ convert-source-map: 2.0.0
+ debug: 4.4.3
+ gensync: 1.0.0-beta.2
+ json5: 2.2.3
+ semver: 6.3.1
+ transitivePeerDependencies:
+ - supports-color
+
'@babel/generator@7.26.9':
dependencies:
'@babel/parser': 7.26.9
@@ -3859,6 +4048,14 @@ snapshots:
'@jridgewell/trace-mapping': 0.3.25
jsesc: 3.1.0
+ '@babel/generator@7.28.5':
+ dependencies:
+ '@babel/parser': 7.28.5
+ '@babel/types': 7.28.5
+ '@jridgewell/gen-mapping': 0.3.13
+ '@jridgewell/trace-mapping': 0.3.31
+ jsesc: 3.1.0
+
'@babel/helper-compilation-targets@7.26.5':
dependencies:
'@babel/compat-data': 7.26.8
@@ -3867,6 +4064,16 @@ snapshots:
lru-cache: 5.1.1
semver: 6.3.1
+ '@babel/helper-compilation-targets@7.27.2':
+ dependencies:
+ '@babel/compat-data': 7.28.5
+ '@babel/helper-validator-option': 7.27.1
+ browserslist: 4.27.0
+ lru-cache: 5.1.1
+ semver: 6.3.1
+
+ '@babel/helper-globals@7.28.0': {}
+
'@babel/helper-module-imports@7.25.9':
dependencies:
'@babel/traverse': 7.26.9
@@ -3874,6 +4081,13 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ '@babel/helper-module-imports@7.27.1':
+ dependencies:
+ '@babel/traverse': 7.28.5
+ '@babel/types': 7.28.5
+ transitivePeerDependencies:
+ - supports-color
+
'@babel/helper-module-transforms@7.26.0(@babel/core@7.26.9)':
dependencies:
'@babel/core': 7.26.9
@@ -3883,27 +4097,48 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-module-imports': 7.27.1
+ '@babel/helper-validator-identifier': 7.28.5
+ '@babel/traverse': 7.28.5
+ transitivePeerDependencies:
+ - supports-color
+
'@babel/helper-plugin-utils@7.26.5': {}
+ '@babel/helper-plugin-utils@7.27.1': {}
+
'@babel/helper-string-parser@7.25.9': {}
+ '@babel/helper-string-parser@7.27.1': {}
+
'@babel/helper-validator-identifier@7.25.9': {}
+ '@babel/helper-validator-identifier@7.28.5': {}
+
'@babel/helper-validator-option@7.25.9': {}
- '@babel/helpers@7.26.9':
+ '@babel/helper-validator-option@7.27.1': {}
+
+ '@babel/helpers@7.28.4':
dependencies:
- '@babel/template': 7.26.9
- '@babel/types': 7.26.9
+ '@babel/template': 7.27.2
+ '@babel/types': 7.28.5
'@babel/parser@7.26.9':
dependencies:
'@babel/types': 7.26.9
- '@babel/plugin-transform-arrow-functions@7.25.9(@babel/core@7.26.9)':
+ '@babel/parser@7.28.5':
dependencies:
- '@babel/core': 7.26.9
- '@babel/helper-plugin-utils': 7.26.5
+ '@babel/types': 7.28.5
+
+ '@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.28.5)':
+ dependencies:
+ '@babel/core': 7.28.5
+ '@babel/helper-plugin-utils': 7.27.1
'@babel/plugin-transform-react-jsx-self@7.25.9(@babel/core@7.26.9)':
dependencies:
@@ -3915,9 +4150,7 @@ snapshots:
'@babel/core': 7.26.9
'@babel/helper-plugin-utils': 7.26.5
- '@babel/runtime@7.26.9':
- dependencies:
- regenerator-runtime: 0.14.1
+ '@babel/runtime@7.28.4': {}
'@babel/template@7.26.9':
dependencies:
@@ -3925,6 +4158,12 @@ snapshots:
'@babel/parser': 7.26.9
'@babel/types': 7.26.9
+ '@babel/template@7.27.2':
+ dependencies:
+ '@babel/code-frame': 7.27.1
+ '@babel/parser': 7.28.5
+ '@babel/types': 7.28.5
+
'@babel/traverse@7.26.9':
dependencies:
'@babel/code-frame': 7.26.2
@@ -3937,11 +4176,28 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ '@babel/traverse@7.28.5':
+ dependencies:
+ '@babel/code-frame': 7.27.1
+ '@babel/generator': 7.28.5
+ '@babel/helper-globals': 7.28.0
+ '@babel/parser': 7.28.5
+ '@babel/template': 7.27.2
+ '@babel/types': 7.28.5
+ debug: 4.4.3
+ transitivePeerDependencies:
+ - supports-color
+
'@babel/types@7.26.9':
dependencies:
'@babel/helper-string-parser': 7.25.9
'@babel/helper-validator-identifier': 7.25.9
+ '@babel/types@7.28.5':
+ dependencies:
+ '@babel/helper-string-parser': 7.27.1
+ '@babel/helper-validator-identifier': 7.28.5
+
'@develar/schema-utils@2.6.5':
dependencies:
ajv: 6.12.6
@@ -3967,17 +4223,17 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@electron-toolkit/preload@3.0.1(electron@34.2.0)':
+ '@electron-toolkit/preload@3.0.1(electron@39.0.0)':
dependencies:
- electron: 34.2.0
+ electron: 39.0.0
'@electron-toolkit/tsconfig@1.0.1(@types/node@22.13.4)':
dependencies:
'@types/node': 22.13.4
- '@electron-toolkit/utils@4.0.0(electron@34.2.0)':
+ '@electron-toolkit/utils@4.0.0(electron@39.0.0)':
dependencies:
- electron: 34.2.0
+ electron: 39.0.0
'@electron/asar@3.3.1':
dependencies:
@@ -4054,79 +4310,82 @@ snapshots:
'@emotion/unitless@0.7.5': {}
- '@esbuild/aix-ppc64@0.24.2':
+ '@esbuild/aix-ppc64@0.25.11':
optional: true
- '@esbuild/android-arm64@0.24.2':
+ '@esbuild/android-arm64@0.25.11':
optional: true
- '@esbuild/android-arm@0.24.2':
+ '@esbuild/android-arm@0.25.11':
optional: true
- '@esbuild/android-x64@0.24.2':
+ '@esbuild/android-x64@0.25.11':
optional: true
- '@esbuild/darwin-arm64@0.24.2':
+ '@esbuild/darwin-arm64@0.25.11':
optional: true
- '@esbuild/darwin-x64@0.24.2':
+ '@esbuild/darwin-x64@0.25.11':
optional: true
- '@esbuild/freebsd-arm64@0.24.2':
+ '@esbuild/freebsd-arm64@0.25.11':
optional: true
- '@esbuild/freebsd-x64@0.24.2':
+ '@esbuild/freebsd-x64@0.25.11':
optional: true
- '@esbuild/linux-arm64@0.24.2':
+ '@esbuild/linux-arm64@0.25.11':
optional: true
- '@esbuild/linux-arm@0.24.2':
+ '@esbuild/linux-arm@0.25.11':
optional: true
- '@esbuild/linux-ia32@0.24.2':
+ '@esbuild/linux-ia32@0.25.11':
optional: true
- '@esbuild/linux-loong64@0.24.2':
+ '@esbuild/linux-loong64@0.25.11':
optional: true
- '@esbuild/linux-mips64el@0.24.2':
+ '@esbuild/linux-mips64el@0.25.11':
optional: true
- '@esbuild/linux-ppc64@0.24.2':
+ '@esbuild/linux-ppc64@0.25.11':
optional: true
- '@esbuild/linux-riscv64@0.24.2':
+ '@esbuild/linux-riscv64@0.25.11':
optional: true
- '@esbuild/linux-s390x@0.24.2':
+ '@esbuild/linux-s390x@0.25.11':
optional: true
- '@esbuild/linux-x64@0.24.2':
+ '@esbuild/linux-x64@0.25.11':
optional: true
- '@esbuild/netbsd-arm64@0.24.2':
+ '@esbuild/netbsd-arm64@0.25.11':
optional: true
- '@esbuild/netbsd-x64@0.24.2':
+ '@esbuild/netbsd-x64@0.25.11':
optional: true
- '@esbuild/openbsd-arm64@0.24.2':
+ '@esbuild/openbsd-arm64@0.25.11':
optional: true
- '@esbuild/openbsd-x64@0.24.2':
+ '@esbuild/openbsd-x64@0.25.11':
optional: true
- '@esbuild/sunos-x64@0.24.2':
+ '@esbuild/openharmony-arm64@0.25.11':
optional: true
- '@esbuild/win32-arm64@0.24.2':
+ '@esbuild/sunos-x64@0.25.11':
optional: true
- '@esbuild/win32-ia32@0.24.2':
+ '@esbuild/win32-arm64@0.25.11':
optional: true
- '@esbuild/win32-x64@0.24.2':
+ '@esbuild/win32-ia32@0.25.11':
+ optional: true
+
+ '@esbuild/win32-x64@0.25.11':
optional: true
'@eslint-community/eslint-utils@4.4.1(eslint@9.20.1(jiti@2.4.2))':
@@ -4144,11 +4403,11 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@eslint/core@0.10.0':
+ '@eslint/core@0.11.0':
dependencies:
'@types/json-schema': 7.0.15
- '@eslint/core@0.11.0':
+ '@eslint/core@0.17.0':
dependencies:
'@types/json-schema': 7.0.15
@@ -4170,9 +4429,9 @@ snapshots:
'@eslint/object-schema@2.1.6': {}
- '@eslint/plugin-kit@0.2.5':
+ '@eslint/plugin-kit@0.4.1':
dependencies:
- '@eslint/core': 0.10.0
+ '@eslint/core': 0.17.0
levn: 0.4.1
'@gar/promisify@1.1.3': {}
@@ -4210,23 +4469,40 @@ snapshots:
wrap-ansi: 8.1.0
wrap-ansi-cjs: wrap-ansi@7.0.0
+ '@jridgewell/gen-mapping@0.3.13':
+ dependencies:
+ '@jridgewell/sourcemap-codec': 1.5.5
+ '@jridgewell/trace-mapping': 0.3.31
+
'@jridgewell/gen-mapping@0.3.8':
dependencies:
'@jridgewell/set-array': 1.2.1
'@jridgewell/sourcemap-codec': 1.5.0
'@jridgewell/trace-mapping': 0.3.25
+ '@jridgewell/remapping@2.3.5':
+ dependencies:
+ '@jridgewell/gen-mapping': 0.3.13
+ '@jridgewell/trace-mapping': 0.3.31
+
'@jridgewell/resolve-uri@3.1.2': {}
'@jridgewell/set-array@1.2.1': {}
'@jridgewell/sourcemap-codec@1.5.0': {}
+ '@jridgewell/sourcemap-codec@1.5.5': {}
+
'@jridgewell/trace-mapping@0.3.25':
dependencies:
'@jridgewell/resolve-uri': 3.1.2
'@jridgewell/sourcemap-codec': 1.5.0
+ '@jridgewell/trace-mapping@0.3.31':
+ dependencies:
+ '@jridgewell/resolve-uri': 3.1.2
+ '@jridgewell/sourcemap-codec': 1.5.5
+
'@malept/cross-spawn-promise@2.0.0':
dependencies:
cross-spawn: 7.0.6
@@ -4404,12 +4680,12 @@ snapshots:
'@rc-component/async-validator@5.0.4':
dependencies:
- '@babel/runtime': 7.26.9
+ '@babel/runtime': 7.28.4
'@rc-component/color-picker@2.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
dependencies:
'@ant-design/fast-color': 2.0.6
- '@babel/runtime': 7.26.9
+ '@babel/runtime': 7.28.4
classnames: 2.5.1
rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
react: 18.3.1
@@ -4417,18 +4693,18 @@ snapshots:
'@rc-component/context@1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
dependencies:
- '@babel/runtime': 7.26.9
+ '@babel/runtime': 7.28.4
rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
'@rc-component/mini-decimal@1.1.0':
dependencies:
- '@babel/runtime': 7.26.9
+ '@babel/runtime': 7.28.4
'@rc-component/mutate-observer@1.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
dependencies:
- '@babel/runtime': 7.26.9
+ '@babel/runtime': 7.28.4
classnames: 2.5.1
rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
react: 18.3.1
@@ -4436,7 +4712,7 @@ snapshots:
'@rc-component/portal@1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
dependencies:
- '@babel/runtime': 7.26.9
+ '@babel/runtime': 7.28.4
classnames: 2.5.1
rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
react: 18.3.1
@@ -4444,7 +4720,7 @@ snapshots:
'@rc-component/qrcode@1.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
dependencies:
- '@babel/runtime': 7.26.9
+ '@babel/runtime': 7.28.4
classnames: 2.5.1
rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
react: 18.3.1
@@ -4452,7 +4728,7 @@ snapshots:
'@rc-component/tour@1.15.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
dependencies:
- '@babel/runtime': 7.26.9
+ '@babel/runtime': 7.28.4
'@rc-component/portal': 1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
'@rc-component/trigger': 2.2.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
classnames: 2.5.1
@@ -4462,7 +4738,7 @@ snapshots:
'@rc-component/trigger@2.2.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
dependencies:
- '@babel/runtime': 7.26.9
+ '@babel/runtime': 7.28.4
'@rc-component/portal': 1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
classnames: 2.5.1
rc-motion: 2.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
@@ -4471,61 +4747,70 @@ snapshots:
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
- '@rollup/rollup-android-arm-eabi@4.34.8':
+ '@rollup/rollup-android-arm-eabi@4.52.5':
optional: true
- '@rollup/rollup-android-arm64@4.34.8':
+ '@rollup/rollup-android-arm64@4.52.5':
optional: true
- '@rollup/rollup-darwin-arm64@4.34.8':
+ '@rollup/rollup-darwin-arm64@4.52.5':
optional: true
- '@rollup/rollup-darwin-x64@4.34.8':
+ '@rollup/rollup-darwin-x64@4.52.5':
optional: true
- '@rollup/rollup-freebsd-arm64@4.34.8':
+ '@rollup/rollup-freebsd-arm64@4.52.5':
optional: true
- '@rollup/rollup-freebsd-x64@4.34.8':
+ '@rollup/rollup-freebsd-x64@4.52.5':
optional: true
- '@rollup/rollup-linux-arm-gnueabihf@4.34.8':
+ '@rollup/rollup-linux-arm-gnueabihf@4.52.5':
optional: true
- '@rollup/rollup-linux-arm-musleabihf@4.34.8':
+ '@rollup/rollup-linux-arm-musleabihf@4.52.5':
optional: true
- '@rollup/rollup-linux-arm64-gnu@4.34.8':
+ '@rollup/rollup-linux-arm64-gnu@4.52.5':
optional: true
- '@rollup/rollup-linux-arm64-musl@4.34.8':
+ '@rollup/rollup-linux-arm64-musl@4.52.5':
optional: true
- '@rollup/rollup-linux-loongarch64-gnu@4.34.8':
+ '@rollup/rollup-linux-loong64-gnu@4.52.5':
optional: true
- '@rollup/rollup-linux-powerpc64le-gnu@4.34.8':
+ '@rollup/rollup-linux-ppc64-gnu@4.52.5':
optional: true
- '@rollup/rollup-linux-riscv64-gnu@4.34.8':
+ '@rollup/rollup-linux-riscv64-gnu@4.52.5':
optional: true
- '@rollup/rollup-linux-s390x-gnu@4.34.8':
+ '@rollup/rollup-linux-riscv64-musl@4.52.5':
optional: true
- '@rollup/rollup-linux-x64-gnu@4.34.8':
+ '@rollup/rollup-linux-s390x-gnu@4.52.5':
optional: true
- '@rollup/rollup-linux-x64-musl@4.34.8':
+ '@rollup/rollup-linux-x64-gnu@4.52.5':
optional: true
- '@rollup/rollup-win32-arm64-msvc@4.34.8':
+ '@rollup/rollup-linux-x64-musl@4.52.5':
optional: true
- '@rollup/rollup-win32-ia32-msvc@4.34.8':
+ '@rollup/rollup-openharmony-arm64@4.52.5':
optional: true
- '@rollup/rollup-win32-x64-msvc@4.34.8':
+ '@rollup/rollup-win32-arm64-msvc@4.52.5':
+ optional: true
+
+ '@rollup/rollup-win32-ia32-msvc@4.52.5':
+ optional: true
+
+ '@rollup/rollup-win32-x64-gnu@4.52.5':
+ optional: true
+
+ '@rollup/rollup-win32-x64-msvc@4.52.5':
optional: true
'@serialport/binding-mock@10.2.2':
@@ -4641,13 +4926,13 @@ snapshots:
'@tailwindcss/oxide-win32-arm64-msvc': 4.0.6
'@tailwindcss/oxide-win32-x64-msvc': 4.0.6
- '@tailwindcss/vite@4.0.6(vite@6.1.0(@types/node@22.13.4)(jiti@2.4.2)(lightningcss@1.29.1))':
+ '@tailwindcss/vite@4.0.6(vite@7.1.12(@types/node@22.13.4)(jiti@2.4.2)(lightningcss@1.29.1))':
dependencies:
'@tailwindcss/node': 4.0.6
'@tailwindcss/oxide': 4.0.6
lightningcss: 1.29.1
tailwindcss: 4.0.6
- vite: 6.1.0(@types/node@22.13.4)(jiti@2.4.2)(lightningcss@1.29.1)
+ vite: 7.1.12(@types/node@22.13.4)(jiti@2.4.2)(lightningcss@1.29.1)
'@tootallnate/once@2.0.0': {}
@@ -4685,6 +4970,8 @@ snapshots:
'@types/estree@1.0.6': {}
+ '@types/estree@1.0.8': {}
+
'@types/fs-extra@9.0.13':
dependencies:
'@types/node': 22.13.4
@@ -4699,10 +4986,6 @@ snapshots:
'@types/ms@2.1.0': {}
- '@types/node@20.17.19':
- dependencies:
- undici-types: 6.19.8
-
'@types/node@22.13.4':
dependencies:
undici-types: 6.20.0
@@ -4813,14 +5096,14 @@ snapshots:
'@typescript-eslint/types': 8.24.1
eslint-visitor-keys: 4.2.0
- '@vitejs/plugin-react@4.3.4(vite@6.1.0(@types/node@22.13.4)(jiti@2.4.2)(lightningcss@1.29.1))':
+ '@vitejs/plugin-react@4.3.4(vite@7.1.12(@types/node@22.13.4)(jiti@2.4.2)(lightningcss@1.29.1))':
dependencies:
'@babel/core': 7.26.9
'@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.9)
'@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.9)
'@types/babel__core': 7.20.5
react-refresh: 0.14.2
- vite: 6.1.0(@types/node@22.13.4)(jiti@2.4.2)(lightningcss@1.29.1)
+ vite: 7.1.12(@types/node@22.13.4)(jiti@2.4.2)(lightningcss@1.29.1)
transitivePeerDependencies:
- supports-color
@@ -4880,7 +5163,7 @@ snapshots:
'@ant-design/fast-color': 2.0.6
'@ant-design/icons': 5.6.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
'@ant-design/react-slick': 1.1.2(react@18.3.1)
- '@babel/runtime': 7.26.9
+ '@babel/runtime': 7.28.4
'@rc-component/color-picker': 2.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
'@rc-component/mutate-observer': 1.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
'@rc-component/qrcode': 1.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
@@ -4954,7 +5237,7 @@ snapshots:
ejs: 3.1.10
electron-builder-squirrel-windows: 25.1.8(dmg-builder@25.1.8)
electron-publish: 25.1.7
- form-data: 4.0.2
+ form-data: 4.0.4
fs-extra: 10.1.0
hosted-git-info: 4.1.0
is-ci: 3.0.1
@@ -5096,10 +5379,12 @@ snapshots:
dependencies:
possible-typed-array-names: 1.1.0
- balanced-match@1.0.2: {}
+ balanced-match@3.0.1: {}
base64-js@1.5.1: {}
+ baseline-browser-mapping@2.8.21: {}
+
bl@4.1.0:
dependencies:
buffer: 5.7.1
@@ -5115,14 +5400,9 @@ snapshots:
boolean@3.2.0:
optional: true
- brace-expansion@1.1.11:
+ brace-expansion@4.0.1:
dependencies:
- balanced-match: 1.0.2
- concat-map: 0.0.1
-
- brace-expansion@2.0.1:
- dependencies:
- balanced-match: 1.0.2
+ balanced-match: 3.0.1
braces@3.0.3:
dependencies:
@@ -5135,6 +5415,14 @@ snapshots:
node-releases: 2.0.19
update-browserslist-db: 1.1.2(browserslist@4.24.4)
+ browserslist@4.27.0:
+ dependencies:
+ baseline-browser-mapping: 2.8.21
+ caniuse-lite: 1.0.30001751
+ electron-to-chromium: 1.5.243
+ node-releases: 2.0.27
+ update-browserslist-db: 1.1.4(browserslist@4.27.0)
+
buffer-crc32@0.2.13: {}
buffer-from@1.1.2: {}
@@ -5230,6 +5518,8 @@ snapshots:
caniuse-lite@1.0.30001700: {}
+ caniuse-lite@1.0.30001751: {}
+
chalk@4.1.2:
dependencies:
ansi-styles: 4.3.0
@@ -5296,8 +5586,6 @@ snapshots:
compute-scroll-into-view@3.1.1: {}
- concat-map@0.0.1: {}
-
config-file-ts@0.2.8-rc1:
dependencies:
glob: 10.4.5
@@ -5362,6 +5650,10 @@ snapshots:
dependencies:
ms: 2.1.3
+ debug@4.4.3:
+ dependencies:
+ ms: 2.1.3
+
decompress-response@6.0.0:
dependencies:
mimic-response: 3.1.0
@@ -5497,6 +5789,8 @@ snapshots:
electron-to-chromium@1.5.102: {}
+ electron-to-chromium@1.5.243: {}
+
electron-updater@6.3.9:
dependencies:
builder-util-runtime: 9.2.10
@@ -5510,22 +5804,22 @@ snapshots:
transitivePeerDependencies:
- supports-color
- electron-vite@3.0.0(vite@6.1.0(@types/node@22.13.4)(jiti@2.4.2)(lightningcss@1.29.1)):
+ electron-vite@4.0.1(vite@7.1.12(@types/node@22.13.4)(jiti@2.4.2)(lightningcss@1.29.1)):
dependencies:
- '@babel/core': 7.26.9
- '@babel/plugin-transform-arrow-functions': 7.25.9(@babel/core@7.26.9)
+ '@babel/core': 7.28.5
+ '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.28.5)
cac: 6.7.14
- esbuild: 0.24.2
- magic-string: 0.30.17
+ esbuild: 0.25.11
+ magic-string: 0.30.21
picocolors: 1.1.1
- vite: 6.1.0(@types/node@22.13.4)(jiti@2.4.2)(lightningcss@1.29.1)
+ vite: 7.1.12(@types/node@22.13.4)(jiti@2.4.2)(lightningcss@1.29.1)
transitivePeerDependencies:
- supports-color
- electron@34.2.0:
+ electron@39.0.0:
dependencies:
'@electron/get': 2.0.3
- '@types/node': 20.17.19
+ '@types/node': 22.13.4
extract-zip: 2.0.1
transitivePeerDependencies:
- supports-color
@@ -5543,6 +5837,10 @@ snapshots:
dependencies:
once: 1.4.0
+ end-of-stream@1.4.5:
+ dependencies:
+ once: 1.4.0
+
enhanced-resolve@5.18.1:
dependencies:
graceful-fs: 4.2.11
@@ -5653,33 +5951,34 @@ snapshots:
es6-error@4.1.1:
optional: true
- esbuild@0.24.2:
+ esbuild@0.25.11:
optionalDependencies:
- '@esbuild/aix-ppc64': 0.24.2
- '@esbuild/android-arm': 0.24.2
- '@esbuild/android-arm64': 0.24.2
- '@esbuild/android-x64': 0.24.2
- '@esbuild/darwin-arm64': 0.24.2
- '@esbuild/darwin-x64': 0.24.2
- '@esbuild/freebsd-arm64': 0.24.2
- '@esbuild/freebsd-x64': 0.24.2
- '@esbuild/linux-arm': 0.24.2
- '@esbuild/linux-arm64': 0.24.2
- '@esbuild/linux-ia32': 0.24.2
- '@esbuild/linux-loong64': 0.24.2
- '@esbuild/linux-mips64el': 0.24.2
- '@esbuild/linux-ppc64': 0.24.2
- '@esbuild/linux-riscv64': 0.24.2
- '@esbuild/linux-s390x': 0.24.2
- '@esbuild/linux-x64': 0.24.2
- '@esbuild/netbsd-arm64': 0.24.2
- '@esbuild/netbsd-x64': 0.24.2
- '@esbuild/openbsd-arm64': 0.24.2
- '@esbuild/openbsd-x64': 0.24.2
- '@esbuild/sunos-x64': 0.24.2
- '@esbuild/win32-arm64': 0.24.2
- '@esbuild/win32-ia32': 0.24.2
- '@esbuild/win32-x64': 0.24.2
+ '@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
escalade@3.2.0: {}
@@ -5745,7 +6044,7 @@ snapshots:
'@eslint/core': 0.11.0
'@eslint/eslintrc': 3.2.0
'@eslint/js': 9.20.0
- '@eslint/plugin-kit': 0.2.5
+ '@eslint/plugin-kit': 0.4.1
'@humanfs/node': 0.16.6
'@humanwhocodes/module-importer': 1.0.1
'@humanwhocodes/retry': 0.4.1
@@ -5835,6 +6134,10 @@ snapshots:
dependencies:
pend: 1.2.0
+ fdir@6.5.0(picomatch@4.0.3):
+ optionalDependencies:
+ picomatch: 4.0.3
+
file-entry-cache@8.0.0:
dependencies:
flat-cache: 4.0.1
@@ -5868,11 +6171,12 @@ snapshots:
cross-spawn: 7.0.6
signal-exit: 4.1.0
- form-data@4.0.2:
+ form-data@4.0.4:
dependencies:
asynckit: 0.4.0
combined-stream: 1.0.8
es-set-tostringtag: 2.1.0
+ hasown: 2.0.2
mime-types: 2.1.35
fs-constants@1.0.0: {}
@@ -6120,7 +6424,7 @@ snapshots:
i18next@24.2.2(typescript@5.7.3):
dependencies:
- '@babel/runtime': 7.26.9
+ '@babel/runtime': 7.28.4
optionalDependencies:
typescript: 5.7.3
@@ -6474,9 +6778,9 @@ snapshots:
dependencies:
react: 18.3.1
- magic-string@0.30.17:
+ magic-string@0.30.21:
dependencies:
- '@jridgewell/sourcemap-codec': 1.5.0
+ '@jridgewell/sourcemap-codec': 1.5.5
make-fetch-happen@10.2.1:
dependencies:
@@ -6534,19 +6838,19 @@ snapshots:
minimatch@10.0.1:
dependencies:
- brace-expansion: 2.0.1
+ brace-expansion: 4.0.1
minimatch@3.1.2:
dependencies:
- brace-expansion: 1.1.11
+ brace-expansion: 4.0.1
minimatch@5.1.6:
dependencies:
- brace-expansion: 2.0.1
+ brace-expansion: 4.0.1
minimatch@9.0.5:
dependencies:
- brace-expansion: 2.0.1
+ brace-expansion: 4.0.1
minimist@1.2.8: {}
@@ -6591,7 +6895,7 @@ snapshots:
ms@2.1.3: {}
- nanoid@3.3.8: {}
+ nanoid@3.3.11: {}
natural-compare@1.4.0: {}
@@ -6631,6 +6935,8 @@ snapshots:
node-releases@2.0.19: {}
+ node-releases@2.0.27: {}
+
nopt@6.0.0:
dependencies:
abbrev: 1.1.1
@@ -6757,6 +7063,8 @@ snapshots:
picomatch@2.3.1: {}
+ picomatch@4.0.3: {}
+
plist@3.1.0:
dependencies:
'@xmldom/xmldom': 0.8.10
@@ -6765,9 +7073,9 @@ snapshots:
possible-typed-array-names@1.1.0: {}
- postcss@8.5.2:
+ postcss@8.5.6:
dependencies:
- nanoid: 3.3.8
+ nanoid: 3.3.11
picocolors: 1.1.1
source-map-js: 1.2.1
@@ -6815,7 +7123,7 @@ snapshots:
rc-cascader@3.33.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
- '@babel/runtime': 7.26.9
+ '@babel/runtime': 7.28.4
classnames: 2.5.1
rc-select: 14.16.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
rc-tree: 5.13.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
@@ -6825,7 +7133,7 @@ snapshots:
rc-checkbox@3.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
- '@babel/runtime': 7.26.9
+ '@babel/runtime': 7.28.4
classnames: 2.5.1
rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
react: 18.3.1
@@ -6833,7 +7141,7 @@ snapshots:
rc-collapse@3.9.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
- '@babel/runtime': 7.26.9
+ '@babel/runtime': 7.28.4
classnames: 2.5.1
rc-motion: 2.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
@@ -6842,7 +7150,7 @@ snapshots:
rc-dialog@9.6.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
- '@babel/runtime': 7.26.9
+ '@babel/runtime': 7.28.4
'@rc-component/portal': 1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
classnames: 2.5.1
rc-motion: 2.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
@@ -6852,7 +7160,7 @@ snapshots:
rc-drawer@7.2.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
- '@babel/runtime': 7.26.9
+ '@babel/runtime': 7.28.4
'@rc-component/portal': 1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
classnames: 2.5.1
rc-motion: 2.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
@@ -6862,7 +7170,7 @@ snapshots:
rc-dropdown@4.2.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
- '@babel/runtime': 7.26.9
+ '@babel/runtime': 7.28.4
'@rc-component/trigger': 2.2.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
classnames: 2.5.1
rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
@@ -6871,7 +7179,7 @@ snapshots:
rc-field-form@2.7.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
- '@babel/runtime': 7.26.9
+ '@babel/runtime': 7.28.4
'@rc-component/async-validator': 5.0.4
rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
react: 18.3.1
@@ -6879,7 +7187,7 @@ snapshots:
rc-image@7.11.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
- '@babel/runtime': 7.26.9
+ '@babel/runtime': 7.28.4
'@rc-component/portal': 1.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
classnames: 2.5.1
rc-dialog: 9.6.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
@@ -6890,7 +7198,7 @@ snapshots:
rc-input-number@9.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
- '@babel/runtime': 7.26.9
+ '@babel/runtime': 7.28.4
'@rc-component/mini-decimal': 1.1.0
classnames: 2.5.1
rc-input: 1.7.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
@@ -6900,7 +7208,7 @@ snapshots:
rc-input@1.7.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
- '@babel/runtime': 7.26.9
+ '@babel/runtime': 7.28.4
classnames: 2.5.1
rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
react: 18.3.1
@@ -6908,7 +7216,7 @@ snapshots:
rc-mentions@2.19.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
- '@babel/runtime': 7.26.9
+ '@babel/runtime': 7.28.4
'@rc-component/trigger': 2.2.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
classnames: 2.5.1
rc-input: 1.7.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
@@ -6920,7 +7228,7 @@ snapshots:
rc-menu@9.16.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
- '@babel/runtime': 7.26.9
+ '@babel/runtime': 7.28.4
'@rc-component/trigger': 2.2.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
classnames: 2.5.1
rc-motion: 2.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
@@ -6931,7 +7239,7 @@ snapshots:
rc-motion@2.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
- '@babel/runtime': 7.26.9
+ '@babel/runtime': 7.28.4
classnames: 2.5.1
rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
react: 18.3.1
@@ -6939,7 +7247,7 @@ snapshots:
rc-notification@5.6.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
- '@babel/runtime': 7.26.9
+ '@babel/runtime': 7.28.4
classnames: 2.5.1
rc-motion: 2.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
@@ -6948,7 +7256,7 @@ snapshots:
rc-overflow@1.4.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
- '@babel/runtime': 7.26.9
+ '@babel/runtime': 7.28.4
classnames: 2.5.1
rc-resize-observer: 1.4.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
@@ -6957,7 +7265,7 @@ snapshots:
rc-pagination@5.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
- '@babel/runtime': 7.26.9
+ '@babel/runtime': 7.28.4
classnames: 2.5.1
rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
react: 18.3.1
@@ -6965,7 +7273,7 @@ snapshots:
rc-picker@4.11.2(dayjs@1.11.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
- '@babel/runtime': 7.26.9
+ '@babel/runtime': 7.28.4
'@rc-component/trigger': 2.2.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
classnames: 2.5.1
rc-overflow: 1.4.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
@@ -6978,7 +7286,7 @@ snapshots:
rc-progress@4.0.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
- '@babel/runtime': 7.26.9
+ '@babel/runtime': 7.28.4
classnames: 2.5.1
rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
react: 18.3.1
@@ -6986,7 +7294,7 @@ snapshots:
rc-rate@2.13.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
- '@babel/runtime': 7.26.9
+ '@babel/runtime': 7.28.4
classnames: 2.5.1
rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
react: 18.3.1
@@ -6994,7 +7302,7 @@ snapshots:
rc-resize-observer@1.4.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
- '@babel/runtime': 7.26.9
+ '@babel/runtime': 7.28.4
classnames: 2.5.1
rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
react: 18.3.1
@@ -7003,7 +7311,7 @@ snapshots:
rc-segmented@2.7.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
- '@babel/runtime': 7.26.9
+ '@babel/runtime': 7.28.4
classnames: 2.5.1
rc-motion: 2.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
@@ -7012,7 +7320,7 @@ snapshots:
rc-select@14.16.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
- '@babel/runtime': 7.26.9
+ '@babel/runtime': 7.28.4
'@rc-component/trigger': 2.2.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
classnames: 2.5.1
rc-motion: 2.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
@@ -7024,7 +7332,7 @@ snapshots:
rc-slider@11.1.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
- '@babel/runtime': 7.26.9
+ '@babel/runtime': 7.28.4
classnames: 2.5.1
rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
react: 18.3.1
@@ -7032,7 +7340,7 @@ snapshots:
rc-steps@6.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
- '@babel/runtime': 7.26.9
+ '@babel/runtime': 7.28.4
classnames: 2.5.1
rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
react: 18.3.1
@@ -7040,7 +7348,7 @@ snapshots:
rc-switch@4.1.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
- '@babel/runtime': 7.26.9
+ '@babel/runtime': 7.28.4
classnames: 2.5.1
rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
react: 18.3.1
@@ -7048,7 +7356,7 @@ snapshots:
rc-table@7.50.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
- '@babel/runtime': 7.26.9
+ '@babel/runtime': 7.28.4
'@rc-component/context': 1.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
classnames: 2.5.1
rc-resize-observer: 1.4.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
@@ -7059,7 +7367,7 @@ snapshots:
rc-tabs@15.5.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
- '@babel/runtime': 7.26.9
+ '@babel/runtime': 7.28.4
classnames: 2.5.1
rc-dropdown: 4.2.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
rc-menu: 9.16.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
@@ -7071,7 +7379,7 @@ snapshots:
rc-textarea@1.9.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
- '@babel/runtime': 7.26.9
+ '@babel/runtime': 7.28.4
classnames: 2.5.1
rc-input: 1.7.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
rc-resize-observer: 1.4.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
@@ -7081,7 +7389,7 @@ snapshots:
rc-tooltip@6.4.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
- '@babel/runtime': 7.26.9
+ '@babel/runtime': 7.28.4
'@rc-component/trigger': 2.2.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
classnames: 2.5.1
rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
@@ -7090,7 +7398,7 @@ snapshots:
rc-tree-select@5.27.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
- '@babel/runtime': 7.26.9
+ '@babel/runtime': 7.28.4
classnames: 2.5.1
rc-select: 14.16.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
rc-tree: 5.13.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
@@ -7100,7 +7408,7 @@ snapshots:
rc-tree@5.13.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
- '@babel/runtime': 7.26.9
+ '@babel/runtime': 7.28.4
classnames: 2.5.1
rc-motion: 2.9.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
@@ -7110,7 +7418,7 @@ snapshots:
rc-upload@4.8.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
- '@babel/runtime': 7.26.9
+ '@babel/runtime': 7.28.4
classnames: 2.5.1
rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
react: 18.3.1
@@ -7118,14 +7426,14 @@ snapshots:
rc-util@5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
- '@babel/runtime': 7.26.9
+ '@babel/runtime': 7.28.4
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
react-is: 18.3.1
rc-virtual-list@3.18.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
- '@babel/runtime': 7.26.9
+ '@babel/runtime': 7.28.4
classnames: 2.5.1
rc-resize-observer: 1.4.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
rc-util: 5.44.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
@@ -7140,7 +7448,7 @@ snapshots:
react-i18next@15.4.1(i18next@24.2.2(typescript@5.7.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
- '@babel/runtime': 7.26.9
+ '@babel/runtime': 7.28.4
html-parse-stringify: 3.0.1
i18next: 24.2.2(typescript@5.7.3)
react: 18.3.1
@@ -7234,8 +7542,6 @@ snapshots:
get-proto: 1.0.1
which-builtin-type: 1.2.1
- regenerator-runtime@0.14.1: {}
-
regexp.prototype.flags@1.5.4:
dependencies:
call-bind: 1.0.8
@@ -7290,29 +7596,32 @@ snapshots:
sprintf-js: 1.1.3
optional: true
- rollup@4.34.8:
+ rollup@4.52.5:
dependencies:
- '@types/estree': 1.0.6
+ '@types/estree': 1.0.8
optionalDependencies:
- '@rollup/rollup-android-arm-eabi': 4.34.8
- '@rollup/rollup-android-arm64': 4.34.8
- '@rollup/rollup-darwin-arm64': 4.34.8
- '@rollup/rollup-darwin-x64': 4.34.8
- '@rollup/rollup-freebsd-arm64': 4.34.8
- '@rollup/rollup-freebsd-x64': 4.34.8
- '@rollup/rollup-linux-arm-gnueabihf': 4.34.8
- '@rollup/rollup-linux-arm-musleabihf': 4.34.8
- '@rollup/rollup-linux-arm64-gnu': 4.34.8
- '@rollup/rollup-linux-arm64-musl': 4.34.8
- '@rollup/rollup-linux-loongarch64-gnu': 4.34.8
- '@rollup/rollup-linux-powerpc64le-gnu': 4.34.8
- '@rollup/rollup-linux-riscv64-gnu': 4.34.8
- '@rollup/rollup-linux-s390x-gnu': 4.34.8
- '@rollup/rollup-linux-x64-gnu': 4.34.8
- '@rollup/rollup-linux-x64-musl': 4.34.8
- '@rollup/rollup-win32-arm64-msvc': 4.34.8
- '@rollup/rollup-win32-ia32-msvc': 4.34.8
- '@rollup/rollup-win32-x64-msvc': 4.34.8
+ '@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
run-parallel@1.2.0:
@@ -7598,7 +7907,7 @@ snapshots:
tar-stream@2.2.0:
dependencies:
bl: 4.1.0
- end-of-stream: 1.4.4
+ end-of-stream: 1.4.5
fs-constants: 1.0.0
inherits: 2.0.4
readable-stream: 3.6.2
@@ -7621,11 +7930,16 @@ snapshots:
tiny-typed-emitter@2.1.0: {}
+ tinyglobby@0.2.15:
+ dependencies:
+ fdir: 6.5.0(picomatch@4.0.3)
+ picomatch: 4.0.3
+
tmp-promise@3.0.3:
dependencies:
- tmp: 0.2.3
+ tmp: 0.2.5
- tmp@0.2.3: {}
+ tmp@0.2.5: {}
to-regex-range@5.0.1:
dependencies:
@@ -7702,8 +8016,6 @@ snapshots:
has-symbols: 1.1.0
which-boxed-primitive: 1.1.1
- undici-types@6.19.8: {}
-
undici-types@6.20.0: {}
unique-filename@2.0.1:
@@ -7724,6 +8036,12 @@ snapshots:
escalade: 3.2.0
picocolors: 1.1.1
+ update-browserslist-db@1.1.4(browserslist@4.27.0):
+ dependencies:
+ browserslist: 4.27.0
+ escalade: 3.2.0
+ picocolors: 1.1.1
+
uri-js@4.4.1:
dependencies:
punycode: 2.3.1
@@ -7763,11 +8081,14 @@ snapshots:
extsprintf: 1.4.1
optional: true
- vite@6.1.0(@types/node@22.13.4)(jiti@2.4.2)(lightningcss@1.29.1):
+ vite@7.1.12(@types/node@22.13.4)(jiti@2.4.2)(lightningcss@1.29.1):
dependencies:
- esbuild: 0.24.2
- postcss: 8.5.2
- rollup: 4.34.8
+ 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
optionalDependencies:
'@types/node': 22.13.4
fsevents: 2.3.3
diff --git a/desktop/src/renderer/src/App.tsx b/desktop/src/renderer/src/App.tsx
index 97f9bb4..7ab90ac 100644
--- a/desktop/src/renderer/src/App.tsx
+++ b/desktop/src/renderer/src/App.tsx
@@ -11,7 +11,12 @@ import { Keyboard } from '@renderer/components/keyboard'
import { Menu } from '@renderer/components/menu'
import { Mouse } from '@renderer/components/mouse'
import { VirtualKeyboard } from '@renderer/components/virtual-keyboard'
-import { resolutionAtom, serialPortStateAtom, videoStateAtom } from '@renderer/jotai/device'
+import {
+ resolutionAtom,
+ serialPortStateAtom,
+ videoScaleAtom,
+ videoStateAtom
+} from '@renderer/jotai/device'
import { isKeyboardEnableAtom } from '@renderer/jotai/keyboard'
import { mouseStyleAtom } from '@renderer/jotai/mouse'
import { camera } from '@renderer/libs/camera'
@@ -24,6 +29,7 @@ const App = (): ReactElement => {
const { t } = useTranslation()
const isBigScreen = useMediaQuery({ minWidth: 850 })
+ const videoScale = useAtomValue(videoScaleAtom)
const videoState = useAtomValue(videoStateAtom)
const serialPortState = useAtomValue(serialPortStateAtom)
const mouseStyle = useAtomValue(mouseStyleAtom)
@@ -115,7 +121,13 @@ const App = (): ReactElement => {
diff --git a/desktop/src/renderer/src/components/keyboard/index.tsx b/desktop/src/renderer/src/components/keyboard/index.tsx
index 9f6c574..55419ac 100644
--- a/desktop/src/renderer/src/components/keyboard/index.tsx
+++ b/desktop/src/renderer/src/components/keyboard/index.tsx
@@ -64,14 +64,15 @@ export const Keyboard = (): ReactElement => {
}
function getModifier(e: KeyboardEvent): number {
+ const altGraphKey = e.getModifierState('AltGraph')
const pressedKeys = [
- e.ctrlKey && pressedKeysRef.current.has('ControlLeft'),
+ altGraphKey || (e.ctrlKey && pressedKeysRef.current.has('ControlLeft')),
e.shiftKey && pressedKeysRef.current.has('ShiftLeft'),
e.altKey && pressedKeysRef.current.has('AltLeft'),
e.metaKey && pressedKeysRef.current.has('MetaLeft'),
e.ctrlKey && pressedKeysRef.current.has('ControlRight'),
e.shiftKey && pressedKeysRef.current.has('ShiftRight'),
- e.altKey && pressedKeysRef.current.has('AltRight'),
+ altGraphKey || (e.altKey && pressedKeysRef.current.has('AltRight')),
e.metaKey && pressedKeysRef.current.has('MetaRight')
]
diff --git a/desktop/src/renderer/src/components/menu/mouse/index.tsx b/desktop/src/renderer/src/components/menu/mouse/index.tsx
index 46dc0ce..12e7329 100644
--- a/desktop/src/renderer/src/components/menu/mouse/index.tsx
+++ b/desktop/src/renderer/src/components/menu/mouse/index.tsx
@@ -4,14 +4,17 @@ import { useAtom, useSetAtom } from 'jotai'
import { MouseIcon } from 'lucide-react'
import {
+ mouseJigglerModeAtom,
mouseModeAtom,
mouseStyleAtom,
scrollDirectionAtom,
scrollIntervalAtom
} from '@renderer/jotai/mouse'
+import { mouseJiggler } from '@renderer/libs/mouse-jiggler'
import * as storage from '@renderer/libs/storage'
import { Direction } from './direction'
+import { Jiggler } from './jiggler'
import { Mode } from './mode'
import { Speed } from './speed'
import { Style } from './style'
@@ -21,6 +24,7 @@ export const Mouse = (): ReactElement => {
const setMouseMode = useSetAtom(mouseModeAtom)
const setScrollDirection = useSetAtom(scrollDirectionAtom)
const setScrollInterval = useSetAtom(scrollIntervalAtom)
+ const setMouseJigglerMode = useSetAtom(mouseJigglerModeAtom)
const [isPopoverOpen, setIsPopoverOpen] = useState(false)
@@ -44,6 +48,9 @@ export const Mouse = (): ReactElement => {
if (interval) {
setScrollInterval(interval)
}
+ const jiggler = storage.getMouseJigglerMode()
+ mouseJiggler.setMode(jiggler)
+ setMouseJigglerMode(jiggler)
}, [])
const content = (
@@ -52,6 +59,7 @@ export const Mouse = (): ReactElement => {
+
)
diff --git a/desktop/src/renderer/src/components/menu/mouse/jiggler.tsx b/desktop/src/renderer/src/components/menu/mouse/jiggler.tsx
new file mode 100644
index 0000000..5d9bcbf
--- /dev/null
+++ b/desktop/src/renderer/src/components/menu/mouse/jiggler.tsx
@@ -0,0 +1,56 @@
+import { ReactElement, useEffect } from 'react'
+import { Popover } from 'antd'
+import clsx from 'clsx'
+import { useAtom } from 'jotai'
+import { MousePointerIcon } from 'lucide-react'
+import { useTranslation } from 'react-i18next'
+
+import { mouseJigglerModeAtom } from '@renderer/jotai/mouse'
+import { mouseJiggler } from '@renderer/libs/mouse-jiggler'
+import * as storage from '@renderer/libs/storage'
+
+export const Jiggler = (): ReactElement => {
+ const { t } = useTranslation()
+ const [jigglerMode, setJigglerMode] = useAtom(mouseJigglerModeAtom)
+
+ const mouseJigglerModes: { name: string; value: 'enable' | 'disable' }[] = [
+ { name: t('mouse.jiggler.enable'), value: 'enable' },
+ { name: t('mouse.jiggler.disable'), value: 'disable' }
+ ]
+
+ function update(mode: 'enable' | 'disable'): void {
+ storage.setMouseJigglerMode(mode)
+ setJigglerMode(mode)
+ }
+
+ useEffect(() => {
+ mouseJiggler.setMode(jigglerMode)
+ }, [jigglerMode])
+
+ const content = (
+ <>
+ {mouseJigglerModes.map((mode) => (
+ update(mode.value)}
+ >
+ {mode.name}
+
+ ))}
+ >
+ )
+ return (
+
+
+
+
+
+
{t('mouse.jiggler.title')}
+
+
+ )
+}
diff --git a/desktop/src/renderer/src/components/menu/video/index.tsx b/desktop/src/renderer/src/components/menu/video/index.tsx
index 45896b5..8bcf218 100644
--- a/desktop/src/renderer/src/components/menu/video/index.tsx
+++ b/desktop/src/renderer/src/components/menu/video/index.tsx
@@ -4,11 +4,13 @@ import { MonitorIcon } from 'lucide-react'
import { Device } from './device'
import { Resolution } from './resolution'
+import { Scale } from './scale'
export const Video = (): ReactElement => {
const content = (
+
)
diff --git a/desktop/src/renderer/src/components/menu/video/scale.tsx b/desktop/src/renderer/src/components/menu/video/scale.tsx
new file mode 100644
index 0000000..7c39b15
--- /dev/null
+++ b/desktop/src/renderer/src/components/menu/video/scale.tsx
@@ -0,0 +1,58 @@
+import { ReactElement, useEffect } from 'react'
+import { Popover, Slider } from 'antd'
+import { useAtom } from 'jotai'
+import { ScalingIcon } from 'lucide-react'
+import { useTranslation } from 'react-i18next'
+
+import { videoScaleAtom } from '@renderer/jotai/device'
+import * as storage from '@renderer/libs/storage'
+
+export const Scale = (): ReactElement => {
+ const { t } = useTranslation()
+
+ const [videoScale, setVideoScale] = useAtom(videoScaleAtom)
+
+ useEffect(() => {
+ const scale = storage.getVideoScale()
+ if (scale) {
+ setVideoScale(scale)
+ }
+ }, [setVideoScale])
+
+ async function updateScale(scale: number): Promise {
+ setVideoScale(scale)
+ storage.setVideoScale(scale)
+ }
+
+ const content = (
+
+ x0.5,
+ 1: x1.0,
+ 1.5: x1.5,
+ 2: x2.0
+ }}
+ range={false}
+ included={false}
+ min={0.5}
+ max={2}
+ step={0.1}
+ defaultValue={videoScale}
+ onChange={updateScale}
+ />
+
+ )
+
+ return (
+
+
+
+
+
+
{t('video.scale')}
+
+
+ )
+}
diff --git a/desktop/src/renderer/src/components/mouse/absolute.tsx b/desktop/src/renderer/src/components/mouse/absolute.tsx
index 4a2c671..525035d 100644
--- a/desktop/src/renderer/src/components/mouse/absolute.tsx
+++ b/desktop/src/renderer/src/components/mouse/absolute.tsx
@@ -4,6 +4,7 @@ import { useAtomValue } from 'jotai'
import { IpcEvents } from '@common/ipc-events'
import { resolutionAtom } from '@renderer/jotai/device'
import { scrollDirectionAtom, scrollIntervalAtom } from '@renderer/jotai/mouse'
+import { mouseJiggler } from '@renderer/libs/mouse-jiggler'
import type { Mouse as MouseKey } from '@renderer/types'
export const Absolute = (): ReactElement => {
@@ -77,6 +78,8 @@ export const Absolute = (): ReactElement => {
async function handleMouseMove(event: MouseEvent): Promise {
disableEvent(event)
await send(event)
+
+ mouseJiggler.moveEventCallback()
}
// mouse scroll
diff --git a/desktop/src/renderer/src/components/mouse/relative.tsx b/desktop/src/renderer/src/components/mouse/relative.tsx
index 5bdd7b1..a270fec 100644
--- a/desktop/src/renderer/src/components/mouse/relative.tsx
+++ b/desktop/src/renderer/src/components/mouse/relative.tsx
@@ -6,6 +6,7 @@ import { useTranslation } from 'react-i18next'
import { IpcEvents } from '@common/ipc-events'
import { resolutionAtom } from '@renderer/jotai/device'
import { scrollDirectionAtom, scrollIntervalAtom } from '@renderer/jotai/mouse'
+import { mouseJiggler } from '@renderer/libs/mouse-jiggler'
import type { Mouse as MouseKey } from '@renderer/types'
export const Relative = (): ReactElement => {
@@ -110,6 +111,8 @@ export const Relative = (): ReactElement => {
if (x === 0 && y === 0) return
await send(Math.abs(x) < 10 ? x * 2 : x, Math.abs(y) < 10 ? y * 2 : y, 0)
+
+ mouseJiggler.moveEventCallback()
}
async function handleWheel(event: WheelEvent): Promise {
diff --git a/desktop/src/renderer/src/i18n/languages.ts b/desktop/src/renderer/src/i18n/languages.ts
index eb2fcb8..9ce989d 100644
--- a/desktop/src/renderer/src/i18n/languages.ts
+++ b/desktop/src/renderer/src/i18n/languages.ts
@@ -1,10 +1,14 @@
const languages = [
{ key: 'en', name: 'English' },
{ key: 'ru', name: 'Русский' },
- { key: 'zh', name: '中文' },
+ { key: 'zh', name: '简体中文' },
+ { key: 'zh_tw', name: '繁體中文' },
{ key: 'de', name: 'Deutsch' },
{ key: 'nl', name: 'Nederlands' },
- { key: 'be', name: 'België' }
+ { key: 'be', name: 'België' },
+ { key: 'ko', name: '한국어' },
+ { key: 'pt_br', name: 'Português (Brasil)' },
+ { key: 'pl', name: 'Polski' }
]
languages.sort((a, b) => a.name.localeCompare(b.name, 'en', { sensitivity: 'base' }))
diff --git a/desktop/src/renderer/src/i18n/locales/be.ts b/desktop/src/renderer/src/i18n/locales/be.ts
index ef59a6a..ba6f538 100644
--- a/desktop/src/renderer/src/i18n/locales/be.ts
+++ b/desktop/src/renderer/src/i18n/locales/be.ts
@@ -26,6 +26,7 @@ const be = {
},
video: {
resolution: 'Resolutie',
+ scale: 'Schaal',
customResolution: 'Aangepast',
device: 'Toestel',
custom: {
@@ -94,5 +95,5 @@ const be = {
}
}
}
-
- export default be
\ No newline at end of file
+
+ export default be
diff --git a/desktop/src/renderer/src/i18n/locales/de.ts b/desktop/src/renderer/src/i18n/locales/de.ts
index d11a42c..80f7d80 100644
--- a/desktop/src/renderer/src/i18n/locales/de.ts
+++ b/desktop/src/renderer/src/i18n/locales/de.ts
@@ -26,6 +26,7 @@ const de = {
},
video: {
resolution: 'Auflösung',
+ scale: 'Skalierung',
customResolution: 'Benutzerdefiniert',
device: 'Gerät',
custom: {
@@ -55,6 +56,9 @@ const de = {
direction: 'Scrollrichtung',
scrollUp: 'Hochscrollen',
scrollDown: 'Runterscrollen',
+ speed: 'Scrollgeschwindigkeit',
+ fast: 'Schnell',
+ slow: 'Langsam',
requestPointer: 'Benutze relativen Modus. Bitte auf den Desktop klicken, um den Mauszeiger anzuzeigen.'
},
settings: {
@@ -94,5 +98,5 @@ const de = {
}
}
}
-
- export default de
\ No newline at end of file
+
+ export default de
diff --git a/desktop/src/renderer/src/i18n/locales/en.ts b/desktop/src/renderer/src/i18n/locales/en.ts
index e88c668..cd5f503 100644
--- a/desktop/src/renderer/src/i18n/locales/en.ts
+++ b/desktop/src/renderer/src/i18n/locales/en.ts
@@ -26,6 +26,7 @@ const en = {
},
video: {
resolution: 'Resolution',
+ scale: 'Scale',
customResolution: 'Custom',
device: 'Device',
custom: {
@@ -58,7 +59,12 @@ const en = {
speed: 'Wheel speed',
fast: 'Fast',
slow: 'Slow',
- requestPointer: 'Using relative mode. Please click desktop to get mouse pointer.'
+ requestPointer: 'Using relative mode. Please click desktop to get mouse pointer.',
+ jiggler: {
+ title: 'Mouse Jiggler',
+ enable: 'Enable',
+ disable: 'Disable'
+ }
},
settings: {
title: 'Settings',
diff --git a/desktop/src/renderer/src/i18n/locales/ko.ts b/desktop/src/renderer/src/i18n/locales/ko.ts
new file mode 100644
index 0000000..6b58ec8
--- /dev/null
+++ b/desktop/src/renderer/src/i18n/locales/ko.ts
@@ -0,0 +1,84 @@
+const ko = {
+ translation: {
+ camera: {
+ tip: '권한을 기다리는 중...',
+ denied: '권한이 거부되었습니다.',
+ authorize:
+ 'Target PC 연결에 카메라 권한이 필요합니다. 설정에서 카메라 권한을 허용해 주세요.',
+ failed: '카메라 연결에 실패했습니다. 다시 시도해 주세요.'
+ },
+ modal: {
+ title: 'USB 장치 선택',
+ selectVideo: '비디오 입력 장치를 선택해 주세요.',
+ selectSerial: '시리얼 장치를 선택해 주세요.'
+ },
+ menu: {
+ serial: '시리얼',
+ keyboard: '키보드',
+ mouse: '마우스'
+ },
+ video: {
+ resolution: '해상도',
+ scale: '배율',
+ customResolution: '사용자 정의',
+ device: '장치',
+ custom: {
+ title: '사용자 정의 해상도',
+ width: '가로',
+ height: '세로',
+ confirm: '확인',
+ cancel: '취소'
+ }
+ },
+ keyboard: {
+ paste: '붙여넣기',
+ virtualKeyboard: '가상 키보드',
+ ctrlAltDel: 'Ctrl + Alt + Delete'
+ },
+ mouse: {
+ cursor: {
+ title: '커서 모양',
+ pointer: '포인터',
+ grab: '손',
+ cell: '플러스',
+ hide: '숨기기'
+ },
+ mode: '마우스 모드',
+ absolute: '절대 모드',
+ relative: '상대 모드',
+ direction: '휠 방향',
+ scrollUp: '위로 스크롤',
+ scrollDown: '아래로 스크롤',
+ speed: '휠 속도',
+ fast: '빠르게',
+ slow: '느리게',
+ requestPointer: '상대 모드를 사용 중입니다. 마우스 포인터를 가져오려면 스크린을 클릭하세요.'
+ },
+ settings: {
+ title: '설정',
+ appearance: {
+ title: '화면 설정',
+ language: '언어',
+ menu: '메뉴 바',
+ menuTips: '시작 시 메뉴 바 열기'
+ },
+ update: {
+ title: '업데이트 확인',
+ latest: '최신 버전을 사용 중입니다.',
+ outdated: '업데이트가 가능합니다. 지금 업데이트하시겠습니까?',
+ downloading: '다운로드 중...',
+ installing: '설치 중...',
+ failed: '업데이트에 실패했습니다. 다시 시도해 주세요.',
+ confirm: '확인',
+ cancel: '취소'
+ },
+ about: {
+ title: '정보',
+ version: '버전',
+ community: '커뮤니티'
+ }
+ }
+ }
+}
+
+export default ko
diff --git a/desktop/src/renderer/src/i18n/locales/nl.ts b/desktop/src/renderer/src/i18n/locales/nl.ts
index dc1a86f..8cc968a 100644
--- a/desktop/src/renderer/src/i18n/locales/nl.ts
+++ b/desktop/src/renderer/src/i18n/locales/nl.ts
@@ -26,6 +26,7 @@ const nl = {
},
video: {
resolution: 'Resolutie',
+ scale: 'Schaal',
customResolution: 'Aangepast',
device: 'Apparaat',
custom: {
@@ -94,5 +95,5 @@ const nl = {
}
}
}
-
- export default nl
\ No newline at end of file
+
+ export default nl
diff --git a/desktop/src/renderer/src/i18n/locales/pl.ts b/desktop/src/renderer/src/i18n/locales/pl.ts
new file mode 100644
index 0000000..aee3c66
--- /dev/null
+++ b/desktop/src/renderer/src/i18n/locales/pl.ts
@@ -0,0 +1,84 @@
+const pl = {
+ translation: {
+ camera: {
+ tip: 'Oczekiwanie na autoryzację...',
+ denied: 'Brak uprawnień',
+ authorize:
+ 'Zdalny pulpit wymaga uprawnienia dostępu do kamery. Zezwól na dostęp do kamery w ustawieniach.',
+ failed: 'Nie udało połączyć się z kamerą. Spróbuj ponownie.'
+ },
+ modal: {
+ title: 'Wybierz urządzenie USB',
+ selectVideo: 'Wybierz urządzenie wejścia wideo',
+ selectSerial: 'Wybierz urządzenie portu szeregowego'
+ },
+ menu: {
+ serial: 'Port szeregowy',
+ keyboard: 'Klawiatura',
+ mouse: 'Mysz'
+ },
+ video: {
+ resolution: 'Rozdzielczość',
+ customResolution: 'Niestandardowa',
+ device: 'Urządzenie',
+ custom: {
+ title: 'Niestandardowa rozdzielczość',
+ width: 'Szerokość',
+ height: 'Wysokość',
+ confirm: 'Ok',
+ cancel: 'Anuluj'
+ }
+ },
+ keyboard: {
+ paste: 'Wklej',
+ virtualKeyboard: 'Klawiatura',
+ ctrlAltDel: 'Ctrl + Alt + Delete'
+ },
+ mouse: {
+ cursor: {
+ title: 'Kursor',
+ pointer: 'Wskaźnik',
+ grab: 'Chwyć',
+ cell: 'Zaznacz',
+ hide: 'Ukryj'
+ },
+ mode: 'Tryb myszy',
+ absolute: 'Tryb absolutny',
+ relative: 'Tryb względny',
+ direction: 'Kierunek kółka przewijania',
+ scrollUp: 'Przewijanie w górę',
+ scrollDown: 'Przewijanie w dół',
+ speed: 'Szybkość kółka',
+ fast: 'Szybko',
+ slow: 'Powoli',
+ requestPointer:
+ 'Użycie trybu względnego. Proszę kliknij na pulpicie aby aktywować wskaźnik myszy.'
+ },
+ settings: {
+ title: 'Ustawienia',
+ appearance: {
+ title: 'Wygląd',
+ language: 'Język',
+ menu: 'Menu',
+ menuTips: 'Rozwiń menu przy starcie'
+ },
+ update: {
+ title: 'Sprawdź dostępność aktualizacji',
+ latest: 'Używana wersja jest najnowsza.',
+ outdated: 'Aktualizacja jest dostępna. Czy chcesz teraz wykonać aktualizację?',
+ downloading: 'Pobieranie...',
+ installing: 'Instalacja...',
+ failed: 'Aktualizacja nieudana. Spróbuj ponownie.',
+ confirm: 'Potwierdź',
+ cancel: 'Anuluj'
+ },
+ about: {
+ title: 'O aplikacji',
+ version: 'Wersja',
+ community: 'Społeczność'
+ }
+ }
+ }
+}
+
+export default pl
diff --git a/desktop/src/renderer/src/i18n/locales/pt_br.ts b/desktop/src/renderer/src/i18n/locales/pt_br.ts
new file mode 100644
index 0000000..9950793
--- /dev/null
+++ b/desktop/src/renderer/src/i18n/locales/pt_br.ts
@@ -0,0 +1,84 @@
+const pt_br = {
+ translation: {
+ camera: {
+ tip: 'Esperando autorização...',
+ denied: 'Falha na autorização',
+ authorize:
+ 'A área de trabalho remota requer permissão de uso da câmera. Por favor, conceda as permissões de câmera nos ajustes.',
+ failed: 'Falha ao se conectar à câmera. Tente novamente.'
+ },
+ modal: {
+ title: 'Selecione o dispositivo USB',
+ selectVideo: 'Selecione um dispositivo de vídeo de entrada',
+ selectSerial: 'Selecione um dispositivo serial'
+ },
+ menu: {
+ serial: 'Serial',
+ keyboard: 'Teclado',
+ mouse: 'Mouse'
+ },
+ video: {
+ resolution: 'Resolução',
+ customResolution: 'Personalizada',
+ device: 'Dispositivo',
+ custom: {
+ title: 'Resolução Personalizada',
+ width: 'Largura',
+ height: 'Altura',
+ confirm: 'Ok',
+ cancel: 'Cancelar'
+ }
+ },
+ keyboard: {
+ paste: 'Colar',
+ virtualKeyboard: 'Teclado Virtual',
+ ctrlAltDel: 'Ctrl + Alt + Delete'
+ },
+ mouse: {
+ cursor: {
+ title: 'Cursor',
+ pointer: 'Ponteiro',
+ grab: 'Mão',
+ cell: 'Célula',
+ hide: 'Esconder'
+ },
+ mode: 'Modo do mouse',
+ absolute: 'Modo absoluto',
+ relative: 'Modo relativo',
+ direction: 'Direção do scroll',
+ scrollUp: 'Scroll para cima',
+ scrollDown: 'Scroll para baixo',
+ speed: 'Velocidade do scroll',
+ fast: 'Rápido',
+ slow: 'Lento',
+ requestPointer:
+ 'Usando modo relativo. Por favor, clique na área de trabalho para restaurar o ponteiro do mouse.'
+ },
+ settings: {
+ title: 'Ajustes',
+ appearance: {
+ title: 'Aparência',
+ language: 'Linguagem',
+ menu: 'Barra de menu',
+ menuTips: 'Abrir a barra de menu quando iniciar'
+ },
+ update: {
+ title: 'Verificar atualizações',
+ latest: 'Você já tem a versão mais recente.',
+ outdated: 'Uma atualização está disponível. Deseja atualizar agora?',
+ downloading: 'Fazendo download...',
+ installing: 'Instalando...',
+ failed: 'Falha na atualização. Por favor, tente novamente.',
+ confirm: 'Confirmar',
+ cancel: 'Cancelar'
+ },
+ about: {
+ title: 'Sobre',
+ version: 'Versão',
+ community: 'Comunidade'
+ }
+ }
+ }
+}
+
+export default pt_br
diff --git a/desktop/src/renderer/src/i18n/locales/ru.ts b/desktop/src/renderer/src/i18n/locales/ru.ts
index 09e19c0..b548bfd 100644
--- a/desktop/src/renderer/src/i18n/locales/ru.ts
+++ b/desktop/src/renderer/src/i18n/locales/ru.ts
@@ -26,6 +26,7 @@ const ru = {
},
video: {
resolution: 'Разрешение',
+ scale: 'Масштаб',
customResolution: 'Пользовательское',
device: 'Видеоустройство',
custom: {
@@ -38,7 +39,8 @@ const ru = {
},
keyboard: {
paste: 'Вставить текст',
- virtualKeyboard: 'Виртуальная клавиатура'
+ virtualKeyboard: 'Виртуальная клавиатура',
+ ctrlAltDel: 'Ctrl + Alt + Delete'
},
mouse: {
cursor: {
@@ -54,6 +56,9 @@ const ru = {
direction: 'Направление прокрутки',
scrollUp: 'Обычное',
scrollDown: 'Инвертированное',
+ speed: 'Скорость прокрутки',
+ fast: 'Быстро',
+ slow: 'Медленно',
requestPointer:
'Используется относительное позиционирование мыши. Чтобы захватить курсор, щелкните по видео на экране'
},
diff --git a/desktop/src/renderer/src/i18n/locales/zh.ts b/desktop/src/renderer/src/i18n/locales/zh.ts
index ee37c52..d873711 100644
--- a/desktop/src/renderer/src/i18n/locales/zh.ts
+++ b/desktop/src/renderer/src/i18n/locales/zh.ts
@@ -25,6 +25,7 @@ const zh = {
},
video: {
resolution: '分辨率',
+ scale: '缩放',
customResolution: '自定义',
device: '设备',
custom: {
@@ -57,7 +58,12 @@ const zh = {
speed: '滚轮速度',
fast: '快',
slow: '慢',
- requestPointer: '正在使用鼠标相对模式,请点击桌面获取鼠标指针。'
+ requestPointer: '正在使用鼠标相对模式,请点击桌面获取鼠标指针。',
+ jiggler: {
+ title: '空闲晃动',
+ enable: '启用',
+ disable: '禁用'
+ }
},
settings: {
title: '设置',
diff --git a/desktop/src/renderer/src/i18n/locales/zh_tw.ts b/desktop/src/renderer/src/i18n/locales/zh_tw.ts
new file mode 100644
index 0000000..416d18a
--- /dev/null
+++ b/desktop/src/renderer/src/i18n/locales/zh_tw.ts
@@ -0,0 +1,67 @@
+const zh_tw = {
+ translation: {
+ serial: {
+ notSupported: '當前瀏覽器不支援序列埠,無法使用鍵鼠。請使用桌面版 Chrome 瀏覽器。',
+ failed: '序列埠連線失敗,請重試。'
+ },
+ camera: {
+ tip: '等待授權中...',
+ denied: '權限不足',
+ authorize: '遠端桌面需要取得攝影機權限,請在瀏覽器設定中允許使用攝影機。',
+ failed: '攝影機連線失敗,請重試。'
+ },
+ modal: {
+ title: '選擇 USB 裝置',
+ selectVideo: '請選擇視訊輸入裝置',
+ selectSerial: '選擇序列埠裝置'
+ },
+ menu: {
+ serial: '序列埠',
+ keyboard: '鍵盤',
+ mouse: '滑鼠'
+ },
+ video: {
+ resolution: '解析度',
+ customResolution: '自訂',
+ device: '裝置',
+ custom: {
+ title: '自訂解析度',
+ width: '寬度',
+ height: '高度',
+ confirm: '確定',
+ cancel: '取消'
+ }
+ },
+ keyboard: {
+ paste: '貼上',
+ virtualKeyboard: '虛擬鍵盤',
+ ctrlAltDel: 'Ctrl + Alt + Delete'
+ },
+ mouse: {
+ cursor: {
+ title: '滑鼠指標',
+ pointer: '箭頭',
+ grab: '抓取',
+ cell: '格線',
+ hide: '隱藏'
+ },
+ mode: '滑鼠模式',
+ absolute: '絕對模式',
+ relative: '相對模式',
+ direction: '滾輪方向',
+ scrollUp: '向上',
+ scrollDown: '向下',
+ speed: '滾輪速度',
+ fast: '快',
+ slow: '慢',
+ requestPointer: '正在使用滑鼠相對模式,請點擊桌面取得滑鼠指標。'
+ },
+ settings: {
+ language: '語言',
+ document: '文件',
+ download: '下載'
+ }
+ }
+}
+
+export default zh_tw
diff --git a/desktop/src/renderer/src/jotai/device.ts b/desktop/src/renderer/src/jotai/device.ts
index 448101f..ff81d6b 100644
--- a/desktop/src/renderer/src/jotai/device.ts
+++ b/desktop/src/renderer/src/jotai/device.ts
@@ -10,6 +10,8 @@ export const resolutionAtom = atom({
height: 1080
})
+export const videoScaleAtom = atom(1.0)
+
export const videoDeviceIdAtom = atom('')
export const videoStateAtom = atom('disconnected')
diff --git a/desktop/src/renderer/src/jotai/mouse.ts b/desktop/src/renderer/src/jotai/mouse.ts
index 4a33252..01f3620 100644
--- a/desktop/src/renderer/src/jotai/mouse.ts
+++ b/desktop/src/renderer/src/jotai/mouse.ts
@@ -10,4 +10,7 @@ export const mouseModeAtom = atom('absolute')
export const scrollDirectionAtom = atom(1)
// mouse scroll interval (unit: ms)
-export const scrollIntervalAtom = atom(0);
+export const scrollIntervalAtom = atom(0)
+
+// mouse jiggler mode: enable or disable
+export const mouseJigglerModeAtom = atom<'enable' | 'disable'>('disable')
diff --git a/desktop/src/renderer/src/libs/mouse-jiggler/index.ts b/desktop/src/renderer/src/libs/mouse-jiggler/index.ts
new file mode 100644
index 0000000..bfdd4b7
--- /dev/null
+++ b/desktop/src/renderer/src/libs/mouse-jiggler/index.ts
@@ -0,0 +1,50 @@
+import { IpcEvents } from '@common/ipc-events'
+import type { Mouse as MouseKey } from '@renderer/types'
+
+const MOUSE_JIGGLER_INTERVAL = 15_000
+const EMPTY_KEY: MouseKey = { left: false, right: false, mid: false }
+
+class MouseJiggler {
+ private lastMoveTime: number
+ private timer: NodeJS.Timeout | null
+ private mode: 'enable' | 'disable'
+
+ constructor() {
+ this.lastMoveTime = Date.now()
+ this.timer = null
+ this.mode = 'disable'
+ }
+
+ // enable or disable mouse jiggler
+ setMode(mode: 'enable' | 'disable'): void {
+ this.mode = mode
+ if (mode === 'disable' && this.timer !== null) {
+ clearInterval(this.timer)
+ this.timer = null
+ } else if (mode === 'enable' && this.timer === null) {
+ this.timer = setInterval(() => {
+ this.timeoutCallback()
+ }, MOUSE_JIGGLER_INTERVAL / 5)
+ }
+ }
+
+ // addEventListener to canvas on 'mousemove' event
+ moveEventCallback(): void {
+ if (this.mode === 'enable') {
+ this.lastMoveTime = Date.now()
+ }
+ }
+
+ timeoutCallback(): void {
+ if (Date.now() - this.lastMoveTime > MOUSE_JIGGLER_INTERVAL) {
+ this.lastMoveTime = Date.now() - 1_000
+ this.sendJiggle()
+ }
+ }
+
+ async sendJiggle(): Promise {
+ await window.electron.ipcRenderer.invoke(IpcEvents.SEND_MOUSE_RELATIVE, EMPTY_KEY, 10, 10, 0)
+ await window.electron.ipcRenderer.invoke(IpcEvents.SEND_MOUSE_RELATIVE, EMPTY_KEY, -10, -10, 0)
+ }
+}
+export const mouseJiggler = new MouseJiggler()
diff --git a/desktop/src/renderer/src/libs/storage/index.ts b/desktop/src/renderer/src/libs/storage/index.ts
index 077f5c4..c4c38b8 100644
--- a/desktop/src/renderer/src/libs/storage/index.ts
+++ b/desktop/src/renderer/src/libs/storage/index.ts
@@ -5,6 +5,7 @@ import { getWithExpiry, setWithExpiry } from './expiry'
const LANGUAGE_KEY = 'nanokvm-usb-language'
const VIDEO_DEVICE_ID_KEY = 'nanokvm-usb-video-device-id'
const VIDEO_RESOLUTION_KEY = 'nanokvm-usb-video-resolution'
+const VIDEO_SCALE_KEY = 'nanokvm-usb-video-scale'
const CUSTOM_RESOLUTION_KEY = 'nanokvm-usb-custom-resolution'
const SERIAL_PORT_KEY = 'nanokvm-serial-port'
const IS_MENU_OPEN_KEY = 'nanokvm-is-menu-open'
@@ -14,6 +15,7 @@ const MOUSE_SCROLL_DIRECTION_KEY = 'nanokvm-usb-mouse-scroll-direction'
const SKIP_UPDATE_KEY = 'nano-kvm-check-update'
const MOUSE_SCROLL_INTERVAL_KEY = 'nanokvm-usb-mouse-scroll-interval'
const BAUD_RATE_KEY = 'nanokvm-usb-baud-rate'
+const MOUSE_JIGGLER_MODE_KEY = 'nanokvm-usb-mouse-jiggler-mode'
export function getLanguage(): string | null {
return localStorage.getItem(LANGUAGE_KEY)
@@ -64,6 +66,18 @@ export function removeCustomResolutions(): void {
localStorage.removeItem(CUSTOM_RESOLUTION_KEY)
}
+export function getVideoScale(): number | null {
+ const scale = localStorage.getItem(VIDEO_SCALE_KEY)
+ if (scale && Number(scale)) {
+ return Number(scale)
+ }
+ return null
+}
+
+export function setVideoScale(scale: number): void {
+ localStorage.setItem(VIDEO_SCALE_KEY, String(scale))
+}
+
export function getSerialPort(): string | null {
return localStorage.getItem(SERIAL_PORT_KEY)
}
@@ -159,4 +173,11 @@ export function clearAllSettings(): void {
localStorage.removeItem(SKIP_UPDATE_KEY)
localStorage.removeItem(MOUSE_SCROLL_INTERVAL_KEY)
localStorage.removeItem(BAUD_RATE_KEY)
+export function getMouseJigglerMode(): 'enable' | 'disable' {
+ const jiggler = localStorage.getItem(MOUSE_JIGGLER_MODE_KEY)
+ return jiggler && jiggler === 'enable' ? 'enable' : 'disable'
+}
+
+export function setMouseJigglerMode(jiggler: 'enable' | 'disable'): void {
+ localStorage.setItem(MOUSE_JIGGLER_MODE_KEY, jiggler)
}
diff --git a/docker-compose.yml b/docker-compose.yml
new file mode 100644
index 0000000..5a0fb5a
--- /dev/null
+++ b/docker-compose.yml
@@ -0,0 +1,9 @@
+services:
+ nanokvm-usb:
+ build:
+ context: ./
+ dockerfile: Dockerfile
+ image: sipeed/nanokvm-usb:latest
+ container_name: nanokvm-usb
+ ports:
+ - "9000:80"
\ No newline at end of file
diff --git a/nginx.conf b/nginx.conf
new file mode 100644
index 0000000..f3cbcf9
--- /dev/null
+++ b/nginx.conf
@@ -0,0 +1,38 @@
+worker_processes 1;
+
+error_log /dev/stdout info;
+
+events {
+ worker_connections 1024;
+}
+
+http {
+ include mime.types;
+ default_type application/octet-stream;
+ sendfile on;
+ keepalive_timeout 65;
+
+ server {
+ listen 80;
+
+ root /usr/share/nginx/html;
+
+ add_header X-Frame-Options "SAMEORIGIN";
+ add_header X-XSS-Protection "1; mode=block";
+ add_header X-Content-Type-Options "nosniff";
+
+ index index.html;
+
+ charset utf-8;
+
+ location / {
+ try_files $uri $uri/ /index.html;
+ }
+
+ location = /robots.txt { access_log off; log_not_found off; }
+
+ location ~ /\.(?!well-known).* {
+ deny all;
+ }
+ }
+}
\ No newline at end of file