From bd839cf431147d6432b00d542a8a246949e60a7a Mon Sep 17 00:00:00 2001 From: YHH <359807859@qq.com> Date: Tue, 14 Oct 2025 22:53:26 +0800 Subject: [PATCH] =?UTF-8?q?Tauri=20=E7=BC=96=E8=BE=91=E5=99=A8=E5=BA=94?= =?UTF-8?q?=E7=94=A8=E6=A1=86=E6=9E=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 993 +++++++++++++++++- packages/editor-app/index.html | 12 + packages/editor-app/package.json | 31 + packages/editor-app/src-tauri/Cargo.toml | 29 + packages/editor-app/src-tauri/build.rs | 3 + packages/editor-app/src-tauri/src/commands.rs | 25 + packages/editor-app/src-tauri/src/lib.rs | 7 + packages/editor-app/src-tauri/src/main.rs | 54 + packages/editor-app/src-tauri/src/project.rs | 42 + packages/editor-app/src-tauri/tauri.conf.json | 59 ++ packages/editor-app/src/App.tsx | 89 ++ packages/editor-app/src/api/tauri.ts | 55 + packages/editor-app/src/main.tsx | 10 + .../src/plugins/SceneInspectorPlugin.ts | 130 +++ packages/editor-app/src/styles/App.css | 99 ++ packages/editor-app/src/styles/index.css | 19 + packages/editor-app/tsconfig.json | 23 + packages/editor-app/vite.config.ts | 27 + 18 files changed, 1702 insertions(+), 5 deletions(-) create mode 100644 packages/editor-app/index.html create mode 100644 packages/editor-app/package.json create mode 100644 packages/editor-app/src-tauri/Cargo.toml create mode 100644 packages/editor-app/src-tauri/build.rs create mode 100644 packages/editor-app/src-tauri/src/commands.rs create mode 100644 packages/editor-app/src-tauri/src/lib.rs create mode 100644 packages/editor-app/src-tauri/src/main.rs create mode 100644 packages/editor-app/src-tauri/src/project.rs create mode 100644 packages/editor-app/src-tauri/tauri.conf.json create mode 100644 packages/editor-app/src/App.tsx create mode 100644 packages/editor-app/src/api/tauri.ts create mode 100644 packages/editor-app/src/main.tsx create mode 100644 packages/editor-app/src/plugins/SceneInspectorPlugin.ts create mode 100644 packages/editor-app/src/styles/App.css create mode 100644 packages/editor-app/src/styles/index.css create mode 100644 packages/editor-app/tsconfig.json create mode 100644 packages/editor-app/vite.config.ts diff --git a/package-lock.json b/package-lock.json index a6e1853f..6126fe62 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1745,6 +1745,38 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", + "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", + "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-transform-regenerator": { "version": "7.28.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.3.tgz", @@ -2500,6 +2532,23 @@ "node": ">=12" } }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.10.tgz", + "integrity": "sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@esbuild/netbsd-x64": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", @@ -2517,6 +2566,23 @@ "node": ">=12" } }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.10.tgz", + "integrity": "sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@esbuild/openbsd-x64": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", @@ -2534,6 +2600,23 @@ "node": ">=12" } }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.10.tgz", + "integrity": "sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, "node_modules/@esbuild/sunos-x64": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", @@ -2610,6 +2693,10 @@ "resolved": "packages/math", "link": true }, + "node_modules/@esengine/editor-app": { + "resolved": "packages/editor-app", + "link": true + }, "node_modules/@esengine/editor-core": { "resolved": "packages/editor-core", "link": true @@ -4382,6 +4469,13 @@ "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", "license": "BSD-3-Clause" }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.27", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", + "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", + "dev": true, + "license": "MIT" + }, "node_modules/@rollup/plugin-babel": { "version": "6.0.4", "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-6.0.4.tgz", @@ -4954,6 +5048,242 @@ "@sinonjs/commons": "^3.0.0" } }, + "node_modules/@tauri-apps/api": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/@tauri-apps/api/-/api-2.8.0.tgz", + "integrity": "sha512-ga7zdhbS2GXOMTIZRT0mYjKJtR9fivsXzsyq5U3vjDL0s6DTMwYRm0UHNjzTY5dh4+LSC68Sm/7WEiimbQNYlw==", + "license": "Apache-2.0 OR MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/tauri" + } + }, + "node_modules/@tauri-apps/cli": { + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli/-/cli-2.8.4.tgz", + "integrity": "sha512-ejUZBzuQRcjFV+v/gdj/DcbyX/6T4unZQjMSBZwLzP/CymEjKcc2+Fc8xTORThebHDUvqoXMdsCZt8r+hyN15g==", + "dev": true, + "license": "Apache-2.0 OR MIT", + "bin": { + "tauri": "tauri.js" + }, + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/tauri" + }, + "optionalDependencies": { + "@tauri-apps/cli-darwin-arm64": "2.8.4", + "@tauri-apps/cli-darwin-x64": "2.8.4", + "@tauri-apps/cli-linux-arm-gnueabihf": "2.8.4", + "@tauri-apps/cli-linux-arm64-gnu": "2.8.4", + "@tauri-apps/cli-linux-arm64-musl": "2.8.4", + "@tauri-apps/cli-linux-riscv64-gnu": "2.8.4", + "@tauri-apps/cli-linux-x64-gnu": "2.8.4", + "@tauri-apps/cli-linux-x64-musl": "2.8.4", + "@tauri-apps/cli-win32-arm64-msvc": "2.8.4", + "@tauri-apps/cli-win32-ia32-msvc": "2.8.4", + "@tauri-apps/cli-win32-x64-msvc": "2.8.4" + } + }, + "node_modules/@tauri-apps/cli-darwin-arm64": { + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-arm64/-/cli-darwin-arm64-2.8.4.tgz", + "integrity": "sha512-BKu8HRkYV01SMTa7r4fLx+wjgtRK8Vep7lmBdHDioP6b8XH3q2KgsAyPWfEZaZIkZ2LY4SqqGARaE9oilNe0oA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-darwin-x64": { + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-darwin-x64/-/cli-darwin-x64-2.8.4.tgz", + "integrity": "sha512-imb9PfSd/7G6VAO7v1bQ2A3ZH4NOCbhGJFLchxzepGcXf9NKkfun157JH9mko29K6sqAwuJ88qtzbKCbWJTH9g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-arm-gnueabihf": { + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm-gnueabihf/-/cli-linux-arm-gnueabihf-2.8.4.tgz", + "integrity": "sha512-Ml215UnDdl7/fpOrF1CNovym/KjtUbCuPgrcZ4IhqUCnhZdXuphud/JT3E8X97Y03TZ40Sjz8raXYI2ET0exzw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-arm64-gnu": { + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-gnu/-/cli-linux-arm64-gnu-2.8.4.tgz", + "integrity": "sha512-pbcgBpMyI90C83CxE5REZ9ODyIlmmAPkkJXtV398X3SgZEIYy5TACYqlyyv2z5yKgD8F8WH4/2fek7+jH+ZXAw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-arm64-musl": { + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-arm64-musl/-/cli-linux-arm64-musl-2.8.4.tgz", + "integrity": "sha512-zumFeaU1Ws5Ay872FTyIm7z8kfzEHu8NcIn8M6TxbJs0a7GRV21KBdpW1zNj2qy7HynnpQCqjAYXTUUmm9JAOw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-riscv64-gnu": { + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-riscv64-gnu/-/cli-linux-riscv64-gnu-2.8.4.tgz", + "integrity": "sha512-qiqbB3Zz6IyO201f+1ojxLj65WYj8mixL5cOMo63nlg8CIzsP23cPYUrx1YaDPsCLszKZo7tVs14pc7BWf+/aQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-x64-gnu": { + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-gnu/-/cli-linux-x64-gnu-2.8.4.tgz", + "integrity": "sha512-TaqaDd9Oy6k45Hotx3pOf+pkbsxLaApv4rGd9mLuRM1k6YS/aw81YrsMryYPThrxrScEIUcmNIHaHsLiU4GMkw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-linux-x64-musl": { + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-linux-x64-musl/-/cli-linux-x64-musl-2.8.4.tgz", + "integrity": "sha512-ot9STAwyezN8w+bBHZ+bqSQIJ0qPZFlz/AyscpGqB/JnJQVDFQcRDmUPFEaAtt2UUHSWzN3GoTJ5ypqLBp2WQA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-win32-arm64-msvc": { + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-arm64-msvc/-/cli-win32-arm64-msvc-2.8.4.tgz", + "integrity": "sha512-+2aJ/g90dhLiOLFSD1PbElXX3SoMdpO7HFPAZB+xot3CWlAZD1tReUFy7xe0L5GAR16ZmrxpIDM9v9gn5xRy/w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-win32-ia32-msvc": { + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-ia32-msvc/-/cli-win32-ia32-msvc-2.8.4.tgz", + "integrity": "sha512-yj7WDxkL1t9Uzr2gufQ1Hl7hrHuFKTNEOyascbc109EoiAqCp0tgZ2IykQqOZmZOHU884UAWI1pVMqBhS/BfhA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/cli-win32-x64-msvc": { + "version": "2.8.4", + "resolved": "https://registry.npmjs.org/@tauri-apps/cli-win32-x64-msvc/-/cli-win32-x64-msvc-2.8.4.tgz", + "integrity": "sha512-XuvGB4ehBdd7QhMZ9qbj/8icGEatDuBNxyYHbLKsTYh90ggUlPa/AtaqcC1Fo69lGkTmq9BOKrs1aWSi7xDonA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "Apache-2.0 OR MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tauri-apps/plugin-shell": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@tauri-apps/plugin-shell/-/plugin-shell-2.3.1.tgz", + "integrity": "sha512-jjs2WGDO/9z2pjNlydY/F5yYhNsscv99K5lCmU5uKjsVvQ3dRlDhhtVYoa4OLDmktLtQvgvbQjCFibMl6tgGfw==", + "license": "MIT OR Apache-2.0", + "dependencies": { + "@tauri-apps/api": "^2.8.0" + } + }, "node_modules/@tootallnate/once": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", @@ -5257,6 +5587,13 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/prop-types": { + "version": "15.7.15", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/qs": { "version": "6.14.0", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", @@ -5267,6 +5604,27 @@ "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==" }, + "node_modules/@types/react": { + "version": "18.3.26", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.26.tgz", + "integrity": "sha512-RFA/bURkcKzx/X9oumPG9Vp3D3JUgus/d0b67KB0t5S/raciymilkOa66olh78MUI92QLbEJevO7rvqU/kjwKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", + "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^18.0.0" + } + }, "node_modules/@types/resolve": { "version": "1.20.2", "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", @@ -5356,6 +5714,27 @@ "dev": true, "license": "ISC" }, + "node_modules/@vitejs/plugin-react": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", + "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.28.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.27", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.17.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, "node_modules/@vitejs/plugin-vue": { "version": "5.2.4", "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz", @@ -7850,10 +8229,14 @@ } }, "node_modules/fdir": { - "version": "6.4.5", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.5.tgz", - "integrity": "sha512-4BG7puHpVsIYxZUbiUE3RqGloLaSSwzYie5jvasC4LWuBWzZawynvYouhjbQKw2JuIGYdm0DzIxl8iVidKlUEw==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, "peerDependencies": { "picomatch": "^3 || ^4" }, @@ -9965,8 +10348,7 @@ "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "node_modules/js-yaml": { "version": "3.14.1", @@ -10711,6 +11093,18 @@ "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", "license": "Apache-2.0" }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -12866,12 +13260,47 @@ "safe-buffer": "^5.1.0" } }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, "node_modules/react-is": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true }, + "node_modules/react-refresh": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", + "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/read": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/read/-/read-3.0.1.tgz", @@ -13487,6 +13916,15 @@ "node": ">=v12.22.7" } }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, "node_modules/search-insights": { "version": "2.17.3", "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.17.3.tgz", @@ -15560,6 +15998,551 @@ "typescript": "^5.8.3" } }, + "packages/editor-app": { + "name": "@esengine/editor-app", + "version": "1.0.0", + "dependencies": { + "@esengine/ecs-framework": "file:../core", + "@esengine/editor-core": "file:../editor-core", + "@tauri-apps/api": "^2.2.0", + "@tauri-apps/plugin-shell": "^2.0.0", + "react": "^18.3.1", + "react-dom": "^18.3.1" + }, + "devDependencies": { + "@tauri-apps/cli": "^2.2.0", + "@types/react": "^18.3.12", + "@types/react-dom": "^18.3.1", + "@vitejs/plugin-react": "^4.3.4", + "typescript": "^5.8.3", + "vite": "^6.0.7" + } + }, + "packages/editor-app/node_modules/@esbuild/aix-ppc64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.10.tgz", + "integrity": "sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "packages/editor-app/node_modules/@esbuild/android-arm": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.10.tgz", + "integrity": "sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "packages/editor-app/node_modules/@esbuild/android-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.10.tgz", + "integrity": "sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "packages/editor-app/node_modules/@esbuild/android-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.10.tgz", + "integrity": "sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "packages/editor-app/node_modules/@esbuild/darwin-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.10.tgz", + "integrity": "sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "packages/editor-app/node_modules/@esbuild/darwin-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.10.tgz", + "integrity": "sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "packages/editor-app/node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.10.tgz", + "integrity": "sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "packages/editor-app/node_modules/@esbuild/freebsd-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.10.tgz", + "integrity": "sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "packages/editor-app/node_modules/@esbuild/linux-arm": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.10.tgz", + "integrity": "sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "packages/editor-app/node_modules/@esbuild/linux-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.10.tgz", + "integrity": "sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "packages/editor-app/node_modules/@esbuild/linux-ia32": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.10.tgz", + "integrity": "sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "packages/editor-app/node_modules/@esbuild/linux-loong64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.10.tgz", + "integrity": "sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "packages/editor-app/node_modules/@esbuild/linux-mips64el": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.10.tgz", + "integrity": "sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "packages/editor-app/node_modules/@esbuild/linux-ppc64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.10.tgz", + "integrity": "sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "packages/editor-app/node_modules/@esbuild/linux-riscv64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.10.tgz", + "integrity": "sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "packages/editor-app/node_modules/@esbuild/linux-s390x": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.10.tgz", + "integrity": "sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "packages/editor-app/node_modules/@esbuild/linux-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.10.tgz", + "integrity": "sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "packages/editor-app/node_modules/@esbuild/netbsd-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.10.tgz", + "integrity": "sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "packages/editor-app/node_modules/@esbuild/openbsd-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.10.tgz", + "integrity": "sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "packages/editor-app/node_modules/@esbuild/sunos-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.10.tgz", + "integrity": "sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "packages/editor-app/node_modules/@esbuild/win32-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.10.tgz", + "integrity": "sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "packages/editor-app/node_modules/@esbuild/win32-ia32": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.10.tgz", + "integrity": "sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "packages/editor-app/node_modules/@esbuild/win32-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.10.tgz", + "integrity": "sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "packages/editor-app/node_modules/esbuild": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.10.tgz", + "integrity": "sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.10", + "@esbuild/android-arm": "0.25.10", + "@esbuild/android-arm64": "0.25.10", + "@esbuild/android-x64": "0.25.10", + "@esbuild/darwin-arm64": "0.25.10", + "@esbuild/darwin-x64": "0.25.10", + "@esbuild/freebsd-arm64": "0.25.10", + "@esbuild/freebsd-x64": "0.25.10", + "@esbuild/linux-arm": "0.25.10", + "@esbuild/linux-arm64": "0.25.10", + "@esbuild/linux-ia32": "0.25.10", + "@esbuild/linux-loong64": "0.25.10", + "@esbuild/linux-mips64el": "0.25.10", + "@esbuild/linux-ppc64": "0.25.10", + "@esbuild/linux-riscv64": "0.25.10", + "@esbuild/linux-s390x": "0.25.10", + "@esbuild/linux-x64": "0.25.10", + "@esbuild/netbsd-arm64": "0.25.10", + "@esbuild/netbsd-x64": "0.25.10", + "@esbuild/openbsd-arm64": "0.25.10", + "@esbuild/openbsd-x64": "0.25.10", + "@esbuild/openharmony-arm64": "0.25.10", + "@esbuild/sunos-x64": "0.25.10", + "@esbuild/win32-arm64": "0.25.10", + "@esbuild/win32-ia32": "0.25.10", + "@esbuild/win32-x64": "0.25.10" + } + }, + "packages/editor-app/node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "packages/editor-app/node_modules/vite": { + "version": "6.3.7", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.7.tgz", + "integrity": "sha512-mQYaKepA0NGMBsz8Xktt3tJUG5ELE2iT7IJ+ssXI6nxVdE2sFc/d/6w/JByqMLvWg8hNKHpPgzjgOkrhpKFnrA==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, "packages/editor-core": { "name": "@esengine/editor-core", "version": "1.0.0", diff --git a/packages/editor-app/index.html b/packages/editor-app/index.html new file mode 100644 index 00000000..76efaf7a --- /dev/null +++ b/packages/editor-app/index.html @@ -0,0 +1,12 @@ + + + + + + ECS Framework Editor + + +
+ + + diff --git a/packages/editor-app/package.json b/packages/editor-app/package.json new file mode 100644 index 00000000..b01ce478 --- /dev/null +++ b/packages/editor-app/package.json @@ -0,0 +1,31 @@ +{ + "name": "@esengine/editor-app", + "version": "1.0.0", + "description": "ECS Framework Editor Application - Cross-platform desktop editor", + "type": "module", + "private": true, + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "preview": "vite preview", + "tauri": "tauri", + "tauri:dev": "tauri dev", + "tauri:build": "tauri build" + }, + "dependencies": { + "@esengine/ecs-framework": "file:../core", + "@esengine/editor-core": "file:../editor-core", + "@tauri-apps/api": "^2.2.0", + "@tauri-apps/plugin-shell": "^2.0.0", + "react": "^18.3.1", + "react-dom": "^18.3.1" + }, + "devDependencies": { + "@tauri-apps/cli": "^2.2.0", + "@types/react": "^18.3.12", + "@types/react-dom": "^18.3.1", + "@vitejs/plugin-react": "^4.3.4", + "typescript": "^5.8.3", + "vite": "^6.0.7" + } +} diff --git a/packages/editor-app/src-tauri/Cargo.toml b/packages/editor-app/src-tauri/Cargo.toml new file mode 100644 index 00000000..7f0b6eb8 --- /dev/null +++ b/packages/editor-app/src-tauri/Cargo.toml @@ -0,0 +1,29 @@ +[package] +name = "ecs-editor" +version = "1.0.0" +description = "ECS Framework Editor - Cross-platform desktop editor" +authors = ["yhh"] +edition = "2021" + +[lib] +name = "ecs_editor_lib" +crate-type = ["staticlib", "cdylib", "rlib"] + +[build-dependencies] +tauri-build = { version = "2", features = [] } + +[dependencies] +tauri = { version = "2", features = [] } +tauri-plugin-shell = "2" +serde = { version = "1", features = ["derive"] } +serde_json = "1" + +[profile.dev] +incremental = true + +[profile.release] +codegen-units = 1 +lto = true +opt-level = "s" +panic = "abort" +strip = true diff --git a/packages/editor-app/src-tauri/build.rs b/packages/editor-app/src-tauri/build.rs new file mode 100644 index 00000000..d860e1e6 --- /dev/null +++ b/packages/editor-app/src-tauri/build.rs @@ -0,0 +1,3 @@ +fn main() { + tauri_build::build() +} diff --git a/packages/editor-app/src-tauri/src/commands.rs b/packages/editor-app/src-tauri/src/commands.rs new file mode 100644 index 00000000..9792f433 --- /dev/null +++ b/packages/editor-app/src-tauri/src/commands.rs @@ -0,0 +1,25 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Serialize, Deserialize)] +pub struct ProjectInfo { + pub name: String, + pub path: String, + pub version: String, +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct EditorConfig { + pub theme: String, + pub auto_save: bool, + pub recent_projects: Vec, +} + +impl Default for EditorConfig { + fn default() -> Self { + Self { + theme: "dark".to_string(), + auto_save: true, + recent_projects: Vec::new(), + } + } +} diff --git a/packages/editor-app/src-tauri/src/lib.rs b/packages/editor-app/src-tauri/src/lib.rs new file mode 100644 index 00000000..0fedf2b2 --- /dev/null +++ b/packages/editor-app/src-tauri/src/lib.rs @@ -0,0 +1,7 @@ +// ECS Editor Library + +pub mod commands; +pub mod project; + +pub use commands::*; +pub use project::*; diff --git a/packages/editor-app/src-tauri/src/main.rs b/packages/editor-app/src-tauri/src/main.rs new file mode 100644 index 00000000..375a605e --- /dev/null +++ b/packages/editor-app/src-tauri/src/main.rs @@ -0,0 +1,54 @@ +// Prevents additional console window on Windows in release +#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] + +use tauri::Manager; + +// IPC Commands +#[tauri::command] +fn greet(name: &str) -> String { + format!("Hello, {}! Welcome to ECS Framework Editor.", name) +} + +#[tauri::command] +fn open_project(path: String) -> Result { + // 项目打开逻辑 + Ok(format!("Project opened: {}", path)) +} + +#[tauri::command] +fn save_project(path: String, data: String) -> Result<(), String> { + // 项目保存逻辑 + std::fs::write(&path, data) + .map_err(|e| format!("Failed to save project: {}", e))?; + Ok(()) +} + +#[tauri::command] +fn export_binary(data: Vec, output_path: String) -> Result<(), String> { + // 二进制导出逻辑 + std::fs::write(&output_path, data) + .map_err(|e| format!("Failed to export binary: {}", e))?; + Ok(()) +} + +fn main() { + tauri::Builder::default() + .plugin(tauri_plugin_shell::init()) + .setup(|app| { + // 应用启动时的初始化逻辑 + #[cfg(debug_assertions)] + { + let window = app.get_webview_window("main").unwrap(); + window.open_devtools(); + } + Ok(()) + }) + .invoke_handler(tauri::generate_handler![ + greet, + open_project, + save_project, + export_binary + ]) + .run(tauri::generate_context!()) + .expect("error while running tauri application"); +} diff --git a/packages/editor-app/src-tauri/src/project.rs b/packages/editor-app/src-tauri/src/project.rs new file mode 100644 index 00000000..496a175e --- /dev/null +++ b/packages/editor-app/src-tauri/src/project.rs @@ -0,0 +1,42 @@ +use std::path::PathBuf; +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Serialize, Deserialize)] +pub struct Project { + pub name: String, + pub path: PathBuf, + pub scenes: Vec, + pub assets: Vec, +} + +impl Project { + pub fn new(name: String, path: PathBuf) -> Self { + Self { + name, + path, + scenes: Vec::new(), + assets: Vec::new(), + } + } + + pub fn load(path: &PathBuf) -> Result { + let content = std::fs::read_to_string(path) + .map_err(|e| format!("Failed to read project file: {}", e))?; + + serde_json::from_str(&content) + .map_err(|e| format!("Failed to parse project file: {}", e)) + } + + pub fn save(&self) -> Result<(), String> { + let mut project_file = self.path.clone(); + project_file.push("project.json"); + + let content = serde_json::to_string_pretty(self) + .map_err(|e| format!("Failed to serialize project: {}", e))?; + + std::fs::write(&project_file, content) + .map_err(|e| format!("Failed to write project file: {}", e))?; + + Ok(()) + } +} diff --git a/packages/editor-app/src-tauri/tauri.conf.json b/packages/editor-app/src-tauri/tauri.conf.json new file mode 100644 index 00000000..d2f2e172 --- /dev/null +++ b/packages/editor-app/src-tauri/tauri.conf.json @@ -0,0 +1,59 @@ +{ + "productName": "ECS Framework Editor", + "version": "1.0.0", + "identifier": "com.esengine.editor", + "build": { + "beforeDevCommand": "npm run dev", + "devUrl": "http://localhost:5173", + "beforeBuildCommand": "npm run build", + "frontendDist": "../dist" + }, + "bundle": { + "active": true, + "targets": "all", + "icon": [ + "icons/32x32.png", + "icons/128x128.png", + "icons/128x128@2x.png", + "icons/icon.icns", + "icons/icon.ico" + ], + "windows": { + "certificateThumbprint": null, + "digestAlgorithm": "sha256", + "timestampUrl": "" + }, + "macOS": { + "entitlements": null, + "exceptionDomain": "", + "frameworks": [], + "providerShortName": null, + "signingIdentity": null + } + }, + "app": { + "windows": [ + { + "title": "ECS Framework Editor", + "width": 1280, + "height": 800, + "minWidth": 800, + "minHeight": 600, + "resizable": true, + "fullscreen": false, + "decorations": true, + "transparent": false, + "center": true, + "skipTaskbar": false + } + ], + "security": { + "csp": null + } + }, + "plugins": { + "shell": { + "open": true + } + } +} diff --git a/packages/editor-app/src/App.tsx b/packages/editor-app/src/App.tsx new file mode 100644 index 00000000..c413120f --- /dev/null +++ b/packages/editor-app/src/App.tsx @@ -0,0 +1,89 @@ +import { useState, useEffect } from 'react'; +import { Core } from '@esengine/ecs-framework'; +import { EditorPluginManager, UIRegistry, MessageHub, SerializerRegistry } from '@esengine/editor-core'; +import { SceneInspectorPlugin } from './plugins/SceneInspectorPlugin'; +import { TauriAPI } from './api/tauri'; +import './styles/App.css'; + +function App() { + const [core, setCore] = useState(null); + const [pluginManager, setPluginManager] = useState(null); + const [status, setStatus] = useState('Initializing...'); + + useEffect(() => { + const initializeEditor = async () => { + try { + const coreInstance = Core.create({ debug: true }); + + const uiRegistry = new UIRegistry(); + const messageHub = new MessageHub(); + const serializerRegistry = new SerializerRegistry(); + + Core.services.registerInstance(UIRegistry, uiRegistry); + Core.services.registerInstance(MessageHub, messageHub); + Core.services.registerInstance(SerializerRegistry, serializerRegistry); + + const pluginMgr = new EditorPluginManager(); + pluginMgr.initialize(coreInstance, Core.services); + + await pluginMgr.installEditor(new SceneInspectorPlugin()); + + const greeting = await TauriAPI.greet('Developer'); + console.log(greeting); + + setCore(coreInstance); + setPluginManager(pluginMgr); + setStatus('Editor Ready'); + } catch (error) { + console.error('Failed to initialize editor:', error); + setStatus('Initialization Failed'); + } + }; + + initializeEditor(); + + return () => { + Core.destroy(); + }; + }, []); + + return ( +
+
+

ECS Framework Editor

+ {status} +
+ +
+
+

Hierarchy

+

Scene hierarchy will appear here

+
+ +
+
+

Viewport

+

Scene viewport will appear here

+
+ +
+

Console

+

Console output will appear here

+
+
+ +
+

Inspector

+

Entity inspector will appear here

+
+
+ +
+ Plugins: {pluginManager?.getAllEditorPlugins().length ?? 0} + Core: {core ? 'Active' : 'Inactive'} +
+
+ ); +} + +export default App; diff --git a/packages/editor-app/src/api/tauri.ts b/packages/editor-app/src/api/tauri.ts new file mode 100644 index 00000000..bf117977 --- /dev/null +++ b/packages/editor-app/src/api/tauri.ts @@ -0,0 +1,55 @@ +import { invoke } from '@tauri-apps/api/core'; + +/** + * Tauri IPC 通信层 + */ +export class TauriAPI { + /** + * 打招呼(测试命令) + */ + static async greet(name: string): Promise { + return await invoke('greet', { name }); + } + + /** + * 打开项目 + */ + static async openProject(path: string): Promise { + return await invoke('open_project', { path }); + } + + /** + * 保存项目 + */ + static async saveProject(path: string, data: string): Promise { + return await invoke('save_project', { path, data }); + } + + /** + * 导出二进制数据 + */ + static async exportBinary(data: Uint8Array, outputPath: string): Promise { + return await invoke('export_binary', { + data: Array.from(data), + outputPath + }); + } +} + +/** + * 项目信息 + */ +export interface ProjectInfo { + name: string; + path: string; + version: string; +} + +/** + * 编辑器配置 + */ +export interface EditorConfig { + theme: string; + autoSave: boolean; + recentProjects: string[]; +} diff --git a/packages/editor-app/src/main.tsx b/packages/editor-app/src/main.tsx new file mode 100644 index 00000000..42c1f750 --- /dev/null +++ b/packages/editor-app/src/main.tsx @@ -0,0 +1,10 @@ +import React from 'react'; +import ReactDOM from 'react-dom/client'; +import App from './App'; +import './styles/index.css'; + +ReactDOM.createRoot(document.getElementById('root')!).render( + + + +); diff --git a/packages/editor-app/src/plugins/SceneInspectorPlugin.ts b/packages/editor-app/src/plugins/SceneInspectorPlugin.ts new file mode 100644 index 00000000..a29603a2 --- /dev/null +++ b/packages/editor-app/src/plugins/SceneInspectorPlugin.ts @@ -0,0 +1,130 @@ +import type { Core, ServiceContainer } from '@esengine/ecs-framework'; +import { IEditorPlugin, EditorPluginCategory, PanelPosition } from '@esengine/editor-core'; +import type { MenuItem, ToolbarItem, PanelDescriptor, ISerializer } from '@esengine/editor-core'; + +/** + * Scene Inspector 插件 + * + * 提供场景层级视图和实体检视功能 + */ +export class SceneInspectorPlugin implements IEditorPlugin { + readonly name = '@esengine/scene-inspector'; + readonly version = '1.0.0'; + readonly displayName = 'Scene Inspector'; + readonly category = EditorPluginCategory.Inspector; + readonly description = 'Scene hierarchy and entity inspector'; + readonly icon = '🔍'; + + async install(_core: Core, _services: ServiceContainer): Promise { + console.log('[SceneInspectorPlugin] Installed'); + } + + async uninstall(): Promise { + console.log('[SceneInspectorPlugin] Uninstalled'); + } + + registerMenuItems(): MenuItem[] { + return [ + { + id: 'view-scene-inspector', + label: 'Scene Inspector', + parentId: 'view', + onClick: () => { + console.log('Toggle Scene Inspector'); + }, + shortcut: 'Ctrl+Shift+I', + order: 100 + }, + { + id: 'scene-create-entity', + label: 'Create Entity', + parentId: 'scene', + onClick: () => { + console.log('Create new entity'); + }, + shortcut: 'Ctrl+N', + order: 10 + } + ]; + } + + registerToolbar(): ToolbarItem[] { + return [ + { + id: 'toolbar-create-entity', + label: 'New Entity', + groupId: 'entity-tools', + icon: '➕', + onClick: () => { + console.log('Create entity from toolbar'); + }, + order: 10 + }, + { + id: 'toolbar-delete-entity', + label: 'Delete Entity', + groupId: 'entity-tools', + icon: '🗑️', + onClick: () => { + console.log('Delete entity from toolbar'); + }, + order: 20 + } + ]; + } + + registerPanels(): PanelDescriptor[] { + return [ + { + id: 'panel-scene-hierarchy', + title: 'Scene Hierarchy', + position: PanelPosition.Left, + defaultSize: 250, + resizable: true, + closable: false, + icon: '📋', + order: 10 + }, + { + id: 'panel-entity-inspector', + title: 'Entity Inspector', + position: PanelPosition.Right, + defaultSize: 300, + resizable: true, + closable: false, + icon: '🔎', + order: 10 + } + ]; + } + + getSerializers(): ISerializer[] { + return [ + { + serialize: (data: any) => { + const json = JSON.stringify(data); + const encoder = new TextEncoder(); + return encoder.encode(json); + }, + deserialize: (data: Uint8Array) => { + const decoder = new TextDecoder(); + const json = decoder.decode(data); + return JSON.parse(json); + }, + getSupportedType: () => 'scene' + } + ]; + } + + async onEditorReady(): Promise { + console.log('[SceneInspectorPlugin] Editor is ready'); + } + + async onProjectOpen(projectPath: string): Promise { + console.log(`[SceneInspectorPlugin] Project opened: ${projectPath}`); + } + + async onProjectClose(): Promise { + console.log('[SceneInspectorPlugin] Project closed'); + } +} diff --git a/packages/editor-app/src/styles/App.css b/packages/editor-app/src/styles/App.css new file mode 100644 index 00000000..bb92f3dd --- /dev/null +++ b/packages/editor-app/src/styles/App.css @@ -0,0 +1,99 @@ +.editor-container { + display: flex; + flex-direction: column; + width: 100%; + height: 100%; + background-color: #1e1e1e; + color: #cccccc; +} + +.editor-header { + display: flex; + justify-content: space-between; + align-items: center; + padding: 8px 16px; + background-color: #2d2d2d; + border-bottom: 1px solid #3e3e3e; +} + +.editor-header h1 { + font-size: 16px; + font-weight: 600; + margin: 0; +} + +.editor-header .status { + font-size: 12px; + color: #4ec9b0; +} + +.editor-content { + display: flex; + flex: 1; + overflow: hidden; +} + +.sidebar-left, +.sidebar-right { + width: 250px; + background-color: #252526; + border-right: 1px solid #3e3e3e; + padding: 12px; + overflow-y: auto; +} + +.sidebar-right { + border-right: none; + border-left: 1px solid #3e3e3e; +} + +.sidebar-left h3, +.sidebar-right h3 { + font-size: 14px; + margin-bottom: 12px; + color: #ffffff; +} + +.main-content { + display: flex; + flex-direction: column; + flex: 1; + overflow: hidden; +} + +.viewport { + flex: 1; + background-color: #1e1e1e; + border-bottom: 1px solid #3e3e3e; + padding: 12px; + display: flex; + flex-direction: column; +} + +.viewport h3 { + font-size: 14px; + margin-bottom: 12px; + color: #ffffff; +} + +.bottom-panel { + height: 200px; + background-color: #252526; + padding: 12px; + overflow-y: auto; +} + +.bottom-panel h4 { + font-size: 12px; + margin-bottom: 8px; + color: #ffffff; +} + +.editor-footer { + display: flex; + justify-content: space-between; + padding: 4px 16px; + background-color: #007acc; + color: #ffffff; + font-size: 12px; +} diff --git a/packages/editor-app/src/styles/index.css b/packages/editor-app/src/styles/index.css new file mode 100644 index 00000000..ddaf4bd0 --- /dev/null +++ b/packages/editor-app/src/styles/index.css @@ -0,0 +1,19 @@ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', + 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', + sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + overflow: hidden; +} + +#root { + width: 100vw; + height: 100vh; +} diff --git a/packages/editor-app/tsconfig.json b/packages/editor-app/tsconfig.json new file mode 100644 index 00000000..44d2e14b --- /dev/null +++ b/packages/editor-app/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedIndexedAccess": true, + "experimentalDecorators": true, + "emitDecoratorMetadata": true + }, + "include": ["src"] +} diff --git a/packages/editor-app/vite.config.ts b/packages/editor-app/vite.config.ts new file mode 100644 index 00000000..7f36420f --- /dev/null +++ b/packages/editor-app/vite.config.ts @@ -0,0 +1,27 @@ +import { defineConfig } from 'vite'; +import react from '@vitejs/plugin-react'; + +const host = process.env.TAURI_DEV_HOST; + +export default defineConfig({ + plugins: [react()], + clearScreen: false, + server: { + host: host || false, + port: 5173, + strictPort: true, + hmr: host + ? { + protocol: 'ws', + host, + port: 5183, + } + : undefined, + }, + envPrefix: ['VITE_', 'TAURI_'], + build: { + target: 'es2021', + minify: !process.env.TAURI_DEBUG ? 'esbuild' : false, + sourcemap: !!process.env.TAURI_DEBUG, + }, +});