diff --git a/.github/workflows/electron-build.yaml b/.github/workflows/electron-build.yaml index eb34ccc..d0b0af4 100644 --- a/.github/workflows/electron-build.yaml +++ b/.github/workflows/electron-build.yaml @@ -43,15 +43,15 @@ jobs: with: draft: true files: | - dist/*.exe - dist/*.zip - dist/*.dmg - dist/*.AppImage - dist/*.snap - dist/*.deb - dist/*.rpm - dist/*.tar.gz - dist/*.yml - dist/*.blockmap + desktop/*.exe + desktop/*.zip + desktop/*.dmg + desktop/*.AppImage + desktop/*.snap + desktop/*.deb + desktop/*.rpm + desktop/*.tar.gz + desktop/*.yml + desktop/*.blockmap env: GITHUB_TOKEN: ${{ secrets.RELEASE_NOTE_WRITE }} diff --git a/.github/workflows/release-tag.yaml b/.github/workflows/release-tag.yaml index 82a36d9..488a99f 100644 --- a/.github/workflows/release-tag.yaml +++ b/.github/workflows/release-tag.yaml @@ -13,9 +13,7 @@ jobs: steps: - name: Checkout code uses: actions/checkout@v4 - - name: Generate Release Notes - id: notes - uses: RedCrafter07/release-notes-action@v1 - with: - tag-name: ${{ github.event.inputs.tags }} - token: ${{ secrets.GITHUB_TOKEN }} + - name: Create Release for Tag + run: echo "TODO: we have to create a Release notes genetor CI" + env: + RELEASE_NOTE_WRITE: ${{ secrets.RELEASE_NOTE_WRITE }} diff --git a/changelog.md b/changelog.md index 92fff8c..1c4d466 100644 --- a/changelog.md +++ b/changelog.md @@ -31,3 +31,8 @@ - [chore] Created executeme platform logo for free - [feat] Created a release notes ci/cd pipeline to automate our release version - [feat] Create electron builder CI for build various platform applicaiton +- [feat] ShadcnUI added to our desktop application +- [feat] Monaco editor setup with electron js +- [feat] Code highlight & inte. is supported +- [fix] electron main process api calling issues +- [feat] api calling bridge for secure our application diff --git a/desktop/.env.example b/desktop/.env.example new file mode 100644 index 0000000..c6e1cad --- /dev/null +++ b/desktop/.env.example @@ -0,0 +1,2 @@ +RENDERER_VITE_SERVER_BASE_URL="" +RENDERER_VITE_SERVER_BASE_URL_LOCAL="http://localhost:9091" \ No newline at end of file diff --git a/desktop/.prettierrc.yaml b/desktop/.prettierrc.yaml index 35893b3..772c51a 100644 --- a/desktop/.prettierrc.yaml +++ b/desktop/.prettierrc.yaml @@ -1,4 +1,4 @@ -singleQuote: true -semi: false +singleQuote: false +semi: true printWidth: 100 trailingComma: none diff --git a/desktop/components.json b/desktop/components.json new file mode 100644 index 0000000..1eaced4 --- /dev/null +++ b/desktop/components.json @@ -0,0 +1,21 @@ +{ + "$schema": "https://ui.shadcn.com/schema.json", + "style": "new-york", + "rsc": false, + "tsx": true, + "tailwind": { + "config": "", + "css": "src/renderer/src/assets/main.css", + "baseColor": "neutral", + "cssVariables": true, + "prefix": "" + }, + "aliases": { + "components": "src/renderer/src/components", + "utils": "src/renderer/src/lib/utils", + "ui": "src/renderer/src/components/ui", + "lib": "src/renderer/src/lib", + "hooks": "src/renderer/src/hooks" + }, + "iconLibrary": "lucide" +} diff --git a/desktop/electron.vite.config.ts b/desktop/electron.vite.config.ts index 5b54e20..1544b2d 100644 --- a/desktop/electron.vite.config.ts +++ b/desktop/electron.vite.config.ts @@ -1,10 +1,18 @@ -import { resolve } from 'path' -import { defineConfig, externalizeDepsPlugin } from 'electron-vite' -import react from '@vitejs/plugin-react' +import { resolve } from "path"; +import { defineConfig, externalizeDepsPlugin } from "electron-vite"; +import react from "@vitejs/plugin-react"; +// @ts-ignore +import tailwindcss from "@tailwindcss/vite"; export default defineConfig({ main: { - plugins: [externalizeDepsPlugin()] + plugins: [externalizeDepsPlugin()], + resolve: { + alias: { + "@/lib": resolve("src/main/lib"), + "@shared": resolve("src/shared") + } + } }, preload: { plugins: [externalizeDepsPlugin()] @@ -12,9 +20,17 @@ export default defineConfig({ renderer: { resolve: { alias: { - '@renderer': resolve('src/renderer/src') + "@renderer": resolve("src/renderer/src"), + "@shared": resolve("src/shared"), + "@/hooks": resolve("src/renderer/src/hooks"), + "@/assets": resolve("src/renderer/src/assets"), + "@/store": resolve("src/renderer/src/store"), + "@/components": resolve("src/renderer/src/components"), + "@/mocks": resolve("src/renderer/src/mocks"), + "@/lib": resolve("src/renderer/src/lib"), + "@/types": resolve("src/renderer/src/@types") } }, - plugins: [react()] + plugins: [react(), tailwindcss()] } -}) +}); diff --git a/desktop/package.json b/desktop/package.json index 7fb6cd9..e8dd930 100644 --- a/desktop/package.json +++ b/desktop/package.json @@ -28,12 +28,28 @@ "dependencies": { "@electron-toolkit/preload": "^3.0.1", "@electron-toolkit/utils": "^4.0.0", - "electron-updater": "^6.3.9" + "@monaco-editor/react": "^4.7.0", + "@radix-ui/react-select": "^2.2.5", + "@radix-ui/react-slot": "^1.2.3", + "axios": "^1.10.0", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "dotenv": "^17.0.1", + "electron-updater": "^6.3.9", + "lucide-react": "^0.525.0", + "monaco-editor": "^0.52.2", + "next-themes": "^0.4.6", + "perf_hooks": "^0.0.1", + "socket.io-client": "^4.8.1", + "sonner": "^2.0.6", + "tailwind-merge": "^3.3.1", + "tw-animate-css": "^1.3.5" }, "devDependencies": { "@electron-toolkit/eslint-config-prettier": "^3.0.0", "@electron-toolkit/eslint-config-ts": "^3.0.0", "@electron-toolkit/tsconfig": "^1.0.1", + "@tailwindcss/vite": "^4.1.11", "@types/node": "^22.14.1", "@types/react": "^19.1.1", "@types/react-dom": "^19.1.2", @@ -48,6 +64,7 @@ "prettier": "^3.5.3", "react": "^19.1.0", "react-dom": "^19.1.0", + "tailwindcss": "^4.1.11", "typescript": "^5.8.3", "vite": "^6.2.6" }, diff --git a/desktop/pnpm-lock.yaml b/desktop/pnpm-lock.yaml index 477e110..cae3476 100644 --- a/desktop/pnpm-lock.yaml +++ b/desktop/pnpm-lock.yaml @@ -14,19 +14,67 @@ importers: '@electron-toolkit/utils': specifier: ^4.0.0 version: 4.0.0(electron@35.7.0) + '@monaco-editor/react': + specifier: ^4.7.0 + version: 4.7.0(monaco-editor@0.52.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-select': + specifier: ^2.2.5 + version: 2.2.5(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-slot': + specifier: ^1.2.3 + version: 1.2.3(@types/react@19.1.8)(react@19.1.0) + axios: + specifier: ^1.10.0 + version: 1.10.0 + class-variance-authority: + specifier: ^0.7.1 + version: 0.7.1 + clsx: + specifier: ^2.1.1 + version: 2.1.1 + dotenv: + specifier: ^17.0.1 + version: 17.0.1 electron-updater: specifier: ^6.3.9 version: 6.6.2 + lucide-react: + specifier: ^0.525.0 + version: 0.525.0(react@19.1.0) + monaco-editor: + specifier: ^0.52.2 + version: 0.52.2 + next-themes: + specifier: ^0.4.6 + version: 0.4.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + perf_hooks: + specifier: ^0.0.1 + version: 0.0.1 + socket.io-client: + specifier: ^4.8.1 + version: 4.8.1 + sonner: + specifier: ^2.0.6 + version: 2.0.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + tailwind-merge: + specifier: ^3.3.1 + version: 3.3.1 + tw-animate-css: + specifier: ^1.3.5 + version: 1.3.5 devDependencies: '@electron-toolkit/eslint-config-prettier': specifier: ^3.0.0 - version: 3.0.0(eslint@9.30.1)(prettier@3.6.2) + version: 3.0.0(eslint@9.30.1(jiti@2.4.2))(prettier@3.6.2) '@electron-toolkit/eslint-config-ts': specifier: ^3.0.0 - version: 3.1.0(eslint@9.30.1)(typescript@5.8.3) + version: 3.1.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) '@electron-toolkit/tsconfig': specifier: ^1.0.1 version: 1.0.1(@types/node@22.16.0) + '@tailwindcss/vite': + specifier: ^4.1.11 + version: 4.1.11(vite@6.3.5(@types/node@22.16.0)(jiti@2.4.2)(lightningcss@1.30.1)) '@types/node': specifier: ^22.14.1 version: 22.16.0 @@ -38,7 +86,7 @@ importers: version: 19.1.6(@types/react@19.1.8) '@vitejs/plugin-react': specifier: ^4.3.4 - version: 4.6.0(vite@6.3.5(@types/node@22.16.0)) + version: 4.6.0(vite@6.3.5(@types/node@22.16.0)(jiti@2.4.2)(lightningcss@1.30.1)) electron: specifier: ^35.1.5 version: 35.7.0 @@ -47,19 +95,19 @@ importers: version: 25.1.8(electron-builder-squirrel-windows@25.1.8) electron-vite: specifier: ^3.1.0 - version: 3.1.0(vite@6.3.5(@types/node@22.16.0)) + version: 3.1.0(vite@6.3.5(@types/node@22.16.0)(jiti@2.4.2)(lightningcss@1.30.1)) eslint: specifier: ^9.24.0 - version: 9.30.1 + version: 9.30.1(jiti@2.4.2) eslint-plugin-react: specifier: ^7.37.5 - version: 7.37.5(eslint@9.30.1) + version: 7.37.5(eslint@9.30.1(jiti@2.4.2)) eslint-plugin-react-hooks: specifier: ^5.2.0 - version: 5.2.0(eslint@9.30.1) + version: 5.2.0(eslint@9.30.1(jiti@2.4.2)) eslint-plugin-react-refresh: specifier: ^0.4.19 - version: 0.4.20(eslint@9.30.1) + version: 0.4.20(eslint@9.30.1(jiti@2.4.2)) prettier: specifier: ^3.5.3 version: 3.6.2 @@ -69,12 +117,15 @@ importers: react-dom: specifier: ^19.1.0 version: 19.1.0(react@19.1.0) + tailwindcss: + specifier: ^4.1.11 + version: 4.1.11 typescript: specifier: ^5.8.3 version: 5.8.3 vite: specifier: ^6.2.6 - version: 6.3.5(@types/node@22.16.0) + version: 6.3.5(@types/node@22.16.0)(jiti@2.4.2)(lightningcss@1.30.1) packages: @@ -427,6 +478,21 @@ packages: resolution: {integrity: sha512-1+WqvgNMhmlAambTvT3KPtCl/Ibr68VldY2XY40SL1CE0ZXiakFR/cbTspaF5HsnpDMvcYYoJHfl4980NBjGag==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@floating-ui/core@1.7.2': + resolution: {integrity: sha512-wNB5ooIKHQc+Kui96jE/n69rHFWAVoxn5CAzL1Xdd8FG03cgY3MLO+GF9U3W737fYDSgPWA6MReKhBQBop6Pcw==} + + '@floating-ui/dom@1.7.2': + resolution: {integrity: sha512-7cfaOQuCS27HD7DX+6ib2OrnW+b4ZBwDNnCcT0uTyidcmyWb03FnQqJybDBoCnpdxwBSfA94UAYlRCt7mV+TbA==} + + '@floating-ui/react-dom@2.1.4': + resolution: {integrity: sha512-JbbpPhp38UmXDDAu60RJmbeme37Jbgsm7NrHGgzYYFKmblzRUh6Pa641dII6LsjwF4XlScDrde2UAzDo/b9KPw==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/utils@0.2.10': + resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} + '@gar/promisify@1.1.3': resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} @@ -462,6 +528,10 @@ packages: resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} + '@isaacs/fs-minipass@4.0.1': + resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} + engines: {node: '>=18.0.0'} + '@jridgewell/gen-mapping@0.3.12': resolution: {integrity: sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==} @@ -483,6 +553,16 @@ packages: resolution: {integrity: sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==} engines: {node: '>= 10.0.0'} + '@monaco-editor/loader@1.5.0': + resolution: {integrity: sha512-hKoGSM+7aAc7eRTRjpqAZucPmoNOC4UUbknb/VNoTkEIkCPhqV8LfbsgM1webRM7S/z21eHEx9Fkwx8Z/C/+Xw==} + + '@monaco-editor/react@4.7.0': + resolution: {integrity: sha512-cyzXQCtO47ydzxpQtCGSQGOC8Gk3ZUeBXFAxD+CWXYFo5OqZyZUonFl0DwUlTyAfRHntBfw2p3w4s9R6oe1eCA==} + peerDependencies: + monaco-editor: '>= 0.25.0 < 1' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -512,6 +592,258 @@ packages: resolution: {integrity: sha512-YLT9Zo3oNPJoBjBc4q8G2mjU4tqIbf5CEOORbUUr48dCD9q3umJ3IPlVqOqDakPfd2HuwccBaqlGhN4Gmr5OWg==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + '@radix-ui/number@1.1.1': + resolution: {integrity: sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g==} + + '@radix-ui/primitive@1.1.2': + resolution: {integrity: sha512-XnbHrrprsNqZKQhStrSwgRUQzoCI1glLzdw79xiZPoofhGICeZRSQ3dIxAKH1gb3OHfNf4d6f+vAv3kil2eggA==} + + '@radix-ui/react-arrow@1.1.7': + resolution: {integrity: sha512-F+M1tLhO+mlQaOWspE8Wstg+z6PwxwRd8oQ8IXceWz92kfAmalTRf0EjrouQeo7QssEPfCn05B4Ihs1K9WQ/7w==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-collection@1.1.7': + resolution: {integrity: sha512-Fh9rGN0MoI4ZFUNyfFVNU4y9LUz93u9/0K+yLgA2bwRojxM8JU1DyvvMBabnZPBgMWREAJvU2jjVzq+LrFUglw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-compose-refs@1.1.2': + resolution: {integrity: sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-context@1.1.2': + resolution: {integrity: sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-direction@1.1.1': + resolution: {integrity: sha512-1UEWRX6jnOA2y4H5WczZ44gOOjTEmlqv1uNW4GAJEO5+bauCBhv8snY65Iw5/VOS/ghKN9gr2KjnLKxrsvoMVw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-dismissable-layer@1.1.10': + resolution: {integrity: sha512-IM1zzRV4W3HtVgftdQiiOmA0AdJlCtMLe00FXaHwgt3rAnNsIyDqshvkIW3hj/iu5hu8ERP7KIYki6NkqDxAwQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-focus-guards@1.1.2': + resolution: {integrity: sha512-fyjAACV62oPV925xFCrH8DR5xWhg9KYtJT4s3u54jxp+L/hbpTY2kIeEFFbFe+a/HCE94zGQMZLIpVTPVZDhaA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-focus-scope@1.1.7': + resolution: {integrity: sha512-t2ODlkXBQyn7jkl6TNaw/MtVEVvIGelJDCG41Okq/KwUsJBwQ4XVZsHAVUkK4mBv3ewiAS3PGuUWuY2BoK4ZUw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-id@1.1.1': + resolution: {integrity: sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-popper@1.2.7': + resolution: {integrity: sha512-IUFAccz1JyKcf/RjB552PlWwxjeCJB8/4KxT7EhBHOJM+mN7LdW+B3kacJXILm32xawcMMjb2i0cIZpo+f9kiQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-portal@1.1.9': + resolution: {integrity: sha512-bpIxvq03if6UNwXZ+HTK71JLh4APvnXntDc6XOX8UVq4XQOVl7lwok0AvIl+b8zgCw3fSaVTZMpAPPagXbKmHQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-primitive@2.1.3': + resolution: {integrity: sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-select@2.2.5': + resolution: {integrity: sha512-HnMTdXEVuuyzx63ME0ut4+sEMYW6oouHWNGUZc7ddvUWIcfCva/AMoqEW/3wnEllriMWBa0RHspCYnfCWJQYmA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-slot@1.2.3': + resolution: {integrity: sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-callback-ref@1.1.1': + resolution: {integrity: sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-controllable-state@1.2.2': + resolution: {integrity: sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-effect-event@0.0.2': + resolution: {integrity: sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-escape-keydown@1.1.1': + resolution: {integrity: sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-layout-effect@1.1.1': + resolution: {integrity: sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-previous@1.1.1': + resolution: {integrity: sha512-2dHfToCj/pzca2Ck724OZ5L0EVrr3eHRNsG/b3xQJLA2hZpVCS99bLAX+hm1IHXDEnzU6by5z/5MIY794/a8NQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-rect@1.1.1': + resolution: {integrity: sha512-QTYuDesS0VtuHNNvMh+CjlKJ4LJickCMUAqjlE3+j8w+RlRpwyX3apEQKGFzbZGdo7XNG1tXa+bQqIE7HIXT2w==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-size@1.1.1': + resolution: {integrity: sha512-ewrXRDTAqAXlkl6t/fkXWNAhFX9I+CkKlw6zjEwk86RSPKwZr3xpBRso655aqYafwtnbpHLj6toFzmd6xdVptQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-visually-hidden@1.2.3': + resolution: {integrity: sha512-pzJq12tEaaIhqjbzpCuv/OypJY/BPavOofm+dbab+MHLajy277+1lLm6JFcGgF5eskJ6mquGirhXY2GD/8u8Ug==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/rect@1.1.1': + resolution: {integrity: sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==} + '@rolldown/pluginutils@1.0.0-beta.19': resolution: {integrity: sha512-3FL3mnMbPu0muGOCaKAhhFEYmqv9eTfPSJRJmANrCwtgK8VuxpsZDGK+m0LYAGoyO8+0j5uRe4PeyPDK1yA/hA==} @@ -619,10 +951,103 @@ packages: resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} engines: {node: '>=10'} + '@socket.io/component-emitter@3.1.2': + resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} + '@szmarczak/http-timer@4.0.6': resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} engines: {node: '>=10'} + '@tailwindcss/node@4.1.11': + resolution: {integrity: sha512-yzhzuGRmv5QyU9qLNg4GTlYI6STedBWRE7NjxP45CsFYYq9taI0zJXZBMqIC/c8fViNLhmrbpSFS57EoxUmD6Q==} + + '@tailwindcss/oxide-android-arm64@4.1.11': + resolution: {integrity: sha512-3IfFuATVRUMZZprEIx9OGDjG3Ou3jG4xQzNTvjDoKmU9JdmoCohQJ83MYd0GPnQIu89YoJqvMM0G3uqLRFtetg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + + '@tailwindcss/oxide-darwin-arm64@4.1.11': + resolution: {integrity: sha512-ESgStEOEsyg8J5YcMb1xl8WFOXfeBmrhAwGsFxxB2CxY9evy63+AtpbDLAyRkJnxLy2WsD1qF13E97uQyP1lfQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@tailwindcss/oxide-darwin-x64@4.1.11': + resolution: {integrity: sha512-EgnK8kRchgmgzG6jE10UQNaH9Mwi2n+yw1jWmof9Vyg2lpKNX2ioe7CJdf9M5f8V9uaQxInenZkOxnTVL3fhAw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@tailwindcss/oxide-freebsd-x64@4.1.11': + resolution: {integrity: sha512-xdqKtbpHs7pQhIKmqVpxStnY1skuNh4CtbcyOHeX1YBE0hArj2romsFGb6yUmzkq/6M24nkxDqU8GYrKrz+UcA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.11': + resolution: {integrity: sha512-ryHQK2eyDYYMwB5wZL46uoxz2zzDZsFBwfjssgB7pzytAeCCa6glsiJGjhTEddq/4OsIjsLNMAiMlHNYnkEEeg==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-gnu@4.1.11': + resolution: {integrity: sha512-mYwqheq4BXF83j/w75ewkPJmPZIqqP1nhoghS9D57CLjsh3Nfq0m4ftTotRYtGnZd3eCztgbSPJ9QhfC91gDZQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-musl@4.1.11': + resolution: {integrity: sha512-m/NVRFNGlEHJrNVk3O6I9ggVuNjXHIPoD6bqay/pubtYC9QIdAMpS+cswZQPBLvVvEF6GtSNONbDkZrjWZXYNQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-gnu@4.1.11': + resolution: {integrity: sha512-YW6sblI7xukSD2TdbbaeQVDysIm/UPJtObHJHKxDEcW2exAtY47j52f8jZXkqE1krdnkhCMGqP3dbniu1Te2Fg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-musl@4.1.11': + resolution: {integrity: sha512-e3C/RRhGunWYNC3aSF7exsQkdXzQ/M+aYuZHKnw4U7KQwTJotnWsGOIVih0s2qQzmEzOFIJ3+xt7iq67K/p56Q==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-wasm32-wasi@4.1.11': + resolution: {integrity: sha512-Xo1+/GU0JEN/C/dvcammKHzeM6NqKovG+6921MR6oadee5XPBaKOumrJCXvopJ/Qb5TH7LX/UAywbqrP4lax0g==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + bundledDependencies: + - '@napi-rs/wasm-runtime' + - '@emnapi/core' + - '@emnapi/runtime' + - '@tybys/wasm-util' + - '@emnapi/wasi-threads' + - tslib + + '@tailwindcss/oxide-win32-arm64-msvc@4.1.11': + resolution: {integrity: sha512-UgKYx5PwEKrac3GPNPf6HVMNhUIGuUh4wlDFR2jYYdkX6pL/rn73zTq/4pzUm8fOjAn5L8zDeHp9iXmUGOXZ+w==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@tailwindcss/oxide-win32-x64-msvc@4.1.11': + resolution: {integrity: sha512-YfHoggn1j0LK7wR82TOucWc5LDCguHnoS879idHekmmiR7g9HUtMw9MI0NHatS28u/Xlkfi9w5RJWgz2Dl+5Qg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@tailwindcss/oxide@4.1.11': + resolution: {integrity: sha512-Q69XzrtAhuyfHo+5/HMgr1lAiPP/G40OMFAnws7xcFEYqcypZmdW8eGXaOUIeOl1dzPJBPENXgbjsOyhg2nkrg==} + engines: {node: '>= 10'} + + '@tailwindcss/vite@4.1.11': + resolution: {integrity: sha512-RHYhrR3hku0MJFRV+fN2gNbDNEh3dwKvY8XJvTxCSXeMOsCRSr+uKvDWQcbizrHgjML6ZmTE5OwMrl5wKcujCw==} + peerDependencies: + vite: ^5.2.0 || ^6 || ^7 + '@tootallnate/once@2.0.0': resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} engines: {node: '>= 10'} @@ -841,6 +1266,10 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + aria-hidden@1.2.6: + resolution: {integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==} + engines: {node: '>=10'} + array-buffer-byte-length@1.0.2: resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} engines: {node: '>= 0.4'} @@ -899,6 +1328,9 @@ packages: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} + axios@1.10.0: + resolution: {integrity: sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw==} + balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -996,6 +1428,10 @@ packages: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} + chownr@3.0.0: + resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} + engines: {node: '>=18'} + chromium-pickle-js@0.2.0: resolution: {integrity: sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==} @@ -1003,6 +1439,9 @@ packages: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} + class-variance-authority@0.7.1: + resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} + clean-stack@2.2.0: resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} engines: {node: '>=6'} @@ -1030,6 +1469,10 @@ packages: resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} engines: {node: '>=0.8'} + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} @@ -1106,6 +1549,15 @@ packages: resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==} engines: {node: '>= 0.4'} + debug@4.3.7: + resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + debug@4.4.1: resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} engines: {node: '>=6.0'} @@ -1148,6 +1600,9 @@ packages: resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} engines: {node: '>=8'} + detect-node-es@1.1.0: + resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} + detect-node@2.1.0: resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} @@ -1175,6 +1630,10 @@ packages: resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} engines: {node: '>=12'} + dotenv@17.0.1: + resolution: {integrity: sha512-GLjkduuAL7IMJg/ZnOPm9AnWKJ82mSE2tzXLaJ/6hD6DhwGfZaXG77oB8qbReyiczNxnbxQKyh0OE5mXq0bAHA==} + engines: {node: '>=12'} + dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} @@ -1232,6 +1691,17 @@ packages: end-of-stream@1.4.5: resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} + engine.io-client@6.6.3: + resolution: {integrity: sha512-T0iLjnyNWahNyv/lcjS2y4oE358tVS/SYQNxYXGAJ9/GLgH4VCvOQ/mhTjqU88mLZCQgiG8RIegFHYCdVC+j5w==} + + engine.io-parser@5.2.3: + resolution: {integrity: sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==} + engines: {node: '>=10.0.0'} + + enhanced-resolve@5.18.2: + resolution: {integrity: sha512-6Jw4sE1maoRJo3q8MsSIn2onJFbLTOjY9hlx4DZXmOKvLRd1Ok2kXmAGXaafL2+ijsJZ1ClYbl/pmqr9+k4iUQ==} + engines: {node: '>=10.13.0'} + env-paths@2.2.1: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} @@ -1430,6 +1900,15 @@ packages: flatted@3.3.3: resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} + follow-redirects@1.15.9: + resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + for-each@0.3.5: resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} engines: {node: '>= 0.4'} @@ -1500,6 +1979,10 @@ packages: resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} + get-nonce@1.0.1: + resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} + engines: {node: '>=6'} + get-proto@1.0.1: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} @@ -1821,6 +2304,10 @@ packages: engines: {node: '>=10'} hasBin: true + jiti@2.4.2: + resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} + hasBin: true + js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -1877,6 +2364,70 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} + lightningcss-darwin-arm64@1.30.1: + resolution: {integrity: sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.30.1: + resolution: {integrity: sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.30.1: + resolution: {integrity: sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.30.1: + resolution: {integrity: sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.30.1: + resolution: {integrity: sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-arm64-musl@1.30.1: + resolution: {integrity: sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-x64-gnu@1.30.1: + resolution: {integrity: sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-linux-x64-musl@1.30.1: + resolution: {integrity: sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-win32-arm64-msvc@1.30.1: + resolution: {integrity: sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.30.1: + resolution: {integrity: sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.30.1: + resolution: {integrity: sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==} + engines: {node: '>= 12.0.0'} + locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} @@ -1935,6 +2486,11 @@ packages: resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} engines: {node: '>=12'} + lucide-react@0.525.0: + resolution: {integrity: sha512-Tm1txJ2OkymCGkvwoHt33Y2JpN5xucVq1slHcgE6Lk0WjDfjgKWor5CdVER8U6DvcfMwh4M8XxmpTiyzfmfDYQ==} + peerDependencies: + react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 + magic-string@0.30.17: resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} @@ -2037,11 +2593,23 @@ packages: resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} engines: {node: '>= 8'} + minizlib@3.0.2: + resolution: {integrity: sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==} + engines: {node: '>= 18'} + mkdirp@1.0.4: resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} engines: {node: '>=10'} hasBin: true + mkdirp@3.0.1: + resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} + engines: {node: '>=10'} + hasBin: true + + monaco-editor@0.52.2: + resolution: {integrity: sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ==} + ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -2057,6 +2625,12 @@ packages: resolution: {integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==} engines: {node: '>= 0.6'} + next-themes@0.4.6: + resolution: {integrity: sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==} + peerDependencies: + react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc + react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc + node-abi@3.75.0: resolution: {integrity: sha512-OhYaY5sDsIka7H7AtijtI9jwGYLyl29eQn/W623DiN/MIv5sUqc4g7BIDThX+gb7di9f6xK02nkp8sdfFWZLTg==} engines: {node: '>=10'} @@ -2189,6 +2763,9 @@ packages: pend@1.2.0: resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + perf_hooks@0.0.1: + resolution: {integrity: sha512-qG/D9iA4KDme+KF4vCObJy6Bouu3BlQnmJ8jPydVPm32NJBD9ZK1ZNgXSYaZKHkVC1sKSqUiLgFvAZPUiIEnBw==} + picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -2247,6 +2824,9 @@ packages: prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + pump@3.0.3: resolution: {integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==} @@ -2273,6 +2853,36 @@ packages: resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==} engines: {node: '>=0.10.0'} + react-remove-scroll-bar@2.3.8: + resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + react-remove-scroll@2.7.1: + resolution: {integrity: sha512-HpMh8+oahmIdOuS5aFKKY6Pyog+FNaZV/XyJOq7b4YFwsFHe5yYfdbIalI4k3vU2nSDql7YskmUseHsRrJqIPA==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + react-style-singleton@2.2.3: + resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + react@19.1.0: resolution: {integrity: sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==} engines: {node: '>=0.10.0'} @@ -2454,6 +3064,14 @@ packages: resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + socket.io-client@4.8.1: + resolution: {integrity: sha512-hJVXfu3E28NmzGk8o1sHhN3om52tRvwYeidbj7xKy2eIIse5IoKX3USlS6Tqt3BHAtflLIkCQBkzVrEEfWUyYQ==} + engines: {node: '>=10.0.0'} + + socket.io-parser@4.2.4: + resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==} + engines: {node: '>=10.0.0'} + socks-proxy-agent@7.0.0: resolution: {integrity: sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==} engines: {node: '>= 10'} @@ -2462,6 +3080,12 @@ packages: resolution: {integrity: sha512-iF+tNDQla22geJdTyJB1wM/qrX9DMRwWrciEPwWLPRWAUEM8sQiyxgckLxWT1f7+9VabJS0jTGGr4QgBuvi6Ww==} engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} + sonner@2.0.6: + resolution: {integrity: sha512-yHFhk8T/DK3YxjFQXIrcHT1rGEeTLliVzWbO0xN8GberVun2RiBnxAjXAYpZrqwEVHBG9asI/Li8TAAhN9m59Q==} + peerDependencies: + react: ^18.0.0 || ^19.0.0 || ^19.0.0-rc + react-dom: ^18.0.0 || ^19.0.0 || ^19.0.0-rc + source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} @@ -2484,6 +3108,9 @@ packages: resolution: {integrity: sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==} engines: {node: '>= 6'} + state-local@1.0.7: + resolution: {integrity: sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==} + stop-iteration-iterator@1.1.0: resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} engines: {node: '>= 0.4'} @@ -2549,6 +3176,16 @@ packages: resolution: {integrity: sha512-+XZ+r1XGIJGeQk3VvXhT6xx/VpbHsRzsTkGgF6E5RX9TTXD0118l87puaEBZ566FhqblC6U0d4XnubznJDm30A==} engines: {node: ^14.18.0 || >=16.0.0} + tailwind-merge@3.3.1: + resolution: {integrity: sha512-gBXpgUm/3rp1lMZZrM/w7D8GKqshif0zAymAhbCyIt8KMe+0v9DQ7cdYLR4FHH/cKpdTXb+A/tKKU3eolfsI+g==} + + tailwindcss@4.1.11: + resolution: {integrity: sha512-2E9TBm6MDD/xKYe+dvJZAmg3yxIEDNRc0jwlNyDg/4Fil2QcSLjFKGVff0lAf1jjeaArlG/M75Ey/EYr/OJtBA==} + + tapable@2.2.2: + resolution: {integrity: sha512-Re10+NauLTMCudc7T5WLFLAwDhQ0JWdrMK+9B2M8zR5hRExKmsRDCBA7/aV/pNJFltmBFO5BAMlQFi/vq3nKOg==} + engines: {node: '>=6'} + tar-stream@2.2.0: resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} engines: {node: '>=6'} @@ -2557,6 +3194,10 @@ packages: resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} engines: {node: '>=10'} + tar@7.4.3: + resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} + engines: {node: '>=18'} + temp-file@3.4.0: resolution: {integrity: sha512-C5tjlC/HCtVUOi3KWVokd4vHVViOmGjtLwIh4MuzPo/nMYTV/p1urt3RnMz2IWXDdKEGJH3k5+KPxtqRsUYGtg==} @@ -2587,6 +3228,12 @@ packages: peerDependencies: typescript: '>=4.8.4' + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + tw-animate-css@1.3.5: + resolution: {integrity: sha512-t3u+0YNoloIhj1mMXs779P6MO9q3p3mvGn4k1n3nJPqJw/glZcuijG2qTSN4z4mgNRfW5ZC3aXJFLwDtiipZXA==} + type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -2655,6 +3302,26 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + use-callback-ref@1.3.3: + resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + use-sidecar@1.1.3: + resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + utf8-byte-length@1.0.5: resolution: {integrity: sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==} @@ -2747,10 +3414,26 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + ws@8.17.1: + resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + xmlbuilder@15.1.1: resolution: {integrity: sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==} engines: {node: '>=8.0'} + xmlhttprequest-ssl@2.1.2: + resolution: {integrity: sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ==} + engines: {node: '>=0.4.0'} + y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} @@ -2761,6 +3444,10 @@ packages: yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + yallist@5.0.0: + resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} + engines: {node: '>=18'} + yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} @@ -2911,21 +3598,21 @@ snapshots: ajv: 6.12.6 ajv-keywords: 3.5.2(ajv@6.12.6) - '@electron-toolkit/eslint-config-prettier@3.0.0(eslint@9.30.1)(prettier@3.6.2)': + '@electron-toolkit/eslint-config-prettier@3.0.0(eslint@9.30.1(jiti@2.4.2))(prettier@3.6.2)': dependencies: - eslint: 9.30.1 - eslint-config-prettier: 10.1.5(eslint@9.30.1) - eslint-plugin-prettier: 5.5.1(eslint-config-prettier@10.1.5(eslint@9.30.1))(eslint@9.30.1)(prettier@3.6.2) + eslint: 9.30.1(jiti@2.4.2) + eslint-config-prettier: 10.1.5(eslint@9.30.1(jiti@2.4.2)) + eslint-plugin-prettier: 5.5.1(eslint-config-prettier@10.1.5(eslint@9.30.1(jiti@2.4.2)))(eslint@9.30.1(jiti@2.4.2))(prettier@3.6.2) prettier: 3.6.2 transitivePeerDependencies: - '@types/eslint' - '@electron-toolkit/eslint-config-ts@3.1.0(eslint@9.30.1)(typescript@5.8.3)': + '@electron-toolkit/eslint-config-ts@3.1.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3)': dependencies: '@eslint/js': 9.30.1 - eslint: 9.30.1 + eslint: 9.30.1(jiti@2.4.2) globals: 16.3.0 - typescript-eslint: 8.35.1(eslint@9.30.1)(typescript@5.8.3) + typescript-eslint: 8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -3089,9 +3776,9 @@ snapshots: '@esbuild/win32-x64@0.25.5': optional: true - '@eslint-community/eslint-utils@4.7.0(eslint@9.30.1)': + '@eslint-community/eslint-utils@4.7.0(eslint@9.30.1(jiti@2.4.2))': dependencies: - eslint: 9.30.1 + eslint: 9.30.1(jiti@2.4.2) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} @@ -3137,89 +3824,339 @@ snapshots: '@eslint/core': 0.15.1 levn: 0.4.1 + '@floating-ui/core@1.7.2': + dependencies: + '@floating-ui/utils': 0.2.10 + + '@floating-ui/dom@1.7.2': + dependencies: + '@floating-ui/core': 1.7.2 + '@floating-ui/utils': 0.2.10 + + '@floating-ui/react-dom@2.1.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@floating-ui/dom': 1.7.2 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + + '@floating-ui/utils@0.2.10': {} + '@gar/promisify@1.1.3': {} '@humanfs/core@0.19.1': {} '@humanfs/node@0.16.6': dependencies: - '@humanfs/core': 0.19.1 - '@humanwhocodes/retry': 0.3.1 + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.3.1 + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/retry@0.3.1': {} + + '@humanwhocodes/retry@0.4.3': {} + + '@isaacs/balanced-match@4.0.1': {} + + '@isaacs/brace-expansion@5.0.0': + dependencies: + '@isaacs/balanced-match': 4.0.1 + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@isaacs/fs-minipass@4.0.1': + dependencies: + minipass: 7.1.2 + + '@jridgewell/gen-mapping@0.3.12': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.4 + '@jridgewell/trace-mapping': 0.3.29 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.4': {} + + '@jridgewell/trace-mapping@0.3.29': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.4 + + '@malept/cross-spawn-promise@2.0.0': + dependencies: + cross-spawn: 7.0.6 + + '@malept/flatpak-bundler@0.4.0': + dependencies: + debug: 4.4.1 + fs-extra: 9.1.0 + lodash: 4.17.21 + tmp-promise: 3.0.3 + transitivePeerDependencies: + - supports-color + + '@monaco-editor/loader@1.5.0': + dependencies: + state-local: 1.0.7 + + '@monaco-editor/react@4.7.0(monaco-editor@0.52.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@monaco-editor/loader': 1.5.0 + monaco-editor: 0.52.2 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.19.1 + + '@npmcli/fs@2.1.2': + dependencies: + '@gar/promisify': 1.1.3 + semver: 7.7.2 + + '@npmcli/move-file@2.0.1': + dependencies: + mkdirp: 1.0.4 + rimraf: 3.0.2 + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@pkgr/core@0.2.7': {} + + '@radix-ui/number@1.1.1': {} + + '@radix-ui/primitive@1.1.2': {} + + '@radix-ui/react-arrow@1.1.7(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6(@types/react@19.1.8) + + '@radix-ui/react-collection@1.1.7(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-slot': 1.2.3(@types/react@19.1.8)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6(@types/react@19.1.8) + + '@radix-ui/react-compose-refs@1.1.2(@types/react@19.1.8)(react@19.1.0)': + dependencies: + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.8 + + '@radix-ui/react-context@1.1.2(@types/react@19.1.8)(react@19.1.0)': + dependencies: + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.8 + + '@radix-ui/react-direction@1.1.1(@types/react@19.1.8)(react@19.1.0)': + dependencies: + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.8 + + '@radix-ui/react-dismissable-layer@1.1.10(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.1.8)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6(@types/react@19.1.8) - '@humanwhocodes/module-importer@1.0.1': {} + '@radix-ui/react-focus-guards@1.1.2(@types/react@19.1.8)(react@19.1.0)': + dependencies: + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.8 - '@humanwhocodes/retry@0.3.1': {} + '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.8)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6(@types/react@19.1.8) - '@humanwhocodes/retry@0.4.3': {} + '@radix-ui/react-id@1.1.1(@types/react@19.1.8)(react@19.1.0)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.8)(react@19.1.0) + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.8 - '@isaacs/balanced-match@4.0.1': {} + '@radix-ui/react-popper@1.2.7(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@floating-ui/react-dom': 2.1.4(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-use-rect': 1.1.1(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/rect': 1.1.1 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6(@types/react@19.1.8) - '@isaacs/brace-expansion@5.0.0': + '@radix-ui/react-portal@1.1.9(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - '@isaacs/balanced-match': 4.0.1 + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.8)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6(@types/react@19.1.8) - '@isaacs/cliui@8.0.2': + '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': dependencies: - string-width: 5.1.2 - string-width-cjs: string-width@4.2.3 - strip-ansi: 7.1.0 - strip-ansi-cjs: strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: wrap-ansi@7.0.0 + '@radix-ui/react-slot': 1.2.3(@types/react@19.1.8)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6(@types/react@19.1.8) + + '@radix-ui/react-select@2.2.5(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/number': 1.1.1 + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-dismissable-layer': 1.1.10(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-focus-guards': 1.1.2(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-popper': 1.2.7(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@radix-ui/react-slot': 1.2.3(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + aria-hidden: 1.2.6 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + react-remove-scroll: 2.7.1(@types/react@19.1.8)(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6(@types/react@19.1.8) - '@jridgewell/gen-mapping@0.3.12': + '@radix-ui/react-slot@1.2.3(@types/react@19.1.8)(react@19.1.0)': dependencies: - '@jridgewell/sourcemap-codec': 1.5.4 - '@jridgewell/trace-mapping': 0.3.29 - - '@jridgewell/resolve-uri@3.1.2': {} - - '@jridgewell/sourcemap-codec@1.5.4': {} + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.8)(react@19.1.0) + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.8 - '@jridgewell/trace-mapping@0.3.29': + '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.1.8)(react@19.1.0)': dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.4 + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.8 - '@malept/cross-spawn-promise@2.0.0': + '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.1.8)(react@19.1.0)': dependencies: - cross-spawn: 7.0.6 + '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.1.8)(react@19.1.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.8)(react@19.1.0) + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.8 - '@malept/flatpak-bundler@0.4.0': + '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.1.8)(react@19.1.0)': dependencies: - debug: 4.4.1 - fs-extra: 9.1.0 - lodash: 4.17.21 - tmp-promise: 3.0.3 - transitivePeerDependencies: - - supports-color + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.8)(react@19.1.0) + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.8 - '@nodelib/fs.scandir@2.1.5': + '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.1.8)(react@19.1.0)': dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.8)(react@19.1.0) + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.8 - '@nodelib/fs.stat@2.0.5': {} + '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.1.8)(react@19.1.0)': + dependencies: + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.8 - '@nodelib/fs.walk@1.2.8': + '@radix-ui/react-use-previous@1.1.1(@types/react@19.1.8)(react@19.1.0)': dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.19.1 + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.8 - '@npmcli/fs@2.1.2': + '@radix-ui/react-use-rect@1.1.1(@types/react@19.1.8)(react@19.1.0)': dependencies: - '@gar/promisify': 1.1.3 - semver: 7.7.2 + '@radix-ui/rect': 1.1.1 + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.8 - '@npmcli/move-file@2.0.1': + '@radix-ui/react-use-size@1.1.1(@types/react@19.1.8)(react@19.1.0)': dependencies: - mkdirp: 1.0.4 - rimraf: 3.0.2 + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.8)(react@19.1.0) + react: 19.1.0 + optionalDependencies: + '@types/react': 19.1.8 - '@pkgjs/parseargs@0.11.0': - optional: true + '@radix-ui/react-visually-hidden@1.2.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': + dependencies: + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.8 + '@types/react-dom': 19.1.6(@types/react@19.1.8) - '@pkgr/core@0.2.7': {} + '@radix-ui/rect@1.1.1': {} '@rolldown/pluginutils@1.0.0-beta.19': {} @@ -3285,10 +4222,83 @@ snapshots: '@sindresorhus/is@4.6.0': {} + '@socket.io/component-emitter@3.1.2': {} + '@szmarczak/http-timer@4.0.6': dependencies: defer-to-connect: 2.0.1 + '@tailwindcss/node@4.1.11': + dependencies: + '@ampproject/remapping': 2.3.0 + enhanced-resolve: 5.18.2 + jiti: 2.4.2 + lightningcss: 1.30.1 + magic-string: 0.30.17 + source-map-js: 1.2.1 + tailwindcss: 4.1.11 + + '@tailwindcss/oxide-android-arm64@4.1.11': + optional: true + + '@tailwindcss/oxide-darwin-arm64@4.1.11': + optional: true + + '@tailwindcss/oxide-darwin-x64@4.1.11': + optional: true + + '@tailwindcss/oxide-freebsd-x64@4.1.11': + optional: true + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.11': + optional: true + + '@tailwindcss/oxide-linux-arm64-gnu@4.1.11': + optional: true + + '@tailwindcss/oxide-linux-arm64-musl@4.1.11': + optional: true + + '@tailwindcss/oxide-linux-x64-gnu@4.1.11': + optional: true + + '@tailwindcss/oxide-linux-x64-musl@4.1.11': + optional: true + + '@tailwindcss/oxide-wasm32-wasi@4.1.11': + optional: true + + '@tailwindcss/oxide-win32-arm64-msvc@4.1.11': + optional: true + + '@tailwindcss/oxide-win32-x64-msvc@4.1.11': + optional: true + + '@tailwindcss/oxide@4.1.11': + dependencies: + detect-libc: 2.0.4 + tar: 7.4.3 + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.1.11 + '@tailwindcss/oxide-darwin-arm64': 4.1.11 + '@tailwindcss/oxide-darwin-x64': 4.1.11 + '@tailwindcss/oxide-freebsd-x64': 4.1.11 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.11 + '@tailwindcss/oxide-linux-arm64-gnu': 4.1.11 + '@tailwindcss/oxide-linux-arm64-musl': 4.1.11 + '@tailwindcss/oxide-linux-x64-gnu': 4.1.11 + '@tailwindcss/oxide-linux-x64-musl': 4.1.11 + '@tailwindcss/oxide-wasm32-wasi': 4.1.11 + '@tailwindcss/oxide-win32-arm64-msvc': 4.1.11 + '@tailwindcss/oxide-win32-x64-msvc': 4.1.11 + + '@tailwindcss/vite@4.1.11(vite@6.3.5(@types/node@22.16.0)(jiti@2.4.2)(lightningcss@1.30.1))': + dependencies: + '@tailwindcss/node': 4.1.11 + '@tailwindcss/oxide': 4.1.11 + tailwindcss: 4.1.11 + vite: 6.3.5(@types/node@22.16.0)(jiti@2.4.2)(lightningcss@1.30.1) + '@tootallnate/once@2.0.0': {} '@types/babel__core@7.20.5': @@ -3369,15 +4379,15 @@ snapshots: '@types/node': 22.16.0 optional: true - '@typescript-eslint/eslint-plugin@8.35.1(@typescript-eslint/parser@8.35.1(eslint@9.30.1)(typescript@5.8.3))(eslint@9.30.1)(typescript@5.8.3)': + '@typescript-eslint/eslint-plugin@8.35.1(@typescript-eslint/parser@8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.35.1(eslint@9.30.1)(typescript@5.8.3) + '@typescript-eslint/parser': 8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) '@typescript-eslint/scope-manager': 8.35.1 - '@typescript-eslint/type-utils': 8.35.1(eslint@9.30.1)(typescript@5.8.3) - '@typescript-eslint/utils': 8.35.1(eslint@9.30.1)(typescript@5.8.3) + '@typescript-eslint/type-utils': 8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/utils': 8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) '@typescript-eslint/visitor-keys': 8.35.1 - eslint: 9.30.1 + eslint: 9.30.1(jiti@2.4.2) graphemer: 1.4.0 ignore: 7.0.5 natural-compare: 1.4.0 @@ -3386,14 +4396,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.35.1(eslint@9.30.1)(typescript@5.8.3)': + '@typescript-eslint/parser@8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3)': dependencies: '@typescript-eslint/scope-manager': 8.35.1 '@typescript-eslint/types': 8.35.1 '@typescript-eslint/typescript-estree': 8.35.1(typescript@5.8.3) '@typescript-eslint/visitor-keys': 8.35.1 debug: 4.4.1 - eslint: 9.30.1 + eslint: 9.30.1(jiti@2.4.2) typescript: 5.8.3 transitivePeerDependencies: - supports-color @@ -3416,12 +4426,12 @@ snapshots: dependencies: typescript: 5.8.3 - '@typescript-eslint/type-utils@8.35.1(eslint@9.30.1)(typescript@5.8.3)': + '@typescript-eslint/type-utils@8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3)': dependencies: '@typescript-eslint/typescript-estree': 8.35.1(typescript@5.8.3) - '@typescript-eslint/utils': 8.35.1(eslint@9.30.1)(typescript@5.8.3) + '@typescript-eslint/utils': 8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) debug: 4.4.1 - eslint: 9.30.1 + eslint: 9.30.1(jiti@2.4.2) ts-api-utils: 2.1.0(typescript@5.8.3) typescript: 5.8.3 transitivePeerDependencies: @@ -3445,13 +4455,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.35.1(eslint@9.30.1)(typescript@5.8.3)': + '@typescript-eslint/utils@8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3)': dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.30.1) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.30.1(jiti@2.4.2)) '@typescript-eslint/scope-manager': 8.35.1 '@typescript-eslint/types': 8.35.1 '@typescript-eslint/typescript-estree': 8.35.1(typescript@5.8.3) - eslint: 9.30.1 + eslint: 9.30.1(jiti@2.4.2) typescript: 5.8.3 transitivePeerDependencies: - supports-color @@ -3461,7 +4471,7 @@ snapshots: '@typescript-eslint/types': 8.35.1 eslint-visitor-keys: 4.2.1 - '@vitejs/plugin-react@4.6.0(vite@6.3.5(@types/node@22.16.0))': + '@vitejs/plugin-react@4.6.0(vite@6.3.5(@types/node@22.16.0)(jiti@2.4.2)(lightningcss@1.30.1))': dependencies: '@babel/core': 7.28.0 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.0) @@ -3469,7 +4479,7 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.19 '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 6.3.5(@types/node@22.16.0) + vite: 6.3.5(@types/node@22.16.0)(jiti@2.4.2)(lightningcss@1.30.1) transitivePeerDependencies: - supports-color @@ -3608,6 +4618,10 @@ snapshots: argparse@2.0.1: {} + aria-hidden@1.2.6: + dependencies: + tslib: 2.8.1 + array-buffer-byte-length@1.0.2: dependencies: call-bound: 1.0.4 @@ -3685,6 +4699,14 @@ snapshots: dependencies: possible-typed-array-names: 1.1.0 + axios@1.10.0: + dependencies: + follow-redirects: 1.15.9 + form-data: 4.0.3 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + balanced-match@1.0.2: {} base64-js@1.5.1: {} @@ -3833,10 +4855,16 @@ snapshots: chownr@2.0.0: {} + chownr@3.0.0: {} + chromium-pickle-js@0.2.0: {} ci-info@3.9.0: {} + class-variance-authority@0.7.1: + dependencies: + clsx: 2.1.1 + clean-stack@2.2.0: {} cli-cursor@3.1.0: @@ -3863,6 +4891,8 @@ snapshots: clone@1.0.4: {} + clsx@2.1.1: {} + color-convert@2.0.1: dependencies: color-name: 1.1.4 @@ -3940,6 +4970,10 @@ snapshots: es-errors: 1.3.0 is-data-view: 1.0.2 + debug@4.3.7: + dependencies: + ms: 2.1.3 + debug@4.4.1: dependencies: ms: 2.1.3 @@ -3974,6 +5008,8 @@ snapshots: detect-libc@2.0.4: {} + detect-node-es@1.1.0: {} + detect-node@2.1.0: optional: true @@ -4019,6 +5055,8 @@ snapshots: dotenv@16.6.1: {} + dotenv@17.0.1: {} + dunder-proto@1.0.1: dependencies: call-bind-apply-helpers: 1.0.2 @@ -4086,7 +5124,7 @@ snapshots: transitivePeerDependencies: - supports-color - electron-vite@3.1.0(vite@6.3.5(@types/node@22.16.0)): + electron-vite@3.1.0(vite@6.3.5(@types/node@22.16.0)(jiti@2.4.2)(lightningcss@1.30.1)): dependencies: '@babel/core': 7.28.0 '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.28.0) @@ -4094,7 +5132,7 @@ snapshots: esbuild: 0.25.5 magic-string: 0.30.17 picocolors: 1.1.1 - vite: 6.3.5(@types/node@22.16.0) + vite: 6.3.5(@types/node@22.16.0)(jiti@2.4.2)(lightningcss@1.30.1) transitivePeerDependencies: - supports-color @@ -4119,6 +5157,25 @@ snapshots: dependencies: once: 1.4.0 + engine.io-client@6.6.3: + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.3.7 + engine.io-parser: 5.2.3 + ws: 8.17.1 + xmlhttprequest-ssl: 2.1.2 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + engine.io-parser@5.2.3: {} + + enhanced-resolve@5.18.2: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.2 + env-paths@2.2.1: {} err-code@2.0.3: {} @@ -4259,28 +5316,28 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-config-prettier@10.1.5(eslint@9.30.1): + eslint-config-prettier@10.1.5(eslint@9.30.1(jiti@2.4.2)): dependencies: - eslint: 9.30.1 + eslint: 9.30.1(jiti@2.4.2) - eslint-plugin-prettier@5.5.1(eslint-config-prettier@10.1.5(eslint@9.30.1))(eslint@9.30.1)(prettier@3.6.2): + eslint-plugin-prettier@5.5.1(eslint-config-prettier@10.1.5(eslint@9.30.1(jiti@2.4.2)))(eslint@9.30.1(jiti@2.4.2))(prettier@3.6.2): dependencies: - eslint: 9.30.1 + eslint: 9.30.1(jiti@2.4.2) prettier: 3.6.2 prettier-linter-helpers: 1.0.0 synckit: 0.11.8 optionalDependencies: - eslint-config-prettier: 10.1.5(eslint@9.30.1) + eslint-config-prettier: 10.1.5(eslint@9.30.1(jiti@2.4.2)) - eslint-plugin-react-hooks@5.2.0(eslint@9.30.1): + eslint-plugin-react-hooks@5.2.0(eslint@9.30.1(jiti@2.4.2)): dependencies: - eslint: 9.30.1 + eslint: 9.30.1(jiti@2.4.2) - eslint-plugin-react-refresh@0.4.20(eslint@9.30.1): + eslint-plugin-react-refresh@0.4.20(eslint@9.30.1(jiti@2.4.2)): dependencies: - eslint: 9.30.1 + eslint: 9.30.1(jiti@2.4.2) - eslint-plugin-react@7.37.5(eslint@9.30.1): + eslint-plugin-react@7.37.5(eslint@9.30.1(jiti@2.4.2)): dependencies: array-includes: 3.1.9 array.prototype.findlast: 1.2.5 @@ -4288,7 +5345,7 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.2.1 - eslint: 9.30.1 + eslint: 9.30.1(jiti@2.4.2) estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 @@ -4311,9 +5368,9 @@ snapshots: eslint-visitor-keys@4.2.1: {} - eslint@9.30.1: + eslint@9.30.1(jiti@2.4.2): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.30.1) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.30.1(jiti@2.4.2)) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.21.0 '@eslint/config-helpers': 0.3.0 @@ -4348,6 +5405,8 @@ snapshots: minimatch: 3.1.2 natural-compare: 1.4.0 optionator: 0.9.4 + optionalDependencies: + jiti: 2.4.2 transitivePeerDependencies: - supports-color @@ -4436,6 +5495,8 @@ snapshots: flatted@3.3.3: {} + follow-redirects@1.15.9: {} + for-each@0.3.5: dependencies: is-callable: 1.2.7 @@ -4530,6 +5591,8 @@ snapshots: hasown: 2.0.2 math-intrinsics: 1.1.0 + get-nonce@1.0.1: {} + get-proto@1.0.1: dependencies: dunder-proto: 1.0.1 @@ -4882,6 +5945,8 @@ snapshots: filelist: 1.0.4 minimatch: 3.1.2 + jiti@2.4.2: {} + js-tokens@4.0.0: {} js-yaml@4.1.0: @@ -4935,6 +6000,51 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 + lightningcss-darwin-arm64@1.30.1: + optional: true + + lightningcss-darwin-x64@1.30.1: + optional: true + + lightningcss-freebsd-x64@1.30.1: + optional: true + + lightningcss-linux-arm-gnueabihf@1.30.1: + optional: true + + lightningcss-linux-arm64-gnu@1.30.1: + optional: true + + lightningcss-linux-arm64-musl@1.30.1: + optional: true + + lightningcss-linux-x64-gnu@1.30.1: + optional: true + + lightningcss-linux-x64-musl@1.30.1: + optional: true + + lightningcss-win32-arm64-msvc@1.30.1: + optional: true + + lightningcss-win32-x64-msvc@1.30.1: + optional: true + + lightningcss@1.30.1: + dependencies: + detect-libc: 2.0.4 + optionalDependencies: + lightningcss-darwin-arm64: 1.30.1 + lightningcss-darwin-x64: 1.30.1 + lightningcss-freebsd-x64: 1.30.1 + lightningcss-linux-arm-gnueabihf: 1.30.1 + lightningcss-linux-arm64-gnu: 1.30.1 + lightningcss-linux-arm64-musl: 1.30.1 + lightningcss-linux-x64-gnu: 1.30.1 + lightningcss-linux-x64-musl: 1.30.1 + lightningcss-win32-arm64-msvc: 1.30.1 + lightningcss-win32-x64-msvc: 1.30.1 + locate-path@6.0.0: dependencies: p-locate: 5.0.0 @@ -4980,6 +6090,10 @@ snapshots: lru-cache@7.18.3: {} + lucide-react@0.525.0(react@19.1.0): + dependencies: + react: 19.1.0 + magic-string@0.30.17: dependencies: '@jridgewell/sourcemap-codec': 1.5.4 @@ -5089,8 +6203,16 @@ snapshots: minipass: 3.3.6 yallist: 4.0.0 + minizlib@3.0.2: + dependencies: + minipass: 7.1.2 + mkdirp@1.0.4: {} + mkdirp@3.0.1: {} + + monaco-editor@0.52.2: {} + ms@2.1.3: {} nanoid@3.3.11: {} @@ -5099,6 +6221,11 @@ snapshots: negotiator@0.6.4: {} + next-themes@0.4.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + dependencies: + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + node-abi@3.75.0: dependencies: semver: 7.7.2 @@ -5252,6 +6379,8 @@ snapshots: pend@1.2.0: {} + perf_hooks@0.0.1: {} + picocolors@1.1.1: {} picomatch@2.3.1: {} @@ -5297,6 +6426,8 @@ snapshots: object-assign: 4.1.1 react-is: 16.13.1 + proxy-from-env@1.1.0: {} + pump@3.0.3: dependencies: end-of-stream: 1.4.5 @@ -5317,6 +6448,33 @@ snapshots: react-refresh@0.17.0: {} + react-remove-scroll-bar@2.3.8(@types/react@19.1.8)(react@19.1.0): + dependencies: + react: 19.1.0 + react-style-singleton: 2.2.3(@types/react@19.1.8)(react@19.1.0) + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.1.8 + + react-remove-scroll@2.7.1(@types/react@19.1.8)(react@19.1.0): + dependencies: + react: 19.1.0 + react-remove-scroll-bar: 2.3.8(@types/react@19.1.8)(react@19.1.0) + react-style-singleton: 2.2.3(@types/react@19.1.8)(react@19.1.0) + tslib: 2.8.1 + use-callback-ref: 1.3.3(@types/react@19.1.8)(react@19.1.0) + use-sidecar: 1.1.3(@types/react@19.1.8)(react@19.1.0) + optionalDependencies: + '@types/react': 19.1.8 + + react-style-singleton@2.2.3(@types/react@19.1.8)(react@19.1.0): + dependencies: + get-nonce: 1.0.1 + react: 19.1.0 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.1.8 + react@19.1.0: {} read-binary-file-arch@1.0.6: @@ -5558,6 +6716,24 @@ snapshots: smart-buffer@4.2.0: {} + socket.io-client@4.8.1: + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.3.7 + engine.io-client: 6.6.3 + socket.io-parser: 4.2.4 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + socket.io-parser@4.2.4: + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.3.7 + transitivePeerDependencies: + - supports-color + socks-proxy-agent@7.0.0: dependencies: agent-base: 6.0.2 @@ -5571,6 +6747,11 @@ snapshots: ip-address: 9.0.5 smart-buffer: 4.2.0 + sonner@2.0.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0): + dependencies: + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + source-map-js@1.2.1: {} source-map-support@0.5.21: @@ -5588,6 +6769,8 @@ snapshots: stat-mode@1.0.0: {} + state-local@1.0.7: {} + stop-iteration-iterator@1.1.0: dependencies: es-errors: 1.3.0 @@ -5683,6 +6866,12 @@ snapshots: dependencies: '@pkgr/core': 0.2.7 + tailwind-merge@3.3.1: {} + + tailwindcss@4.1.11: {} + + tapable@2.2.2: {} + tar-stream@2.2.0: dependencies: bl: 4.1.0 @@ -5700,6 +6889,15 @@ snapshots: mkdirp: 1.0.4 yallist: 4.0.0 + tar@7.4.3: + dependencies: + '@isaacs/fs-minipass': 4.0.1 + chownr: 3.0.0 + minipass: 7.1.2 + minizlib: 3.0.2 + mkdirp: 3.0.1 + yallist: 5.0.0 + temp-file@3.4.0: dependencies: async-exit-hook: 2.0.1 @@ -5730,6 +6928,10 @@ snapshots: dependencies: typescript: 5.8.3 + tslib@2.8.1: {} + + tw-animate-css@1.3.5: {} + type-check@0.4.0: dependencies: prelude-ls: 1.2.1 @@ -5770,12 +6972,12 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 - typescript-eslint@8.35.1(eslint@9.30.1)(typescript@5.8.3): + typescript-eslint@8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.35.1(@typescript-eslint/parser@8.35.1(eslint@9.30.1)(typescript@5.8.3))(eslint@9.30.1)(typescript@5.8.3) - '@typescript-eslint/parser': 8.35.1(eslint@9.30.1)(typescript@5.8.3) - '@typescript-eslint/utils': 8.35.1(eslint@9.30.1)(typescript@5.8.3) - eslint: 9.30.1 + '@typescript-eslint/eslint-plugin': 8.35.1(@typescript-eslint/parser@8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/parser': 8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/utils': 8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) + eslint: 9.30.1(jiti@2.4.2) typescript: 5.8.3 transitivePeerDependencies: - supports-color @@ -5813,6 +7015,21 @@ snapshots: dependencies: punycode: 2.3.1 + use-callback-ref@1.3.3(@types/react@19.1.8)(react@19.1.0): + dependencies: + react: 19.1.0 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.1.8 + + use-sidecar@1.1.3(@types/react@19.1.8)(react@19.1.0): + dependencies: + detect-node-es: 1.1.0 + react: 19.1.0 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 19.1.8 + utf8-byte-length@1.0.5: {} util-deprecate@1.0.2: {} @@ -5824,7 +7041,7 @@ snapshots: extsprintf: 1.4.1 optional: true - vite@6.3.5(@types/node@22.16.0): + vite@6.3.5(@types/node@22.16.0)(jiti@2.4.2)(lightningcss@1.30.1): dependencies: esbuild: 0.25.5 fdir: 6.4.6(picomatch@4.0.2) @@ -5835,6 +7052,8 @@ snapshots: optionalDependencies: '@types/node': 22.16.0 fsevents: 2.3.3 + jiti: 2.4.2 + lightningcss: 1.30.1 wcwidth@1.0.1: dependencies: @@ -5905,14 +7124,20 @@ snapshots: wrappy@1.0.2: {} + ws@8.17.1: {} + xmlbuilder@15.1.1: {} + xmlhttprequest-ssl@2.1.2: {} + y18n@5.0.8: {} yallist@3.1.1: {} yallist@4.0.0: {} + yallist@5.0.0: {} + yargs-parser@21.1.1: {} yargs@17.7.2: diff --git a/desktop/src/main/index.ts b/desktop/src/main/index.ts index 58f9a0f..297dfbd 100644 --- a/desktop/src/main/index.ts +++ b/desktop/src/main/index.ts @@ -1,12 +1,16 @@ -import { app, shell, BrowserWindow, ipcMain } from 'electron' -import { join } from 'path' -import { electronApp, optimizer, is } from '@electron-toolkit/utils' -import icon from '../../resources/icon.png?asset' +import { app, shell, BrowserWindow, ipcMain, protocol } from "electron"; +import { join } from "path"; +import { electronApp, optimizer, is } from "@electron-toolkit/utils"; +import icon from "../../resources/icon.png?asset"; +import { existsSync, readFileSync } from "fs"; +import dotenv from "dotenv"; +import { handleExecuteCode } from "./lib/execute-code"; +dotenv.config(); function createWindow(): void { // Create the browser window. const mainWindow = new BrowserWindow({ - title: 'Execute Me - Code execution Platform', + title: "Execute Me - Code execution Platform", darkTheme: true, center: true, hasShadow: true, @@ -15,65 +19,68 @@ function createWindow(): void { height: 670, show: false, autoHideMenuBar: true, - ...(process.platform === 'linux' ? { icon } : {}), + ...(process.platform === "linux" ? { icon } : {}), webPreferences: { - preload: join(__dirname, '../preload/index.js'), - sandbox: false + preload: join(__dirname, "../preload/index.js"), + nodeIntegration: false, + contextIsolation: true, + sandbox: true } - }) + }); - mainWindow.on('ready-to-show', () => { - mainWindow.show() - }) + mainWindow.on("ready-to-show", () => { + mainWindow.show(); + }); mainWindow.webContents.setWindowOpenHandler((details) => { - shell.openExternal(details.url) - return { action: 'deny' } - }) + shell.openExternal(details.url); + return { action: "deny" }; + }); - // HMR for renderer base on electron-vite cli. - // Load the remote URL for development or the local html file for production. - if (is.dev && process.env['ELECTRON_RENDERER_URL']) { - mainWindow.loadURL(process.env['ELECTRON_RENDERER_URL']) + if (is.dev && process.env["ELECTRON_RENDERER_URL"]) { + mainWindow.webContents.openDevTools(); + mainWindow.loadURL(process.env["ELECTRON_RENDERER_URL"]); } else { - mainWindow.loadFile(join(__dirname, '../renderer/index.html')) + mainWindow.loadFile(join(__dirname, "../renderer/index.html")); } } -// This method will be called when Electron has finished -// initialization and is ready to create browser windows. -// Some APIs can only be used after this event occurs. app.whenReady().then(() => { - // Set app user model id for windows - electronApp.setAppUserModelId('com.executeme') + is.dev && app.commandLine.appendSwitch("ignore-certificate-errors"); + // Register the custom protocol to serve Monaco Editor worker files locally + ipcMain.handle("executecode:post", handleExecuteCode); + protocol.handle("monaco-editor", (request) => { + const url = request.url.substr("monaco-editor://".length); - // Default open or close DevTools by F12 in development - // and ignore CommandOrControl + R in production. - // see https://github.com/alex8088/electron-toolkit/tree/master/packages/utils - app.on('browser-window-created', (_, window) => { - optimizer.watchWindowShortcuts(window) - }) + let monacoBasePath; + if (is.dev) { + monacoBasePath = join(__dirname, "../../node_modules/monaco-editor/min"); + } else { + monacoBasePath = join(app.getAppPath(), "node_modules/monaco-editor/min"); + } + const filePath = join(monacoBasePath, url); + if (existsSync(filePath)) { + return new Response(readFileSync(filePath)); + } else { + console.error("Monaco Editor file not found:", filePath); + return new Response("File not found", { status: 404 }); + } + }); - // IPC test - ipcMain.on('ping', () => console.log('pong')) + electronApp.setAppUserModelId("com.executeme"); + app.on("browser-window-created", (_, window) => { + optimizer.watchWindowShortcuts(window); + }); - createWindow() + createWindow(); - app.on('activate', function () { - // On macOS it's common to re-create a window in the app when the - // dock icon is clicked and there are no other windows open. - if (BrowserWindow.getAllWindows().length === 0) createWindow() - }) -}) + app.on("activate", function () { + if (BrowserWindow.getAllWindows().length === 0) createWindow(); + }); +}); -// Quit when all windows are closed, except on macOS. There, it's common -// for applications and their menu bar to stay active until the user quits -// explicitly with Cmd + Q. -app.on('window-all-closed', () => { - if (process.platform !== 'darwin') { - app.quit() +app.on("window-all-closed", () => { + if (process.platform !== "darwin") { + app.quit(); } -}) - -// In this file you can include the rest of your app's specific main process -// code. You can also put them in separate files and require them here. +}); diff --git a/desktop/src/main/lib/code-editor.ts b/desktop/src/main/lib/code-editor.ts new file mode 100644 index 0000000..4582821 --- /dev/null +++ b/desktop/src/main/lib/code-editor.ts @@ -0,0 +1,3 @@ +export const handleCodeEditor = (_, payload) => { + console.log(payload); +}; diff --git a/desktop/src/main/lib/execute-code.ts b/desktop/src/main/lib/execute-code.ts new file mode 100644 index 0000000..eda0e08 --- /dev/null +++ b/desktop/src/main/lib/execute-code.ts @@ -0,0 +1,35 @@ +import { Input } from "@shared/types"; +import { IpcMainInvokeEvent } from "electron"; +import https from "https"; +import axios from "axios"; +import { is } from "@electron-toolkit/utils"; + +export const handleExecuteCode = async (_: IpcMainInvokeEvent, payload: Input) => { + const agent = new https.Agent({ + rejectUnauthorized: false + }); + const axiosInstance = axios.create({ + httpsAgent: agent + }); + const baseAPI = is.dev + ? process.env.RENDERER_VITE_SERVER_BASE_URL + : process.env.RENDERER_VITE_SERVER_BASE_URL; + const start = performance.now(); + try { + const { data } = await axiosInstance.post(`${baseAPI}/run`, payload); + const end = performance.now(); + return { + output: data.output, + responseTime: Math.round(end - start) + }; + } catch (error: any) { + const end = performance.now(); + + const output = error?.response?.data?.details || error?.message || "Unknown error occurred"; + + return { + output, + responseTime: Math.round(end - start) + }; + } +}; diff --git a/desktop/src/preload/index.d.ts b/desktop/src/preload/index.d.ts index a153669..3eef55e 100644 --- a/desktop/src/preload/index.d.ts +++ b/desktop/src/preload/index.d.ts @@ -1,8 +1,17 @@ -import { ElectronAPI } from '@electron-toolkit/preload' +// import { electronAPI } from "@electron-toolkit/preload"; +import { Input, Output } from "@shared/types"; + +export interface ApplicationInterface { + // electron: typeof electronAPI; + + api: { + getMonacoBasePath: () => string; + executeCode: (payload: Input) => Promise; + }; +} declare global { interface Window { - electron: ElectronAPI - api: unknown + applicationApi: ApplicationInterface; } } diff --git a/desktop/src/preload/index.ts b/desktop/src/preload/index.ts index 2d18524..c00e61d 100644 --- a/desktop/src/preload/index.ts +++ b/desktop/src/preload/index.ts @@ -1,22 +1,23 @@ -import { contextBridge } from 'electron' -import { electronAPI } from '@electron-toolkit/preload' +import { contextBridge, ipcRenderer } from "electron"; +// import { electronAPI } from "@electron-toolkit/preload"; +import { Input } from "@shared/types"; +import { ApplicationInterface } from "./preload"; -// Custom APIs for renderer -const api = {} +const applicationApi: ApplicationInterface = { + // electron: electronAPI, + + api: { + getMonacoBasePath: () => "monaco-editor://vs", + executeCode: (payload: Input) => ipcRenderer.invoke("executecode:post", payload) + } +}; -// Use `contextBridge` APIs to expose Electron APIs to -// renderer only if context isolation is enabled, otherwise -// just add to the DOM global. if (process.contextIsolated) { try { - contextBridge.exposeInMainWorld('electron', electronAPI) - contextBridge.exposeInMainWorld('api', api) + contextBridge.exposeInMainWorld("applicationApi", applicationApi); } catch (error) { - console.error(error) + console.error("Failed to expose API:", error); } } else { - // @ts-ignore (define in dts) - window.electron = electronAPI - // @ts-ignore (define in dts) - window.api = api + window.applicationApi = applicationApi; } diff --git a/desktop/src/preload/preload.d.ts b/desktop/src/preload/preload.d.ts new file mode 100644 index 0000000..a31e33e --- /dev/null +++ b/desktop/src/preload/preload.d.ts @@ -0,0 +1,17 @@ +// import { electronAPI } from "@electron-toolkit/preload"; +import { Input, Output } from "@shared/types"; + +export interface ApplicationInterface { + // electron: typeof electronAPI; + + api: { + getMonacoBasePath: () => string; + executeCode: (payload: Input) => Promise; + }; +} + +declare global { + interface Window { + applicationApi: ApplicationInterface; + } +} diff --git a/desktop/src/renderer/index.html b/desktop/src/renderer/index.html index 5eb1bb9..b0e0323 100644 --- a/desktop/src/renderer/index.html +++ b/desktop/src/renderer/index.html @@ -6,7 +6,14 @@ diff --git a/desktop/src/renderer/src/@types/index.ts b/desktop/src/renderer/src/@types/index.ts new file mode 100644 index 0000000..adeb307 --- /dev/null +++ b/desktop/src/renderer/src/@types/index.ts @@ -0,0 +1,20 @@ +import { LANGUAGE_MAP } from "@renderer/constants"; + +export type Language = keyof typeof LANGUAGE_MAP; +export type Status = "success" | "error" | "running"; + +export type Input = { + language: Language; + code: string; +}; + +export type Output = { + output: string; + responseTime: number; // in milliseconds +}; + +export type ExecutionResult = { + status: Status; + results: Output; + language: Language; +}; diff --git a/desktop/src/renderer/src/App.tsx b/desktop/src/renderer/src/App.tsx index 73de51c..fb91487 100644 --- a/desktop/src/renderer/src/App.tsx +++ b/desktop/src/renderer/src/App.tsx @@ -1,35 +1,23 @@ -import Versions from './components/Versions' -import electronLogo from './assets/electron.svg' - -function App(): React.JSX.Element { - const ipcHandle = (): void => window.electron.ipcRenderer.send('ping') +import Footer from "@renderer/components/shared/footer"; +import DynamicBackground from "@renderer/components/shared/effects/dynamic-background"; +import Header from "@renderer/components/header"; +import CodeInput from "./_components/code-input"; +export default function ExecuteMePlatform() { return ( - <> - logo -
Powered by electron-vite
-
- Build an Electron app with React -  and TypeScript -
-

- Please try pressing F12 to open the devTool -

-
-
- - Documentation - -
-
- - Send IPC - +
+ + +
+
+ +
+
+ + {/* Footer */} +
- - - ) +
+ ); } - -export default App diff --git a/desktop/src/renderer/src/_components/code-input.tsx b/desktop/src/renderer/src/_components/code-input.tsx new file mode 100644 index 0000000..82212bc --- /dev/null +++ b/desktop/src/renderer/src/_components/code-input.tsx @@ -0,0 +1,96 @@ +import { + Card, + CardContent, + CardDescription, + CardHeader, + CardTitle +} from "@renderer/components/ui/card"; +import { Clock, Code2, Play } from "lucide-react"; +import LanguageSelection from "./editor-view/language-selection"; +import { Button } from "@renderer/components/ui/button"; +import { ExecutionResult, Language } from "@renderer/@types"; +import { useState, useTransition } from "react"; +import { CodeEditor } from "./editor-view/code-editor"; +import ResultSection from "./output-view/result-sections"; + +export default function CodeInput() { + const [selectedLanguage, setSelectedLanguage] = useState("typescript"); + const [code, setCode] = useState(""); + const [executionResult, setExecutionResult] = useState(null); + const [isExecuting, startExecution] = useTransition(); + + const executeCode = async () => { + if (!code.trim()) return; + + startExecution(async () => { + setExecutionResult({ + status: "running", + results: { + output: "", + responseTime: 0 + }, + language: selectedLanguage + }); + + const result = await window.applicationApi.api.executeCode({ + language: selectedLanguage, + code + }); + + // Use a simple heuristic: if output contains "Error" or has failed response + const isError = result.output?.toLowerCase().includes("error"); + + setExecutionResult({ + status: isError ? "error" : "success", + results: result, + language: selectedLanguage + }); + }); + }; + + return ( + <> + + +
+ + + Code Editor + + + Write or upload your code with full syntax highlighting + +
+ {/* Language Selection */} + +
+ + + + + +
+ + + ); +} diff --git a/desktop/src/renderer/src/_components/editor-view/code-editor.tsx b/desktop/src/renderer/src/_components/editor-view/code-editor.tsx new file mode 100644 index 0000000..22616f1 --- /dev/null +++ b/desktop/src/renderer/src/_components/editor-view/code-editor.tsx @@ -0,0 +1,66 @@ +import { Editor } from "@monaco-editor/react"; +import { Card, CardContent } from "@renderer/components/ui/card"; +import { Badge } from "@renderer/components/ui/badge"; +import { Loader2 } from "lucide-react"; +import { Language } from "@renderer/@types"; +import { codeEditorOptions } from "@renderer/constants"; + +interface CodeEditorProps { + value: string; + onChange: (value: string) => void; + language: Language; + height?: string; + readOnly?: boolean; +} + +export function CodeEditor({ value, onChange, language, height = "300px" }: CodeEditorProps) { + const handleEditorChange = (newValue: string | undefined) => { + onChange(newValue || ""); + }; + + return ( + + + {/* Top bar for editor controls - now dark */} +
+
+
+ {/* Traffic light dots - adjusted colors for dark theme */} +
+
+
+
+ {/* Language display - adjusted text color */} + {language} +
+ {/* Language Badge */} + + {language.charAt(0).toUpperCase() + language.slice(1)} + +
+ +
+ + +
+ } + /> +
+ + + ); +} diff --git a/desktop/src/renderer/src/_components/editor-view/language-selection.tsx b/desktop/src/renderer/src/_components/editor-view/language-selection.tsx new file mode 100644 index 0000000..9432d08 --- /dev/null +++ b/desktop/src/renderer/src/_components/editor-view/language-selection.tsx @@ -0,0 +1,36 @@ +import { Language } from "@renderer/@types"; +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue +} from "@renderer/components/ui/select"; +import { SUPPORTED_LANGUAGES } from "@renderer/constants/language"; +import { Dispatch, SetStateAction } from "react"; + +type Props = { + selectedLanguage: Language; + setSelectedLanguage: Dispatch>; +}; +export default function LanguageSelection({ selectedLanguage, setSelectedLanguage }: Props) { + return ( +
+ +
+ ); +} diff --git a/desktop/src/renderer/src/_components/output-view/copy-download.tsx b/desktop/src/renderer/src/_components/output-view/copy-download.tsx new file mode 100644 index 0000000..333faf0 --- /dev/null +++ b/desktop/src/renderer/src/_components/output-view/copy-download.tsx @@ -0,0 +1,61 @@ +import { Button } from "@renderer/components/ui/button"; +import { Copy, Download } from "lucide-react"; +import { ExecutionProps } from "./result-sections"; +import { toast } from "sonner"; + +export default function CopyDownload({ executionResult }: ExecutionProps) { + const copyOutput = () => { + try { + navigator.clipboard.writeText(executionResult.results.output); + toast.success("Output is perfectly copy to your clipboard", { + action: { + label: "Undo", + onClick: () => navigator.clipboard.writeText("") + } + }); + } catch { + toast.error("Failed to copy text", { + description: `Please try again or copy manually.`, + action: { + label: "Retry", + onClick: copyOutput + } + }); + } + }; + const downloadOutput = () => { + const blob = new Blob([executionResult.results.output], { + type: "text/plain" + }); + const url = URL.createObjectURL(blob); + const a = document.createElement("a"); + a.href = url; + a.download = `executeme_output_${Date.now()}.txt`; + document.body.appendChild(a); + a.click(); + document.body.removeChild(a); + URL.revokeObjectURL(url); + }; + return ( +
+ + +
+ ); +} diff --git a/desktop/src/renderer/src/_components/output-view/output-header.tsx b/desktop/src/renderer/src/_components/output-view/output-header.tsx new file mode 100644 index 0000000..3c25c4a --- /dev/null +++ b/desktop/src/renderer/src/_components/output-view/output-header.tsx @@ -0,0 +1,29 @@ +import { Badge } from "@renderer/components/ui/badge"; +import { Terminal } from "lucide-react"; +import { ExecutionProps } from "./result-sections"; + +export default function OutputHeader({ executionResult }: ExecutionProps) { + return ( +
+ {/* Adjusted icon color */} + Output {/* Adjusted text color */} + {executionResult.results.responseTime !== undefined && ( // Check for undefined instead of truthiness to allow 0ms + + {executionResult.results.responseTime.toFixed(0)}ms + + )} + + {executionResult.status} + +
+ ); +} diff --git a/desktop/src/renderer/src/_components/output-view/result-sections.tsx b/desktop/src/renderer/src/_components/output-view/result-sections.tsx new file mode 100644 index 0000000..e4ca816 --- /dev/null +++ b/desktop/src/renderer/src/_components/output-view/result-sections.tsx @@ -0,0 +1,52 @@ +import { + Card, + CardContent, + CardDescription, + CardHeader, + CardTitle +} from "@renderer/components/ui/card"; +import { FileText, Play } from "lucide-react"; +import { OutputViewer } from "../output-viewer"; +import { ExecutionResult } from "@renderer/@types"; +import Loading from "@renderer/components/loading/loading"; + +export type ExecutionProps = { + executionResult: ExecutionResult; +}; +type Props = { optional: ExecutionResult | null; isExecuting: boolean }; + +export default function ResultSection({ optional, isExecuting }: Props) { + return ( + + + + + Execution Results + + Output and execution details + + + {isExecuting ? ( +
+
+
+ +
+
+

Executing your code, step-by-step...

+

+ Ensuring isolation and efficiency at every stage. +

+
+ ) : !optional ? ( +
+ +

Execute your code to see results here

+
+ ) : ( + + )} +
+
+ ); +} diff --git a/desktop/src/renderer/src/_components/output-viewer.tsx b/desktop/src/renderer/src/_components/output-viewer.tsx new file mode 100644 index 0000000..cdbeb80 --- /dev/null +++ b/desktop/src/renderer/src/_components/output-viewer.tsx @@ -0,0 +1,32 @@ +import { Editor } from "@monaco-editor/react"; +import { Card, CardContent } from "@renderer/components/ui/card"; +import { outputEditorOptions } from "@renderer/constants"; +import { ExecutionProps } from "./output-view/result-sections"; +import CopyDownload from "./output-view/copy-download"; +import OutputHeader from "./output-view/output-header"; + +export function OutputViewer({ executionResult }: ExecutionProps) { + return ( + + + {/* Top bar for output controls - now dark */} +
+ + +
+ +
+ +
+
+
+ ); +} diff --git a/desktop/src/renderer/src/assets/BMC-btn-logo.svg b/desktop/src/renderer/src/assets/BMC-btn-logo.svg new file mode 100644 index 0000000..cedc1eb --- /dev/null +++ b/desktop/src/renderer/src/assets/BMC-btn-logo.svg @@ -0,0 +1,71 @@ + +Group +Created using Figma + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/desktop/src/renderer/src/assets/base.css b/desktop/src/renderer/src/assets/base.css deleted file mode 100644 index 5ed6406..0000000 --- a/desktop/src/renderer/src/assets/base.css +++ /dev/null @@ -1,67 +0,0 @@ -:root { - --ev-c-white: #ffffff; - --ev-c-white-soft: #f8f8f8; - --ev-c-white-mute: #f2f2f2; - - --ev-c-black: #1b1b1f; - --ev-c-black-soft: #222222; - --ev-c-black-mute: #282828; - - --ev-c-gray-1: #515c67; - --ev-c-gray-2: #414853; - --ev-c-gray-3: #32363f; - - --ev-c-text-1: rgba(255, 255, 245, 0.86); - --ev-c-text-2: rgba(235, 235, 245, 0.6); - --ev-c-text-3: rgba(235, 235, 245, 0.38); - - --ev-button-alt-border: transparent; - --ev-button-alt-text: var(--ev-c-text-1); - --ev-button-alt-bg: var(--ev-c-gray-3); - --ev-button-alt-hover-border: transparent; - --ev-button-alt-hover-text: var(--ev-c-text-1); - --ev-button-alt-hover-bg: var(--ev-c-gray-2); -} - -:root { - --color-background: var(--ev-c-black); - --color-background-soft: var(--ev-c-black-soft); - --color-background-mute: var(--ev-c-black-mute); - - --color-text: var(--ev-c-text-1); -} - -*, -*::before, -*::after { - box-sizing: border-box; - margin: 0; - font-weight: normal; -} - -ul { - list-style: none; -} - -body { - min-height: 100vh; - color: var(--color-text); - background: var(--color-background); - line-height: 1.6; - font-family: - Inter, - -apple-system, - BlinkMacSystemFont, - 'Segoe UI', - Roboto, - Oxygen, - Ubuntu, - Cantarell, - 'Fira Sans', - 'Droid Sans', - 'Helvetica Neue', - sans-serif; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} diff --git a/desktop/src/renderer/src/assets/main.css b/desktop/src/renderer/src/assets/main.css index 0179fc4..02687bd 100644 --- a/desktop/src/renderer/src/assets/main.css +++ b/desktop/src/renderer/src/assets/main.css @@ -1,171 +1,123 @@ -@import './base.css'; - -body { - display: flex; - align-items: center; - justify-content: center; - overflow: hidden; - background-image: url('./wavy-lines.svg'); - background-size: cover; - user-select: none; -} - -code { - font-weight: 600; - padding: 3px 5px; - border-radius: 2px; - background-color: var(--color-background-mute); - font-family: - ui-monospace, - SFMono-Regular, - SF Mono, - Menlo, - Consolas, - Liberation Mono, - monospace; - font-size: 85%; -} - -#root { - display: flex; - align-items: center; - justify-content: center; - flex-direction: column; - margin-bottom: 80px; -} - -.logo { - margin-bottom: 20px; - -webkit-user-drag: none; - height: 128px; - width: 128px; - will-change: filter; - transition: filter 300ms; -} - -.logo:hover { - filter: drop-shadow(0 0 1.2em #6988e6aa); -} - -.creator { - font-size: 14px; - line-height: 16px; - color: var(--ev-c-text-2); - font-weight: 600; - margin-bottom: 10px; -} - -.text { - font-size: 28px; - color: var(--ev-c-text-1); - font-weight: 700; - line-height: 32px; - text-align: center; - margin: 0 10px; - padding: 16px 0; -} - -.tip { - font-size: 16px; - line-height: 24px; - color: var(--ev-c-text-2); - font-weight: 600; -} - -.react { - background: -webkit-linear-gradient(315deg, #087ea4 55%, #7c93ee); - background-clip: text; - -webkit-background-clip: text; - -webkit-text-fill-color: transparent; - font-weight: 700; -} - -.ts { - background: -webkit-linear-gradient(315deg, #3178c6 45%, #f0dc4e); - background-clip: text; - -webkit-background-clip: text; - -webkit-text-fill-color: transparent; - font-weight: 700; -} - -.actions { - display: flex; - padding-top: 32px; - margin: -6px; - flex-wrap: wrap; - justify-content: flex-start; -} - -.action { - flex-shrink: 0; - padding: 6px; -} - -.action a { - cursor: pointer; - text-decoration: none; - display: inline-block; - border: 1px solid transparent; - text-align: center; - font-weight: 600; - white-space: nowrap; - border-radius: 20px; - padding: 0 20px; - line-height: 38px; - font-size: 14px; - border-color: var(--ev-button-alt-border); - color: var(--ev-button-alt-text); - background-color: var(--ev-button-alt-bg); -} - -.action a:hover { - border-color: var(--ev-button-alt-hover-border); - color: var(--ev-button-alt-hover-text); - background-color: var(--ev-button-alt-hover-bg); -} - -.versions { - position: absolute; - bottom: 30px; - margin: 0 auto; - padding: 15px 0; - font-family: 'Menlo', 'Lucida Console', monospace; - display: inline-flex; - overflow: hidden; - align-items: center; - border-radius: 22px; - background-color: #202127; - backdrop-filter: blur(24px); -} - -.versions li { - display: block; - float: left; - border-right: 1px solid var(--ev-c-gray-1); - padding: 0 20px; - font-size: 14px; - line-height: 14px; - opacity: 0.8; - &:last-child { - border: none; +@import 'tailwindcss'; +@import 'tw-animate-css'; + +@custom-variant dark (&:is(.dark *)); + +:root { + --background: oklch(1 0 0); + --foreground: oklch(0.145 0 0); + --card: oklch(1 0 0); + --card-foreground: oklch(0.145 0 0); + --popover: oklch(1 0 0); + --popover-foreground: oklch(0.145 0 0); + --primary: oklch(0.205 0 0); + --primary-foreground: oklch(0.985 0 0); + --secondary: oklch(0.97 0 0); + --secondary-foreground: oklch(0.205 0 0); + --muted: oklch(0.97 0 0); + --muted-foreground: oklch(0.556 0 0); + --accent: oklch(0.97 0 0); + --accent-foreground: oklch(0.205 0 0); + --destructive: oklch(0.577 0.245 27.325); + --destructive-foreground: oklch(0.577 0.245 27.325); + --border: oklch(0.922 0 0); + --input: oklch(0.922 0 0); + --ring: oklch(0.708 0 0); + --chart-1: oklch(0.646 0.222 41.116); + --chart-2: oklch(0.6 0.118 184.704); + --chart-3: oklch(0.398 0.07 227.392); + --chart-4: oklch(0.828 0.189 84.429); + --chart-5: oklch(0.769 0.188 70.08); + --radius: 0.625rem; + --sidebar: oklch(0.985 0 0); + --sidebar-foreground: oklch(0.145 0 0); + --sidebar-primary: oklch(0.205 0 0); + --sidebar-primary-foreground: oklch(0.985 0 0); + --sidebar-accent: oklch(0.97 0 0); + --sidebar-accent-foreground: oklch(0.205 0 0); + --sidebar-border: oklch(0.922 0 0); + --sidebar-ring: oklch(0.708 0 0); +} + +.dark { + --background: oklch(0.145 0 0); + --foreground: oklch(0.985 0 0); + --card: oklch(0.145 0 0); + --card-foreground: oklch(0.985 0 0); + --popover: oklch(0.145 0 0); + --popover-foreground: oklch(0.985 0 0); + --primary: oklch(0.985 0 0); + --primary-foreground: oklch(0.205 0 0); + --secondary: oklch(0.269 0 0); + --secondary-foreground: oklch(0.985 0 0); + --muted: oklch(0.269 0 0); + --muted-foreground: oklch(0.708 0 0); + --accent: oklch(0.269 0 0); + --accent-foreground: oklch(0.985 0 0); + --destructive: oklch(0.396 0.141 25.723); + --destructive-foreground: oklch(0.637 0.237 25.331); + --border: oklch(0.269 0 0); + --input: oklch(0.269 0 0); + --ring: oklch(0.439 0 0); + --chart-1: oklch(0.488 0.243 264.376); + --chart-2: oklch(0.696 0.17 162.48); + --chart-3: oklch(0.769 0.188 70.08); + --chart-4: oklch(0.627 0.265 303.9); + --chart-5: oklch(0.645 0.246 16.439); + --sidebar: oklch(0.205 0 0); + --sidebar-foreground: oklch(0.985 0 0); + --sidebar-primary: oklch(0.488 0.243 264.376); + --sidebar-primary-foreground: oklch(0.985 0 0); + --sidebar-accent: oklch(0.269 0 0); + --sidebar-accent-foreground: oklch(0.985 0 0); + --sidebar-border: oklch(0.269 0 0); + --sidebar-ring: oklch(0.439 0 0); +} + +@theme inline { + --color-background: var(--background); + --color-foreground: var(--foreground); + --color-card: var(--card); + --color-card-foreground: var(--card-foreground); + --color-popover: var(--popover); + --color-popover-foreground: var(--popover-foreground); + --color-primary: var(--primary); + --color-primary-foreground: var(--primary-foreground); + --color-secondary: var(--secondary); + --color-secondary-foreground: var(--secondary-foreground); + --color-muted: var(--muted); + --color-muted-foreground: var(--muted-foreground); + --color-accent: var(--accent); + --color-accent-foreground: var(--accent-foreground); + --color-destructive: var(--destructive); + --color-destructive-foreground: var(--destructive-foreground); + --color-border: var(--border); + --color-input: var(--input); + --color-ring: var(--ring); + --color-chart-1: var(--chart-1); + --color-chart-2: var(--chart-2); + --color-chart-3: var(--chart-3); + --color-chart-4: var(--chart-4); + --color-chart-5: var(--chart-5); + --radius-sm: calc(var(--radius) - 4px); + --radius-md: calc(var(--radius) - 2px); + --radius-lg: var(--radius); + --radius-xl: calc(var(--radius) + 4px); + --color-sidebar: var(--sidebar); + --color-sidebar-foreground: var(--sidebar-foreground); + --color-sidebar-primary: var(--sidebar-primary); + --color-sidebar-primary-foreground: var(--sidebar-primary-foreground); + --color-sidebar-accent: var(--sidebar-accent); + --color-sidebar-accent-foreground: var(--sidebar-accent-foreground); + --color-sidebar-border: var(--sidebar-border); + --color-sidebar-ring: var(--sidebar-ring); +} + +@layer base { + * { + @apply border-border outline-ring/50; } -} - -@media (max-width: 720px) { - .text { - font-size: 20px; - } -} - -@media (max-width: 620px) { - .versions { - display: none; - } -} - -@media (max-width: 350px) { - .tip, - .actions { - display: none; + body { + @apply bg-background text-foreground; } } diff --git a/desktop/src/renderer/src/components/Versions.tsx b/desktop/src/renderer/src/components/Versions.tsx deleted file mode 100644 index 37a9ff0..0000000 --- a/desktop/src/renderer/src/components/Versions.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import { useState } from 'react' - -function Versions(): React.JSX.Element { - const [versions] = useState(window.electron.process.versions) - - return ( -
    -
  • Electron v{versions.electron}
  • -
  • Chromium v{versions.chrome}
  • -
  • Node v{versions.node}
  • -
- ) -} - -export default Versions diff --git a/desktop/src/renderer/src/components/header.tsx b/desktop/src/renderer/src/components/header.tsx new file mode 100644 index 0000000..3ced1d5 --- /dev/null +++ b/desktop/src/renderer/src/components/header.tsx @@ -0,0 +1,51 @@ +import { Github } from "lucide-react"; +import { Badge } from "./ui/badge"; +import { SUPPORTED_LANGUAGES } from "@renderer/constants/language"; + +export default function Header() { + return ( +
+

+ + Execute + {" "} + Me +

+

+ Run code in any programming language,{" "} + instantly and{" "} + securely. +

+
+ {SUPPORTED_LANGUAGES.slice(0, 6).map((lang) => ( + + {lang.label} + + ))} + + +{SUPPORTED_LANGUAGES.length - 6} more + +
+ + {/* GitHub Icon and Link */} + +
+ ); +} diff --git a/desktop/src/renderer/src/components/loading/loading.tsx b/desktop/src/renderer/src/components/loading/loading.tsx new file mode 100644 index 0000000..f30bad7 --- /dev/null +++ b/desktop/src/renderer/src/components/loading/loading.tsx @@ -0,0 +1,178 @@ +import "./styles.css"; +export default function Loading() { + return ( + + {/* Master animation cycle */} + + + {/* Step 1: Middle - API Request Received - Paper Plane Icon */} + + + + + + + + {/* Step 2: Top Right - Secure Temp Directory - Folder Plus Icon */} + + + + + + + + + + + {/* Step 3: Top Left - Docker Container - Container Icon */} + + + + + + + + + + + + + {/* Step 4: Bottom Right - Output & Errors - Terminal Icon */} + + + + + + + + + + {/* Step 5: Bottom Left - Response & Cleanup - Check Circle Icon */} + + + + + + + + ); +} diff --git a/desktop/src/renderer/src/components/loading/styles.css b/desktop/src/renderer/src/components/loading/styles.css new file mode 100644 index 0000000..1062253 --- /dev/null +++ b/desktop/src/renderer/src/components/loading/styles.css @@ -0,0 +1,79 @@ +.flow-circle { + fill: #3a3a3a; + stroke: #555; + stroke-width: 2; + transition: fill 0.3s ease-in-out, stroke 0.3s ease-in-out; +} + +.active-flow-circle { + fill: #ff6b6b; + stroke: #ff6b6b; + filter: drop-shadow(0 0 8px #ff6b6b); +} + +@keyframes progressStep1 { + 0%, + 16.7% { + opacity: 1; + } + 16.8%, + 100% { + opacity: 0; + } +} +@keyframes progressStep2 { + 0%, + 16.7% { + opacity: 0; + } + 16.8%, + 33.3% { + opacity: 1; + } + 33.4%, + 100% { + opacity: 0; + } +} +@keyframes progressStep3 { + 0%, + 33.3% { + opacity: 0; + } + 33.4%, + 50% { + opacity: 1; + } + 50.1%, + 100% { + opacity: 0; + } +} +@keyframes progressStep4 { + 0%, + 50% { + opacity: 0; + } + 50.1%, + 66.7% { + opacity: 1; + } + 66.8%, + 100% { + opacity: 0; + } +} +@keyframes progressStep5 { + 0%, + 66.7% { + opacity: 0; + } + 66.8%, + 83.3% { + opacity: 1; + } + 83.4%, + 100% { + opacity: 0; + } +} diff --git a/desktop/src/renderer/src/components/shared/effects/dynamic-background.tsx b/desktop/src/renderer/src/components/shared/effects/dynamic-background.tsx new file mode 100644 index 0000000..9b7149d --- /dev/null +++ b/desktop/src/renderer/src/components/shared/effects/dynamic-background.tsx @@ -0,0 +1,9 @@ +export default function DynamicBackground() { + return ( +
+
+
+
+
+ ); +} diff --git a/desktop/src/renderer/src/components/shared/footer.tsx b/desktop/src/renderer/src/components/shared/footer.tsx new file mode 100644 index 0000000..a1914bd --- /dev/null +++ b/desktop/src/renderer/src/components/shared/footer.tsx @@ -0,0 +1,37 @@ +import buymecoffeelogo from "@renderer/assets/BMC-btn-logo.svg"; + +export default function Footer() { + return ( +
+

+ Developed with ❤️ by{" "} + + Sabbir Hossain Shuvo + +

+ {/* Buy Me A Coffee Button */} + +
+ ); +} diff --git a/desktop/src/renderer/src/components/shared/online-coders/content.tsx b/desktop/src/renderer/src/components/shared/online-coders/content.tsx new file mode 100644 index 0000000..0692c00 --- /dev/null +++ b/desktop/src/renderer/src/components/shared/online-coders/content.tsx @@ -0,0 +1,49 @@ +import { Users, Zap } from "lucide-react"; + +type Props = { + displayCount: number; +}; +export default function Content({ displayCount }: Props) { + return ( +
+
+ {/* Animated icon container */} +
+
+
+ +
+
+ +
+

+ Online Coders +

+
+ {/* Animated count */} + + {displayCount.toLocaleString()} + + + {/* Live indicator */} +
+
+ + Live + +
+
+
+
+ + {/* Activity indicator */} +
+
+ +
+
+ Active +
+
+ ); +} diff --git a/desktop/src/renderer/src/components/shared/online-coders/floating-particles.tsx b/desktop/src/renderer/src/components/shared/online-coders/floating-particles.tsx new file mode 100644 index 0000000..e3865e5 --- /dev/null +++ b/desktop/src/renderer/src/components/shared/online-coders/floating-particles.tsx @@ -0,0 +1,20 @@ +export default function FloatingParticles() { + return ( +
+ {[...Array(6)].map((_, i) => ( +
+ ))} +
+ ); +} diff --git a/desktop/src/renderer/src/components/shared/online-coders/online-coders.tsx b/desktop/src/renderer/src/components/shared/online-coders/online-coders.tsx new file mode 100644 index 0000000..41afc25 --- /dev/null +++ b/desktop/src/renderer/src/components/shared/online-coders/online-coders.tsx @@ -0,0 +1,48 @@ +import { useState, useEffect } from "react"; +import { ClassValue } from "clsx"; +import Content from "./content"; +import FloatingParticles from "./floating-particles"; +import { socket } from "@renderer/lib/socket"; +import "./style.css"; + +type Props = { + className?: ClassValue; +}; +export default function OnlineCoders({ className }: Props) { + const [count, setCount] = useState(0); + + useEffect(() => { + const handleActiveCoders = (data: string[]) => { + setCount(data.length || 0); + }; + socket.on("active_coders", handleActiveCoders); + return () => { + socket.off("active_coders", handleActiveCoders); + }; + }, []); + return ( +
+ {/* Background glow effect */} +
+ + {/* Main container with glassmorphism */} +
+ {/* Animated background gradient */} +
+ + {/* Floating particles */} + + + {/* Content */} + + + {/* Bottom accent line */} +
+
+
+ ); +} diff --git a/desktop/src/renderer/src/components/shared/online-coders/style.css b/desktop/src/renderer/src/components/shared/online-coders/style.css new file mode 100644 index 0000000..09e4174 --- /dev/null +++ b/desktop/src/renderer/src/components/shared/online-coders/style.css @@ -0,0 +1,77 @@ +@keyframes gradient-xy { + 0%, + 100% { + transform: translate(0%, 0%) rotate(0deg); + } + 25% { + transform: translate(10%, 10%) rotate(90deg); + } + 50% { + transform: translate(0%, 20%) rotate(180deg); + } + 75% { + transform: translate(-10%, 10%) rotate(270deg); + } +} + +@keyframes gradient-x { + 0%, + 100% { + transform: translateX(-100%); + } + 50% { + transform: translateX(100%); + } +} + +@keyframes float-1 { + 0%, + 100% { + transform: translateY(0px) rotate(0deg); + opacity: 0.4; + } + 50% { + transform: translateY(-20px) rotate(180deg); + opacity: 1; + } +} + +@keyframes float-2 { + 0%, + 100% { + transform: translateY(0px) rotate(0deg); + opacity: 0.6; + } + 50% { + transform: translateY(-15px) rotate(-180deg); + opacity: 0.2; + } +} + +@keyframes float-3 { + 0%, + 100% { + transform: translateY(0px) rotate(0deg); + opacity: 0.3; + } + 50% { + transform: translateY(-25px) rotate(360deg); + opacity: 0.8; + } +} + +.animate-gradient-xy { + animation: gradient-xy 4s ease infinite; +} +.animate-gradient-x { + animation: gradient-x 3s ease infinite; +} +.animate-float-1 { + animation: float-1 6s ease-in-out infinite; +} +.animate-float-2 { + animation: float-2 8s ease-in-out infinite; +} +.animate-float-3 { + animation: float-3 7s ease-in-out infinite; +} diff --git a/desktop/src/renderer/src/components/shared/providers/base-provider.tsx b/desktop/src/renderer/src/components/shared/providers/base-provider.tsx new file mode 100644 index 0000000..fa9930c --- /dev/null +++ b/desktop/src/renderer/src/components/shared/providers/base-provider.tsx @@ -0,0 +1,11 @@ +import { PropsWithChildren } from "react"; +import SocketProvider from "./socket-provider"; +import { Toaster } from "sonner"; + +export default function BaseProvider({ children }: PropsWithChildren) { + return ( + + {children} + + ); +} diff --git a/desktop/src/renderer/src/components/shared/providers/socket-provider.tsx b/desktop/src/renderer/src/components/shared/providers/socket-provider.tsx new file mode 100644 index 0000000..75ad336 --- /dev/null +++ b/desktop/src/renderer/src/components/shared/providers/socket-provider.tsx @@ -0,0 +1,22 @@ +import { socket } from "@renderer/lib/socket"; +import { PropsWithChildren, useEffect } from "react"; +import OnlineCoders from "../online-coders/online-coders"; + +const SocketProvider = ({ children }: PropsWithChildren) => { + useEffect(() => { + socket.connect(); + + return () => { + socket.disconnect(); + }; + }, []); + + return ( +
+ {children} + +
+ ); +}; + +export default SocketProvider; diff --git a/desktop/src/renderer/src/components/ui/badge.tsx b/desktop/src/renderer/src/components/ui/badge.tsx new file mode 100644 index 0000000..8f0017a --- /dev/null +++ b/desktop/src/renderer/src/components/ui/badge.tsx @@ -0,0 +1,39 @@ +import * as React from "react"; +import { Slot } from "@radix-ui/react-slot"; +import { cva, type VariantProps } from "class-variance-authority"; + +import { cn } from "@renderer/lib/utils"; + +const badgeVariants = cva( + "inline-flex items-center justify-center rounded-md border px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden", + { + variants: { + variant: { + default: "border-transparent bg-primary text-primary-foreground [a&]:hover:bg-primary/90", + secondary: + "border-transparent bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90", + destructive: + "border-transparent bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60", + outline: "text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground" + } + }, + defaultVariants: { + variant: "default" + } + } +); + +function Badge({ + className, + variant, + asChild = false, + ...props +}: React.ComponentProps<"span"> & VariantProps & { asChild?: boolean }) { + const Comp = asChild ? Slot : "span"; + + return ( + + ); +} + +export { Badge, badgeVariants }; diff --git a/desktop/src/renderer/src/components/ui/button.tsx b/desktop/src/renderer/src/components/ui/button.tsx new file mode 100644 index 0000000..1eacd6d --- /dev/null +++ b/desktop/src/renderer/src/components/ui/button.tsx @@ -0,0 +1,56 @@ +import * as React from "react"; +import { Slot } from "@radix-ui/react-slot"; +import { cva, type VariantProps } from "class-variance-authority"; + +import { cn } from "@renderer/lib/utils"; + +const buttonVariants = cva( + "inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*='size-'])]:size-4 shrink-0 [&_svg]:shrink-0 outline-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive", + { + variants: { + variant: { + default: "bg-primary text-primary-foreground shadow-xs hover:bg-primary/90", + destructive: + "bg-destructive text-white shadow-xs hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60", + outline: + "border bg-background shadow-xs hover:bg-accent hover:text-accent-foreground dark:bg-input/30 dark:border-input dark:hover:bg-input/50", + secondary: "bg-secondary text-secondary-foreground shadow-xs hover:bg-secondary/80", + ghost: "hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50", + link: "text-primary underline-offset-4 hover:underline" + }, + size: { + default: "h-9 px-4 py-2 has-[>svg]:px-3", + sm: "h-8 rounded-md gap-1.5 px-3 has-[>svg]:px-2.5", + lg: "h-10 rounded-md px-6 has-[>svg]:px-4", + icon: "size-9" + } + }, + defaultVariants: { + variant: "default", + size: "default" + } + } +); + +function Button({ + className, + variant, + size, + asChild = false, + ...props +}: React.ComponentProps<"button"> & + VariantProps & { + asChild?: boolean; + }) { + const Comp = asChild ? Slot : "button"; + + return ( + + ); +} + +export { Button, buttonVariants }; diff --git a/desktop/src/renderer/src/components/ui/card.tsx b/desktop/src/renderer/src/components/ui/card.tsx new file mode 100644 index 0000000..aba7b6c --- /dev/null +++ b/desktop/src/renderer/src/components/ui/card.tsx @@ -0,0 +1,75 @@ +import * as React from "react"; + +import { cn } from "@renderer/lib/utils"; + +function Card({ className, ...props }: React.ComponentProps<"div">) { + return ( +
+ ); +} + +function CardHeader({ className, ...props }: React.ComponentProps<"div">) { + return ( +
+ ); +} + +function CardTitle({ className, ...props }: React.ComponentProps<"div">) { + return ( +
+ ); +} + +function CardDescription({ className, ...props }: React.ComponentProps<"div">) { + return ( +
+ ); +} + +function CardAction({ className, ...props }: React.ComponentProps<"div">) { + return ( +
+ ); +} + +function CardContent({ className, ...props }: React.ComponentProps<"div">) { + return
; +} + +function CardFooter({ className, ...props }: React.ComponentProps<"div">) { + return ( +
+ ); +} + +export { Card, CardHeader, CardFooter, CardTitle, CardAction, CardDescription, CardContent }; diff --git a/desktop/src/renderer/src/components/ui/select.tsx b/desktop/src/renderer/src/components/ui/select.tsx new file mode 100644 index 0000000..48181c4 --- /dev/null +++ b/desktop/src/renderer/src/components/ui/select.tsx @@ -0,0 +1,168 @@ +import * as React from "react"; +import * as SelectPrimitive from "@radix-ui/react-select"; +import { CheckIcon, ChevronDownIcon, ChevronUpIcon } from "lucide-react"; + +import { cn } from "@renderer/lib/utils"; + +function Select({ ...props }: React.ComponentProps) { + return ; +} + +function SelectGroup({ ...props }: React.ComponentProps) { + return ; +} + +function SelectValue({ ...props }: React.ComponentProps) { + return ; +} + +function SelectTrigger({ + className, + size = "default", + children, + ...props +}: React.ComponentProps & { + size?: "sm" | "default"; +}) { + return ( + + {children} + + + + + ); +} + +function SelectContent({ + className, + children, + position = "popper", + ...props +}: React.ComponentProps) { + return ( + + + + + {children} + + + + + ); +} + +function SelectLabel({ className, ...props }: React.ComponentProps) { + return ( + + ); +} + +function SelectItem({ + className, + children, + ...props +}: React.ComponentProps) { + return ( + + + + + + + {children} + + ); +} + +function SelectSeparator({ + className, + ...props +}: React.ComponentProps) { + return ( + + ); +} + +function SelectScrollUpButton({ + className, + ...props +}: React.ComponentProps) { + return ( + + + + ); +} + +function SelectScrollDownButton({ + className, + ...props +}: React.ComponentProps) { + return ( + + + + ); +} + +export { + Select, + SelectContent, + SelectGroup, + SelectItem, + SelectLabel, + SelectScrollDownButton, + SelectScrollUpButton, + SelectSeparator, + SelectTrigger, + SelectValue +}; diff --git a/desktop/src/renderer/src/constants/base-memetadata.ts b/desktop/src/renderer/src/constants/base-memetadata.ts new file mode 100644 index 0000000..26e1f38 --- /dev/null +++ b/desktop/src/renderer/src/constants/base-memetadata.ts @@ -0,0 +1,14 @@ +export const baseMetadata = { + authors: { + name: "Sabbir Hossain Shuvo", + url: "devlopersabbir.github.io", + }, + appLinks: { + web: { + url: "https://executeme.vercel.app", + }, + }, + category: "Programming Practices Platform", + creator: "Sabbir Hossain Shuvo", + generator: "NextJs", +}; diff --git a/desktop/src/renderer/src/constants/base.ts b/desktop/src/renderer/src/constants/base.ts new file mode 100644 index 0000000..79d63b3 --- /dev/null +++ b/desktop/src/renderer/src/constants/base.ts @@ -0,0 +1,9 @@ +export const baseUri = "https://145.223.97.55:9292"; + +// export const baseUri = +// // @ts-ignore +// import.meta.env.MODE !== "development" +// ? // @ts-ignore +// import.meta.env.RENDERER_VITE_SERVER_BASE_URL +// : // @ts-ignore +// import.meta.env.RENDERER_VITE_SERVER_BASE_URL_LOCAL; diff --git a/desktop/src/renderer/src/constants/editor.ts b/desktop/src/renderer/src/constants/editor.ts new file mode 100644 index 0000000..6cd05c6 --- /dev/null +++ b/desktop/src/renderer/src/constants/editor.ts @@ -0,0 +1,39 @@ +export const codeEditorOptions = { + minimap: { enabled: false }, + fontSize: 18, + lineNumbers: "on" as const, + roundedSelection: false, + scrollBeyondLastLine: true, + automaticLayout: true, + tabSize: 2, + insertSpaces: true, + wordWrap: "on" as const, + contextmenu: true, + selectOnLineNumbers: true, + lineDecorationsWidth: 10, + lineNumbersMinChars: 3, + glyphMargin: false, + folding: true, + cursorBlinking: "blink" as const, + cursorStyle: "line" as const, + renderWhitespace: "selection" as const, + renderControlCharacters: false, + fontFamily: + "'Fira Code', 'JetBrains Mono', 'Monaco', 'Menlo', 'Ubuntu Mono', monospace", + fontLigatures: true, + smoothScrolling: true, + mouseWheelZoom: true, + readOnly: false, + // --- Added for suggestions --- + quickSuggestions: true, // Enables quick suggestions as you type + suggestOnTriggerCharacters: true, // Shows suggestions when trigger characters are typed (e.g., '.') + // --- End Added for suggestions --- +}; + +export const outputEditorOptions = { + ...codeEditorOptions, // Inherit general options + readOnly: true, // Output should be read-only + quickSuggestions: false, // No suggestions needed for output + renderLineHighlight: "none" as const, // No line highlighting for cleaner output + wordWrap: "on" as const, // Ensure long lines wrap +}; diff --git a/desktop/src/renderer/src/constants/index.ts b/desktop/src/renderer/src/constants/index.ts new file mode 100644 index 0000000..f974030 --- /dev/null +++ b/desktop/src/renderer/src/constants/index.ts @@ -0,0 +1,8 @@ +export * from "./editor"; +export const LANGUAGE_MAP = { + python: "python", + javascript: "javascript", + typescript: "typescript", + java: "java", + kotlin: "kotlin", +} as const; diff --git a/desktop/src/renderer/src/constants/language.ts b/desktop/src/renderer/src/constants/language.ts new file mode 100644 index 0000000..1d7fd66 --- /dev/null +++ b/desktop/src/renderer/src/constants/language.ts @@ -0,0 +1,7 @@ +export const SUPPORTED_LANGUAGES = [ + { value: "python", label: "Python", extension: ".py" }, + { value: "nodejs", label: "JavaScript", extension: ".js" }, + { value: "typescript", label: "TypeScript", extension: ".ts" }, + { value: "java", label: "Java", extension: ".java" }, + { value: "kotlin", label: "Kotlin", extension: ".kt" } +] as const; diff --git a/desktop/src/renderer/src/lib/monaco.ts b/desktop/src/renderer/src/lib/monaco.ts new file mode 100644 index 0000000..d3f5a12 --- /dev/null +++ b/desktop/src/renderer/src/lib/monaco.ts @@ -0,0 +1 @@ + diff --git a/desktop/src/renderer/src/lib/socket.ts b/desktop/src/renderer/src/lib/socket.ts new file mode 100644 index 0000000..cfae811 --- /dev/null +++ b/desktop/src/renderer/src/lib/socket.ts @@ -0,0 +1,12 @@ +import { baseUri } from "@renderer/constants/base"; +import { io } from "socket.io-client"; + +export const socket = io(`${baseUri}`, { + autoConnect: false, + transports: ["websocket"], + + timeout: 20000, + reconnection: true, + reconnectionDelay: 1000, + reconnectionAttempts: 5 +}); diff --git a/desktop/src/renderer/src/lib/utils.ts b/desktop/src/renderer/src/lib/utils.ts new file mode 100644 index 0000000..564af0d --- /dev/null +++ b/desktop/src/renderer/src/lib/utils.ts @@ -0,0 +1,24 @@ +import { clsx, type ClassValue } from 'clsx' +import { twMerge } from 'tailwind-merge' + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)) +} + +export const copyOutput = (output: string) => { + navigator.clipboard.writeText(output) +} + +export const downloadOutput = (output: string) => { + if (output) { + const blob = new Blob([output], { type: 'text/plain' }) + const url = URL.createObjectURL(blob) + const a = document.createElement('a') + a.href = url + a.download = `executeme_${Date.now()}.txt` + document.body.appendChild(a) + a.click() + document.body.removeChild(a) + URL.revokeObjectURL(url) + } +} diff --git a/desktop/src/renderer/src/main.tsx b/desktop/src/renderer/src/main.tsx index 89f8d96..2e105bf 100644 --- a/desktop/src/renderer/src/main.tsx +++ b/desktop/src/renderer/src/main.tsx @@ -1,10 +1,39 @@ -import { StrictMode } from 'react' -import { createRoot } from 'react-dom/client' -import App from './App' -import './assets/main.css' +import { StrictMode } from "react"; +import { createRoot } from "react-dom/client"; +import App from "./App"; +import "./assets/main.css"; +import BaseProvider from "./components/shared/providers/base-provider"; +import { loader } from "@monaco-editor/react"; -createRoot(document.getElementById('root')!).render( +const monacoBasePath = window.applicationApi.api.getMonacoBasePath(); + +loader.config({ + paths: { + vs: monacoBasePath + } +}); + +window.MonacoEnvironment = { + getWorkerUrl: (_moduleId, label) => { + const workerFilenameMap: { [key: string]: string } = { + json: "json.worker.js", + css: "css.worker.js", + scss: "css.worker.js", + less: "css.worker.js", + html: "html.worker.js", + handlebars: "html.worker.js", + razor: "html.worker.js", + typescript: "ts.worker.js", + javascript: "ts.worker.js" + }; + const workerFile = workerFilenameMap[label] || "editor.worker.js"; + return `monaco-editor://${workerFile}`; + } +}; +createRoot(document.getElementById("root")!).render( - + + + -) +); diff --git a/desktop/src/shared/application-interface.ts b/desktop/src/shared/application-interface.ts new file mode 100644 index 0000000..e69de29 diff --git a/desktop/src/shared/constants.ts b/desktop/src/shared/constants.ts new file mode 100644 index 0000000..ad18e72 --- /dev/null +++ b/desktop/src/shared/constants.ts @@ -0,0 +1,7 @@ +export const LANGUAGE_MAP = { + python: "python", + javascript: "javascript", + typescript: "typescript", + java: "java", + kotlin: "kotlin" +} as const; diff --git a/desktop/src/shared/types.ts b/desktop/src/shared/types.ts new file mode 100644 index 0000000..691fc1d --- /dev/null +++ b/desktop/src/shared/types.ts @@ -0,0 +1,20 @@ +import { LANGUAGE_MAP } from "./constants"; + +export type Language = keyof typeof LANGUAGE_MAP; +export type Status = "success" | "error" | "running"; + +export type Input = { + language: Language; + code: string; +}; + +export type Output = { + output: string; + responseTime: number; // in milliseconds +}; + +export type ExecutionResult = { + status: Status; + results: Output; + language: Language; +}; diff --git a/desktop/tsconfig.node.json b/desktop/tsconfig.node.json index db23a68..e187db2 100644 --- a/desktop/tsconfig.node.json +++ b/desktop/tsconfig.node.json @@ -1,8 +1,13 @@ { "extends": "@electron-toolkit/tsconfig/tsconfig.node.json", - "include": ["electron.vite.config.*", "src/main/**/*", "src/preload/**/*"], + "include": ["electron.vite.config.*", "src/main/**/*", "src/preload/**/*", "src/shared/**/*"], "compilerOptions": { "composite": true, - "types": ["electron-vite/node"] + "types": ["electron-vite/node"], + "baseUrl": ".", + "paths": { + "@/*": ["src/main/*"], + "@shared/*": ["src/shared/*"] + } } } diff --git a/desktop/tsconfig.web.json b/desktop/tsconfig.web.json index 9c16b66..647aedc 100644 --- a/desktop/tsconfig.web.json +++ b/desktop/tsconfig.web.json @@ -4,16 +4,19 @@ "src/renderer/src/env.d.ts", "src/renderer/src/**/*", "src/renderer/src/**/*.tsx", - "src/preload/*.d.ts" + "src/preload/*.d.ts", + "src/shared/**/*" ], "compilerOptions": { "composite": true, "jsx": "react-jsx", "baseUrl": ".", + "module": "nodenext", + "moduleResolution": "nodenext", "paths": { - "@renderer/*": [ - "src/renderer/src/*" - ] + "@renderer/*": ["src/renderer/src/*"], + "@shared/*": ["src/shared/*"], + "@/*": ["src/renderer/src/*"] } } } diff --git a/origin/index.js b/origin/index.js index 1d3b1b9..6da0384 100644 --- a/origin/index.js +++ b/origin/index.js @@ -1,4 +1,5 @@ export const allowOrigins = [ "http://localhost:3000", + "http://localhost:5173", "https://executeme.vercel.app", ];