diff --git a/.gitignore b/.gitignore index 938d34c..2acedeb 100644 --- a/.gitignore +++ b/.gitignore @@ -5,4 +5,5 @@ ts-out/ package-lock.json .pnpm-store .cache -.DS_Store \ No newline at end of file +.DS_Store +scripts/spdx-license.txt \ No newline at end of file diff --git a/assets/app/desktop.png b/assets/app/desktop.png new file mode 100644 index 0000000..4ad0ad5 Binary files /dev/null and b/assets/app/desktop.png differ diff --git a/assets/app/overlay.png b/assets/app/overlay.png new file mode 100644 index 0000000..041a109 Binary files /dev/null and b/assets/app/overlay.png differ diff --git a/assets/app/shelter.svg b/assets/app/shelter.svg new file mode 100644 index 0000000..997578f --- /dev/null +++ b/assets/app/shelter.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/lang/en-US.json b/assets/lang/en-US.json index 1d64b83..6e1dc7d 100644 --- a/assets/lang/en-US.json +++ b/assets/lang/en-US.json @@ -78,6 +78,8 @@ "settings-automaticClientUpdates-desc": "Disables automatic Legcord updates", "settings-hardwareAcceleration": "Hardware acceleration", "settings-hardwareAcceleration-desc": "Hardware acceleration uses your GPU to make Legcord run faster. If you're experiencing visual glitches, try disabling this.", + "settings-sdpH264BaselineRewrite": "H.264 Baseline SDP rewrite", + "settings-sdpH264BaselineRewrite-desc": "Rewrites Discord's Constrained Baseline H.264 profile in WebRTC SDP so screenshare can use hardware encode (VideoToolbox / Media Foundation) instead of OpenH264. Disable if Go Live fails to connect or video is broken, then restart Legcord.", "settings-processScanning": "Process scanning", "settings-processScanning-desc": "Scan for running games to improve Rich Presence detection. Disable to reduce CPU usage. Requires a restart.", "settings-windowsLegacyScanning": "Windows legacy scanning", @@ -244,10 +246,13 @@ "setup-welcomeTitle": "Welcome to Legcord", "setup-welcomeSubtitle": "Let's get you set up with your perfect configuration.", "setup-getStarted": "Get Started", + "setup-windowStyle-overlayTitle": "Overlay Titlebar", + "setup-windowStyle-overlayDesc": "A modern titlebar that blends into Discord. Recommended for most users.", "setup-windowStyle-nativeTitle": "Native Window", "setup-windowStyle-nativeDesc": "Use your system's default window decorations", "setup-windowStyle-customTitle": "Custom Titlebar", "setup-windowStyle-customDesc": "Use Legcord's custom titlebar design", + "setup-recommended": "Recommended", "setup-chooseWindowStyle": "Choose Window Style", "setup-selectAppearance": "Select how Legcord appears on your machine", "setup-systemTray": "System Tray", @@ -263,6 +268,8 @@ "setup-launchLegcord": "Launch Legcord", "setup-modSelectorTitle": "Choose Your Client Mod", "setup-modSelectorSubtitle": "Legcord includes Shelter out of the box, but you can also choose another client mod if wanted.", + "setup-shelterOnlyTitle": "Shelter Only", + "setup-shelterOnlyDesc": "Legcord was built around Shelter. Most typical users won't need another client mod.", "setup-vencordTitle": "Vencord", "setup-vencordDesc": "Client mod with plugins and themes.", "setup-equicordTitle": "Equicord", diff --git a/docker/Dockerfile.deb b/docker/Dockerfile.deb new file mode 100644 index 0000000..116b63f --- /dev/null +++ b/docker/Dockerfile.deb @@ -0,0 +1,21 @@ +FROM ubuntu + +WORKDIR /app + +COPY ./dist/*.deb . + +RUN apt-get update -y && apt-get upgrade -y + +RUN apt-get install ./*.deb -y + +RUN apt-get install -qqy x11-apps x11vnc xvfb + +RUN mkdir ~/.vnc +RUN x11vnc -storepasswd 1234 ~/.vnc/passwd + +COPY docker/start.sh /start.sh +RUN chmod +x /start.sh + +EXPOSE 5900 + +CMD ["/start.sh"] \ No newline at end of file diff --git a/docker/Dockerfile.pacman b/docker/Dockerfile.pacman new file mode 100644 index 0000000..425744c --- /dev/null +++ b/docker/Dockerfile.pacman @@ -0,0 +1,21 @@ +FROM archlinux + +WORKDIR /app + +COPY ./dist/*.pacman . + +RUN pacman -Syu --noconfirm + +RUN pacman -U --noconfirm ./*.pacman + +RUN pacman -Syu --noconfirm x11vnc xorg-server-xvfb + +RUN mkdir ~/.vnc +RUN x11vnc -storepasswd 1234 ~/.vnc/passwd + +COPY docker/start.sh /start.sh +RUN chmod +x /start.sh + +EXPOSE 5900 + +CMD ["/start.sh"] \ No newline at end of file diff --git a/docker/start.sh b/docker/start.sh new file mode 100644 index 0000000..6d21100 --- /dev/null +++ b/docker/start.sh @@ -0,0 +1,13 @@ +#!/bin/bash +set -e + +export DISPLAY=:99 + +Xvfb :99 -screen 0 1280x800x24 & +sleep 1 + +x11vnc -display :99 -forever -usepw -rfbport 5900 & + +legcord --no-sandbox & + +tail -f /dev/null \ No newline at end of file diff --git a/electron-builder.ts b/electron-builder.ts index f961b5c..ee1988c 100644 --- a/electron-builder.ts +++ b/electron-builder.ts @@ -1,6 +1,7 @@ import type { Configuration } from "electron-builder"; import { applyAppImageSandboxFix } from "./scripts/build/sandboxFix.mjs"; +import debianLicence from "./scripts/spdxLicenceDebianFormat"; import { ACTION_FRIENDLY_NAMES, EXCLUDED_FROM_SHORTCUTS, ValidActions } from "./src/common/commandDefinitions"; const desktopActions = (exec: "AppRun" | "/opt/Legcord/legcord") => @@ -71,7 +72,7 @@ export const config: Configuration = { }, pacman: { - depends: ["gtk3", "libnotify", "nss", "libxss", "libxtst", "xdg-utils", "at-spi2-core", "libsecret"], + depends: ["gtk3", "libnotify", "xdg-utils", "at-spi2-core", "alsa-lib", "nspr", "nss"], }, nsis: { @@ -101,13 +102,14 @@ export const config: Configuration = { deb: { category: "Network", icon: "build/icon.icns", - depends: ["libgbm-dev", "libasound2", "libnspr4", "libnss3"], + depends: ["libasound2", "libnspr4", "libnss3", "libasound2t64", "libasound2-plugins"], desktop: { entry: { Actions: availableActions, }, desktopActions: desktopActions("/opt/Legcord/legcord"), }, + fpm: [`${debianLicence()}=/usr/share/doc/legcord/copyright`], }, files: [ diff --git a/package.json b/package.json index b723725..bbf7b24 100644 --- a/package.json +++ b/package.json @@ -40,17 +40,19 @@ "@types/ws": "^8.18.1", "@uwu/lune": "^1.6.2", "@uwu/shelter-defs": "^1.5.1", + "@uwu/shelter-ui": "^0.0.6", "@xmldom/xmldom": "^0.9.10", "app-builder-lib": "^26.8.1", "babel-preset-solid": "^1.9.12", "electron": "43.2.0", - "electron-builder": "26.8.1", + "electron-builder": "26.15.7", "lucide-solid": "^1.16.0", "monaco-editor": "0.52.2", - "rolldown": "1.0.3", + "rolldown": "1.2.0", "rollup-plugin-copy": "^3.5.0", "solid-js": "^1.9.14", "solid-motionone": "^1.0.4", + "spdx-license-list": "^6.11.0", "typescript": "^6.0.3", "xml-formatter": "^3.7.0" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 87b4c22..dde3084 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -47,7 +47,7 @@ importers: version: 2.4.16 '@rolldown-plugin/solid': specifier: ^0.0.4 - version: 0.0.4(csstype@3.2.3)(rolldown@1.0.3)(seroval@1.5.5)(solid-js@1.9.14) + version: 0.0.4(csstype@3.2.3)(rolldown@1.2.0)(seroval@1.5.5)(solid-js@1.9.14) '@rollup/plugin-esm-shim': specifier: ^0.1.8 version: 0.1.8 @@ -66,6 +66,9 @@ importers: '@uwu/shelter-defs': specifier: ^1.5.1 version: 1.5.1 + '@uwu/shelter-ui': + specifier: ^0.0.6 + version: 0.0.6(solid-js@1.9.14) '@xmldom/xmldom': specifier: ^0.9.10 version: 0.9.10 @@ -79,8 +82,8 @@ importers: specifier: 43.2.0 version: 43.2.0 electron-builder: - specifier: 26.8.1 - version: 26.8.1(electron-builder-squirrel-windows@26.8.1) + specifier: 26.15.7 + version: 26.15.7(electron-builder-squirrel-windows@26.8.1) lucide-solid: specifier: ^1.16.0 version: 1.16.0(solid-js@1.9.14) @@ -88,8 +91,8 @@ importers: specifier: 0.52.2 version: 0.52.2 rolldown: - specifier: 1.0.3 - version: 1.0.3 + specifier: 1.2.0 + version: 1.2.0 rollup-plugin-copy: specifier: ^3.5.0 version: 3.5.0 @@ -99,6 +102,9 @@ importers: solid-motionone: specifier: ^1.0.4 version: 1.0.4(solid-js@1.9.14) + spdx-license-list: + specifier: ^6.11.0 + version: 6.11.0 typescript: specifier: ^6.0.3 version: 6.0.3 @@ -460,12 +466,21 @@ packages: '@emnapi/core@1.10.0': resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} + '@emnapi/core@1.11.2': + resolution: {integrity: sha512-TC8MkTuZUtcTSiFeuC0ksCh9QIJ5+F21MvZ4Wn4ORfYaFJ/0dsiudv5tVkejgwZlwQ39jL9WWDe2lz8x0WglOA==} + '@emnapi/runtime@1.10.0': resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} + '@emnapi/runtime@1.11.2': + resolution: {integrity: sha512-kyOl3X0DuTiT1h2ft8r2fYO8JYtU9a9Xis/zBSiGArNaagCOWx90N1k2wxp18czFDH+OgcWGb5ZP/XMt3dcyPA==} + '@emnapi/wasi-threads@1.2.1': resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} + '@emnapi/wasi-threads@1.2.2': + resolution: {integrity: sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==} + '@esbuild/android-arm64@0.17.19': resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==} engines: {node: '>=12'} @@ -651,12 +666,20 @@ packages: '@napi-rs/wasm-runtime@0.2.12': resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} - '@napi-rs/wasm-runtime@1.1.4': - resolution: {integrity: sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==} + '@napi-rs/wasm-runtime@1.1.6': + resolution: {integrity: sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==} peerDependencies: '@emnapi/core': ^1.7.1 '@emnapi/runtime': ^1.7.1 + '@noble/hashes@1.4.0': + resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} + engines: {node: '>= 16'} + + '@noble/hashes@2.2.0': + resolution: {integrity: sha512-IYqDGiTXab6FniAgnSdZwgWbomxpy9FtYvLKs7wCUs2a8RkITG+DFGO1DM9cr+E3/RgADRpFjrKVaJ1z6sjtEg==} + engines: {node: '>= 20.19.0'} + '@nodable/entities@3.0.0': resolution: {integrity: sha512-8L9xFeTYKhm49xfIypoe2W5wV1m/3Z58kT+7kR9A8OyFxcPduI4VmxaUMQyKYrRjUoLLSXv6EKKID5Tvj9cUVw==} @@ -672,8 +695,8 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@oxc-project/types@0.133.0': - resolution: {integrity: sha512-KzkdCd6Uxqnf6l3HOw1xfatAlUURA0g14cvBYFyJ5SaNOQbOUvBr9PKArcPcrNIeRsBdgcUzOGrhKveVpvOIGA==} + '@oxc-project/types@0.140.0': + resolution: {integrity: sha512-h5LUOzGArYemnW1NMz/DuuQhBi96J6JL2Bk8zE4kvqxB5Sg3jxmCiH4uyOWHDkiKSt5vWlG4FIwCR/DbstcNRQ==} '@parcel/watcher-android-arm64@2.5.6': resolution: {integrity: sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==} @@ -763,6 +786,20 @@ packages: resolution: {integrity: sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==} engines: {node: '>= 10.0.0'} + '@peculiar/asn1-schema@2.8.0': + resolution: {integrity: sha512-7YT0U/ze0tF2QOBbE15gKZwy5tvgGyLRiRHLzhlbOpf7BT032oBSd0haZqXn5W6l26WLlu3dyxzjM+2638/z2Q==} + + '@peculiar/json-schema@1.1.12': + resolution: {integrity: sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w==} + engines: {node: '>=8.0.0'} + + '@peculiar/utils@2.0.3': + resolution: {integrity: sha512-+oL3HPFRIZ1St2K50lWCXiioIgSoxzz7R1J3uF6neO2yl1sgmpgY6XXJH4BdpoDkMWznQTeYF6oWNDZLCdQ4eQ==} + + '@peculiar/webcrypto@1.7.1': + resolution: {integrity: sha512-ODOov0sGMJMf3jPonOkgGqPknTsu+DdQ7kD++gz8aI+aFMOMHFbWAA2taqXXVTdP+OTOQR/znGvSpmkeI0WTYQ==} + engines: {node: '>=14.18.0'} + '@rolldown-plugin/solid@0.0.4': resolution: {integrity: sha512-1SfABNnkkVYu+0sSuraZDjaonmylalAvopLN2o2vNTSaJh2q1KioCN+1BCzNgrDgiCa36dbzRz0IOoplyKa9uw==} engines: {node: '>=22.12.0'} @@ -772,8 +809,8 @@ packages: seroval: ~1.5.0 solid-js: '>=1.9.12' - '@rolldown/binding-android-arm64@1.0.3': - resolution: {integrity: sha512-454rs7jHngixp/NMxd5srYD57OnzSlZ/eFTETjORQHLwJG1lRtmNOJcBerZlfu4GjKqeq8aCCIQrMdHyhI51Hw==} + '@rolldown/binding-android-arm64@1.2.0': + resolution: {integrity: sha512-9yB1l95IrJuNGDFdOYe79vdApdz6WWBCObE+rQ2LUliYUlcyFwSYIb2xb5/Ifw7dAtMy2ZqNyd8QTSOc7duAKw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] @@ -783,8 +820,8 @@ packages: cpu: [arm64] os: [darwin] - '@rolldown/binding-darwin-arm64@1.0.3': - resolution: {integrity: sha512-PcAhP+ynjURNyy8SKGl5DQP94aGuB/7JrXJb/t7P+hanXvQVMWzUvRRhBAcg/lNRadBhoUPqSoP4xw5tR/KBEA==} + '@rolldown/binding-darwin-arm64@1.2.0': + resolution: {integrity: sha512-pexNaW9ACLUOaBITOpU6qVu4VrsOFIjTv6bzgu0YUATo4eUJx0V605PxwZfndpPOn0ilqGqvGQ0M8UW0IE24jg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] @@ -794,8 +831,8 @@ packages: cpu: [x64] os: [darwin] - '@rolldown/binding-darwin-x64@1.0.3': - resolution: {integrity: sha512-9YpfeUvSE2RS7wysJ81uOZkXJz7f7Q55H2Gvp3VEw/EsahqDtrphrZ0EwDLK5vvKOzaCrBsjF8JmnMLcUt78Gg==} + '@rolldown/binding-darwin-x64@1.2.0': + resolution: {integrity: sha512-NqKYaq0355ZmNMG4QGpxtEDxsc7tGDhjhCm4PpE0cwnBW+5Il95LJyq414niEiaKLVjnVHBEjSo1wngKxJNiFw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] @@ -805,8 +842,8 @@ packages: cpu: [x64] os: [freebsd] - '@rolldown/binding-freebsd-x64@1.0.3': - resolution: {integrity: sha512-yB1IlAsSNHncV6SCTL27/MVGR5htvQsoGxIv5KMGXALp+Ll1wYsn+x98M9MW7qa+NdSbvrrY7ANI4wLJ0n1e6g==} + '@rolldown/binding-freebsd-x64@1.2.0': + resolution: {integrity: sha512-3vPoHzh6eBTz9IbB0/qZdSr0Qeks2echn+I4cHu2joV74VriPDdldswksEDzrl1mBB+oPRi+67+3Ib59paxIPQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] @@ -816,8 +853,8 @@ packages: cpu: [arm] os: [linux] - '@rolldown/binding-linux-arm-gnueabihf@1.0.3': - resolution: {integrity: sha512-Yi30IVAAfLUCy2MseFjbB1jAMDl1VMCAas5StnYp8da9+CKvMd2H2cbEjWcw5NPaPqzvYkVIaF1nNUG+b7u/sw==} + '@rolldown/binding-linux-arm-gnueabihf@1.2.0': + resolution: {integrity: sha512-E6NNefZ1bUVmKJq2tJkf45J4Zyczj7qm9rUT7NY+Xo2474Y13qWAwc2tvBt0BAVbmtXR1llkxXg0Ou1jbDf2SQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] @@ -828,8 +865,8 @@ packages: os: [linux] libc: [glibc] - '@rolldown/binding-linux-arm64-gnu@1.0.3': - resolution: {integrity: sha512-jsO7R8To+AdlYgUmN5sHSCZbfhtMBkO0WUx8iORQnPcMMdgr7qM2DQmMwgabs3GhNztdmoKkMKQFHD6DTMCIQw==} + '@rolldown/binding-linux-arm64-gnu@1.2.0': + resolution: {integrity: sha512-D+TgkdgM1vu+7/Fpf8+v0ARW+RXEP9Ccazgm8zQ4JFFd9Q7SrYQ2TakU5S5ihazQDgpKyAgZDOcIFsvoHmTZ8w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] @@ -841,22 +878,22 @@ packages: os: [linux] libc: [musl] - '@rolldown/binding-linux-arm64-musl@1.0.3': - resolution: {integrity: sha512-VWkUHwWriDciit80wleYwKILoR/KMvxh/IdwS/paX+ZgpuRpCrKLUdadJbc0NpBEiyhpYawsJ73j9aCvOH+f7Q==} + '@rolldown/binding-linux-arm64-musl@1.2.0': + resolution: {integrity: sha512-wUqdwJBbAv0APN87GecstdMUtLjjNTs0hBALpxETD73mccFxdmt/XeizXDtN5RAlBwNKmI+Tg+blect2G+8IeQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@rolldown/binding-linux-ppc64-gnu@1.0.3': - resolution: {integrity: sha512-5f1laC0SlIR0yDbFCd8acUhvJIag6N3zC5P7oUPN6wX0aOma+uKJ0wBDH5aq7I1PVI2ttTlhJwzwRIBnLiSGEg==} + '@rolldown/binding-linux-ppc64-gnu@1.2.0': + resolution: {integrity: sha512-9DtF35qR9/NrfhM4oxLplCzVVjE+KKm8Pjemi0i/sdhAWkUasjmSo8WTTubNJClhSHCfyk2yeyoXDQEDPtDAAw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] - '@rolldown/binding-linux-s390x-gnu@1.0.3': - resolution: {integrity: sha512-Iq4ko0r4XsgbrF/LunNgHtAGLRRVE2kXonAXQ/MV0mC6jQpMOhW1SvtZja2EhC/kd05++bP78dsqBeIQyYJ6Yg==} + '@rolldown/binding-linux-s390x-gnu@1.2.0': + resolution: {integrity: sha512-RzuHrBh8X8Hntd2N4VR02QGEciq/9JhcZoTpR/Cee6otRrlILGCf3cg2ygHuih+ZebUnWmMrDX6ITI85btO6rQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] @@ -868,8 +905,8 @@ packages: os: [linux] libc: [glibc] - '@rolldown/binding-linux-x64-gnu@1.0.3': - resolution: {integrity: sha512-B8m6tD5+/N5FeNQFbKlLA/2yVq9ycQP1SeedyEYYKWBNR3ZQbkvIUcNnDNM03lO1l5F2roiiFJGgvoLLyZXtSg==} + '@rolldown/binding-linux-x64-gnu@1.2.0': + resolution: {integrity: sha512-MK7L0018jjh1jR3mh21G2j1zAVcpscJBlPo2z19pRjv2XOYGRhaV4LyiD8HO6nCDdZln9IFgCMIV5yt4E3klGQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] @@ -881,15 +918,15 @@ packages: os: [linux] libc: [musl] - '@rolldown/binding-linux-x64-musl@1.0.3': - resolution: {integrity: sha512-pSdpdUJHkuCxun9LE7jvgUB9qsRgaiyNNCX7m/AvHTcq67AiT/Yhoxvw5zPfhrM8k/BfP8ce/hMOpthKDpEUow==} + '@rolldown/binding-linux-x64-musl@1.2.0': + resolution: {integrity: sha512-gyrxLQ9NfGb/9LoVnC4kb9miUghw1mghnkfYvNHSnVIXriabnfgGPUP4RLcJm87q3KgYz4FYUG8IDiWUT+CpSw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@rolldown/binding-openharmony-arm64@1.0.3': - resolution: {integrity: sha512-OXXS3RKJgX2uLwM+gYyuH5omcH8fL1LJs96pZGgtetVCahON57+d4SJHzTgZiOjxgGkSnpXpOsWuPDGAKAigEg==} + '@rolldown/binding-openharmony-arm64@1.2.0': + resolution: {integrity: sha512-/6VFMQGRmrhP77KXDC+StIxGzcNp5JOIyYtw0CQ8gPlzhpiIRucYfoM5FaFamHd5BJYIdH86yfP46l1p3WdrFA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] @@ -899,8 +936,8 @@ packages: engines: {node: '>=14.21.3'} cpu: [wasm32] - '@rolldown/binding-wasm32-wasi@1.0.3': - resolution: {integrity: sha512-JTtb8BWFynicNSoPrehsCzBtOKjZ6jhMiPFEmOiuXg1Fl8dn2KHQob+GuPSGR0dryQa1PQJbzjF3dqO/whhjLg==} + '@rolldown/binding-wasm32-wasi@1.2.0': + resolution: {integrity: sha512-rwdbUL465kisF24WEJLvP3JrEG6E5GRuIHt5wpMwHGERtHe4Wm2CIvtf5gTBgr2tGOHKh5NdKEAFS2VkOPE91g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [wasm32] @@ -909,8 +946,8 @@ packages: cpu: [arm64] os: [win32] - '@rolldown/binding-win32-arm64-msvc@1.0.3': - resolution: {integrity: sha512-gEdFFEN70A/jxb2svrWsN3aDL7OUtmvlOy+6fa2jxG8K0wQ1ZbdeLGnidov6Yu5/733dI5ySfzFlQ/cb0bSz1g==} + '@rolldown/binding-win32-arm64-msvc@1.2.0': + resolution: {integrity: sha512-+5suHwRiKGmhwyUaNT8a5QbrBvLFh2DbO910TEmGRH1aSxwrCezodvGQnulv4uiWEIv1Kq4ypRsJ5+O+ry1DiA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] @@ -925,8 +962,8 @@ packages: cpu: [x64] os: [win32] - '@rolldown/binding-win32-x64-msvc@1.0.3': - resolution: {integrity: sha512-eXB7CHuaQdqmJcc3koCNtNPmT/bj2gc999kUFgBxG8Ac0NdgXc4rkCHhqrgrhN3zddvvvrgzj1e90SuSfmyIXA==} + '@rolldown/binding-win32-x64-msvc@1.2.0': + resolution: {integrity: sha512-WfFv6/qGufotqBSBzBYwgpCkJBk8Nj7697LL9vTz/XWc67e0r3oewu8iMRwQj3AUL45GVD7wVsPjCsAAtW66Wg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] @@ -974,6 +1011,9 @@ packages: '@tybys/wasm-util@0.10.2': resolution: {integrity: sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==} + '@tybys/wasm-util@0.10.3': + resolution: {integrity: sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==} + '@types/adm-zip@0.5.8': resolution: {integrity: sha512-RVVH7QvZYbN+ihqZ4kX/dMiowf6o+Jk1fNwiSdx0NahBJLU787zkULhGhJM8mf/obmLGmgdMM0bXsQTmyfbR7Q==} @@ -1036,6 +1076,11 @@ packages: '@uwu/shelter-defs@1.5.1': resolution: {integrity: sha512-bO3M5SgqEpuNZkjd/LZFtTNNATpmVle5uznVp0QNgi3o1w2ej/ieYmwFK6nBZqnZHd8/4aJN1Njl/JbTnZcY5A==} + '@uwu/shelter-ui@0.0.6': + resolution: {integrity: sha512-b9NsUC7A+n4jZJl8TmXv+UKPAtfS9JygtRNASnophDkSF7evligMc21HGm8A7fh3PdBzr9VrepvehgmyUgRnLg==} + peerDependencies: + solid-js: ^1.6.16 + '@vencord/venmic@6.1.0': resolution: {integrity: sha512-YiCtzml/W8tYbGhu3jm5jfbbEnl2slKKARNK0jO+8qV979k9eFnfIRTxvhMN/SWq1h8ZNJdXVwvXpffQwq0RuA==} engines: {node: '>=14.15'} @@ -1078,6 +1123,9 @@ packages: ajv@6.15.0: resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} + ajv@8.20.0: + resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} + ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -1104,6 +1152,13 @@ packages: app-builder-bin@5.0.0-alpha.12: resolution: {integrity: sha512-j87o0j6LqPL3QRr8yid6c+Tt5gC7xNfYo6uQIQkorAC6MpeayVMZrEDzKmJJ/Hlv7EnOQpaRm53k6ktDYZyB6w==} + app-builder-lib@26.15.7: + resolution: {integrity: sha512-C7APoYISPExUmrEntNhDpz9Tccb4uWuEDfLaC0WPPc7/pwzz0WZGznCz/ycPfkkzw6tKOalceD8g6TgHmVz1QA==} + engines: {node: '>=14.0.0'} + peerDependencies: + dmg-builder: 26.15.7 + electron-builder-squirrel-windows: 26.15.7 + app-builder-lib@26.8.1: resolution: {integrity: sha512-p0Im/Dx5C4tmz8QEE1Yn4MkuPC8PrnlRneMhWJj7BBXQfNTJUshM/bp3lusdEsDbvvfJZpXWnYesgSLvwtM2Zw==} engines: {node: '>=14.0.0'} @@ -1131,6 +1186,10 @@ packages: version: 3.5.0 hasBin: true + asn1js@3.0.10: + resolution: {integrity: sha512-S2s3aOytiKdFRdulw2qPE51MzjzVOisppcVv7jVFR+Kw0kxwvFrDcYA0h7Ndqbmj0HkMIXYWaoj7fli8kgx1eg==} + engines: {node: '>=12.0.0'} + assert-plus@1.0.0: resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} engines: {node: '>=0.8'} @@ -1153,6 +1212,9 @@ packages: resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==} engines: {node: '>= 4.0.0'} + aws4@1.13.2: + resolution: {integrity: sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==} + axios@1.16.1: resolution: {integrity: sha512-caYkukvroVPO8KrzuJEb50Hm07KwfBZPEC3VeFHTsqWHvKTsy54hjJz9BS/cdaypROE2rH6xvm9mHX4fgWkr3A==} @@ -1189,6 +1251,9 @@ packages: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} + bluebird@3.7.2: + resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} + boolean@3.2.0: resolution: {integrity: sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==} deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. @@ -1222,9 +1287,21 @@ packages: resolution: {integrity: sha512-qt41tMfgHTllhResqM5DcnHyDIWNgzHvuY2jDcYP9iaGpkWxTUzV6GQjDeLnlR1/DtdlcsWQbA7sByMpmJFTLQ==} engines: {node: '>=12.0.0'} + builder-util-runtime@9.7.0: + resolution: {integrity: sha512-g/kR520giAFYkSXTzcmF3kqQq7wi8F6N6SzeDgZrqTBN+VHdmgWOyTdD1yD7AATDId/yXLvuP34CxW46/BwCdw==} + engines: {node: '>=12.0.0'} + + builder-util@26.15.3: + resolution: {integrity: sha512-q2hn7Mbo2nFNkVekPiHFx6Nfo3hURmES3tfBn+k5Pqxl2RkmP3QGqZUhH/q9Pch/4G05NRhPjDlVj1O8q4Txvw==} + engines: {node: '>=14.0.0'} + builder-util@26.8.1: resolution: {integrity: sha512-pm1lTYbGyc90DHgCDO7eo8Rl4EqKLciayNbZqGziqnH9jrlKe8ZANGdityLZU+pJh16dfzjAx2xQq9McuIPEtw==} + bytestreamjs@2.0.1: + resolution: {integrity: sha512-U1Z/ob71V/bXfVABvNr/Kumf5VyeQRBEm6Txb0PQ6S7V5GpBM3w4Cbqz/xPDicR5tN0uvDifng8C+5qECeGwyQ==} + engines: {node: '>=6.0.0'} + cacheable-lookup@5.0.4: resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} engines: {node: '>=10.6.0'} @@ -1402,6 +1479,9 @@ packages: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} + dmg-builder@26.15.7: + resolution: {integrity: sha512-rfo1YyAWO0L3cZLKCqKQiLYbW6ZXebRUfK0kWp4oXxO7dDFLrf7alRkWImNuXvZVQhs6Idzy++cwOk8I+xPDhw==} + dmg-builder@26.8.1: resolution: {integrity: sha512-glMJgnTreo8CFINujtAhCgN96QAqApDMZ8Vl1r8f0QT8QprvC1UCltV4CcWj20YoIyLZx6IUskaJZ0NV8fokcg==} @@ -1423,6 +1503,9 @@ packages: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} + duplexer2@0.1.4: + resolution: {integrity: sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==} + ejs@3.1.10: resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} engines: {node: '>=0.10.0'} @@ -1431,8 +1514,8 @@ packages: electron-builder-squirrel-windows@26.8.1: resolution: {integrity: sha512-o288fIdgPLHA76eDrFADHPoo7VyGkDCYbLV1GzndaMSAVBoZrGvM9m2IehdcVMzdAZJ2eV9bgyissQXHv5tGzA==} - electron-builder@26.8.1: - resolution: {integrity: sha512-uWhx1r74NGpCagG0ULs/P9Nqv2nsoo+7eo4fLUOB8L8MdWltq9odW/uuLXMFCDGnPafknYLZgjNX0ZIFRzOQAw==} + electron-builder@26.15.7: + resolution: {integrity: sha512-DBpaNzxsPs1BvEblzFoNriSbzsBqDCy/gseIngeEhYzQG1IxfB7Hvc2tBBVmpWE2BTQGP9J1RrAvDT+Vc/uAxg==} engines: {node: '>=14.0.0'} hasBin: true @@ -1448,6 +1531,9 @@ packages: resolution: {integrity: sha512-8TjjAh8Ec51hUi3o4TaU0mD3GMTOESi866oRNavj9A3IQJ7pmv+MJVmdZBFGw4GFT36X7bkqnuDNYvkQgvyI8Q==} engines: {node: '>=18'} + electron-publish@26.15.3: + resolution: {integrity: sha512-g/2bn8YTavY4cuS5F+jOS7zmZbXXBV8KZ8yHKfJjFPoKtzBqrpCdNPxBd3tqdBwP7BVd0lGzf7Bk2s0KesWZ4Q==} + electron-publish@26.8.1: resolution: {integrity: sha512-q+jrSTIh/Cv4eGZa7oVR+grEJo/FoLMYBAnSL5GCtqwUpr1T+VgKB/dn1pnzxIxqD8S/jP1yilT9VrwCqINR4w==} @@ -1559,6 +1645,9 @@ packages: fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + fast-uri@3.1.4: + resolution: {integrity: sha512-8JnbkQ4juDyvYs4mgFGQqg4yCYtFDtUtmp2QIQq11ZZe5CFQ5wcqm1rqDgAh/QdMySuBnPzMUiJUNZG5N/AiQw==} + fast-xml-builder@1.3.0: resolution: {integrity: sha512-F74cZEdCvuw9P41GAC3rod4X04jjWGM1JPEv/GWSqFTWLsdyMSBMBMlm9Hk3GLBgLBbdBNY8yee0pQh2RBVESQ==} @@ -1606,8 +1695,8 @@ packages: resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} engines: {node: '>=12'} - fs-extra@11.3.5: - resolution: {integrity: sha512-eKpRKAovdpZtR1WopLHxlBWvAgPny3c4gX1G5Jhwmmw4XJj0ifSD5qB5TOo8hmA0wlRKDAOAhEE1yVPgs6Fgcg==} + fs-extra@11.3.1: + resolution: {integrity: sha512-eXvGGwZ5CL17ZSwHWd3bbgk7UUpF6IFHtP57NYYakPvHOs8GDgDe5KJI36jIJzDkJ6eJjuzRA8eBQb6SkKue0g==} engines: {node: '>=14.14'} fs-extra@11.3.6: @@ -1834,6 +1923,9 @@ packages: is-unsafe@2.0.0: resolution: {integrity: sha512-2LdV822R+wmI86unXA93WCFpL6g+av8ynWk0nrHyJqGop5VoocYsSLFgN8jrfalT6iGeLNM4KXuVSsULP53kEA==} + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + isbinaryfile@4.0.10: resolution: {integrity: sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==} engines: {node: '>= 8.0.0'} @@ -1883,6 +1975,9 @@ 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-stringify-safe@5.0.1: resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} @@ -2141,6 +2236,9 @@ packages: engines: {node: ^20.17.0 || >=22.9.0} hasBin: true + node-int64@0.4.0: + resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + node-releases@2.0.46: resolution: {integrity: sha512-GYVXHE2KnrzAfsAjl4uP++evGFCrAU1jta4ubEjIG7YWt/64Gqv66a30yKwWczVjA6j3bM4nBwH7Pk1JmDHaxQ==} engines: {node: '>=18'} @@ -2236,6 +2334,10 @@ packages: pkg-types@1.3.1: resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + pkijs@3.4.0: + resolution: {integrity: sha512-emEcLuomt2j03vxD54giVB4SxTjnsqkU692xZOZXHDVoYyypEm+b3jpiTcc+Cf+myooc+/Ly0z01jqeNHVgJGw==} + engines: {node: '>=16.0.0'} + plist@3.1.0: resolution: {integrity: sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==} engines: {node: '>=10.4.0'} @@ -2253,6 +2355,9 @@ packages: resolution: {integrity: sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ==} engines: {node: ^20.17.0 || >=22.9.0} + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + progress@2.0.3: resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} engines: {node: '>=0.4.0'} @@ -2279,6 +2384,13 @@ packages: resolution: {integrity: sha512-LjgDO2zPtoXP2wJpDjZrGdojii1uqO0cnwKoIoUzkfS98HDmbeiGmYiXo3lXeFlq2xvne1QFQhwYXSUCLKtEuA==} engines: {node: '>=12.20'} + pvtsutils@1.3.6: + resolution: {integrity: sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==} + + pvutils@1.1.5: + resolution: {integrity: sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA==} + engines: {node: '>=16.0.0'} + queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -2294,6 +2406,9 @@ packages: resolution: {integrity: sha512-BNg9EN3DD3GsDXX7Aa8O4p92sryjkmzYYgmgTAc6CA4uGLEDzFfxOxugu21akOxpcXHiEgsYkC6nPsQvLLLmEg==} hasBin: true + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + readable-stream@3.6.2: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} @@ -2310,6 +2425,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'} @@ -2351,8 +2470,8 @@ packages: '@babel/runtime': optional: true - rolldown@1.0.3: - resolution: {integrity: sha512-i00lAJ2ks1BYr7rjNjKC7BcqAS7nVfiT3QX1SI5aY+AFHblCmaUf9OE9dbdzDvW6dJxbi2ZCZiy9v3CcwOiX3g==} + rolldown@1.2.0: + resolution: {integrity: sha512-u7tgm5l4Yw1iTqUL4EcYOAt7fFvCgQMLeidrnD4GALlC6aOznCjezYajgxeyKw27u0Q5N7fwgCzjVyPIWzwuBA==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true @@ -2363,6 +2482,9 @@ packages: run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} @@ -2480,6 +2602,10 @@ packages: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} + spdx-license-list@6.11.0: + resolution: {integrity: sha512-p5ICd51dSnh7zIMtPgbB9ShBg3HMT77OeI6WVhrFFvxa5KIFYNcqxD4joAE+n1zZ7wlJdEkrOMwC75JUMMmsJA==} + engines: {node: '>=8'} + spitroast@2.1.4: resolution: {integrity: sha512-IA987I3wS8RbrKrgag+NsxLUAttrqONF7UGOL+uQFmLLXlMhZl42LomTAltBQaev0jUXIaRiqShZ3hnJYT7OCQ==} @@ -2501,6 +2627,9 @@ packages: resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} engines: {node: '>=18'} + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} @@ -2617,6 +2746,9 @@ packages: resolution: {integrity: sha512-ZX6U1J04K1FoSUeoX1OicAhw4d0aro2qo+L8RhJkiGTNtBNkd/Fi1Wxoc9HzcVu6HfOzm0si/N15JjxFmD1z6A==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + unzipper@0.12.5: + resolution: {integrity: sha512-tXYOi9R57Uj/2Z25SOs5RRSzq886MBQj2gY8dPL+xl/kv6s6SvByoKfAtvfVeEuhntWDgjd2o9p2lb4TVPAz0A==} + update-browserslist-db@1.2.3: resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} hasBin: true @@ -2639,6 +2771,9 @@ packages: resolution: {integrity: sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==} engines: {node: '>=0.6.0'} + webcrypto-core@1.9.2: + resolution: {integrity: sha512-gsXecm82UQNlTBURJGuqOWy1Ww08S3kZUcr3aOJS02Pk0xLtkfeUAVC0u0xhgdonFme80edSJUIJyuvL/7250Q==} + which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -3170,7 +3305,7 @@ snapshots: '@malept/cross-spawn-promise': 2.0.0 debug: 4.4.3 dir-compare: 4.2.0 - fs-extra: 11.3.5 + fs-extra: 11.3.6 minimatch: 9.0.9 plist: 3.1.1 transitivePeerDependencies: @@ -3193,16 +3328,32 @@ snapshots: tslib: 2.8.1 optional: true + '@emnapi/core@1.11.2': + dependencies: + '@emnapi/wasi-threads': 1.2.2 + tslib: 2.8.1 + optional: true + '@emnapi/runtime@1.10.0': dependencies: tslib: 2.8.1 optional: true + '@emnapi/runtime@1.11.2': + dependencies: + tslib: 2.8.1 + optional: true + '@emnapi/wasi-threads@1.2.1': dependencies: tslib: 2.8.1 optional: true + '@emnapi/wasi-threads@1.2.2': + dependencies: + tslib: 2.8.1 + optional: true + '@esbuild/android-arm64@0.17.19': optional: true @@ -3352,13 +3503,17 @@ snapshots: '@tybys/wasm-util': 0.10.2 optional: true - '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': + '@napi-rs/wasm-runtime@1.1.6(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)': dependencies: - '@emnapi/core': 1.10.0 - '@emnapi/runtime': 1.10.0 - '@tybys/wasm-util': 0.10.2 + '@emnapi/core': 1.11.2 + '@emnapi/runtime': 1.11.2 + '@tybys/wasm-util': 0.10.3 optional: true + '@noble/hashes@1.4.0': {} + + '@noble/hashes@2.2.0': {} + '@nodable/entities@3.0.0': {} '@nodelib/fs.scandir@2.1.5': @@ -3373,7 +3528,7 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.20.1 - '@oxc-project/types@0.133.0': {} + '@oxc-project/types@0.140.0': {} '@parcel/watcher-android-arm64@2.5.6': optional: true @@ -3436,7 +3591,29 @@ snapshots: '@parcel/watcher-win32-x64': 2.5.6 optional: true - '@rolldown-plugin/solid@0.0.4(csstype@3.2.3)(rolldown@1.0.3)(seroval@1.5.5)(solid-js@1.9.14)': + '@peculiar/asn1-schema@2.8.0': + dependencies: + '@peculiar/utils': 2.0.3 + asn1js: 3.0.10 + tslib: 2.8.1 + + '@peculiar/json-schema@1.1.12': + dependencies: + tslib: 2.8.1 + + '@peculiar/utils@2.0.3': + dependencies: + tslib: 2.8.1 + + '@peculiar/webcrypto@1.7.1': + dependencies: + '@peculiar/asn1-schema': 2.8.0 + '@peculiar/json-schema': 1.1.12 + '@peculiar/utils': 2.0.3 + tslib: 2.8.1 + webcrypto-core: 1.9.2 + + '@rolldown-plugin/solid@0.0.4(csstype@3.2.3)(rolldown@1.2.0)(seroval@1.5.5)(solid-js@1.9.14)': dependencies: '@babel/core': 8.0.0-rc.6 '@babel/helper-module-imports': 8.0.0-rc.6 @@ -3448,68 +3625,68 @@ snapshots: csstype: 3.2.3 html-entities: 2.6.0 parse5: 8.0.1 - rolldown: 1.0.3 + rolldown: 1.2.0 seroval: 1.5.5 solid-js: 1.9.14 - '@rolldown/binding-android-arm64@1.0.3': + '@rolldown/binding-android-arm64@1.2.0': optional: true '@rolldown/binding-darwin-arm64@1.0.0-beta.1': optional: true - '@rolldown/binding-darwin-arm64@1.0.3': + '@rolldown/binding-darwin-arm64@1.2.0': optional: true '@rolldown/binding-darwin-x64@1.0.0-beta.1': optional: true - '@rolldown/binding-darwin-x64@1.0.3': + '@rolldown/binding-darwin-x64@1.2.0': optional: true '@rolldown/binding-freebsd-x64@1.0.0-beta.1': optional: true - '@rolldown/binding-freebsd-x64@1.0.3': + '@rolldown/binding-freebsd-x64@1.2.0': optional: true '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.1': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.0.3': + '@rolldown/binding-linux-arm-gnueabihf@1.2.0': optional: true '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.1': optional: true - '@rolldown/binding-linux-arm64-gnu@1.0.3': + '@rolldown/binding-linux-arm64-gnu@1.2.0': optional: true '@rolldown/binding-linux-arm64-musl@1.0.0-beta.1': optional: true - '@rolldown/binding-linux-arm64-musl@1.0.3': + '@rolldown/binding-linux-arm64-musl@1.2.0': optional: true - '@rolldown/binding-linux-ppc64-gnu@1.0.3': + '@rolldown/binding-linux-ppc64-gnu@1.2.0': optional: true - '@rolldown/binding-linux-s390x-gnu@1.0.3': + '@rolldown/binding-linux-s390x-gnu@1.2.0': optional: true '@rolldown/binding-linux-x64-gnu@1.0.0-beta.1': optional: true - '@rolldown/binding-linux-x64-gnu@1.0.3': + '@rolldown/binding-linux-x64-gnu@1.2.0': optional: true '@rolldown/binding-linux-x64-musl@1.0.0-beta.1': optional: true - '@rolldown/binding-linux-x64-musl@1.0.3': + '@rolldown/binding-linux-x64-musl@1.2.0': optional: true - '@rolldown/binding-openharmony-arm64@1.0.3': + '@rolldown/binding-openharmony-arm64@1.2.0': optional: true '@rolldown/binding-wasm32-wasi@1.0.0-beta.1': @@ -3517,17 +3694,17 @@ snapshots: '@napi-rs/wasm-runtime': 0.2.12 optional: true - '@rolldown/binding-wasm32-wasi@1.0.3': + '@rolldown/binding-wasm32-wasi@1.2.0': dependencies: - '@emnapi/core': 1.10.0 - '@emnapi/runtime': 1.10.0 - '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + '@emnapi/core': 1.11.2 + '@emnapi/runtime': 1.11.2 + '@napi-rs/wasm-runtime': 1.1.6(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2) optional: true '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.1': optional: true - '@rolldown/binding-win32-arm64-msvc@1.0.3': + '@rolldown/binding-win32-arm64-msvc@1.2.0': optional: true '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.1': @@ -3536,7 +3713,7 @@ snapshots: '@rolldown/binding-win32-x64-msvc@1.0.0-beta.1': optional: true - '@rolldown/binding-win32-x64-msvc@1.0.3': + '@rolldown/binding-win32-x64-msvc@1.2.0': optional: true '@rolldown/pluginutils@1.0.1': {} @@ -3575,6 +3752,11 @@ snapshots: tslib: 2.8.1 optional: true + '@tybys/wasm-util@0.10.3': + dependencies: + tslib: 2.8.1 + optional: true + '@types/adm-zip@0.5.8': dependencies: '@types/node': 25.9.1 @@ -3669,6 +3851,10 @@ snapshots: solid-js: 1.6.16 spitroast: 2.1.4 + '@uwu/shelter-ui@0.0.6(solid-js@1.9.14)': + dependencies: + solid-js: 1.9.14 + '@vencord/venmic@6.1.0': dependencies: cmake-js: 7.4.0 @@ -3708,6 +3894,13 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 + ajv@8.20.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.4 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + ansi-regex@5.0.1: {} ansi-regex@6.2.2: {} @@ -3727,6 +3920,54 @@ snapshots: app-builder-bin@5.0.0-alpha.12: {} + app-builder-lib@26.15.7(dmg-builder@26.15.7(electron-builder-squirrel-windows@26.8.1))(electron-builder-squirrel-windows@26.8.1): + dependencies: + '@electron/asar': 3.4.1 + '@electron/fuses': 1.8.0 + '@electron/get': 3.1.0 + '@electron/notarize': 2.5.0 + '@electron/osx-sign': 1.3.3 + '@electron/rebuild': 4.0.4 + '@electron/universal': 2.0.3 + '@malept/flatpak-bundler': 0.4.0 + '@noble/hashes': 2.2.0 + '@peculiar/webcrypto': 1.7.1 + '@types/fs-extra': 9.0.13 + ajv: 8.20.0 + asn1js: 3.0.10 + async-exit-hook: 2.0.1 + builder-util: 26.15.3 + builder-util-runtime: 9.7.0 + chromium-pickle-js: 0.2.0 + ci-info: 4.3.1 + debug: 4.4.3 + dmg-builder: 26.15.7(electron-builder-squirrel-windows@26.8.1) + dotenv: 16.6.1 + dotenv-expand: 11.0.7 + ejs: 3.1.10 + electron-builder-squirrel-windows: 26.8.1(dmg-builder@26.8.1) + electron-publish: 26.15.3 + fs-extra: 10.1.0 + hosted-git-info: 4.1.0 + isbinaryfile: 5.0.7 + jiti: 2.7.0 + js-yaml: 4.1.1 + json5: 2.2.3 + lazy-val: 1.0.5 + minimatch: 10.2.5 + pkijs: 3.4.0 + plist: 3.1.0 + proper-lockfile: 4.1.2 + resedit: 1.7.2 + semver: 7.7.4 + tar: 7.5.15 + temp-file: 3.4.0 + tiny-async-pool: 1.3.0 + unzipper: 0.12.5 + which: 5.0.0 + transitivePeerDependencies: + - supports-color + app-builder-lib@26.8.1(dmg-builder@26.8.1)(electron-builder-squirrel-windows@26.8.1): dependencies: '@develar/schema-utils': 2.6.5 @@ -3791,6 +4032,12 @@ snapshots: - bufferutil - utf-8-validate + asn1js@3.0.10: + dependencies: + pvtsutils: 1.3.6 + pvutils: 1.1.5 + tslib: 2.8.1 + assert-plus@1.0.0: optional: true @@ -3805,6 +4052,8 @@ snapshots: at-least-node@1.0.0: {} + aws4@1.13.2: {} + axios@1.16.1(debug@4.4.3): dependencies: follow-redirects: 1.16.0(debug@4.4.3) @@ -3842,6 +4091,8 @@ snapshots: binary-extensions@2.3.0: {} + bluebird@3.7.2: {} + boolean@3.2.0: optional: true @@ -3885,6 +4136,32 @@ snapshots: transitivePeerDependencies: - supports-color + builder-util-runtime@9.7.0: + dependencies: + debug: 4.4.3 + sax: 1.6.0 + transitivePeerDependencies: + - supports-color + + builder-util@26.15.3: + dependencies: + '@types/debug': 4.1.13 + builder-util-runtime: 9.7.0 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.3 + fs-extra: 10.1.0 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + js-yaml: 4.1.1 + sanitize-filename: 1.6.4 + source-map-support: 0.5.21 + stat-mode: 1.0.0 + temp-file: 3.4.0 + tiny-async-pool: 1.3.0 + transitivePeerDependencies: + - supports-color + builder-util@26.8.1: dependencies: 7zip-bin: 5.2.0 @@ -3906,6 +4183,8 @@ snapshots: transitivePeerDependencies: - supports-color + bytestreamjs@2.0.1: {} + cacheable-lookup@5.0.4: {} cacheable-request@7.0.4: @@ -3982,7 +4261,7 @@ snapshots: dependencies: axios: 1.16.1(debug@4.4.3) debug: 4.4.3 - fs-extra: 11.3.5 + fs-extra: 11.3.6 memory-stream: 1.0.0 node-api-headers: 1.9.0 npmlog: 6.0.2 @@ -4027,8 +4306,7 @@ snapshots: convert-source-map@2.0.0: {} - core-util-is@1.0.2: - optional: true + core-util-is@1.0.2: {} crc@3.8.0: dependencies: @@ -4094,6 +4372,16 @@ snapshots: dependencies: path-type: 4.0.0 + dmg-builder@26.15.7(electron-builder-squirrel-windows@26.8.1): + dependencies: + app-builder-lib: 26.15.7(dmg-builder@26.15.7(electron-builder-squirrel-windows@26.8.1))(electron-builder-squirrel-windows@26.8.1) + builder-util: 26.15.3 + fs-extra: 10.1.0 + js-yaml: 4.1.1 + transitivePeerDependencies: + - electron-builder-squirrel-windows + - supports-color + dmg-builder@26.8.1(electron-builder-squirrel-windows@26.8.1): dependencies: app-builder-lib: 26.8.1(dmg-builder@26.8.1)(electron-builder-squirrel-windows@26.8.1) @@ -4131,6 +4419,10 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 + duplexer2@0.1.4: + dependencies: + readable-stream: 2.3.8 + ejs@3.1.10: dependencies: jake: 10.9.4 @@ -4144,14 +4436,14 @@ snapshots: - dmg-builder - supports-color - electron-builder@26.8.1(electron-builder-squirrel-windows@26.8.1): + electron-builder@26.15.7(electron-builder-squirrel-windows@26.8.1): dependencies: - app-builder-lib: 26.8.1(dmg-builder@26.8.1)(electron-builder-squirrel-windows@26.8.1) - builder-util: 26.8.1 - builder-util-runtime: 9.5.1 + app-builder-lib: 26.15.7(dmg-builder@26.15.7(electron-builder-squirrel-windows@26.8.1))(electron-builder-squirrel-windows@26.8.1) + builder-util: 26.15.3 + builder-util-runtime: 9.7.0 chalk: 4.1.2 ci-info: 4.4.0 - dmg-builder: 26.8.1(electron-builder-squirrel-windows@26.8.1) + dmg-builder: 26.15.7(electron-builder-squirrel-windows@26.8.1) fs-extra: 10.1.0 lazy-val: 1.0.5 simple-update-notifier: 2.0.0 @@ -4174,6 +4466,20 @@ snapshots: electron-is-dev@3.0.1: {} + electron-publish@26.15.3: + dependencies: + '@types/fs-extra': 9.0.13 + aws4: 1.13.2 + builder-util: 26.15.3 + builder-util-runtime: 9.7.0 + chalk: 4.1.2 + form-data: 4.0.5 + fs-extra: 10.1.0 + lazy-val: 1.0.5 + mime: 2.6.0 + transitivePeerDependencies: + - supports-color + electron-publish@26.8.1: dependencies: '@types/fs-extra': 9.0.13 @@ -4318,6 +4624,8 @@ snapshots: fast-json-stable-stringify@2.1.0: {} + fast-uri@3.1.4: {} + fast-xml-builder@1.3.0: dependencies: path-expression-matcher: 1.6.2 @@ -4369,7 +4677,7 @@ snapshots: jsonfile: 6.2.1 universalify: 2.0.1 - fs-extra@11.3.5: + fs-extra@11.3.1: dependencies: graceful-fs: 4.2.11 jsonfile: 6.2.1 @@ -4380,7 +4688,6 @@ snapshots: graceful-fs: 4.2.11 jsonfile: 6.2.1 universalify: 2.0.1 - optional: true fs-extra@7.0.1: dependencies: @@ -4636,6 +4943,8 @@ snapshots: is-unsafe@2.0.0: {} + isarray@1.0.0: {} + isbinaryfile@4.0.10: {} isbinaryfile@5.0.7: {} @@ -4668,6 +4977,8 @@ snapshots: json-schema-traverse@0.4.1: {} + json-schema-traverse@1.0.0: {} + json-stringify-safe@5.0.1: optional: true @@ -4890,6 +5201,8 @@ snapshots: undici: 6.26.0 which: 6.0.1 + node-int64@0.4.0: {} + node-releases@2.0.46: {} nopt@9.0.0: @@ -4964,6 +5277,15 @@ snapshots: mlly: 1.8.2 pathe: 2.0.3 + pkijs@3.4.0: + dependencies: + '@noble/hashes': 1.4.0 + asn1js: 3.0.10 + bytestreamjs: 2.0.1 + pvtsutils: 1.3.6 + pvutils: 1.1.5 + tslib: 2.8.1 + plist@3.1.0: dependencies: '@xmldom/xmldom': 0.8.13 @@ -4983,6 +5305,8 @@ snapshots: proc-log@6.1.0: {} + process-nextick-args@2.0.1: {} + progress@2.0.3: {} promise-retry@2.0.1: @@ -5010,6 +5334,12 @@ snapshots: dependencies: escape-goat: 4.0.0 + pvtsutils@1.3.6: + dependencies: + tslib: 2.8.1 + + pvutils@1.1.5: {} + queue-microtask@1.2.3: {} quick-lru@5.1.1: {} @@ -5028,6 +5358,16 @@ snapshots: transitivePeerDependencies: - supports-color + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.2 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + readable-stream@3.6.2: dependencies: inherits: 2.0.4 @@ -5043,6 +5383,8 @@ snapshots: require-directory@2.1.1: {} + require-from-string@2.0.2: {} + resedit@1.7.2: dependencies: pe-library: 0.4.1 @@ -5095,26 +5437,26 @@ snapshots: '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.1 '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.1 - rolldown@1.0.3: + rolldown@1.2.0: dependencies: - '@oxc-project/types': 0.133.0 + '@oxc-project/types': 0.140.0 '@rolldown/pluginutils': 1.0.1 optionalDependencies: - '@rolldown/binding-android-arm64': 1.0.3 - '@rolldown/binding-darwin-arm64': 1.0.3 - '@rolldown/binding-darwin-x64': 1.0.3 - '@rolldown/binding-freebsd-x64': 1.0.3 - '@rolldown/binding-linux-arm-gnueabihf': 1.0.3 - '@rolldown/binding-linux-arm64-gnu': 1.0.3 - '@rolldown/binding-linux-arm64-musl': 1.0.3 - '@rolldown/binding-linux-ppc64-gnu': 1.0.3 - '@rolldown/binding-linux-s390x-gnu': 1.0.3 - '@rolldown/binding-linux-x64-gnu': 1.0.3 - '@rolldown/binding-linux-x64-musl': 1.0.3 - '@rolldown/binding-openharmony-arm64': 1.0.3 - '@rolldown/binding-wasm32-wasi': 1.0.3 - '@rolldown/binding-win32-arm64-msvc': 1.0.3 - '@rolldown/binding-win32-x64-msvc': 1.0.3 + '@rolldown/binding-android-arm64': 1.2.0 + '@rolldown/binding-darwin-arm64': 1.2.0 + '@rolldown/binding-darwin-x64': 1.2.0 + '@rolldown/binding-freebsd-x64': 1.2.0 + '@rolldown/binding-linux-arm-gnueabihf': 1.2.0 + '@rolldown/binding-linux-arm64-gnu': 1.2.0 + '@rolldown/binding-linux-arm64-musl': 1.2.0 + '@rolldown/binding-linux-ppc64-gnu': 1.2.0 + '@rolldown/binding-linux-s390x-gnu': 1.2.0 + '@rolldown/binding-linux-x64-gnu': 1.2.0 + '@rolldown/binding-linux-x64-musl': 1.2.0 + '@rolldown/binding-openharmony-arm64': 1.2.0 + '@rolldown/binding-wasm32-wasi': 1.2.0 + '@rolldown/binding-win32-arm64-msvc': 1.2.0 + '@rolldown/binding-win32-x64-msvc': 1.2.0 rollup-plugin-copy@3.5.0: dependencies: @@ -5128,6 +5470,8 @@ snapshots: dependencies: queue-microtask: 1.2.3 + safe-buffer@5.1.2: {} + safe-buffer@5.2.1: optional: true @@ -5238,6 +5582,8 @@ snapshots: source-map@0.6.1: {} + spdx-license-list@6.11.0: {} + spitroast@2.1.4: {} spitroast@2.1.6: {} @@ -5259,6 +5605,10 @@ snapshots: get-east-asian-width: 1.6.0 strip-ansi: 7.2.0 + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1 @@ -5374,6 +5724,14 @@ snapshots: escape-string-regexp: 5.0.0 path-exists: 5.0.0 + unzipper@0.12.5: + dependencies: + bluebird: 3.7.2 + duplexer2: 0.1.4 + fs-extra: 11.3.1 + graceful-fs: 4.2.11 + node-int64: 0.4.0 + update-browserslist-db@1.2.3(browserslist@4.28.2): dependencies: browserslist: 4.28.2 @@ -5389,8 +5747,7 @@ snapshots: utf8-byte-length@1.0.5: {} - util-deprecate@1.0.2: - optional: true + util-deprecate@1.0.2: {} verror@1.10.1: dependencies: @@ -5399,6 +5756,14 @@ snapshots: extsprintf: 1.4.1 optional: true + webcrypto-core@1.9.2: + dependencies: + '@peculiar/asn1-schema': 2.8.0 + '@peculiar/json-schema': 1.1.12 + '@peculiar/utils': 2.0.3 + asn1js: 3.0.10 + tslib: 2.8.1 + which@2.0.2: dependencies: isexe: 2.0.0 diff --git a/rolldown.config.ts b/rolldown.config.ts index 72f49b2..c198230 100644 --- a/rolldown.config.ts +++ b/rolldown.config.ts @@ -31,6 +31,8 @@ export default defineConfig([ targets: [ { src: "src/**/**/*.html", dest: "ts-out/html/" }, { src: "src/**/**/*.css", dest: "ts-out/css/" }, + { src: "src/setup/setup.css", dest: "ts-out/html/" }, + { src: "node_modules/@uwu/shelter-ui/compat.css", dest: "ts-out/html/" }, { src: "src/**/**/*.js", dest: "ts-out/js/" }, { src: "package.json", dest: "ts-out/" }, { src: "assets/**/**", dest: "ts-out/assets/" }, diff --git a/scripts/spdxLicenceDebianFormat.ts b/scripts/spdxLicenceDebianFormat.ts new file mode 100644 index 0000000..d78e89d --- /dev/null +++ b/scripts/spdxLicenceDebianFormat.ts @@ -0,0 +1,66 @@ +// https://www.debian.org/doc/debian-policy/ch-docs.html#copyright-information +// https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ + +import { readFileSync, writeFileSync } from "node:fs"; +import path from "node:path"; +import spdxLicenseList from "spdx-license-list"; + +interface CopyrightConfig { + upstreamName: string; + source: string; + copyrightHolder: string; + licenseId: string; + comment: string; // optional but nice to have +} + +function indentText(text: string): string { + // formatted text fields follow the same rules as Debian control file + // long descriptions: each line indented with a single space, blank + // lines represented as " ." + return text + .split("\n") + .map((line) => (line.trim() === "" ? " ." : ` ${line}`)) + .join("\n"); +} + +function generateCopyrightFile(config: CopyrightConfig): string { + const license = spdxLicenseList[config.licenseId]; + if (!license) { + throw new Error(`Unknown SPDX license id: ${config.licenseId}`); + } + + const header = [ + "Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/", + `Upstream-Name: ${config.upstreamName}`, + `Source: ${config.source}`, + `Comment: ${indentText(config.comment)}`, // optional field + ].join("\n"); + + const licenseText = readFileSync("license.txt").toString(); + + const licenseStanza = [`License: ${config.licenseId}`, indentText(licenseText)].join("\n"); + + const filesStanza = ["Files: *", `Copyright: ${config.copyrightHolder}`, `License: ${config.licenseId}`].join("\n"); + + return `${[header, filesStanza, licenseStanza].join("\n\n")}\n`; +} + +/** + * Returns the Debian SPDX-formatted license for given license ID + * + * @export + * @return {*} {string} + */ +export default function (): string { + const copyrightContent: string = generateCopyrightFile({ + upstreamName: "Legcord", + source: "https://github.com/Legcord/Legcord", + copyrightHolder: `2020 - ${new Date().getFullYear()} Legcord Contributors`, // git log --reverse + licenseId: "OSL-3.0", + comment: "Open-Source Discord client alternative.", + }); + + const licensePath = path.join(__dirname, "spdx-license.txt"); + writeFileSync(licensePath, copyrightContent); + return licensePath; +} diff --git a/src/@types/settings.d.ts b/src/@types/settings.d.ts index 762da56..8b4f218 100644 --- a/src/@types/settings.d.ts +++ b/src/@types/settings.d.ts @@ -61,6 +61,8 @@ export interface Settings { startMinimized: boolean; keybinds: Keybind[]; hardwareAcceleration: boolean; + /** Rewrite H.264 Constrained Baseline (42e0) → Baseline (4200) in WebRTC SDP for HW encode. */ + sdpH264BaselineRewrite: boolean; useMacSystemPicker: boolean; inviteWebsocket: boolean; disableAutogain: boolean; diff --git a/src/common/config.ts b/src/common/config.ts index 921cfb2..955330a 100644 --- a/src/common/config.ts +++ b/src/common/config.ts @@ -12,7 +12,7 @@ let configCache: Settings | null = null; let configCacheTime = 0; const CONFIG_CACHE_TTL = 5000; // Cache for 5 seconds const defaults: Settings = { - windowStyle: "default", + windowStyle: "overlay", channel: "stable", bounceOnPing: false, csp: "none", @@ -34,11 +34,12 @@ const defaults: Settings = { loopbackType: "loopback", }, multiInstance: false, - mods: ["vencord"], + mods: [], transparency: "none", windowMaterial: "mica", spellcheck: true, hardwareAcceleration: true, + sdpH264BaselineRewrite: true, performanceMode: "none", skipSplash: false, inviteWebsocket: true, @@ -81,6 +82,7 @@ const safeMode: Settings = { windowStyle: "native", csp: "vanilla", hardwareAcceleration: false, + sdpH264BaselineRewrite: false, disableHttpCache: true, vaapi: false, additionalArguments: "", @@ -120,6 +122,11 @@ export function getConfig(object: K): Settings[K] { configCacheTime = now; return returnData[object]; } + +/** True when the settings toggle is on or `--start-minimized` was passed for this session. */ +export function shouldStartMinimized(): boolean { + return process.argv.includes("--start-minimized") || getConfig("startMinimized") === true; +} export function setConfig(object: K, toSet: Settings[K]): void { const rawData = readFileSync(getConfigLocation(), "utf-8"); const parsed = JSON.parse(rawData) as Settings; diff --git a/src/dbus.ts b/src/dbus.ts index 9446f5a..ea25a0e 100644 --- a/src/dbus.ts +++ b/src/dbus.ts @@ -1,7 +1,13 @@ import { existsSync, mkdirSync, writeFileSync } from "node:fs"; import { homedir } from "node:os"; import { join } from "node:path"; -import { interface as dbusInterface, type ProxyInterface, sessionBus, Variant } from "@jellybrick/dbus-next"; +import { + interface as dbusInterface, + type MessageBus, + type ProxyInterface, + sessionBus, + Variant, +} from "@jellybrick/dbus-next"; import { ACTION_FRIENDLY_NAMES, EXCLUDED_FROM_SHORTCUTS, ValidActions } from "./common/commandDefinitions"; import { handleAction, isValidAction } from "./common/handleCommands"; @@ -13,6 +19,8 @@ export const DBUS_ADDRESS = "/app/legcord/Legcord"; const FREEDESKTOP_PORTAL_NAME = "org.freedesktop.portal.Desktop"; const FREEDESKTOP_PORTAL_ADDRESS = "/org/freedesktop/portal/desktop"; +const isLinux = process.platform === "linux"; + // https://flatpak.github.io/xdg-desktop-portal/docs/doc-org.freedesktop.portal.GlobalShortcuts.html type Shortcuts = [string, { description: Variant }]; interface GlobalShortcuts extends ProxyInterface { @@ -74,8 +82,16 @@ class LegcordInterface extends Interface { } } -const bus = sessionBus(); -var legcordInterface = new LegcordInterface(); +let bus: MessageBus | undefined; +let legcordInterface: LegcordInterface | undefined; + +function getBus(): MessageBus { + if (!bus) { + bus = sessionBus(); + legcordInterface = new LegcordInterface(); + } + return bus; +} function ensureDesktopFile(): void { const dir = join(homedir(), ".local/share/applications"); @@ -88,14 +104,18 @@ function ensureDesktopFile(): void { function registerAppId(): Promise { ensureDesktopFile(); // we need a desktop file at XDG_PATH so we can associate with legcord's app_id - return bus.getProxyObject("org.freedesktop.portal.Desktop", "/org/freedesktop/portal/desktop").then((portalObj) => { - const registry: RegistryInterface = portalObj.getInterface("org.freedesktop.host.portal.Registry"); - return registry.Register(DBUS_INTERFACE_NAME, {}); - }); + return getBus() + .getProxyObject("org.freedesktop.portal.Desktop", "/org/freedesktop/portal/desktop") + .then((portalObj) => { + const registry: RegistryInterface = portalObj.getInterface("org.freedesktop.host.portal.Registry"); + return registry.Register(DBUS_INTERFACE_NAME, {}); + }); } export async function setupGlobalShortcuts() { - const portalObj = await bus.getProxyObject(FREEDESKTOP_PORTAL_NAME, FREEDESKTOP_PORTAL_ADDRESS); + if (!isLinux) return; + + const portalObj = await getBus().getProxyObject(FREEDESKTOP_PORTAL_NAME, FREEDESKTOP_PORTAL_ADDRESS); const properties: PropertiesInterface = portalObj.getInterface("org.freedesktop.DBus.Properties"); const globalShortcuts: GlobalShortcuts = portalObj.getInterface("org.freedesktop.portal.GlobalShortcuts"); @@ -108,17 +128,19 @@ export async function setupGlobalShortcuts() { console.debug(`Registered ${DBUS_INTERFACE_NAME} in freedesktop Registry.`); function awaitResponse(requestPath: string): Promise> { - return bus.getProxyObject(FREEDESKTOP_PORTAL_NAME, requestPath).then( - (requestObj) => - new Promise>((resolve, reject) => { - const requestIface = requestObj.getInterface("org.freedesktop.portal.Request"); + return getBus() + .getProxyObject(FREEDESKTOP_PORTAL_NAME, requestPath) + .then( + (requestObj) => + new Promise>((resolve, reject) => { + const requestIface = requestObj.getInterface("org.freedesktop.portal.Request"); - requestIface.once("Response", (responseCode: number, results: Record) => { - if (responseCode === 0) resolve(results); - else reject(new Error(`Request failed with code ${responseCode}`)); - }); - }), - ); + requestIface.once("Response", (responseCode: number, results: Record) => { + if (responseCode === 0) resolve(results); + else reject(new Error(`Request failed with code ${responseCode}`)); + }); + }), + ); } const sessionRequestPath = await globalShortcuts.CreateSession({ @@ -146,13 +168,19 @@ export async function setupGlobalShortcuts() { } export async function startDbusService(): Promise { - await bus.requestName(DBUS_INTERFACE_NAME); - bus.export(DBUS_ADDRESS, legcordInterface); + if (!isLinux) return; + + const dbus = getBus(); + await dbus.requestName(DBUS_INTERFACE_NAME); + dbus.export(DBUS_ADDRESS, legcordInterface!); console.info(`Registered DBus service at ${DBUS_INTERFACE_NAME} ${DBUS_ADDRESS}`); // console.debug(legcordInterface) } export function disconnectDbusService(): void { + if (!bus) return; bus.disconnect(); + bus = undefined; + legcordInterface = undefined; } diff --git a/src/discord/ipc.ts b/src/discord/ipc.ts index 04e3419..cbd4a75 100644 --- a/src/discord/ipc.ts +++ b/src/discord/ipc.ts @@ -18,7 +18,7 @@ import { unblacklistGame as blacklistGameRemove, getBlacklist, } from "../common/blacklistGame.js"; -import { getConfig, getConfigLocation, setConfig, setConfigBulk } from "../common/config.js"; +import { getConfig, getConfigLocation, setConfig, setConfigBulk, shouldStartMinimized } from "../common/config.js"; import { addDetectable, getDetectables, removeDetectable } from "../common/detectables.js"; import { getLang, getLangName, getRawLang, setLang } from "../common/lang.js"; import { @@ -217,8 +217,8 @@ export function registerIpc(passedWindow: BrowserWindow): void { }); ipcMain.on("splashEnd", () => { - splashWindow.close(); - if (getConfig("startMinimized")) { + splashWindow?.close(); + if (shouldStartMinimized()) { passedWindow.hide(); } else { passedWindow.show(); diff --git a/src/discord/preload/patches.mts b/src/discord/preload/patches.mts index 6e37695..c984a68 100644 --- a/src/discord/preload/patches.mts +++ b/src/discord/preload/patches.mts @@ -36,7 +36,11 @@ const version = ipcRenderer.sendSync("displayVersion") as string; // Discord's Go Live answer forces profile-level-id=42e01f (OpenH264); local-only munging // is overwritten by setRemoteDescription, so the answer must be rewritten too. // Without this, Windows burns CPU on OpenH264 even when Media Foundation HW encode is available. +// Gated by settings.sdpH264BaselineRewrite (default on) so users can disable if negotiation breaks. { + const rewriteBaselineSetting = ipcRenderer.sendSync("getConfig", "sdpH264BaselineRewrite") as boolean | undefined; + const preferHwH264 = + (process.platform === "darwin" || process.platform === "win32") && (rewriteBaselineSetting ?? true); const bitrateScript = document.createElement("script"); bitrateScript.textContent = `(function () { var CAP = "80000"; @@ -45,7 +49,7 @@ const version = ipcRenderer.sendSync("displayVersion") as string; var MIN_BR = "3000"; var START_BR = "3000"; // VideoToolbox (macOS) and Media Foundation (Windows) HW encode avoid OpenH264 CBP. - var preferHwH264 = ${process.platform === "darwin" || process.platform === "win32" ? "true" : "false"}; + var preferHwH264 = ${preferHwH264 ? "true" : "false"}; function setOrAppendFmtpParam(sdp, key, value) { var re = new RegExp(key + "=\\\\d+", "g"); if (sdp.indexOf(key + "=") !== -1) { diff --git a/src/discord/window.ts b/src/discord/window.ts index 7cb529d..3fb7724 100644 --- a/src/discord/window.ts +++ b/src/discord/window.ts @@ -14,7 +14,7 @@ import { shell, } from "electron"; import contextMenu from "electron-context-menu"; -import { firstRun, getConfig, setConfig } from "../common/config.js"; +import { firstRun, getConfig, setConfig, shouldStartMinimized } from "../common/config.js"; import { navigateTo } from "../common/dom.js"; import { forceQuit, setForceQuit } from "../common/forceQuit.js"; import { handleCommands, passedValidArgument } from "../common/handleCommands.js"; @@ -474,8 +474,13 @@ function doAfterDefiningTheWindow(passedWindow: BrowserWindow): void { break; } - if (getConfig("skipSplash")) { - passedWindow.show(); + // When splash won't run, finalize visibility here (splashEnd never fires). + if (getConfig("skipSplash") || shouldStartMinimized()) { + if (shouldStartMinimized()) { + passedWindow.hide(); + } else { + passedWindow.show(); + } } } diff --git a/src/main.ts b/src/main.ts index fb35c9e..ba1b0cd 100644 --- a/src/main.ts +++ b/src/main.ts @@ -15,6 +15,7 @@ import { setConfig, setFirstRun, setup, + shouldStartMinimized, } from "./common/config.js"; import { getPreset } from "./common/flags.js"; import { setLang } from "./common/lang.js"; @@ -108,7 +109,9 @@ function args(): void { export async function init(): Promise { // Skip setup if bypass flag was used if (bypassSetup || !(firstRun === true || undefined)) { - if (getConfig("skipSplash") === false) { + // Splash owns the final show/hide via splashEnd; skip it when splash is disabled + // or when we intentionally start in the background. + if (getConfig("skipSplash") === false && !shouldStartMinimized()) { void createSplashWindow(); // NOTE - Awaiting will hang at start } createWindow(); diff --git a/src/setup/main.ts b/src/setup/main.ts index 697c8c1..948dc6c 100644 --- a/src/setup/main.ts +++ b/src/setup/main.ts @@ -12,8 +12,8 @@ export async function createSetupWindow(): Promise { if (platform() !== "darwin") import("./tray.js"); return new Promise(() => { const windowOptions: BrowserWindowConstructorOptions = { - width: 800, - height: 600, + width: 840, + height: 720, title: getLang("setup-windowTitle"), darkTheme: true, icon: getConfig("customIcon") ?? path.join(import.meta.dirname, "../", "/assets/desktop.png"), diff --git a/src/setup/preload.mts b/src/setup/preload.mts index b4d89d4..b734e48 100644 --- a/src/setup/preload.mts +++ b/src/setup/preload.mts @@ -15,17 +15,7 @@ contextBridge.exposeInMainWorld("setup", { if (ipcRenderer.sendSync("setup-getOS") !== "darwin") { document.addEventListener("DOMContentLoaded", () => { - const css = document.createElement("style"); - css.innerHTML = `.bg { - background-image: url("legcord://assets/mockup.jpg"); - background-repeat: round; - height: 100%; - width: 100%; - position: absolute; - outline: 80px solid black; - -webkit-filter: blur(10px); - }`; - document.head.appendChild(css); + document.body.classList.add("has-setup-bg"); }); } diff --git a/src/setup/setup.css b/src/setup/setup.css new file mode 100644 index 0000000..4231b3a --- /dev/null +++ b/src/setup/setup.css @@ -0,0 +1,488 @@ +:root { + --font-primary: "gg sans", "Noto Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; + --font-display: "gg sans", "Noto Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; + --font-headline: "ABC Ginto Nord", "Noto Sans", "Helvetica Neue", Helvetica, Arial, sans-serif; + --font-weight-normal: 400; + --font-weight-medium: 500; + --font-weight-semibold: 600; + --font-weight-bold: 700; + --font-weight-extrabold: 800; + --saturation-factor: 1; + + /* Soft Legcord purple accents (kept quiet) */ + --setup-purple: var(--blurple-50); + --setup-purple-soft: rgba(88, 101, 242, 0.14); + --setup-purple-glow: rgba(114, 137, 218, 0.18); + + /* Discord Mana tokens (from stable web stylesheets / theme-dark) */ + --blurple-50-hsl: 234.935 calc(var(--saturation-factor, 1) * 85.556%) 64.706%; + --blurple-60-hsl: 232.941 calc(var(--saturation-factor, 1) * 46.667%) 50%; + --blurple-65-hsl: 232 calc(var(--saturation-factor, 1) * 47.511%) 43.333%; + --blurple-50: hsl(var(--blurple-50-hsl) / 1); + --blurple-60: hsl(var(--blurple-60-hsl) / 1); + --blurple-65: hsl(var(--blurple-65-hsl) / 1); + --neutral-1: #fff; + --opacity-white-8: hsl(0 0% 100% / 0.0784313725490196); + --opacity-4: hsl(0 0% 100% / 0.0392156862745098); + --opacity-12: hsl(0 0% 100% / 0.12156862745098039); + --opacity-16: hsl(0 0% 100% / 0.1607843137254902); + --opacity-20: hsl(0 0% 100% / 0.2); + + /* shelter-ui → Discord Mana control colors */ + --control-primary-background-default: var(--blurple-50); + --control-primary-background-hover: var(--blurple-60); + --control-primary-background-active: var(--blurple-65); + --control-primary-text-default: var(--neutral-1); + --control-primary-text-hover: var(--neutral-1); + --control-primary-text-active: var(--neutral-1); + --control-primary-border-default: var(--opacity-white-8); + --control-primary-border-hover: var(--opacity-white-8); + --control-primary-border-active: var(--opacity-white-8); + + --control-secondary-background-default: var(--opacity-12); + --control-secondary-background-hover: var(--opacity-16); + --control-secondary-background-active: var(--opacity-20); + --control-secondary-text-default: var(--neutral-1); + --control-secondary-text-hover: var(--neutral-1); + --control-secondary-text-active: var(--neutral-1); + --control-secondary-border-default: var(--opacity-4); + --control-secondary-border-hover: var(--opacity-4); + --control-secondary-border-active: var(--opacity-4); + + --custom-button-transition-duration: 170ms; +} + +*, +*::before, +*::after { + box-sizing: border-box; +} + +html, +body { + margin: 0; + height: 100%; + overflow: hidden; + font-family: var(--font-primary); + background: #1e1f22; + color: var(--text-default); + -webkit-font-smoothing: antialiased; + text-rendering: optimizeLegibility; +} + +.draggable { + position: absolute; + top: 0; + width: 100%; + height: 40px; + -webkit-user-select: none; + user-select: none; + -webkit-app-region: drag; + z-index: 10; +} + +.bg { + position: absolute; + inset: 0; + background: + radial-gradient(ellipse 70% 50% at 50% -8%, var(--setup-purple-glow), transparent 58%), + radial-gradient(ellipse 40% 35% at 0% 100%, rgba(88, 101, 242, 0.08), transparent 55%), #1e1f22; +} + +body.has-setup-bg .bg { + background-image: + linear-gradient(180deg, rgba(30, 31, 34, 0.75), rgba(30, 31, 34, 0.9)), + radial-gradient(ellipse 60% 40% at 50% 0%, var(--setup-purple-glow), transparent 60%), + url("legcord://assets/mockup.jpg"); + background-size: cover; + background-position: center; + filter: none; +} + +body.has-setup-bg .bg::after { + content: ""; + position: absolute; + inset: 0; + backdrop-filter: blur(18px); + background: rgba(30, 31, 34, 0.32); +} + +#root { + position: relative; + z-index: 1; + height: 100%; + display: flex; + align-items: center; + justify-content: center; + padding: 28px; +} + +.setup-shell { + position: relative; + width: 100%; + max-width: 560px; + max-height: calc(100vh - 56px); + display: flex; + flex-direction: column; + background: var(--modal-background, #313338); + border-radius: 12px; + box-shadow: + 0 0 0 1px rgba(0, 0, 0, 0.3), + 0 0 0 1px var(--setup-purple-soft), + 0 12px 28px rgba(0, 0, 0, 0.4); + overflow: hidden; +} + +.setup-shell::before { + content: ""; + position: absolute; + top: 0; + left: 0; + right: 0; + height: 2px; + background: linear-gradient(90deg, transparent, var(--setup-purple) 35%, var(--setup-purple) 65%, transparent); + opacity: 0.55; + pointer-events: none; + z-index: 2; +} + +.setup-progress { + display: flex; + gap: 4px; + padding: 16px 20px 0; +} + +.setup-progress-segment { + flex: 1; + height: 4px; + border-radius: 2px; + background: rgba(88, 101, 242, 0.16); + transition: background 0.15s ease; +} + +.setup-progress-segment--done, +.setup-progress-segment--active { + background: var(--setup-purple); +} + +.setup-body { + padding: 22px 24px 14px; + overflow-y: auto; + flex: 1; + min-height: 0; +} + +.setup-footer { + display: flex; + align-items: center; + justify-content: space-between; + gap: 12px; + padding: 16px 24px; + background: var(--modal-footer-background, #2b2d31); + border-top: 1px solid rgba(0, 0, 0, 0.25); +} + +.setup-step-indicator { + color: var(--header-secondary); + font-family: var(--font-primary); + font-size: 12px; + font-weight: var(--font-weight-medium); + letter-spacing: 0.02em; + line-height: 16px; + white-space: nowrap; +} + +.setup-header { + margin-bottom: 20px; +} + +.setup-title { + margin: 0; + color: var(--header-primary, #f2f3f5); + font-family: var(--font-display); + font-size: 20px; + font-weight: var(--font-weight-semibold); + letter-spacing: 0.01em; + line-height: 1.2; +} + +.setup-title--hero { + font-size: 32px; + font-weight: var(--font-weight-bold); + line-height: 1.15; +} + +.setup-subtitle { + display: block; + margin: 8px 0 0; + color: var(--header-secondary, #b5bac1); + font-family: var(--font-primary); + font-size: 14px; + font-weight: var(--font-weight-normal); + line-height: 20px; + letter-spacing: 0; +} + +.setup-subtitle--hero { + margin-top: 10px; + margin-bottom: 24px; + max-width: 360px; + font-size: 16px; + line-height: 22px; +} + +.setup-welcome, +.setup-finish { + display: flex; + flex-direction: column; + align-items: center; + text-align: center; + padding: 24px 8px 28px; +} + +.setup-logo { + width: 88px; + height: 88px; + margin-bottom: 20px; + border-radius: 22px; + object-fit: cover; + box-shadow: + 0 0 0 1px rgba(88, 101, 242, 0.22), + 0 10px 28px rgba(0, 0, 0, 0.4), + 0 0 32px rgba(88, 101, 242, 0.18); +} + +.setup-finish-icon { + width: 64px; + height: 64px; + margin-bottom: 18px; +} + +.setup-finish-icon svg { + width: 100%; + height: 100%; + display: block; + filter: drop-shadow(0 6px 16px rgba(88, 101, 242, 0.35)); +} + +.setup-cta { + margin-top: 4px; + max-width: 100%; + font-family: var(--font-primary); + font-weight: var(--font-weight-medium); + letter-spacing: 0; + transition: + background-color var(--custom-button-transition-duration) ease, + color var(--custom-button-transition-duration) ease, + border-color var(--custom-button-transition-duration) ease; +} + +.setup-footer-btn { + font-family: var(--font-primary); + font-weight: var(--font-weight-medium); + transition: + background-color var(--custom-button-transition-duration) ease, + color var(--custom-button-transition-duration) ease, + border-color var(--custom-button-transition-duration) ease; +} + +.setup-note { + width: 100%; + margin: 0 0 22px; + padding: 12px 14px; + border-radius: 8px; + background: color-mix(in srgb, var(--setup-purple) 6%, var(--background-secondary, #2b2d31)); + border: 1px solid rgba(88, 101, 242, 0.12); + color: var(--header-secondary); + text-align: left; +} + +.setup-note p { + margin: 0; + font-family: var(--font-primary); + font-size: 14px; + line-height: 20px; + color: var(--header-secondary); +} + +.setup-options { + display: flex; + flex-direction: column; + gap: 8px; + padding-bottom: 8px; +} + +.setup-option { + display: flex; + align-items: center; + gap: 14px; + width: 100%; + padding: 12px; + border-radius: 8px; + border: 1px solid transparent; + background: var(--background-secondary, #2b2d31); + color: inherit; + text-align: left; + cursor: pointer; + font-family: var(--font-primary); + outline: none; + transition: + background 0.1s ease-out, + border-color 0.1s ease-out, + box-shadow 0.1s ease-out; + -webkit-app-region: no-drag; +} + +.setup-option:hover { + background: var(--background-surface-high, #393a41); +} + +.setup-option:focus-visible { + box-shadow: 0 0 0 2px var(--setup-purple); +} + +.setup-option--selected { + background: color-mix(in srgb, var(--setup-purple) 14%, var(--background-secondary, #2b2d31)); + border-color: color-mix(in srgb, var(--setup-purple) 55%, transparent); + box-shadow: inset 0 0 0 1px rgba(88, 101, 242, 0.2); +} + +.setup-option--selected:hover { + background: color-mix(in srgb, var(--setup-purple) 20%, var(--background-secondary, #2b2d31)); +} + +.setup-option-preview { + width: 128px; + height: 80px; + border-radius: 6px; + overflow: hidden; + flex-shrink: 0; + background: var(--input-background, #1e1f22); + box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.3); +} + +.setup-option-preview img { + width: 100%; + height: 100%; + object-fit: cover; + display: block; +} + +.setup-option-icon { + width: 44px; + height: 44px; + border-radius: 10px; + overflow: hidden; + flex-shrink: 0; + background: var(--input-background, #1e1f22); + display: flex; + align-items: center; + justify-content: center; + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.04); +} + +.setup-option-icon--selected { + background: color-mix(in srgb, var(--setup-purple) 18%, var(--input-background, #1e1f22)); +} + +.setup-option-icon img { + width: 100%; + height: 100%; + object-fit: contain; + display: block; +} + +.setup-option-content { + flex: 1; + min-width: 0; + display: flex; + flex-direction: column; + gap: 2px; +} + +.setup-option-title-row { + display: flex; + align-items: center; + gap: 8px; + flex-wrap: wrap; +} + +.setup-option-title { + color: var(--header-primary, #f2f3f5); + font-family: var(--font-primary); + font-size: 16px; + font-weight: var(--font-weight-semibold); + line-height: 20px; + letter-spacing: 0.01em; +} + +.setup-option-desc { + color: var(--header-secondary, #b5bac1); + font-family: var(--font-primary); + font-size: 14px; + font-weight: var(--font-weight-normal); + line-height: 18px; +} + +.setup-badge { + display: inline-flex; + align-items: center; + padding: 2px 6px; + border-radius: 3px; + background: var(--setup-purple); + color: #fff; + font-family: var(--font-primary); + font-size: 10px; + font-weight: var(--font-weight-bold); + letter-spacing: 0.04em; + text-transform: uppercase; + line-height: 14px; +} + +.setup-radio { + width: 20px; + height: 20px; + border-radius: 50%; + border: 2px solid var(--interactive-normal); + flex-shrink: 0; + display: flex; + align-items: center; + justify-content: center; + transition: + border-color 0.1s ease-out, + background 0.1s ease-out; +} + +.setup-radio--selected { + border-color: var(--setup-purple); + background: var(--setup-purple); +} + +.setup-radio-dot { + width: 8px; + height: 8px; + border-radius: 50%; + background: #fff; +} + +.setup-warning { + display: flex; + align-items: flex-start; + gap: 10px; + margin-bottom: 12px; + padding: 12px 14px; + border-radius: 8px; + background: rgba(240, 178, 50, 0.1); + border: 1px solid rgba(240, 178, 50, 0.28); + color: #f0b232; + font-family: var(--font-primary); + font-size: 14px; + line-height: 18px; +} + +.setup-warning-icon { + flex-shrink: 0; + width: 18px; + height: 18px; + margin-top: 1px; +} diff --git a/src/setup/setup.html b/src/setup/setup.html index 5347bc2..166abff 100644 --- a/src/setup/setup.html +++ b/src/setup/setup.html @@ -4,18 +4,8 @@ Legcord Setup - - + +
@@ -23,4 +13,4 @@
- \ No newline at end of file + diff --git a/src/setup/setup.tsx b/src/setup/setup.tsx index 29c8d14..d1fb686 100644 --- a/src/setup/setup.tsx +++ b/src/setup/setup.tsx @@ -1,122 +1,167 @@ -import { - Box, - ChevronLeft, - ChevronRight, - CircleAlert, - LaptopMinimal, - LaptopMinimalCheck, - MinimizeIcon, - Monitor, - PuzzleIcon, - Settings, - Sparkles, -} from "lucide-solid"; -import { createResource, createSignal, For, Show } from "solid-js"; +import { Button, ButtonColors, ButtonSizes, injectInternalStyles, niceScrollbarsClass } from "@uwu/shelter-ui"; +import { type Accessor, createMemo, createResource, createSignal, For, onMount, Show } from "solid-js"; import { render } from "solid-js/web"; import { Motion } from "solid-motionone"; -const Welcome = ({ onNext, t }: { onNext: () => void; t: () => Record | undefined }) => ( - - -

- {t()?.["setup-welcomeTitle"] ?? "Welcome to Legcord"} -

-

+injectInternalStyles(); + +type Lang = Record | undefined; + +const ctaStyle = { + "--shltr-btn-w": "280px", + "--shltr-btn-h": "44px", + "font-size": "16px", + "line-height": "20px", + padding: "2px 24px", +} as const; + +const footerBtnStyle = { + "--shltr-btn-w": "96px", + "--shltr-btn-h": "38px", +} as const; + +const WarningIcon = () => ( + +); + +const OptionCard = (props: { + selected: boolean; + onSelect: () => void; + title: string; + description: string; + badge?: string; + preview?: string; + icon?: string; +}) => ( + +); + +const Progress = (props: { current: number; total: number }) => ( +