-
About
-
OpenRewind
-
Version: {pjson.version}
+
>
- )
+ );
}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index f5c4824..c7033b9 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -17,12 +17,27 @@ importers:
electron-reloader:
specifier: ^1.2.3
version: 1.2.3
+ electron-screencapture:
+ specifier: ^1.1.0
+ version: 1.1.0
electron-serve:
specifier: ^2.1.1
version: 2.1.1
+ electron-store:
+ specifier: ^10.0.0
+ version: 10.0.0
electron-window-state:
specifier: ^5.0.3
version: 5.0.3
+ execa:
+ specifier: ^9.5.1
+ version: 9.5.1
+ ffmpeg-static:
+ specifier: ^5.2.0
+ version: 5.2.0
+ fluent-ffmpeg:
+ specifier: ^2.1.3
+ version: 2.1.3
i18next:
specifier: ^24.0.2
version: 24.0.2(typescript@5.6.3)
@@ -47,6 +62,9 @@ importers:
react-i18next:
specifier: ^15.1.2
version: 15.1.2(i18next@24.0.2(typescript@5.6.3))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react-router:
+ specifier: ^7.0.1
+ version: 7.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
react-router-dom:
specifier: ^7.0.1
version: 7.0.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
@@ -57,6 +75,12 @@ importers:
'@eslint/js':
specifier: ^9.13.0
version: 9.15.0
+ '@iconify-icon/react':
+ specifier: ^2.1.0
+ version: 2.1.0(react@18.3.1)
+ '@types/fluent-ffmpeg':
+ specifier: ^2.1.27
+ version: 2.1.27
'@types/gulp':
specifier: ^4.0.17
version: 4.0.17
@@ -123,6 +147,9 @@ importers:
vite:
specifier: ^5.4.10
version: 5.4.11(@types/node@20.17.7)
+ vite-plugin-chunk-split:
+ specifier: ^0.5.0
+ version: 0.5.0(vite@5.4.11(@types/node@20.17.7))
packages:
@@ -220,6 +247,10 @@ packages:
resolution: {integrity: sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==}
engines: {node: '>=6.9.0'}
+ '@derhuerst/http-basic@8.2.4':
+ resolution: {integrity: sha512-F9rL9k9Xjf5blCz8HsJRO4diy111cayL2vkY2XE4r4t3n0yPXVYy3KD3nJ1qbrSn9743UWSXH4IwuCa/HWlGFw==}
+ engines: {node: '>=6.0.0'}
+
'@develar/schema-utils@2.6.5':
resolution: {integrity: sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig==}
engines: {node: '>= 8.9.0'}
@@ -469,6 +500,14 @@ packages:
resolution: {integrity: sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==}
engines: {node: '>=18.18'}
+ '@iconify-icon/react@2.1.0':
+ resolution: {integrity: sha512-OuEsW5Y474rg3WlseLFQ0uuJjnyk1DhLN1Ire5JGjF4sF8/rNxGJDLSItEogRcKuUbL+zzuoBsaTUVVInuixRA==}
+ peerDependencies:
+ react: '>=16'
+
+ '@iconify/types@2.0.0':
+ resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==}
+
'@isaacs/cliui@8.0.2':
resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==}
engines: {node: '>=12'}
@@ -614,6 +653,9 @@ packages:
cpu: [x64]
os: [win32]
+ '@sec-ant/readable-stream@0.4.1':
+ resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==}
+
'@sindresorhus/is@4.6.0':
resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==}
engines: {node: '>=10'}
@@ -622,6 +664,10 @@ packages:
resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==}
engines: {node: '>=18'}
+ '@sindresorhus/merge-streams@4.0.0':
+ resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==}
+ engines: {node: '>=18'}
+
'@szmarczak/http-timer@4.0.6':
resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==}
engines: {node: '>=10'}
@@ -657,6 +703,9 @@ packages:
'@types/expect@1.20.4':
resolution: {integrity: sha512-Q5Vn3yjTDyCMV50TB6VRIbQNxSE4OmZR86VSbGaNpfUolm0iePBB4KdEEHmxoY5sT2+2DIvXW0rvMDP2nHZ4Mg==}
+ '@types/fluent-ffmpeg@2.1.27':
+ resolution: {integrity: sha512-QiDWjihpUhriISNoBi2hJBRUUmoj/BMTYcfz+F+ZM9hHWBYABFAE6hjP/TbCZC0GWwlpa3FzvHH9RzFeRusZ7A==}
+
'@types/fs-extra@9.0.13':
resolution: {integrity: sha512-nEnwB++1u5lVDM2UI4c1+5R+FYaKfaAzS4OococimjVm3nQw3TuzH5UNsocrcTBbhnerblyHj4A49qXbIiZdpA==}
@@ -678,6 +727,9 @@ packages:
'@types/ms@0.7.34':
resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==}
+ '@types/node@10.17.60':
+ resolution: {integrity: sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==}
+
'@types/node@20.17.7':
resolution: {integrity: sha512-sZXXnpBFMKbao30dUAvzKbdwA2JM1fwUtVEq/kxKuPI5mMwZiRElCpTXb0Biq/LMEVpXDZL5G5V0RPnxKeyaYg==}
@@ -833,6 +885,14 @@ packages:
resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==}
engines: {node: '>=8'}
+ ajv-formats@3.0.1:
+ resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==}
+ peerDependencies:
+ ajv: ^8.0.0
+ peerDependenciesMeta:
+ ajv:
+ optional: true
+
ajv-keywords@3.5.2:
resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==}
peerDependencies:
@@ -841,6 +901,9 @@ packages:
ajv@6.12.6:
resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
+ ajv@8.17.1:
+ resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==}
+
ansi-colors@1.1.0:
resolution: {integrity: sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==}
engines: {node: '>=0.10.0'}
@@ -952,6 +1015,9 @@ packages:
resolution: {integrity: sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==}
engines: {node: '>=0.10.0'}
+ array-find@1.0.0:
+ resolution: {integrity: sha512-kO/vVCacW9mnpn3WPWbTVlEnOabK2L7LWi2HViURtCM46y1zb6I8UMjx4LgbiqadTgHnLInUronwn3ampNTJtQ==}
+
array-slice@0.2.3:
resolution: {integrity: sha512-rlVfZW/1Ph2SNySXwR9QYkChp8EkOEiTMO5Vwx60usw04i4nWemkm9RXmQqgkQFaLHsqLuADvjp6IfgL9l2M8Q==}
engines: {node: '>=0.10.0'}
@@ -988,6 +1054,9 @@ packages:
resolution: {integrity: sha512-Obu/KE8FurfQRN6ODdHN9LuXqwC+JFIM9NRyZqJJ4ZfLJmIYN9Rg0/kb+wF70VV5+fJusTMQlJ1t5rF7J/ETdg==}
engines: {node: '>= 10.13.0'}
+ async@0.2.10:
+ resolution: {integrity: sha512-eAkdoKxU6/LkKDBzLpT+t6Ff5EtfSF4wx1WfJiPEEV7WNLnDaRXk0oVysiEPm262roaachGexwUv94WhSgN5TQ==}
+
async@3.2.6:
resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==}
@@ -998,6 +1067,9 @@ packages:
resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==}
engines: {node: '>= 4.0.0'}
+ atomically@2.0.3:
+ resolution: {integrity: sha512-kU6FmrwZ3Lx7/7y3hPS5QnbJfaohcIul5fGqf7ok+4KklIEk9tJ0C2IQPdacSbVUWv6zVHXEBWoWd6NrVMT7Cw==}
+
autoprefixer@10.4.20:
resolution: {integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==}
engines: {node: ^10 || ^12 || >=14}
@@ -1103,6 +1175,9 @@ packages:
caniuse-lite@1.0.30001683:
resolution: {integrity: sha512-iqmNnThZ0n70mNwvxpEC2nBJ037ZHZUoBI5Gorh1Mw6IlEAZujEoU1tXA628iZfzm7R9FvFzxbfdgml82a3k8Q==}
+ caseless@0.12.0:
+ resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==}
+
chalk@4.1.2:
resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
engines: {node: '>=10'}
@@ -1204,11 +1279,19 @@ packages:
concat-map@0.0.1:
resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
+ concat-stream@2.0.0:
+ resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==}
+ engines: {'0': node >= 6.0}
+
concurrently@9.1.0:
resolution: {integrity: sha512-VxkzwMAn4LP7WyMnJNbHN5mKV9L2IbyDjpzemKr99sXNR3GqRNMMHdm7prV1ws9wg7ETj6WUkNOigZVsptwbgg==}
engines: {node: '>=18'}
hasBin: true
+ conf@13.0.1:
+ resolution: {integrity: sha512-l9Uwc9eOnz39oADzGO2cSBDi7siv8lwO+31ocQ2nOJijnDiW3pxqm9VV10DPYUO28wW83DjABoUqY1nfHRR2hQ==}
+ engines: {node: '>=18'}
+
config-file-ts@0.2.8-rc1:
resolution: {integrity: sha512-GtNECbVI82bT4RiDIzBSVuTKoSHufnU7Ce7/42bkWZJZFLjmDF2WBpVsvRkhKCfKBnTBb3qZrBwPpFBU/Myvhg==}
@@ -1268,6 +1351,10 @@ packages:
resolution: {integrity: sha512-uqCUKXE5q1PNBXjPqvwhwJf9SwMoAHBgWJ6DcrnS5o+W2JOiIILl0JEdVD8SGujrNS02GGxgwAg2PN2zONgtjg==}
engines: {node: '>=6'}
+ debounce-fn@6.0.0:
+ resolution: {integrity: sha512-rBMW+F2TXryBwB54Q0d8drNEI+TfoS9JpNTAoVpukbWEhjXQq4rySFYLaqXMFXwdv61Zb2OHtj5bviSoimqxRQ==}
+ engines: {node: '>=18'}
+
debug@4.3.7:
resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==}
engines: {node: '>=6.0'}
@@ -1339,6 +1426,10 @@ packages:
os: [darwin]
hasBin: true
+ dot-prop@9.0.0:
+ resolution: {integrity: sha512-1gxPBJpI/pcjQhKgIU91II6Wkay+dLcN3M6rf2uwP8hRur3HtQXjVrdAK3sjC0piaEuxzMwjXChcETiJl47lAQ==}
+ engines: {node: '>=18'}
+
dotenv-expand@11.0.7:
resolution: {integrity: sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==}
engines: {node: '>=12'}
@@ -1391,10 +1482,17 @@ packages:
electron-reloader@1.2.3:
resolution: {integrity: sha512-aDnACAzNg0QvQhzw7LYOx/nVS10mEtbuG6M0QQvNQcLnJEwFs6is+EGRCnM+KQlQ4KcTbdwnt07nd7ZjHpY4iw==}
+ electron-screencapture@1.1.0:
+ resolution: {integrity: sha512-KIgITB+90r5bGF8B+f4fFyz4JTz74NgFc20xY5NAT/H9dM/FNH3cCVvVBjcAqhur+6P8/fV6ruarGzOqalpjPA==}
+
electron-serve@2.1.1:
resolution: {integrity: sha512-SJdA7bfZuPODK9BkXTZ8EPsQlzg6yNSA0H6811DQvqzyDhPP8icIACA0bIA9aWeT+gmDB7V4eMg/wZhR+ijk6w==}
engines: {node: '>=18'}
+ electron-store@10.0.0:
+ resolution: {integrity: sha512-BU/QZh+5twHBprRdLu3YZX/rIarmZzhTNpJvAvqG1/yN0mNCrsMh0kl7bM4xaUKDNRiHz1r7wP/7Prjh7cleIw==}
+ engines: {node: '>=20'}
+
electron-to-chromium@1.5.64:
resolution: {integrity: sha512-IXEuxU+5ClW2IGEYFC2T7szbyVgehupCWQe5GNh+H065CD6U6IFN0s4KeAMFGNmQolRU4IV7zGBWSYMmZ8uuqQ==}
@@ -1426,6 +1524,10 @@ packages:
resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==}
engines: {node: '>=6'}
+ env-paths@3.0.0:
+ resolution: {integrity: sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
err-code@2.0.3:
resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==}
@@ -1437,6 +1539,9 @@ packages:
resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
engines: {node: '>= 0.4'}
+ es-module-lexer@1.5.4:
+ resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==}
+
es6-error@4.1.1:
resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==}
@@ -1514,6 +1619,10 @@ packages:
resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
engines: {node: '>=0.10.0'}
+ execa@9.5.1:
+ resolution: {integrity: sha512-QY5PPtSonnGwhhHDNI7+3RvY285c7iuJFFB+lU+oEzMY/gEGJ808owqJsrr8Otd1E/x07po1LkUBmdAc5duPAg==}
+ engines: {node: ^18.19.0 || >=20.5.0}
+
expand-tilde@2.0.2:
resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==}
engines: {node: '>=0.10.0'}
@@ -1572,6 +1681,9 @@ packages:
fast-levenshtein@3.0.0:
resolution: {integrity: sha512-hKKNajm46uNmTlhHSyZkmToAc56uZJwYq7yrciZjqOxnlfQwERDQJmHPUp7m1m9wx8vgOe8IaCKZ5Kv2k1DdCQ==}
+ fast-uri@3.0.3:
+ resolution: {integrity: sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==}
+
fastest-levenshtein@1.0.16:
resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==}
engines: {node: '>= 4.9.1'}
@@ -1582,6 +1694,14 @@ packages:
fd-slicer@1.1.0:
resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==}
+ ffmpeg-static@5.2.0:
+ resolution: {integrity: sha512-WrM7kLW+do9HLr+H6tk7LzQ7kPqbAgLjdzNE32+u3Ff11gXt9Kkkd2nusGFrlWMIe+XaA97t+I8JS7sZIrvRgA==}
+ engines: {node: '>=16'}
+
+ figures@6.1.0:
+ resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==}
+ engines: {node: '>=18'}
+
file-entry-cache@8.0.0:
resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==}
engines: {node: '>=16.0.0'}
@@ -1616,6 +1736,10 @@ packages:
flatted@3.3.2:
resolution: {integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==}
+ fluent-ffmpeg@2.1.3:
+ resolution: {integrity: sha512-Be3narBNt2s6bsaqP6Jzq91heDgOEaDCJAXcE3qcma/EJBSy5FB4cvO31XBInuAuKBx8Kptf8dkhjK0IOru39Q==}
+ engines: {node: '>=18'}
+
flush-write-stream@1.1.1:
resolution: {integrity: sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==}
@@ -1705,6 +1829,10 @@ packages:
resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==}
engines: {node: '>=8'}
+ get-stream@9.0.1:
+ resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==}
+ engines: {node: '>=18'}
+
glob-parent@3.1.0:
resolution: {integrity: sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==}
@@ -1861,6 +1989,9 @@ packages:
resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==}
engines: {node: '>= 14'}
+ http-response-object@3.0.2:
+ resolution: {integrity: sha512-bqX0XTF6fnXSQcEJ2Iuyr75yVakyjIDCqroJQ/aHfSdlM743Cwqoi2nDYMzLGWUcuTWGWy8AAvOKXTfiv6q9RA==}
+
http2-wrapper@1.0.3:
resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==}
engines: {node: '>=10.19.0'}
@@ -1873,6 +2004,10 @@ packages:
resolution: {integrity: sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==}
engines: {node: '>= 14'}
+ human-signals@8.0.0:
+ resolution: {integrity: sha512-/1/GPCpDUCCYwlERiYjxoczfP0zfvZMU/OWgQPMya9AbAE24vseigFdhAMObpc8Q4lc/kjutPfUddDYyAmejnA==}
+ engines: {node: '>=18.18.0'}
+
humanize-ms@1.2.1:
resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==}
@@ -1904,6 +2039,9 @@ packages:
typescript:
optional: true
+ iconify-icon@2.1.0:
+ resolution: {integrity: sha512-lto4XU3bwTQnb+D/CsJ4dWAo0aDe+uPMxEtxyOodw9l7R9QnJUUab3GCehlw2M8mDHdeUu/ufx8PvRQiJphhXg==}
+
iconv-corefoundation@1.1.7:
resolution: {integrity: sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ==}
engines: {node: ^8.11.2 || >=10}
@@ -1924,6 +2062,9 @@ packages:
resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==}
engines: {node: '>=6'}
+ import-meta-resolve@4.1.0:
+ resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==}
+
imurmurhash@0.1.4:
resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
engines: {node: '>=0.8.19'}
@@ -2026,6 +2167,10 @@ packages:
resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==}
engines: {node: '>=0.10.0'}
+ is-plain-obj@4.1.0:
+ resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==}
+ engines: {node: '>=12'}
+
is-plain-object@2.0.4:
resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==}
engines: {node: '>=0.10.0'}
@@ -2038,6 +2183,10 @@ packages:
resolution: {integrity: sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==}
engines: {node: '>=0.10.0'}
+ is-stream@4.0.1:
+ resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==}
+ engines: {node: '>=18'}
+
is-unc-path@1.0.0:
resolution: {integrity: sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==}
engines: {node: '>=0.10.0'}
@@ -2046,6 +2195,10 @@ packages:
resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==}
engines: {node: '>=10'}
+ is-unicode-supported@2.1.0:
+ resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==}
+ engines: {node: '>=18'}
+
is-utf8@0.2.1:
resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==}
@@ -2108,6 +2261,12 @@ packages:
json-schema-traverse@0.4.1:
resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
+ json-schema-traverse@1.0.0:
+ resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==}
+
+ json-schema-typed@8.0.1:
+ resolution: {integrity: sha512-XQmWYj2Sm4kn4WeTYvmpKEbyPsL7nBsb647c7pMe6l02/yx2+Jfc4dT6UZkEXnIUb5LhD55r2HPsJ1milQ4rDg==}
+
json-stable-stringify-without-jsonify@1.0.1:
resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
@@ -2174,6 +2333,15 @@ packages:
resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
engines: {node: '>=10'}
+ lodash._basefindindex@3.6.0:
+ resolution: {integrity: sha512-Ay3Ok74tVwGB79L5lVZlVgpGYjV9ty8DEVPxIUhgGGkqrqk6I+BPJ5kUIxd5S1b2Qg03VXtdg/Dpv2zcwQReoA==}
+
+ lodash._baseiteratee@4.6.1:
+ resolution: {integrity: sha512-hli5Y7hGhels23SFdNT54n1e8d9YzyvCAEqQnN6BdesRrpQAgp2UHjRPyCS2BwtkI3xnBWTJqNdnc12QtxBsNA==}
+
+ lodash._stringtopath@4.7.1:
+ resolution: {integrity: sha512-y5LCbEtJJc4CLRwNRw3YEAx5xWzzk2P7F2I16QbTxCy7VHtR3DSidQzzkyeAGRQ6d+kc5hV0pLJcFcYlwZ4psw==}
+
lodash.clonedeep@4.5.0:
resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==}
@@ -2183,6 +2351,9 @@ packages:
lodash.difference@4.5.0:
resolution: {integrity: sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==}
+ lodash.findindex@4.3.0:
+ resolution: {integrity: sha512-wNvJPGKUvYPeDL8HfXEup4GiBL32+wEd/G31i5JmcnyuPRuZq2/NlZKM4NLUH62Q3IsNounRjE29GU+5cK2TQA==}
+
lodash.flatten@4.4.0:
resolution: {integrity: sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==}
@@ -2230,6 +2401,9 @@ packages:
resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==}
engines: {node: '>=12'}
+ magic-string@0.30.14:
+ resolution: {integrity: sha512-5c99P1WKTed11ZC0HMJOj6CDIue6F8ySu+bJL+85q1zBEIY8IklrJ1eiKC2NDRh3Ct3FcvmJPyQHb9erXMTJNw==}
+
make-fetch-happen@10.2.1:
resolution: {integrity: sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==}
engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
@@ -2271,6 +2445,10 @@ packages:
resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
engines: {node: '>=6'}
+ mimic-function@5.0.1:
+ resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==}
+ engines: {node: '>=18'}
+
mimic-response@1.0.1:
resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==}
engines: {node: '>=4'}
@@ -2411,6 +2589,10 @@ packages:
resolution: {integrity: sha512-pGO4pzSdaxhWTGkfSfHx3hVzJVslFPwBp2Myq9MYN/ChfJZF87ochMAXnvz6/58RJSf5ik2q9tXprBBrk2cpcg==}
engines: {node: '>= 10.13.0'}
+ npm-run-path@6.0.0:
+ resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==}
+ engines: {node: '>=18'}
+
npmlog@6.0.2:
resolution: {integrity: sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==}
engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
@@ -2485,10 +2667,17 @@ packages:
resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
engines: {node: '>=6'}
+ parse-cache-control@1.0.1:
+ resolution: {integrity: sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==}
+
parse-filepath@1.0.2:
resolution: {integrity: sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==}
engines: {node: '>=0.8'}
+ parse-ms@4.0.0:
+ resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==}
+ engines: {node: '>=18'}
+
parse-node-version@1.0.1:
resolution: {integrity: sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==}
engines: {node: '>= 0.10'}
@@ -2516,6 +2705,10 @@ packages:
resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
engines: {node: '>=8'}
+ path-key@4.0.0:
+ resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==}
+ engines: {node: '>=12'}
+
path-parse@1.0.7:
resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
@@ -2614,6 +2807,10 @@ packages:
resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
engines: {node: '>= 0.8.0'}
+ pretty-ms@9.2.0:
+ resolution: {integrity: sha512-4yf0QO/sllf/1zbZWYnvWw3NxCQwLXKzIj0G849LSufP15BXKM0rbD2Z3wVnkMfjdn/CB0Dpp444gYAACdsplg==}
+ engines: {node: '>=18'}
+
process-nextick-args@2.0.1:
resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==}
@@ -2728,6 +2925,10 @@ packages:
resolution: {integrity: sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==}
engines: {node: '>= 10.13.0'}
+ recordrtc@5.1.0:
+ resolution: {integrity: sha512-0rQ7FcrCNtNyl9zrpUO+rcB3SsTNpIHAa9c7OG1JVhQTfhDKRVvl4Hvht42dHmSASVWGR4OpE2LMa72EjiQDZw==}
+ deprecated: Use v5.5.0 or higher to fix createObjectURL/srcObjec issues
+
regenerator-runtime@0.14.1:
resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==}
@@ -2758,6 +2959,10 @@ packages:
resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
engines: {node: '>=0.10.0'}
+ require-from-string@2.0.2:
+ resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==}
+ engines: {node: '>=0.10.0'}
+
resedit@1.7.2:
resolution: {integrity: sha512-vHjcY2MlAITJhC0eRD/Vv8Vlgmu9Sd3LX9zZvtGzU5ZImdTN3+d6e/4mnTyV8vEbyf1sgNIrWxhWlrys52OkEA==}
engines: {node: '>=12', npm: '>=6'}
@@ -2995,10 +3200,17 @@ packages:
resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==}
engines: {node: '>=12'}
+ strip-final-newline@4.0.0:
+ resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==}
+ engines: {node: '>=18'}
+
strip-json-comments@3.1.1:
resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
engines: {node: '>=8'}
+ stubborn-fs@1.2.5:
+ resolution: {integrity: sha512-H2N9c26eXjzL/S/K+i/RHHcFanE74dptvvjM8iwzwbVcWY/zjBbgRqF3K0DY4+OD+uTTASTBvDoxPDaPN02D7g==}
+
sucrase@3.35.0:
resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==}
engines: {node: '>=16 || 14 >=14.17'}
@@ -3132,6 +3344,13 @@ packages:
resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==}
engines: {node: '>=10'}
+ type-fest@4.29.0:
+ resolution: {integrity: sha512-RPYt6dKyemXJe7I6oNstcH24myUGSReicxcHTvCLgzm4e0n8y05dGvcGB15/SoPRBmhlMthWQ9pvKyL81ko8nQ==}
+ engines: {node: '>=16'}
+
+ typedarray@0.0.6:
+ resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==}
+
typescript-eslint@8.15.0:
resolution: {integrity: sha512-wY4FRGl0ZI+ZU4Jo/yjdBu0lVTSML58pu6PgGtJmCufvzfV565pUF6iACQt092uFOd49iLOTX/sEVmHtbSrS+w==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
@@ -3147,6 +3366,10 @@ packages:
engines: {node: '>=14.17'}
hasBin: true
+ uint8array-extras@1.4.0:
+ resolution: {integrity: sha512-ZPtzy0hu4cZjv3z5NW9gfKnNLjoz4y6uv4HlelAjDK7sY/xOkKZv9xK/WQpcsBB3jEybChz9DPC2U/+cusjJVQ==}
+ engines: {node: '>=18'}
+
unc-path-regex@0.1.2:
resolution: {integrity: sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==}
engines: {node: '>=0.10.0'}
@@ -3166,6 +3389,10 @@ packages:
resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==}
engines: {node: '>=18'}
+ unicorn-magic@0.3.0:
+ resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==}
+ engines: {node: '>=18'}
+
unique-filename@2.0.1:
resolution: {integrity: sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==}
engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
@@ -3248,6 +3475,11 @@ packages:
resolution: {integrity: sha512-rC2VRfAVVCGEgjnxHUnpIVh3AGuk62rP3tqVrn+yab0YH7UULisC085+NYH+mnqf3Wx4SpSi1RQMwudL89N03g==}
engines: {node: '>=10.13.0'}
+ vite-plugin-chunk-split@0.5.0:
+ resolution: {integrity: sha512-pasNKLhH+ICjoCF6HoKKvgmZ1LEPSCIKAa8Lz0ZpMyQC9bLmCLT7UxgKMULewsc9SUw89OX0udsGiIQCtr8wLA==}
+ peerDependencies:
+ vite: ^4 || ^5
+
vite-tsconfig-paths@5.1.3:
resolution: {integrity: sha512-0bz+PDlLpGfP2CigeSKL9NFTF1KtXkeHGZSSaGQSuPZH77GhoiQaA8IjYgOaynSuwlDTolSUEU0ErVvju3NURg==}
peerDependencies:
@@ -3294,6 +3526,9 @@ packages:
wcwidth@1.0.1:
resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==}
+ when-exit@2.1.3:
+ resolution: {integrity: sha512-uVieSTccFIr/SFQdFWN/fFaQYmV37OKtuaGphMAzi4DmmUlrvRBJW5WSLkHyjNQY/ePJMz3LoiX9R3yy1Su6Hw==}
+
which@1.3.1:
resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==}
hasBin: true
@@ -3367,6 +3602,10 @@ packages:
resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
engines: {node: '>=10'}
+ yoctocolors@2.1.1:
+ resolution: {integrity: sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==}
+ engines: {node: '>=18'}
+
zip-stream@4.1.1:
resolution: {integrity: sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==}
engines: {node: '>= 10'}
@@ -3496,6 +3735,13 @@ snapshots:
'@babel/helper-string-parser': 7.25.9
'@babel/helper-validator-identifier': 7.25.9
+ '@derhuerst/http-basic@8.2.4':
+ dependencies:
+ caseless: 0.12.0
+ concat-stream: 2.0.0
+ http-response-object: 3.0.2
+ parse-cache-control: 1.0.1
+
'@develar/schema-utils@2.6.5':
dependencies:
ajv: 6.12.6
@@ -3726,6 +3972,13 @@ snapshots:
'@humanwhocodes/retry@0.4.1': {}
+ '@iconify-icon/react@2.1.0(react@18.3.1)':
+ dependencies:
+ iconify-icon: 2.1.0
+ react: 18.3.1
+
+ '@iconify/types@2.0.0': {}
+
'@isaacs/cliui@8.0.2':
dependencies:
string-width: 5.1.2
@@ -3844,10 +4097,14 @@ snapshots:
'@rollup/rollup-win32-x64-msvc@4.27.4':
optional: true
+ '@sec-ant/readable-stream@0.4.1': {}
+
'@sindresorhus/is@4.6.0': {}
'@sindresorhus/merge-streams@2.3.0': {}
+ '@sindresorhus/merge-streams@4.0.0': {}
+
'@szmarczak/http-timer@4.0.6':
dependencies:
defer-to-connect: 2.0.1
@@ -3892,6 +4149,10 @@ snapshots:
'@types/expect@1.20.4': {}
+ '@types/fluent-ffmpeg@2.1.27':
+ dependencies:
+ '@types/node': 20.17.7
+
'@types/fs-extra@9.0.13':
dependencies:
'@types/node': 20.17.7
@@ -3919,6 +4180,8 @@ snapshots:
'@types/ms@0.7.34': {}
+ '@types/node@10.17.60': {}
+
'@types/node@20.17.7':
dependencies:
undici-types: 6.19.8
@@ -4117,6 +4380,10 @@ snapshots:
clean-stack: 2.2.0
indent-string: 4.0.0
+ ajv-formats@3.0.1(ajv@8.17.1):
+ optionalDependencies:
+ ajv: 8.17.1
+
ajv-keywords@3.5.2(ajv@6.12.6):
dependencies:
ajv: 6.12.6
@@ -4128,6 +4395,13 @@ snapshots:
json-schema-traverse: 0.4.1
uri-js: 4.4.1
+ ajv@8.17.1:
+ dependencies:
+ fast-deep-equal: 3.1.3
+ fast-uri: 3.0.3
+ json-schema-traverse: 1.0.0
+ require-from-string: 2.0.2
+
ansi-colors@1.1.0:
dependencies:
ansi-wrap: 0.1.0
@@ -4273,6 +4547,8 @@ snapshots:
array-each@1.0.1: {}
+ array-find@1.0.0: {}
+
array-slice@0.2.3: {}
array-slice@1.1.0: {}
@@ -4304,12 +4580,19 @@ snapshots:
dependencies:
async-done: 2.0.0
+ async@0.2.10: {}
+
async@3.2.6: {}
asynckit@0.4.0: {}
at-least-node@1.0.0: {}
+ atomically@2.0.3:
+ dependencies:
+ stubborn-fs: 1.2.5
+ when-exit: 2.1.3
+
autoprefixer@10.4.20(postcss@8.4.49):
dependencies:
browserslist: 4.24.2
@@ -4469,6 +4752,8 @@ snapshots:
caniuse-lite@1.0.30001683: {}
+ caseless@0.12.0: {}
+
chalk@4.1.2:
dependencies:
ansi-styles: 4.3.0
@@ -4568,6 +4853,13 @@ snapshots:
concat-map@0.0.1: {}
+ concat-stream@2.0.0:
+ dependencies:
+ buffer-from: 1.1.2
+ inherits: 2.0.4
+ readable-stream: 3.6.2
+ typedarray: 0.0.6
+
concurrently@9.1.0:
dependencies:
chalk: 4.1.2
@@ -4578,6 +4870,18 @@ snapshots:
tree-kill: 1.2.2
yargs: 17.7.2
+ conf@13.0.1:
+ dependencies:
+ ajv: 8.17.1
+ ajv-formats: 3.0.1(ajv@8.17.1)
+ atomically: 2.0.3
+ debounce-fn: 6.0.0
+ dot-prop: 9.0.0
+ env-paths: 3.0.0
+ json-schema-typed: 8.0.1
+ semver: 7.6.3
+ uint8array-extras: 1.4.0
+
config-file-ts@0.2.8-rc1:
dependencies:
glob: 10.4.5
@@ -4631,6 +4935,10 @@ snapshots:
dependencies:
time-zone: 1.0.0
+ debounce-fn@6.0.0:
+ dependencies:
+ mimic-function: 5.0.1
+
debug@4.3.7:
dependencies:
ms: 2.1.3
@@ -4715,6 +5023,10 @@ snapshots:
verror: 1.10.1
optional: true
+ dot-prop@9.0.0:
+ dependencies:
+ type-fest: 4.29.0
+
dotenv-expand@11.0.7:
dependencies:
dotenv: 16.4.5
@@ -4803,8 +5115,19 @@ snapshots:
electron-is-dev: 1.2.0
find-up: 5.0.0
+ electron-screencapture@1.1.0:
+ dependencies:
+ array-find: 1.0.0
+ lodash.findindex: 4.3.0
+ recordrtc: 5.1.0
+
electron-serve@2.1.1: {}
+ electron-store@10.0.0:
+ dependencies:
+ conf: 13.0.1
+ type-fest: 4.29.0
+
electron-to-chromium@1.5.64: {}
electron-window-state@5.0.3:
@@ -4837,6 +5160,8 @@ snapshots:
env-paths@2.2.1: {}
+ env-paths@3.0.0: {}
+
err-code@2.0.3: {}
es-define-property@1.0.0:
@@ -4845,6 +5170,8 @@ snapshots:
es-errors@1.3.0: {}
+ es-module-lexer@1.5.4: {}
+
es6-error@4.1.1:
optional: true
@@ -4958,6 +5285,21 @@ snapshots:
esutils@2.0.3: {}
+ execa@9.5.1:
+ dependencies:
+ '@sindresorhus/merge-streams': 4.0.0
+ cross-spawn: 7.0.6
+ figures: 6.1.0
+ get-stream: 9.0.1
+ human-signals: 8.0.0
+ is-plain-obj: 4.1.0
+ is-stream: 4.0.1
+ npm-run-path: 6.0.0
+ pretty-ms: 9.2.0
+ signal-exit: 4.1.0
+ strip-final-newline: 4.0.0
+ yoctocolors: 2.1.1
+
expand-tilde@2.0.2:
dependencies:
homedir-polyfill: 1.0.3
@@ -5024,6 +5366,8 @@ snapshots:
dependencies:
fastest-levenshtein: 1.0.16
+ fast-uri@3.0.3: {}
+
fastest-levenshtein@1.0.16: {}
fastq@1.17.1:
@@ -5034,6 +5378,19 @@ snapshots:
dependencies:
pend: 1.2.0
+ ffmpeg-static@5.2.0:
+ dependencies:
+ '@derhuerst/http-basic': 8.2.4
+ env-paths: 2.2.1
+ https-proxy-agent: 5.0.1
+ progress: 2.0.3
+ transitivePeerDependencies:
+ - supports-color
+
+ figures@6.1.0:
+ dependencies:
+ is-unicode-supported: 2.1.0
+
file-entry-cache@8.0.0:
dependencies:
flat-cache: 4.0.1
@@ -5075,6 +5432,11 @@ snapshots:
flatted@3.3.2: {}
+ fluent-ffmpeg@2.1.3:
+ dependencies:
+ async: 0.2.10
+ which: 1.3.1
+
flush-write-stream@1.1.1:
dependencies:
inherits: 2.0.4
@@ -5176,6 +5538,11 @@ snapshots:
dependencies:
pump: 3.0.2
+ get-stream@9.0.1:
+ dependencies:
+ '@sec-ant/readable-stream': 0.4.1
+ is-stream: 4.0.1
+
glob-parent@3.1.0:
dependencies:
is-glob: 3.1.0
@@ -5406,6 +5773,10 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ http-response-object@3.0.2:
+ dependencies:
+ '@types/node': 10.17.60
+
http2-wrapper@1.0.3:
dependencies:
quick-lru: 5.1.1
@@ -5425,6 +5796,8 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ human-signals@8.0.0: {}
+
humanize-ms@1.2.1:
dependencies:
ms: 2.1.3
@@ -5458,6 +5831,10 @@ snapshots:
optionalDependencies:
typescript: 5.6.3
+ iconify-icon@2.1.0:
+ dependencies:
+ '@iconify/types': 2.0.0
+
iconv-corefoundation@1.1.7:
dependencies:
cli-truncate: 2.1.0
@@ -5477,6 +5854,8 @@ snapshots:
parent-module: 1.0.1
resolve-from: 4.0.0
+ import-meta-resolve@4.1.0: {}
+
imurmurhash@0.1.4: {}
indent-string@4.0.0: {}
@@ -5557,6 +5936,8 @@ snapshots:
is-plain-obj@1.1.0: {}
+ is-plain-obj@4.1.0: {}
+
is-plain-object@2.0.4:
dependencies:
isobject: 3.0.1
@@ -5567,12 +5948,16 @@ snapshots:
dependencies:
is-unc-path: 1.0.0
+ is-stream@4.0.1: {}
+
is-unc-path@1.0.0:
dependencies:
unc-path-regex: 0.1.2
is-unicode-supported@0.1.0: {}
+ is-unicode-supported@2.1.0: {}
+
is-utf8@0.2.1: {}
is-valid-glob@1.0.0: {}
@@ -5618,6 +6003,10 @@ snapshots:
json-schema-traverse@0.4.1: {}
+ json-schema-traverse@1.0.0: {}
+
+ json-schema-typed@8.0.1: {}
+
json-stable-stringify-without-jsonify@1.0.1: {}
json-stringify-safe@5.0.1:
@@ -5680,12 +6069,25 @@ snapshots:
dependencies:
p-locate: 5.0.0
+ lodash._basefindindex@3.6.0: {}
+
+ lodash._baseiteratee@4.6.1:
+ dependencies:
+ lodash._stringtopath: 4.7.1
+
+ lodash._stringtopath@4.7.1: {}
+
lodash.clonedeep@4.5.0: {}
lodash.defaults@4.2.0: {}
lodash.difference@4.5.0: {}
+ lodash.findindex@4.3.0:
+ dependencies:
+ lodash._basefindindex: 3.6.0
+ lodash._baseiteratee: 4.6.1
+
lodash.flatten@4.4.0: {}
lodash.get@4.4.2: {}
@@ -5723,6 +6125,10 @@ snapshots:
lru-cache@7.18.3: {}
+ magic-string@0.30.14:
+ dependencies:
+ '@jridgewell/sourcemap-codec': 1.5.0
+
make-fetch-happen@10.2.1:
dependencies:
agentkeepalive: 4.5.0
@@ -5771,6 +6177,8 @@ snapshots:
mimic-fn@2.1.0: {}
+ mimic-function@5.0.1: {}
+
mimic-response@1.0.1: {}
mimic-response@3.1.0: {}
@@ -5904,6 +6312,11 @@ snapshots:
dependencies:
once: 1.4.0
+ npm-run-path@6.0.0:
+ dependencies:
+ path-key: 4.0.0
+ unicorn-magic: 0.3.0
+
npmlog@6.0.2:
dependencies:
are-we-there-yet: 3.0.1
@@ -5990,12 +6403,16 @@ snapshots:
dependencies:
callsites: 3.1.0
+ parse-cache-control@1.0.1: {}
+
parse-filepath@1.0.2:
dependencies:
is-absolute: 1.0.0
map-cache: 0.2.2
path-root: 0.1.1
+ parse-ms@4.0.0: {}
+
parse-node-version@1.0.1: {}
parse-passwd@1.0.0: {}
@@ -6010,6 +6427,8 @@ snapshots:
path-key@3.1.1: {}
+ path-key@4.0.0: {}
+
path-parse@1.0.7: {}
path-root-regex@0.1.2: {}
@@ -6097,6 +6516,10 @@ snapshots:
prelude-ls@1.2.1: {}
+ pretty-ms@9.2.0:
+ dependencies:
+ parse-ms: 4.0.0
+
process-nextick-args@2.0.1: {}
progress@2.0.3: {}
@@ -6211,6 +6634,8 @@ snapshots:
dependencies:
resolve: 1.22.8
+ recordrtc@5.1.0: {}
+
regenerator-runtime@0.14.1: {}
remove-bom-buffer@3.0.0:
@@ -6234,6 +6659,8 @@ snapshots:
require-directory@2.1.1: {}
+ require-from-string@2.0.2: {}
+
resedit@1.7.2:
dependencies:
pe-library: 0.4.1
@@ -6493,8 +6920,12 @@ snapshots:
dependencies:
ansi-regex: 6.1.0
+ strip-final-newline@4.0.0: {}
+
strip-json-comments@3.1.1: {}
+ stubborn-fs@1.2.5: {}
+
sucrase@3.35.0:
dependencies:
'@jridgewell/gen-mapping': 0.3.5
@@ -6657,6 +7088,10 @@ snapshots:
type-fest@0.13.1:
optional: true
+ type-fest@4.29.0: {}
+
+ typedarray@0.0.6: {}
+
typescript-eslint@8.15.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3):
dependencies:
'@typescript-eslint/eslint-plugin': 8.15.0(@typescript-eslint/parser@8.15.0(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3))(eslint@9.15.0(jiti@1.21.6))(typescript@5.6.3)
@@ -6670,6 +7105,8 @@ snapshots:
typescript@5.6.3: {}
+ uint8array-extras@1.4.0: {}
+
unc-path-regex@0.1.2: {}
undertaker-registry@2.0.0: {}
@@ -6685,6 +7122,8 @@ snapshots:
unicorn-magic@0.1.0: {}
+ unicorn-magic@0.3.0: {}
+
unique-filename@2.0.1:
dependencies:
unique-slug: 3.0.0
@@ -6812,6 +7251,13 @@ snapshots:
replace-ext: 2.0.0
teex: 1.0.1
+ vite-plugin-chunk-split@0.5.0(vite@5.4.11(@types/node@20.17.7)):
+ dependencies:
+ es-module-lexer: 1.5.4
+ import-meta-resolve: 4.1.0
+ magic-string: 0.30.14
+ vite: 5.4.11(@types/node@20.17.7)
+
vite-tsconfig-paths@5.1.3(typescript@5.6.3)(vite@5.4.11(@types/node@20.17.7)):
dependencies:
debug: 4.3.7
@@ -6838,6 +7284,8 @@ snapshots:
dependencies:
defaults: 1.0.4
+ when-exit@2.1.3: {}
+
which@1.3.1:
dependencies:
isexe: 2.0.0
@@ -6909,6 +7357,8 @@ snapshots:
yocto-queue@0.1.0: {}
+ yoctocolors@2.1.1: {}
+
zip-stream@4.1.1:
dependencies:
archiver-utils: 3.0.4
diff --git a/public/icon.png b/public/icon.png
new file mode 100644
index 0000000..76b5540
Binary files /dev/null and b/public/icon.png differ
diff --git a/src/electron/createWindow.ts b/src/electron/createWindow.ts
new file mode 100644
index 0000000..5f72f1a
--- /dev/null
+++ b/src/electron/createWindow.ts
@@ -0,0 +1,100 @@
+import { app, BrowserWindow, screen } from "electron";
+import { join } from "path";
+import { __dirname } from "./utils.js";
+import windowStateManager from "electron-window-state";
+
+function loadURL(window: BrowserWindow, path = "", vitePort: string) {
+ const dev = !app.isPackaged;
+ if (dev) {
+ window.loadURL(`http://localhost:${vitePort}/#${path}`).catch((e) => {
+ console.log("Error loading URL:", e);
+ });
+ }
+ else {
+ window.loadFile(join(__dirname, "../renderer/index.html"), {
+ hash: path,
+ }).catch((e) => {
+ console.log("Error loading URL:", e);
+ });
+ }
+}
+
+export function createSettingsWindow(vitePort: string, closeCallBack: Function) {
+ const windowState = windowStateManager({
+ defaultWidth: 650,
+ defaultHeight: 550
+ });
+ const window = new BrowserWindow({
+ width: 650,
+ height: 550,
+ webPreferences: {
+ nodeIntegration: true,
+ contextIsolation: true,
+ preload: join(__dirname, 'preload/settings.cjs')
+ },
+ titleBarStyle: "hiddenInset",
+ resizable: false,
+ });
+ windowState.manage(window);
+ window.once("ready-to-show", () => {
+ window.show();
+ window.focus();
+ });
+ window.on("close", (e) => {
+ window.hide();
+ windowState.saveState(window);
+ e.preventDefault();
+ });
+ window.once("close", () => {
+ window.hide()
+ });
+ loadURL(window, "settings", vitePort);
+ return window;
+}
+
+export function createMainWindow(vitePort: string, closeCallBack: Function) {
+ const display = screen.getPrimaryDisplay();
+ const { width, height } = display.bounds;
+ const windowState = windowStateManager({
+ defaultWidth: width,
+ defaultHeight: height
+ });
+
+ const window = new BrowserWindow({
+ width,
+ height,
+ x: 0,
+ y: 0,
+ frame: false,
+ resizable: false,
+ fullscreenable: false,
+ alwaysOnTop: true,
+ skipTaskbar: true,
+ webPreferences: {
+ nodeIntegration: true,
+ contextIsolation: true,
+ preload: join(__dirname, 'preload/rewind.cjs')
+ },
+ roundedCorners: false,
+ transparent: true,
+ });
+
+ windowState.manage(window);
+
+ window.once("ready-to-show", () => {
+ window.show();
+ window.setAlwaysOnTop(true, "screen-saver");
+ window.setBounds({ x: 0, y: 0, width, height });
+ window.focus();
+ });
+
+ window.on("close", () => {
+ windowState.saveState(window);
+ });
+ window.once("close", () => {
+ closeCallBack();
+ });
+
+ loadURL(window, "rewind", vitePort);
+ return window;
+}
diff --git a/src/electron/i18n.ts b/src/electron/i18n.ts
index 060760f..77497ba 100644
--- a/src/electron/i18n.ts
+++ b/src/electron/i18n.ts
@@ -1,12 +1,9 @@
import { join } from "path";
import i18n from "i18next";
import fs from "fs";
-import { fileURLToPath } from 'url'
-import path from 'path'
+import { app } from "electron";
+import { __dirname } from "./utils.js";
-const __dirname = path.dirname(fileURLToPath(import.meta.url))
-
-import { app } from 'electron';
/**
* Selects the appropriate language based on system preferences and available languages
@@ -26,7 +23,7 @@ export function detectLanguage(langs: string[], fallback: string): string {
// Find a matching language
const matchedLanguage = langs.find(lang => {
if (lang.indexOf(normalizedLang) !== -1) {
- return lang
+ return lang;
}
});
@@ -34,26 +31,26 @@ export function detectLanguage(langs: string[], fallback: string): string {
return matchedLanguage || fallback;
}
-const languages = ['en', 'de', 'es', 'fr', 'it', 'ja', 'ar', 'ko', 'zh-CN'];
+export default function initI18n() {
+ const languages = ["en", "de", "es", "fr", "it", "ja", "ar", "ko", "zh-CN"];
-const l = detectLanguage(languages, "en");
+ const l = detectLanguage(languages, "en");
+ const resources = languages.reduce((acc: { [key: string]: { translation: any } }, lang) => {
+ acc[lang] = {
+ translation: JSON.parse(fs.readFileSync(join(__dirname, `./i18n/${lang}.json`), "utf8"))
+ };
+ return acc;
+ }, {});
-const resources = languages.reduce((acc: { [key: string]: { translation: any } }, lang) => {
- acc[lang] = {
- translation: JSON.parse(fs.readFileSync(join(__dirname, `./i18n/${lang}.json`), 'utf8'))
- };
- return acc;
-}, {});
+ i18n.init({
+ resources,
+ lng: l,
+ fallbackLng: "en",
+ interpolation: {
+ escapeValue: false // react already safes from xss => https://www.i18next.com/translation-function/interpolation#unescape
+ }
+ });
+ return i18n;
+}
-
-i18n.init({
- resources,
- lng: l,
- fallbackLng: "en",
- interpolation: {
- escapeValue: false // react already safes from xss => https://www.i18next.com/translation-function/interpolation#unescape
- },
-});
-
-const t = i18n.t;
diff --git a/src/electron/index.ts b/src/electron/index.ts
index 943f716..c3969c3 100644
--- a/src/electron/index.ts
+++ b/src/electron/index.ts
@@ -1,159 +1,98 @@
-import windowStateManager from 'electron-window-state';
-import { app, BrowserWindow, screen,ipcMain, globalShortcut, Tray, Menu, nativeImage } from 'electron';
-import contextMenu from 'electron-context-menu';
+import { app, BrowserWindow, globalShortcut, Menu, nativeImage, Tray } from "electron";
+import contextMenu from "electron-context-menu";
import { join } from "path";
-import i18n from "i18next";
-import "./i18n.js";
-const t = i18n.t;
+import initI18n from "./i18n.js";
+import { createMainWindow, createSettingsWindow } from "./createWindow.js";
+import { __dirname, captureScreen, getFirstCaptureScreenDeviceId } from "./utils.js";
+import * as fs from "fs";
+const i18n = initI18n();
+
+const t = i18n.t.bind(i18n);
const port = process.env.PORT || "5173";
const dev = !app.isPackaged;
-let tray = null
+let tray = null;
+
+async function c() {
+ const screenshotpath = join(__dirname, "screenshot.png");
+ const ffmpegPath = join(__dirname, dev ? "bin/macos/ffmpeg" : "../../bin/macos/ffmpeg");
+ const deviceID = await getFirstCaptureScreenDeviceId(ffmpegPath);
+ if (deviceID) {
+ await captureScreen(ffmpegPath, deviceID, screenshotpath);
+ const screenshotData = fs.readFileSync(screenshotpath, "base64");
+ return screenshotData;
+ }
+ return null;
+}
function createTray() {
- const pathRoot: string = dev ? "./src/electron/assets/" : "./assets/";
- const icon = nativeImage.createFromPath(pathRoot + 'TrayIconTemplate@2x.png');
- icon.resize({ width: 32, height: 32 })
- tray = new Tray(pathRoot + 'TrayIcon.png');
- tray.setImage(icon);
+ const pathRoot: string = dev ? "./src/electron/assets/" : join(__dirname, "./assets/");
+ const icon = nativeImage.createFromPath(pathRoot + "TrayIconTemplate@2x.png");
+ icon.resize({ width: 32, height: 32 });
+ tray = new Tray(pathRoot + "TrayIcon.png");
+ tray.setImage(icon);
- const contextMenu = Menu.buildFromTemplate([
- {
- label: t('tray.showMainWindow'),
- click: () => {
- if (!mainWindow) createMainWindow();
- mainWindow!.show();
- }
- },
- {
- label: t('tray.showSettingsWindow'),
- click: () => {
- if (!settingsWindow) createSettingsWindow();
- settingsWindow!.show();
- }
- },
- { type: 'separator' },
- {
- label: t('tray.quit'),
- click: () => {
- app.quit()
- }
- }
- ])
+ const contextMenu = Menu.buildFromTemplate([
+ {
+ label: t("tray.showMainWindow"),
+ click: async () => {
+ if (!mainWindow) mainWindow = createMainWindow(port, () => (mainWindow = null));
+ mainWindow!.webContents.send("fromMain", null);
+ mainWindow!.setIgnoreMouseEvents(true);
+ mainWindow!.show();
+ c()
+ .then((data) => {
+ mainWindow!.webContents.send("fromMain", data);
+ mainWindow!.setIgnoreMouseEvents(false);
+ })
+ .catch((err) => {
+ console.error(err);
+ });
+ }
+ },
+ {
+ label: t("tray.showSettingsWindow"),
+ click: () => {
+ if (!settingsWindow)
+ settingsWindow = createSettingsWindow(port, () => (settingsWindow = null));
+ settingsWindow!.show();
+ }
+ },
+ { type: "separator" },
+ {
+ label: t("tray.quit"),
+ click: () => {
+ app.quit();
+ }
+ }
+ ]);
- tray.setContextMenu(contextMenu)
- tray.setToolTip('OpenRewind')
+ tray.setContextMenu(contextMenu);
+ tray.setToolTip("OpenRewind");
}
let mainWindow: BrowserWindow | null;
let settingsWindow: BrowserWindow | null;
-
-function createSettingsWindow() {
- const window = new BrowserWindow({
- width: 650,
- height: 550,
- webPreferences: {
- nodeIntegration: true,
- contextIsolation: true
- },
- titleBarStyle: 'hiddenInset',
- resizable: false,
- });
- window.once('ready-to-show', () => {
- window.show();
- window.focus();
- });
-
- settingsWindow = window;
-
- if (dev) loadVite(window ,port, "settings");
- else settingsWindow.loadFile(join(__dirname, '../renderer/index.html/settings'));
-}
-
contextMenu({
- showLookUpSelection: true,
- showSearchWithGoogle: true,
- showCopyImage: true,
+ showLookUpSelection: true,
+ showSearchWithGoogle: true,
+ showCopyImage: true
});
-function loadVite(window: BrowserWindow, port: string | undefined, path = "") {
- console.log(`http://localhost:${port}/${path}`);
- window.loadURL(`http://localhost:${port}/${path}`).catch((e) => {
- console.log('Error loading URL, retrying', e);
- setTimeout(() => {
- loadVite(window, port, path);
- }, 1000);
- });
-}
-
-function createMainWindow() {
- const display = screen.getPrimaryDisplay();
- const { width, height } = display.bounds;
- let windowState = windowStateManager({
- defaultWidth: width,
- defaultHeight: height,
- });
-
- const window = new BrowserWindow({
- width,
- height,
- x: 0,
- y: 0,
- frame: false,
- resizable: false,
- fullscreenable: false,
- transparent: false,
- alwaysOnTop: true,
- skipTaskbar: true,
- webPreferences: {
- nodeIntegration: true,
- contextIsolation: false
- },
- roundedCorners: false
- });
-
- windowState.manage(window);
-
- window.once('ready-to-show', () => {
- window.show();
- window.setAlwaysOnTop(true, 'screen-saver');
- window.setBounds({ x: 0, y: 0, width, height });
- window.focus();
- });
-
- window.on('close', () => {
- windowState.saveState(window);
- });
- window.once('close', () => {
- mainWindow = null;
- });
-
- mainWindow = window;
-
- if (dev) loadVite(window, port, "rewind");
- else mainWindow.loadFile(join(__dirname, '../renderer/index.html/rewind'));
-}
-
-app.once('ready', () => {
- app.dock.hide();
-});
-app.on('activate', () => {
+app.once("ready", () => {
+ app.dock.hide();
});
+app.on("activate", () => {});
-app.on('ready', () => {
- createTray();
- globalShortcut.register('Escape', () => {
- if (!mainWindow) return;
- mainWindow.hide();
- });
+app.on("ready", () => {
+ createTray();
+ globalShortcut.register("Escape", () => {
+ if (!mainWindow) return;
+ mainWindow.hide();
+ });
});
-app.on('window-all-closed', () => {
- if (process.platform !== 'darwin') app.quit();
+app.on("window-all-closed", () => {
+ if (process.platform !== "darwin") app.quit();
});
-
-ipcMain.on('to-main', (_event, count) => {
- if (!mainWindow) return;
- return mainWindow.webContents.send('from-main', `next count is ${count + 1}`);
-});
\ No newline at end of file
diff --git a/src/electron/preload/os-name.cjs b/src/electron/preload/os-name.cjs
new file mode 100644
index 0000000..8491025
--- /dev/null
+++ b/src/electron/preload/os-name.cjs
@@ -0,0 +1,118 @@
+const os = require('node:os');
+
+const nameMap = new Map([
+ [24, ['Sequoia', '15']],
+ [23, ['Sonoma', '14']],
+ [22, ['Ventura', '13']],
+ [21, ['Monterey', '12']],
+ [20, ['Big Sur', '11']],
+ [19, ['Catalina', '10.15']],
+ [18, ['Mojave', '10.14']],
+ [17, ['High Sierra', '10.13']],
+ [16, ['Sierra', '10.12']],
+ [15, ['El Capitan', '10.11']],
+ [14, ['Yosemite', '10.10']],
+ [13, ['Mavericks', '10.9']],
+ [12, ['Mountain Lion', '10.8']],
+ [11, ['Lion', '10.7']],
+ [10, ['Snow Leopard', '10.6']],
+ [9, ['Leopard', '10.5']],
+ [8, ['Tiger', '10.4']],
+ [7, ['Panther', '10.3']],
+ [6, ['Jaguar', '10.2']],
+ [5, ['Puma', '10.1']],
+]);
+
+const names = new Map([
+ ['10.0.2', '11'], // It's unclear whether future Windows 11 versions will use this version scheme: https://github.com/sindresorhus/windows-release/pull/26/files#r744945281
+ ['10.0', '10'],
+ ['6.3', '8.1'],
+ ['6.2', '8'],
+ ['6.1', '7'],
+ ['6.0', 'Vista'],
+ ['5.2', 'Server 2003'],
+ ['5.1', 'XP'],
+ ['5.0', '2000'],
+ ['4.90', 'ME'],
+ ['4.10', '98'],
+ ['4.03', '95'],
+ ['4.00', '95'],
+]);
+
+function macosRelease(release) {
+ release = Number((release || os.release()).split('.')[0]);
+
+ const [name, version] = nameMap.get(release) || ['Unknown', ''];
+
+ return {
+ name,
+ version,
+ };
+}
+
+function windowsRelease(release) {
+ const version = /(\d+\.\d+)(?:\.(\d+))?/.exec(release || os.release());
+
+ if (release && !version) {
+ throw new Error('`release` argument doesn\'t match `n.n`');
+ }
+
+ let ver = version[1] || '';
+ const build = version[2] || '';
+
+ if (ver === '10.0' && build.startsWith('2')) {
+ ver = '10.0.2';
+ }
+
+ return names.get(ver);
+}
+
+function osName(platform, release) {
+ if (!platform && release) {
+ throw new Error('You can\'t specify a `release` without specifying `platform`');
+ }
+
+ platform = platform ?? os.platform();
+
+ let id;
+
+ if (platform === 'darwin') {
+ if (!release && os.platform() === 'darwin') {
+ release = os.release();
+ }
+
+ const prefix = release ? (Number(release.split('.')[0]) > 15 ? 'macOS' : 'OS X') : 'macOS';
+
+ try {
+ id = release ? macosRelease(release).name : '';
+
+ if (id === 'Unknown') {
+ return prefix;
+ }
+ } catch {}
+
+ return prefix + (id ? ' ' + id : '');
+ }
+
+ if (platform === 'linux') {
+ if (!release && os.platform() === 'linux') {
+ release = os.release();
+ }
+
+ id = release ? release.replace(/^(\d+\.\d+).*/, '$1') : '';
+ return 'Linux' + (id ? ' ' + id : '');
+ }
+
+ if (platform === 'win32') {
+ if (!release && os.platform() === 'win32') {
+ release = os.release();
+ }
+
+ id = release ? windowsRelease(release) : '';
+ return 'Windows' + (id ? ' ' + id : '');
+ }
+
+ return platform;
+}
+
+module.exports = osName;
diff --git a/src/electron/preload/rewind.cjs b/src/electron/preload/rewind.cjs
new file mode 100644
index 0000000..ea28cf5
--- /dev/null
+++ b/src/electron/preload/rewind.cjs
@@ -0,0 +1,20 @@
+const { contextBridge, ipcRenderer } = require("electron");
+
+// Expose protected methods that allow the renderer process to use
+// the ipcRenderer without exposing the entire object
+contextBridge.exposeInMainWorld("api", {
+ send: (channel, data) => {
+ // whitelist channels
+ let validChannels = ["toMain"];
+ if (validChannels.includes(channel)) {
+ ipcRenderer.send(channel, data);
+ }
+ },
+ receive: (channel, func) => {
+ let validChannels = ["fromMain"];
+ if (validChannels.includes(channel)) {
+ // Deliberately strip event as it includes `sender`
+ ipcRenderer.on(channel, (event, ...args) => func(...args));
+ }
+ }
+});
diff --git a/src/electron/preload/settings.cjs b/src/electron/preload/settings.cjs
new file mode 100644
index 0000000..e158bd5
--- /dev/null
+++ b/src/electron/preload/settings.cjs
@@ -0,0 +1,13 @@
+const { contextBridge } = require('electron')
+const os = require('os');
+const osName = require('./os-name.cjs');
+
+contextBridge.exposeInMainWorld('versions', {
+ node: () => process.versions.node,
+ chrome: () => process.versions.chrome,
+ electron: () => process.versions.electron,
+ osRaw: () => {
+ return `${os.platform()} ${os.release()}`;
+ },
+ osDisplay: osName
+})
\ No newline at end of file
diff --git a/src/electron/utils.ts b/src/electron/utils.ts
new file mode 100644
index 0000000..c116a43
--- /dev/null
+++ b/src/electron/utils.ts
@@ -0,0 +1,35 @@
+import path from "path";
+import { fileURLToPath } from "url";
+import { exec } from "child_process";
+
+export const __dirname = path.dirname(fileURLToPath(import.meta.url));
+
+export function getFirstCaptureScreenDeviceId(ffmpegPath: string): Promise
{
+ return new Promise((resolve, reject) => {
+ exec(`${ffmpegPath} -f avfoundation -list_devices true -i ""`, (error, stdout, stderr) => {
+ // stderr contains the output we need to parse
+ const output = stderr;
+ const captureScreenRegex = /\[(\d+)]\s+Capture screen \d+/g;
+ const match = captureScreenRegex.exec(output);
+
+ if (match) {
+ resolve(match[1]);
+ } else {
+ resolve(null);
+ }
+ });
+ });
+}
+
+export function captureScreen(ffmpegPath: string ,deviceId: string, outputPath: string): Promise {
+ return new Promise((resolve, reject) => {
+ exec(`${ffmpegPath} -f avfoundation -pixel_format uyvy422 -i ${deviceId} -y -frames:v 1 ${outputPath}`,
+ (error, _stdout, _stderr) => {
+ if (error) {
+ reject(error);
+ } else {
+ resolve();
+ }
+ });
+ });
+}
diff --git a/src/global.d.ts b/src/global.d.ts
new file mode 100644
index 0000000..09f1bf7
--- /dev/null
+++ b/src/global.d.ts
@@ -0,0 +1,16 @@
+interface Window {
+ versions: {
+ electron: () => string;
+ chrome: () => string;
+ node: () => string;
+ osRaw: () => string;
+ osDisplay: () => string;
+ };
+ electron: {
+ getScreenshot: () => Promise;
+ }
+ api: {
+ send: (channel: any, data: any) => void,
+ receive: (channel: any, func: any) => void
+ }
+}
\ No newline at end of file
diff --git a/src/renderer/app.tsx b/src/renderer/app.tsx
index 6ce9dff..cea6b27 100644
--- a/src/renderer/app.tsx
+++ b/src/renderer/app.tsx
@@ -1,23 +1,18 @@
-import { createBrowserRouter, RouterProvider } from "react-router-dom";
+import { HashRouter, Routes, Route } from "react-router-dom";
import SettingsPage from "pages/settings";
import "./i18n.ts";
-import RewindPage from "../../pages/rewind";
-
-const router = createBrowserRouter([
- {
- path: "/settings",
- element:
- },
- {
- path: "/rewind",
- element:
- }
-]);
+import RewindPage from "pages/rewind";
+import './app.css';
export function App() {
return (
-
+
+
+ } />
+ } />
+
+
);
}
diff --git a/src/renderer/index.css b/src/renderer/index.css
index b5c61c9..794ba8b 100644
--- a/src/renderer/index.css
+++ b/src/renderer/index.css
@@ -1,3 +1,7 @@
@tailwind base;
@tailwind components;
@tailwind utilities;
+
+body {
+ @apply bg-transparent;
+}
\ No newline at end of file
diff --git a/tsconfig.app.json b/tsconfig.app.json
index 9f6c6e5..f556cb9 100644
--- a/tsconfig.app.json
+++ b/tsconfig.app.json
@@ -12,6 +12,7 @@
/* Bundler mode */
"moduleResolution": "bundler",
"allowImportingTsExtensions": true,
+ "emitDeclarationOnly": true,
"resolveJsonModule": true,
"isolatedModules": true,
"moduleDetection": "force",
@@ -26,5 +27,9 @@
"include": [
"src/renderer",
"src/renderer/**/*.ts",
- "src/renderer/**/*.tsx", "global.d.ts", "pages/**/*.tsx"],
+ "src/renderer/**/*.tsx",
+ "src/global.d.ts",
+ "pages/**/*.tsx",
+ "components/**/*.tsx"
+ ],
}
diff --git a/tsconfig.json b/tsconfig.json
index 3b1d755..9e9ccfd 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -1,7 +1,4 @@
{
-// "files": [
-// "src/electron/index.ts"
-// ],
"compilerOptions": {
"target": "ESNext",
"module": "ESNext",
diff --git a/tsconfig.node.json b/tsconfig.node.json
index 442a098..bcb3845 100644
--- a/tsconfig.node.json
+++ b/tsconfig.node.json
@@ -9,7 +9,6 @@
/* Bundler mode */
"moduleResolution": "Bundler",
- "allowImportingTsExtensions": true,
"isolatedModules": true,
"moduleDetection": "force",
diff --git a/vite.config.ts b/vite.config.ts
index 29aa57b..4c7d160 100644
--- a/vite.config.ts
+++ b/vite.config.ts
@@ -1,14 +1,31 @@
-import { defineConfig } from 'vite'
-import react from '@vitejs/plugin-react'
+import { defineConfig } from "vite";
+import react from "@vitejs/plugin-react";
import tsconfigPaths from "vite-tsconfig-paths";
-import { join } from 'path';
+import { join } from "path";
+import { chunkSplitPlugin } from "vite-plugin-chunk-split";
// https://vite.dev/config/
export default defineConfig({
- root: join(__dirname, 'src/renderer'),
- build: {
- outDir: join(__dirname, 'dist/renderer'),
- emptyOutDir: true,
- },
- plugins: [react(),tsconfigPaths()],
-})
+ root: join(__dirname, "src/renderer"),
+ build: {
+ outDir: join(__dirname, "dist/renderer"),
+ emptyOutDir: true
+ },
+ plugins: [
+ react(),
+ tsconfigPaths(),
+ chunkSplitPlugin({
+ strategy: "single-vendor",
+ customChunk: (args) => {
+ // files into pages directory is export in single files
+ const { id } = args;
+ if (id.includes('node_modules')) {
+ return 'vendor';
+ } else {
+ return 'main';
+ }
+ }
+ })
+ ],
+ base: ""
+});