commit bea36ee0aa849fb383d40b46d18db07a9bbfde92 Author: yinsx Date: Mon Nov 3 11:12:18 2025 +0800 init diff --git a/.browserslistrc b/.browserslistrc new file mode 100644 index 0000000..dc3bc09 --- /dev/null +++ b/.browserslistrc @@ -0,0 +1,4 @@ +> 1% +last 2 versions +not dead +not ie 11 diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..ecea360 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,6 @@ +[*.{js,jsx,mjs,cjs,ts,tsx,mts,cts,vue}] +charset = utf-8 +indent_size = 2 +indent_style = space +insert_final_newline = true +trim_trailing_whitespace = true diff --git a/.env.development b/.env.development new file mode 100644 index 0000000..590e62c --- /dev/null +++ b/.env.development @@ -0,0 +1,6 @@ +ENV = 'production' +VUE_APP_MODE = 'production' +VITE_BASE_URL = 'https://wly-demo.wlyun.co' +VITE_ENVURL='https://wlyun-public.oss-cn-hangzhou.aliyuncs.com/shuangxi/hdr/' +VITE_MODELURL='https://wlyun-public.oss-cn-hangzhou.aliyuncs.com/shuangxi/model/' +VITE_PUBLIC_URL=/ diff --git a/.env.production b/.env.production new file mode 100644 index 0000000..442b22e --- /dev/null +++ b/.env.production @@ -0,0 +1,6 @@ +ENV = 'production' +VUE_APP_MODE = 'production' +VITE_BASE_URL = 'https://wly-demo.wlyun.co' +VITE_ENVURL='https://wlyun-public.oss-cn-hangzhou.aliyuncs.com/shuangxi/hdr/' +VITE_MODELURL='https://wlyun-public.oss-cn-hangzhou.aliyuncs.com/shuangxi/model/' +VITE_PUBLIC_URL=./ diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..11f5d71 --- /dev/null +++ b/.gitignore @@ -0,0 +1,22 @@ +.DS_Store +node_modules +/dist + +# local env files +.env.local +.env.*.local + +# Log files +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* + +# Editor directories and files +.idea +.vscode +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/README.md b/README.md new file mode 100644 index 0000000..e69de29 diff --git a/bun.lock b/bun.lock new file mode 100644 index 0000000..b680d37 --- /dev/null +++ b/bun.lock @@ -0,0 +1,954 @@ +{ + "lockfileVersion": 1, + "workspaces": { + "": { + "name": "client", + "dependencies": { + "@babylonjs/core": "^8.25.0", + "@babylonjs/loaders": "^8.25.0", + "@fontsource/roboto": "5.2.6", + "@mdi/font": "7.4.47", + "@types/babylonjs": "^2.4.5", + "pinia": "^3.0.3", + "popmotion": "^11.0.5", + "vue": "^3.5.17", + "vuetify": "^3.9.1", + }, + "devDependencies": { + "@tsconfig/node22": "^22.0.0", + "@types/node": "^22.9.0", + "@vitejs/plugin-vue": "^5.2.3", + "@vue/tsconfig": "^0.7.0", + "eslint": "^9.30.1", + "eslint-config-vuetify": "^4.0.0", + "npm-run-all2": "^7.0.2", + "sass-embedded": "^1.89.2", + "typescript": "~5.8.3", + "unplugin-fonts": "^1.3.1", + "unplugin-vue-components": "^28.8.0", + "unplugin-vue-router": "^0.14.0", + "vite": "^6.3.5", + "vite-plugin-vuetify": "^2.1.1", + "vue-router": "^4.5.1", + "vue-tsc": "^3.0.1", + }, + }, + }, + "packages": { + "@apidevtools/json-schema-ref-parser": ["@apidevtools/json-schema-ref-parser@14.2.0", "https://registry.npmmirror.com/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-14.2.0.tgz", { "dependencies": { "js-yaml": "^4.1.0" }, "peerDependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-NaGMMWwppbByagq+LwQMq6PMXHFWVu6kSwwx+eJfYTJ5zdpOvb9TIk6ZWxEEeXMUvGdVOZq3JalYsjsTZDvtkA=="], + + "@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="], + + "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.27.1", "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", {}, "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow=="], + + "@babel/parser": ["@babel/parser@7.28.3", "https://registry.npmmirror.com/@babel/parser/-/parser-7.28.3.tgz", { "dependencies": { "@babel/types": "^7.28.2" }, "bin": "./bin/babel-parser.js" }, "sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA=="], + + "@babel/types": ["@babel/types@7.28.2", "https://registry.npmmirror.com/@babel/types/-/types-7.28.2.tgz", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" } }, "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ=="], + + "@babylonjs/core": ["@babylonjs/core@8.25.0", "https://registry.npmmirror.com/@babylonjs/core/-/core-8.25.0.tgz", {}, "sha512-hBPSp+hkcOd35Dg8eUh35nTrod+J8ayLw2f5n+nynQqVEDb54CptbVTeV6cd3cnrH65xSm+us/c+h1H6JzAbXw=="], + + "@babylonjs/loaders": ["@babylonjs/loaders@8.25.0", "https://registry.npmmirror.com/@babylonjs/loaders/-/loaders-8.25.0.tgz", { "peerDependencies": { "@babylonjs/core": "^8.0.0", "babylonjs-gltf2interface": "^8.0.0" } }, "sha512-hoXE/AwOli7l+R3Nz7cmUsnt5cSrIRQWaGaUjmQ4dZJNI0JqzmkxUuQq9eJfNUtjDnjEM1RfXzIlt2QdFg4KoA=="], + + "@bufbuild/protobuf": ["@bufbuild/protobuf@2.7.0", "https://registry.npmmirror.com/@bufbuild/protobuf/-/protobuf-2.7.0.tgz", {}, "sha512-qn6tAIZEw5i/wiESBF4nQxZkl86aY4KoO0IkUa2Lh+rya64oTOdJQFlZuMwI1Qz9VBJQrQC4QlSA2DNek5gCOA=="], + + "@clack/core": ["@clack/core@0.5.0", "https://registry.npmmirror.com/@clack/core/-/core-0.5.0.tgz", { "dependencies": { "picocolors": "^1.0.0", "sisteransi": "^1.0.5" } }, "sha512-p3y0FIOwaYRUPRcMO7+dlmLh8PSRcrjuTndsiA0WAFbWES0mLZlrjVoBRZ9DzkPFJZG6KGkJmoEAY0ZcVWTkow=="], + + "@clack/prompts": ["@clack/prompts@0.11.0", "https://registry.npmmirror.com/@clack/prompts/-/prompts-0.11.0.tgz", { "dependencies": { "@clack/core": "0.5.0", "picocolors": "^1.0.0", "sisteransi": "^1.0.5" } }, "sha512-pMN5FcrEw9hUkZA4f+zLlzivQSeQf5dRGJjSUbvVYDLvpKCdQx5OaknvKzgbtXOizhP+SJJJjqEbOe55uKKfAw=="], + + "@emnapi/core": ["@emnapi/core@1.5.0", "https://registry.npmmirror.com/@emnapi/core/-/core-1.5.0.tgz", { "dependencies": { "@emnapi/wasi-threads": "1.1.0", "tslib": "^2.4.0" } }, "sha512-sbP8GzB1WDzacS8fgNPpHlp6C9VZe+SJP3F90W9rLemaQj2PzIuTEl1qDOYQf58YIpyjViI24y9aPWCjEzY2cg=="], + + "@emnapi/runtime": ["@emnapi/runtime@1.5.0", "https://registry.npmmirror.com/@emnapi/runtime/-/runtime-1.5.0.tgz", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ=="], + + "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.1.0", "https://registry.npmmirror.com/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ=="], + + "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.9", "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.9.tgz", { "os": "aix", "cpu": "ppc64" }, "sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA=="], + + "@esbuild/android-arm": ["@esbuild/android-arm@0.25.9", "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.25.9.tgz", { "os": "android", "cpu": "arm" }, "sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ=="], + + "@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.9", "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.25.9.tgz", { "os": "android", "cpu": "arm64" }, "sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg=="], + + "@esbuild/android-x64": ["@esbuild/android-x64@0.25.9", "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.25.9.tgz", { "os": "android", "cpu": "x64" }, "sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw=="], + + "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.9", "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.9.tgz", { "os": "darwin", "cpu": "arm64" }, "sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg=="], + + "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.9", "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.25.9.tgz", { "os": "darwin", "cpu": "x64" }, "sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ=="], + + "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.9", "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.9.tgz", { "os": "freebsd", "cpu": "arm64" }, "sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q=="], + + "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.9", "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.9.tgz", { "os": "freebsd", "cpu": "x64" }, "sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg=="], + + "@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.9", "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.25.9.tgz", { "os": "linux", "cpu": "arm" }, "sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw=="], + + "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.9", "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.25.9.tgz", { "os": "linux", "cpu": "arm64" }, "sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw=="], + + "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.9", "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.25.9.tgz", { "os": "linux", "cpu": "ia32" }, "sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A=="], + + "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.9", "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.25.9.tgz", { "os": "linux", "cpu": "none" }, "sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ=="], + + "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.9", "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.9.tgz", { "os": "linux", "cpu": "none" }, "sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA=="], + + "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.9", "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.9.tgz", { "os": "linux", "cpu": "ppc64" }, "sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w=="], + + "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.9", "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.9.tgz", { "os": "linux", "cpu": "none" }, "sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg=="], + + "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.9", "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.25.9.tgz", { "os": "linux", "cpu": "s390x" }, "sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA=="], + + "@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.9", "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.25.9.tgz", { "os": "linux", "cpu": "x64" }, "sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg=="], + + "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.9", "https://registry.npmmirror.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.9.tgz", { "os": "none", "cpu": "arm64" }, "sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q=="], + + "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.9", "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.9.tgz", { "os": "none", "cpu": "x64" }, "sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g=="], + + "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.9", "https://registry.npmmirror.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.9.tgz", { "os": "openbsd", "cpu": "arm64" }, "sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ=="], + + "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.9", "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.9.tgz", { "os": "openbsd", "cpu": "x64" }, "sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA=="], + + "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.25.9", "https://registry.npmmirror.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.9.tgz", { "os": "none", "cpu": "arm64" }, "sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg=="], + + "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.9", "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.25.9.tgz", { "os": "sunos", "cpu": "x64" }, "sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw=="], + + "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.9", "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.25.9.tgz", { "os": "win32", "cpu": "arm64" }, "sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ=="], + + "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.9", "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.25.9.tgz", { "os": "win32", "cpu": "ia32" }, "sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww=="], + + "@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.9", "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.25.9.tgz", { "os": "win32", "cpu": "x64" }, "sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ=="], + + "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.7.0", "https://registry.npmmirror.com/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw=="], + + "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.1", "https://registry.npmmirror.com/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", {}, "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ=="], + + "@eslint/compat": ["@eslint/compat@1.3.2", "https://registry.npmmirror.com/@eslint/compat/-/compat-1.3.2.tgz", { "peerDependencies": { "eslint": "^8.40 || 9" }, "optionalPeers": ["eslint"] }, "sha512-jRNwzTbd6p2Rw4sZ1CgWRS8YMtqG15YyZf7zvb6gY2rB2u6n+2Z+ELW0GtL0fQgyl0pr4Y/BzBfng/BdsereRA=="], + + "@eslint/config-array": ["@eslint/config-array@0.21.0", "https://registry.npmmirror.com/@eslint/config-array/-/config-array-0.21.0.tgz", { "dependencies": { "@eslint/object-schema": "^2.1.6", "debug": "^4.3.1", "minimatch": "^3.1.2" } }, "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ=="], + + "@eslint/config-helpers": ["@eslint/config-helpers@0.3.1", "https://registry.npmmirror.com/@eslint/config-helpers/-/config-helpers-0.3.1.tgz", {}, "sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA=="], + + "@eslint/core": ["@eslint/core@0.15.2", "https://registry.npmmirror.com/@eslint/core/-/core-0.15.2.tgz", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg=="], + + "@eslint/eslintrc": ["@eslint/eslintrc@3.3.1", "https://registry.npmmirror.com/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" } }, "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ=="], + + "@eslint/js": ["@eslint/js@9.34.0", "https://registry.npmmirror.com/@eslint/js/-/js-9.34.0.tgz", {}, "sha512-EoyvqQnBNsV1CWaEJ559rxXL4c8V92gxirbawSmVUOWXlsRxxQXl6LmCpdUblgxgSkDIqKnhzba2SjRTI/A5Rw=="], + + "@eslint/object-schema": ["@eslint/object-schema@2.1.6", "https://registry.npmmirror.com/@eslint/object-schema/-/object-schema-2.1.6.tgz", {}, "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA=="], + + "@eslint/plugin-kit": ["@eslint/plugin-kit@0.3.5", "https://registry.npmmirror.com/@eslint/plugin-kit/-/plugin-kit-0.3.5.tgz", { "dependencies": { "@eslint/core": "^0.15.2", "levn": "^0.4.1" } }, "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w=="], + + "@fontsource/roboto": ["@fontsource/roboto@5.2.6", "https://registry.npmmirror.com/@fontsource/roboto/-/roboto-5.2.6.tgz", {}, "sha512-hzarG7yAhMoP418smNgfY4fO7UmuUEm5JUtbxCoCcFHT0hOJB+d/qAEyoNjz7YkPU5OjM2LM8rJnW8hfm0JLaA=="], + + "@humanfs/core": ["@humanfs/core@0.19.1", "https://registry.npmmirror.com/@humanfs/core/-/core-0.19.1.tgz", {}, "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA=="], + + "@humanfs/node": ["@humanfs/node@0.16.6", "https://registry.npmmirror.com/@humanfs/node/-/node-0.16.6.tgz", { "dependencies": { "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.3.0" } }, "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw=="], + + "@humanwhocodes/module-importer": ["@humanwhocodes/module-importer@1.0.1", "https://registry.npmmirror.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", {}, "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="], + + "@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.3", "https://registry.npmmirror.com/@humanwhocodes/retry/-/retry-0.4.3.tgz", {}, "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ=="], + + "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="], + + "@mdi/font": ["@mdi/font@7.4.47", "https://registry.npmmirror.com/@mdi/font/-/font-7.4.47.tgz", {}, "sha512-43MtGpd585SNzHZPcYowu/84Vz2a2g31TvPMTm9uTiCSWzaheQySUcSyUH/46fPnuPQWof2yd0pGBtzee/IQWw=="], + + "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@0.2.12", "https://registry.npmmirror.com/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", { "dependencies": { "@emnapi/core": "^1.4.3", "@emnapi/runtime": "^1.4.3", "@tybys/wasm-util": "^0.10.0" } }, "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ=="], + + "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], + + "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="], + + "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "https://registry.npmmirror.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="], + + "@parcel/watcher": ["@parcel/watcher@2.5.1", "https://registry.npmmirror.com/@parcel/watcher/-/watcher-2.5.1.tgz", { "dependencies": { "detect-libc": "^1.0.3", "is-glob": "^4.0.3", "micromatch": "^4.0.5", "node-addon-api": "^7.0.0" }, "optionalDependencies": { "@parcel/watcher-android-arm64": "2.5.1", "@parcel/watcher-darwin-arm64": "2.5.1", "@parcel/watcher-darwin-x64": "2.5.1", "@parcel/watcher-freebsd-x64": "2.5.1", "@parcel/watcher-linux-arm-glibc": "2.5.1", "@parcel/watcher-linux-arm-musl": "2.5.1", "@parcel/watcher-linux-arm64-glibc": "2.5.1", "@parcel/watcher-linux-arm64-musl": "2.5.1", "@parcel/watcher-linux-x64-glibc": "2.5.1", "@parcel/watcher-linux-x64-musl": "2.5.1", "@parcel/watcher-win32-arm64": "2.5.1", "@parcel/watcher-win32-ia32": "2.5.1", "@parcel/watcher-win32-x64": "2.5.1" } }, "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg=="], + + "@parcel/watcher-android-arm64": ["@parcel/watcher-android-arm64@2.5.1", "https://registry.npmmirror.com/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz", { "os": "android", "cpu": "arm64" }, "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA=="], + + "@parcel/watcher-darwin-arm64": ["@parcel/watcher-darwin-arm64@2.5.1", "https://registry.npmmirror.com/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz", { "os": "darwin", "cpu": "arm64" }, "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw=="], + + "@parcel/watcher-darwin-x64": ["@parcel/watcher-darwin-x64@2.5.1", "https://registry.npmmirror.com/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz", { "os": "darwin", "cpu": "x64" }, "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg=="], + + "@parcel/watcher-freebsd-x64": ["@parcel/watcher-freebsd-x64@2.5.1", "https://registry.npmmirror.com/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz", { "os": "freebsd", "cpu": "x64" }, "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ=="], + + "@parcel/watcher-linux-arm-glibc": ["@parcel/watcher-linux-arm-glibc@2.5.1", "https://registry.npmmirror.com/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz", { "os": "linux", "cpu": "arm" }, "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA=="], + + "@parcel/watcher-linux-arm-musl": ["@parcel/watcher-linux-arm-musl@2.5.1", "https://registry.npmmirror.com/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz", { "os": "linux", "cpu": "arm" }, "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q=="], + + "@parcel/watcher-linux-arm64-glibc": ["@parcel/watcher-linux-arm64-glibc@2.5.1", "https://registry.npmmirror.com/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz", { "os": "linux", "cpu": "arm64" }, "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w=="], + + "@parcel/watcher-linux-arm64-musl": ["@parcel/watcher-linux-arm64-musl@2.5.1", "https://registry.npmmirror.com/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz", { "os": "linux", "cpu": "arm64" }, "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg=="], + + "@parcel/watcher-linux-x64-glibc": ["@parcel/watcher-linux-x64-glibc@2.5.1", "https://registry.npmmirror.com/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz", { "os": "linux", "cpu": "x64" }, "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A=="], + + "@parcel/watcher-linux-x64-musl": ["@parcel/watcher-linux-x64-musl@2.5.1", "https://registry.npmmirror.com/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz", { "os": "linux", "cpu": "x64" }, "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg=="], + + "@parcel/watcher-win32-arm64": ["@parcel/watcher-win32-arm64@2.5.1", "https://registry.npmmirror.com/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz", { "os": "win32", "cpu": "arm64" }, "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw=="], + + "@parcel/watcher-win32-ia32": ["@parcel/watcher-win32-ia32@2.5.1", "https://registry.npmmirror.com/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz", { "os": "win32", "cpu": "ia32" }, "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ=="], + + "@parcel/watcher-win32-x64": ["@parcel/watcher-win32-x64@2.5.1", "https://registry.npmmirror.com/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz", { "os": "win32", "cpu": "x64" }, "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA=="], + + "@pkgr/core": ["@pkgr/core@0.2.9", "https://registry.npmmirror.com/@pkgr/core/-/core-0.2.9.tgz", {}, "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA=="], + + "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.50.0", "https://registry.npmmirror.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.50.0.tgz", { "os": "android", "cpu": "arm" }, "sha512-lVgpeQyy4fWN5QYebtW4buT/4kn4p4IJ+kDNB4uYNT5b8c8DLJDg6titg20NIg7E8RWwdWZORW6vUFfrLyG3KQ=="], + + "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.50.0", "https://registry.npmmirror.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.50.0.tgz", { "os": "android", "cpu": "arm64" }, "sha512-2O73dR4Dc9bp+wSYhviP6sDziurB5/HCym7xILKifWdE9UsOe2FtNcM+I4xZjKrfLJnq5UR8k9riB87gauiQtw=="], + + "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.50.0", "https://registry.npmmirror.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.50.0.tgz", { "os": "darwin", "cpu": "arm64" }, "sha512-vwSXQN8T4sKf1RHr1F0s98Pf8UPz7pS6P3LG9NSmuw0TVh7EmaE+5Ny7hJOZ0M2yuTctEsHHRTMi2wuHkdS6Hg=="], + + "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.50.0", "https://registry.npmmirror.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.50.0.tgz", { "os": "darwin", "cpu": "x64" }, "sha512-cQp/WG8HE7BCGyFVuzUg0FNmupxC+EPZEwWu2FCGGw5WDT1o2/YlENbm5e9SMvfDFR6FRhVCBePLqj0o8MN7Vw=="], + + "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.50.0", "https://registry.npmmirror.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.50.0.tgz", { "os": "freebsd", "cpu": "arm64" }, "sha512-UR1uTJFU/p801DvvBbtDD7z9mQL8J80xB0bR7DqW7UGQHRm/OaKzp4is7sQSdbt2pjjSS72eAtRh43hNduTnnQ=="], + + "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.50.0", "https://registry.npmmirror.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.50.0.tgz", { "os": "freebsd", "cpu": "x64" }, "sha512-G/DKyS6PK0dD0+VEzH/6n/hWDNPDZSMBmqsElWnCRGrYOb2jC0VSupp7UAHHQ4+QILwkxSMaYIbQ72dktp8pKA=="], + + "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.50.0", "https://registry.npmmirror.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.50.0.tgz", { "os": "linux", "cpu": "arm" }, "sha512-u72Mzc6jyJwKjJbZZcIYmd9bumJu7KNmHYdue43vT1rXPm2rITwmPWF0mmPzLm9/vJWxIRbao/jrQmxTO0Sm9w=="], + + "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.50.0", "https://registry.npmmirror.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.50.0.tgz", { "os": "linux", "cpu": "arm" }, "sha512-S4UefYdV0tnynDJV1mdkNawp0E5Qm2MtSs330IyHgaccOFrwqsvgigUD29uT+B/70PDY1eQ3t40+xf6wIvXJyg=="], + + "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.50.0", "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.50.0.tgz", { "os": "linux", "cpu": "arm64" }, "sha512-1EhkSvUQXJsIhk4msxP5nNAUWoB4MFDHhtc4gAYvnqoHlaL9V3F37pNHabndawsfy/Tp7BPiy/aSa6XBYbaD1g=="], + + "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.50.0", "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.50.0.tgz", { "os": "linux", "cpu": "arm64" }, "sha512-EtBDIZuDtVg75xIPIK1l5vCXNNCIRM0OBPUG+tbApDuJAy9mKago6QxX+tfMzbCI6tXEhMuZuN1+CU8iDW+0UQ=="], + + "@rollup/rollup-linux-loongarch64-gnu": ["@rollup/rollup-linux-loongarch64-gnu@4.50.0", "https://registry.npmmirror.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.50.0.tgz", { "os": "linux", "cpu": "none" }, "sha512-BGYSwJdMP0hT5CCmljuSNx7+k+0upweM2M4YGfFBjnFSZMHOLYR0gEEj/dxyYJ6Zc6AiSeaBY8dWOa11GF/ppQ=="], + + "@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.50.0", "https://registry.npmmirror.com/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.50.0.tgz", { "os": "linux", "cpu": "ppc64" }, "sha512-I1gSMzkVe1KzAxKAroCJL30hA4DqSi+wGc5gviD0y3IL/VkvcnAqwBf4RHXHyvH66YVHxpKO8ojrgc4SrWAnLg=="], + + "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.50.0", "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.50.0.tgz", { "os": "linux", "cpu": "none" }, "sha512-bSbWlY3jZo7molh4tc5dKfeSxkqnf48UsLqYbUhnkdnfgZjgufLS/NTA8PcP/dnvct5CCdNkABJ56CbclMRYCA=="], + + "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.50.0", "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.50.0.tgz", { "os": "linux", "cpu": "none" }, "sha512-LSXSGumSURzEQLT2e4sFqFOv3LWZsEF8FK7AAv9zHZNDdMnUPYH3t8ZlaeYYZyTXnsob3htwTKeWtBIkPV27iQ=="], + + "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.50.0", "https://registry.npmmirror.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.50.0.tgz", { "os": "linux", "cpu": "s390x" }, "sha512-CxRKyakfDrsLXiCyucVfVWVoaPA4oFSpPpDwlMcDFQvrv3XY6KEzMtMZrA+e/goC8xxp2WSOxHQubP8fPmmjOQ=="], + + "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.50.0", "https://registry.npmmirror.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.50.0.tgz", { "os": "linux", "cpu": "x64" }, "sha512-8PrJJA7/VU8ToHVEPu14FzuSAqVKyo5gg/J8xUerMbyNkWkO9j2ExBho/68RnJsMGNJq4zH114iAttgm7BZVkA=="], + + "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.50.0", "https://registry.npmmirror.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.50.0.tgz", { "os": "linux", "cpu": "x64" }, "sha512-SkE6YQp+CzpyOrbw7Oc4MgXFvTw2UIBElvAvLCo230pyxOLmYwRPwZ/L5lBe/VW/qT1ZgND9wJfOsdy0XptRvw=="], + + "@rollup/rollup-openharmony-arm64": ["@rollup/rollup-openharmony-arm64@4.50.0", "https://registry.npmmirror.com/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.50.0.tgz", { "os": "none", "cpu": "arm64" }, "sha512-PZkNLPfvXeIOgJWA804zjSFH7fARBBCpCXxgkGDRjjAhRLOR8o0IGS01ykh5GYfod4c2yiiREuDM8iZ+pVsT+Q=="], + + "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.50.0", "https://registry.npmmirror.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.50.0.tgz", { "os": "win32", "cpu": "arm64" }, "sha512-q7cIIdFvWQoaCbLDUyUc8YfR3Jh2xx3unO8Dn6/TTogKjfwrax9SyfmGGK6cQhKtjePI7jRfd7iRYcxYs93esg=="], + + "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.50.0", "https://registry.npmmirror.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.50.0.tgz", { "os": "win32", "cpu": "ia32" }, "sha512-XzNOVg/YnDOmFdDKcxxK410PrcbcqZkBmz+0FicpW5jtjKQxcW1BZJEQOF0NJa6JO7CZhett8GEtRN/wYLYJuw=="], + + "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.50.0", "https://registry.npmmirror.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.50.0.tgz", { "os": "win32", "cpu": "x64" }, "sha512-xMmiWRR8sp72Zqwjgtf3QbZfF1wdh8X2ABu3EaozvZcyHJeU0r+XAnXdKgs4cCAp6ORoYoCygipYP1mjmbjrsg=="], + + "@stylistic/eslint-plugin": ["@stylistic/eslint-plugin@4.4.1", "https://registry.npmmirror.com/@stylistic/eslint-plugin/-/eslint-plugin-4.4.1.tgz", { "dependencies": { "@typescript-eslint/utils": "^8.32.1", "eslint-visitor-keys": "^4.2.0", "espree": "^10.3.0", "estraverse": "^5.3.0", "picomatch": "^4.0.2" }, "peerDependencies": { "eslint": ">=9.0.0" } }, "sha512-CEigAk7eOLyHvdgmpZsKFwtiqS2wFwI1fn4j09IU9GmD4euFM4jEBAViWeCqaNLlbX2k2+A/Fq9cje4HQBXuJQ=="], + + "@tsconfig/node22": ["@tsconfig/node22@22.0.2", "https://registry.npmmirror.com/@tsconfig/node22/-/node22-22.0.2.tgz", {}, "sha512-Kmwj4u8sDRDrMYRoN9FDEcXD8UpBSaPQQ24Gz+Gamqfm7xxn+GBR7ge/Z7pK8OXNGyUzbSwJj+TH6B+DS/epyA=="], + + "@tybys/wasm-util": ["@tybys/wasm-util@0.10.0", "https://registry.npmmirror.com/@tybys/wasm-util/-/wasm-util-0.10.0.tgz", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-VyyPYFlOMNylG45GoAe0xDoLwWuowvf92F9kySqzYh8vmYm7D2u4iUJKa1tOUpS70Ku13ASrOkS4ScXFsTaCNQ=="], + + "@types/babylonjs": ["@types/babylonjs@2.4.5", "https://registry.npmmirror.com/@types/babylonjs/-/babylonjs-2.4.5.tgz", { "dependencies": { "babylonjs": "*" } }, "sha512-hHImUhEeDk8OAhhwXeEsDo3osfF+zTREhSOQgAoj5E0iJL2/bN2ojavSyYFdm7vXK8WNhf7i4YEF6B3ix/WL+Q=="], + + "@types/estree": ["@types/estree@1.0.8", "https://registry.npmmirror.com/@types/estree/-/estree-1.0.8.tgz", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], + + "@types/json-schema": ["@types/json-schema@7.0.15", "https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.15.tgz", {}, "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="], + + "@types/node": ["@types/node@22.18.0", "https://registry.npmmirror.com/@types/node/-/node-22.18.0.tgz", { "dependencies": { "undici-types": "~6.21.0" } }, "sha512-m5ObIqwsUp6BZzyiy4RdZpzWGub9bqLJMvZDD0QMXhxjqMHMENlj+SqF5QxoUwaQNFe+8kz8XM8ZQhqkQPTgMQ=="], + + "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.41.0", "https://registry.npmmirror.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.41.0.tgz", { "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.41.0", "@typescript-eslint/type-utils": "8.41.0", "@typescript-eslint/utils": "8.41.0", "@typescript-eslint/visitor-keys": "8.41.0", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.41.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-8fz6oa6wEKZrhXWro/S3n2eRJqlRcIa6SlDh59FXJ5Wp5XRZ8B9ixpJDcjadHq47hMx0u+HW6SNa6LjJQ6NLtw=="], + + "@typescript-eslint/parser": ["@typescript-eslint/parser@8.41.0", "https://registry.npmmirror.com/@typescript-eslint/parser/-/parser-8.41.0.tgz", { "dependencies": { "@typescript-eslint/scope-manager": "8.41.0", "@typescript-eslint/types": "8.41.0", "@typescript-eslint/typescript-estree": "8.41.0", "@typescript-eslint/visitor-keys": "8.41.0", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-gTtSdWX9xiMPA/7MV9STjJOOYtWwIJIYxkQxnSV1U3xcE+mnJSH3f6zI0RYP+ew66WSlZ5ed+h0VCxsvdC1jJg=="], + + "@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.41.0", "https://registry.npmmirror.com/@typescript-eslint/project-service/-/project-service-8.41.0.tgz", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.41.0", "@typescript-eslint/types": "^8.41.0", "debug": "^4.3.4" }, "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-b8V9SdGBQzQdjJ/IO3eDifGpDBJfvrNTp2QD9P2BeqWTGrRibgfgIlBSw6z3b6R7dPzg752tOs4u/7yCLxksSQ=="], + + "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.41.0", "https://registry.npmmirror.com/@typescript-eslint/scope-manager/-/scope-manager-8.41.0.tgz", { "dependencies": { "@typescript-eslint/types": "8.41.0", "@typescript-eslint/visitor-keys": "8.41.0" } }, "sha512-n6m05bXn/Cd6DZDGyrpXrELCPVaTnLdPToyhBoFkLIMznRUQUEQdSp96s/pcWSQdqOhrgR1mzJ+yItK7T+WPMQ=="], + + "@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.41.0", "https://registry.npmmirror.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.41.0.tgz", { "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-TDhxYFPUYRFxFhuU5hTIJk+auzM/wKvWgoNYOPcOf6i4ReYlOoYN8q1dV5kOTjNQNJgzWN3TUUQMtlLOcUgdUw=="], + + "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.41.0", "https://registry.npmmirror.com/@typescript-eslint/type-utils/-/type-utils-8.41.0.tgz", { "dependencies": { "@typescript-eslint/types": "8.41.0", "@typescript-eslint/typescript-estree": "8.41.0", "@typescript-eslint/utils": "8.41.0", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-63qt1h91vg3KsjVVonFJWjgSK7pZHSQFKH6uwqxAH9bBrsyRhO6ONoKyXxyVBzG1lJnFAJcKAcxLS54N1ee1OQ=="], + + "@typescript-eslint/types": ["@typescript-eslint/types@8.41.0", "https://registry.npmmirror.com/@typescript-eslint/types/-/types-8.41.0.tgz", {}, "sha512-9EwxsWdVqh42afLbHP90n2VdHaWU/oWgbH2P0CfcNfdKL7CuKpwMQGjwev56vWu9cSKU7FWSu6r9zck6CVfnag=="], + + "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.41.0", "https://registry.npmmirror.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.41.0.tgz", { "dependencies": { "@typescript-eslint/project-service": "8.41.0", "@typescript-eslint/tsconfig-utils": "8.41.0", "@typescript-eslint/types": "8.41.0", "@typescript-eslint/visitor-keys": "8.41.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-D43UwUYJmGhuwHfY7MtNKRZMmfd8+p/eNSfFe6tH5mbVDto+VQCayeAt35rOx3Cs6wxD16DQtIKw/YXxt5E0UQ=="], + + "@typescript-eslint/utils": ["@typescript-eslint/utils@8.41.0", "https://registry.npmmirror.com/@typescript-eslint/utils/-/utils-8.41.0.tgz", { "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", "@typescript-eslint/scope-manager": "8.41.0", "@typescript-eslint/types": "8.41.0", "@typescript-eslint/typescript-estree": "8.41.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-udbCVstxZ5jiPIXrdH+BZWnPatjlYwJuJkDA4Tbo3WyYLh8NvB+h/bKeSZHDOFKfphsZYJQqaFtLeXEqurQn1A=="], + + "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.41.0", "https://registry.npmmirror.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.41.0.tgz", { "dependencies": { "@typescript-eslint/types": "8.41.0", "eslint-visitor-keys": "^4.2.1" } }, "sha512-+GeGMebMCy0elMNg67LRNoVnUFPIm37iu5CmHESVx56/9Jsfdpsvbv605DQ81Pi/x11IdKUsS5nzgTYbCQU9fg=="], + + "@unrs/resolver-binding-android-arm-eabi": ["@unrs/resolver-binding-android-arm-eabi@1.11.1", "https://registry.npmmirror.com/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz", { "os": "android", "cpu": "arm" }, "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw=="], + + "@unrs/resolver-binding-android-arm64": ["@unrs/resolver-binding-android-arm64@1.11.1", "https://registry.npmmirror.com/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz", { "os": "android", "cpu": "arm64" }, "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g=="], + + "@unrs/resolver-binding-darwin-arm64": ["@unrs/resolver-binding-darwin-arm64@1.11.1", "https://registry.npmmirror.com/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.11.1.tgz", { "os": "darwin", "cpu": "arm64" }, "sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g=="], + + "@unrs/resolver-binding-darwin-x64": ["@unrs/resolver-binding-darwin-x64@1.11.1", "https://registry.npmmirror.com/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.1.tgz", { "os": "darwin", "cpu": "x64" }, "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ=="], + + "@unrs/resolver-binding-freebsd-x64": ["@unrs/resolver-binding-freebsd-x64@1.11.1", "https://registry.npmmirror.com/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.1.tgz", { "os": "freebsd", "cpu": "x64" }, "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw=="], + + "@unrs/resolver-binding-linux-arm-gnueabihf": ["@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1", "https://registry.npmmirror.com/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.1.tgz", { "os": "linux", "cpu": "arm" }, "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw=="], + + "@unrs/resolver-binding-linux-arm-musleabihf": ["@unrs/resolver-binding-linux-arm-musleabihf@1.11.1", "https://registry.npmmirror.com/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz", { "os": "linux", "cpu": "arm" }, "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw=="], + + "@unrs/resolver-binding-linux-arm64-gnu": ["@unrs/resolver-binding-linux-arm64-gnu@1.11.1", "https://registry.npmmirror.com/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz", { "os": "linux", "cpu": "arm64" }, "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ=="], + + "@unrs/resolver-binding-linux-arm64-musl": ["@unrs/resolver-binding-linux-arm64-musl@1.11.1", "https://registry.npmmirror.com/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz", { "os": "linux", "cpu": "arm64" }, "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w=="], + + "@unrs/resolver-binding-linux-ppc64-gnu": ["@unrs/resolver-binding-linux-ppc64-gnu@1.11.1", "https://registry.npmmirror.com/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.1.tgz", { "os": "linux", "cpu": "ppc64" }, "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA=="], + + "@unrs/resolver-binding-linux-riscv64-gnu": ["@unrs/resolver-binding-linux-riscv64-gnu@1.11.1", "https://registry.npmmirror.com/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.1.tgz", { "os": "linux", "cpu": "none" }, "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ=="], + + "@unrs/resolver-binding-linux-riscv64-musl": ["@unrs/resolver-binding-linux-riscv64-musl@1.11.1", "https://registry.npmmirror.com/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.1.tgz", { "os": "linux", "cpu": "none" }, "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew=="], + + "@unrs/resolver-binding-linux-s390x-gnu": ["@unrs/resolver-binding-linux-s390x-gnu@1.11.1", "https://registry.npmmirror.com/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.1.tgz", { "os": "linux", "cpu": "s390x" }, "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg=="], + + "@unrs/resolver-binding-linux-x64-gnu": ["@unrs/resolver-binding-linux-x64-gnu@1.11.1", "https://registry.npmmirror.com/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz", { "os": "linux", "cpu": "x64" }, "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w=="], + + "@unrs/resolver-binding-linux-x64-musl": ["@unrs/resolver-binding-linux-x64-musl@1.11.1", "https://registry.npmmirror.com/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz", { "os": "linux", "cpu": "x64" }, "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA=="], + + "@unrs/resolver-binding-wasm32-wasi": ["@unrs/resolver-binding-wasm32-wasi@1.11.1", "https://registry.npmmirror.com/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz", { "dependencies": { "@napi-rs/wasm-runtime": "^0.2.11" }, "cpu": "none" }, "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ=="], + + "@unrs/resolver-binding-win32-arm64-msvc": ["@unrs/resolver-binding-win32-arm64-msvc@1.11.1", "https://registry.npmmirror.com/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz", { "os": "win32", "cpu": "arm64" }, "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw=="], + + "@unrs/resolver-binding-win32-ia32-msvc": ["@unrs/resolver-binding-win32-ia32-msvc@1.11.1", "https://registry.npmmirror.com/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.1.tgz", { "os": "win32", "cpu": "ia32" }, "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ=="], + + "@unrs/resolver-binding-win32-x64-msvc": ["@unrs/resolver-binding-win32-x64-msvc@1.11.1", "https://registry.npmmirror.com/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz", { "os": "win32", "cpu": "x64" }, "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g=="], + + "@vitejs/plugin-vue": ["@vitejs/plugin-vue@5.2.4", "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz", { "peerDependencies": { "vite": "^5.0.0 || ^6.0.0", "vue": "^3.2.25" } }, "sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA=="], + + "@vitest/eslint-plugin": ["@vitest/eslint-plugin@1.3.5", "https://registry.npmmirror.com/@vitest/eslint-plugin/-/eslint-plugin-1.3.5.tgz", { "dependencies": { "@typescript-eslint/scope-manager": "^8.41.0", "@typescript-eslint/utils": "^8.24.1" }, "peerDependencies": { "eslint": ">= 8.57.0", "typescript": ">= 5.0.0", "vitest": "*" }, "optionalPeers": ["typescript", "vitest"] }, "sha512-vdQL1s+Yb9i7xXFur0qRpECwkafrp+L84EXppg3Xs+Iu+5M8smkh5I2rD5opD7cEaSBE3UEebB3xbDANqALpKA=="], + + "@volar/language-core": ["@volar/language-core@2.4.23", "https://registry.npmmirror.com/@volar/language-core/-/language-core-2.4.23.tgz", { "dependencies": { "@volar/source-map": "2.4.23" } }, "sha512-hEEd5ET/oSmBC6pi1j6NaNYRWoAiDhINbT8rmwtINugR39loROSlufGdYMF9TaKGfz+ViGs1Idi3mAhnuPcoGQ=="], + + "@volar/source-map": ["@volar/source-map@2.4.23", "https://registry.npmmirror.com/@volar/source-map/-/source-map-2.4.23.tgz", {}, "sha512-Z1Uc8IB57Lm6k7q6KIDu/p+JWtf3xsXJqAX/5r18hYOTpJyBn0KXUR8oTJ4WFYOcDzWC9n3IflGgHowx6U6z9Q=="], + + "@volar/typescript": ["@volar/typescript@2.4.23", "https://registry.npmmirror.com/@volar/typescript/-/typescript-2.4.23.tgz", { "dependencies": { "@volar/language-core": "2.4.23", "path-browserify": "^1.0.1", "vscode-uri": "^3.0.8" } }, "sha512-lAB5zJghWxVPqfcStmAP1ZqQacMpe90UrP5RJ3arDyrhy4aCUQqmxPPLB2PWDKugvylmO41ljK7vZ+t6INMTag=="], + + "@vue-macros/common": ["@vue-macros/common@3.0.0-beta.15", "https://registry.npmmirror.com/@vue-macros/common/-/common-3.0.0-beta.15.tgz", { "dependencies": { "@vue/compiler-sfc": "^3.5.17", "ast-kit": "^2.1.0", "local-pkg": "^1.1.1", "magic-string-ast": "^1.0.0", "unplugin-utils": "^0.2.4" }, "peerDependencies": { "vue": "^2.7.0 || ^3.2.25" }, "optionalPeers": ["vue"] }, "sha512-DMgq/rIh1H20WYNWU7krIbEfJRYDDhy7ix64GlT4AVUJZZWCZ5pxiYVJR3A3GmWQPkn7Pg7i3oIiGqu4JGC65w=="], + + "@vue/compiler-core": ["@vue/compiler-core@3.5.20", "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.5.20.tgz", { "dependencies": { "@babel/parser": "^7.28.3", "@vue/shared": "3.5.20", "entities": "^4.5.0", "estree-walker": "^2.0.2", "source-map-js": "^1.2.1" } }, "sha512-8TWXUyiqFd3GmP4JTX9hbiTFRwYHgVL/vr3cqhr4YQ258+9FADwvj7golk2sWNGHR67QgmCZ8gz80nQcMokhwg=="], + + "@vue/compiler-dom": ["@vue/compiler-dom@3.5.20", "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.5.20.tgz", { "dependencies": { "@vue/compiler-core": "3.5.20", "@vue/shared": "3.5.20" } }, "sha512-whB44M59XKjqUEYOMPYU0ijUV0G+4fdrHVKDe32abNdX/kJe1NUEMqsi4cwzXa9kyM9w5S8WqFsrfo1ogtBZGQ=="], + + "@vue/compiler-sfc": ["@vue/compiler-sfc@3.5.20", "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.5.20.tgz", { "dependencies": { "@babel/parser": "^7.28.3", "@vue/compiler-core": "3.5.20", "@vue/compiler-dom": "3.5.20", "@vue/compiler-ssr": "3.5.20", "@vue/shared": "3.5.20", "estree-walker": "^2.0.2", "magic-string": "^0.30.17", "postcss": "^8.5.6", "source-map-js": "^1.2.1" } }, "sha512-SFcxapQc0/feWiSBfkGsa1v4DOrnMAQSYuvDMpEaxbpH5dKbnEM5KobSNSgU+1MbHCl+9ftm7oQWxvwDB6iBfw=="], + + "@vue/compiler-ssr": ["@vue/compiler-ssr@3.5.20", "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.5.20.tgz", { "dependencies": { "@vue/compiler-dom": "3.5.20", "@vue/shared": "3.5.20" } }, "sha512-RSl5XAMc5YFUXpDQi+UQDdVjH9FnEpLDHIALg5J0ITHxkEzJ8uQLlo7CIbjPYqmZtt6w0TsIPbo1izYXwDG7JA=="], + + "@vue/compiler-vue2": ["@vue/compiler-vue2@2.7.16", "https://registry.npmmirror.com/@vue/compiler-vue2/-/compiler-vue2-2.7.16.tgz", { "dependencies": { "de-indent": "^1.0.2", "he": "^1.2.0" } }, "sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A=="], + + "@vue/devtools-api": ["@vue/devtools-api@6.6.4", "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-6.6.4.tgz", {}, "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g=="], + + "@vue/devtools-kit": ["@vue/devtools-kit@7.7.7", "https://registry.npmmirror.com/@vue/devtools-kit/-/devtools-kit-7.7.7.tgz", { "dependencies": { "@vue/devtools-shared": "^7.7.7", "birpc": "^2.3.0", "hookable": "^5.5.3", "mitt": "^3.0.1", "perfect-debounce": "^1.0.0", "speakingurl": "^14.0.1", "superjson": "^2.2.2" } }, "sha512-wgoZtxcTta65cnZ1Q6MbAfePVFxfM+gq0saaeytoph7nEa7yMXoi6sCPy4ufO111B9msnw0VOWjPEFCXuAKRHA=="], + + "@vue/devtools-shared": ["@vue/devtools-shared@7.7.7", "https://registry.npmmirror.com/@vue/devtools-shared/-/devtools-shared-7.7.7.tgz", { "dependencies": { "rfdc": "^1.4.1" } }, "sha512-+udSj47aRl5aKb0memBvcUG9koarqnxNM5yjuREvqwK6T3ap4mn3Zqqc17QrBFTqSMjr3HK1cvStEZpMDpfdyw=="], + + "@vue/language-core": ["@vue/language-core@3.0.6", "https://registry.npmmirror.com/@vue/language-core/-/language-core-3.0.6.tgz", { "dependencies": { "@volar/language-core": "2.4.23", "@vue/compiler-dom": "^3.5.0", "@vue/compiler-vue2": "^2.7.16", "@vue/shared": "^3.5.0", "alien-signals": "^2.0.5", "muggle-string": "^0.4.1", "path-browserify": "^1.0.1", "picomatch": "^4.0.2" }, "peerDependencies": { "typescript": "*" }, "optionalPeers": ["typescript"] }, "sha512-e2RRzYWm+qGm8apUHW1wA5RQxzNhkqbbKdbKhiDUcmMrNAZGyM8aTiL3UrTqkaFI5s7wJRGGrp4u3jgusuBp2A=="], + + "@vue/reactivity": ["@vue/reactivity@3.5.20", "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.5.20.tgz", { "dependencies": { "@vue/shared": "3.5.20" } }, "sha512-hS8l8x4cl1fmZpSQX/NXlqWKARqEsNmfkwOIYqtR2F616NGfsLUm0G6FQBK6uDKUCVyi1YOL8Xmt/RkZcd/jYQ=="], + + "@vue/runtime-core": ["@vue/runtime-core@3.5.20", "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.5.20.tgz", { "dependencies": { "@vue/reactivity": "3.5.20", "@vue/shared": "3.5.20" } }, "sha512-vyQRiH5uSZlOa+4I/t4Qw/SsD/gbth0SW2J7oMeVlMFMAmsG1rwDD6ok0VMmjXY3eI0iHNSSOBilEDW98PLRKw=="], + + "@vue/runtime-dom": ["@vue/runtime-dom@3.5.20", "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.5.20.tgz", { "dependencies": { "@vue/reactivity": "3.5.20", "@vue/runtime-core": "3.5.20", "@vue/shared": "3.5.20", "csstype": "^3.1.3" } }, "sha512-KBHzPld/Djw3im0CQ7tGCpgRedryIn4CcAl047EhFTCCPT2xFf4e8j6WeKLgEEoqPSl9TYqShc3Q6tpWpz/Xgw=="], + + "@vue/server-renderer": ["@vue/server-renderer@3.5.20", "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.5.20.tgz", { "dependencies": { "@vue/compiler-ssr": "3.5.20", "@vue/shared": "3.5.20" }, "peerDependencies": { "vue": "3.5.20" } }, "sha512-HthAS0lZJDH21HFJBVNTtx+ULcIbJQRpjSVomVjfyPkFSpCwvsPTA+jIzOaUm3Hrqx36ozBHePztQFg6pj5aKg=="], + + "@vue/shared": ["@vue/shared@3.5.20", "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.20.tgz", {}, "sha512-SoRGP596KU/ig6TfgkCMbXkr4YJ91n/QSdMuqeP5r3hVIYA3CPHUBCc7Skak0EAKV+5lL4KyIh61VA/pK1CIAA=="], + + "@vue/tsconfig": ["@vue/tsconfig@0.7.0", "https://registry.npmmirror.com/@vue/tsconfig/-/tsconfig-0.7.0.tgz", { "peerDependencies": { "typescript": "5.x", "vue": "^3.4.0" }, "optionalPeers": ["typescript", "vue"] }, "sha512-ku2uNz5MaZ9IerPPUyOHzyjhXoX2kVJaVf7hL315DC17vS6IiZRmmCPfggNbU16QTvM80+uYYy3eYJB59WCtvg=="], + + "@vuetify/loader-shared": ["@vuetify/loader-shared@2.1.1", "https://registry.npmmirror.com/@vuetify/loader-shared/-/loader-shared-2.1.1.tgz", { "dependencies": { "upath": "^2.0.1" }, "peerDependencies": { "vue": "^3.0.0", "vuetify": "^3.0.0" } }, "sha512-jSZTzTYaoiv8iwonFCVZQ0YYX/M+Uyl4ng+C4egMJT0Hcmh9gIxJL89qfZICDeo3g0IhqrvipW2FFKKRDMtVcA=="], + + "acorn": ["acorn@8.15.0", "https://registry.npmmirror.com/acorn/-/acorn-8.15.0.tgz", { "bin": { "acorn": "bin/acorn" } }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="], + + "acorn-jsx": ["acorn-jsx@5.3.2", "https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="], + + "ajv": ["ajv@6.12.6", "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], + + "alien-signals": ["alien-signals@2.0.7", "https://registry.npmmirror.com/alien-signals/-/alien-signals-2.0.7.tgz", {}, "sha512-wE7y3jmYeb0+h6mr5BOovuqhFv22O/MV9j5p0ndJsa7z1zJNPGQ4ph5pQk/kTTCWRC3xsA4SmtwmkzQO+7NCNg=="], + + "ansi-styles": ["ansi-styles@6.2.1", "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-6.2.1.tgz", {}, "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug=="], + + "anymatch": ["anymatch@3.1.3", "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.3.tgz", { "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw=="], + + "argparse": ["argparse@2.0.1", "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], + + "aria-query": ["aria-query@5.3.2", "https://registry.npmmirror.com/aria-query/-/aria-query-5.3.2.tgz", {}, "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw=="], + + "ast-kit": ["ast-kit@2.1.2", "https://registry.npmmirror.com/ast-kit/-/ast-kit-2.1.2.tgz", { "dependencies": { "@babel/parser": "^7.28.0", "pathe": "^2.0.3" } }, "sha512-cl76xfBQM6pztbrFWRnxbrDm9EOqDr1BF6+qQnnDZG2Co2LjyUktkN9GTJfBAfdae+DbT2nJf2nCGAdDDN7W2g=="], + + "ast-walker-scope": ["ast-walker-scope@0.8.2", "https://registry.npmmirror.com/ast-walker-scope/-/ast-walker-scope-0.8.2.tgz", { "dependencies": { "@babel/parser": "^7.28.3", "ast-kit": "^2.1.2" } }, "sha512-3pYeLyDZ6nJew9QeBhS4Nly02269Dkdk32+zdbbKmL6n4ZuaGorwwA+xx12xgOciA8BF1w9x+dlH7oUkFTW91w=="], + + "babylonjs": ["babylonjs@8.25.0", "https://registry.npmmirror.com/babylonjs/-/babylonjs-8.25.0.tgz", {}, "sha512-L1fhY6M50cnHU43b1THT5ESs1/tMGIqLUi8VnZrSqblu+RComoRUMXLCpkW/14lT6bkNG/dTmGp4IB2n2/FRLA=="], + + "babylonjs-gltf2interface": ["babylonjs-gltf2interface@8.25.0", "https://registry.npmmirror.com/babylonjs-gltf2interface/-/babylonjs-gltf2interface-8.25.0.tgz", {}, "sha512-yB0T/TWBUmHKvEtpELoMXZJrmaPciZzsfbbUfj0nLKcZ+TkgLq/dy0Nb/+O2u05dWZRwAC+4lfv1CdeEfrUk0g=="], + + "balanced-match": ["balanced-match@1.0.2", "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], + + "binary-extensions": ["binary-extensions@2.3.0", "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.3.0.tgz", {}, "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw=="], + + "birpc": ["birpc@2.5.0", "https://registry.npmmirror.com/birpc/-/birpc-2.5.0.tgz", {}, "sha512-VSWO/W6nNQdyP520F1mhf+Lc2f8pjGQOtoHHm7Ze8Go1kX7akpVIrtTa0fn+HB0QJEDVacl6aO08YE0PgXfdnQ=="], + + "boolbase": ["boolbase@1.0.0", "https://registry.npmmirror.com/boolbase/-/boolbase-1.0.0.tgz", {}, "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="], + + "brace-expansion": ["brace-expansion@1.1.12", "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.12.tgz", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], + + "braces": ["braces@3.0.3", "https://registry.npmmirror.com/braces/-/braces-3.0.3.tgz", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], + + "browserslist": ["browserslist@4.25.4", "https://registry.npmmirror.com/browserslist/-/browserslist-4.25.4.tgz", { "dependencies": { "caniuse-lite": "^1.0.30001737", "electron-to-chromium": "^1.5.211", "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.3" }, "bin": { "browserslist": "cli.js" } }, "sha512-4jYpcjabC606xJ3kw2QwGEZKX0Aw7sgQdZCvIK9dhVSPh76BKo+C+btT1RRofH7B+8iNpEbgGNVWiLki5q93yg=="], + + "buffer-builder": ["buffer-builder@0.2.0", "https://registry.npmmirror.com/buffer-builder/-/buffer-builder-0.2.0.tgz", {}, "sha512-7VPMEPuYznPSoR21NE1zvd2Xna6c/CloiZCfcMXR1Jny6PjX0N4Nsa38zcBFo/FMK+BlA+FLKbJCQ0i2yxp+Xg=="], + + "builtin-modules": ["builtin-modules@5.0.0", "https://registry.npmmirror.com/builtin-modules/-/builtin-modules-5.0.0.tgz", {}, "sha512-bkXY9WsVpY7CvMhKSR6pZilZu9Ln5WDrKVBUXf2S443etkmEO4V58heTecXcUIsNsi4Rx8JUO4NfX1IcQl4deg=="], + + "callsites": ["callsites@3.1.0", "https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], + + "caniuse-lite": ["caniuse-lite@1.0.30001739", "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001739.tgz", {}, "sha512-y+j60d6ulelrNSwpPyrHdl+9mJnQzHBr08xm48Qno0nSk4h3Qojh+ziv2qE6rXf4k3tadF4o1J/1tAbVm1NtnA=="], + + "chalk": ["chalk@4.1.2", "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], + + "change-case": ["change-case@5.4.4", "https://registry.npmmirror.com/change-case/-/change-case-5.4.4.tgz", {}, "sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w=="], + + "chokidar": ["chokidar@3.6.0", "https://registry.npmmirror.com/chokidar/-/chokidar-3.6.0.tgz", { "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw=="], + + "ci-info": ["ci-info@4.3.0", "https://registry.npmmirror.com/ci-info/-/ci-info-4.3.0.tgz", {}, "sha512-l+2bNRMiQgcfILUi33labAZYIWlH1kWDp+ecNo5iisRKrbm0xcRyCww71/YU0Fkw0mAFpz9bJayXPjey6vkmaQ=="], + + "citty": ["citty@0.1.6", "https://registry.npmmirror.com/citty/-/citty-0.1.6.tgz", { "dependencies": { "consola": "^3.2.3" } }, "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ=="], + + "clean-regexp": ["clean-regexp@1.0.0", "https://registry.npmmirror.com/clean-regexp/-/clean-regexp-1.0.0.tgz", { "dependencies": { "escape-string-regexp": "^1.0.5" } }, "sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw=="], + + "color-convert": ["color-convert@2.0.1", "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "color-name": ["color-name@1.1.4", "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "colorjs.io": ["colorjs.io@0.5.2", "https://registry.npmmirror.com/colorjs.io/-/colorjs.io-0.5.2.tgz", {}, "sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw=="], + + "comment-parser": ["comment-parser@1.4.1", "https://registry.npmmirror.com/comment-parser/-/comment-parser-1.4.1.tgz", {}, "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg=="], + + "concat-map": ["concat-map@0.0.1", "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], + + "confbox": ["confbox@0.2.2", "https://registry.npmmirror.com/confbox/-/confbox-0.2.2.tgz", {}, "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ=="], + + "consola": ["consola@3.4.2", "https://registry.npmmirror.com/consola/-/consola-3.4.2.tgz", {}, "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA=="], + + "copy-anything": ["copy-anything@3.0.5", "https://registry.npmmirror.com/copy-anything/-/copy-anything-3.0.5.tgz", { "dependencies": { "is-what": "^4.1.8" } }, "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w=="], + + "core-js-compat": ["core-js-compat@3.45.1", "https://registry.npmmirror.com/core-js-compat/-/core-js-compat-3.45.1.tgz", { "dependencies": { "browserslist": "^4.25.3" } }, "sha512-tqTt5T4PzsMIZ430XGviK4vzYSoeNJ6CXODi6c/voxOT6IZqBht5/EKaSNnYiEjjRYxjVz7DQIsOsY0XNi8PIA=="], + + "cross-spawn": ["cross-spawn@7.0.6", "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.6.tgz", { "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="], + + "cssesc": ["cssesc@3.0.0", "https://registry.npmmirror.com/cssesc/-/cssesc-3.0.0.tgz", { "bin": { "cssesc": "bin/cssesc" } }, "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="], + + "csstype": ["csstype@3.1.3", "https://registry.npmmirror.com/csstype/-/csstype-3.1.3.tgz", {}, "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="], + + "de-indent": ["de-indent@1.0.2", "https://registry.npmmirror.com/de-indent/-/de-indent-1.0.2.tgz", {}, "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg=="], + + "debug": ["debug@4.4.1", "https://registry.npmmirror.com/debug/-/debug-4.4.1.tgz", { "dependencies": { "ms": "^2.1.3" } }, "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ=="], + + "deep-is": ["deep-is@0.1.4", "https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="], + + "detect-libc": ["detect-libc@1.0.3", "https://registry.npmmirror.com/detect-libc/-/detect-libc-1.0.3.tgz", { "bin": { "detect-libc": "./bin/detect-libc.js" } }, "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg=="], + + "electron-to-chromium": ["electron-to-chromium@1.5.211", "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.5.211.tgz", {}, "sha512-IGBvimJkotaLzFnwIVgW9/UD/AOJ2tByUmeOrtqBfACSbAw5b1G0XpvdaieKyc7ULmbwXVx+4e4Be8pOPBrYkw=="], + + "emoji-regex": ["emoji-regex@10.5.0", "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-10.5.0.tgz", {}, "sha512-lb49vf1Xzfx080OKA0o6l8DQQpV+6Vg95zyCJX9VB/BqKYlhG7N4wgROUUHRA+ZPUefLnteQOad7z1kT2bV7bg=="], + + "entities": ["entities@4.5.0", "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="], + + "esbuild": ["esbuild@0.25.9", "https://registry.npmmirror.com/esbuild/-/esbuild-0.25.9.tgz", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.9", "@esbuild/android-arm": "0.25.9", "@esbuild/android-arm64": "0.25.9", "@esbuild/android-x64": "0.25.9", "@esbuild/darwin-arm64": "0.25.9", "@esbuild/darwin-x64": "0.25.9", "@esbuild/freebsd-arm64": "0.25.9", "@esbuild/freebsd-x64": "0.25.9", "@esbuild/linux-arm": "0.25.9", "@esbuild/linux-arm64": "0.25.9", "@esbuild/linux-ia32": "0.25.9", "@esbuild/linux-loong64": "0.25.9", "@esbuild/linux-mips64el": "0.25.9", "@esbuild/linux-ppc64": "0.25.9", "@esbuild/linux-riscv64": "0.25.9", "@esbuild/linux-s390x": "0.25.9", "@esbuild/linux-x64": "0.25.9", "@esbuild/netbsd-arm64": "0.25.9", "@esbuild/netbsd-x64": "0.25.9", "@esbuild/openbsd-arm64": "0.25.9", "@esbuild/openbsd-x64": "0.25.9", "@esbuild/openharmony-arm64": "0.25.9", "@esbuild/sunos-x64": "0.25.9", "@esbuild/win32-arm64": "0.25.9", "@esbuild/win32-ia32": "0.25.9", "@esbuild/win32-x64": "0.25.9" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g=="], + + "escalade": ["escalade@3.2.0", "https://registry.npmmirror.com/escalade/-/escalade-3.2.0.tgz", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], + + "escape-string-regexp": ["escape-string-regexp@4.0.0", "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], + + "eslint": ["eslint@9.34.0", "https://registry.npmmirror.com/eslint/-/eslint-9.34.0.tgz", { "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.0", "@eslint/config-helpers": "^0.3.1", "@eslint/core": "^0.15.2", "@eslint/eslintrc": "^3.3.1", "@eslint/js": "9.34.0", "@eslint/plugin-kit": "^0.3.5", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-RNCHRX5EwdrESy3Jc9o8ie8Bog+PeYvvSR8sDGoZxNFTvZ4dlxUB3WzQ3bQMztFrSRODGrLLj8g6OFuGY/aiQg=="], + + "eslint-compat-utils": ["eslint-compat-utils@0.6.5", "https://registry.npmmirror.com/eslint-compat-utils/-/eslint-compat-utils-0.6.5.tgz", { "dependencies": { "semver": "^7.5.4" }, "peerDependencies": { "eslint": ">=6.0.0" } }, "sha512-vAUHYzue4YAa2hNACjB8HvUQj5yehAZgiClyFVVom9cP8z5NSFq3PwB/TtJslN2zAMgRX6FCFCjYBbQh71g5RQ=="], + + "eslint-config-flat-gitignore": ["eslint-config-flat-gitignore@2.1.0", "https://registry.npmmirror.com/eslint-config-flat-gitignore/-/eslint-config-flat-gitignore-2.1.0.tgz", { "dependencies": { "@eslint/compat": "^1.2.5" }, "peerDependencies": { "eslint": "^9.5.0" } }, "sha512-cJzNJ7L+psWp5mXM7jBX+fjHtBvvh06RBlcweMhKD8jWqQw0G78hOW5tpVALGHGFPsBV+ot2H+pdDGJy6CV8pA=="], + + "eslint-config-vuetify": ["eslint-config-vuetify@4.1.0", "https://registry.npmmirror.com/eslint-config-vuetify/-/eslint-config-vuetify-4.1.0.tgz", { "dependencies": { "@clack/prompts": "^0.11.0", "@eslint/eslintrc": "^3.3.1", "@eslint/js": "^9.28.0", "@stylistic/eslint-plugin": "^4.4.0", "@typescript-eslint/parser": "^8.33.0", "eslint-config-flat-gitignore": "^2.1.0", "eslint-flat-config-utils": "^2.1.0", "eslint-plugin-antfu": "^3.1.1", "eslint-plugin-import-x": "^4.15.0", "eslint-plugin-jsonc": "^2.20.1", "eslint-plugin-perfectionist": "^4.13.0", "eslint-plugin-pnpm": "^0.3.1", "eslint-plugin-regexp": "^2.7.0", "eslint-plugin-unicorn": "^60.0.0", "eslint-plugin-vue": "^10.1.0", "eslint-typegen": "^2.2.0", "exsolve": "^1.0.5", "globals": "^16.2.0", "jsonc-eslint-parser": "^2.4.0", "kolorist": "^1.8.0", "local-pkg": "^1.1.1", "nypm": "^0.6.0", "package-manager-detector": "^1.3.0", "tinyexec": "^1.0.1", "typescript-eslint": "^8.33.0", "vue-eslint-parser": "^10.1.3", "yaml-eslint-parser": "^1.3.0" }, "peerDependencies": { "@vitest/eslint-plugin": "^1.1.42", "eslint": "^9.5.0", "eslint-plugin-jest": "^28.0.0", "eslint-plugin-no-only-tests": "^3.3.0", "eslint-plugin-vuejs-accessibility": "^2.0.0" }, "bin": { "eslint-config-vuetify": "bin/cli.mjs" } }, "sha512-MS46PCbUGuuNWJ3R+uP8oGo0HDmdWZAxMqw0hRAYCWsFLTixDVlNLIM+DyQf4ay77FBZl5wambTn6I8hcTbUUw=="], + + "eslint-flat-config-utils": ["eslint-flat-config-utils@2.1.1", "https://registry.npmmirror.com/eslint-flat-config-utils/-/eslint-flat-config-utils-2.1.1.tgz", { "dependencies": { "pathe": "^2.0.3" } }, "sha512-K8eaPkBemHkfbYsZH7z4lZ/tt6gNSsVh535Wh9W9gQBS2WjvfUbbVr2NZR3L1yiRCLuOEimYfPxCxODczD4Opg=="], + + "eslint-import-context": ["eslint-import-context@0.1.9", "https://registry.npmmirror.com/eslint-import-context/-/eslint-import-context-0.1.9.tgz", { "dependencies": { "get-tsconfig": "^4.10.1", "stable-hash-x": "^0.2.0" }, "peerDependencies": { "unrs-resolver": "^1.0.0" }, "optionalPeers": ["unrs-resolver"] }, "sha512-K9Hb+yRaGAGUbwjhFNHvSmmkZs9+zbuoe3kFQ4V1wYjrepUFYM2dZAfNtjbbj3qsPfUfsA68Bx/ICWQMi+C8Eg=="], + + "eslint-json-compat-utils": ["eslint-json-compat-utils@0.2.1", "https://registry.npmmirror.com/eslint-json-compat-utils/-/eslint-json-compat-utils-0.2.1.tgz", { "dependencies": { "esquery": "^1.6.0" }, "peerDependencies": { "eslint": "*", "jsonc-eslint-parser": "^2.4.0" } }, "sha512-YzEodbDyW8DX8bImKhAcCeu/L31Dd/70Bidx2Qex9OFUtgzXLqtfWL4Hr5fM/aCCB8QUZLuJur0S9k6UfgFkfg=="], + + "eslint-plugin-antfu": ["eslint-plugin-antfu@3.1.1", "https://registry.npmmirror.com/eslint-plugin-antfu/-/eslint-plugin-antfu-3.1.1.tgz", { "peerDependencies": { "eslint": "*" } }, "sha512-7Q+NhwLfHJFvopI2HBZbSxWXngTwBLKxW1AGXLr2lEGxcEIK/AsDs8pn8fvIizl5aZjBbVbVK5ujmMpBe4Tvdg=="], + + "eslint-plugin-import-x": ["eslint-plugin-import-x@4.16.1", "https://registry.npmmirror.com/eslint-plugin-import-x/-/eslint-plugin-import-x-4.16.1.tgz", { "dependencies": { "@typescript-eslint/types": "^8.35.0", "comment-parser": "^1.4.1", "debug": "^4.4.1", "eslint-import-context": "^0.1.9", "is-glob": "^4.0.3", "minimatch": "^9.0.3 || ^10.0.1", "semver": "^7.7.2", "stable-hash-x": "^0.2.0", "unrs-resolver": "^1.9.2" }, "peerDependencies": { "@typescript-eslint/utils": "^8.0.0", "eslint": "^8.57.0 || ^9.0.0", "eslint-import-resolver-node": "*" }, "optionalPeers": ["@typescript-eslint/utils", "eslint-import-resolver-node"] }, "sha512-vPZZsiOKaBAIATpFE2uMI4w5IRwdv/FpQ+qZZMR4E+PeOcM4OeoEbqxRMnywdxP19TyB/3h6QBB0EWon7letSQ=="], + + "eslint-plugin-jest": ["eslint-plugin-jest@28.14.0", "https://registry.npmmirror.com/eslint-plugin-jest/-/eslint-plugin-jest-28.14.0.tgz", { "dependencies": { "@typescript-eslint/utils": "^6.0.0 || ^7.0.0 || ^8.0.0" }, "peerDependencies": { "@typescript-eslint/eslint-plugin": "^6.0.0 || ^7.0.0 || ^8.0.0", "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0", "jest": "*" }, "optionalPeers": ["@typescript-eslint/eslint-plugin", "jest"] }, "sha512-P9s/qXSMTpRTerE2FQ0qJet2gKbcGyFTPAJipoKxmWqR6uuFqIqk8FuEfg5yBieOezVrEfAMZrEwJ6yEp+1MFQ=="], + + "eslint-plugin-jsonc": ["eslint-plugin-jsonc@2.20.1", "https://registry.npmmirror.com/eslint-plugin-jsonc/-/eslint-plugin-jsonc-2.20.1.tgz", { "dependencies": { "@eslint-community/eslint-utils": "^4.5.1", "eslint-compat-utils": "^0.6.4", "eslint-json-compat-utils": "^0.2.1", "espree": "^9.6.1 || ^10.3.0", "graphemer": "^1.4.0", "jsonc-eslint-parser": "^2.4.0", "natural-compare": "^1.4.0", "synckit": "^0.6.2 || ^0.7.3 || ^0.11.5" }, "peerDependencies": { "eslint": ">=6.0.0" } }, "sha512-gUzIwQHXx7ZPypUoadcyRi4WbHW2TPixDr0kqQ4miuJBU0emJmyGTlnaT3Og9X2a8R1CDayN9BFSq5weGWbTng=="], + + "eslint-plugin-no-only-tests": ["eslint-plugin-no-only-tests@3.3.0", "https://registry.npmmirror.com/eslint-plugin-no-only-tests/-/eslint-plugin-no-only-tests-3.3.0.tgz", {}, "sha512-brcKcxGnISN2CcVhXJ/kEQlNa0MEfGRtwKtWA16SkqXHKitaKIMrfemJKLKX1YqDU5C/5JY3PvZXd5jEW04e0Q=="], + + "eslint-plugin-perfectionist": ["eslint-plugin-perfectionist@4.15.0", "https://registry.npmmirror.com/eslint-plugin-perfectionist/-/eslint-plugin-perfectionist-4.15.0.tgz", { "dependencies": { "@typescript-eslint/types": "^8.34.1", "@typescript-eslint/utils": "^8.34.1", "natural-orderby": "^5.0.0" }, "peerDependencies": { "eslint": ">=8.45.0" } }, "sha512-pC7PgoXyDnEXe14xvRUhBII8A3zRgggKqJFx2a82fjrItDs1BSI7zdZnQtM2yQvcyod6/ujmzb7ejKPx8lZTnw=="], + + "eslint-plugin-pnpm": ["eslint-plugin-pnpm@0.3.1", "https://registry.npmmirror.com/eslint-plugin-pnpm/-/eslint-plugin-pnpm-0.3.1.tgz", { "dependencies": { "find-up-simple": "^1.0.1", "jsonc-eslint-parser": "^2.4.0", "pathe": "^2.0.3", "pnpm-workspace-yaml": "0.3.1", "tinyglobby": "^0.2.12", "yaml-eslint-parser": "^1.3.0" }, "peerDependencies": { "eslint": "^9.0.0" } }, "sha512-vi5iHoELIAlBbX4AW8ZGzU3tUnfxuXhC/NKo3qRcI5o9igbz6zJUqSlQ03bPeMqWIGTPatZnbWsNR1RnlNERNQ=="], + + "eslint-plugin-regexp": ["eslint-plugin-regexp@2.10.0", "https://registry.npmmirror.com/eslint-plugin-regexp/-/eslint-plugin-regexp-2.10.0.tgz", { "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.11.0", "comment-parser": "^1.4.0", "jsdoc-type-pratt-parser": "^4.0.0", "refa": "^0.12.1", "regexp-ast-analysis": "^0.7.1", "scslre": "^0.3.0" }, "peerDependencies": { "eslint": ">=8.44.0" } }, "sha512-ovzQT8ESVn5oOe5a7gIDPD5v9bCSjIFJu57sVPDqgPRXicQzOnYfFN21WoQBQF18vrhT5o7UMKFwJQVVjyJ0ng=="], + + "eslint-plugin-unicorn": ["eslint-plugin-unicorn@60.0.0", "https://registry.npmmirror.com/eslint-plugin-unicorn/-/eslint-plugin-unicorn-60.0.0.tgz", { "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", "@eslint-community/eslint-utils": "^4.7.0", "@eslint/plugin-kit": "^0.3.3", "change-case": "^5.4.4", "ci-info": "^4.3.0", "clean-regexp": "^1.0.0", "core-js-compat": "^3.44.0", "esquery": "^1.6.0", "find-up-simple": "^1.0.1", "globals": "^16.3.0", "indent-string": "^5.0.0", "is-builtin-module": "^5.0.0", "jsesc": "^3.1.0", "pluralize": "^8.0.0", "regexp-tree": "^0.1.27", "regjsparser": "^0.12.0", "semver": "^7.7.2", "strip-indent": "^4.0.0" }, "peerDependencies": { "eslint": ">=9.29.0" } }, "sha512-QUzTefvP8stfSXsqKQ+vBQSEsXIlAiCduS/V1Em+FKgL9c21U/IIm20/e3MFy1jyCf14tHAhqC1sX8OTy6VUCg=="], + + "eslint-plugin-vue": ["eslint-plugin-vue@10.4.0", "https://registry.npmmirror.com/eslint-plugin-vue/-/eslint-plugin-vue-10.4.0.tgz", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "natural-compare": "^1.4.0", "nth-check": "^2.1.1", "postcss-selector-parser": "^6.0.15", "semver": "^7.6.3", "xml-name-validator": "^4.0.0" }, "peerDependencies": { "@typescript-eslint/parser": "^7.0.0 || ^8.0.0", "eslint": "^8.57.0 || ^9.0.0", "vue-eslint-parser": "^10.0.0" }, "optionalPeers": ["@typescript-eslint/parser"] }, "sha512-K6tP0dW8FJVZLQxa2S7LcE1lLw3X8VvB3t887Q6CLrFVxHYBXGANbXvwNzYIu6Ughx1bSJ5BDT0YB3ybPT39lw=="], + + "eslint-plugin-vuejs-accessibility": ["eslint-plugin-vuejs-accessibility@2.4.1", "https://registry.npmmirror.com/eslint-plugin-vuejs-accessibility/-/eslint-plugin-vuejs-accessibility-2.4.1.tgz", { "dependencies": { "aria-query": "^5.3.0", "emoji-regex": "^10.0.0", "vue-eslint-parser": "^9.0.1" }, "peerDependencies": { "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0" } }, "sha512-ZRZhPdslplZXSF71MtSG+zXYRAT5KiHR4JVuo/DERQf9noAkDvi5W418VOE1qllmJd7wTenndxi1q8XeDMxdHw=="], + + "eslint-scope": ["eslint-scope@8.4.0", "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-8.4.0.tgz", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="], + + "eslint-typegen": ["eslint-typegen@2.3.0", "https://registry.npmmirror.com/eslint-typegen/-/eslint-typegen-2.3.0.tgz", { "dependencies": { "json-schema-to-typescript-lite": "^15.0.0", "ohash": "^2.0.11" }, "peerDependencies": { "eslint": "^9.0.0" } }, "sha512-azYgAvhlz1AyTpeLfVSKcrNJInuIsRrcUrOcHmEl8T9oMKesePVUPrF8gRgE6azV8CAlFzxJDTyaXAAbA/BYiA=="], + + "eslint-visitor-keys": ["eslint-visitor-keys@4.2.1", "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", {}, "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ=="], + + "espree": ["espree@10.4.0", "https://registry.npmmirror.com/espree/-/espree-10.4.0.tgz", { "dependencies": { "acorn": "^8.15.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.1" } }, "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ=="], + + "esquery": ["esquery@1.6.0", "https://registry.npmmirror.com/esquery/-/esquery-1.6.0.tgz", { "dependencies": { "estraverse": "^5.1.0" } }, "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg=="], + + "esrecurse": ["esrecurse@4.3.0", "https://registry.npmmirror.com/esrecurse/-/esrecurse-4.3.0.tgz", { "dependencies": { "estraverse": "^5.2.0" } }, "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="], + + "estraverse": ["estraverse@5.3.0", "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz", {}, "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="], + + "estree-walker": ["estree-walker@2.0.2", "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="], + + "esutils": ["esutils@2.0.3", "https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz", {}, "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="], + + "exsolve": ["exsolve@1.0.7", "https://registry.npmmirror.com/exsolve/-/exsolve-1.0.7.tgz", {}, "sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw=="], + + "fast-deep-equal": ["fast-deep-equal@3.1.3", "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], + + "fast-glob": ["fast-glob@3.3.3", "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.3.3.tgz", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="], + + "fast-json-stable-stringify": ["fast-json-stable-stringify@2.1.0", "https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", {}, "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="], + + "fast-levenshtein": ["fast-levenshtein@2.0.6", "https://registry.npmmirror.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", {}, "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="], + + "fastq": ["fastq@1.19.1", "https://registry.npmmirror.com/fastq/-/fastq-1.19.1.tgz", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ=="], + + "fdir": ["fdir@6.5.0", "https://registry.npmmirror.com/fdir/-/fdir-6.5.0.tgz", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="], + + "file-entry-cache": ["file-entry-cache@8.0.0", "https://registry.npmmirror.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz", { "dependencies": { "flat-cache": "^4.0.0" } }, "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ=="], + + "fill-range": ["fill-range@7.1.1", "https://registry.npmmirror.com/fill-range/-/fill-range-7.1.1.tgz", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], + + "find-up": ["find-up@5.0.0", "https://registry.npmmirror.com/find-up/-/find-up-5.0.0.tgz", { "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="], + + "find-up-simple": ["find-up-simple@1.0.1", "https://registry.npmmirror.com/find-up-simple/-/find-up-simple-1.0.1.tgz", {}, "sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ=="], + + "flat-cache": ["flat-cache@4.0.1", "https://registry.npmmirror.com/flat-cache/-/flat-cache-4.0.1.tgz", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" } }, "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw=="], + + "flatted": ["flatted@3.3.3", "https://registry.npmmirror.com/flatted/-/flatted-3.3.3.tgz", {}, "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg=="], + + "framesync": ["framesync@6.1.2", "https://registry.npmmirror.com/framesync/-/framesync-6.1.2.tgz", { "dependencies": { "tslib": "2.4.0" } }, "sha512-jBTqhX6KaQVDyus8muwZbBeGGP0XgujBRbQ7gM7BRdS3CadCZIHiawyzYLnafYcvZIh5j8WE7cxZKFn7dXhu9g=="], + + "fsevents": ["fsevents@2.3.3", "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + + "get-tsconfig": ["get-tsconfig@4.10.1", "https://registry.npmmirror.com/get-tsconfig/-/get-tsconfig-4.10.1.tgz", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ=="], + + "glob-parent": ["glob-parent@6.0.2", "https://registry.npmmirror.com/glob-parent/-/glob-parent-6.0.2.tgz", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], + + "globals": ["globals@16.3.0", "https://registry.npmmirror.com/globals/-/globals-16.3.0.tgz", {}, "sha512-bqWEnJ1Nt3neqx2q5SFfGS8r/ahumIakg3HcwtNlrVlwXIeNumWn/c7Pn/wKzGhf6SaW6H6uWXLqC30STCMchQ=="], + + "graphemer": ["graphemer@1.4.0", "https://registry.npmmirror.com/graphemer/-/graphemer-1.4.0.tgz", {}, "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag=="], + + "has-flag": ["has-flag@4.0.0", "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="], + + "he": ["he@1.2.0", "https://registry.npmmirror.com/he/-/he-1.2.0.tgz", { "bin": { "he": "bin/he" } }, "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw=="], + + "hey-listen": ["hey-listen@1.0.8", "https://registry.npmmirror.com/hey-listen/-/hey-listen-1.0.8.tgz", {}, "sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q=="], + + "hookable": ["hookable@5.5.3", "https://registry.npmmirror.com/hookable/-/hookable-5.5.3.tgz", {}, "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ=="], + + "ignore": ["ignore@5.3.2", "https://registry.npmmirror.com/ignore/-/ignore-5.3.2.tgz", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + + "immutable": ["immutable@5.1.3", "https://registry.npmmirror.com/immutable/-/immutable-5.1.3.tgz", {}, "sha512-+chQdDfvscSF1SJqv2gn4SRO2ZyS3xL3r7IW/wWEEzrzLisnOlKiQu5ytC/BVNcS15C39WT2Hg/bjKjDMcu+zg=="], + + "import-fresh": ["import-fresh@3.3.1", "https://registry.npmmirror.com/import-fresh/-/import-fresh-3.3.1.tgz", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], + + "imurmurhash": ["imurmurhash@0.1.4", "https://registry.npmmirror.com/imurmurhash/-/imurmurhash-0.1.4.tgz", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], + + "indent-string": ["indent-string@5.0.0", "https://registry.npmmirror.com/indent-string/-/indent-string-5.0.0.tgz", {}, "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg=="], + + "is-binary-path": ["is-binary-path@2.1.0", "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz", { "dependencies": { "binary-extensions": "^2.0.0" } }, "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw=="], + + "is-builtin-module": ["is-builtin-module@5.0.0", "https://registry.npmmirror.com/is-builtin-module/-/is-builtin-module-5.0.0.tgz", { "dependencies": { "builtin-modules": "^5.0.0" } }, "sha512-f4RqJKBUe5rQkJ2eJEJBXSticB3hGbN9j0yxxMQFqIW89Jp9WYFtzfTcRlstDKVUTRzSOTLKRfO9vIztenwtxA=="], + + "is-extglob": ["is-extglob@2.1.1", "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], + + "is-glob": ["is-glob@4.0.3", "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], + + "is-number": ["is-number@7.0.0", "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], + + "is-what": ["is-what@4.1.16", "https://registry.npmmirror.com/is-what/-/is-what-4.1.16.tgz", {}, "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A=="], + + "isexe": ["isexe@3.1.1", "https://registry.npmmirror.com/isexe/-/isexe-3.1.1.tgz", {}, "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ=="], + + "js-yaml": ["js-yaml@4.1.0", "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.0.tgz", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA=="], + + "jsdoc-type-pratt-parser": ["jsdoc-type-pratt-parser@4.8.0", "https://registry.npmmirror.com/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.8.0.tgz", {}, "sha512-iZ8Bdb84lWRuGHamRXFyML07r21pcwBrLkHEuHgEY5UbCouBwv7ECknDRKzsQIXMiqpPymqtIf8TC/shYKB5rw=="], + + "jsesc": ["jsesc@3.1.0", "https://registry.npmmirror.com/jsesc/-/jsesc-3.1.0.tgz", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="], + + "json-buffer": ["json-buffer@3.0.1", "https://registry.npmmirror.com/json-buffer/-/json-buffer-3.0.1.tgz", {}, "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="], + + "json-parse-even-better-errors": ["json-parse-even-better-errors@4.0.0", "https://registry.npmmirror.com/json-parse-even-better-errors/-/json-parse-even-better-errors-4.0.0.tgz", {}, "sha512-lR4MXjGNgkJc7tkQ97kb2nuEMnNCyU//XYVH0MKTGcXEiSudQ5MKGKen3C5QubYy0vmq+JGitUg92uuywGEwIA=="], + + "json-schema-to-typescript-lite": ["json-schema-to-typescript-lite@15.0.0", "https://registry.npmmirror.com/json-schema-to-typescript-lite/-/json-schema-to-typescript-lite-15.0.0.tgz", { "dependencies": { "@apidevtools/json-schema-ref-parser": "^14.1.1", "@types/json-schema": "^7.0.15" } }, "sha512-5mMORSQm9oTLyjM4mWnyNBi2T042Fhg1/0gCIB6X8U/LVpM2A+Nmj2yEyArqVouDmFThDxpEXcnTgSrjkGJRFA=="], + + "json-schema-traverse": ["json-schema-traverse@0.4.1", "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", {}, "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="], + + "json-stable-stringify-without-jsonify": ["json-stable-stringify-without-jsonify@1.0.1", "https://registry.npmmirror.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", {}, "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="], + + "json5": ["json5@2.2.3", "https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="], + + "jsonc-eslint-parser": ["jsonc-eslint-parser@2.4.0", "https://registry.npmmirror.com/jsonc-eslint-parser/-/jsonc-eslint-parser-2.4.0.tgz", { "dependencies": { "acorn": "^8.5.0", "eslint-visitor-keys": "^3.0.0", "espree": "^9.0.0", "semver": "^7.3.5" } }, "sha512-WYDyuc/uFcGp6YtM2H0uKmUwieOuzeE/5YocFJLnLfclZ4inf3mRn8ZVy1s7Hxji7Jxm6Ss8gqpexD/GlKoGgg=="], + + "keyv": ["keyv@4.5.4", "https://registry.npmmirror.com/keyv/-/keyv-4.5.4.tgz", { "dependencies": { "json-buffer": "3.0.1" } }, "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="], + + "kolorist": ["kolorist@1.8.0", "https://registry.npmmirror.com/kolorist/-/kolorist-1.8.0.tgz", {}, "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ=="], + + "levn": ["levn@0.4.1", "https://registry.npmmirror.com/levn/-/levn-0.4.1.tgz", { "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="], + + "local-pkg": ["local-pkg@1.1.2", "https://registry.npmmirror.com/local-pkg/-/local-pkg-1.1.2.tgz", { "dependencies": { "mlly": "^1.7.4", "pkg-types": "^2.3.0", "quansync": "^0.2.11" } }, "sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A=="], + + "locate-path": ["locate-path@6.0.0", "https://registry.npmmirror.com/locate-path/-/locate-path-6.0.0.tgz", { "dependencies": { "p-locate": "^5.0.0" } }, "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="], + + "lodash": ["lodash@4.17.21", "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz", {}, "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="], + + "lodash.merge": ["lodash.merge@4.6.2", "https://registry.npmmirror.com/lodash.merge/-/lodash.merge-4.6.2.tgz", {}, "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="], + + "magic-string": ["magic-string@0.30.18", "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.18.tgz", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-yi8swmWbO17qHhwIBNeeZxTceJMeBvWJaId6dyvTSOwTipqeHhMhOrz6513r1sOKnpvQ7zkhlG8tPrpilwTxHQ=="], + + "magic-string-ast": ["magic-string-ast@1.0.2", "https://registry.npmmirror.com/magic-string-ast/-/magic-string-ast-1.0.2.tgz", { "dependencies": { "magic-string": "^0.30.17" } }, "sha512-8ngQgLhcT0t3YBdn9CGkZqCYlvwW9pm7aWJwd7AxseVWf1RU8ZHCQvG1mt3N5vvUme+pXTcHB8G/7fE666U8Vw=="], + + "memorystream": ["memorystream@0.3.1", "https://registry.npmmirror.com/memorystream/-/memorystream-0.3.1.tgz", {}, "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw=="], + + "merge2": ["merge2@1.4.1", "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="], + + "micromatch": ["micromatch@4.0.8", "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.8.tgz", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], + + "min-indent": ["min-indent@1.0.1", "https://registry.npmmirror.com/min-indent/-/min-indent-1.0.1.tgz", {}, "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg=="], + + "minimatch": ["minimatch@3.1.2", "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], + + "mitt": ["mitt@3.0.1", "https://registry.npmmirror.com/mitt/-/mitt-3.0.1.tgz", {}, "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw=="], + + "mlly": ["mlly@1.8.0", "https://registry.npmmirror.com/mlly/-/mlly-1.8.0.tgz", { "dependencies": { "acorn": "^8.15.0", "pathe": "^2.0.3", "pkg-types": "^1.3.1", "ufo": "^1.6.1" } }, "sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g=="], + + "ms": ["ms@2.1.3", "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + + "muggle-string": ["muggle-string@0.4.1", "https://registry.npmmirror.com/muggle-string/-/muggle-string-0.4.1.tgz", {}, "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ=="], + + "nanoid": ["nanoid@3.3.11", "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.11.tgz", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], + + "napi-postinstall": ["napi-postinstall@0.3.3", "https://registry.npmmirror.com/napi-postinstall/-/napi-postinstall-0.3.3.tgz", { "bin": { "napi-postinstall": "lib/cli.js" } }, "sha512-uTp172LLXSxuSYHv/kou+f6KW3SMppU9ivthaVTXian9sOt3XM/zHYHpRZiLgQoxeWfYUnslNWQHF1+G71xcow=="], + + "natural-compare": ["natural-compare@1.4.0", "https://registry.npmmirror.com/natural-compare/-/natural-compare-1.4.0.tgz", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="], + + "natural-orderby": ["natural-orderby@5.0.0", "https://registry.npmmirror.com/natural-orderby/-/natural-orderby-5.0.0.tgz", {}, "sha512-kKHJhxwpR/Okycz4HhQKKlhWe4ASEfPgkSWNmKFHd7+ezuQlxkA5cM3+XkBPvm1gmHen3w53qsYAv+8GwRrBlg=="], + + "node-addon-api": ["node-addon-api@7.1.1", "https://registry.npmmirror.com/node-addon-api/-/node-addon-api-7.1.1.tgz", {}, "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ=="], + + "node-releases": ["node-releases@2.0.19", "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.19.tgz", {}, "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw=="], + + "normalize-path": ["normalize-path@3.0.0", "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz", {}, "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA=="], + + "npm-normalize-package-bin": ["npm-normalize-package-bin@4.0.0", "https://registry.npmmirror.com/npm-normalize-package-bin/-/npm-normalize-package-bin-4.0.0.tgz", {}, "sha512-TZKxPvItzai9kN9H/TkmCtx/ZN/hvr3vUycjlfmH0ootY9yFBzNOpiXAdIn1Iteqsvk4lQn6B5PTrt+n6h8k/w=="], + + "npm-run-all2": ["npm-run-all2@7.0.2", "https://registry.npmmirror.com/npm-run-all2/-/npm-run-all2-7.0.2.tgz", { "dependencies": { "ansi-styles": "^6.2.1", "cross-spawn": "^7.0.6", "memorystream": "^0.3.1", "minimatch": "^9.0.0", "pidtree": "^0.6.0", "read-package-json-fast": "^4.0.0", "shell-quote": "^1.7.3", "which": "^5.0.0" }, "bin": { "run-p": "bin/run-p/index.js", "run-s": "bin/run-s/index.js", "npm-run-all": "bin/npm-run-all/index.js", "npm-run-all2": "bin/npm-run-all/index.js" } }, "sha512-7tXR+r9hzRNOPNTvXegM+QzCuMjzUIIq66VDunL6j60O4RrExx32XUhlrS7UK4VcdGw5/Wxzb3kfNcFix9JKDA=="], + + "nth-check": ["nth-check@2.1.1", "https://registry.npmmirror.com/nth-check/-/nth-check-2.1.1.tgz", { "dependencies": { "boolbase": "^1.0.0" } }, "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w=="], + + "nypm": ["nypm@0.6.1", "https://registry.npmmirror.com/nypm/-/nypm-0.6.1.tgz", { "dependencies": { "citty": "^0.1.6", "consola": "^3.4.2", "pathe": "^2.0.3", "pkg-types": "^2.2.0", "tinyexec": "^1.0.1" }, "bin": { "nypm": "dist/cli.mjs" } }, "sha512-hlacBiRiv1k9hZFiphPUkfSQ/ZfQzZDzC+8z0wL3lvDAOUu/2NnChkKuMoMjNur/9OpKuz2QsIeiPVN0xM5Q0w=="], + + "ohash": ["ohash@2.0.11", "https://registry.npmmirror.com/ohash/-/ohash-2.0.11.tgz", {}, "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ=="], + + "optionator": ["optionator@0.9.4", "https://registry.npmmirror.com/optionator/-/optionator-0.9.4.tgz", { "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.5" } }, "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="], + + "p-limit": ["p-limit@3.1.0", "https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], + + "p-locate": ["p-locate@5.0.0", "https://registry.npmmirror.com/p-locate/-/p-locate-5.0.0.tgz", { "dependencies": { "p-limit": "^3.0.2" } }, "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="], + + "package-manager-detector": ["package-manager-detector@1.3.0", "https://registry.npmmirror.com/package-manager-detector/-/package-manager-detector-1.3.0.tgz", {}, "sha512-ZsEbbZORsyHuO00lY1kV3/t72yp6Ysay6Pd17ZAlNGuGwmWDLCJxFpRs0IzfXfj1o4icJOkUEioexFHzyPurSQ=="], + + "parent-module": ["parent-module@1.0.1", "https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], + + "path-browserify": ["path-browserify@1.0.1", "https://registry.npmmirror.com/path-browserify/-/path-browserify-1.0.1.tgz", {}, "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g=="], + + "path-exists": ["path-exists@4.0.0", "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz", {}, "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="], + + "path-key": ["path-key@3.1.1", "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="], + + "pathe": ["pathe@2.0.3", "https://registry.npmmirror.com/pathe/-/pathe-2.0.3.tgz", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], + + "perfect-debounce": ["perfect-debounce@1.0.0", "https://registry.npmmirror.com/perfect-debounce/-/perfect-debounce-1.0.0.tgz", {}, "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA=="], + + "picocolors": ["picocolors@1.1.1", "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], + + "picomatch": ["picomatch@4.0.3", "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.3.tgz", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], + + "pidtree": ["pidtree@0.6.0", "https://registry.npmmirror.com/pidtree/-/pidtree-0.6.0.tgz", { "bin": { "pidtree": "bin/pidtree.js" } }, "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g=="], + + "pinia": ["pinia@3.0.3", "https://registry.npmmirror.com/pinia/-/pinia-3.0.3.tgz", { "dependencies": { "@vue/devtools-api": "^7.7.2" }, "peerDependencies": { "typescript": ">=4.4.4", "vue": "^2.7.0 || ^3.5.11" }, "optionalPeers": ["typescript"] }, "sha512-ttXO/InUULUXkMHpTdp9Fj4hLpD/2AoJdmAbAeW2yu1iy1k+pkFekQXw5VpC0/5p51IOR/jDaDRfRWRnMMsGOA=="], + + "pkg-types": ["pkg-types@2.3.0", "https://registry.npmmirror.com/pkg-types/-/pkg-types-2.3.0.tgz", { "dependencies": { "confbox": "^0.2.2", "exsolve": "^1.0.7", "pathe": "^2.0.3" } }, "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig=="], + + "pluralize": ["pluralize@8.0.0", "https://registry.npmmirror.com/pluralize/-/pluralize-8.0.0.tgz", {}, "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA=="], + + "pnpm-workspace-yaml": ["pnpm-workspace-yaml@0.3.1", "https://registry.npmmirror.com/pnpm-workspace-yaml/-/pnpm-workspace-yaml-0.3.1.tgz", { "dependencies": { "yaml": "^2.7.0" } }, "sha512-3nW5RLmREmZ8Pm8MbPsO2RM+99RRjYd25ynj3NV0cFsN7CcEl4sDFzgoFmSyduFwxFQ2Qbu3y2UdCh6HlyUOeA=="], + + "popmotion": ["popmotion@11.0.5", "https://registry.npmmirror.com/popmotion/-/popmotion-11.0.5.tgz", { "dependencies": { "framesync": "6.1.2", "hey-listen": "^1.0.8", "style-value-types": "5.1.2", "tslib": "2.4.0" } }, "sha512-la8gPM1WYeFznb/JqF4GiTkRRPZsfaj2+kCxqQgr2MJylMmIKUwBfWW8Wa5fml/8gmtlD5yI01MP1QCZPWmppA=="], + + "postcss": ["postcss@8.5.6", "https://registry.npmmirror.com/postcss/-/postcss-8.5.6.tgz", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="], + + "postcss-selector-parser": ["postcss-selector-parser@6.1.2", "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg=="], + + "prelude-ls": ["prelude-ls@1.2.1", "https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.2.1.tgz", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="], + + "punycode": ["punycode@2.3.1", "https://registry.npmmirror.com/punycode/-/punycode-2.3.1.tgz", {}, "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg=="], + + "quansync": ["quansync@0.2.11", "https://registry.npmmirror.com/quansync/-/quansync-0.2.11.tgz", {}, "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA=="], + + "queue-microtask": ["queue-microtask@1.2.3", "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="], + + "read-package-json-fast": ["read-package-json-fast@4.0.0", "https://registry.npmmirror.com/read-package-json-fast/-/read-package-json-fast-4.0.0.tgz", { "dependencies": { "json-parse-even-better-errors": "^4.0.0", "npm-normalize-package-bin": "^4.0.0" } }, "sha512-qpt8EwugBWDw2cgE2W+/3oxC+KTez2uSVR8JU9Q36TXPAGCaozfQUs59v4j4GFpWTaw0i6hAZSvOmu1J0uOEUg=="], + + "readdirp": ["readdirp@3.6.0", "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz", { "dependencies": { "picomatch": "^2.2.1" } }, "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="], + + "refa": ["refa@0.12.1", "https://registry.npmmirror.com/refa/-/refa-0.12.1.tgz", { "dependencies": { "@eslint-community/regexpp": "^4.8.0" } }, "sha512-J8rn6v4DBb2nnFqkqwy6/NnTYMcgLA+sLr0iIO41qpv0n+ngb7ksag2tMRl0inb1bbO/esUwzW1vbJi7K0sI0g=="], + + "regexp-ast-analysis": ["regexp-ast-analysis@0.7.1", "https://registry.npmmirror.com/regexp-ast-analysis/-/regexp-ast-analysis-0.7.1.tgz", { "dependencies": { "@eslint-community/regexpp": "^4.8.0", "refa": "^0.12.1" } }, "sha512-sZuz1dYW/ZsfG17WSAG7eS85r5a0dDsvg+7BiiYR5o6lKCAtUrEwdmRmaGF6rwVj3LcmAeYkOWKEPlbPzN3Y3A=="], + + "regexp-tree": ["regexp-tree@0.1.27", "https://registry.npmmirror.com/regexp-tree/-/regexp-tree-0.1.27.tgz", { "bin": { "regexp-tree": "bin/regexp-tree" } }, "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA=="], + + "regjsparser": ["regjsparser@0.12.0", "https://registry.npmmirror.com/regjsparser/-/regjsparser-0.12.0.tgz", { "dependencies": { "jsesc": "~3.0.2" }, "bin": { "regjsparser": "bin/parser" } }, "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ=="], + + "resolve-from": ["resolve-from@4.0.0", "https://registry.npmmirror.com/resolve-from/-/resolve-from-4.0.0.tgz", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], + + "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "https://registry.npmmirror.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], + + "reusify": ["reusify@1.1.0", "https://registry.npmmirror.com/reusify/-/reusify-1.1.0.tgz", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="], + + "rfdc": ["rfdc@1.4.1", "https://registry.npmmirror.com/rfdc/-/rfdc-1.4.1.tgz", {}, "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA=="], + + "rollup": ["rollup@4.50.0", "https://registry.npmmirror.com/rollup/-/rollup-4.50.0.tgz", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.50.0", "@rollup/rollup-android-arm64": "4.50.0", "@rollup/rollup-darwin-arm64": "4.50.0", "@rollup/rollup-darwin-x64": "4.50.0", "@rollup/rollup-freebsd-arm64": "4.50.0", "@rollup/rollup-freebsd-x64": "4.50.0", "@rollup/rollup-linux-arm-gnueabihf": "4.50.0", "@rollup/rollup-linux-arm-musleabihf": "4.50.0", "@rollup/rollup-linux-arm64-gnu": "4.50.0", "@rollup/rollup-linux-arm64-musl": "4.50.0", "@rollup/rollup-linux-loongarch64-gnu": "4.50.0", "@rollup/rollup-linux-ppc64-gnu": "4.50.0", "@rollup/rollup-linux-riscv64-gnu": "4.50.0", "@rollup/rollup-linux-riscv64-musl": "4.50.0", "@rollup/rollup-linux-s390x-gnu": "4.50.0", "@rollup/rollup-linux-x64-gnu": "4.50.0", "@rollup/rollup-linux-x64-musl": "4.50.0", "@rollup/rollup-openharmony-arm64": "4.50.0", "@rollup/rollup-win32-arm64-msvc": "4.50.0", "@rollup/rollup-win32-ia32-msvc": "4.50.0", "@rollup/rollup-win32-x64-msvc": "4.50.0", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-/Zl4D8zPifNmyGzJS+3kVoyXeDeT/GrsJM94sACNg9RtUE0hrHa1bNPtRSrfHTMH5HjRzce6K7rlTh3Khiw+pw=="], + + "run-parallel": ["run-parallel@1.2.0", "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], + + "rxjs": ["rxjs@7.8.2", "https://registry.npmmirror.com/rxjs/-/rxjs-7.8.2.tgz", { "dependencies": { "tslib": "^2.1.0" } }, "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA=="], + + "sass": ["sass@1.91.0", "https://registry.npmmirror.com/sass/-/sass-1.91.0.tgz", { "dependencies": { "chokidar": "^4.0.0", "immutable": "^5.0.2", "source-map-js": ">=0.6.2 <2.0.0" }, "optionalDependencies": { "@parcel/watcher": "^2.4.1" }, "bin": { "sass": "sass.js" } }, "sha512-aFOZHGf+ur+bp1bCHZ+u8otKGh77ZtmFyXDo4tlYvT7PWql41Kwd8wdkPqhhT+h2879IVblcHFglIMofsFd1EA=="], + + "sass-embedded": ["sass-embedded@1.91.0", "https://registry.npmmirror.com/sass-embedded/-/sass-embedded-1.91.0.tgz", { "dependencies": { "@bufbuild/protobuf": "^2.5.0", "buffer-builder": "^0.2.0", "colorjs.io": "^0.5.0", "immutable": "^5.0.2", "rxjs": "^7.4.0", "supports-color": "^8.1.1", "sync-child-process": "^1.0.2", "varint": "^6.0.0" }, "optionalDependencies": { "sass-embedded-all-unknown": "1.91.0", "sass-embedded-android-arm": "1.91.0", "sass-embedded-android-arm64": "1.91.0", "sass-embedded-android-riscv64": "1.91.0", "sass-embedded-android-x64": "1.91.0", "sass-embedded-darwin-arm64": "1.91.0", "sass-embedded-darwin-x64": "1.91.0", "sass-embedded-linux-arm": "1.91.0", "sass-embedded-linux-arm64": "1.91.0", "sass-embedded-linux-musl-arm": "1.91.0", "sass-embedded-linux-musl-arm64": "1.91.0", "sass-embedded-linux-musl-riscv64": "1.91.0", "sass-embedded-linux-musl-x64": "1.91.0", "sass-embedded-linux-riscv64": "1.91.0", "sass-embedded-linux-x64": "1.91.0", "sass-embedded-unknown-all": "1.91.0", "sass-embedded-win32-arm64": "1.91.0", "sass-embedded-win32-x64": "1.91.0" }, "bin": { "sass": "dist/bin/sass.js" } }, "sha512-VTckYcH1AglrZ3VpPETilTo3Ef472XKwP13lrNfbOHSR6Eo5p27XTkIi+6lrCbuhBFFGAmy+4BRoLaeFUgn+eg=="], + + "sass-embedded-all-unknown": ["sass-embedded-all-unknown@1.91.0", "https://registry.npmmirror.com/sass-embedded-all-unknown/-/sass-embedded-all-unknown-1.91.0.tgz", { "dependencies": { "sass": "1.91.0" }, "cpu": [ "!arm", "!x64", "!arm64", ] }, "sha512-AXC1oPqDfLnLtcoxM+XwSnbhcQs0TxAiA5JDEstl6+tt6fhFLKxdyl1Hla39SFtxvMfB2QDUYE3Dmx49O59vYg=="], + + "sass-embedded-android-arm": ["sass-embedded-android-arm@1.91.0", "https://registry.npmmirror.com/sass-embedded-android-arm/-/sass-embedded-android-arm-1.91.0.tgz", { "os": "android", "cpu": "arm" }, "sha512-DSh1V8TlLIcpklAbn4NINEFs3yD2OzVTbawEXK93IH990upoGNFVNRTstFQ/gcvlbWph3Y3FjAJvo37zUO485A=="], + + "sass-embedded-android-arm64": ["sass-embedded-android-arm64@1.91.0", "https://registry.npmmirror.com/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.91.0.tgz", { "os": "android", "cpu": "arm64" }, "sha512-I8Eeg2CeVcZIhXcQLNEY6ZBRF0m7jc818/fypwMwvIdbxGWBekTzc3aKHTLhdBpFzGnDIyR4s7oB0/OjIpzD1A=="], + + "sass-embedded-android-riscv64": ["sass-embedded-android-riscv64@1.91.0", "https://registry.npmmirror.com/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.91.0.tgz", { "os": "android", "cpu": "none" }, "sha512-qmsl1a7IIJL0fCOwzmRB+6nxeJK5m9/W8LReXUrdgyJNH5RyxChDg+wwQPVATFffOuztmWMnlJ5CV2sCLZrXcQ=="], + + "sass-embedded-android-x64": ["sass-embedded-android-x64@1.91.0", "https://registry.npmmirror.com/sass-embedded-android-x64/-/sass-embedded-android-x64-1.91.0.tgz", { "os": "android", "cpu": "x64" }, "sha512-/wN0HBLATOVSeN3Tzg0yxxNTo1IQvOxxxwFv7Ki/1/UCg2AqZPxTpNoZj/mn8tUPtiVogMGbC8qclYMq1aRZsQ=="], + + "sass-embedded-darwin-arm64": ["sass-embedded-darwin-arm64@1.91.0", "https://registry.npmmirror.com/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.91.0.tgz", { "os": "darwin", "cpu": "arm64" }, "sha512-gQ6ScInxAN+BDUXy426BSYLRawkmGYlHpQ9i6iOxorr64dtIb3l6eb9YaBV8lPlroUnugylmwN2B3FU9BuPfhA=="], + + "sass-embedded-darwin-x64": ["sass-embedded-darwin-x64@1.91.0", "https://registry.npmmirror.com/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.91.0.tgz", { "os": "darwin", "cpu": "x64" }, "sha512-DSvFMtECL2blYVTFMO5fLeNr5bX437Lrz8R47fdo5438TRyOkSgwKTkECkfh3YbnrL86yJIN2QQlmBMF17Z/iw=="], + + "sass-embedded-linux-arm": ["sass-embedded-linux-arm@1.91.0", "https://registry.npmmirror.com/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.91.0.tgz", { "os": "linux", "cpu": "arm" }, "sha512-ppAZLp3eZ9oTjYdQDf4nM7EehDpkxq5H1hE8FOrx8LpY7pxn6QF+SRpAbRjdfFChRw0K7vh+IiCnQEMp7uLNAg=="], + + "sass-embedded-linux-arm64": ["sass-embedded-linux-arm64@1.91.0", "https://registry.npmmirror.com/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.91.0.tgz", { "os": "linux", "cpu": "arm64" }, "sha512-OnKCabD7f420ZEC/6YI9WhCVGMZF+ybZ5NbAB9SsG1xlxrKbWQ1s7CIl0w/6RDALtJ+Fjn8+mrxsxqakoAkeuA=="], + + "sass-embedded-linux-musl-arm": ["sass-embedded-linux-musl-arm@1.91.0", "https://registry.npmmirror.com/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.91.0.tgz", { "os": "linux", "cpu": "arm" }, "sha512-znEsNC2FurPF9+XwQQ6e/fVoic3e5D3/kMB41t/bE8byJVRdaPhkdsszt3pZUE56nNGYoCuieSXUkk7VvyPHsw=="], + + "sass-embedded-linux-musl-arm64": ["sass-embedded-linux-musl-arm64@1.91.0", "https://registry.npmmirror.com/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.91.0.tgz", { "os": "linux", "cpu": "arm64" }, "sha512-VfbPpID1C5TT7rukob6CKgefx/TsLE+XZieMNd00hvfJ8XhqPr5DGvSMCNpXlwaedzTirbJu357m+n2PJI9TFQ=="], + + "sass-embedded-linux-musl-riscv64": ["sass-embedded-linux-musl-riscv64@1.91.0", "https://registry.npmmirror.com/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.91.0.tgz", { "os": "linux", "cpu": "none" }, "sha512-ZfLGldKEEeZjuljKks835LTq7jDRI3gXsKKXXgZGzN6Yymd4UpBOGWiDQlWsWTvw5UwDU2xfFh0wSXbLGHTjVA=="], + + "sass-embedded-linux-musl-x64": ["sass-embedded-linux-musl-x64@1.91.0", "https://registry.npmmirror.com/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.91.0.tgz", { "os": "linux", "cpu": "x64" }, "sha512-4kSiSGPKFMbLvTRbP/ibyiKheOA3fwsJKWU0SOuekSPmybMdrhNkTm0REp6+nehZRE60kC3lXmEV4a7w8Jrwyg=="], + + "sass-embedded-linux-riscv64": ["sass-embedded-linux-riscv64@1.91.0", "https://registry.npmmirror.com/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.91.0.tgz", { "os": "linux", "cpu": "none" }, "sha512-Y3Fj94SYYvMX9yo49T78yBgBWXtG3EyYUT5K05XyCYkcdl1mVXJSrEmqmRfe4vQGUCaSe/6s7MmsA9Q+mQez7Q=="], + + "sass-embedded-linux-x64": ["sass-embedded-linux-x64@1.91.0", "https://registry.npmmirror.com/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.91.0.tgz", { "os": "linux", "cpu": "x64" }, "sha512-XwIUaE7pQP/ezS5te80hlyheYiUlo0FolQ0HBtxohpavM+DVX2fjwFm5LOUJHrLAqP+TLBtChfFeLj1Ie4Aenw=="], + + "sass-embedded-unknown-all": ["sass-embedded-unknown-all@1.91.0", "https://registry.npmmirror.com/sass-embedded-unknown-all/-/sass-embedded-unknown-all-1.91.0.tgz", { "dependencies": { "sass": "1.91.0" }, "os": [ "!linux", "!win32", "!darwin", "!android", ] }, "sha512-Bj6v7ScQp/HtO91QBy6ood9AArSIN7/RNcT4E7P9QoY3o+e6621Vd28lV81vdepPrt6u6PgJoVKmLNODqB6Q+A=="], + + "sass-embedded-win32-arm64": ["sass-embedded-win32-arm64@1.91.0", "https://registry.npmmirror.com/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.91.0.tgz", { "os": "win32", "cpu": "arm64" }, "sha512-yDCwTiPRex03i1yo7LwiAl1YQ21UyfOxPobD7UjI8AE8ZcB0mQ28VVX66lsZ+qm91jfLslNFOFCD4v79xCG9hA=="], + + "sass-embedded-win32-x64": ["sass-embedded-win32-x64@1.91.0", "https://registry.npmmirror.com/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.91.0.tgz", { "os": "win32", "cpu": "x64" }, "sha512-wiuMz/cx4vsk6rYCnNyoGE5pd73aDJ/zF3qJDose3ZLT1/vV943doJE5pICnS/v5DrUqzV6a1CNq4fN+xeSgFQ=="], + + "scslre": ["scslre@0.3.0", "https://registry.npmmirror.com/scslre/-/scslre-0.3.0.tgz", { "dependencies": { "@eslint-community/regexpp": "^4.8.0", "refa": "^0.12.0", "regexp-ast-analysis": "^0.7.0" } }, "sha512-3A6sD0WYP7+QrjbfNA2FN3FsOaGGFoekCVgTyypy53gPxhbkCIjtO6YWgdrfM+n/8sI8JeXZOIxsHjMTNxQ4nQ=="], + + "scule": ["scule@1.3.0", "https://registry.npmmirror.com/scule/-/scule-1.3.0.tgz", {}, "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g=="], + + "semver": ["semver@7.7.2", "https://registry.npmmirror.com/semver/-/semver-7.7.2.tgz", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="], + + "shebang-command": ["shebang-command@2.0.0", "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], + + "shebang-regex": ["shebang-regex@3.0.0", "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], + + "shell-quote": ["shell-quote@1.8.3", "https://registry.npmmirror.com/shell-quote/-/shell-quote-1.8.3.tgz", {}, "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw=="], + + "sisteransi": ["sisteransi@1.0.5", "https://registry.npmmirror.com/sisteransi/-/sisteransi-1.0.5.tgz", {}, "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg=="], + + "source-map-js": ["source-map-js@1.2.1", "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], + + "speakingurl": ["speakingurl@14.0.1", "https://registry.npmmirror.com/speakingurl/-/speakingurl-14.0.1.tgz", {}, "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ=="], + + "stable-hash-x": ["stable-hash-x@0.2.0", "https://registry.npmmirror.com/stable-hash-x/-/stable-hash-x-0.2.0.tgz", {}, "sha512-o3yWv49B/o4QZk5ZcsALc6t0+eCelPc44zZsLtCQnZPDwFpDYSWcDnrv2TtMmMbQ7uKo3J0HTURCqckw23czNQ=="], + + "strip-indent": ["strip-indent@4.0.0", "https://registry.npmmirror.com/strip-indent/-/strip-indent-4.0.0.tgz", { "dependencies": { "min-indent": "^1.0.1" } }, "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA=="], + + "strip-json-comments": ["strip-json-comments@3.1.1", "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], + + "style-value-types": ["style-value-types@5.1.2", "https://registry.npmmirror.com/style-value-types/-/style-value-types-5.1.2.tgz", { "dependencies": { "hey-listen": "^1.0.8", "tslib": "2.4.0" } }, "sha512-Vs9fNreYF9j6W2VvuDTP7kepALi7sk0xtk2Tu8Yxi9UoajJdEVpNpCov0HsLTqXvNGKX+Uv09pkozVITi1jf3Q=="], + + "superjson": ["superjson@2.2.2", "https://registry.npmmirror.com/superjson/-/superjson-2.2.2.tgz", { "dependencies": { "copy-anything": "^3.0.2" } }, "sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q=="], + + "supports-color": ["supports-color@8.1.1", "https://registry.npmmirror.com/supports-color/-/supports-color-8.1.1.tgz", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], + + "sync-child-process": ["sync-child-process@1.0.2", "https://registry.npmmirror.com/sync-child-process/-/sync-child-process-1.0.2.tgz", { "dependencies": { "sync-message-port": "^1.0.0" } }, "sha512-8lD+t2KrrScJ/7KXCSyfhT3/hRq78rC0wBFqNJXv3mZyn6hW2ypM05JmlSvtqRbeq6jqA94oHbxAr2vYsJ8vDA=="], + + "sync-message-port": ["sync-message-port@1.1.3", "https://registry.npmmirror.com/sync-message-port/-/sync-message-port-1.1.3.tgz", {}, "sha512-GTt8rSKje5FilG+wEdfCkOcLL7LWqpMlr2c3LRuKt/YXxcJ52aGSbGBAdI4L3aaqfrBt6y711El53ItyH1NWzg=="], + + "synckit": ["synckit@0.11.11", "https://registry.npmmirror.com/synckit/-/synckit-0.11.11.tgz", { "dependencies": { "@pkgr/core": "^0.2.9" } }, "sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw=="], + + "tinyexec": ["tinyexec@1.0.1", "https://registry.npmmirror.com/tinyexec/-/tinyexec-1.0.1.tgz", {}, "sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw=="], + + "tinyglobby": ["tinyglobby@0.2.14", "https://registry.npmmirror.com/tinyglobby/-/tinyglobby-0.2.14.tgz", { "dependencies": { "fdir": "^6.4.4", "picomatch": "^4.0.2" } }, "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ=="], + + "to-regex-range": ["to-regex-range@5.0.1", "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], + + "ts-api-utils": ["ts-api-utils@2.1.0", "https://registry.npmmirror.com/ts-api-utils/-/ts-api-utils-2.1.0.tgz", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ=="], + + "tslib": ["tslib@2.4.0", "https://registry.npmmirror.com/tslib/-/tslib-2.4.0.tgz", {}, "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="], + + "type-check": ["type-check@0.4.0", "https://registry.npmmirror.com/type-check/-/type-check-0.4.0.tgz", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="], + + "typescript": ["typescript@5.8.3", "https://registry.npmmirror.com/typescript/-/typescript-5.8.3.tgz", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ=="], + + "typescript-eslint": ["typescript-eslint@8.41.0", "https://registry.npmmirror.com/typescript-eslint/-/typescript-eslint-8.41.0.tgz", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.41.0", "@typescript-eslint/parser": "8.41.0", "@typescript-eslint/typescript-estree": "8.41.0", "@typescript-eslint/utils": "8.41.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-n66rzs5OBXW3SFSnZHr2T685q1i4ODm2nulFJhMZBotaTavsS8TrI3d7bDlRSs9yWo7HmyWrN9qDu14Qv7Y0Dw=="], + + "ufo": ["ufo@1.6.1", "https://registry.npmmirror.com/ufo/-/ufo-1.6.1.tgz", {}, "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA=="], + + "undici-types": ["undici-types@6.21.0", "https://registry.npmmirror.com/undici-types/-/undici-types-6.21.0.tgz", {}, "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ=="], + + "unplugin": ["unplugin@2.3.5", "https://registry.npmmirror.com/unplugin/-/unplugin-2.3.5.tgz", { "dependencies": { "acorn": "^8.14.1", "picomatch": "^4.0.2", "webpack-virtual-modules": "^0.6.2" } }, "sha512-RyWSb5AHmGtjjNQ6gIlA67sHOsWpsbWpwDokLwTcejVdOjEkJZh7QKu14J00gDDVSh8kGH4KYC/TNBceXFZhtw=="], + + "unplugin-fonts": ["unplugin-fonts@1.4.0", "https://registry.npmmirror.com/unplugin-fonts/-/unplugin-fonts-1.4.0.tgz", { "dependencies": { "fast-glob": "^3.3.3", "unplugin": "2.3.5" }, "peerDependencies": { "@nuxt/kit": "^3.0.0 || ^4.0.0", "vite": "^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" }, "optionalPeers": ["@nuxt/kit"] }, "sha512-TIJqr5rSlK/+3oL5nnrrEJ+Ty2taQ/bTJY1C5abYnksl553Q3HoHVqS4pnRLDkwpZq8AYqywib3kEVvHH+CtRQ=="], + + "unplugin-utils": ["unplugin-utils@0.2.5", "https://registry.npmmirror.com/unplugin-utils/-/unplugin-utils-0.2.5.tgz", { "dependencies": { "pathe": "^2.0.3", "picomatch": "^4.0.3" } }, "sha512-gwXJnPRewT4rT7sBi/IvxKTjsms7jX7QIDLOClApuZwR49SXbrB1z2NLUZ+vDHyqCj/n58OzRRqaW+B8OZi8vg=="], + + "unplugin-vue-components": ["unplugin-vue-components@28.8.0", "https://registry.npmmirror.com/unplugin-vue-components/-/unplugin-vue-components-28.8.0.tgz", { "dependencies": { "chokidar": "^3.6.0", "debug": "^4.4.1", "local-pkg": "^1.1.1", "magic-string": "^0.30.17", "mlly": "^1.7.4", "tinyglobby": "^0.2.14", "unplugin": "^2.3.5", "unplugin-utils": "^0.2.4" }, "peerDependencies": { "@babel/parser": "^7.15.8", "@nuxt/kit": "^3.2.2 || ^4.0.0", "vue": "2 || 3" }, "optionalPeers": ["@babel/parser", "@nuxt/kit"] }, "sha512-2Q6ZongpoQzuXDK0ZsVzMoshH0MWZQ1pzVL538G7oIDKRTVzHjppBDS8aB99SADGHN3lpGU7frraCG6yWNoL5Q=="], + + "unplugin-vue-router": ["unplugin-vue-router@0.14.0", "https://registry.npmmirror.com/unplugin-vue-router/-/unplugin-vue-router-0.14.0.tgz", { "dependencies": { "@vue-macros/common": "3.0.0-beta.15", "ast-walker-scope": "^0.8.1", "chokidar": "^4.0.3", "fast-glob": "^3.3.3", "json5": "^2.2.3", "local-pkg": "^1.1.1", "magic-string": "^0.30.17", "mlly": "^1.7.4", "pathe": "^2.0.3", "picomatch": "^4.0.2", "scule": "^1.3.0", "unplugin": "^2.3.5", "unplugin-utils": "^0.2.4", "yaml": "^2.8.0" }, "peerDependencies": { "@vue/compiler-sfc": "^3.5.17", "vue-router": "^4.5.1" }, "optionalPeers": ["vue-router"] }, "sha512-ipjunvS5e2aFHBAUFuLbHl2aHKbXXXBhTxGT9wZx66fNVPdEQzVVitF8nODr1plANhTTa3UZ+DQu9uyLngMzoQ=="], + + "unrs-resolver": ["unrs-resolver@1.11.1", "https://registry.npmmirror.com/unrs-resolver/-/unrs-resolver-1.11.1.tgz", { "dependencies": { "napi-postinstall": "^0.3.0" }, "optionalDependencies": { "@unrs/resolver-binding-android-arm-eabi": "1.11.1", "@unrs/resolver-binding-android-arm64": "1.11.1", "@unrs/resolver-binding-darwin-arm64": "1.11.1", "@unrs/resolver-binding-darwin-x64": "1.11.1", "@unrs/resolver-binding-freebsd-x64": "1.11.1", "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1", "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1", "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1", "@unrs/resolver-binding-linux-arm64-musl": "1.11.1", "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1", "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1", "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1", "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1", "@unrs/resolver-binding-linux-x64-gnu": "1.11.1", "@unrs/resolver-binding-linux-x64-musl": "1.11.1", "@unrs/resolver-binding-wasm32-wasi": "1.11.1", "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1", "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1", "@unrs/resolver-binding-win32-x64-msvc": "1.11.1" } }, "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg=="], + + "upath": ["upath@2.0.1", "https://registry.npmmirror.com/upath/-/upath-2.0.1.tgz", {}, "sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w=="], + + "update-browserslist-db": ["update-browserslist-db@1.1.3", "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw=="], + + "uri-js": ["uri-js@4.4.1", "https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="], + + "util-deprecate": ["util-deprecate@1.0.2", "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], + + "varint": ["varint@6.0.0", "https://registry.npmmirror.com/varint/-/varint-6.0.0.tgz", {}, "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg=="], + + "vite": ["vite@6.3.5", "https://registry.npmmirror.com/vite/-/vite-6.3.5.tgz", { "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" }, "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" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ=="], + + "vite-plugin-vuetify": ["vite-plugin-vuetify@2.1.2", "https://registry.npmmirror.com/vite-plugin-vuetify/-/vite-plugin-vuetify-2.1.2.tgz", { "dependencies": { "@vuetify/loader-shared": "^2.1.1", "debug": "^4.3.3", "upath": "^2.0.1" }, "peerDependencies": { "vite": ">=5", "vue": "^3.0.0", "vuetify": "^3.0.0" } }, "sha512-I/wd6QS+DO6lHmuGoi1UTyvvBTQ2KDzQZ9oowJQEJ6OcjWfJnscYXx2ptm6S7fJSASuZT8jGRBL3LV4oS3LpaA=="], + + "vscode-uri": ["vscode-uri@3.1.0", "https://registry.npmmirror.com/vscode-uri/-/vscode-uri-3.1.0.tgz", {}, "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ=="], + + "vue": ["vue@3.5.20", "https://registry.npmmirror.com/vue/-/vue-3.5.20.tgz", { "dependencies": { "@vue/compiler-dom": "3.5.20", "@vue/compiler-sfc": "3.5.20", "@vue/runtime-dom": "3.5.20", "@vue/server-renderer": "3.5.20", "@vue/shared": "3.5.20" }, "peerDependencies": { "typescript": "*" }, "optionalPeers": ["typescript"] }, "sha512-2sBz0x/wis5TkF1XZ2vH25zWq3G1bFEPOfkBcx2ikowmphoQsPH6X0V3mmPCXA2K1N/XGTnifVyDQP4GfDDeQw=="], + + "vue-eslint-parser": ["vue-eslint-parser@10.2.0", "https://registry.npmmirror.com/vue-eslint-parser/-/vue-eslint-parser-10.2.0.tgz", { "dependencies": { "debug": "^4.4.0", "eslint-scope": "^8.2.0", "eslint-visitor-keys": "^4.2.0", "espree": "^10.3.0", "esquery": "^1.6.0", "semver": "^7.6.3" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0" } }, "sha512-CydUvFOQKD928UzZhTp4pr2vWz1L+H99t7Pkln2QSPdvmURT0MoC4wUccfCnuEaihNsu9aYYyk+bep8rlfkUXw=="], + + "vue-router": ["vue-router@4.5.1", "https://registry.npmmirror.com/vue-router/-/vue-router-4.5.1.tgz", { "dependencies": { "@vue/devtools-api": "^6.6.4" }, "peerDependencies": { "vue": "^3.2.0" } }, "sha512-ogAF3P97NPm8fJsE4by9dwSYtDwXIY1nFY9T6DyQnGHd1E2Da94w9JIolpe42LJGIl0DwOHBi8TcRPlPGwbTtw=="], + + "vue-tsc": ["vue-tsc@3.0.6", "https://registry.npmmirror.com/vue-tsc/-/vue-tsc-3.0.6.tgz", { "dependencies": { "@volar/typescript": "2.4.23", "@vue/language-core": "3.0.6" }, "peerDependencies": { "typescript": ">=5.0.0" }, "bin": { "vue-tsc": "./bin/vue-tsc.js" } }, "sha512-Tbs8Whd43R2e2nxez4WXPvvdjGbW24rOSgRhLOHXzWiT4pcP4G7KeWh0YCn18rF4bVwv7tggLLZ6MJnO6jXPBg=="], + + "vuetify": ["vuetify@3.9.6", "https://registry.npmmirror.com/vuetify/-/vuetify-3.9.6.tgz", { "peerDependencies": { "typescript": ">=4.7", "vite-plugin-vuetify": ">=2.1.0", "vue": "^3.5.0", "webpack-plugin-vuetify": ">=3.1.0" }, "optionalPeers": ["typescript", "vite-plugin-vuetify", "webpack-plugin-vuetify"] }, "sha512-jNs2yLYiM50kE16gBu58xmnh9t/MOvgnYcNvmLNps6TLq9rPvjTNFm2k2jWfe69hGg0gQf+MFXXDkf65fxi9gg=="], + + "webpack-virtual-modules": ["webpack-virtual-modules@0.6.2", "https://registry.npmmirror.com/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", {}, "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ=="], + + "which": ["which@5.0.0", "https://registry.npmmirror.com/which/-/which-5.0.0.tgz", { "dependencies": { "isexe": "^3.1.1" }, "bin": { "node-which": "bin/which.js" } }, "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ=="], + + "word-wrap": ["word-wrap@1.2.5", "https://registry.npmmirror.com/word-wrap/-/word-wrap-1.2.5.tgz", {}, "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA=="], + + "xml-name-validator": ["xml-name-validator@4.0.0", "https://registry.npmmirror.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz", {}, "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw=="], + + "yaml": ["yaml@2.8.1", "https://registry.npmmirror.com/yaml/-/yaml-2.8.1.tgz", { "bin": { "yaml": "bin.mjs" } }, "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw=="], + + "yaml-eslint-parser": ["yaml-eslint-parser@1.3.0", "https://registry.npmmirror.com/yaml-eslint-parser/-/yaml-eslint-parser-1.3.0.tgz", { "dependencies": { "eslint-visitor-keys": "^3.0.0", "yaml": "^2.0.0" } }, "sha512-E/+VitOorXSLiAqtTd7Yqax0/pAS3xaYMP+AUUJGOK1OZG3rhcj9fcJOM5HJ2VrP1FrStVCWr1muTfQCdj4tAA=="], + + "yocto-queue": ["yocto-queue@0.1.0", "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], + + "@emnapi/core/tslib": ["tslib@2.8.1", "https://registry.npmmirror.com/tslib/-/tslib-2.8.1.tgz", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@emnapi/runtime/tslib": ["tslib@2.8.1", "https://registry.npmmirror.com/tslib/-/tslib-2.8.1.tgz", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@emnapi/wasi-threads/tslib": ["tslib@2.8.1", "https://registry.npmmirror.com/tslib/-/tslib-2.8.1.tgz", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], + + "@eslint/eslintrc/globals": ["globals@14.0.0", "https://registry.npmmirror.com/globals/-/globals-14.0.0.tgz", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], + + "@humanfs/node/@humanwhocodes/retry": ["@humanwhocodes/retry@0.3.1", "https://registry.npmmirror.com/@humanwhocodes/retry/-/retry-0.3.1.tgz", {}, "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA=="], + + "@tybys/wasm-util/tslib": ["tslib@2.8.1", "https://registry.npmmirror.com/tslib/-/tslib-2.8.1.tgz", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "@typescript-eslint/eslint-plugin/ignore": ["ignore@7.0.5", "https://registry.npmmirror.com/ignore/-/ignore-7.0.5.tgz", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], + + "@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.5.tgz", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + + "anymatch/picomatch": ["picomatch@2.3.1", "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "chalk/ansi-styles": ["ansi-styles@4.3.0", "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + + "chalk/supports-color": ["supports-color@7.2.0", "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + + "chokidar/glob-parent": ["glob-parent@5.1.2", "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], + + "clean-regexp/escape-string-regexp": ["escape-string-regexp@1.0.5", "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", {}, "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg=="], + + "cross-spawn/which": ["which@2.0.2", "https://registry.npmmirror.com/which/-/which-2.0.2.tgz", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], + + "eslint-plugin-import-x/minimatch": ["minimatch@9.0.5", "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.5.tgz", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + + "eslint-plugin-vuejs-accessibility/vue-eslint-parser": ["vue-eslint-parser@9.4.3", "https://registry.npmmirror.com/vue-eslint-parser/-/vue-eslint-parser-9.4.3.tgz", { "dependencies": { "debug": "^4.3.4", "eslint-scope": "^7.1.1", "eslint-visitor-keys": "^3.3.0", "espree": "^9.3.1", "esquery": "^1.4.0", "lodash": "^4.17.21", "semver": "^7.3.6" }, "peerDependencies": { "eslint": ">=6.0.0" } }, "sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg=="], + + "fast-glob/glob-parent": ["glob-parent@5.1.2", "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], + + "jsonc-eslint-parser/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], + + "jsonc-eslint-parser/espree": ["espree@9.6.1", "https://registry.npmmirror.com/espree/-/espree-9.6.1.tgz", { "dependencies": { "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.4.1" } }, "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ=="], + + "micromatch/picomatch": ["picomatch@2.3.1", "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "mlly/pkg-types": ["pkg-types@1.3.1", "https://registry.npmmirror.com/pkg-types/-/pkg-types-1.3.1.tgz", { "dependencies": { "confbox": "^0.1.8", "mlly": "^1.7.4", "pathe": "^2.0.1" } }, "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ=="], + + "npm-run-all2/minimatch": ["minimatch@9.0.5", "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.5.tgz", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + + "pinia/@vue/devtools-api": ["@vue/devtools-api@7.7.7", "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-7.7.7.tgz", { "dependencies": { "@vue/devtools-kit": "^7.7.7" } }, "sha512-lwOnNBH2e7x1fIIbVT7yF5D+YWhqELm55/4ZKf45R9T8r9dE2AIOy8HKjfqzGsoTHFbWbr337O4E0A0QADnjBg=="], + + "readdirp/picomatch": ["picomatch@2.3.1", "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + + "regjsparser/jsesc": ["jsesc@3.0.2", "https://registry.npmmirror.com/jsesc/-/jsesc-3.0.2.tgz", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g=="], + + "rxjs/tslib": ["tslib@2.8.1", "https://registry.npmmirror.com/tslib/-/tslib-2.8.1.tgz", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + + "sass/chokidar": ["chokidar@4.0.3", "https://registry.npmmirror.com/chokidar/-/chokidar-4.0.3.tgz", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="], + + "unplugin-vue-router/chokidar": ["chokidar@4.0.3", "https://registry.npmmirror.com/chokidar/-/chokidar-4.0.3.tgz", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="], + + "yaml-eslint-parser/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], + + "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.2", "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.2.tgz", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], + + "cross-spawn/which/isexe": ["isexe@2.0.0", "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], + + "eslint-plugin-import-x/minimatch/brace-expansion": ["brace-expansion@2.0.2", "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.2.tgz", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], + + "eslint-plugin-vuejs-accessibility/vue-eslint-parser/eslint-scope": ["eslint-scope@7.2.2", "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-7.2.2.tgz", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg=="], + + "eslint-plugin-vuejs-accessibility/vue-eslint-parser/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], + + "eslint-plugin-vuejs-accessibility/vue-eslint-parser/espree": ["espree@9.6.1", "https://registry.npmmirror.com/espree/-/espree-9.6.1.tgz", { "dependencies": { "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.4.1" } }, "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ=="], + + "mlly/pkg-types/confbox": ["confbox@0.1.8", "https://registry.npmmirror.com/confbox/-/confbox-0.1.8.tgz", {}, "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w=="], + + "npm-run-all2/minimatch/brace-expansion": ["brace-expansion@2.0.2", "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.2.tgz", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], + + "sass/chokidar/readdirp": ["readdirp@4.1.2", "https://registry.npmmirror.com/readdirp/-/readdirp-4.1.2.tgz", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="], + + "unplugin-vue-router/chokidar/readdirp": ["readdirp@4.1.2", "https://registry.npmmirror.com/readdirp/-/readdirp-4.1.2.tgz", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="], + } +} diff --git a/env.d.ts b/env.d.ts new file mode 100644 index 0000000..dabd0de --- /dev/null +++ b/env.d.ts @@ -0,0 +1,2 @@ +/// +/// diff --git a/eslint.config.js b/eslint.config.js new file mode 100644 index 0000000..8d4d4dc --- /dev/null +++ b/eslint.config.js @@ -0,0 +1,2 @@ +// 完全禁用所有 ESLint 检查 +export default []; diff --git a/index.html b/index.html new file mode 100644 index 0000000..8abc79c --- /dev/null +++ b/index.html @@ -0,0 +1,13 @@ + + + + + + + Welcome to Vuetify 3 + + +
+ + + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..5caf437 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,4257 @@ +{ + "name": "client", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "client", + "version": "0.0.0", + "dependencies": { + "@babylonjs/core": "^8.25.0", + "@babylonjs/loaders": "^8.25.0", + "@fontsource/roboto": "5.2.6", + "@mdi/font": "7.4.47", + "@types/babylonjs": "^2.4.5", + "pinia": "^3.0.3", + "popmotion": "^11.0.5", + "uuid": "^13.0.0", + "vue": "^3.5.17", + "vuetify": "^3.9.1" + }, + "devDependencies": { + "@tsconfig/node22": "^22.0.0", + "@types/node": "^22.9.0", + "@vitejs/plugin-vue": "^5.2.3", + "@vue/tsconfig": "^0.7.0", + "eslint": "^9.30.1", + "eslint-config-vuetify": "^4.0.0", + "npm-run-all2": "^7.0.2", + "sass-embedded": "^1.89.2", + "typescript": "~5.8.3", + "unplugin-fonts": "^1.3.1", + "unplugin-vue-components": "^28.8.0", + "unplugin-vue-router": "^0.14.0", + "vite": "^6.3.5", + "vite-plugin-vuetify": "^2.1.1", + "vue-router": "^4.5.1", + "vue-tsc": "^3.0.1" + } + }, + "node_modules/@apidevtools/json-schema-ref-parser": { + "version": "14.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "js-yaml": "^4.1.0" + }, + "engines": { + "node": ">= 20" + }, + "funding": { + "url": "https://github.com/sponsors/philsturgeon" + }, + "peerDependencies": { + "@types/json-schema": "^7.0.15" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.27.1", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.3", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.2", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babylonjs/core": { + "version": "8.25.0", + "license": "Apache-2.0" + }, + "node_modules/@babylonjs/loaders": { + "version": "8.25.0", + "license": "Apache-2.0", + "peerDependencies": { + "@babylonjs/core": "^8.0.0", + "babylonjs-gltf2interface": "^8.0.0" + } + }, + "node_modules/@bufbuild/protobuf": { + "version": "2.7.0", + "devOptional": true, + "license": "(Apache-2.0 AND BSD-3-Clause)" + }, + "node_modules/@clack/core": { + "version": "0.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^1.0.0", + "sisteransi": "^1.0.5" + } + }, + "node_modules/@clack/prompts": { + "version": "0.11.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@clack/core": "0.5.0", + "picocolors": "^1.0.0", + "sisteransi": "^1.0.5" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.9", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.7.0", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/compat": { + "version": "1.3.2", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "eslint": "^8.40 || 9" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.6", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.3.1", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.15.2", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "9.34.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.6", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.3.5", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.15.2", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@fontsource/roboto": { + "version": "5.2.6", + "license": "OFL-1.1", + "funding": { + "url": "https://github.com/sponsors/ayuhito" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.6", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.3.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "license": "MIT" + }, + "node_modules/@mdi/font": { + "version": "7.4.47", + "license": "Apache-2.0" + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgr/core": { + "version": "0.2.9", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/pkgr" + } + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.50.0", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@stylistic/eslint-plugin": { + "version": "4.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/utils": "^8.32.1", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", + "estraverse": "^5.3.0", + "picomatch": "^4.0.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "eslint": ">=9.0.0" + } + }, + "node_modules/@tsconfig/node22": { + "version": "22.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/babylonjs": { + "version": "2.4.5", + "deprecated": "This is a stub types definition. babylonjs provides its own type definitions, so you do not need this installed.", + "license": "MIT", + "dependencies": { + "babylonjs": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "devOptional": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.18.0", + "devOptional": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.41.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.41.0", + "@typescript-eslint/type-utils": "8.41.0", + "@typescript-eslint/utils": "8.41.0", + "@typescript-eslint/visitor-keys": "8.41.0", + "graphemer": "^1.4.0", + "ignore": "^7.0.0", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.41.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.41.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.41.0", + "@typescript-eslint/types": "8.41.0", + "@typescript-eslint/typescript-estree": "8.41.0", + "@typescript-eslint/visitor-keys": "8.41.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.41.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.41.0", + "@typescript-eslint/types": "^8.41.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.41.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.41.0", + "@typescript-eslint/visitor-keys": "8.41.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.41.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.41.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.41.0", + "@typescript-eslint/typescript-estree": "8.41.0", + "@typescript-eslint/utils": "8.41.0", + "debug": "^4.3.4", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.41.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.41.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.41.0", + "@typescript-eslint/tsconfig-utils": "8.41.0", + "@typescript-eslint/types": "8.41.0", + "@typescript-eslint/visitor-keys": "8.41.0", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch/node_modules/brace-expansion": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.41.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.41.0", + "@typescript-eslint/types": "8.41.0", + "@typescript-eslint/typescript-estree": "8.41.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.41.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.41.0", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@unrs/resolver-binding-win32-x64-msvc": { + "version": "1.11.1", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@vitejs/plugin-vue": { + "version": "5.2.4", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@vitest/eslint-plugin": { + "version": "1.3.5", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@typescript-eslint/scope-manager": "^8.41.0", + "@typescript-eslint/utils": "^8.24.1" + }, + "peerDependencies": { + "eslint": ">= 8.57.0", + "typescript": ">= 5.0.0", + "vitest": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "vitest": { + "optional": true + } + } + }, + "node_modules/@volar/language-core": { + "version": "2.4.23", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/source-map": "2.4.23" + } + }, + "node_modules/@volar/source-map": { + "version": "2.4.23", + "dev": true, + "license": "MIT" + }, + "node_modules/@volar/typescript": { + "version": "2.4.23", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.23", + "path-browserify": "^1.0.1", + "vscode-uri": "^3.0.8" + } + }, + "node_modules/@vue-macros/common": { + "version": "3.0.0-beta.15", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-sfc": "^3.5.17", + "ast-kit": "^2.1.0", + "local-pkg": "^1.1.1", + "magic-string-ast": "^1.0.0", + "unplugin-utils": "^0.2.4" + }, + "engines": { + "node": ">=20.18.0" + }, + "funding": { + "url": "https://github.com/sponsors/vue-macros" + }, + "peerDependencies": { + "vue": "^2.7.0 || ^3.2.25" + }, + "peerDependenciesMeta": { + "vue": { + "optional": true + } + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.20", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.3", + "@vue/shared": "3.5.20", + "entities": "^4.5.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.20", + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.20", + "@vue/shared": "3.5.20" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.20", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.3", + "@vue/compiler-core": "3.5.20", + "@vue/compiler-dom": "3.5.20", + "@vue/compiler-ssr": "3.5.20", + "@vue/shared": "3.5.20", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.17", + "postcss": "^8.5.6", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.20", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.20", + "@vue/shared": "3.5.20" + } + }, + "node_modules/@vue/compiler-vue2": { + "version": "2.7.16", + "dev": true, + "license": "MIT", + "dependencies": { + "de-indent": "^1.0.2", + "he": "^1.2.0" + } + }, + "node_modules/@vue/devtools-api": { + "version": "6.6.4", + "dev": true, + "license": "MIT" + }, + "node_modules/@vue/devtools-kit": { + "version": "7.7.7", + "license": "MIT", + "dependencies": { + "@vue/devtools-shared": "^7.7.7", + "birpc": "^2.3.0", + "hookable": "^5.5.3", + "mitt": "^3.0.1", + "perfect-debounce": "^1.0.0", + "speakingurl": "^14.0.1", + "superjson": "^2.2.2" + } + }, + "node_modules/@vue/devtools-shared": { + "version": "7.7.7", + "license": "MIT", + "dependencies": { + "rfdc": "^1.4.1" + } + }, + "node_modules/@vue/language-core": { + "version": "3.0.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.23", + "@vue/compiler-dom": "^3.5.0", + "@vue/compiler-vue2": "^2.7.16", + "@vue/shared": "^3.5.0", + "alien-signals": "^2.0.5", + "muggle-string": "^0.4.1", + "path-browserify": "^1.0.1", + "picomatch": "^4.0.2" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.20", + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.20" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.20", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.20", + "@vue/shared": "3.5.20" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.20", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.20", + "@vue/runtime-core": "3.5.20", + "@vue/shared": "3.5.20", + "csstype": "^3.1.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.20", + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.20", + "@vue/shared": "3.5.20" + }, + "peerDependencies": { + "vue": "3.5.20" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.20", + "license": "MIT" + }, + "node_modules/@vue/tsconfig": { + "version": "0.7.0", + "dev": true, + "license": "MIT", + "peerDependencies": { + "typescript": "5.x", + "vue": "^3.4.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "vue": { + "optional": true + } + } + }, + "node_modules/@vuetify/loader-shared": { + "version": "2.1.1", + "devOptional": true, + "license": "MIT", + "dependencies": { + "upath": "^2.0.1" + }, + "peerDependencies": { + "vue": "^3.0.0", + "vuetify": "^3.0.0" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/alien-signals": { + "version": "2.0.7", + "dev": true, + "license": "MIT" + }, + "node_modules/ansi-styles": { + "version": "6.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/aria-query": { + "version": "5.3.2", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ast-kit": { + "version": "2.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.0", + "pathe": "^2.0.3" + }, + "engines": { + "node": ">=20.18.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/ast-walker-scope": { + "version": "0.8.2", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.3", + "ast-kit": "^2.1.2" + }, + "engines": { + "node": ">=20.18.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/babylonjs": { + "version": "8.25.0", + "hasInstallScript": true, + "license": "Apache-2.0" + }, + "node_modules/babylonjs-gltf2interface": { + "version": "8.25.0", + "license": "Apache-2.0", + "peer": true + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/birpc": { + "version": "2.5.0", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.25.4", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001737", + "electron-to-chromium": "^1.5.211", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-builder": { + "version": "0.2.0", + "devOptional": true, + "license": "MIT/X11" + }, + "node_modules/builtin-modules": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001739", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chalk/node_modules/ansi-styles": { + "version": "4.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/change-case": { + "version": "5.4.4", + "dev": true, + "license": "MIT" + }, + "node_modules/chokidar": { + "version": "3.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/ci-info": { + "version": "4.3.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/citty": { + "version": "0.1.6", + "dev": true, + "license": "MIT", + "dependencies": { + "consola": "^3.2.3" + } + }, + "node_modules/clean-regexp": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/clean-regexp/node_modules/escape-string-regexp": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/colorjs.io": { + "version": "0.5.2", + "devOptional": true, + "license": "MIT" + }, + "node_modules/comment-parser": { + "version": "1.4.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/confbox": { + "version": "0.2.2", + "dev": true, + "license": "MIT" + }, + "node_modules/consola": { + "version": "3.4.2", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.18.0 || >=16.10.0" + } + }, + "node_modules/copy-anything": { + "version": "3.0.5", + "license": "MIT", + "dependencies": { + "is-what": "^4.1.8" + }, + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/core-js-compat": { + "version": "3.45.1", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.25.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cross-spawn/node_modules/which": { + "version": "2.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cross-spawn/node_modules/which/node_modules/isexe": { + "version": "2.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/cssesc": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "license": "MIT" + }, + "node_modules/de-indent": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.1", + "devOptional": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.211", + "dev": true, + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "10.5.0", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/entities": { + "version": "4.5.0", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/esbuild": { + "version": "0.25.9", + "devOptional": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.9", + "@esbuild/android-arm": "0.25.9", + "@esbuild/android-arm64": "0.25.9", + "@esbuild/android-x64": "0.25.9", + "@esbuild/darwin-arm64": "0.25.9", + "@esbuild/darwin-x64": "0.25.9", + "@esbuild/freebsd-arm64": "0.25.9", + "@esbuild/freebsd-x64": "0.25.9", + "@esbuild/linux-arm": "0.25.9", + "@esbuild/linux-arm64": "0.25.9", + "@esbuild/linux-ia32": "0.25.9", + "@esbuild/linux-loong64": "0.25.9", + "@esbuild/linux-mips64el": "0.25.9", + "@esbuild/linux-ppc64": "0.25.9", + "@esbuild/linux-riscv64": "0.25.9", + "@esbuild/linux-s390x": "0.25.9", + "@esbuild/linux-x64": "0.25.9", + "@esbuild/netbsd-arm64": "0.25.9", + "@esbuild/netbsd-x64": "0.25.9", + "@esbuild/openbsd-arm64": "0.25.9", + "@esbuild/openbsd-x64": "0.25.9", + "@esbuild/openharmony-arm64": "0.25.9", + "@esbuild/sunos-x64": "0.25.9", + "@esbuild/win32-arm64": "0.25.9", + "@esbuild/win32-ia32": "0.25.9", + "@esbuild/win32-x64": "0.25.9" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.34.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.0", + "@eslint/config-helpers": "^0.3.1", + "@eslint/core": "^0.15.2", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.34.0", + "@eslint/plugin-kit": "^0.3.5", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-compat-utils": { + "version": "0.6.5", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, + "node_modules/eslint-config-flat-gitignore": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint/compat": "^1.2.5" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "eslint": "^9.5.0" + } + }, + "node_modules/eslint-config-vuetify": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@clack/prompts": "^0.11.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "^9.28.0", + "@stylistic/eslint-plugin": "^4.4.0", + "@typescript-eslint/parser": "^8.33.0", + "eslint-config-flat-gitignore": "^2.1.0", + "eslint-flat-config-utils": "^2.1.0", + "eslint-plugin-antfu": "^3.1.1", + "eslint-plugin-import-x": "^4.15.0", + "eslint-plugin-jsonc": "^2.20.1", + "eslint-plugin-perfectionist": "^4.13.0", + "eslint-plugin-pnpm": "^0.3.1", + "eslint-plugin-regexp": "^2.7.0", + "eslint-plugin-unicorn": "^60.0.0", + "eslint-plugin-vue": "^10.1.0", + "eslint-typegen": "^2.2.0", + "exsolve": "^1.0.5", + "globals": "^16.2.0", + "jsonc-eslint-parser": "^2.4.0", + "kolorist": "^1.8.0", + "local-pkg": "^1.1.1", + "nypm": "^0.6.0", + "package-manager-detector": "^1.3.0", + "tinyexec": "^1.0.1", + "typescript-eslint": "^8.33.0", + "vue-eslint-parser": "^10.1.3", + "yaml-eslint-parser": "^1.3.0" + }, + "bin": { + "eslint-config-vuetify": "bin/cli.mjs" + }, + "peerDependencies": { + "@vitest/eslint-plugin": "^1.1.42", + "eslint": "^9.5.0", + "eslint-plugin-jest": "^28.0.0", + "eslint-plugin-no-only-tests": "^3.3.0", + "eslint-plugin-vuejs-accessibility": "^2.0.0" + } + }, + "node_modules/eslint-flat-config-utils": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/eslint-import-context": { + "version": "0.1.9", + "dev": true, + "license": "MIT", + "dependencies": { + "get-tsconfig": "^4.10.1", + "stable-hash-x": "^0.2.0" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-import-context" + }, + "peerDependencies": { + "unrs-resolver": "^1.0.0" + }, + "peerDependenciesMeta": { + "unrs-resolver": { + "optional": true + } + } + }, + "node_modules/eslint-json-compat-utils": { + "version": "0.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "esquery": "^1.6.0" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "eslint": "*", + "jsonc-eslint-parser": "^2.4.0" + }, + "peerDependenciesMeta": { + "@eslint/json": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-antfu": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "eslint": "*" + } + }, + "node_modules/eslint-plugin-import-x": { + "version": "4.16.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "^8.35.0", + "comment-parser": "^1.4.1", + "debug": "^4.4.1", + "eslint-import-context": "^0.1.9", + "is-glob": "^4.0.3", + "minimatch": "^9.0.3 || ^10.0.1", + "semver": "^7.7.2", + "stable-hash-x": "^0.2.0", + "unrs-resolver": "^1.9.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-plugin-import-x" + }, + "peerDependencies": { + "@typescript-eslint/utils": "^8.0.0", + "eslint": "^8.57.0 || ^9.0.0", + "eslint-import-resolver-node": "*" + }, + "peerDependenciesMeta": { + "@typescript-eslint/utils": { + "optional": true + }, + "eslint-import-resolver-node": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-import-x/node_modules/minimatch": { + "version": "9.0.5", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/eslint-plugin-import-x/node_modules/minimatch/node_modules/brace-expansion": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/eslint-plugin-jest": { + "version": "28.14.0", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@typescript-eslint/utils": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "engines": { + "node": "^16.10.0 || ^18.12.0 || >=20.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^6.0.0 || ^7.0.0 || ^8.0.0", + "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0", + "jest": "*" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + }, + "jest": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-jsonc": { + "version": "2.20.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.5.1", + "eslint-compat-utils": "^0.6.4", + "eslint-json-compat-utils": "^0.2.1", + "espree": "^9.6.1 || ^10.3.0", + "graphemer": "^1.4.0", + "jsonc-eslint-parser": "^2.4.0", + "natural-compare": "^1.4.0", + "synckit": "^0.6.2 || ^0.7.3 || ^0.11.5" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, + "node_modules/eslint-plugin-no-only-tests": { + "version": "3.3.0", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=5.0.0" + } + }, + "node_modules/eslint-plugin-perfectionist": { + "version": "4.15.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "^8.34.1", + "@typescript-eslint/utils": "^8.34.1", + "natural-orderby": "^5.0.0" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "eslint": ">=8.45.0" + } + }, + "node_modules/eslint-plugin-pnpm": { + "version": "0.3.1", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ], + "license": "MIT", + "dependencies": { + "find-up-simple": "^1.0.1", + "jsonc-eslint-parser": "^2.4.0", + "pathe": "^2.0.3", + "pnpm-workspace-yaml": "0.3.1", + "tinyglobby": "^0.2.12", + "yaml-eslint-parser": "^1.3.0" + }, + "peerDependencies": { + "eslint": "^9.0.0" + } + }, + "node_modules/eslint-plugin-regexp": { + "version": "2.10.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.11.0", + "comment-parser": "^1.4.0", + "jsdoc-type-pratt-parser": "^4.0.0", + "refa": "^0.12.1", + "regexp-ast-analysis": "^0.7.1", + "scslre": "^0.3.0" + }, + "engines": { + "node": "^18 || >=20" + }, + "peerDependencies": { + "eslint": ">=8.44.0" + } + }, + "node_modules/eslint-plugin-unicorn": { + "version": "60.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "@eslint-community/eslint-utils": "^4.7.0", + "@eslint/plugin-kit": "^0.3.3", + "change-case": "^5.4.4", + "ci-info": "^4.3.0", + "clean-regexp": "^1.0.0", + "core-js-compat": "^3.44.0", + "esquery": "^1.6.0", + "find-up-simple": "^1.0.1", + "globals": "^16.3.0", + "indent-string": "^5.0.0", + "is-builtin-module": "^5.0.0", + "jsesc": "^3.1.0", + "pluralize": "^8.0.0", + "regexp-tree": "^0.1.27", + "regjsparser": "^0.12.0", + "semver": "^7.7.2", + "strip-indent": "^4.0.0" + }, + "engines": { + "node": "^20.10.0 || >=21.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/eslint-plugin-unicorn?sponsor=1" + }, + "peerDependencies": { + "eslint": ">=9.29.0" + } + }, + "node_modules/eslint-plugin-vue": { + "version": "10.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "natural-compare": "^1.4.0", + "nth-check": "^2.1.1", + "postcss-selector-parser": "^6.0.15", + "semver": "^7.6.3", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^7.0.0 || ^8.0.0", + "eslint": "^8.57.0 || ^9.0.0", + "vue-eslint-parser": "^10.0.0" + }, + "peerDependenciesMeta": { + "@typescript-eslint/parser": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-vuejs-accessibility": { + "version": "2.4.1", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "aria-query": "^5.3.0", + "emoji-regex": "^10.0.0", + "vue-eslint-parser": "^9.0.1" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "eslint": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-vuejs-accessibility/node_modules/vue-eslint-parser": { + "version": "9.4.3", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "debug": "^4.3.4", + "eslint-scope": "^7.1.1", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.1", + "esquery": "^1.4.0", + "lodash": "^4.17.21", + "semver": "^7.3.6" + }, + "engines": { + "node": "^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, + "node_modules/eslint-plugin-vuejs-accessibility/node_modules/vue-eslint-parser/node_modules/eslint-scope": { + "version": "7.2.2", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-vuejs-accessibility/node_modules/vue-eslint-parser/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "dev": true, + "license": "Apache-2.0", + "peer": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-vuejs-accessibility/node_modules/vue-eslint-parser/node_modules/espree": { + "version": "9.6.1", + "dev": true, + "license": "BSD-2-Clause", + "peer": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-typegen": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "json-schema-to-typescript-lite": "^15.0.0", + "ohash": "^2.0.11" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "eslint": "^9.0.0" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "10.4.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "license": "MIT" + }, + "node_modules/esutils": { + "version": "2.0.3", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/exsolve": { + "version": "1.0.7", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.19.1", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-up-simple": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "dev": true, + "license": "ISC" + }, + "node_modules/framesync": { + "version": "6.1.2", + "license": "MIT", + "dependencies": { + "tslib": "2.4.0" + } + }, + "node_modules/get-tsconfig": { + "version": "4.10.1", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "16.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graphemer": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/he": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/hey-listen": { + "version": "1.0.8", + "license": "MIT" + }, + "node_modules/hookable": { + "version": "5.5.3", + "license": "MIT" + }, + "node_modules/ignore": { + "version": "5.3.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/immutable": { + "version": "5.1.3", + "devOptional": true, + "license": "MIT" + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-builtin-module": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "builtin-modules": "^5.0.0" + }, + "engines": { + "node": ">=18.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-what": { + "version": "4.1.16", + "license": "MIT", + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/isexe": { + "version": "3.1.1", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16" + } + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsdoc-type-pratt-parser": { + "version": "4.8.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/json-schema-to-typescript-lite": { + "version": "15.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@apidevtools/json-schema-ref-parser": "^14.1.1", + "@types/json-schema": "^7.0.15" + } + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-eslint-parser": { + "version": "2.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.5.0", + "eslint-visitor-keys": "^3.0.0", + "espree": "^9.0.0", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + } + }, + "node_modules/jsonc-eslint-parser/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/jsonc-eslint-parser/node_modules/espree": { + "version": "9.6.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kolorist": { + "version": "1.8.0", + "dev": true, + "license": "MIT" + }, + "node_modules/levn": { + "version": "0.4.1", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/local-pkg": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "mlly": "^1.7.4", + "pkg-types": "^2.3.0", + "quansync": "^0.2.11" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "dev": true, + "license": "MIT" + }, + "node_modules/magic-string": { + "version": "0.30.18", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/magic-string-ast": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "magic-string": "^0.30.17" + }, + "engines": { + "node": ">=20.18.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/memorystream": { + "version": "0.3.1", + "dev": true, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mitt": { + "version": "3.0.1", + "license": "MIT" + }, + "node_modules/mlly": { + "version": "1.8.0", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.15.0", + "pathe": "^2.0.3", + "pkg-types": "^1.3.1", + "ufo": "^1.6.1" + } + }, + "node_modules/mlly/node_modules/pkg-types": { + "version": "1.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" + } + }, + "node_modules/mlly/node_modules/pkg-types/node_modules/confbox": { + "version": "0.1.8", + "dev": true, + "license": "MIT" + }, + "node_modules/ms": { + "version": "2.1.3", + "devOptional": true, + "license": "MIT" + }, + "node_modules/muggle-string": { + "version": "0.4.1", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/napi-postinstall": { + "version": "0.3.3", + "dev": true, + "license": "MIT", + "bin": { + "napi-postinstall": "lib/cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/napi-postinstall" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/natural-orderby": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/node-releases": { + "version": "2.0.19", + "dev": true, + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-normalize-package-bin": { + "version": "4.0.0", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm-run-all2": { + "version": "7.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "cross-spawn": "^7.0.6", + "memorystream": "^0.3.1", + "minimatch": "^9.0.0", + "pidtree": "^0.6.0", + "read-package-json-fast": "^4.0.0", + "shell-quote": "^1.7.3", + "which": "^5.0.0" + }, + "bin": { + "npm-run-all": "bin/npm-run-all/index.js", + "npm-run-all2": "bin/npm-run-all/index.js", + "run-p": "bin/run-p/index.js", + "run-s": "bin/run-s/index.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0", + "npm": ">= 9" + } + }, + "node_modules/npm-run-all2/node_modules/minimatch": { + "version": "9.0.5", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm-run-all2/node_modules/minimatch/node_modules/brace-expansion": { + "version": "2.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/nypm": { + "version": "0.6.1", + "dev": true, + "license": "MIT", + "dependencies": { + "citty": "^0.1.6", + "consola": "^3.4.2", + "pathe": "^2.0.3", + "pkg-types": "^2.2.0", + "tinyexec": "^1.0.1" + }, + "bin": { + "nypm": "dist/cli.mjs" + }, + "engines": { + "node": "^14.16.0 || >=16.10.0" + } + }, + "node_modules/ohash": { + "version": "2.0.11", + "dev": true, + "license": "MIT" + }, + "node_modules/optionator": { + "version": "0.9.4", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-manager-detector": { + "version": "1.3.0", + "dev": true, + "license": "MIT" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/path-exists": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pathe": { + "version": "2.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/perfect-debounce": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pidtree": { + "version": "0.6.0", + "dev": true, + "license": "MIT", + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/pinia": { + "version": "3.0.3", + "license": "MIT", + "dependencies": { + "@vue/devtools-api": "^7.7.2" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "typescript": ">=4.4.4", + "vue": "^2.7.0 || ^3.5.11" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/pinia/node_modules/@vue/devtools-api": { + "version": "7.7.7", + "license": "MIT", + "dependencies": { + "@vue/devtools-kit": "^7.7.7" + } + }, + "node_modules/pkg-types": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "confbox": "^0.2.2", + "exsolve": "^1.0.7", + "pathe": "^2.0.3" + } + }, + "node_modules/pluralize": { + "version": "8.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/pnpm-workspace-yaml": { + "version": "0.3.1", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ], + "license": "MIT", + "dependencies": { + "yaml": "^2.7.0" + } + }, + "node_modules/popmotion": { + "version": "11.0.5", + "license": "MIT", + "dependencies": { + "framesync": "6.1.2", + "hey-listen": "^1.0.8", + "style-value-types": "5.1.2", + "tslib": "2.4.0" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/quansync": { + "version": "0.2.11", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ], + "license": "MIT" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/read-package-json-fast": { + "version": "4.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "json-parse-even-better-errors": "^4.0.0", + "npm-normalize-package-bin": "^4.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/readdirp/node_modules/picomatch": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/refa": { + "version": "0.12.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.8.0" + }, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/regexp-ast-analysis": { + "version": "0.7.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.8.0", + "refa": "^0.12.1" + }, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/regexp-tree": { + "version": "0.1.27", + "dev": true, + "license": "MIT", + "bin": { + "regexp-tree": "bin/regexp-tree" + } + }, + "node_modules/regjsparser": { + "version": "0.12.0", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~3.0.2" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "3.0.2", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "license": "MIT" + }, + "node_modules/rollup": { + "version": "4.50.0", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.50.0", + "@rollup/rollup-android-arm64": "4.50.0", + "@rollup/rollup-darwin-arm64": "4.50.0", + "@rollup/rollup-darwin-x64": "4.50.0", + "@rollup/rollup-freebsd-arm64": "4.50.0", + "@rollup/rollup-freebsd-x64": "4.50.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.50.0", + "@rollup/rollup-linux-arm-musleabihf": "4.50.0", + "@rollup/rollup-linux-arm64-gnu": "4.50.0", + "@rollup/rollup-linux-arm64-musl": "4.50.0", + "@rollup/rollup-linux-loongarch64-gnu": "4.50.0", + "@rollup/rollup-linux-ppc64-gnu": "4.50.0", + "@rollup/rollup-linux-riscv64-gnu": "4.50.0", + "@rollup/rollup-linux-riscv64-musl": "4.50.0", + "@rollup/rollup-linux-s390x-gnu": "4.50.0", + "@rollup/rollup-linux-x64-gnu": "4.50.0", + "@rollup/rollup-linux-x64-musl": "4.50.0", + "@rollup/rollup-openharmony-arm64": "4.50.0", + "@rollup/rollup-win32-arm64-msvc": "4.50.0", + "@rollup/rollup-win32-ia32-msvc": "4.50.0", + "@rollup/rollup-win32-x64-msvc": "4.50.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/rxjs": { + "version": "7.8.2", + "devOptional": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/rxjs/node_modules/tslib": { + "version": "2.8.1", + "devOptional": true, + "license": "0BSD" + }, + "node_modules/sass-embedded": { + "version": "1.91.0", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@bufbuild/protobuf": "^2.5.0", + "buffer-builder": "^0.2.0", + "colorjs.io": "^0.5.0", + "immutable": "^5.0.2", + "rxjs": "^7.4.0", + "supports-color": "^8.1.1", + "sync-child-process": "^1.0.2", + "varint": "^6.0.0" + }, + "bin": { + "sass": "dist/bin/sass.js" + }, + "engines": { + "node": ">=16.0.0" + }, + "optionalDependencies": { + "sass-embedded-all-unknown": "1.91.0", + "sass-embedded-android-arm": "1.91.0", + "sass-embedded-android-arm64": "1.91.0", + "sass-embedded-android-riscv64": "1.91.0", + "sass-embedded-android-x64": "1.91.0", + "sass-embedded-darwin-arm64": "1.91.0", + "sass-embedded-darwin-x64": "1.91.0", + "sass-embedded-linux-arm": "1.91.0", + "sass-embedded-linux-arm64": "1.91.0", + "sass-embedded-linux-musl-arm": "1.91.0", + "sass-embedded-linux-musl-arm64": "1.91.0", + "sass-embedded-linux-musl-riscv64": "1.91.0", + "sass-embedded-linux-musl-x64": "1.91.0", + "sass-embedded-linux-riscv64": "1.91.0", + "sass-embedded-linux-x64": "1.91.0", + "sass-embedded-unknown-all": "1.91.0", + "sass-embedded-win32-arm64": "1.91.0", + "sass-embedded-win32-x64": "1.91.0" + } + }, + "node_modules/sass-embedded-win32-x64": { + "version": "1.91.0", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/scslre": { + "version": "0.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.8.0", + "refa": "^0.12.0", + "regexp-ast-analysis": "^0.7.0" + }, + "engines": { + "node": "^14.0.0 || >=16.0.0" + } + }, + "node_modules/scule": { + "version": "1.3.0", + "dev": true, + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.7.2", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "dev": true, + "license": "MIT" + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/speakingurl": { + "version": "14.0.1", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stable-hash-x": { + "version": "0.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/strip-indent": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "min-indent": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/style-value-types": { + "version": "5.1.2", + "license": "MIT", + "dependencies": { + "hey-listen": "^1.0.8", + "tslib": "2.4.0" + } + }, + "node_modules/superjson": { + "version": "2.2.2", + "license": "MIT", + "dependencies": { + "copy-anything": "^3.0.2" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "devOptional": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/sync-child-process": { + "version": "1.0.2", + "devOptional": true, + "license": "MIT", + "dependencies": { + "sync-message-port": "^1.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/sync-message-port": { + "version": "1.1.3", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/synckit": { + "version": "0.11.11", + "dev": true, + "license": "MIT", + "dependencies": { + "@pkgr/core": "^0.2.9" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/synckit" + } + }, + "node_modules/tinyexec": { + "version": "1.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.14", + "devOptional": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.4.4", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-api-utils": { + "version": "2.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/tslib": { + "version": "2.4.0", + "license": "0BSD" + }, + "node_modules/type-check": { + "version": "0.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typescript": { + "version": "5.8.3", + "devOptional": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.41.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.41.0", + "@typescript-eslint/parser": "8.41.0", + "@typescript-eslint/typescript-estree": "8.41.0", + "@typescript-eslint/utils": "8.41.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/ufo": { + "version": "1.6.1", + "dev": true, + "license": "MIT" + }, + "node_modules/undici-types": { + "version": "6.21.0", + "devOptional": true, + "license": "MIT" + }, + "node_modules/unplugin": { + "version": "2.3.5", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.14.1", + "picomatch": "^4.0.2", + "webpack-virtual-modules": "^0.6.2" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/unplugin-fonts": { + "version": "1.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-glob": "^3.3.3", + "unplugin": "2.3.5" + }, + "peerDependencies": { + "@nuxt/kit": "^3.0.0 || ^4.0.0", + "vite": "^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + }, + "peerDependenciesMeta": { + "@nuxt/kit": { + "optional": true + } + } + }, + "node_modules/unplugin-utils": { + "version": "0.2.5", + "dev": true, + "license": "MIT", + "dependencies": { + "pathe": "^2.0.3", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=18.12.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, + "node_modules/unplugin-vue-components": { + "version": "28.8.0", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^3.6.0", + "debug": "^4.4.1", + "local-pkg": "^1.1.1", + "magic-string": "^0.30.17", + "mlly": "^1.7.4", + "tinyglobby": "^0.2.14", + "unplugin": "^2.3.5", + "unplugin-utils": "^0.2.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@babel/parser": "^7.15.8", + "@nuxt/kit": "^3.2.2 || ^4.0.0", + "vue": "2 || 3" + }, + "peerDependenciesMeta": { + "@babel/parser": { + "optional": true + }, + "@nuxt/kit": { + "optional": true + } + } + }, + "node_modules/unplugin-vue-router": { + "version": "0.14.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue-macros/common": "3.0.0-beta.15", + "ast-walker-scope": "^0.8.1", + "chokidar": "^4.0.3", + "fast-glob": "^3.3.3", + "json5": "^2.2.3", + "local-pkg": "^1.1.1", + "magic-string": "^0.30.17", + "mlly": "^1.7.4", + "pathe": "^2.0.3", + "picomatch": "^4.0.2", + "scule": "^1.3.0", + "unplugin": "^2.3.5", + "unplugin-utils": "^0.2.4", + "yaml": "^2.8.0" + }, + "peerDependencies": { + "@vue/compiler-sfc": "^3.5.17", + "vue-router": "^4.5.1" + }, + "peerDependenciesMeta": { + "vue-router": { + "optional": true + } + } + }, + "node_modules/unplugin-vue-router/node_modules/chokidar": { + "version": "4.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/unplugin-vue-router/node_modules/chokidar/node_modules/readdirp": { + "version": "4.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/unrs-resolver": { + "version": "1.11.1", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "napi-postinstall": "^0.3.0" + }, + "funding": { + "url": "https://opencollective.com/unrs-resolver" + }, + "optionalDependencies": { + "@unrs/resolver-binding-android-arm-eabi": "1.11.1", + "@unrs/resolver-binding-android-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-x64": "1.11.1", + "@unrs/resolver-binding-freebsd-x64": "1.11.1", + "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-arm64-musl": "1.11.1", + "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1", + "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-musl": "1.11.1", + "@unrs/resolver-binding-wasm32-wasi": "1.11.1", + "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1", + "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1", + "@unrs/resolver-binding-win32-x64-msvc": "1.11.1" + } + }, + "node_modules/upath": { + "version": "2.0.1", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=4", + "yarn": "*" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.3", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/uuid": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-13.0.0.tgz", + "integrity": "sha512-XQegIaBTVUjSHliKqcnFqYypAd4S+WCYt5NIeRs6w/UAry7z8Y9j5ZwRRL4kzq9U3sD6v+85er9FvkEaBpji2w==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist-node/bin/uuid" + } + }, + "node_modules/varint": { + "version": "6.0.0", + "devOptional": true, + "license": "MIT" + }, + "node_modules/vite": { + "version": "6.3.5", + "devOptional": 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 + } + } + }, + "node_modules/vite-plugin-vuetify": { + "version": "2.1.2", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@vuetify/loader-shared": "^2.1.1", + "debug": "^4.3.3", + "upath": "^2.0.1" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "vite": ">=5", + "vue": "^3.0.0", + "vuetify": "^3.0.0" + } + }, + "node_modules/vscode-uri": { + "version": "3.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/vue": { + "version": "3.5.20", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.20", + "@vue/compiler-sfc": "3.5.20", + "@vue/runtime-dom": "3.5.20", + "@vue/server-renderer": "3.5.20", + "@vue/shared": "3.5.20" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vue-eslint-parser": { + "version": "10.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.4.0", + "eslint-scope": "^8.2.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", + "esquery": "^1.6.0", + "semver": "^7.6.3" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + } + }, + "node_modules/vue-router": { + "version": "4.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/devtools-api": "^6.6.4" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "vue": "^3.2.0" + } + }, + "node_modules/vue-tsc": { + "version": "3.0.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/typescript": "2.4.23", + "@vue/language-core": "3.0.6" + }, + "bin": { + "vue-tsc": "bin/vue-tsc.js" + }, + "peerDependencies": { + "typescript": ">=5.0.0" + } + }, + "node_modules/vuetify": { + "version": "3.9.6", + "license": "MIT", + "engines": { + "node": "^12.20 || >=14.13" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/johnleider" + }, + "peerDependencies": { + "typescript": ">=4.7", + "vite-plugin-vuetify": ">=2.1.0", + "vue": "^3.5.0", + "webpack-plugin-vuetify": ">=3.1.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "vite-plugin-vuetify": { + "optional": true + }, + "webpack-plugin-vuetify": { + "optional": true + } + } + }, + "node_modules/webpack-virtual-modules": { + "version": "0.6.2", + "dev": true, + "license": "MIT" + }, + "node_modules/which": { + "version": "5.0.0", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/xml-name-validator": { + "version": "4.0.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12" + } + }, + "node_modules/yaml": { + "version": "2.8.1", + "devOptional": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + } + }, + "node_modules/yaml-eslint-parser": { + "version": "1.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.0.0", + "yaml": "^2.0.0" + }, + "engines": { + "node": "^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + } + }, + "node_modules/yaml-eslint-parser/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..d6d0112 --- /dev/null +++ b/package.json @@ -0,0 +1,44 @@ +{ + "name": "client", + "private": true, + "type": "module", + "version": "0.0.0", + "scripts": { + "dev": "vite", + "build": "run-p type-check \"build-only {@}\" --", + "preview": "vite preview", + "build-only": "vite build", + "type-check": "vue-tsc --build --force", + "lint": "eslint . --fix" + }, + "dependencies": { + "@babylonjs/core": "^8.25.0", + "@babylonjs/loaders": "^8.25.0", + "@fontsource/roboto": "5.2.6", + "@mdi/font": "7.4.47", + "@types/babylonjs": "^2.4.5", + "pinia": "^3.0.3", + "popmotion": "^11.0.5", + "uuid": "^13.0.0", + "vue": "^3.5.17", + "vuetify": "^3.9.1" + }, + "devDependencies": { + "@tsconfig/node22": "^22.0.0", + "@types/node": "^22.9.0", + "@vitejs/plugin-vue": "^5.2.3", + "@vue/tsconfig": "^0.7.0", + "eslint": "^9.30.1", + "eslint-config-vuetify": "^4.0.0", + "npm-run-all2": "^7.0.2", + "sass-embedded": "^1.89.2", + "typescript": "~5.8.3", + "unplugin-fonts": "^1.3.1", + "unplugin-vue-components": "^28.8.0", + "unplugin-vue-router": "^0.14.0", + "vite": "^6.3.5", + "vite-plugin-vuetify": "^2.1.1", + "vue-router": "^4.5.1", + "vue-tsc": "^3.0.1" + } +} diff --git a/public/bblcdn/babylon.ktx2Decoder.js b/public/bblcdn/babylon.ktx2Decoder.js new file mode 100644 index 0000000..bdf3457 --- /dev/null +++ b/public/bblcdn/babylon.ktx2Decoder.js @@ -0,0 +1,2 @@ +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define("babylonjs-ktx2decoder",[],t):"object"==typeof exports?exports["babylonjs-ktx2decoder"]=t():e.KTX2DECODER=t()}("undefined"!=typeof self?self:"undefined"!=typeof global?global:this,(()=>(()=>{"use strict";var e={d:(t,r)=>{for(var a in r)e.o(r,a)&&!e.o(t,a)&&Object.defineProperty(t,a,{enumerable:!0,get:r[a]})}};e.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),e.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),e.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var t={};e.d(t,{default:()=>G});var r,a,s,n,o={};e.r(o),e.d(o,{DataReader:()=>i,KTX2Decoder:()=>w,KTX2FileReader:()=>d,LiteTranscoder:()=>m,LiteTranscoder_UASTC_ASTC:()=>h,LiteTranscoder_UASTC_BC7:()=>u,LiteTranscoder_UASTC_R8_UNORM:()=>T,LiteTranscoder_UASTC_RG8_UNORM:()=>p,LiteTranscoder_UASTC_RGBA_SRGB:()=>y,LiteTranscoder_UASTC_RGBA_UNORM:()=>f,MSCTranscoder:()=>B,SupercompressionScheme:()=>n,Transcoder:()=>_,TranscoderManager:()=>l,WASMMemoryManager:()=>c,ZSTDDecoder:()=>M}),function(e){e[e.ETC1S=0]="ETC1S",e[e.UASTC4x4=1]="UASTC4x4"}(r||(r={})),function(e){e[e.ASTC_4X4_RGBA=0]="ASTC_4X4_RGBA",e[e.BC7_RGBA=1]="BC7_RGBA",e[e.BC3_RGBA=2]="BC3_RGBA",e[e.BC1_RGB=3]="BC1_RGB",e[e.PVRTC1_4_RGBA=4]="PVRTC1_4_RGBA",e[e.PVRTC1_4_RGB=5]="PVRTC1_4_RGB",e[e.ETC2_RGBA=6]="ETC2_RGBA",e[e.ETC1_RGB=7]="ETC1_RGB",e[e.RGBA32=8]="RGBA32",e[e.R8=9]="R8",e[e.RG8=10]="RG8"}(a||(a={})),function(e){e[e.COMPRESSED_RGBA_BPTC_UNORM_EXT=36492]="COMPRESSED_RGBA_BPTC_UNORM_EXT",e[e.COMPRESSED_RGBA_ASTC_4X4_KHR=37808]="COMPRESSED_RGBA_ASTC_4X4_KHR",e[e.COMPRESSED_RGB_S3TC_DXT1_EXT=33776]="COMPRESSED_RGB_S3TC_DXT1_EXT",e[e.COMPRESSED_RGBA_S3TC_DXT5_EXT=33779]="COMPRESSED_RGBA_S3TC_DXT5_EXT",e[e.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG=35842]="COMPRESSED_RGBA_PVRTC_4BPPV1_IMG",e[e.COMPRESSED_RGB_PVRTC_4BPPV1_IMG=35840]="COMPRESSED_RGB_PVRTC_4BPPV1_IMG",e[e.COMPRESSED_RGBA8_ETC2_EAC=37496]="COMPRESSED_RGBA8_ETC2_EAC",e[e.COMPRESSED_RGB8_ETC2=37492]="COMPRESSED_RGB8_ETC2",e[e.COMPRESSED_RGB_ETC1_WEBGL=36196]="COMPRESSED_RGB_ETC1_WEBGL",e[e.RGBA8Format=32856]="RGBA8Format",e[e.R8Format=33321]="R8Format",e[e.RG8Format=33323]="RG8Format"}(s||(s={}));class i{get byteOffset(){return this._dataByteOffset}constructor(e,t,r){e.buffer?this._dataView=new DataView(e.buffer,e.byteOffset+(t??0),r??e.byteLength):this._dataView=new DataView(e,t??0,r??e.byteLength),this._dataByteOffset=0}readUint8(){const e=this._dataView.getUint8(this._dataByteOffset);return this._dataByteOffset+=1,e}readInt8(){const e=this._dataView.getInt8(this._dataByteOffset);return this._dataByteOffset+=1,e}readUint16(){const e=this._dataView.getUint16(this._dataByteOffset,!0);return this._dataByteOffset+=2,e}readInt16(){const e=this._dataView.getInt16(this._dataByteOffset,!0);return this._dataByteOffset+=2,e}readUint32(){const e=this._dataView.getUint32(this._dataByteOffset,!0);return this._dataByteOffset+=4,e}readInt32(){const e=this._dataView.getInt32(this._dataByteOffset,!0);return this._dataByteOffset+=4,e}readUint64(){const e=this._dataView.getUint32(this._dataByteOffset,!0)+2**32*this._dataView.getUint32(this._dataByteOffset+4,!0);return this._dataByteOffset+=8,e}readUint8Array(e){const t=new Uint8Array(this._dataView.buffer,this._dataView.byteOffset+this._dataByteOffset,e);return this._dataByteOffset+=e,t}skipBytes(e){return this._dataByteOffset+=e,this}}!function(e){e[e.None=0]="None",e[e.BasisLZ=1]="BasisLZ",e[e.ZStandard=2]="ZStandard",e[e.ZLib=3]="ZLib"}(n||(n={}));class d{constructor(e){this._data=e}get data(){return this._data}get header(){return this._header}get levels(){return this._levels}get dfdBlock(){return this._dfdBlock}get supercompressionGlobalData(){return this._supercompressionGlobalData}isValid(){return d.IsValid(this._data)}parse(){let e=12;const t=new i(this._data,e,68),r=this._header={vkFormat:t.readUint32(),typeSize:t.readUint32(),pixelWidth:t.readUint32(),pixelHeight:t.readUint32(),pixelDepth:t.readUint32(),layerCount:t.readUint32(),faceCount:t.readUint32(),levelCount:t.readUint32(),supercompressionScheme:t.readUint32(),dfdByteOffset:t.readUint32(),dfdByteLength:t.readUint32(),kvdByteOffset:t.readUint32(),kvdByteLength:t.readUint32(),sgdByteOffset:t.readUint64(),sgdByteLength:t.readUint64()};if(r.pixelDepth>0)throw new Error("Failed to parse KTX2 file - Only 2D textures are currently supported.");if(r.layerCount>1)throw new Error("Failed to parse KTX2 file - Array textures are not currently supported.");if(r.faceCount>1)throw new Error("Failed to parse KTX2 file - Cube textures are not currently supported.");e+=t.byteOffset;let a=Math.max(1,r.levelCount);const s=new i(this._data,e,3*a*8),n=this._levels=[];for(;a--;)n.push({byteOffset:s.readUint64(),byteLength:s.readUint64(),uncompressedByteLength:s.readUint64()});e+=s.byteOffset;const o=new i(this._data,r.dfdByteOffset,r.dfdByteLength),d=this._dfdBlock={vendorId:o.skipBytes(4).readUint16(),descriptorType:o.readUint16(),versionNumber:o.readUint16(),descriptorBlockSize:o.readUint16(),colorModel:o.readUint8(),colorPrimaries:o.readUint8(),transferFunction:o.readUint8(),flags:o.readUint8(),texelBlockDimension:{x:o.readUint8()+1,y:o.readUint8()+1,z:o.readUint8()+1,w:o.readUint8()+1},bytesPlane:[o.readUint8(),o.readUint8(),o.readUint8(),o.readUint8(),o.readUint8(),o.readUint8(),o.readUint8(),o.readUint8()],numSamples:0,samples:new Array};d.numSamples=(d.descriptorBlockSize-24)/16;for(let e=0;e>4,e.channelType=15&e.channelType,d.samples.push(e)}const c=this._supercompressionGlobalData={};if(r.sgdByteLength>0){const e=new i(this._data,r.sgdByteOffset,r.sgdByteLength);c.endpointCount=e.readUint16(),c.selectorCount=e.readUint16(),c.endpointsByteLength=e.readUint32(),c.selectorsByteLength=e.readUint32(),c.tablesByteLength=e.readUint32(),c.extendedByteLength=e.readUint32(),c.imageDescs=[];const t=this._getImageCount();for(let r=0;r>t,1);return Math.max(this._header.layerCount,1)*this._header.faceCount*e}get textureFormat(){return 166===this._dfdBlock.colorModel?r.UASTC4x4:r.ETC1S}get hasAlpha(){switch(this.textureFormat){case r.ETC1S:return 2===this._dfdBlock.numSamples&&(15===this._dfdBlock.samples[0].channelType||15===this._dfdBlock.samples[1].channelType);case r.UASTC4x4:return 3===this._dfdBlock.samples[0].channelType}return!1}get needZSTDDecoder(){return this._header.supercompressionScheme===n.ZStandard}get isInGammaSpace(){return 2===this._dfdBlock.transferFunction}static IsValid(e){if(e.byteLength>=12){const t=new Uint8Array(e.buffer,e.byteOffset,12);if(171===t[0]&&75===t[1]&&84===t[2]&&88===t[3]&&32===t[4]&&50===t[5]&&48===t[6]&&187===t[7]&&13===t[8]&&10===t[9]&&26===t[10]&&10===t[11])return!0}return!1}}class c{static LoadWASM(e){if(this.LoadBinariesFromCurrentThread)return new Promise(((t,r)=>{fetch(e).then((t=>{if(t.ok)return t.arrayBuffer();throw new Error(`Could not fetch the wasm component from "${e}": ${t.status} - ${t.statusText}`)})).then((e=>t(e))).catch((e=>{r(e)}))}));const t=this._RequestId++;return new Promise((r=>{const a=e=>{"wasmLoaded"===e.data.action&&e.data.id===t&&(self.removeEventListener("message",a),r(e.data.wasmBinary))};self.addEventListener("message",a),postMessage({action:"loadWASM",path:e,id:t})}))}constructor(e=c.InitialMemoryPages){this._numPages=e,this._memory=new WebAssembly.Memory({initial:this._numPages}),this._memoryViewByteLength=this._numPages<<16,this._memoryViewOffset=0,this._memoryView=new Uint8Array(this._memory.buffer,this._memoryViewOffset,this._memoryViewByteLength)}get wasmMemory(){return this._memory}getMemoryView(e,t=0,r){return r=r??e<<16,this._numPages({module:e.instance.exports})))}_loadModule(e=this._wasmBinary){return this._modulePromise=this._modulePromise||(e?Promise.resolve(e):c.LoadWASM(this._modulePath)).then((e=>this._instantiateWebAssembly(e))),this._modulePromise}get memoryManager(){return this._memoryManager}setModulePath(e,t){this._modulePath=_.GetWasmUrl(e),this._wasmBinary=t}initialize(){this._transcodeInPlace=!0}needMemoryManager(){return!0}setMemoryManager(e){this._memoryManager=e}transcode(e,t,r,a,s,n,o,i,d){return this._loadModule().then((e=>{const t=e.module,[r,o,i]=this._prepareTranscoding(a,s,n,d);return 0===t.transcode(i)?this._transcodeInPlace?r.slice():o.slice():null}))}_prepareTranscoding(e,t,r,a,s){const n=(e+3>>2)*(t+3>>2);void 0!==s&&(r=e*(t+3>>2)*4*s);const o=1+(16*n+65535+(this._transcodeInPlace?0:r)>>16),i=this.memoryManager.getMemoryView(o,65536,16*n),d=this._transcodeInPlace?null:new Uint8Array(this._memoryManager.wasmMemory.buffer,65536+16*n,void 0!==s?e*t*s:r);return i.set(a),[i,d,n]}}class h extends m{static CanTranscode(e,t,s){return e===r.UASTC4x4&&t===a.ASTC_4X4_RGBA}getName(){return h.Name}initialize(){super.initialize(),this.setModulePath(h.WasmModuleURL,h.WasmBinary)}}h.WasmModuleURL="https://cdn.babylonjs.com/ktx2Transcoders/1/uastc_astc.wasm",h.WasmBinary=null,h.Name="UniversalTranscoder_UASTC_ASTC";class u extends m{static CanTranscode(e,t,s){return e===r.UASTC4x4&&t===a.BC7_RGBA}getName(){return u.Name}initialize(){super.initialize(),this.setModulePath(u.WasmModuleURL,u.WasmBinary)}}u.WasmModuleURL="https://cdn.babylonjs.com/ktx2Transcoders/1/uastc_bc7.wasm",u.WasmBinary=null,u.Name="UniversalTranscoder_UASTC_BC7";class f extends m{static CanTranscode(e,t,s){return e===r.UASTC4x4&&t===a.RGBA32&&!s}getName(){return f.Name}initialize(){super.initialize(),this._transcodeInPlace=!1,this.setModulePath(f.WasmModuleURL,f.WasmBinary)}transcode(e,t,r,a,s,n,o,i,d){return this._loadModule().then((e=>{const t=e.module,[,r]=this._prepareTranscoding(a,s,n,d,4);return 0===t.decode(a,s)?r.slice():null}))}}f.WasmModuleURL="https://cdn.babylonjs.com/ktx2Transcoders/1/uastc_rgba8_unorm_v2.wasm",f.WasmBinary=null,f.Name="UniversalTranscoder_UASTC_RGBA_UNORM";class y extends m{static CanTranscode(e,t,s){return e===r.UASTC4x4&&t===a.RGBA32&&s}getName(){return y.Name}initialize(){super.initialize(),this._transcodeInPlace=!1,this.setModulePath(y.WasmModuleURL,y.WasmBinary)}transcode(e,t,r,a,s,n,o,i,d){return this._loadModule().then((e=>{const t=e.module,[,r]=this._prepareTranscoding(a,s,n,d,4);return 0===t.decode(a,s)?r.slice():null}))}}y.WasmModuleURL="https://cdn.babylonjs.com/ktx2Transcoders/1/uastc_rgba8_srgb_v2.wasm",y.WasmBinary=null,y.Name="UniversalTranscoder_UASTC_RGBA_SRGB";class T extends m{static CanTranscode(e,t,s){return e===r.UASTC4x4&&t===a.R8}getName(){return T.Name}initialize(){super.initialize(),this._transcodeInPlace=!1,this.setModulePath(T.WasmModuleURL,T.WasmBinary)}transcode(e,t,r,a,s,n,o,i,d){return this._loadModule().then((e=>{const t=e.module,[,r]=this._prepareTranscoding(a,s,n,d,1);return 0===t.decode(a,s)?r.slice():null}))}}T.WasmModuleURL="https://cdn.babylonjs.com/ktx2Transcoders/1/uastc_r8_unorm.wasm",T.WasmBinary=null,T.Name="UniversalTranscoder_UASTC_R8_UNORM";class p extends m{static CanTranscode(e,t,s){return e===r.UASTC4x4&&t===a.RG8}getName(){return p.Name}initialize(){super.initialize(),this._transcodeInPlace=!1,this.setModulePath(p.WasmModuleURL,p.WasmBinary)}transcode(e,t,r,a,s,n,o,i,d){return this._loadModule().then((e=>{const t=e.module,[,r]=this._prepareTranscoding(a,s,n,d,2);return 0===t.decode(a,s)?r.slice():null}))}}p.WasmModuleURL="https://cdn.babylonjs.com/ktx2Transcoders/1/uastc_rg8_unorm.wasm",p.WasmBinary=null,p.Name="UniversalTranscoder_UASTC_RG8_UNORM";class B extends _{getName(){return B.Name}_getMSCBasisTranscoder(){return this._mscBasisTranscoderPromise||(this._mscBasisTranscoderPromise=(B.WasmBinary?Promise.resolve(B.WasmBinary):c.LoadWASM(_.GetWasmUrl(B.WasmModuleURL))).then((e=>{if(B.JSModule&&"undefined"==typeof MSC_TRANSCODER)globalThis.MSC_TRANSCODER=B.JSModule;else if(B.UseFromWorkerThread)importScripts(_.GetWasmUrl(B.JSModuleURL));else if("undefined"==typeof MSC_TRANSCODER)return new Promise(((t,r)=>{const a=document.getElementsByTagName("head")[0],s=document.createElement("script");s.setAttribute("type","text/javascript"),s.setAttribute("src",_.GetWasmUrl(B.JSModuleURL)),s.onload=()=>{MSC_TRANSCODER({wasmBinary:e}).then((e=>{e.initTranscoders(),this._mscBasisModule=e,t()}))},s.onerror=()=>{r("Can not load MSC_TRANSCODER script.")},a.appendChild(s)}));return new Promise((t=>{MSC_TRANSCODER({wasmBinary:e}).then((e=>{e.initTranscoders(),this._mscBasisModule=e,t()}))}))}))),this._mscBasisTranscoderPromise}static CanTranscode(e,t,r){return!0}transcode(e,t,s,n,o,i,d,c,l){const _=!1;return this._getMSCBasisTranscoder().then((()=>{const m=this._mscBasisModule;let h,u,f,y=null;try{h=e===r.UASTC4x4?new m.UastcImageTranscoder:new m.BasisLzEtc1sImageTranscoder;const y=e===r.UASTC4x4?m.TextureFormat.UASTC4x4:m.TextureFormat.ETC1S;u=new m.ImageInfo(y,n,o,s);const T=m.TranscodeTarget[a[t]];if(!m.isFormatSupported(T,y))throw new Error(`MSCTranscoder: Transcoding from "${r[e]}" to "${a[t]}" not supported by current transcoder build.`);if(e===r.ETC1S){const e=d.supercompressionGlobalData;h.decodePalettes(e.endpointCount,e.endpointsData,e.selectorCount,e.selectorsData),h.decodeTables(e.tablesData),u.flags=c.imageFlags,u.rgbByteOffset=0,u.rgbByteLength=c.rgbSliceByteLength,u.alphaByteOffset=c.alphaSliceByteOffset>0?c.rgbSliceByteLength:0,u.alphaByteLength=c.alphaSliceByteLength,f=h.transcodeImage(T,l,u,0,_)}else u.flags=0,u.rgbByteOffset=0,u.rgbByteLength=i,u.alphaByteOffset=0,u.alphaByteLength=0,f=h.transcodeImage(T,l,u,0,d.hasAlpha,_)}finally{h&&h.delete(),u&&u.delete(),f&&f.transcodedImage&&(y=f.transcodedImage.get_typed_memory_view().slice(),f.transcodedImage.delete())}return y}))}}let g,R,C;B.JSModuleURL="https://cdn.babylonjs.com/ktx2Transcoders/1/msc_basis_transcoder.js",B.WasmModuleURL="https://cdn.babylonjs.com/ktx2Transcoders/1/msc_basis_transcoder.wasm",B.WasmBinary=null,B.JSModule=null,B.UseFromWorkerThread=!0,B.Name="MSCTranscoder";const S={env:{emscripten_notify_memory_growth:function(){C=new Uint8Array(R.exports.memory.buffer)}}};class M{init(){return g||(g="undefined"!=typeof fetch?fetch(_.GetWasmUrl(M.WasmModuleURL)).then((e=>{if(e.ok)return e.arrayBuffer();throw new Error(`Could not fetch the wasm component for the Zstandard decompression lib: ${e.status} - ${e.statusText}`)})).then((e=>WebAssembly.instantiate(e,S))).then(this._init):WebAssembly.instantiateStreaming(fetch(M.WasmModuleURL),S).then(this._init),g)}_init(e){R=e.instance,S.env.emscripten_notify_memory_growth()}decode(e,t=0){if(!R)throw new Error("ZSTDDecoder: Await .init() before decoding.");const r=e.byteLength,a=R.exports.malloc(r);C.set(e,a),t=t||Number(R.exports.ZSTD_findDecompressedSize(a,r));const s=R.exports.malloc(t),n=R.exports.ZSTD_decompress(s,t,a,r),o=C.slice(s,s+n);return R.exports.free(a),R.exports.free(s),o}}M.WasmModuleURL="https://cdn.babylonjs.com/zstddec.wasm";const U={ETC1S:{option:"forceRGBA",yes:{transcodeFormat:a.RGBA32,engineFormat:s.RGBA8Format,roundToMultiple4:!1},no:{cap:"etc2",yes:{alpha:!0,yes:{transcodeFormat:a.ETC2_RGBA,engineFormat:s.COMPRESSED_RGBA8_ETC2_EAC},no:{transcodeFormat:a.ETC1_RGB,engineFormat:s.COMPRESSED_RGB8_ETC2}},no:{cap:"etc1",alpha:!1,yes:{transcodeFormat:a.ETC1_RGB,engineFormat:s.COMPRESSED_RGB_ETC1_WEBGL},no:{cap:"bptc",yes:{transcodeFormat:a.BC7_RGBA,engineFormat:s.COMPRESSED_RGBA_BPTC_UNORM_EXT},no:{cap:"s3tc",yes:{alpha:!0,yes:{transcodeFormat:a.BC3_RGBA,engineFormat:s.COMPRESSED_RGBA_S3TC_DXT5_EXT},no:{transcodeFormat:a.BC1_RGB,engineFormat:s.COMPRESSED_RGB_S3TC_DXT1_EXT}},no:{cap:"pvrtc",needsPowerOfTwo:!0,yes:{alpha:!0,yes:{transcodeFormat:a.PVRTC1_4_RGBA,engineFormat:s.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG},no:{transcodeFormat:a.PVRTC1_4_RGB,engineFormat:s.COMPRESSED_RGB_PVRTC_4BPPV1_IMG}},no:{transcodeFormat:a.RGBA32,engineFormat:s.RGBA8Format,roundToMultiple4:!1}}}}}}},UASTC:{option:"forceRGBA",yes:{transcodeFormat:a.RGBA32,engineFormat:s.RGBA8Format,roundToMultiple4:!1},no:{option:"forceR8",yes:{transcodeFormat:a.R8,engineFormat:s.R8Format,roundToMultiple4:!1},no:{option:"forceRG8",yes:{transcodeFormat:a.RG8,engineFormat:s.RG8Format,roundToMultiple4:!1},no:{cap:"astc",yes:{transcodeFormat:a.ASTC_4X4_RGBA,engineFormat:s.COMPRESSED_RGBA_ASTC_4X4_KHR},no:{cap:"bptc",yes:{transcodeFormat:a.BC7_RGBA,engineFormat:s.COMPRESSED_RGBA_BPTC_UNORM_EXT},no:{option:"useRGBAIfASTCBC7NotAvailableWhenUASTC",yes:{transcodeFormat:a.RGBA32,engineFormat:s.RGBA8Format,roundToMultiple4:!1},no:{cap:"etc2",yes:{alpha:!0,yes:{transcodeFormat:a.ETC2_RGBA,engineFormat:s.COMPRESSED_RGBA8_ETC2_EAC},no:{transcodeFormat:a.ETC1_RGB,engineFormat:s.COMPRESSED_RGB8_ETC2}},no:{cap:"etc1",yes:{transcodeFormat:a.ETC1_RGB,engineFormat:s.COMPRESSED_RGB_ETC1_WEBGL},no:{cap:"s3tc",yes:{alpha:!0,yes:{transcodeFormat:a.BC3_RGBA,engineFormat:s.COMPRESSED_RGBA_S3TC_DXT5_EXT},no:{transcodeFormat:a.BC1_RGB,engineFormat:s.COMPRESSED_RGB_S3TC_DXT1_EXT}},no:{cap:"pvrtc",needsPowerOfTwo:!0,yes:{alpha:!0,yes:{transcodeFormat:a.PVRTC1_4_RGBA,engineFormat:s.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG},no:{transcodeFormat:a.PVRTC1_4_RGB,engineFormat:s.COMPRESSED_RGB_PVRTC_4BPPV1_IMG}},no:{transcodeFormat:a.RGBA32,engineFormat:s.RGBA8Format,roundToMultiple4:!1}}}}}}}}}}}};class A{static _IsLeafNode(e){return void 0!==e.engineFormat}get transcodeFormat(){return this._transcodeFormat}get engineFormat(){return this._engineFormat}get roundToMultiple4(){return this._roundToMultiple4}constructor(e,t,r,a,s){this._textureFormat=e,this._hasAlpha=t,this._isPowerOfTwo=r,this._caps=a,this._options=s??{},this.parseTree(U)}parseTree(e){const t=this._textureFormat===r.UASTC4x4?e.UASTC:e.ETC1S;return t&&this._parseNode(t),void 0!==t}_parseNode(e){if(e)if(A._IsLeafNode(e))this._transcodeFormat=e.transcodeFormat,this._engineFormat=e.engineFormat,this._roundToMultiple4=e.roundToMultiple4??!0;else{let t=!0;void 0!==e.cap&&(t=t&&!!this._caps[e.cap]),void 0!==e.option&&(t=t&&!!this._options[e.option]),void 0!==e.alpha&&(t=t&&this._hasAlpha===e.alpha),void 0!==e.needsPowerOfTwo&&(t=t&&this._isPowerOfTwo===e.needsPowerOfTwo),void 0!==e.transcodeFormat&&(t=Array.isArray(e.transcodeFormat)?t&&-1!==e.transcodeFormat.indexOf(this._transcodeFormat):t&&e.transcodeFormat===this._transcodeFormat),this._parseNode(t?e.yes:e.no)}}}const E=e=>!(e&e-1)&&0!==e;class w{constructor(){this._transcoderMgr=new l}decode(e,t,r){const a={...r,...w.DefaultDecoderOptions};return Promise.resolve().then((()=>{const r=new d(e);if(!r.isValid())throw new Error("Invalid KT2 file: wrong signature");return r.parse(),r.needZSTDDecoder?(this._zstdDecoder||(this._zstdDecoder=new M),this._zstdDecoder.init().then((()=>this._decodeData(r,t,a)))):this._decodeData(r,t,a)}))}_decodeData(e,t,s){const o=e.header.pixelWidth,i=e.header.pixelHeight,d=e.textureFormat,c=new A(d,e.hasAlpha,E(o)&&E(i),t,s);s?.transcodeFormatDecisionTree&&c.parseTree(s?.transcodeFormatDecisionTree);const l=c.transcodeFormat,_=c.engineFormat,m=c.roundToMultiple4,h=this._transcoderMgr.findTranscoder(d,l,e.isInGammaSpace,s?.bypassTranscoders);if(null===h)throw new Error(`no transcoder found to transcode source texture format "${r[d]}" to format "${a[l]}"`);const u=[],f=[],y={width:0,height:0,transcodedFormat:_,mipmaps:u,isInGammaSpace:e.isInGammaSpace,hasAlpha:e.hasAlpha,transcoderName:h.getName()};let T=0;for(let t=0;t0&&(T+=Math.max(e.header.layerCount,1)*e.header.faceCount*Math.max(e.header.pixelDepth>>t-1,1));const r=Math.floor(o/(1<>2)*(a+3>>2)*e.dfdBlock.bytesPlane[0],_=e.levels[t].uncompressedByteLength;let p=e.data.buffer,B=e.levels[t].byteOffset+e.data.byteOffset,g=0;e.header.supercompressionScheme===n.ZStandard&&(p=this._zstdDecoder.decode(new Uint8Array(p,B,e.levels[t].byteLength),_),B=0),0===t&&(y.width=m?r+3&-4:r,y.height=m?a+3&-4:a);for(let o=0;o(m.data=e,e))).catch((e=>(y.errors=y.errors??"",y.errors+=e+"\n"+e.stack+"\n",null)));f.push(R),u.push(m)}}return Promise.all(f).then((()=>y))}}w.DefaultDecoderOptions={},l.RegisterTranscoder(h),l.RegisterTranscoder(u),l.RegisterTranscoder(f),l.RegisterTranscoder(y),l.RegisterTranscoder(T),l.RegisterTranscoder(p),l.RegisterTranscoder(B);const b=void 0!==e.g?e.g:"undefined"!=typeof window?window:void 0;void 0!==b&&(b.KTX2DECODER=w);const G=o;return t.default})())); +//# sourceMappingURL=babylon.ktx2Decoder.js.map \ No newline at end of file diff --git a/public/bblcdn/draco_decoder_gltf .wasm b/public/bblcdn/draco_decoder_gltf .wasm new file mode 100644 index 0000000..469904e Binary files /dev/null and b/public/bblcdn/draco_decoder_gltf .wasm differ diff --git a/public/bblcdn/draco_decoder_gltf.wasm b/public/bblcdn/draco_decoder_gltf.wasm new file mode 100644 index 0000000..469904e Binary files /dev/null and b/public/bblcdn/draco_decoder_gltf.wasm differ diff --git a/public/bblcdn/draco_wasm_wrapper_gltf.js b/public/bblcdn/draco_wasm_wrapper_gltf.js new file mode 100644 index 0000000..0a8399f --- /dev/null +++ b/public/bblcdn/draco_wasm_wrapper_gltf.js @@ -0,0 +1,116 @@ +var $jscomp=$jscomp||{};$jscomp.scope={};$jscomp.arrayIteratorImpl=function(h){var n=0;return function(){return n>>0,$jscomp.propertyToPolyfillSymbol[l]=$jscomp.IS_SYMBOL_NATIVE? +$jscomp.global.Symbol(l):$jscomp.POLYFILL_PREFIX+k+"$"+l),$jscomp.defineProperty(p,$jscomp.propertyToPolyfillSymbol[l],{configurable:!0,writable:!0,value:n})))}; +$jscomp.polyfill("Promise",function(h){function n(){this.batch_=null}function k(f){return f instanceof l?f:new l(function(q,u){q(f)})}if(h&&(!($jscomp.FORCE_POLYFILL_PROMISE||$jscomp.FORCE_POLYFILL_PROMISE_WHEN_NO_UNHANDLED_REJECTION&&"undefined"===typeof $jscomp.global.PromiseRejectionEvent)||!$jscomp.global.Promise||-1===$jscomp.global.Promise.toString().indexOf("[native code]")))return h;n.prototype.asyncExecute=function(f){if(null==this.batch_){this.batch_=[];var q=this;this.asyncExecuteFunction(function(){q.executeBatch_()})}this.batch_.push(f)}; +var p=$jscomp.global.setTimeout;n.prototype.asyncExecuteFunction=function(f){p(f,0)};n.prototype.executeBatch_=function(){for(;this.batch_&&this.batch_.length;){var f=this.batch_;this.batch_=[];for(var q=0;q=y}},"es6","es3"); +$jscomp.polyfill("Array.prototype.copyWithin",function(h){function n(k){k=Number(k);return Infinity===k||-Infinity===k?k:k|0}return h?h:function(k,p,l){var y=this.length;k=n(k);p=n(p);l=void 0===l?y:n(l);k=0>k?Math.max(y+k,0):Math.min(k,y);p=0>p?Math.max(y+p,0):Math.min(p,y);l=0>l?Math.max(y+l,0):Math.min(l,y);if(kp;)--l in this?this[--k]=this[l]:delete this[--k];return this}},"es6","es3"); +$jscomp.typedArrayCopyWithin=function(h){return h?h:Array.prototype.copyWithin};$jscomp.polyfill("Int8Array.prototype.copyWithin",$jscomp.typedArrayCopyWithin,"es6","es5");$jscomp.polyfill("Uint8Array.prototype.copyWithin",$jscomp.typedArrayCopyWithin,"es6","es5");$jscomp.polyfill("Uint8ClampedArray.prototype.copyWithin",$jscomp.typedArrayCopyWithin,"es6","es5");$jscomp.polyfill("Int16Array.prototype.copyWithin",$jscomp.typedArrayCopyWithin,"es6","es5"); +$jscomp.polyfill("Uint16Array.prototype.copyWithin",$jscomp.typedArrayCopyWithin,"es6","es5");$jscomp.polyfill("Int32Array.prototype.copyWithin",$jscomp.typedArrayCopyWithin,"es6","es5");$jscomp.polyfill("Uint32Array.prototype.copyWithin",$jscomp.typedArrayCopyWithin,"es6","es5");$jscomp.polyfill("Float32Array.prototype.copyWithin",$jscomp.typedArrayCopyWithin,"es6","es5");$jscomp.polyfill("Float64Array.prototype.copyWithin",$jscomp.typedArrayCopyWithin,"es6","es5"); +var DracoDecoderModule=function(){var h="undefined"!==typeof document&&document.currentScript?document.currentScript.src:void 0;"undefined"!==typeof __filename&&(h=h||__filename);return function(n){function k(e){return a.locateFile?a.locateFile(e,U):U+e}function p(e,b){if(e){var c=ia;var d=e+b;for(b=e;c[b]&&!(b>=d);)++b;if(16g?d+=String.fromCharCode(g):(g-=65536,d+=String.fromCharCode(55296|g>>10,56320|g&1023))}}else d+=String.fromCharCode(g)}c=d}}else c="";return c}function l(){var e=ja.buffer;a.HEAP8=W=new Int8Array(e);a.HEAP16=new Int16Array(e);a.HEAP32=ca=new Int32Array(e);a.HEAPU8=ia=new Uint8Array(e);a.HEAPU16=new Uint16Array(e);a.HEAPU32=Y=new Uint32Array(e);a.HEAPF32=new Float32Array(e);a.HEAPF64=new Float64Array(e)}function y(e){if(a.onAbort)a.onAbort(e); +e="Aborted("+e+")";da(e);sa=!0;e=new WebAssembly.RuntimeError(e+". Build with -sASSERTIONS for more info.");ka(e);throw e;}function f(e){try{if(e==P&&ea)return new Uint8Array(ea);if(ma)return ma(e);throw"both async and sync fetching of the wasm failed";}catch(b){y(b)}}function q(){if(!ea&&(ta||fa)){if("function"==typeof fetch&&!P.startsWith("file://"))return fetch(P,{credentials:"same-origin"}).then(function(e){if(!e.ok)throw"failed to load wasm binary file at '"+P+"'";return e.arrayBuffer()}).catch(function(){return f(P)}); +if(na)return new Promise(function(e,b){na(P,function(c){e(new Uint8Array(c))},b)})}return Promise.resolve().then(function(){return f(P)})}function u(e){for(;0>2]=b};this.get_type=function(){return Y[this.ptr+4>>2]};this.set_destructor=function(b){Y[this.ptr+8>>2]=b};this.get_destructor=function(){return Y[this.ptr+8>>2]};this.set_refcount=function(b){ca[this.ptr>>2]=b};this.set_caught=function(b){W[this.ptr+ +12>>0]=b?1:0};this.get_caught=function(){return 0!=W[this.ptr+12>>0]};this.set_rethrown=function(b){W[this.ptr+13>>0]=b?1:0};this.get_rethrown=function(){return 0!=W[this.ptr+13>>0]};this.init=function(b,c){this.set_adjusted_ptr(0);this.set_type(b);this.set_destructor(c);this.set_refcount(0);this.set_caught(!1);this.set_rethrown(!1)};this.add_ref=function(){ca[this.ptr>>2]+=1};this.release_ref=function(){var b=ca[this.ptr>>2];ca[this.ptr>>2]=b-1;return 1===b};this.set_adjusted_ptr=function(b){Y[this.ptr+ +16>>2]=b};this.get_adjusted_ptr=function(){return Y[this.ptr+16>>2]};this.get_exception_ptr=function(){if(ua(this.get_type()))return Y[this.excPtr>>2];var b=this.get_adjusted_ptr();return 0!==b?b:this.excPtr}}function F(){function e(){if(!la&&(la=!0,a.calledRun=!0,!sa)){va=!0;u(oa);wa(a);if(a.onRuntimeInitialized)a.onRuntimeInitialized();if(a.postRun)for("function"==typeof a.postRun&&(a.postRun=[a.postRun]);a.postRun.length;)xa.unshift(a.postRun.shift());u(xa)}}if(!(0=d?b++:2047>=d?b+=2:55296<=d&&57343>= +d?(b+=4,++c):b+=3}b=Array(b+1);c=0;d=b.length;if(0=t){var aa=e.charCodeAt(++g);t=65536+((t&1023)<<10)|aa&1023}if(127>=t){if(c>=d)break;b[c++]=t}else{if(2047>=t){if(c+1>=d)break;b[c++]=192|t>>6}else{if(65535>=t){if(c+2>=d)break;b[c++]=224|t>>12}else{if(c+3>=d)break;b[c++]=240|t>>18;b[c++]=128|t>>12&63}b[c++]=128|t>>6&63}b[c++]=128|t&63}}b[c]=0}e=r.alloc(b,W);r.copy(b,W,e);return e}return e}function Z(e){if("object"=== +typeof e){var b=r.alloc(e,W);r.copy(e,W,b);return b}return e}function X(){throw"cannot construct a VoidPtr, no constructor in IDL";}function S(){this.ptr=za();w(S)[this.ptr]=this}function Q(){this.ptr=Aa();w(Q)[this.ptr]=this}function V(){this.ptr=Ba();w(V)[this.ptr]=this}function x(){this.ptr=Ca();w(x)[this.ptr]=this}function D(){this.ptr=Da();w(D)[this.ptr]=this}function G(){this.ptr=Ea();w(G)[this.ptr]=this}function H(){this.ptr=Fa();w(H)[this.ptr]=this}function E(){this.ptr=Ga();w(E)[this.ptr]= +this}function T(){this.ptr=Ha();w(T)[this.ptr]=this}function C(){throw"cannot construct a Status, no constructor in IDL";}function I(){this.ptr=Ia();w(I)[this.ptr]=this}function J(){this.ptr=Ja();w(J)[this.ptr]=this}function K(){this.ptr=Ka();w(K)[this.ptr]=this}function L(){this.ptr=La();w(L)[this.ptr]=this}function M(){this.ptr=Ma();w(M)[this.ptr]=this}function N(){this.ptr=Na();w(N)[this.ptr]=this}function O(){this.ptr=Oa();w(O)[this.ptr]=this}function z(){this.ptr=Pa();w(z)[this.ptr]=this}function m(){this.ptr= +Qa();w(m)[this.ptr]=this}n=void 0===n?{}:n;var a="undefined"!=typeof n?n:{},wa,ka;a.ready=new Promise(function(e,b){wa=e;ka=b});var Ra=!1,Sa=!1;a.onRuntimeInitialized=function(){Ra=!0;if(Sa&&"function"===typeof a.onModuleLoaded)a.onModuleLoaded(a)};a.onModuleParsed=function(){Sa=!0;if(Ra&&"function"===typeof a.onModuleLoaded)a.onModuleLoaded(a)};a.isVersionSupported=function(e){if("string"!==typeof e)return!1;e=e.split(".");return 2>e.length||3=e[1]?!0:0!=e[0]||10< +e[1]?!1:!0};var Ta=Object.assign({},a),ta="object"==typeof window,fa="function"==typeof importScripts,Ua="object"==typeof process&&"object"==typeof process.versions&&"string"==typeof process.versions.node,U="";if(Ua){var Va=require("fs"),pa=require("path");U=fa?pa.dirname(U)+"/":__dirname+"/";var Wa=function(e,b){e=e.startsWith("file://")?new URL(e):pa.normalize(e);return Va.readFileSync(e,b?void 0:"utf8")};var ma=function(e){e=Wa(e,!0);e.buffer||(e=new Uint8Array(e));return e};var na=function(e, +b,c){e=e.startsWith("file://")?new URL(e):pa.normalize(e);Va.readFile(e,function(d,g){d?c(d):b(g.buffer)})};1>>=0;if(2147483648=c;c*=2){var d=b*(1+.2/c);d=Math.min(d,e+100663296);var g=Math;d=Math.max(e,d);g=g.min.call(g,2147483648,d+(65536-d%65536)%65536);a:{d=ja.buffer;try{ja.grow(g-d.byteLength+65535>>>16);l();var t=1;break a}catch(aa){}t=void 0}if(t)return!0}return!1}};(function(){function e(g,t){a.asm=g.exports;ja=a.asm.e;l();oa.unshift(a.asm.f);ba--;a.monitorRunDependencies&&a.monitorRunDependencies(ba);0==ba&&(null!==qa&&(clearInterval(qa),qa=null),ha&&(g=ha,ha=null,g()))}function b(g){e(g.instance)} +function c(g){return q().then(function(t){return WebAssembly.instantiate(t,d)}).then(function(t){return t}).then(g,function(t){da("failed to asynchronously prepare wasm: "+t);y(t)})}var d={a:qd};ba++;a.monitorRunDependencies&&a.monitorRunDependencies(ba);if(a.instantiateWasm)try{return a.instantiateWasm(d,e)}catch(g){da("Module.instantiateWasm callback failed with error: "+g),ka(g)}(function(){return ea||"function"!=typeof WebAssembly.instantiateStreaming||P.startsWith("data:application/octet-stream;base64,")|| +P.startsWith("file://")||Ua||"function"!=typeof fetch?c(b):fetch(P,{credentials:"same-origin"}).then(function(g){return WebAssembly.instantiateStreaming(g,d).then(b,function(t){da("wasm streaming compile failed: "+t);da("falling back to ArrayBuffer instantiation");return c(b)})})})().catch(ka);return{}})();var Xa=a._emscripten_bind_VoidPtr___destroy___0=function(){return(Xa=a._emscripten_bind_VoidPtr___destroy___0=a.asm.h).apply(null,arguments)},za=a._emscripten_bind_DecoderBuffer_DecoderBuffer_0= +function(){return(za=a._emscripten_bind_DecoderBuffer_DecoderBuffer_0=a.asm.i).apply(null,arguments)},Ya=a._emscripten_bind_DecoderBuffer_Init_2=function(){return(Ya=a._emscripten_bind_DecoderBuffer_Init_2=a.asm.j).apply(null,arguments)},Za=a._emscripten_bind_DecoderBuffer___destroy___0=function(){return(Za=a._emscripten_bind_DecoderBuffer___destroy___0=a.asm.k).apply(null,arguments)},Aa=a._emscripten_bind_AttributeTransformData_AttributeTransformData_0=function(){return(Aa=a._emscripten_bind_AttributeTransformData_AttributeTransformData_0= +a.asm.l).apply(null,arguments)},$a=a._emscripten_bind_AttributeTransformData_transform_type_0=function(){return($a=a._emscripten_bind_AttributeTransformData_transform_type_0=a.asm.m).apply(null,arguments)},ab=a._emscripten_bind_AttributeTransformData___destroy___0=function(){return(ab=a._emscripten_bind_AttributeTransformData___destroy___0=a.asm.n).apply(null,arguments)},Ba=a._emscripten_bind_GeometryAttribute_GeometryAttribute_0=function(){return(Ba=a._emscripten_bind_GeometryAttribute_GeometryAttribute_0= +a.asm.o).apply(null,arguments)},bb=a._emscripten_bind_GeometryAttribute___destroy___0=function(){return(bb=a._emscripten_bind_GeometryAttribute___destroy___0=a.asm.p).apply(null,arguments)},Ca=a._emscripten_bind_PointAttribute_PointAttribute_0=function(){return(Ca=a._emscripten_bind_PointAttribute_PointAttribute_0=a.asm.q).apply(null,arguments)},cb=a._emscripten_bind_PointAttribute_size_0=function(){return(cb=a._emscripten_bind_PointAttribute_size_0=a.asm.r).apply(null,arguments)},db=a._emscripten_bind_PointAttribute_GetAttributeTransformData_0= +function(){return(db=a._emscripten_bind_PointAttribute_GetAttributeTransformData_0=a.asm.s).apply(null,arguments)},eb=a._emscripten_bind_PointAttribute_attribute_type_0=function(){return(eb=a._emscripten_bind_PointAttribute_attribute_type_0=a.asm.t).apply(null,arguments)},fb=a._emscripten_bind_PointAttribute_data_type_0=function(){return(fb=a._emscripten_bind_PointAttribute_data_type_0=a.asm.u).apply(null,arguments)},gb=a._emscripten_bind_PointAttribute_num_components_0=function(){return(gb=a._emscripten_bind_PointAttribute_num_components_0= +a.asm.v).apply(null,arguments)},hb=a._emscripten_bind_PointAttribute_normalized_0=function(){return(hb=a._emscripten_bind_PointAttribute_normalized_0=a.asm.w).apply(null,arguments)},ib=a._emscripten_bind_PointAttribute_byte_stride_0=function(){return(ib=a._emscripten_bind_PointAttribute_byte_stride_0=a.asm.x).apply(null,arguments)},jb=a._emscripten_bind_PointAttribute_byte_offset_0=function(){return(jb=a._emscripten_bind_PointAttribute_byte_offset_0=a.asm.y).apply(null,arguments)},kb=a._emscripten_bind_PointAttribute_unique_id_0= +function(){return(kb=a._emscripten_bind_PointAttribute_unique_id_0=a.asm.z).apply(null,arguments)},lb=a._emscripten_bind_PointAttribute___destroy___0=function(){return(lb=a._emscripten_bind_PointAttribute___destroy___0=a.asm.A).apply(null,arguments)},Da=a._emscripten_bind_AttributeQuantizationTransform_AttributeQuantizationTransform_0=function(){return(Da=a._emscripten_bind_AttributeQuantizationTransform_AttributeQuantizationTransform_0=a.asm.B).apply(null,arguments)},mb=a._emscripten_bind_AttributeQuantizationTransform_InitFromAttribute_1= +function(){return(mb=a._emscripten_bind_AttributeQuantizationTransform_InitFromAttribute_1=a.asm.C).apply(null,arguments)},nb=a._emscripten_bind_AttributeQuantizationTransform_quantization_bits_0=function(){return(nb=a._emscripten_bind_AttributeQuantizationTransform_quantization_bits_0=a.asm.D).apply(null,arguments)},ob=a._emscripten_bind_AttributeQuantizationTransform_min_value_1=function(){return(ob=a._emscripten_bind_AttributeQuantizationTransform_min_value_1=a.asm.E).apply(null,arguments)},pb= +a._emscripten_bind_AttributeQuantizationTransform_range_0=function(){return(pb=a._emscripten_bind_AttributeQuantizationTransform_range_0=a.asm.F).apply(null,arguments)},qb=a._emscripten_bind_AttributeQuantizationTransform___destroy___0=function(){return(qb=a._emscripten_bind_AttributeQuantizationTransform___destroy___0=a.asm.G).apply(null,arguments)},Ea=a._emscripten_bind_AttributeOctahedronTransform_AttributeOctahedronTransform_0=function(){return(Ea=a._emscripten_bind_AttributeOctahedronTransform_AttributeOctahedronTransform_0= +a.asm.H).apply(null,arguments)},rb=a._emscripten_bind_AttributeOctahedronTransform_InitFromAttribute_1=function(){return(rb=a._emscripten_bind_AttributeOctahedronTransform_InitFromAttribute_1=a.asm.I).apply(null,arguments)},sb=a._emscripten_bind_AttributeOctahedronTransform_quantization_bits_0=function(){return(sb=a._emscripten_bind_AttributeOctahedronTransform_quantization_bits_0=a.asm.J).apply(null,arguments)},tb=a._emscripten_bind_AttributeOctahedronTransform___destroy___0=function(){return(tb= +a._emscripten_bind_AttributeOctahedronTransform___destroy___0=a.asm.K).apply(null,arguments)},Fa=a._emscripten_bind_PointCloud_PointCloud_0=function(){return(Fa=a._emscripten_bind_PointCloud_PointCloud_0=a.asm.L).apply(null,arguments)},ub=a._emscripten_bind_PointCloud_num_attributes_0=function(){return(ub=a._emscripten_bind_PointCloud_num_attributes_0=a.asm.M).apply(null,arguments)},vb=a._emscripten_bind_PointCloud_num_points_0=function(){return(vb=a._emscripten_bind_PointCloud_num_points_0=a.asm.N).apply(null, +arguments)},wb=a._emscripten_bind_PointCloud___destroy___0=function(){return(wb=a._emscripten_bind_PointCloud___destroy___0=a.asm.O).apply(null,arguments)},Ga=a._emscripten_bind_Mesh_Mesh_0=function(){return(Ga=a._emscripten_bind_Mesh_Mesh_0=a.asm.P).apply(null,arguments)},xb=a._emscripten_bind_Mesh_num_faces_0=function(){return(xb=a._emscripten_bind_Mesh_num_faces_0=a.asm.Q).apply(null,arguments)},yb=a._emscripten_bind_Mesh_num_attributes_0=function(){return(yb=a._emscripten_bind_Mesh_num_attributes_0= +a.asm.R).apply(null,arguments)},zb=a._emscripten_bind_Mesh_num_points_0=function(){return(zb=a._emscripten_bind_Mesh_num_points_0=a.asm.S).apply(null,arguments)},Ab=a._emscripten_bind_Mesh___destroy___0=function(){return(Ab=a._emscripten_bind_Mesh___destroy___0=a.asm.T).apply(null,arguments)},Ha=a._emscripten_bind_Metadata_Metadata_0=function(){return(Ha=a._emscripten_bind_Metadata_Metadata_0=a.asm.U).apply(null,arguments)},Bb=a._emscripten_bind_Metadata___destroy___0=function(){return(Bb=a._emscripten_bind_Metadata___destroy___0= +a.asm.V).apply(null,arguments)},Cb=a._emscripten_bind_Status_code_0=function(){return(Cb=a._emscripten_bind_Status_code_0=a.asm.W).apply(null,arguments)},Db=a._emscripten_bind_Status_ok_0=function(){return(Db=a._emscripten_bind_Status_ok_0=a.asm.X).apply(null,arguments)},Eb=a._emscripten_bind_Status_error_msg_0=function(){return(Eb=a._emscripten_bind_Status_error_msg_0=a.asm.Y).apply(null,arguments)},Fb=a._emscripten_bind_Status___destroy___0=function(){return(Fb=a._emscripten_bind_Status___destroy___0= +a.asm.Z).apply(null,arguments)},Ia=a._emscripten_bind_DracoFloat32Array_DracoFloat32Array_0=function(){return(Ia=a._emscripten_bind_DracoFloat32Array_DracoFloat32Array_0=a.asm._).apply(null,arguments)},Gb=a._emscripten_bind_DracoFloat32Array_GetValue_1=function(){return(Gb=a._emscripten_bind_DracoFloat32Array_GetValue_1=a.asm.$).apply(null,arguments)},Hb=a._emscripten_bind_DracoFloat32Array_size_0=function(){return(Hb=a._emscripten_bind_DracoFloat32Array_size_0=a.asm.aa).apply(null,arguments)},Ib= +a._emscripten_bind_DracoFloat32Array___destroy___0=function(){return(Ib=a._emscripten_bind_DracoFloat32Array___destroy___0=a.asm.ba).apply(null,arguments)},Ja=a._emscripten_bind_DracoInt8Array_DracoInt8Array_0=function(){return(Ja=a._emscripten_bind_DracoInt8Array_DracoInt8Array_0=a.asm.ca).apply(null,arguments)},Jb=a._emscripten_bind_DracoInt8Array_GetValue_1=function(){return(Jb=a._emscripten_bind_DracoInt8Array_GetValue_1=a.asm.da).apply(null,arguments)},Kb=a._emscripten_bind_DracoInt8Array_size_0= +function(){return(Kb=a._emscripten_bind_DracoInt8Array_size_0=a.asm.ea).apply(null,arguments)},Lb=a._emscripten_bind_DracoInt8Array___destroy___0=function(){return(Lb=a._emscripten_bind_DracoInt8Array___destroy___0=a.asm.fa).apply(null,arguments)},Ka=a._emscripten_bind_DracoUInt8Array_DracoUInt8Array_0=function(){return(Ka=a._emscripten_bind_DracoUInt8Array_DracoUInt8Array_0=a.asm.ga).apply(null,arguments)},Mb=a._emscripten_bind_DracoUInt8Array_GetValue_1=function(){return(Mb=a._emscripten_bind_DracoUInt8Array_GetValue_1= +a.asm.ha).apply(null,arguments)},Nb=a._emscripten_bind_DracoUInt8Array_size_0=function(){return(Nb=a._emscripten_bind_DracoUInt8Array_size_0=a.asm.ia).apply(null,arguments)},Ob=a._emscripten_bind_DracoUInt8Array___destroy___0=function(){return(Ob=a._emscripten_bind_DracoUInt8Array___destroy___0=a.asm.ja).apply(null,arguments)},La=a._emscripten_bind_DracoInt16Array_DracoInt16Array_0=function(){return(La=a._emscripten_bind_DracoInt16Array_DracoInt16Array_0=a.asm.ka).apply(null,arguments)},Pb=a._emscripten_bind_DracoInt16Array_GetValue_1= +function(){return(Pb=a._emscripten_bind_DracoInt16Array_GetValue_1=a.asm.la).apply(null,arguments)},Qb=a._emscripten_bind_DracoInt16Array_size_0=function(){return(Qb=a._emscripten_bind_DracoInt16Array_size_0=a.asm.ma).apply(null,arguments)},Rb=a._emscripten_bind_DracoInt16Array___destroy___0=function(){return(Rb=a._emscripten_bind_DracoInt16Array___destroy___0=a.asm.na).apply(null,arguments)},Ma=a._emscripten_bind_DracoUInt16Array_DracoUInt16Array_0=function(){return(Ma=a._emscripten_bind_DracoUInt16Array_DracoUInt16Array_0= +a.asm.oa).apply(null,arguments)},Sb=a._emscripten_bind_DracoUInt16Array_GetValue_1=function(){return(Sb=a._emscripten_bind_DracoUInt16Array_GetValue_1=a.asm.pa).apply(null,arguments)},Tb=a._emscripten_bind_DracoUInt16Array_size_0=function(){return(Tb=a._emscripten_bind_DracoUInt16Array_size_0=a.asm.qa).apply(null,arguments)},Ub=a._emscripten_bind_DracoUInt16Array___destroy___0=function(){return(Ub=a._emscripten_bind_DracoUInt16Array___destroy___0=a.asm.ra).apply(null,arguments)},Na=a._emscripten_bind_DracoInt32Array_DracoInt32Array_0= +function(){return(Na=a._emscripten_bind_DracoInt32Array_DracoInt32Array_0=a.asm.sa).apply(null,arguments)},Vb=a._emscripten_bind_DracoInt32Array_GetValue_1=function(){return(Vb=a._emscripten_bind_DracoInt32Array_GetValue_1=a.asm.ta).apply(null,arguments)},Wb=a._emscripten_bind_DracoInt32Array_size_0=function(){return(Wb=a._emscripten_bind_DracoInt32Array_size_0=a.asm.ua).apply(null,arguments)},Xb=a._emscripten_bind_DracoInt32Array___destroy___0=function(){return(Xb=a._emscripten_bind_DracoInt32Array___destroy___0= +a.asm.va).apply(null,arguments)},Oa=a._emscripten_bind_DracoUInt32Array_DracoUInt32Array_0=function(){return(Oa=a._emscripten_bind_DracoUInt32Array_DracoUInt32Array_0=a.asm.wa).apply(null,arguments)},Yb=a._emscripten_bind_DracoUInt32Array_GetValue_1=function(){return(Yb=a._emscripten_bind_DracoUInt32Array_GetValue_1=a.asm.xa).apply(null,arguments)},Zb=a._emscripten_bind_DracoUInt32Array_size_0=function(){return(Zb=a._emscripten_bind_DracoUInt32Array_size_0=a.asm.ya).apply(null,arguments)},$b=a._emscripten_bind_DracoUInt32Array___destroy___0= +function(){return($b=a._emscripten_bind_DracoUInt32Array___destroy___0=a.asm.za).apply(null,arguments)},Pa=a._emscripten_bind_MetadataQuerier_MetadataQuerier_0=function(){return(Pa=a._emscripten_bind_MetadataQuerier_MetadataQuerier_0=a.asm.Aa).apply(null,arguments)},ac=a._emscripten_bind_MetadataQuerier_HasEntry_2=function(){return(ac=a._emscripten_bind_MetadataQuerier_HasEntry_2=a.asm.Ba).apply(null,arguments)},bc=a._emscripten_bind_MetadataQuerier_GetIntEntry_2=function(){return(bc=a._emscripten_bind_MetadataQuerier_GetIntEntry_2= +a.asm.Ca).apply(null,arguments)},cc=a._emscripten_bind_MetadataQuerier_GetIntEntryArray_3=function(){return(cc=a._emscripten_bind_MetadataQuerier_GetIntEntryArray_3=a.asm.Da).apply(null,arguments)},dc=a._emscripten_bind_MetadataQuerier_GetDoubleEntry_2=function(){return(dc=a._emscripten_bind_MetadataQuerier_GetDoubleEntry_2=a.asm.Ea).apply(null,arguments)},ec=a._emscripten_bind_MetadataQuerier_GetStringEntry_2=function(){return(ec=a._emscripten_bind_MetadataQuerier_GetStringEntry_2=a.asm.Fa).apply(null, +arguments)},fc=a._emscripten_bind_MetadataQuerier_NumEntries_1=function(){return(fc=a._emscripten_bind_MetadataQuerier_NumEntries_1=a.asm.Ga).apply(null,arguments)},gc=a._emscripten_bind_MetadataQuerier_GetEntryName_2=function(){return(gc=a._emscripten_bind_MetadataQuerier_GetEntryName_2=a.asm.Ha).apply(null,arguments)},hc=a._emscripten_bind_MetadataQuerier___destroy___0=function(){return(hc=a._emscripten_bind_MetadataQuerier___destroy___0=a.asm.Ia).apply(null,arguments)},Qa=a._emscripten_bind_Decoder_Decoder_0= +function(){return(Qa=a._emscripten_bind_Decoder_Decoder_0=a.asm.Ja).apply(null,arguments)},ic=a._emscripten_bind_Decoder_DecodeArrayToPointCloud_3=function(){return(ic=a._emscripten_bind_Decoder_DecodeArrayToPointCloud_3=a.asm.Ka).apply(null,arguments)},jc=a._emscripten_bind_Decoder_DecodeArrayToMesh_3=function(){return(jc=a._emscripten_bind_Decoder_DecodeArrayToMesh_3=a.asm.La).apply(null,arguments)},kc=a._emscripten_bind_Decoder_GetAttributeId_2=function(){return(kc=a._emscripten_bind_Decoder_GetAttributeId_2= +a.asm.Ma).apply(null,arguments)},lc=a._emscripten_bind_Decoder_GetAttributeIdByName_2=function(){return(lc=a._emscripten_bind_Decoder_GetAttributeIdByName_2=a.asm.Na).apply(null,arguments)},mc=a._emscripten_bind_Decoder_GetAttributeIdByMetadataEntry_3=function(){return(mc=a._emscripten_bind_Decoder_GetAttributeIdByMetadataEntry_3=a.asm.Oa).apply(null,arguments)},nc=a._emscripten_bind_Decoder_GetAttribute_2=function(){return(nc=a._emscripten_bind_Decoder_GetAttribute_2=a.asm.Pa).apply(null,arguments)}, +oc=a._emscripten_bind_Decoder_GetAttributeByUniqueId_2=function(){return(oc=a._emscripten_bind_Decoder_GetAttributeByUniqueId_2=a.asm.Qa).apply(null,arguments)},pc=a._emscripten_bind_Decoder_GetMetadata_1=function(){return(pc=a._emscripten_bind_Decoder_GetMetadata_1=a.asm.Ra).apply(null,arguments)},qc=a._emscripten_bind_Decoder_GetAttributeMetadata_2=function(){return(qc=a._emscripten_bind_Decoder_GetAttributeMetadata_2=a.asm.Sa).apply(null,arguments)},rc=a._emscripten_bind_Decoder_GetFaceFromMesh_3= +function(){return(rc=a._emscripten_bind_Decoder_GetFaceFromMesh_3=a.asm.Ta).apply(null,arguments)},sc=a._emscripten_bind_Decoder_GetTriangleStripsFromMesh_2=function(){return(sc=a._emscripten_bind_Decoder_GetTriangleStripsFromMesh_2=a.asm.Ua).apply(null,arguments)},tc=a._emscripten_bind_Decoder_GetTrianglesUInt16Array_3=function(){return(tc=a._emscripten_bind_Decoder_GetTrianglesUInt16Array_3=a.asm.Va).apply(null,arguments)},uc=a._emscripten_bind_Decoder_GetTrianglesUInt32Array_3=function(){return(uc= +a._emscripten_bind_Decoder_GetTrianglesUInt32Array_3=a.asm.Wa).apply(null,arguments)},vc=a._emscripten_bind_Decoder_GetAttributeFloat_3=function(){return(vc=a._emscripten_bind_Decoder_GetAttributeFloat_3=a.asm.Xa).apply(null,arguments)},wc=a._emscripten_bind_Decoder_GetAttributeFloatForAllPoints_3=function(){return(wc=a._emscripten_bind_Decoder_GetAttributeFloatForAllPoints_3=a.asm.Ya).apply(null,arguments)},xc=a._emscripten_bind_Decoder_GetAttributeIntForAllPoints_3=function(){return(xc=a._emscripten_bind_Decoder_GetAttributeIntForAllPoints_3= +a.asm.Za).apply(null,arguments)},yc=a._emscripten_bind_Decoder_GetAttributeInt8ForAllPoints_3=function(){return(yc=a._emscripten_bind_Decoder_GetAttributeInt8ForAllPoints_3=a.asm._a).apply(null,arguments)},zc=a._emscripten_bind_Decoder_GetAttributeUInt8ForAllPoints_3=function(){return(zc=a._emscripten_bind_Decoder_GetAttributeUInt8ForAllPoints_3=a.asm.$a).apply(null,arguments)},Ac=a._emscripten_bind_Decoder_GetAttributeInt16ForAllPoints_3=function(){return(Ac=a._emscripten_bind_Decoder_GetAttributeInt16ForAllPoints_3= +a.asm.ab).apply(null,arguments)},Bc=a._emscripten_bind_Decoder_GetAttributeUInt16ForAllPoints_3=function(){return(Bc=a._emscripten_bind_Decoder_GetAttributeUInt16ForAllPoints_3=a.asm.bb).apply(null,arguments)},Cc=a._emscripten_bind_Decoder_GetAttributeInt32ForAllPoints_3=function(){return(Cc=a._emscripten_bind_Decoder_GetAttributeInt32ForAllPoints_3=a.asm.cb).apply(null,arguments)},Dc=a._emscripten_bind_Decoder_GetAttributeUInt32ForAllPoints_3=function(){return(Dc=a._emscripten_bind_Decoder_GetAttributeUInt32ForAllPoints_3= +a.asm.db).apply(null,arguments)},Ec=a._emscripten_bind_Decoder_GetAttributeDataArrayForAllPoints_5=function(){return(Ec=a._emscripten_bind_Decoder_GetAttributeDataArrayForAllPoints_5=a.asm.eb).apply(null,arguments)},Fc=a._emscripten_bind_Decoder_SkipAttributeTransform_1=function(){return(Fc=a._emscripten_bind_Decoder_SkipAttributeTransform_1=a.asm.fb).apply(null,arguments)},Gc=a._emscripten_bind_Decoder_GetEncodedGeometryType_Deprecated_1=function(){return(Gc=a._emscripten_bind_Decoder_GetEncodedGeometryType_Deprecated_1= +a.asm.gb).apply(null,arguments)},Hc=a._emscripten_bind_Decoder_DecodeBufferToPointCloud_2=function(){return(Hc=a._emscripten_bind_Decoder_DecodeBufferToPointCloud_2=a.asm.hb).apply(null,arguments)},Ic=a._emscripten_bind_Decoder_DecodeBufferToMesh_2=function(){return(Ic=a._emscripten_bind_Decoder_DecodeBufferToMesh_2=a.asm.ib).apply(null,arguments)},Jc=a._emscripten_bind_Decoder___destroy___0=function(){return(Jc=a._emscripten_bind_Decoder___destroy___0=a.asm.jb).apply(null,arguments)},Kc=a._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_INVALID_TRANSFORM= +function(){return(Kc=a._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_INVALID_TRANSFORM=a.asm.kb).apply(null,arguments)},Lc=a._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_NO_TRANSFORM=function(){return(Lc=a._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_NO_TRANSFORM=a.asm.lb).apply(null,arguments)},Mc=a._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_QUANTIZATION_TRANSFORM=function(){return(Mc=a._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_QUANTIZATION_TRANSFORM= +a.asm.mb).apply(null,arguments)},Nc=a._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_OCTAHEDRON_TRANSFORM=function(){return(Nc=a._emscripten_enum_draco_AttributeTransformType_ATTRIBUTE_OCTAHEDRON_TRANSFORM=a.asm.nb).apply(null,arguments)},Oc=a._emscripten_enum_draco_GeometryAttribute_Type_INVALID=function(){return(Oc=a._emscripten_enum_draco_GeometryAttribute_Type_INVALID=a.asm.ob).apply(null,arguments)},Pc=a._emscripten_enum_draco_GeometryAttribute_Type_POSITION=function(){return(Pc=a._emscripten_enum_draco_GeometryAttribute_Type_POSITION= +a.asm.pb).apply(null,arguments)},Qc=a._emscripten_enum_draco_GeometryAttribute_Type_NORMAL=function(){return(Qc=a._emscripten_enum_draco_GeometryAttribute_Type_NORMAL=a.asm.qb).apply(null,arguments)},Rc=a._emscripten_enum_draco_GeometryAttribute_Type_COLOR=function(){return(Rc=a._emscripten_enum_draco_GeometryAttribute_Type_COLOR=a.asm.rb).apply(null,arguments)},Sc=a._emscripten_enum_draco_GeometryAttribute_Type_TEX_COORD=function(){return(Sc=a._emscripten_enum_draco_GeometryAttribute_Type_TEX_COORD= +a.asm.sb).apply(null,arguments)},Tc=a._emscripten_enum_draco_GeometryAttribute_Type_GENERIC=function(){return(Tc=a._emscripten_enum_draco_GeometryAttribute_Type_GENERIC=a.asm.tb).apply(null,arguments)},Uc=a._emscripten_enum_draco_EncodedGeometryType_INVALID_GEOMETRY_TYPE=function(){return(Uc=a._emscripten_enum_draco_EncodedGeometryType_INVALID_GEOMETRY_TYPE=a.asm.ub).apply(null,arguments)},Vc=a._emscripten_enum_draco_EncodedGeometryType_POINT_CLOUD=function(){return(Vc=a._emscripten_enum_draco_EncodedGeometryType_POINT_CLOUD= +a.asm.vb).apply(null,arguments)},Wc=a._emscripten_enum_draco_EncodedGeometryType_TRIANGULAR_MESH=function(){return(Wc=a._emscripten_enum_draco_EncodedGeometryType_TRIANGULAR_MESH=a.asm.wb).apply(null,arguments)},Xc=a._emscripten_enum_draco_DataType_DT_INVALID=function(){return(Xc=a._emscripten_enum_draco_DataType_DT_INVALID=a.asm.xb).apply(null,arguments)},Yc=a._emscripten_enum_draco_DataType_DT_INT8=function(){return(Yc=a._emscripten_enum_draco_DataType_DT_INT8=a.asm.yb).apply(null,arguments)},Zc= +a._emscripten_enum_draco_DataType_DT_UINT8=function(){return(Zc=a._emscripten_enum_draco_DataType_DT_UINT8=a.asm.zb).apply(null,arguments)},$c=a._emscripten_enum_draco_DataType_DT_INT16=function(){return($c=a._emscripten_enum_draco_DataType_DT_INT16=a.asm.Ab).apply(null,arguments)},ad=a._emscripten_enum_draco_DataType_DT_UINT16=function(){return(ad=a._emscripten_enum_draco_DataType_DT_UINT16=a.asm.Bb).apply(null,arguments)},bd=a._emscripten_enum_draco_DataType_DT_INT32=function(){return(bd=a._emscripten_enum_draco_DataType_DT_INT32= +a.asm.Cb).apply(null,arguments)},cd=a._emscripten_enum_draco_DataType_DT_UINT32=function(){return(cd=a._emscripten_enum_draco_DataType_DT_UINT32=a.asm.Db).apply(null,arguments)},dd=a._emscripten_enum_draco_DataType_DT_INT64=function(){return(dd=a._emscripten_enum_draco_DataType_DT_INT64=a.asm.Eb).apply(null,arguments)},ed=a._emscripten_enum_draco_DataType_DT_UINT64=function(){return(ed=a._emscripten_enum_draco_DataType_DT_UINT64=a.asm.Fb).apply(null,arguments)},fd=a._emscripten_enum_draco_DataType_DT_FLOAT32= +function(){return(fd=a._emscripten_enum_draco_DataType_DT_FLOAT32=a.asm.Gb).apply(null,arguments)},gd=a._emscripten_enum_draco_DataType_DT_FLOAT64=function(){return(gd=a._emscripten_enum_draco_DataType_DT_FLOAT64=a.asm.Hb).apply(null,arguments)},hd=a._emscripten_enum_draco_DataType_DT_BOOL=function(){return(hd=a._emscripten_enum_draco_DataType_DT_BOOL=a.asm.Ib).apply(null,arguments)},id=a._emscripten_enum_draco_DataType_DT_TYPES_COUNT=function(){return(id=a._emscripten_enum_draco_DataType_DT_TYPES_COUNT= +a.asm.Jb).apply(null,arguments)},jd=a._emscripten_enum_draco_StatusCode_OK=function(){return(jd=a._emscripten_enum_draco_StatusCode_OK=a.asm.Kb).apply(null,arguments)},kd=a._emscripten_enum_draco_StatusCode_DRACO_ERROR=function(){return(kd=a._emscripten_enum_draco_StatusCode_DRACO_ERROR=a.asm.Lb).apply(null,arguments)},ld=a._emscripten_enum_draco_StatusCode_IO_ERROR=function(){return(ld=a._emscripten_enum_draco_StatusCode_IO_ERROR=a.asm.Mb).apply(null,arguments)},md=a._emscripten_enum_draco_StatusCode_INVALID_PARAMETER= +function(){return(md=a._emscripten_enum_draco_StatusCode_INVALID_PARAMETER=a.asm.Nb).apply(null,arguments)},nd=a._emscripten_enum_draco_StatusCode_UNSUPPORTED_VERSION=function(){return(nd=a._emscripten_enum_draco_StatusCode_UNSUPPORTED_VERSION=a.asm.Ob).apply(null,arguments)},od=a._emscripten_enum_draco_StatusCode_UNKNOWN_VERSION=function(){return(od=a._emscripten_enum_draco_StatusCode_UNKNOWN_VERSION=a.asm.Pb).apply(null,arguments)};a._malloc=function(){return(a._malloc=a.asm.Qb).apply(null,arguments)}; +a._free=function(){return(a._free=a.asm.Rb).apply(null,arguments)};var ua=function(){return(ua=a.asm.Sb).apply(null,arguments)};a.___start_em_js=11660;a.___stop_em_js=11758;var la;ha=function b(){la||F();la||(ha=b)};if(a.preInit)for("function"==typeof a.preInit&&(a.preInit=[a.preInit]);0=r.size?(0>>=0;switch(c.BYTES_PER_ELEMENT){case 2:d>>>=1;break;case 4:d>>>=2;break;case 8:d>>>=3}for(var g=0;gb.byteLength)return a.INVALID_GEOMETRY_TYPE;switch(b[7]){case 0:return a.POINT_CLOUD;case 1:return a.TRIANGULAR_MESH;default:return a.INVALID_GEOMETRY_TYPE}};return n.ready}}();"object"===typeof exports&&"object"===typeof module?module.exports=DracoDecoderModule:"function"===typeof define&&define.amd?define([],function(){return DracoDecoderModule}):"object"===typeof exports&&(exports.DracoDecoderModule=DracoDecoderModule); \ No newline at end of file diff --git a/public/bblcdn/msc_basis_transcoder.js b/public/bblcdn/msc_basis_transcoder.js new file mode 100644 index 0000000..b04e598 --- /dev/null +++ b/public/bblcdn/msc_basis_transcoder.js @@ -0,0 +1,21 @@ + +var MSC_TRANSCODER = (function() { + var _scriptDir = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : undefined; + if (typeof __filename !== 'undefined') _scriptDir = _scriptDir || __filename; + return ( +function(MSC_TRANSCODER) { + MSC_TRANSCODER = MSC_TRANSCODER || {}; + +var Module=typeof MSC_TRANSCODER!=="undefined"?MSC_TRANSCODER:{};var readyPromiseResolve,readyPromiseReject;Module["ready"]=new Promise(function(resolve,reject){readyPromiseResolve=resolve;readyPromiseReject=reject});var moduleOverrides={};var key;for(key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}var arguments_=[];var thisProgram="./this.program";var quit_=function(status,toThrow){throw toThrow};var ENVIRONMENT_IS_WEB=false;var ENVIRONMENT_IS_WORKER=false;var ENVIRONMENT_IS_NODE=false;var ENVIRONMENT_IS_SHELL=false;ENVIRONMENT_IS_WEB=typeof window==="object";ENVIRONMENT_IS_WORKER=typeof importScripts==="function";ENVIRONMENT_IS_NODE=typeof process==="object"&&typeof process.versions==="object"&&typeof process.versions.node==="string";ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER;var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var read_,readAsync,readBinary,setWindowTitle;var nodeFS;var nodePath;if(ENVIRONMENT_IS_NODE){if(ENVIRONMENT_IS_WORKER){scriptDirectory=require("path").dirname(scriptDirectory)+"/"}else{scriptDirectory=__dirname+"/"}read_=function shell_read(filename,binary){if(!nodeFS)nodeFS=require("fs");if(!nodePath)nodePath=require("path");filename=nodePath["normalize"](filename);return nodeFS["readFileSync"](filename,binary?null:"utf8")};readBinary=function readBinary(filename){var ret=read_(filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}assert(ret.buffer);return ret};if(process["argv"].length>1){thisProgram=process["argv"][1].replace(/\\/g,"/")}arguments_=process["argv"].slice(2);process["on"]("uncaughtException",function(ex){if(!(ex instanceof ExitStatus)){throw ex}});process["on"]("unhandledRejection",abort);quit_=function(status){process["exit"](status)};Module["inspect"]=function(){return"[Emscripten Module object]"}}else if(ENVIRONMENT_IS_SHELL){if(typeof read!="undefined"){read_=function shell_read(f){return read(f)}}readBinary=function readBinary(f){var data;if(typeof readbuffer==="function"){return new Uint8Array(readbuffer(f))}data=read(f,"binary");assert(typeof data==="object");return data};if(typeof scriptArgs!="undefined"){arguments_=scriptArgs}else if(typeof arguments!="undefined"){arguments_=arguments}if(typeof quit==="function"){quit_=function(status){quit(status)}}if(typeof print!=="undefined"){if(typeof console==="undefined")console={};console.log=print;console.warn=console.error=typeof printErr!=="undefined"?printErr:print}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!=="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(_scriptDir){scriptDirectory=_scriptDir}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.lastIndexOf("/")+1)}else{scriptDirectory=""}{read_=function(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){readBinary=function(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=function(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=function(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)}}setWindowTitle=function(title){document.title=title}}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.warn.bind(console);for(key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];var tempRet0=0;var setTempRet0=function(value){tempRet0=value};var wasmBinary;if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];var noExitRuntime=Module["noExitRuntime"]||true;if(typeof WebAssembly!=="object"){abort("no native wasm support detected")}var wasmMemory;var ABORT=false;var EXITSTATUS;function assert(condition,text){if(!condition){abort("Assertion failed: "+text)}}var UTF8Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf8"):undefined;function UTF8ArrayToString(heap,idx,maxBytesToRead){var endIdx=idx+maxBytesToRead;var endPtr=idx;while(heap[endPtr]&&!(endPtr>=endIdx))++endPtr;if(endPtr-idx>16&&heap.subarray&&UTF8Decoder){return UTF8Decoder.decode(heap.subarray(idx,endPtr))}else{var str="";while(idx>10,56320|ch&1023)}}}return str}function UTF8ToString(ptr,maxBytesToRead){return ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):""}function stringToUTF8Array(str,heap,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}function lengthBytesUTF8(str){var len=0;for(var i=0;i=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127)++len;else if(u<=2047)len+=2;else if(u<=65535)len+=3;else len+=4}return len}var UTF16Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf-16le"):undefined;function UTF16ToString(ptr,maxBytesToRead){var endPtr=ptr;var idx=endPtr>>1;var maxIdx=idx+maxBytesToRead/2;while(!(idx>=maxIdx)&&HEAPU16[idx])++idx;endPtr=idx<<1;if(endPtr-ptr>32&&UTF16Decoder){return UTF16Decoder.decode(HEAPU8.subarray(ptr,endPtr))}else{var str="";for(var i=0;!(i>=maxBytesToRead/2);++i){var codeUnit=HEAP16[ptr+i*2>>1];if(codeUnit==0)break;str+=String.fromCharCode(codeUnit)}return str}}function stringToUTF16(str,outPtr,maxBytesToWrite){if(maxBytesToWrite===undefined){maxBytesToWrite=2147483647}if(maxBytesToWrite<2)return 0;maxBytesToWrite-=2;var startPtr=outPtr;var numCharsToWrite=maxBytesToWrite>1]=codeUnit;outPtr+=2}HEAP16[outPtr>>1]=0;return outPtr-startPtr}function lengthBytesUTF16(str){return str.length*2}function UTF32ToString(ptr,maxBytesToRead){var i=0;var str="";while(!(i>=maxBytesToRead/4)){var utf32=HEAP32[ptr+i*4>>2];if(utf32==0)break;++i;if(utf32>=65536){var ch=utf32-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}else{str+=String.fromCharCode(utf32)}}return str}function stringToUTF32(str,outPtr,maxBytesToWrite){if(maxBytesToWrite===undefined){maxBytesToWrite=2147483647}if(maxBytesToWrite<4)return 0;var startPtr=outPtr;var endPtr=startPtr+maxBytesToWrite-4;for(var i=0;i=55296&&codeUnit<=57343){var trailSurrogate=str.charCodeAt(++i);codeUnit=65536+((codeUnit&1023)<<10)|trailSurrogate&1023}HEAP32[outPtr>>2]=codeUnit;outPtr+=4;if(outPtr+4>endPtr)break}HEAP32[outPtr>>2]=0;return outPtr-startPtr}function lengthBytesUTF32(str){var len=0;for(var i=0;i=55296&&codeUnit<=57343)++i;len+=4}return len}function alignUp(x,multiple){if(x%multiple>0){x+=multiple-x%multiple}return x}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBufferAndViews(buf){buffer=buf;Module["HEAP8"]=HEAP8=new Int8Array(buf);Module["HEAP16"]=HEAP16=new Int16Array(buf);Module["HEAP32"]=HEAP32=new Int32Array(buf);Module["HEAPU8"]=HEAPU8=new Uint8Array(buf);Module["HEAPU16"]=HEAPU16=new Uint16Array(buf);Module["HEAPU32"]=HEAPU32=new Uint32Array(buf);Module["HEAPF32"]=HEAPF32=new Float32Array(buf);Module["HEAPF64"]=HEAPF64=new Float64Array(buf)}var INITIAL_MEMORY=Module["INITIAL_MEMORY"]||16777216;var wasmTable;var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;__ATINIT__.push({func:function(){___wasm_call_ctors()}});function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module["preloadedImages"]={};Module["preloadedAudios"]={};function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}what+="";err(what);ABORT=true;EXITSTATUS=1;what="abort("+what+"). Build with -s ASSERTIONS=1 for more info.";var e=new WebAssembly.RuntimeError(what);readyPromiseReject(e);throw e}function hasPrefix(str,prefix){return String.prototype.startsWith?str.startsWith(prefix):str.indexOf(prefix)===0}var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return hasPrefix(filename,dataURIPrefix)}var fileURIPrefix="file://";function isFileURI(filename){return hasPrefix(filename,fileURIPrefix)}var wasmBinaryFile="msc_basis_transcoder.wasm";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinary(file){try{if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}else{throw"both async and sync fetching of the wasm failed"}}catch(err){abort(err)}}function getBinaryPromise(){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)){if(typeof fetch==="function"&&!isFileURI(wasmBinaryFile)){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){if(!response["ok"]){throw"failed to load wasm binary file at '"+wasmBinaryFile+"'"}return response["arrayBuffer"]()}).catch(function(){return getBinary(wasmBinaryFile)})}else{if(readAsync){return new Promise(function(resolve,reject){readAsync(wasmBinaryFile,function(response){resolve(new Uint8Array(response))},reject)})}}}return Promise.resolve().then(function(){return getBinary(wasmBinaryFile)})}function createWasm(){var info={"a":asmLibraryArg};function receiveInstance(instance,module){var exports=instance.exports;Module["asm"]=exports;wasmMemory=Module["asm"]["L"];updateGlobalBufferAndViews(wasmMemory.buffer);wasmTable=Module["asm"]["O"];removeRunDependency("wasm-instantiate")}addRunDependency("wasm-instantiate");function receiveInstantiatedSource(output){receiveInstance(output["instance"])}function instantiateArrayBuffer(receiver){return getBinaryPromise().then(function(binary){return WebAssembly.instantiate(binary,info)}).then(receiver,function(reason){err("failed to asynchronously prepare wasm: "+reason);abort(reason)})}function instantiateAsync(){if(!wasmBinary&&typeof WebAssembly.instantiateStreaming==="function"&&!isDataURI(wasmBinaryFile)&&!isFileURI(wasmBinaryFile)&&typeof fetch==="function"){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){var result=WebAssembly.instantiateStreaming(response,info);return result.then(receiveInstantiatedSource,function(reason){err("wasm streaming compile failed: "+reason);err("falling back to ArrayBuffer instantiation");return instantiateArrayBuffer(receiveInstantiatedSource)})})}else{return instantiateArrayBuffer(receiveInstantiatedSource)}}if(Module["instantiateWasm"]){try{var exports=Module["instantiateWasm"](info,receiveInstance);return exports}catch(e){err("Module.instantiateWasm callback failed with error: "+e);return false}}instantiateAsync().catch(readyPromiseReject);return{}}function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback=="function"){callback(Module);continue}var func=callback.func;if(typeof func==="number"){if(callback.arg===undefined){wasmTable.get(func)()}else{wasmTable.get(func)(callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}function ___assert_fail(condition,filename,line,func){abort("Assertion failed: "+UTF8ToString(condition)+", at: "+[filename?UTF8ToString(filename):"unknown filename",line,func?UTF8ToString(func):"unknown function"])}function getShiftFromSize(size){switch(size){case 1:return 0;case 2:return 1;case 4:return 2;case 8:return 3;default:throw new TypeError("Unknown type size: "+size)}}function embind_init_charCodes(){var codes=new Array(256);for(var i=0;i<256;++i){codes[i]=String.fromCharCode(i)}embind_charCodes=codes}var embind_charCodes=undefined;function readLatin1String(ptr){var ret="";var c=ptr;while(HEAPU8[c]){ret+=embind_charCodes[HEAPU8[c++]]}return ret}var awaitingDependencies={};var registeredTypes={};var typeDependencies={};var char_0=48;var char_9=57;function makeLegalFunctionName(name){if(undefined===name){return"_unknown"}name=name.replace(/[^a-zA-Z0-9_]/g,"$");var f=name.charCodeAt(0);if(f>=char_0&&f<=char_9){return"_"+name}else{return name}}function createNamedFunction(name,body){name=makeLegalFunctionName(name);return new Function("body","return function "+name+"() {\n"+' "use strict";'+" return body.apply(this, arguments);\n"+"};\n")(body)}function extendError(baseErrorType,errorName){var errorClass=createNamedFunction(errorName,function(message){this.name=errorName;this.message=message;var stack=new Error(message).stack;if(stack!==undefined){this.stack=this.toString()+"\n"+stack.replace(/^Error(:[^\n]*)?\n/,"")}});errorClass.prototype=Object.create(baseErrorType.prototype);errorClass.prototype.constructor=errorClass;errorClass.prototype.toString=function(){if(this.message===undefined){return this.name}else{return this.name+": "+this.message}};return errorClass}var BindingError=undefined;function throwBindingError(message){throw new BindingError(message)}var InternalError=undefined;function throwInternalError(message){throw new InternalError(message)}function whenDependentTypesAreResolved(myTypes,dependentTypes,getTypeConverters){myTypes.forEach(function(type){typeDependencies[type]=dependentTypes});function onComplete(typeConverters){var myTypeConverters=getTypeConverters(typeConverters);if(myTypeConverters.length!==myTypes.length){throwInternalError("Mismatched type converter count")}for(var i=0;i>shift])},destructorFunction:null})}function ClassHandle_isAliasOf(other){if(!(this instanceof ClassHandle)){return false}if(!(other instanceof ClassHandle)){return false}var leftClass=this.$$.ptrType.registeredClass;var left=this.$$.ptr;var rightClass=other.$$.ptrType.registeredClass;var right=other.$$.ptr;while(leftClass.baseClass){left=leftClass.upcast(left);leftClass=leftClass.baseClass}while(rightClass.baseClass){right=rightClass.upcast(right);rightClass=rightClass.baseClass}return leftClass===rightClass&&left===right}function shallowCopyInternalPointer(o){return{count:o.count,deleteScheduled:o.deleteScheduled,preservePointerOnDelete:o.preservePointerOnDelete,ptr:o.ptr,ptrType:o.ptrType,smartPtr:o.smartPtr,smartPtrType:o.smartPtrType}}function throwInstanceAlreadyDeleted(obj){function getInstanceTypeName(handle){return handle.$$.ptrType.registeredClass.name}throwBindingError(getInstanceTypeName(obj)+" instance already deleted")}var finalizationGroup=false;function detachFinalizer(handle){}function runDestructor($$){if($$.smartPtr){$$.smartPtrType.rawDestructor($$.smartPtr)}else{$$.ptrType.registeredClass.rawDestructor($$.ptr)}}function releaseClassHandle($$){$$.count.value-=1;var toDelete=0===$$.count.value;if(toDelete){runDestructor($$)}}function attachFinalizer(handle){if("undefined"===typeof FinalizationGroup){attachFinalizer=function(handle){return handle};return handle}finalizationGroup=new FinalizationGroup(function(iter){for(var result=iter.next();!result.done;result=iter.next()){var $$=result.value;if(!$$.ptr){console.warn("object already deleted: "+$$.ptr)}else{releaseClassHandle($$)}}});attachFinalizer=function(handle){finalizationGroup.register(handle,handle.$$,handle.$$);return handle};detachFinalizer=function(handle){finalizationGroup.unregister(handle.$$)};return attachFinalizer(handle)}function ClassHandle_clone(){if(!this.$$.ptr){throwInstanceAlreadyDeleted(this)}if(this.$$.preservePointerOnDelete){this.$$.count.value+=1;return this}else{var clone=attachFinalizer(Object.create(Object.getPrototypeOf(this),{$$:{value:shallowCopyInternalPointer(this.$$)}}));clone.$$.count.value+=1;clone.$$.deleteScheduled=false;return clone}}function ClassHandle_delete(){if(!this.$$.ptr){throwInstanceAlreadyDeleted(this)}if(this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete){throwBindingError("Object already scheduled for deletion")}detachFinalizer(this);releaseClassHandle(this.$$);if(!this.$$.preservePointerOnDelete){this.$$.smartPtr=undefined;this.$$.ptr=undefined}}function ClassHandle_isDeleted(){return!this.$$.ptr}var delayFunction=undefined;var deletionQueue=[];function flushPendingDeletes(){while(deletionQueue.length){var obj=deletionQueue.pop();obj.$$.deleteScheduled=false;obj["delete"]()}}function ClassHandle_deleteLater(){if(!this.$$.ptr){throwInstanceAlreadyDeleted(this)}if(this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete){throwBindingError("Object already scheduled for deletion")}deletionQueue.push(this);if(deletionQueue.length===1&&delayFunction){delayFunction(flushPendingDeletes)}this.$$.deleteScheduled=true;return this}function init_ClassHandle(){ClassHandle.prototype["isAliasOf"]=ClassHandle_isAliasOf;ClassHandle.prototype["clone"]=ClassHandle_clone;ClassHandle.prototype["delete"]=ClassHandle_delete;ClassHandle.prototype["isDeleted"]=ClassHandle_isDeleted;ClassHandle.prototype["deleteLater"]=ClassHandle_deleteLater}function ClassHandle(){}var registeredPointers={};function ensureOverloadTable(proto,methodName,humanName){if(undefined===proto[methodName].overloadTable){var prevFunc=proto[methodName];proto[methodName]=function(){if(!proto[methodName].overloadTable.hasOwnProperty(arguments.length)){throwBindingError("Function '"+humanName+"' called with an invalid number of arguments ("+arguments.length+") - expects one of ("+proto[methodName].overloadTable+")!")}return proto[methodName].overloadTable[arguments.length].apply(this,arguments)};proto[methodName].overloadTable=[];proto[methodName].overloadTable[prevFunc.argCount]=prevFunc}}function exposePublicSymbol(name,value,numArguments){if(Module.hasOwnProperty(name)){if(undefined===numArguments||undefined!==Module[name].overloadTable&&undefined!==Module[name].overloadTable[numArguments]){throwBindingError("Cannot register public name '"+name+"' twice")}ensureOverloadTable(Module,name,name);if(Module.hasOwnProperty(numArguments)){throwBindingError("Cannot register multiple overloads of a function with the same number of arguments ("+numArguments+")!")}Module[name].overloadTable[numArguments]=value}else{Module[name]=value;if(undefined!==numArguments){Module[name].numArguments=numArguments}}}function RegisteredClass(name,constructor,instancePrototype,rawDestructor,baseClass,getActualType,upcast,downcast){this.name=name;this.constructor=constructor;this.instancePrototype=instancePrototype;this.rawDestructor=rawDestructor;this.baseClass=baseClass;this.getActualType=getActualType;this.upcast=upcast;this.downcast=downcast;this.pureVirtualFunctions=[]}function upcastPointer(ptr,ptrClass,desiredClass){while(ptrClass!==desiredClass){if(!ptrClass.upcast){throwBindingError("Expected null or instance of "+desiredClass.name+", got an instance of "+ptrClass.name)}ptr=ptrClass.upcast(ptr);ptrClass=ptrClass.baseClass}return ptr}function constNoSmartPtrRawPointerToWireType(destructors,handle){if(handle===null){if(this.isReference){throwBindingError("null is not a valid "+this.name)}return 0}if(!handle.$$){throwBindingError('Cannot pass "'+_embind_repr(handle)+'" as a '+this.name)}if(!handle.$$.ptr){throwBindingError("Cannot pass deleted object as a pointer of type "+this.name)}var handleClass=handle.$$.ptrType.registeredClass;var ptr=upcastPointer(handle.$$.ptr,handleClass,this.registeredClass);return ptr}function genericPointerToWireType(destructors,handle){var ptr;if(handle===null){if(this.isReference){throwBindingError("null is not a valid "+this.name)}if(this.isSmartPointer){ptr=this.rawConstructor();if(destructors!==null){destructors.push(this.rawDestructor,ptr)}return ptr}else{return 0}}if(!handle.$$){throwBindingError('Cannot pass "'+_embind_repr(handle)+'" as a '+this.name)}if(!handle.$$.ptr){throwBindingError("Cannot pass deleted object as a pointer of type "+this.name)}if(!this.isConst&&handle.$$.ptrType.isConst){throwBindingError("Cannot convert argument of type "+(handle.$$.smartPtrType?handle.$$.smartPtrType.name:handle.$$.ptrType.name)+" to parameter type "+this.name)}var handleClass=handle.$$.ptrType.registeredClass;ptr=upcastPointer(handle.$$.ptr,handleClass,this.registeredClass);if(this.isSmartPointer){if(undefined===handle.$$.smartPtr){throwBindingError("Passing raw pointer to smart pointer is illegal")}switch(this.sharingPolicy){case 0:if(handle.$$.smartPtrType===this){ptr=handle.$$.smartPtr}else{throwBindingError("Cannot convert argument of type "+(handle.$$.smartPtrType?handle.$$.smartPtrType.name:handle.$$.ptrType.name)+" to parameter type "+this.name)}break;case 1:ptr=handle.$$.smartPtr;break;case 2:if(handle.$$.smartPtrType===this){ptr=handle.$$.smartPtr}else{var clonedHandle=handle["clone"]();ptr=this.rawShare(ptr,__emval_register(function(){clonedHandle["delete"]()}));if(destructors!==null){destructors.push(this.rawDestructor,ptr)}}break;default:throwBindingError("Unsupporting sharing policy")}}return ptr}function nonConstNoSmartPtrRawPointerToWireType(destructors,handle){if(handle===null){if(this.isReference){throwBindingError("null is not a valid "+this.name)}return 0}if(!handle.$$){throwBindingError('Cannot pass "'+_embind_repr(handle)+'" as a '+this.name)}if(!handle.$$.ptr){throwBindingError("Cannot pass deleted object as a pointer of type "+this.name)}if(handle.$$.ptrType.isConst){throwBindingError("Cannot convert argument of type "+handle.$$.ptrType.name+" to parameter type "+this.name)}var handleClass=handle.$$.ptrType.registeredClass;var ptr=upcastPointer(handle.$$.ptr,handleClass,this.registeredClass);return ptr}function simpleReadValueFromPointer(pointer){return this["fromWireType"](HEAPU32[pointer>>2])}function RegisteredPointer_getPointee(ptr){if(this.rawGetPointee){ptr=this.rawGetPointee(ptr)}return ptr}function RegisteredPointer_destructor(ptr){if(this.rawDestructor){this.rawDestructor(ptr)}}function RegisteredPointer_deleteObject(handle){if(handle!==null){handle["delete"]()}}function downcastPointer(ptr,ptrClass,desiredClass){if(ptrClass===desiredClass){return ptr}if(undefined===desiredClass.baseClass){return null}var rv=downcastPointer(ptr,ptrClass,desiredClass.baseClass);if(rv===null){return null}return desiredClass.downcast(rv)}function getInheritedInstanceCount(){return Object.keys(registeredInstances).length}function getLiveInheritedInstances(){var rv=[];for(var k in registeredInstances){if(registeredInstances.hasOwnProperty(k)){rv.push(registeredInstances[k])}}return rv}function setDelayFunction(fn){delayFunction=fn;if(deletionQueue.length&&delayFunction){delayFunction(flushPendingDeletes)}}function init_embind(){Module["getInheritedInstanceCount"]=getInheritedInstanceCount;Module["getLiveInheritedInstances"]=getLiveInheritedInstances;Module["flushPendingDeletes"]=flushPendingDeletes;Module["setDelayFunction"]=setDelayFunction}var registeredInstances={};function getBasestPointer(class_,ptr){if(ptr===undefined){throwBindingError("ptr should not be undefined")}while(class_.baseClass){ptr=class_.upcast(ptr);class_=class_.baseClass}return ptr}function getInheritedInstance(class_,ptr){ptr=getBasestPointer(class_,ptr);return registeredInstances[ptr]}function makeClassHandle(prototype,record){if(!record.ptrType||!record.ptr){throwInternalError("makeClassHandle requires ptr and ptrType")}var hasSmartPtrType=!!record.smartPtrType;var hasSmartPtr=!!record.smartPtr;if(hasSmartPtrType!==hasSmartPtr){throwInternalError("Both smartPtrType and smartPtr must be specified")}record.count={value:1};return attachFinalizer(Object.create(prototype,{$$:{value:record}}))}function RegisteredPointer_fromWireType(ptr){var rawPointer=this.getPointee(ptr);if(!rawPointer){this.destructor(ptr);return null}var registeredInstance=getInheritedInstance(this.registeredClass,rawPointer);if(undefined!==registeredInstance){if(0===registeredInstance.$$.count.value){registeredInstance.$$.ptr=rawPointer;registeredInstance.$$.smartPtr=ptr;return registeredInstance["clone"]()}else{var rv=registeredInstance["clone"]();this.destructor(ptr);return rv}}function makeDefaultHandle(){if(this.isSmartPointer){return makeClassHandle(this.registeredClass.instancePrototype,{ptrType:this.pointeeType,ptr:rawPointer,smartPtrType:this,smartPtr:ptr})}else{return makeClassHandle(this.registeredClass.instancePrototype,{ptrType:this,ptr:ptr})}}var actualType=this.registeredClass.getActualType(rawPointer);var registeredPointerRecord=registeredPointers[actualType];if(!registeredPointerRecord){return makeDefaultHandle.call(this)}var toType;if(this.isConst){toType=registeredPointerRecord.constPointerType}else{toType=registeredPointerRecord.pointerType}var dp=downcastPointer(rawPointer,this.registeredClass,toType.registeredClass);if(dp===null){return makeDefaultHandle.call(this)}if(this.isSmartPointer){return makeClassHandle(toType.registeredClass.instancePrototype,{ptrType:toType,ptr:dp,smartPtrType:this,smartPtr:ptr})}else{return makeClassHandle(toType.registeredClass.instancePrototype,{ptrType:toType,ptr:dp})}}function init_RegisteredPointer(){RegisteredPointer.prototype.getPointee=RegisteredPointer_getPointee;RegisteredPointer.prototype.destructor=RegisteredPointer_destructor;RegisteredPointer.prototype["argPackAdvance"]=8;RegisteredPointer.prototype["readValueFromPointer"]=simpleReadValueFromPointer;RegisteredPointer.prototype["deleteObject"]=RegisteredPointer_deleteObject;RegisteredPointer.prototype["fromWireType"]=RegisteredPointer_fromWireType}function RegisteredPointer(name,registeredClass,isReference,isConst,isSmartPointer,pointeeType,sharingPolicy,rawGetPointee,rawConstructor,rawShare,rawDestructor){this.name=name;this.registeredClass=registeredClass;this.isReference=isReference;this.isConst=isConst;this.isSmartPointer=isSmartPointer;this.pointeeType=pointeeType;this.sharingPolicy=sharingPolicy;this.rawGetPointee=rawGetPointee;this.rawConstructor=rawConstructor;this.rawShare=rawShare;this.rawDestructor=rawDestructor;if(!isSmartPointer&®isteredClass.baseClass===undefined){if(isConst){this["toWireType"]=constNoSmartPtrRawPointerToWireType;this.destructorFunction=null}else{this["toWireType"]=nonConstNoSmartPtrRawPointerToWireType;this.destructorFunction=null}}else{this["toWireType"]=genericPointerToWireType}}function replacePublicSymbol(name,value,numArguments){if(!Module.hasOwnProperty(name)){throwInternalError("Replacing nonexistant public symbol")}if(undefined!==Module[name].overloadTable&&undefined!==numArguments){Module[name].overloadTable[numArguments]=value}else{Module[name]=value;Module[name].argCount=numArguments}}function dynCallLegacy(sig,ptr,args){var f=Module["dynCall_"+sig];return args&&args.length?f.apply(null,[ptr].concat(args)):f.call(null,ptr)}function dynCall(sig,ptr,args){if(sig.indexOf("j")!=-1){return dynCallLegacy(sig,ptr,args)}return wasmTable.get(ptr).apply(null,args)}function getDynCaller(sig,ptr){var argCache=[];return function(){argCache.length=arguments.length;for(var i=0;i0?", ":"")+argsListWired}invokerFnBody+=(returns?"var rv = ":"")+"invoker(fn"+(argsListWired.length>0?", ":"")+argsListWired+");\n";if(needsDestructorStack){invokerFnBody+="runDestructors(destructors);\n"}else{for(var i=isClassMethodFunc?1:2;i>2)+i])}return array}function __embind_register_class_class_function(rawClassType,methodName,argCount,rawArgTypesAddr,invokerSignature,rawInvoker,fn){var rawArgTypes=heap32VectorToArray(argCount,rawArgTypesAddr);methodName=readLatin1String(methodName);rawInvoker=embind__requireFunction(invokerSignature,rawInvoker);whenDependentTypesAreResolved([],[rawClassType],function(classType){classType=classType[0];var humanName=classType.name+"."+methodName;function unboundTypesHandler(){throwUnboundTypeError("Cannot call "+humanName+" due to unbound types",rawArgTypes)}var proto=classType.registeredClass.constructor;if(undefined===proto[methodName]){unboundTypesHandler.argCount=argCount-1;proto[methodName]=unboundTypesHandler}else{ensureOverloadTable(proto,methodName,humanName);proto[methodName].overloadTable[argCount-1]=unboundTypesHandler}whenDependentTypesAreResolved([],rawArgTypes,function(argTypes){var invokerArgsArray=[argTypes[0],null].concat(argTypes.slice(1));var func=craftInvokerFunction(humanName,invokerArgsArray,null,rawInvoker,fn);if(undefined===proto[methodName].overloadTable){func.argCount=argCount-1;proto[methodName]=func}else{proto[methodName].overloadTable[argCount-1]=func}return[]});return[]})}function __embind_register_class_constructor(rawClassType,argCount,rawArgTypesAddr,invokerSignature,invoker,rawConstructor){assert(argCount>0);var rawArgTypes=heap32VectorToArray(argCount,rawArgTypesAddr);invoker=embind__requireFunction(invokerSignature,invoker);var args=[rawConstructor];var destructors=[];whenDependentTypesAreResolved([],[rawClassType],function(classType){classType=classType[0];var humanName="constructor "+classType.name;if(undefined===classType.registeredClass.constructor_body){classType.registeredClass.constructor_body=[]}if(undefined!==classType.registeredClass.constructor_body[argCount-1]){throw new BindingError("Cannot register multiple constructors with identical number of parameters ("+(argCount-1)+") for class '"+classType.name+"'! Overload resolution is currently only performed using the parameter count, not actual type info!")}classType.registeredClass.constructor_body[argCount-1]=function unboundTypeHandler(){throwUnboundTypeError("Cannot construct "+classType.name+" due to unbound types",rawArgTypes)};whenDependentTypesAreResolved([],rawArgTypes,function(argTypes){classType.registeredClass.constructor_body[argCount-1]=function constructor_body(){if(arguments.length!==argCount-1){throwBindingError(humanName+" called with "+arguments.length+" arguments, expected "+(argCount-1))}destructors.length=0;args.length=argCount;for(var i=1;i4&&0===--emval_handle_array[handle].refcount){emval_handle_array[handle]=undefined;emval_free_list.push(handle)}}function count_emval_handles(){var count=0;for(var i=5;i>1])};case 2:return function(pointer){var heap=signed?HEAP32:HEAPU32;return this["fromWireType"](heap[pointer>>2])};default:throw new TypeError("Unknown integer type: "+name)}}function __embind_register_enum(rawType,name,size,isSigned){var shift=getShiftFromSize(size);name=readLatin1String(name);function ctor(){}ctor.values={};registerType(rawType,{name:name,constructor:ctor,"fromWireType":function(c){return this.constructor.values[c]},"toWireType":function(destructors,c){return c.value},"argPackAdvance":8,"readValueFromPointer":enumReadValueFromPointer(name,shift,isSigned),destructorFunction:null});exposePublicSymbol(name,ctor)}function requireRegisteredType(rawType,humanName){var impl=registeredTypes[rawType];if(undefined===impl){throwBindingError(humanName+" has unknown type "+getTypeName(rawType))}return impl}function __embind_register_enum_value(rawEnumType,name,enumValue){var enumType=requireRegisteredType(rawEnumType,"enum");name=readLatin1String(name);var Enum=enumType.constructor;var Value=Object.create(enumType.constructor.prototype,{value:{value:enumValue},constructor:{value:createNamedFunction(enumType.name+"_"+name,function(){})}});Enum.values[enumValue]=Value;Enum[name]=Value}function _embind_repr(v){if(v===null){return"null"}var t=typeof v;if(t==="object"||t==="array"||t==="function"){return v.toString()}else{return""+v}}function floatReadValueFromPointer(name,shift){switch(shift){case 2:return function(pointer){return this["fromWireType"](HEAPF32[pointer>>2])};case 3:return function(pointer){return this["fromWireType"](HEAPF64[pointer>>3])};default:throw new TypeError("Unknown float type: "+name)}}function __embind_register_float(rawType,name,size){var shift=getShiftFromSize(size);name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":function(value){return value},"toWireType":function(destructors,value){if(typeof value!=="number"&&typeof value!=="boolean"){throw new TypeError('Cannot convert "'+_embind_repr(value)+'" to '+this.name)}return value},"argPackAdvance":8,"readValueFromPointer":floatReadValueFromPointer(name,shift),destructorFunction:null})}function __embind_register_function(name,argCount,rawArgTypesAddr,signature,rawInvoker,fn){var argTypes=heap32VectorToArray(argCount,rawArgTypesAddr);name=readLatin1String(name);rawInvoker=embind__requireFunction(signature,rawInvoker);exposePublicSymbol(name,function(){throwUnboundTypeError("Cannot call "+name+" due to unbound types",argTypes)},argCount-1);whenDependentTypesAreResolved([],argTypes,function(argTypes){var invokerArgsArray=[argTypes[0],null].concat(argTypes.slice(1));replacePublicSymbol(name,craftInvokerFunction(name,invokerArgsArray,null,rawInvoker,fn),argCount-1);return[]})}function integerReadValueFromPointer(name,shift,signed){switch(shift){case 0:return signed?function readS8FromPointer(pointer){return HEAP8[pointer]}:function readU8FromPointer(pointer){return HEAPU8[pointer]};case 1:return signed?function readS16FromPointer(pointer){return HEAP16[pointer>>1]}:function readU16FromPointer(pointer){return HEAPU16[pointer>>1]};case 2:return signed?function readS32FromPointer(pointer){return HEAP32[pointer>>2]}:function readU32FromPointer(pointer){return HEAPU32[pointer>>2]};default:throw new TypeError("Unknown integer type: "+name)}}function __embind_register_integer(primitiveType,name,size,minRange,maxRange){name=readLatin1String(name);if(maxRange===-1){maxRange=4294967295}var shift=getShiftFromSize(size);var fromWireType=function(value){return value};if(minRange===0){var bitshift=32-8*size;fromWireType=function(value){return value<>>bitshift}}var isUnsignedType=name.indexOf("unsigned")!=-1;registerType(primitiveType,{name:name,"fromWireType":fromWireType,"toWireType":function(destructors,value){if(typeof value!=="number"&&typeof value!=="boolean"){throw new TypeError('Cannot convert "'+_embind_repr(value)+'" to '+this.name)}if(valuemaxRange){throw new TypeError('Passing a number "'+_embind_repr(value)+'" from JS side to C/C++ side to an argument of type "'+name+'", which is outside the valid range ['+minRange+", "+maxRange+"]!")}return isUnsignedType?value>>>0:value|0},"argPackAdvance":8,"readValueFromPointer":integerReadValueFromPointer(name,shift,minRange!==0),destructorFunction:null})}function __embind_register_memory_view(rawType,dataTypeIndex,name){var typeMapping=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array];var TA=typeMapping[dataTypeIndex];function decodeMemoryView(handle){handle=handle>>2;var heap=HEAPU32;var size=heap[handle];var data=heap[handle+1];return new TA(buffer,data,size)}name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":decodeMemoryView,"argPackAdvance":8,"readValueFromPointer":decodeMemoryView},{ignoreDuplicateRegistrations:true})}function __embind_register_std_string(rawType,name){name=readLatin1String(name);var stdStringIsUTF8=name==="std::string";registerType(rawType,{name:name,"fromWireType":function(value){var length=HEAPU32[value>>2];var str;if(stdStringIsUTF8){var decodeStartPtr=value+4;for(var i=0;i<=length;++i){var currentBytePtr=value+4+i;if(i==length||HEAPU8[currentBytePtr]==0){var maxRead=currentBytePtr-decodeStartPtr;var stringSegment=UTF8ToString(decodeStartPtr,maxRead);if(str===undefined){str=stringSegment}else{str+=String.fromCharCode(0);str+=stringSegment}decodeStartPtr=currentBytePtr+1}}}else{var a=new Array(length);for(var i=0;i>2]=length;if(stdStringIsUTF8&&valueIsOfTypeString){stringToUTF8(value,ptr+4,length+1)}else{if(valueIsOfTypeString){for(var i=0;i255){_free(ptr);throwBindingError("String has UTF-16 code units that do not fit in 8 bits")}HEAPU8[ptr+4+i]=charCode}}else{for(var i=0;i>2];var HEAP=getHeap();var str;var decodeStartPtr=value+4;for(var i=0;i<=length;++i){var currentBytePtr=value+4+i*charSize;if(i==length||HEAP[currentBytePtr>>shift]==0){var maxReadBytes=currentBytePtr-decodeStartPtr;var stringSegment=decodeString(decodeStartPtr,maxReadBytes);if(str===undefined){str=stringSegment}else{str+=String.fromCharCode(0);str+=stringSegment}decodeStartPtr=currentBytePtr+charSize}}_free(value);return str},"toWireType":function(destructors,value){if(!(typeof value==="string")){throwBindingError("Cannot pass non-string to C++ string type "+name)}var length=lengthBytesUTF(value);var ptr=_malloc(4+length+charSize);HEAPU32[ptr>>2]=length>>shift;encodeString(value,ptr+4,length+charSize);if(destructors!==null){destructors.push(_free,ptr)}return ptr},"argPackAdvance":8,"readValueFromPointer":simpleReadValueFromPointer,destructorFunction:function(ptr){_free(ptr)}})}function __embind_register_void(rawType,name){name=readLatin1String(name);registerType(rawType,{isVoid:true,name:name,"argPackAdvance":0,"fromWireType":function(){return undefined},"toWireType":function(destructors,o){return undefined}})}function requireHandle(handle){if(!handle){throwBindingError("Cannot use deleted val. handle = "+handle)}return emval_handle_array[handle].value}function __emval_as(handle,returnType,destructorsRef){handle=requireHandle(handle);returnType=requireRegisteredType(returnType,"emval::as");var destructors=[];var rd=__emval_register(destructors);HEAP32[destructorsRef>>2]=rd;return returnType["toWireType"](destructors,handle)}var emval_symbols={};function getStringOrSymbol(address){var symbol=emval_symbols[address];if(symbol===undefined){return readLatin1String(address)}else{return symbol}}var emval_methodCallers=[];function __emval_call_void_method(caller,handle,methodName,args){caller=emval_methodCallers[caller];handle=requireHandle(handle);methodName=getStringOrSymbol(methodName);caller(handle,methodName,null,args)}function __emval_addMethodCaller(caller){var id=emval_methodCallers.length;emval_methodCallers.push(caller);return id}function __emval_lookupTypes(argCount,argTypes){var a=new Array(argCount);for(var i=0;i>2)+i],"parameter "+i)}return a}function __emval_get_method_caller(argCount,argTypes){var types=__emval_lookupTypes(argCount,argTypes);var retType=types[0];var signatureName=retType.name+"_$"+types.slice(1).map(function(t){return t.name}).join("_")+"$";var params=["retType"];var args=[retType];var argsList="";for(var i=0;i4){emval_handle_array[handle].refcount+=1}}function craftEmvalAllocator(argCount){var argsList="";for(var i=0;i>> 2) + "+i+'], "parameter '+i+'");\n'+"var arg"+i+" = argType"+i+".readValueFromPointer(args);\n"+"args += argType"+i+"['argPackAdvance'];\n"}functionBody+="var obj = new constructor("+argsList+");\n"+"return __emval_register(obj);\n"+"}\n";return new Function("requireRegisteredType","Module","__emval_register",functionBody)(requireRegisteredType,Module,__emval_register)}var emval_newers={};function __emval_new(handle,argCount,argTypes,args){handle=requireHandle(handle);var newer=emval_newers[argCount];if(!newer){newer=craftEmvalAllocator(argCount);emval_newers[argCount]=newer}return newer(handle,argTypes,args)}function __emval_new_cstring(v){return __emval_register(getStringOrSymbol(v))}function __emval_new_object(){return __emval_register({})}function __emval_run_destructors(handle){var destructors=emval_handle_array[handle].value;runDestructors(destructors);__emval_decref(handle)}function __emval_set_property(handle,key,value){handle=requireHandle(handle);key=requireHandle(key);value=requireHandle(value);handle[key]=value}function __emval_take_value(type,argv){type=requireRegisteredType(type,"_emval_take_value");var v=type["readValueFromPointer"](argv);return __emval_register(v)}function _abort(){abort()}function _emscripten_memcpy_big(dest,src,num){HEAPU8.copyWithin(dest,src,src+num)}function _emscripten_get_heap_size(){return HEAPU8.length}function emscripten_realloc_buffer(size){try{wasmMemory.grow(size-buffer.byteLength+65535>>>16);updateGlobalBufferAndViews(wasmMemory.buffer);return 1}catch(e){}}function _emscripten_resize_heap(requestedSize){var oldSize=_emscripten_get_heap_size();var maxHeapSize=2147483648;if(requestedSize>maxHeapSize){return false}for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignUp(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=emscripten_realloc_buffer(newSize);if(replacement){return true}}return false}var SYSCALLS={mappings:{},buffers:[null,[],[]],printChar:function(stream,curr){var buffer=SYSCALLS.buffers[stream];if(curr===0||curr===10){(stream===1?out:err)(UTF8ArrayToString(buffer,0));buffer.length=0}else{buffer.push(curr)}},varargs:undefined,get:function(){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret},getStr:function(ptr){var ret=UTF8ToString(ptr);return ret},get64:function(low,high){return low}};function _fd_close(fd){return 0}function _fd_seek(fd,offset_low,offset_high,whence,newOffset){}function _fd_write(fd,iov,iovcnt,pnum){var num=0;for(var i=0;i>2];var len=HEAP32[iov+(i*8+4)>>2];for(var j=0;j>2]=num;return 0}function _setTempRet0($i){setTempRet0($i|0)}embind_init_charCodes();BindingError=Module["BindingError"]=extendError(Error,"BindingError");InternalError=Module["InternalError"]=extendError(Error,"InternalError");init_ClassHandle();init_RegisteredPointer();init_embind();UnboundTypeError=Module["UnboundTypeError"]=extendError(Error,"UnboundTypeError");init_emval();var asmLibraryArg={"a":___assert_fail,"J":__embind_register_bool,"m":__embind_register_class,"w":__embind_register_class_class_function,"r":__embind_register_class_constructor,"l":__embind_register_class_function,"h":__embind_register_class_property,"I":__embind_register_emval,"v":__embind_register_enum,"c":__embind_register_enum_value,"y":__embind_register_float,"B":__embind_register_function,"i":__embind_register_integer,"g":__embind_register_memory_view,"z":__embind_register_std_string,"t":__embind_register_std_wstring,"K":__embind_register_void,"k":__emval_as,"n":__emval_call_void_method,"b":__emval_decref,"o":__emval_get_method_caller,"q":__emval_get_module_property,"e":__emval_get_property,"f":__emval_incref,"p":__emval_new,"d":__emval_new_cstring,"C":__emval_new_object,"j":__emval_run_destructors,"A":__emval_set_property,"u":__emval_take_value,"s":_abort,"F":_emscripten_memcpy_big,"G":_emscripten_resize_heap,"H":_fd_close,"D":_fd_seek,"x":_fd_write,"E":_setTempRet0};var asm=createWasm();var ___wasm_call_ctors=Module["___wasm_call_ctors"]=function(){return(___wasm_call_ctors=Module["___wasm_call_ctors"]=Module["asm"]["M"]).apply(null,arguments)};var _free=Module["_free"]=function(){return(_free=Module["_free"]=Module["asm"]["N"]).apply(null,arguments)};var _malloc=Module["_malloc"]=function(){return(_malloc=Module["_malloc"]=Module["asm"]["P"]).apply(null,arguments)};var ___getTypeName=Module["___getTypeName"]=function(){return(___getTypeName=Module["___getTypeName"]=Module["asm"]["Q"]).apply(null,arguments)};var ___embind_register_native_and_builtin_types=Module["___embind_register_native_and_builtin_types"]=function(){return(___embind_register_native_and_builtin_types=Module["___embind_register_native_and_builtin_types"]=Module["asm"]["R"]).apply(null,arguments)};var dynCall_jiji=Module["dynCall_jiji"]=function(){return(dynCall_jiji=Module["dynCall_jiji"]=Module["asm"]["S"]).apply(null,arguments)};var calledRun;function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function run(args){args=args||arguments_;if(runDependencies>0){return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();preMain();readyPromiseResolve(Module);if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}Module["run"]=run;if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}run(); + + + return MSC_TRANSCODER.ready +} +); +})(); +if (typeof exports === 'object' && typeof module === 'object') + module.exports = MSC_TRANSCODER; +else if (typeof define === 'function' && define['amd']) + define([], function() { return MSC_TRANSCODER; }); +else if (typeof exports === 'object') + exports["MSC_TRANSCODER"] = MSC_TRANSCODER; \ No newline at end of file diff --git a/public/bblcdn/msc_basis_transcoder.wasm b/public/bblcdn/msc_basis_transcoder.wasm new file mode 100644 index 0000000..ca01a2c Binary files /dev/null and b/public/bblcdn/msc_basis_transcoder.wasm differ diff --git a/public/bblcdn/uastc_bc7.wasm b/public/bblcdn/uastc_bc7.wasm new file mode 100644 index 0000000..40ad004 Binary files /dev/null and b/public/bblcdn/uastc_bc7.wasm differ diff --git a/public/bblcdn/zstddec.wasm b/public/bblcdn/zstddec.wasm new file mode 100644 index 0000000..181bd3d Binary files /dev/null and b/public/bblcdn/zstddec.wasm differ diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000..8fb9f91 Binary files /dev/null and b/public/favicon.ico differ diff --git a/public/hdr/hdr.env b/public/hdr/hdr.env new file mode 100644 index 0000000..8f061ef Binary files /dev/null and b/public/hdr/hdr.env differ diff --git a/public/model/skateboard_mesh.glb b/public/model/skateboard_mesh.glb new file mode 100644 index 0000000..dee2dab Binary files /dev/null and b/public/model/skateboard_mesh.glb differ diff --git a/public/model/t-shirt.glb b/public/model/t-shirt.glb new file mode 100644 index 0000000..3a1ce9b Binary files /dev/null and b/public/model/t-shirt.glb differ diff --git a/src/App.vue b/src/App.vue new file mode 100644 index 0000000..21f4cd0 --- /dev/null +++ b/src/App.vue @@ -0,0 +1,21 @@ + + + + + diff --git a/src/assets/font/QingNiaoHuaGuangJianMeiHei-2.ttf b/src/assets/font/QingNiaoHuaGuangJianMeiHei-2.ttf new file mode 100644 index 0000000..b23a2af Binary files /dev/null and b/src/assets/font/QingNiaoHuaGuangJianMeiHei-2.ttf differ diff --git a/src/assets/img/a25614bc973f340740cb229104f29eb.jpg b/src/assets/img/a25614bc973f340740cb229104f29eb.jpg new file mode 100644 index 0000000..ce8ba26 Binary files /dev/null and b/src/assets/img/a25614bc973f340740cb229104f29eb.jpg differ diff --git a/src/assets/img/bangzhu1.png b/src/assets/img/bangzhu1.png new file mode 100644 index 0000000..9b6fbab Binary files /dev/null and b/src/assets/img/bangzhu1.png differ diff --git a/src/assets/img/bangzhu2.png b/src/assets/img/bangzhu2.png new file mode 100644 index 0000000..e9005c2 Binary files /dev/null and b/src/assets/img/bangzhu2.png differ diff --git a/src/assets/img/btn_产品卖点背景.png b/src/assets/img/btn_产品卖点背景.png new file mode 100644 index 0000000..337b50d Binary files /dev/null and b/src/assets/img/btn_产品卖点背景.png differ diff --git a/src/assets/img/btn_外观页_底背景条.png b/src/assets/img/btn_外观页_底背景条.png new file mode 100644 index 0000000..a104fa9 Binary files /dev/null and b/src/assets/img/btn_外观页_底背景条.png differ diff --git a/src/assets/img/logo.jpg b/src/assets/img/logo.jpg new file mode 100644 index 0000000..b280e5f Binary files /dev/null and b/src/assets/img/logo.jpg differ diff --git a/src/assets/img/微信图片_20250512185835.jpg b/src/assets/img/微信图片_20250512185835.jpg new file mode 100644 index 0000000..8d84094 Binary files /dev/null and b/src/assets/img/微信图片_20250512185835.jpg differ diff --git a/src/assets/logo.jpg b/src/assets/logo.jpg new file mode 100644 index 0000000..b280e5f Binary files /dev/null and b/src/assets/logo.jpg differ diff --git a/src/assets/logo.png b/src/assets/logo.png new file mode 100644 index 0000000..f3d2503 Binary files /dev/null and b/src/assets/logo.png differ diff --git a/src/assets/logo.svg b/src/assets/logo.svg new file mode 100644 index 0000000..d57771c --- /dev/null +++ b/src/assets/logo.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/assets/style/components.css b/src/assets/style/components.css new file mode 100644 index 0000000..4447b5c --- /dev/null +++ b/src/assets/style/components.css @@ -0,0 +1,46 @@ +.inspectortotip { + margin-top: 5px; + color: rgba(250, 92, 0, 0.712); + width: 200px; + margin-left: 20px; + font-size: 12px; + margin-bottom: 5px; +} + +.container { + position: absolute; + width: 100%; + height: 100%; + pointer-events: none; +} + +.slider-them { + position: absolute; + pointer-events: auto; + cursor: ew-resize; + + width: 20px; + height: 40px; + background-color: #006eff; + opacity: 0.7; + border-radius: 1rem; + + top: calc(50% - 20px); + left: calc(50% - 10px); + +} + + +.slider { + position: absolute; + pointer-events: auto; + cursor: ew-resize; + width: 40px; + height: 60px; + background-color: #7777773a; + opacity: 0.7; + border-radius: 1rem; + top: calc(50% - 20px); + left: calc(50% - 10px); + +} \ No newline at end of file diff --git a/src/assets/style/font_oy0t1irww4k/demo.css b/src/assets/style/font_oy0t1irww4k/demo.css new file mode 100644 index 0000000..a67054a --- /dev/null +++ b/src/assets/style/font_oy0t1irww4k/demo.css @@ -0,0 +1,539 @@ +/* Logo 字体 */ +@font-face { + font-family: "iconfont logo"; + src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834'); + src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834#iefix') format('embedded-opentype'), + url('https://at.alicdn.com/t/font_985780_km7mi63cihi.woff?t=1545807318834') format('woff'), + url('https://at.alicdn.com/t/font_985780_km7mi63cihi.ttf?t=1545807318834') format('truetype'), + url('https://at.alicdn.com/t/font_985780_km7mi63cihi.svg?t=1545807318834#iconfont') format('svg'); +} + +.logo { + font-family: "iconfont logo"; + font-size: 160px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +/* tabs */ +.nav-tabs { + position: relative; +} + +.nav-tabs .nav-more { + position: absolute; + right: 0; + bottom: 0; + height: 42px; + line-height: 42px; + color: #666; +} + +#tabs { + border-bottom: 1px solid #eee; +} + +#tabs li { + cursor: pointer; + width: 100px; + height: 40px; + line-height: 40px; + text-align: center; + font-size: 16px; + border-bottom: 2px solid transparent; + position: relative; + z-index: 1; + margin-bottom: -1px; + color: #666; +} + + +#tabs .active { + border-bottom-color: #f00; + color: #222; +} + +.tab-container .content { + display: none; +} + +/* 页面布局 */ +.main { + padding: 30px 100px; + width: 960px; + margin: 0 auto; +} + +.main .logo { + color: #333; + text-align: left; + margin-bottom: 30px; + line-height: 1; + height: 110px; + margin-top: -50px; + overflow: hidden; + *zoom: 1; +} + +.main .logo a { + font-size: 160px; + color: #333; +} + +.helps { + margin-top: 40px; +} + +.helps pre { + padding: 20px; + margin: 10px 0; + border: solid 1px #e7e1cd; + background-color: #fffdef; + overflow: auto; +} + +.icon_lists { + width: 100% !important; + overflow: hidden; + *zoom: 1; +} + +.icon_lists li { + width: 100px; + margin-bottom: 10px; + margin-right: 20px; + text-align: center; + list-style: none !important; + cursor: default; +} + +.icon_lists li .code-name { + line-height: 1.2; +} + +.icon_lists .icon { + display: block; + height: 100px; + line-height: 100px; + font-size: 42px; + margin: 10px auto; + color: #333; + -webkit-transition: font-size 0.25s linear, width 0.25s linear; + -moz-transition: font-size 0.25s linear, width 0.25s linear; + transition: font-size 0.25s linear, width 0.25s linear; +} + +.icon_lists .icon:hover { + font-size: 100px; +} + +.icon_lists .svg-icon { + /* 通过设置 font-size 来改变图标大小 */ + width: 1em; + /* 图标和文字相邻时,垂直对齐 */ + vertical-align: -0.15em; + /* 通过设置 color 来改变 SVG 的颜色/fill */ + fill: currentColor; + /* path 和 stroke 溢出 viewBox 部分在 IE 下会显示 + normalize.css 中也包含这行 */ + overflow: hidden; +} + +.icon_lists li .name, +.icon_lists li .code-name { + color: #666; +} + +/* markdown 样式 */ +.markdown { + color: #666; + font-size: 14px; + line-height: 1.8; +} + +.highlight { + line-height: 1.5; +} + +.markdown img { + vertical-align: middle; + max-width: 100%; +} + +.markdown h1 { + color: #404040; + font-weight: 500; + line-height: 40px; + margin-bottom: 24px; +} + +.markdown h2, +.markdown h3, +.markdown h4, +.markdown h5, +.markdown h6 { + color: #404040; + margin: 1.6em 0 0.6em 0; + font-weight: 500; + clear: both; +} + +.markdown h1 { + font-size: 28px; +} + +.markdown h2 { + font-size: 22px; +} + +.markdown h3 { + font-size: 16px; +} + +.markdown h4 { + font-size: 14px; +} + +.markdown h5 { + font-size: 12px; +} + +.markdown h6 { + font-size: 12px; +} + +.markdown hr { + height: 1px; + border: 0; + background: #e9e9e9; + margin: 16px 0; + clear: both; +} + +.markdown p { + margin: 1em 0; +} + +.markdown>p, +.markdown>blockquote, +.markdown>.highlight, +.markdown>ol, +.markdown>ul { + width: 80%; +} + +.markdown ul>li { + list-style: circle; +} + +.markdown>ul li, +.markdown blockquote ul>li { + margin-left: 20px; + padding-left: 4px; +} + +.markdown>ul li p, +.markdown>ol li p { + margin: 0.6em 0; +} + +.markdown ol>li { + list-style: decimal; +} + +.markdown>ol li, +.markdown blockquote ol>li { + margin-left: 20px; + padding-left: 4px; +} + +.markdown code { + margin: 0 3px; + padding: 0 5px; + background: #eee; + border-radius: 3px; +} + +.markdown strong, +.markdown b { + font-weight: 600; +} + +.markdown>table { + border-collapse: collapse; + border-spacing: 0px; + empty-cells: show; + border: 1px solid #e9e9e9; + width: 95%; + margin-bottom: 24px; +} + +.markdown>table th { + white-space: nowrap; + color: #333; + font-weight: 600; +} + +.markdown>table th, +.markdown>table td { + border: 1px solid #e9e9e9; + padding: 8px 16px; + text-align: left; +} + +.markdown>table th { + background: #F7F7F7; +} + +.markdown blockquote { + font-size: 90%; + color: #999; + border-left: 4px solid #e9e9e9; + padding-left: 0.8em; + margin: 1em 0; +} + +.markdown blockquote p { + margin: 0; +} + +.markdown .anchor { + opacity: 0; + transition: opacity 0.3s ease; + margin-left: 8px; +} + +.markdown .waiting { + color: #ccc; +} + +.markdown h1:hover .anchor, +.markdown h2:hover .anchor, +.markdown h3:hover .anchor, +.markdown h4:hover .anchor, +.markdown h5:hover .anchor, +.markdown h6:hover .anchor { + opacity: 1; + display: inline-block; +} + +.markdown>br, +.markdown>p>br { + clear: both; +} + + +.hljs { + display: block; + background: white; + padding: 0.5em; + color: #333333; + overflow-x: auto; +} + +.hljs-comment, +.hljs-meta { + color: #969896; +} + +.hljs-string, +.hljs-variable, +.hljs-template-variable, +.hljs-strong, +.hljs-emphasis, +.hljs-quote { + color: #df5000; +} + +.hljs-keyword, +.hljs-selector-tag, +.hljs-type { + color: #a71d5d; +} + +.hljs-literal, +.hljs-symbol, +.hljs-bullet, +.hljs-attribute { + color: #0086b3; +} + +.hljs-section, +.hljs-name { + color: #63a35c; +} + +.hljs-tag { + color: #333333; +} + +.hljs-title, +.hljs-attr, +.hljs-selector-id, +.hljs-selector-class, +.hljs-selector-attr, +.hljs-selector-pseudo { + color: #795da3; +} + +.hljs-addition { + color: #55a532; + background-color: #eaffea; +} + +.hljs-deletion { + color: #bd2c00; + background-color: #ffecec; +} + +.hljs-link { + text-decoration: underline; +} + +/* 代码高亮 */ +/* PrismJS 1.15.0 +https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */ +/** + * prism.js default theme for JavaScript, CSS and HTML + * Based on dabblet (http://dabblet.com) + * @author Lea Verou + */ +code[class*="language-"], +pre[class*="language-"] { + color: black; + background: none; + text-shadow: 0 1px white; + font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + word-wrap: normal; + line-height: 1.5; + + -moz-tab-size: 4; + -o-tab-size: 4; + tab-size: 4; + + -webkit-hyphens: none; + -moz-hyphens: none; + -ms-hyphens: none; + hyphens: none; +} + +pre[class*="language-"]::-moz-selection, +pre[class*="language-"] ::-moz-selection, +code[class*="language-"]::-moz-selection, +code[class*="language-"] ::-moz-selection { + text-shadow: none; + background: #b3d4fc; +} + +pre[class*="language-"]::selection, +pre[class*="language-"] ::selection, +code[class*="language-"]::selection, +code[class*="language-"] ::selection { + text-shadow: none; + background: #b3d4fc; +} + +@media print { + + code[class*="language-"], + pre[class*="language-"] { + text-shadow: none; + } +} + +/* Code blocks */ +pre[class*="language-"] { + padding: 1em; + margin: .5em 0; + overflow: auto; +} + +:not(pre)>code[class*="language-"], +pre[class*="language-"] { + background: #f5f2f0; +} + +/* Inline code */ +:not(pre)>code[class*="language-"] { + padding: .1em; + border-radius: .3em; + white-space: normal; +} + +.token.comment, +.token.prolog, +.token.doctype, +.token.cdata { + color: slategray; +} + +.token.punctuation { + color: #999; +} + +.namespace { + opacity: .7; +} + +.token.property, +.token.tag, +.token.boolean, +.token.number, +.token.constant, +.token.symbol, +.token.deleted { + color: #905; +} + +.token.selector, +.token.attr-name, +.token.string, +.token.char, +.token.builtin, +.token.inserted { + color: #690; +} + +.token.operator, +.token.entity, +.token.url, +.language-css .token.string, +.style .token.string { + color: #9a6e3a; + background: hsla(0, 0%, 100%, .5); +} + +.token.atrule, +.token.attr-value, +.token.keyword { + color: #07a; +} + +.token.function, +.token.class-name { + color: #DD4A68; +} + +.token.regex, +.token.important, +.token.variable { + color: #e90; +} + +.token.important, +.token.bold { + font-weight: bold; +} + +.token.italic { + font-style: italic; +} + +.token.entity { + cursor: help; +} diff --git a/src/assets/style/font_oy0t1irww4k/demo_index.html b/src/assets/style/font_oy0t1irww4k/demo_index.html new file mode 100644 index 0000000..5415827 --- /dev/null +++ b/src/assets/style/font_oy0t1irww4k/demo_index.html @@ -0,0 +1,391 @@ + + + + + iconfont Demo + + + + + + + + + + + + + +
+

+ + +

+ +
+
+
    + +
  • + +
    全屏
    +
    &#xe660;
    +
  • + +
  • + +
    帮助
    +
    &#xe620;
    +
  • + +
  • + +
    帮助_o
    +
    &#xeb72;
    +
  • + +
  • + +
    半透明(2)
    +
    &#xe60b;
    +
  • + +
  • + +
    持续时间
    +
    &#xe71a;
    +
  • + +
  • + +
    对比
    +
    &#xe60c;
    +
  • + +
  • + +
    还原
    +
    &#xe604;
    +
  • + +
  • + +
    vr
    +
    &#xe70a;
    +
  • + +
  • + +
    持续时间
    +
    &#xe51b;
    +
  • + +
+
+

Unicode 引用

+
+ +

Unicode 是字体在网页端最原始的应用方式,特点是:

+
    +
  • 支持按字体的方式去动态调整图标大小,颜色等等。
  • +
  • 默认情况下不支持多色,直接添加多色图标会自动去色。
  • +
+
+

注意:新版 iconfont 支持两种方式引用多色图标:SVG symbol 引用方式和彩色字体图标模式。(使用彩色字体图标需要在「编辑项目」中开启「彩色」选项后并重新生成。)

+
+

Unicode 使用步骤如下:

+

第一步:拷贝项目下面生成的 @font-face

+
@font-face {
+  font-family: 'iconfont';
+  src: url('iconfont.ttf?t=1733881413198') format('truetype');
+}
+
+

第二步:定义使用 iconfont 的样式

+
.iconfont {
+  font-family: "iconfont" !important;
+  font-size: 16px;
+  font-style: normal;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+

第三步:挑选相应图标并获取字体编码,应用于页面

+
+<span class="iconfont">&#x33;</span>
+
+
+

"iconfont" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。

+
+
+
+
+
    + +
  • + +
    + 全屏 +
    +
    .icon-quanping +
    +
  • + +
  • + +
    + 帮助 +
    +
    .icon-bangzhu +
    +
  • + +
  • + +
    + 帮助_o +
    +
    .icon-bangzhu_o +
    +
  • + +
  • + +
    + 半透明(2) +
    +
    .icon-bantouming +
    +
  • + +
  • + +
    + 持续时间 +
    +
    .icon-chixushijian +
    +
  • + +
  • + +
    + 对比 +
    +
    .icon-duibi +
    +
  • + +
  • + +
    + 还原 +
    +
    .icon-huanyuan +
    +
  • + +
  • + +
    + vr +
    +
    .icon-vr +
    +
  • + +
  • + +
    + 持续时间 +
    +
    .icon-chixushijian1 +
    +
  • + +
+
+

font-class 引用

+
+ +

font-class 是 Unicode 使用方式的一种变种,主要是解决 Unicode 书写不直观,语意不明确的问题。

+

与 Unicode 使用方式相比,具有如下特点:

+
    +
  • 相比于 Unicode 语意明确,书写更直观。可以很容易分辨这个 icon 是什么。
  • +
  • 因为使用 class 来定义图标,所以当要替换图标时,只需要修改 class 里面的 Unicode 引用。
  • +
+

使用步骤如下:

+

第一步:引入项目下面生成的 fontclass 代码:

+
<link rel="stylesheet" href="./iconfont.css">
+
+

第二步:挑选相应图标并获取类名,应用于页面:

+
<span class="iconfont icon-xxx"></span>
+
+
+

" + iconfont" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。

+
+
+
+
+
    + +
  • + +
    全屏
    +
    #icon-quanping
    +
  • + +
  • + +
    帮助
    +
    #icon-bangzhu
    +
  • + +
  • + +
    帮助_o
    +
    #icon-bangzhu_o
    +
  • + +
  • + +
    半透明(2)
    +
    #icon-bantouming
    +
  • + +
  • + +
    持续时间
    +
    #icon-chixushijian
    +
  • + +
  • + +
    对比
    +
    #icon-duibi
    +
  • + +
  • + +
    还原
    +
    #icon-huanyuan
    +
  • + +
  • + +
    vr
    +
    #icon-vr
    +
  • + +
  • + +
    持续时间
    +
    #icon-chixushijian1
    +
  • + +
+
+

Symbol 引用

+
+ +

这是一种全新的使用方式,应该说这才是未来的主流,也是平台目前推荐的用法。相关介绍可以参考这篇文章 + 这种用法其实是做了一个 SVG 的集合,与另外两种相比具有如下特点:

+
    +
  • 支持多色图标了,不再受单色限制。
  • +
  • 通过一些技巧,支持像字体那样,通过 font-size, color 来调整样式。
  • +
  • 兼容性较差,支持 IE9+,及现代浏览器。
  • +
  • 浏览器渲染 SVG 的性能一般,还不如 png。
  • +
+

使用步骤如下:

+

第一步:引入项目下面生成的 symbol 代码:

+
<script src="./iconfont.js"></script>
+
+

第二步:加入通用 CSS 代码(引入一次就行):

+
<style>
+.icon {
+  width: 1em;
+  height: 1em;
+  vertical-align: -0.15em;
+  fill: currentColor;
+  overflow: hidden;
+}
+</style>
+
+

第三步:挑选相应图标并获取类名,应用于页面:

+
<svg class="icon" aria-hidden="true">
+  <use xlink:href="#icon-xxx"></use>
+</svg>
+
+
+
+ +
+
+ + + diff --git a/src/assets/style/font_oy0t1irww4k/iconfont.css b/src/assets/style/font_oy0t1irww4k/iconfont.css new file mode 100644 index 0000000..45f3fec --- /dev/null +++ b/src/assets/style/font_oy0t1irww4k/iconfont.css @@ -0,0 +1,49 @@ +@font-face { + font-family: "iconfont"; /* Project id */ + src: url('iconfont.ttf?t=1733881413198') format('truetype'); +} + +.iconfont { + font-family: "iconfont" !important; + font-size: 16px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.icon-quanping:before { + content: "\e660"; +} + +.icon-bangzhu:before { + content: "\e620"; +} + +.icon-bangzhu_o:before { + content: "\eb72"; +} + +.icon-bantouming:before { + content: "\e60b"; +} + +.icon-chixushijian:before { + content: "\e71a"; +} + +.icon-duibi:before { + content: "\e60c"; +} + +.icon-huanyuan:before { + content: "\e604"; +} + +.icon-vr:before { + content: "\e70a"; +} + +.icon-chixushijian1:before { + content: "\e51b"; +} + diff --git a/src/assets/style/font_oy0t1irww4k/iconfont.js b/src/assets/style/font_oy0t1irww4k/iconfont.js new file mode 100644 index 0000000..2f1da49 --- /dev/null +++ b/src/assets/style/font_oy0t1irww4k/iconfont.js @@ -0,0 +1 @@ +window._iconfont_svg_string_='',(i=>{var t=(e=(e=document.getElementsByTagName("script"))[e.length-1]).getAttribute("data-injectcss"),e=e.getAttribute("data-disable-injectsvg");if(!e){var n,o,c,h,l,a=function(t,e){e.parentNode.insertBefore(t,e)};if(t&&!i.__iconfont__svg__cssinject__){i.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(t){console&&console.log(t)}}n=function(){var t,e=document.createElement("div");e.innerHTML=i._iconfont_svg_string_,(e=e.getElementsByTagName("svg")[0])&&(e.setAttribute("aria-hidden","true"),e.style.position="absolute",e.style.width=0,e.style.height=0,e.style.overflow="hidden",e=e,(t=document.body).firstChild?a(e,t.firstChild):t.appendChild(e))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(n,0):(o=function(){document.removeEventListener("DOMContentLoaded",o,!1),n()},document.addEventListener("DOMContentLoaded",o,!1)):document.attachEvent&&(c=n,h=i.document,l=!1,d(),h.onreadystatechange=function(){"complete"==h.readyState&&(h.onreadystatechange=null,v())})}function v(){l||(l=!0,c())}function d(){try{h.documentElement.doScroll("left")}catch(t){return void setTimeout(d,50)}v()}})(window); \ No newline at end of file diff --git a/src/assets/style/font_oy0t1irww4k/iconfont.json b/src/assets/style/font_oy0t1irww4k/iconfont.json new file mode 100644 index 0000000..210e275 --- /dev/null +++ b/src/assets/style/font_oy0t1irww4k/iconfont.json @@ -0,0 +1,72 @@ +{ + "id": "", + "name": "", + "font_family": "iconfont", + "css_prefix_text": "icon-", + "description": "", + "glyphs": [ + { + "icon_id": "807275", + "name": "全屏", + "font_class": "quanping", + "unicode": "e660", + "unicode_decimal": 58976 + }, + { + "icon_id": "1304879", + "name": "帮助", + "font_class": "bangzhu", + "unicode": "e620", + "unicode_decimal": 58912 + }, + { + "icon_id": "5387852", + "name": "帮助_o", + "font_class": "bangzhu_o", + "unicode": "eb72", + "unicode_decimal": 60274 + }, + { + "icon_id": "8883075", + "name": "半透明(2)", + "font_class": "bantouming", + "unicode": "e60b", + "unicode_decimal": 58891 + }, + { + "icon_id": "11768105", + "name": "持续时间", + "font_class": "chixushijian", + "unicode": "e71a", + "unicode_decimal": 59162 + }, + { + "icon_id": "15726777", + "name": "对比", + "font_class": "duibi", + "unicode": "e60c", + "unicode_decimal": 58892 + }, + { + "icon_id": "16731254", + "name": "还原", + "font_class": "huanyuan", + "unicode": "e604", + "unicode_decimal": 58884 + }, + { + "icon_id": "22273778", + "name": "vr", + "font_class": "vr", + "unicode": "e70a", + "unicode_decimal": 59146 + }, + { + "icon_id": "42514699", + "name": "持续时间", + "font_class": "chixushijian1", + "unicode": "e51b", + "unicode_decimal": 58651 + } + ] +} diff --git a/src/assets/style/font_oy0t1irww4k/iconfont.ttf b/src/assets/style/font_oy0t1irww4k/iconfont.ttf new file mode 100644 index 0000000..cfeb423 Binary files /dev/null and b/src/assets/style/font_oy0t1irww4k/iconfont.ttf differ diff --git a/src/assets/style/global.css b/src/assets/style/global.css new file mode 100644 index 0000000..4fac439 --- /dev/null +++ b/src/assets/style/global.css @@ -0,0 +1,124 @@ +* { + outline: none !important; +} + +html, +body { + width: 100%; + height: 100%; + padding: 0px; + margin: 0px; + overflow: hidden !important; + +} + +body { + margin: 0; + /* background: url("/resources/电脑端效果图.jpg") no-repeat center center fixed; */ + background-size: 100% 100%; +} + +canvas { + + background: transparent; +} + + +:root { + --cube-size: 30px; + /* 定义方块大小变量 */ +} + +html { + font-size: 16px; +} + +* { + -webkit-tap-highlight-color: transparent; + -webkit-touch-callout: none; + /* 禁用长按菜单(如复制、保存图片等) */ +} + +#header { + + width: 100%; + height: 100px; + background-color: rgb(255, 255, 255); +} + +#sidebar { + + height: 100%; + width: 300px; + +} + +* { + -webkit-touch-callout: none; + /*系统默认菜单被禁用*/ + -webkit-user-select: none; + /*webkit浏览器*/ + -khtml-user-select: none; + /*早期浏览器*/ + -moz-user-select: none; + /*火狐*/ + -ms-user-select: none; + /*IE10*/ + user-select: none; +} + +* { + -webkit-user-select: none; + /* 禁止文字选中 */ + -webkit-touch-callout: none; + /* 禁止长按弹出系统菜单 */ +} + + +input { + -webkit-user-select: auto; + /*webkit浏览器*/ +} + +textarea { + -webkit-user-select: auto; + /*webkit浏览器*/ + +} + + + + +.loadingfade { + transition: all 0.8s ease-in; + opacity: 0; +} + +.text { + position: absolute; + width: 200px; + height: 60px; + left: 50%; + top: 60%; + margin-left: -100px; + + color: rgba(83, 83, 83, 0.582); + font-size: 12px; + text-align: center; + line-height: 60px; +} + +.loaderbox { + + position: absolute; + left: 50%; + top: 50%; + transform: translate(-50%, -50%); + display: flex; + flex-direction: column; + align-items: center; +} + +.button { + pointer-events: auto; +} \ No newline at end of file diff --git a/src/assets/style/loading.css b/src/assets/style/loading.css new file mode 100644 index 0000000..7084058 --- /dev/null +++ b/src/assets/style/loading.css @@ -0,0 +1,90 @@ +.loading-container { + position: fixed; + top: 0; + left: 0; + width: 100vw; + height: 100vh; + display: flex; + justify-content: center; + align-items: center; + z-index: 9999; + background: url('/loading/加载页背景图.jpg') no-repeat center center; + background-size: 100% 100%; + } + + .loading-content { + width: 230px; + max-width: 600px; + display: flex; + flex-direction: column; + align-items: center; + margin-top: -70px; + } + + + .logo { + width: 152px; + font-size: 32px; + font-weight: bold; + margin-bottom: 50px; + color: #333; + position: relative; + } + .logo img{ + width: 100%; + } + + + .truck-container { + position: relative; + width: 100%; + height: 40px; + margin-top: -40px; /* 向上移动,与进度条重叠 */ + } + + .progress-container { + width: 100%; + height: 6px; + background-color: rgba(255, 255, 255, 0.37); + border-radius: 6px; + overflow: hidden; + position: relative; + margin-bottom: 20px; + padding: 2px; + box-shadow: 0 0 3px rgba(0, 0, 0, 0.1); + display: flex; + align-items: center; /* 保持垂直居中 */ + } + + .progress-bar { + height: 4px; /* 保持这个高度 */ + background-color: #1087d6; + transition: width 0.3s; + border-radius: 3px; + /* 移除这两行,它们导致了中间扩散效果 */ + /* margin: 0 auto; */ + /* align-self: center; */ + + /* 添加这行确保从左边开始 */ + margin-left: 0; + } + + .truck { + position: absolute; + transform: translateX(-90%); /* 改为-90%,让小车更靠左一些 */ + transition: left 0.3s; + z-index: 10; + bottom: 24px; + } + + .truck img { + display: block; + width: 80px; + height: auto; + } + + .loading-text { + font-size: 14px; + color: #333; + } + diff --git a/src/assets/style/media.css b/src/assets/style/media.css new file mode 100644 index 0000000..2c5b092 --- /dev/null +++ b/src/assets/style/media.css @@ -0,0 +1,286 @@ +@charset "UTF-8"; + + + + +/* 移动设备 */ +@media screen and (max-width: 350px) { + .title { + font-size: 16px !important; + } +} + + +/* 移动设备 */ +@media screen and (max-width: 640px) { + + .loaderbox img { + width: 200px !important; + } + + .jiudu { + min-width: 70px; + height: 36px; + } + + + /* 横屏*/ + @media screen and (max-height: 766px) { + + .ui-bottom { + bottom: 20px; + right: 10px; + /* 通过偏移实现居中 */ + } + + .dialog-item { + width: 5rem; + height: 5rem; + } + + .dialog-item .Bar-Line { + width: calc(5rem + 6px); + height: calc(5rem + 6px); + box-shadow: 0 0 0 1px #fff; + } + + .dialog-body { + padding: 5px 5px + } + + .TopInfo-content .title { + font-size: 24px; + } + } + + + /* 竖屏*/ + @media screen and (min-height: 768px) { + + .ui-bottom { + bottom: 20px; + right: 10px; + /* 通过偏移实现居中 */ + } + + .dialog-item { + width: 5rem; + height: 5rem; + + } + + .dialog-item .Bar-Line { + width: calc(5rem + 6px); + height: calc(5rem + 6px); + box-shadow: 0 0 0 1px #fff; + } + + .dialog-body { + padding: 5px 5px + } + + + .TopInfo-content .title { + font-size: 20px; + } + + .ColorBar1-container { + top: 20px; + } + + /* .ColorBar-container { + + left: 0; + top: 20px; + + flex-direction: column; + justify-content: space-evenly; + } */ + } + + + .return { + width: 40px; + height: 40px; + } + + +} + + +/* 移动设备 */ +@media screen and (max-width: 767px) and (min-width: 640px) { + + /* 横屏*/ + @media screen and (max-height: 400px) { + + .ui-bottom { + bottom: 20px; + right: 10px; + /* 通过偏移实现居中 */ + } + + .dialog-item { + width: 7rem; + height: 7rem; + } + + .dialog-item .Bar-Line { + width: calc(7rem + 6px); + height: calc(7rem + 6px); + box-shadow: 0 0 0 1px #fff; + } + + .dialog-body { + padding: 30px 10px !important; + } + + .dialog-bottom { + height: 30px; + } + + } + + + /* 横屏*/ + @media screen and (max-height: 766px) and (min-height: 400px) { + + .ui-bottom { + bottom: 20px; + right: 10px; + /* 通过偏移实现居中 */ + } + + .dialog-item { + width: 9rem; + height: 9rem; + } + + .dialog-item .Bar-Line { + width: calc(9rem + 6px); + height: calc(9rem + 6px); + box-shadow: 0 0 0 1px #fff; + } + + .dialog-body { + padding: 5px 5px + } + + + + } + + + /* 竖屏*/ + @media screen and (min-height: 768px) { + + + .ui-bottom { + bottom: 20px; + right: 10px; + /* 通过偏移实现居中 */ + } + + .dialog-item { + width: 10rem; + height: 10rem; + + } + + .dialog-item .Bar-Line { + width: calc(10rem + 6px); + height: calc(10rem + 6px); + box-shadow: 0 0 0 1px #fff; + } + + .dialog-body { + padding: 5px 5px + } + + .TopInfo-content .title { + font-size: 24px; + } + } + + .return { + width: 50px; + height: 50px; + } +} + + + + +/* 电脑设备 */ +@media screen and (min-width: 768px) { + + + + /* 横屏*/ + @media screen and (max-height: 400px) { + + + + .ui-bottom { + bottom: 20px; + right: 10px; + /* 通过偏移实现居中 */ + } + + .dialog-item { + width: 7rem; + height: 7rem; + } + + .dialog-item .Bar-Line { + width: calc(7rem + 6px); + height: calc(7rem + 6px); + box-shadow: 0 0 0 1px #fff; + } + + .dialog-body { + padding: 30px 10px !important; + } + + + } + + + /* 横屏*/ + @media screen and (min-height: 400px) { + + + .ui-bottom { + right: 20px; + bottom: 0px; + } + + .dialog-item { + width: 12.5rem; + height: 12.5rem; + } + + .dialog-item .Bar-Line { + + width: calc(12.5rem + 6px); + height: calc(12.5rem + 6px); + box-shadow: 0 0 0 1px #fff; + } + + .ColorBar1-container { + top: 40px; + } + + .jiudu { + min-width: 5rem; + height: 2rem; + } + + } + + .return { + width: 50px; + height: 50px; + } + +} \ No newline at end of file diff --git a/src/assets/style/normal.css b/src/assets/style/normal.css new file mode 100644 index 0000000..ae1eab3 --- /dev/null +++ b/src/assets/style/normal.css @@ -0,0 +1,6 @@ +html, +body { + overflow: hidden; + margin : 0; + padding : 0; +} \ No newline at end of file diff --git a/src/components.d.ts b/src/components.d.ts new file mode 100644 index 0000000..53a8c37 --- /dev/null +++ b/src/components.d.ts @@ -0,0 +1,27 @@ +/* eslint-disable */ +// @ts-nocheck +// Generated by unplugin-vue-components +// Read more: https://github.com/vuejs/core/pull/3399 +// biome-ignore lint: disable +export {} + +/* prettier-ignore */ +declare module 'vue' { + export interface GlobalComponents { + AnimationCard: typeof import('./components/AnimationCard.vue')['default'] + AnimationControls: typeof import('./components/AnimationControls.vue')['default'] + AnimationLibrary: typeof import('./components/AnimationLibrary.vue')['default'] + AnimationManager: typeof import('./components/AnimationManager.vue')['default'] + ButtonToggle: typeof import('./components/ButtonToggle.vue')['default'] + ColorPicker: typeof import('./components/ColorPicker.vue')['default'] + CustomizationIndex: typeof import('./components/CustomizationIndex.vue')['default'] + ItemSelector: typeof import('./components/ItemSelector.vue')['default'] + MaterialColorPicker: typeof import('./components/MaterialColorPicker.vue')['default'] + PresetPanel: typeof import('./components/PresetPanel.vue')['default'] + RouterLink: typeof import('vue-router')['RouterLink'] + RouterView: typeof import('vue-router')['RouterView'] + Simple3DView: typeof import('./components/Simple3DView.vue')['default'] + SliderControl: typeof import('./components/SliderControl.vue')['default'] + TabContent: typeof import('./components/TabContent.vue')['default'] + } +} diff --git a/src/components/CUSTOMIZATION_README.md b/src/components/CUSTOMIZATION_README.md new file mode 100644 index 0000000..a90d40d --- /dev/null +++ b/src/components/CUSTOMIZATION_README.md @@ -0,0 +1,118 @@ +# 定制化功能使用说明 + +## 概述 + +这是一个基于Babylon.js的定制化系统,允许用户在3D模型上添加图形和颜色层。系统采用了模块化设计,遵循项目的编码规范。 + +## 架构说明 + +### 1. AppCustomization (核心逻辑) +- **位置**: `src/script/public/AppCustomization.ts` +- **功能**: + - 管理动态纹理的创建和更新 + - 监听Pinia store的变化并更新纹理 + - 处理图形的绘制和矩形填充 + - 资源加载管理 + +### 2. CustomizationStore (状态管理) +- **位置**: `src/stores/customization.ts` +- **功能**: + - 管理层的状态(最多5层) + - 提供层的增删改查功能 + - 触发纹理更新标记 + +### 3. CustomizationIndex (UI组件) +- **位置**: `src/components/CustomizationIndex.vue` +- **功能**: + - 显示内容选择界面(颜色和图形) + - 显示层控制面板(位置、尺寸、旋转等参数) + - 显示层列表和操作按钮 + +## 使用方法 + +### 1. 基本使用 + +系统已经集成到 `MainApp.vue` 中,UI组件会自动显示。 + +### 2. 初始化 + +在 `View.vue` 中,store会在组件挂载时自动初始化: + +```typescript +onMounted(() => { + customizationStore.initializeLayers(); +}); +``` + +### 3. 添加图形资源 + +在 `AppCustomization.ts` 中的 `loadGraphicAssets` 方法中配置图形资源: + +```typescript +const graphicNames = [ + 'Babylon Logo', + 'Flame Skull', + // ... 添加更多图形名称 +] +``` + +### 4. 应用贴花材质到模型 + +在模型加载完成后,可以通过 `MainEditor` 获取 `AppCustomization` 实例: + +```typescript +const customization = mainEditor.mainApp.appCustomization; +await customization.createDecalMaterial(baseMaterial, shaderJsonPath); +customization.applyDecalMaterialToMesh(mesh); +``` + +## 工作原理 + +1. **纹理更新流程**: + - 用户在UI中修改层参数 + - Store中的 `textureUpdateTrigger` 增加 + - `AppCustomization` 监听到变化 + - 调用 `updateImprintTexture()` 重新绘制纹理 + - 纹理自动更新到3D场景 + +2. **层管理**: + - 最多支持5个层 + - 每个层可以是颜色(矩形)或图形 + - 层可以上下移动调整顺序 + - 每个层都有独立的参数控制 + +## 扩展说明 + +### 添加新的图形资源 + +1. 将图形文件放在服务器资源目录 +2. 在 `AppCustomization.loadGraphicAssets()` 中添加资源名称 +3. 资源会自动加载并添加到store中 + +### 修改层数量 + +在 `stores/customization.ts` 中修改 `maxLayers` 的值: + +```typescript +const maxLayers = ref(5) // 改为你想要的数量 +``` + +### 自定义颜色列表 + +在 `stores/customization.ts` 中修改 `AVAILABLE_COLORS` 数组。 + +## 注意事项 + +1. 纹理更新使用了防抖机制(100ms),避免频繁更新 +2. 确保图形资源的路径配置正确 +3. 贴花材质需要对应的着色器JSON文件 +4. 纹理尺寸固定为 683x2048,如需修改请修改 `AppCustomization` 中的常量 + +## 技术特点 + +- ✅ 模块化设计,易于扩展 +- ✅ 使用Pinia进行状态管理 +- ✅ 响应式更新,自动同步UI和3D场景 +- ✅ 防抖优化,提升性能 +- ✅ 符合项目编码规范 + diff --git a/src/components/CustomizationIndex.vue b/src/components/CustomizationIndex.vue new file mode 100644 index 0000000..0540e9d --- /dev/null +++ b/src/components/CustomizationIndex.vue @@ -0,0 +1,481 @@ + + + + + diff --git a/src/components/index.html b/src/components/index.html new file mode 100644 index 0000000..49df134 --- /dev/null +++ b/src/components/index.html @@ -0,0 +1,76 @@ + + + + + + Babylon.js Playground + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/env.d.ts b/src/env.d.ts new file mode 100644 index 0000000..aafef95 --- /dev/null +++ b/src/env.d.ts @@ -0,0 +1,8 @@ +/// + +declare module '*.vue' { + import type { DefineComponent } from 'vue' + // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/ban-types + const component: DefineComponent<{}, {}, any> + export default component +} diff --git a/src/index.html b/src/index.html new file mode 100644 index 0000000..49df134 --- /dev/null +++ b/src/index.html @@ -0,0 +1,76 @@ + + + + + + Babylon.js Playground + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/index.js b/src/index.js new file mode 100644 index 0000000..0ed2413 --- /dev/null +++ b/src/index.js @@ -0,0 +1,765 @@ +var createScene = async function () { + // This creates a basic Babylon Scene object (non-mesh) + var scene = new BABYLON.Scene(engine); + const server = "https://patrickryanms.github.io/BabylonJStextures/Demos/productCustomizer/"; + + const screen = {}; + // determine the size of the viewport minus the gutter based on the current window width + function setViewportSize() { + screen.width = engine.getRenderWidth(); + screen.height = engine.getRenderHeight(); + screen.ratio = screen.width / screen.height; + camera.productWidth = 0.6; + camera.product.viewport = new BABYLON.Viewport(1.0 - camera.productWidth, 0.0, camera.productWidth, 1.0); + } + + function updateViewportSize() { + screen.width = engine.getRenderWidth(); + screen.height = engine.getRenderHeight(); + screen.ratio = screen.width / screen.height; + // resize content buttons based on screen size + for (let control of gui.contentButtons) { + if (screen.ratio < 0.6) { + let calculatedWidth = ((screen.width * gui.layoutGrid.getColumnDefinition(0)._value) / gui.contentButtonsGrid.columnCount) * 0.7; + control.width = Math.floor(calculatedWidth).toString() + "px"; + } + else { + let calculatedHeight = ((screen.height * gui.layoutGrid.getRowDefinition(1)._value)/ gui.contentButtonsGrid.rowCount) * 0.7; + control.height = Math.floor(calculatedHeight).toString() + "px"; + } + } + // resize layer buttons based on screen size + if (gui.buttons !== undefined) { + for (let control of gui.buttons) { + if (screen.ratio < 0.6 && control.name.split("_")[2] !== "selectButton") { + if (control._children[0] !== undefined) { + control._children[0].height = "95%"; + } + let calculatedWidth = ((screen.width * gui.layoutGrid.getColumnDefinition(0)._value) * gui.layerUiGrid[0].getColumnDefinition(1)._value); + control.width = Math.floor(calculatedWidth).toString() + "px"; + } + else { + if (control._children[0] !== undefined) { + control._children[0].height = "60%"; + } + let calculatedHeight = ((screen.height * gui.layoutGrid.getRowDefinition(0)._value) * gui.layersGrid.getRowDefinition(1)._value); + control.height = Math.floor(calculatedHeight).toString() + "px"; + } + } + } + // resize layer grid width based on screen size for button position + if (gui.layerUiGrid !== undefined) { + for (let layer of gui.layerUiGrid) { + if (screen.ratio < 0.6) { + layer.setColumnDefinition(1, 0.18, false); + layer.setColumnDefinition(2, 0.18, false); + layer.setColumnDefinition(3, 0.18, false); + } + else { + layer.setColumnDefinition(1, 60, true); + layer.setColumnDefinition(2, 60, true); + layer.setColumnDefinition(3, 60, true); + } + } + } + // resize viewport based on screen size + if (gui.layoutGrid !== undefined) { + if (screen.ratio < 0.9) { + gui.layoutGrid.setColumnDefinition(0, 0.5, false); + gui.layoutGrid.setColumnDefinition(1, 0.5, false); + camera.productWidth = 0.5; + } + else if (screen.ratio > 0.9 && screen.ratio < 1.5) { + gui.layoutGrid.setColumnDefinition(0, 0.4, false); + gui.layoutGrid.setColumnDefinition(1, 0.6, false); + camera.productWidth = 0.6; + } + else { + gui.layoutGrid.setColumnDefinition(0, 0.25, false); + gui.layoutGrid.setColumnDefinition(1, 0.75, false); + camera.productWidth = 0.75; + } + camera.product.viewport.x = 1.0 - camera.productWidth; + camera.product.viewport.width = camera.productWidth; + } + } + + // create camera and lights for scene + const lights = {}; + const env = {}; + const camera = {}; + const mask = { + gui : 0x01000000, + product: 0x10000000, + }; + async function initScene() { + // color of scene when no skybox present + scene.clearColor = BABYLON.Color3.FromInts(30, 30, 35); + + // standard ArcRotate camera + camera.product = new BABYLON.ArcRotateCamera("productCamera", -2.183, Math.PI/2, 1.3, new BABYLON.Vector3(0.0, 0.0, 0.0), scene); + camera.product.minZ = 0.1; + camera.product.lowerRadiusLimit = 0.55; + camera.product.upperRadiusLimit = 3.0; + camera.product.wheelDeltaPercentage = 0.1; + camera.product.panningAxis = new BABYLON.Vector3(0.0, 0.0, 0.0); + camera.product.attachControl(canvas, true); + camera.product.layerMask = mask.product; + + camera.gui = new BABYLON.ArcRotateCamera("guiCamera", 0.0, 0.0, 1.0, new BABYLON.Vector3(0.0, 0.0, 0.0), scene); + camera.gui.layerMask = mask.gui; + setViewportSize(); + engine.onResizeObservable.add(updateViewportSize); + + scene.activeCameras.push(camera.product); + scene.activeCameras.push(camera.gui); + + // add in IBL with linked environment + env.lighting = BABYLON.CubeTexture.CreateFromPrefilteredData(server + "assets/env/studio.env", scene); + env.lighting.name = "studioIBL"; + env.lighting.gammaSpace = false; + env.lighting.rotationY = 3.14; + scene.environmentTexture = env.lighting; + scene.environmentIntensity = 1.0; + + // directional light needed for shadows + lights.dirLight = new BABYLON.DirectionalLight("dirLight", new BABYLON.Vector3(0.45, -0.34, -0.83), scene); + lights.dirLight.position = new BABYLON.Vector3(0, 3, 5); + lights.dirLight.intensity = 1; + } + + const assets = { + manager : new BABYLON.AssetsManager(scene), + graphics : [] + } + const imprintWidth = 683; + const imprintHeight = 2048; + const imprint = { + texture : new BABYLON.DynamicTexture("decalTex", {width: imprintWidth, height: imprintHeight}, scene), + defaultBackground : new BABYLON.Color4(1.0, 0.0, 0.0, 1.0).toHexString(), + graphics : [] + }; + imprint.context = imprint.texture.getContext(); + + const maxLayers = 5; + const layers = []; + async function loadAssets() { + // mesh tasks + assets.skateboard = assets.manager.addMeshTask("load skateboard", "", server + "assets/gltf/skateboard_mesh.glb") + + // image tasks + assets.graphics.push(assets.manager.addImageTask("load image_Babylon Logo", server + "assets/textures/babylonLogo.png")); + assets.graphics.push(assets.manager.addImageTask("load image_Flame Skull", server + "assets/textures/flameSkull.png")); + assets.graphics.push(assets.manager.addImageTask("load image_Blue Character", server + "assets/textures/cartoonHead_blue.png")); + assets.graphics.push(assets.manager.addImageTask("load image_Orange Character", server + "assets/textures/cartoonHead_orange.png")); + assets.graphics.push(assets.manager.addImageTask("load image_Purple Character", server + "assets/textures/cartoonHead_purple.png")); + assets.graphics.push(assets.manager.addImageTask("load image_Pony", server + "assets/textures/pony.png")); + assets.graphics.push(assets.manager.addImageTask("load image_Rays", server + "assets/textures/rays.png")); + assets.graphics.push(assets.manager.addImageTask("load image_Waves", server + "assets/textures/waves.png")); + assets.moveUpIcon = assets.manager.addImageTask("load move up icon", server + "assets/textures/upArrowCircle.svg"); + assets.moveDownIcon = assets.manager.addImageTask("load move up icon", server + "assets/textures/downArrowCircle.svg"); + assets.cancelIcon = assets.manager.addImageTask("load move up icon", server + "assets/textures/cancelCircle.svg"); + assets.addIcon = assets.manager.addImageTask("load move up icon", server + "assets/textures/addCircle.svg"); + assets.colors = [ + "Azure", + "Black", + "DarkGray", + "DimGray", + "Red", + "FireBrick", + "DeepPink", + "OrangeRed", + "Orange", + "Gold", + "Yellow", + "RoyalBlue", + "CornflowerBlue", + "DeepSkyBlue", + "DarkGreen", + "ForestGreen", + "GreenYellow", + "RebeccaPurple", + "DarkViolet", + "MediumPurple", + ] + + // text tasks + assets.decalShaderText = assets.manager.addTextFileTask("load decal node material", server + "assets/shaders/decalShader.json"); + + // call all loading tasks + assets.manager.load(); + + // task error handling + assets.manager.onTaskErrorObservable.add((task) => { + console.log("Error loading task: " + task.name); + console.log(task.errorObject.message, task.errorObject.exception); + }); + + // wait for all tasks to complete + assets.manager.onFinish = (tasks) => { + console.log("All tasks complete!", tasks); + + // set graphic properties array + for (let loaded of assets.graphics) { + imprint.graphics.push({ + image : loaded.image, + ratio : loaded.image.width / loaded.image.height, + size : loaded.image.width, + name : loaded.name.split("_")[1] + }); + } + + // skateboard root + assets.skateboardRoot = assets.skateboard.loadedMeshes[0]; + assets.skateboardRoot.name = "skateboardRoot"; + assets.skateboardMesh = assets.skateboard.loadedMeshes[1]; + for (let child of assets.skateboard.loadedMeshes) { + child.layerMask = mask.product; + } + + // parse loaded node material to json + assets.decalShaderJson = JSON.parse(assets.decalShaderText.text); + + // set up layer data array + for (let i = 0; i < maxLayers; i++) { + layers.push({ + name: undefined, + graphic : undefined, + rectangle: false, + ratio : 1.0, + horizontal : 0.0, + vertical : 0.0, + size : 512, + rotation : 0.0, + width: 1.0, + height : 1.0, + fillStyle : new BABYLON.Color4(0.0, 0.0, 0.0, 0.0).toHexString() + }); + } + + // create materials for scene meshes + createMaterials(); + createGUI(); + createContentButtons(); + } + } + + // prevent updating dynamic texture when setting slider values while changing layers + let activeUpdate = true; + // update dynamic texture + async function updateimprint() { + // clear imprint + imprint.context.clearRect(0, 0, imprintWidth, imprintHeight); + // only update dynamic texture if the user is actively changing a GUI slider + if (activeUpdate) { + for (let thisLayer of layers) { + if (thisLayer.graphic !== undefined) { + // save context + imprint.context.save(); + + // set rotation center accounting for manual offset + const graphicU = thisLayer.horizontal * imprintWidth * 0.5; + const graphicV = thisLayer.vertical * imprintHeight * -0.5; + imprint.context.translate(imprintWidth * 0.5 + graphicU, imprintHeight * 0.5 + graphicV); + + // determine position of graphic on texture in pixels + const left = thisLayer.size * thisLayer.ratio * -0.5; + const top = thisLayer.size * -0.5; + + // rotate layer and draw graphic + imprint.context.rotate(thisLayer.rotation); + imprint.context.drawImage(thisLayer.graphic, left, top, thisLayer.ratio * thisLayer.size, thisLayer.size); + + // restore context pre-rotation + imprint.context.restore(); + } + else if (thisLayer.rectangle) { + // save context + imprint.context.save(); + + // set bounds of rectangle + const left = (1 - thisLayer.width) * 0.5 * imprintWidth; + const top = (1- thisLayer.height) * 0.5 * imprintHeight; + const width = thisLayer.width * imprintWidth; + const height = thisLayer.height * imprintHeight; + + const offsetU = thisLayer.horizontal * imprintWidth * 0.5; + const offsetV = thisLayer.vertical * imprintHeight * -0.5; + + // translate center for rotation + const rectangleU = width * 0.5 + left; + const rectangleV = height * 0.5 + top; + imprint.context.translate(rectangleU + offsetU, rectangleV + offsetV); + + // rotate context before drawing + imprint.context.rotate(thisLayer.rotation); + + // draw rectangle + imprint.context.fillStyle = thisLayer.fillStyle; + imprint.context.fillRect(-width * 0.5, -height * 0.5, width, height); + + // restore context + imprint.context.restore(); + } + else { + continue; + } + } + // update texture + imprint.texture.update(); + } + } + + // create materials for scene meshes + // ignore textures embedded in shader when loading + BABYLON.NodeMaterial.IgnoreTexturesAtLoadTime = true; + const meshesMats = {}; + async function createMaterials() { + meshesMats.skateboard = BABYLON.NodeMaterial.Parse(assets.decalShaderJson, scene); + meshesMats.skateboard.name = "skateboardDecalMat"; + + // create default dynamic texture + updateimprint(); + + // get texture blocks and assign PBR textures from loaded mesh and dynamic texture + meshesMats.skateboard.getBlockByName("decalTex").texture = imprint.texture; + meshesMats.skateboard.getBlockByName("baseColorTex").texture = assets.skateboardMesh.material.albedoTexture; + meshesMats.skateboard.getBlockByName("ormTex").texture = assets.skateboardMesh.material.metallicTexture; + meshesMats.skateboard.getBlockByName("normalTex").texture = assets.skateboardMesh.material.bumpTexture; + assets.skateboardMesh.material.dispose(); + assets.skateboardMesh.material = meshesMats.skateboard; + } + + // create GUI AdvancedDynamicTexture + const gui = { + texture : await BABYLON.GUI.AdvancedDynamicTexture.ParseFromFileAsync(server + "assets/gui/imprintCustomizationGui.json"), + contentButtons : [] + }; + // dynamically create content buttons + function createContentButtons() { + let lastButton = 0; + // create color buttons from colors array + for (let i = 0; i < assets.colors.length; i++) { + const button = new BABYLON.GUI.Button(assets.colors[i]); + button.fixedRatio = 1.0; + button.thickness = 2; + button.background = assets.colors[i]; + button.onPointerClickObservable.add(function() { + layers[currentLayer].name = button.name; + layers[currentLayer].fillStyle = button.name; + layers[currentLayer].rectangle = true; + layers[currentLayer].graphic = undefined; + layers[currentLayer].width = 1.0; + loadLayerContentUI(currentLayer); + updateLayerNames(); + updateGUI(layers[currentLayer]); + showLayerControls(); + updateimprint(); + }); + gui.contentButtonsGrid.addControl(button, Math.floor(i / 4), i % 4); + gui.contentButtons.push(button); + lastButton = i + 1; + } + // create graphic buttons from graphics array + for (let i = lastButton; i < assets.graphics.length + lastButton; i++) { + const button = BABYLON.GUI.Button.CreateImageOnlyButton(assets.graphics[i - lastButton].name.split("_")[1], assets.graphics[i - lastButton].url); + button.image.width = 0.8; + button.image.height = 0.8; + button.image.horizontalAlignment = BABYLON.GUI.Control.HORIZONTAL_ALIGNMENT_CENTER; + button.image.verticalAlignment = BABYLON.GUI.Control.VERTICAL_ALIGNMENT_CENTER; + button.fixedRatio = 1.0; + button.thickness = 2; + button.background = "black"; + button.onPointerClickObservable.add(function() { + layers[currentLayer].name = button.name; + layers[currentLayer].fillStyle = undefined; + layers[currentLayer].rectangle = false; + for (let graphic of assets.graphics) { + if (graphic.name.split("_")[1] === button.name) { + layers[currentLayer].graphic = graphic.image; + } + } + loadLayerContentUI(currentLayer); + updateLayerNames(); + updateGUI(layers[currentLayer]); + showLayerControls(); + updateimprint(); + }); + gui.contentButtonsGrid.addControl(button, Math.floor(i / 4), i % 4); + gui.contentButtons.push(button); + } + updateViewportSize(); + } + + // change visibility of GUI grids to show content buttons + let currentLayer = undefined; + function chooseContent() { + updateActiveLayer(); + gui.slidersGrid.isVisible = false; + gui.contentButtonsGrid.isVisible = true; + } + + // change visibility of GUI grids to show layer parameter sliders + function showLayerControls() { + updateActiveLayer(); + gui.slidersGrid.isVisible = true; + gui.contentButtonsGrid.isVisible = false; + } + + // update GUI layer background color to highlight active layer + function updateActiveLayer() { + updateGUI(layers[currentLayer]); + for (let rect of gui.layerBG) { + if (parseInt(rect.name.split("_")[1], 10) === currentLayer) { + rect.background = gui.highlightLayerColor; + } + else { + rect.background = gui.layerColor; + } + } + } + + // update layers array to move layer parameters up or down one index position + function moveLayer(index, direction) { + const temp = layers[index]; + if (direction === "up") { + layers[index] = layers[index - 1]; + layers[index - 1] = temp; + } + else if (direction === "down") { + layers[index] = layers[index + 1]; + layers[index + 1] = temp; + } + updateGUI(layers[currentLayer]); + updateimprint(); + updateLayerNames(); + gui.slidersGrid.isVisible = false; + gui.contentButtonsGrid.isVisible = false; + } + + // update GUI layer names to match layers array + function updateLayerNames() { + for (let i=0; i < layers.length; i++) { + for (let target of gui.layerUiGrid) { + if (parseInt(target.name.split("_")[1]) === i) { + for (let control of target.getDescendants(false)) { + if (control.name.split("_")[2] === "contentName") { + if (layers[i].name !== undefined) + { + loadLayerContentUI(i); + control.text = layers[i].name; + } + else { + unloadLayerContentUI(i); + } + } + } + } + } + } + } + + // update layer to hide insert button and show layer action buttons when content selected for layer + function loadLayerContentUI(index) { + for (let button of gui.buttons) { + if (button.name.split("_")[2] === "insertButton" && button.name.split("_")[1] === index.toString()) { + button.isVisible = false; + } + } + for (let grid of gui.layerUiGrid) { + if (grid.name.split("_")[1] === index.toString()) { + grid.isVisible = true; + } + } + } + + // update layer to hide layer action buttons and show insert button when content deleted from layer + function unloadLayerContentUI(index) { + for (let button of gui.buttons) { + if (button.name.split("_")[2] === "insertButton" && button.name.split("_")[1] === index.toString()) { + button.isVisible = true; + } + } + for (let grid of gui.layerUiGrid) { + if (grid.name.split("_")[1] === index.toString()) { + grid.isVisible = false; + } + } + } + + // revert layer parameters in layers array to default values when content deleted from layer + function removeLayerGraphic(index) { + layers[index].name = undefined; + layers[index].graphic = undefined; + layers[index].rectangle = false; + layers[index].ratio = 1.0; + layers[index].horizontal = 0.0; + layers[index].vertical = 0.0; + layers[index].size = 512; + layers[index].rotation = 0.0; + layers[index].width = 1.0; + layers[index].height = 1.0; + layers[index].fillStyle = new BABYLON.Color4(0.0, 0.0, 0.0, 0.0).toHexString(); + currentLayer = undefined; + updateActiveLayer(); + gui.slidersGrid.isVisible = false; + gui.contentButtonsGrid.isVisible = false; + updateimprint(); + } + + // define GUI style parameters and actions for interactivity + gui.texture.layer.layerMask = mask.gui; + gui.layerColor = "#381A1AFF"; + gui.highlightLayerColor = "#e42d2dFF"; + gui.layerUiGrid = []; + async function createGUI() { + // get grid controls and set pointer blocker to false + for (let grid of gui.texture.getControlsByType("Grid")) { + grid.isPointerBlocker = false; + if (grid.name === "layout") { + gui.layoutGrid = grid; + } + if (grid.name === "layers") { + gui.layersGrid = grid; + } + if (grid.name === "sliders") { + gui.slidersGrid = grid; + gui.slidersGrid.isVisible = false; + } + if (grid.name === "contentButtons") { + gui.contentButtonsGrid = grid; + gui.contentButtonsGrid.isVisible = false; + } + if (grid.name.split("_")[2] === "uiGrid") { + gui.layerUiGrid.push(grid); + } + } + + // get rectangle controls and set pointer blocker to false + for (let rect of gui.texture.getControlsByType("Rectangle")) { + rect.isPointerBlocker = false; + } + + // get slider title and slider controls and set alignment on text for all avalable parameters + gui.slider_horizontal_title = gui.texture.getControlByName("slider_horizontal_title"); + gui.slider_horizontal_title.textHorizontalAlignment = BABYLON.GUI.Control.HORIZONTAL_ALIGNMENT_RIGHT; + gui.slider_horizontal = gui.texture.getControlByName("slider_horizontal"); + gui.slider_horizontal.onValueChangedObservable.add(function(value) { + layers[currentLayer].horizontal = value; + if (activeUpdate) { + updateimprint(); + } + }); + + gui.slider_vertical_title = gui.texture.getControlByName("slider_vertical_title"); + gui.slider_vertical_title.textHorizontalAlignment = BABYLON.GUI.Control.HORIZONTAL_ALIGNMENT_RIGHT; + gui.slider_vertical = gui.texture.getControlByName("slider_vertical"); + gui.slider_vertical.onValueChangedObservable.add(function(value) { + layers[currentLayer].vertical = value; + if (activeUpdate) { + updateimprint(); + } + }); + + gui.slider_size_title = gui.texture.getControlByName("slider_size_title"); + gui.slider_size_title.textHorizontalAlignment = BABYLON.GUI.Control.HORIZONTAL_ALIGNMENT_RIGHT; + gui.slider_size = gui.texture.getControlByName("slider_size"); + gui.slider_size.onValueChangedObservable.add(function(value) { + layers[currentLayer].size = value; + if (activeUpdate) { + updateimprint(); + } + }); + + gui.slider_width_title = gui.texture.getControlByName("slider_width_title"); + gui.slider_width_title.textHorizontalAlignment = BABYLON.GUI.Control.HORIZONTAL_ALIGNMENT_RIGHT; + gui.slider_width = gui.texture.getControlByName("slider_width"); + gui.slider_width.onValueChangedObservable.add(function(value) { + layers[currentLayer].width = value; + if (activeUpdate) { + updateimprint(); + } + }); + + gui.slider_height_title = gui.texture.getControlByName("slider_height_title"); + gui.slider_height_title.textHorizontalAlignment = BABYLON.GUI.Control.HORIZONTAL_ALIGNMENT_RIGHT; + gui.slider_height = gui.texture.getControlByName("slider_height"); + gui.slider_height.onValueChangedObservable.add(function(value) { + if (layers[currentLayer].rectangle) { + layers[currentLayer].height = value; + if (activeUpdate) { + updateimprint(); + } + } + else { + layers[currentLayer].rotation = value; + if (activeUpdate) { + updateimprint(); + } + } + }); + + gui.slider_rotation_title = gui.texture.getControlByName("slider_rotation_title"); + gui.slider_rotation_title.textHorizontalAlignment = BABYLON.GUI.Control.HORIZONTAL_ALIGNMENT_RIGHT; + gui.slider_rotation = gui.texture.getControlByName("slider_rotation"); + gui.slider_rotation.onValueChangedObservable.add(function(value) { + layers[currentLayer].rotation = value; + if (activeUpdate) { + updateimprint(); + } + }); + + // get layers backgrounds + gui.layerBG = []; + for (let rect of gui.texture.getControlsByType("Rectangle")) { + if (rect.name.split("_")[2] === "bg") { + gui.layerBG.push(rect); + } + } + + // assign icons and actions to buttons + gui.buttons = gui.texture.getControlsByType("Button"); + for (let button of gui.buttons) { + button.width = "100%"; + button.fixedRatio = 1.0; + if (button._children[0] !== undefined) { + button._children[0].height = "100%"; + button._children[0].fixedRatio = 1.0; + } + if (button.name.split("_")[2] === "upButton") { + button._children[0].source = assets.moveUpIcon.url; + button.isVisible = true; + button.onPointerClickObservable.add(function() { + moveLayer(parseInt(button.name.split("_")[1]), "up"); + currentLayer = undefined; + updateActiveLayer(); + }); + } + if (button.name.split("_")[2] === "downButton") { + button._children[0].source = assets.moveDownIcon.url; + button.isVisible = true; + button.onPointerClickObservable.add(function() { + moveLayer(parseInt(button.name.split("_")[1]), "down"); + currentLayer = undefined; + updateActiveLayer(); + }); + } + if (button.name.split("_")[2] === "insertButton") { + button._children[0].source = assets.addIcon.url; + button.onPointerClickObservable.add(function() { + currentLayer = parseInt(button.name.split("_")[1]); + chooseContent(); + }); + } + if (button.name.split("_")[2] === "deleteButton") { + button._children[0].source = assets.cancelIcon.url; + button.isVisible = true; + button.onPointerClickObservable.add(function() { + unloadLayerContentUI(parseInt(button.name.split("_")[1])); + removeLayerGraphic(parseInt(button.name.split("_")[1])) + }); + } + if (button.name.split("_")[2] === "selectButton") { + button.fixedRatio = 0.0; + button.onPointerClickObservable.add(function() { + currentLayer = parseInt(button.name.split("_")[1]); + updateActiveLayer(); + }); + button.isVisible = true; + } + } + + // get layer textblocks and assign them to the layer array in the correct order + gui.layerContentNames = []; + for (let textBlock of gui.texture.getControlsByType("TextBlock")) { + if (textBlock.name.split("_")[2] === "contentName") { + gui.layerContentNames.push(textBlock); + textBlock.isVisible = true; + } + } + } + + // update sliders panel with the correct controls for the layer + function updateGUI(layer) { + if (layer !== undefined) { + } + if (currentLayer !== undefined) { + // disable update for dynamic texture when setting sliders due to layer change + activeUpdate = false; + gui.slidersGrid.isVisible = true; + + // update sliders for rectangle content parameters + if (layer.rectangle && layer.graphic === undefined) { + gui.slider_horizontal.minimum = -1; + gui.slider_horizontal.maximum = 1; + gui.slider_horizontal.value = layer.horizontal; + + gui.slider_vertical.minimum = -1; + gui.slider_vertical.maximum = 1; + gui.slider_vertical.value = layer.vertical; + + gui.slider_size_title.isVisible = false; + gui.slider_size.isVisible = false; + + gui.slider_width_title.isVisible = true; + gui.slider_width.isVisible = true; + gui.slider_width.minimum = 0; + gui.slider_width.maximum = 2; + gui.slider_width.value = layer.width; + + gui.slider_height_title.isVisible = true; + gui.slider_height.isVisible = true; + gui.slider_height.minimum = 0; + gui.slider_height.maximum = 2; + gui.slider_height.value = layer.height; + + gui.slidersGrid.removeControl(gui.slider_rotation_title) + gui.slidersGrid.addControl(gui.slider_rotation_title, 5, 0) + gui.slidersGrid.removeControl(gui.slider_rotation) + gui.slidersGrid.addControl(gui.slider_rotation, 5, 1) + gui.slider_rotation_title.isVisible = true; + gui.slider_rotation.isVisible = true; + gui.slider_rotation.minimum = -Math.PI; + gui.slider_rotation.maximum = Math.PI; + gui.slider_rotation.value = layer.rotation; + } + // update sliders for image content parameters + else { + gui.slider_horizontal.minimum = -2; + gui.slider_horizontal.maximum = 2; + gui.slider_horizontal.value = layer.horizontal; + + gui.slider_vertical.minimum = -2; + gui.slider_vertical.maximum = 2; + gui.slider_vertical.value = layer.vertical; + + gui.slider_size_title.isVisible = true; + gui.slider_size.isVisible = true; + gui.slider_size.minimum = 0; + gui.slider_size.maximum = 2048; + gui.slider_size.value = layer.size; + + gui.slider_width_title.isVisible = false; + gui.slider_width.isVisible = false; + gui.slider_height_title.isVisible = false; + gui.slider_height.isVisible = false; + + gui.slidersGrid.removeControl(gui.slider_rotation_title) + gui.slidersGrid.addControl(gui.slider_rotation_title, 4, 0) + gui.slidersGrid.removeControl(gui.slider_rotation) + gui.slidersGrid.addControl(gui.slider_rotation, 4, 1) + gui.slider_rotation.minimum = -Math.PI; + gui.slider_rotation.maximum = Math.PI; + gui.slider_rotation.value = layer.rotation; + } + activeUpdate = true; + } + } + + // scene logic + initScene(); + await loadAssets(); + + return scene; +}; +export default createScene diff --git a/src/main.ts b/src/main.ts new file mode 100644 index 0000000..14515f8 --- /dev/null +++ b/src/main.ts @@ -0,0 +1,17 @@ +import { createApp } from 'vue' +import App from './App.vue' +import router from './router' +import vuetify from './plugins/vuetify' +import '@/assets/style/normal.css' +import '@/assets/style/components.css' +import '@/assets/style/global.css' +import '@/assets/style/media.css' +import pinia from './stores' + +// 创建Vue应用实例 +const app = createApp(App) + +app.use(pinia) +app.use(router) +app.use(vuetify) +app.mount('#app') \ No newline at end of file diff --git a/src/pages/MainApp.vue b/src/pages/MainApp.vue new file mode 100644 index 0000000..e6f82ad --- /dev/null +++ b/src/pages/MainApp.vue @@ -0,0 +1,178 @@ + + + + + diff --git a/src/pages/README.md b/src/pages/README.md new file mode 100644 index 0000000..341536c --- /dev/null +++ b/src/pages/README.md @@ -0,0 +1,5 @@ +# Pages + +Vue components created in this folder will automatically be converted to navigatable routes. + +Full documentation for this feature can be found in the Official [unplugin-vue-router](https://github.com/posva/unplugin-vue-router) repository. diff --git a/src/pages/View.vue b/src/pages/View.vue new file mode 100644 index 0000000..dff5be8 --- /dev/null +++ b/src/pages/View.vue @@ -0,0 +1,103 @@ + + + + + diff --git a/src/plugins/README.md b/src/plugins/README.md new file mode 100644 index 0000000..62201c7 --- /dev/null +++ b/src/plugins/README.md @@ -0,0 +1,3 @@ +# Plugins + +Plugins are a way to extend the functionality of your Vue application. Use this folder for registering plugins that you want to use globally. diff --git a/src/plugins/index.ts b/src/plugins/index.ts new file mode 100644 index 0000000..d3c748a --- /dev/null +++ b/src/plugins/index.ts @@ -0,0 +1,18 @@ +/** + * plugins/index.ts + * + * Automatically included in `./src/main.ts` + */ + +// Plugins +import vuetify from './vuetify' +import router from '../router' + +// Types +import type { App } from 'vue' + +export function registerPlugins (app: App) { + app + .use(vuetify) + .use(router) +} diff --git a/src/plugins/vuetify.ts b/src/plugins/vuetify.ts new file mode 100644 index 0000000..861a7e4 --- /dev/null +++ b/src/plugins/vuetify.ts @@ -0,0 +1,19 @@ +/** + * plugins/vuetify.ts + * + * Framework documentation: https://vuetifyjs.com` + */ + +// Styles +import '@mdi/font/css/materialdesignicons.css' +import 'vuetify/styles' + +// Composables +import { createVuetify } from 'vuetify' + +// https://vuetifyjs.com/en/introduction/why-vuetify/#feature-guides +export default createVuetify({ + theme: { + defaultTheme: 'system', + }, +}) diff --git a/src/router/index.ts b/src/router/index.ts new file mode 100644 index 0000000..1de7e2e --- /dev/null +++ b/src/router/index.ts @@ -0,0 +1,23 @@ +import { createRouter, createWebHashHistory } from 'vue-router' +import MainApp from '@/pages/MainApp.vue' + +const routes = [ + { + path: '/', + name: 'home', + component: MainApp, + }, + + { + path: '/:pathMatch(.*)*', // 匹配所有未定义路由 + name: 'NotFound', + component: MainApp, + }, +] + +const router = createRouter({ + history: createWebHashHistory(), // hash 模式 + routes, +}) + +export default router diff --git a/src/script/MainEditor.ts b/src/script/MainEditor.ts new file mode 100644 index 0000000..21fc0f0 --- /dev/null +++ b/src/script/MainEditor.ts @@ -0,0 +1,116 @@ +import { AppConfig, MainApp } from '@/script/core' +import { Vector3 } from '@babylonjs/core' +class MainEditor { + mainApp!: MainApp + constructor() { + this.mainApp = new MainApp() + + } + async Awake() { + this.mainApp.Awake() + + } + + + + + loadModel(config: AppConfig){ + this.mainApp.loadAConfig(config) + this.mainApp.loadModel() + + } + + loadAnimation(config: AppConfig){ + this.mainApp.loadAConfig(config) + this.mainApp.loadAnimation() + } + + + /** + * + * @param from 从哪开始 + * @param to 从哪结束 + * @param speed 速度 + * @returns + */ + + + + + //分辨率等级 + setLevel(level: number) { + // this.mainApp.appEngin.object.setHardwareScalingLevel(level) + } + + onClickModel(callback: Function) { + // this.mainApp.appRay.onPointerDown(callback) + } + + // 重置相机位置 + resetCamera() { + if (this.mainApp.appCamera && this.mainApp.appCamera.object) { + // 重置到初始位置 + // this.mainApp.appCamera.object.setPosition(new Vector3(0, 0, 6)) + // this.mainApp.appCamera.setTarget(0, 0, 0) + console.log('相机已重置到初始位置') + } + } + + // 切换自动旋转 + toggleAutoRotate() { + if (this.mainApp.appCamera && this.mainApp.appCamera.object) { + const camera = this.mainApp.appCamera.object + if (camera.useAutoRotationBehavior) { + // 停止自动旋转 + camera.useAutoRotationBehavior = false + console.log('自动旋转已停止') + return false + } else { + // 开始自动旋转 + camera.useAutoRotationBehavior = true + if (camera.autoRotationBehavior) { + camera.autoRotationBehavior.idleRotationSpeed = 0.5 // 设置旋转速度 + camera.autoRotationBehavior.idleRotationWaitTime = 1000 // 等待时间 + } + console.log('自动旋转已开启') + return true + } + } + return false + } + + // 获取当前自动旋转状态 + getAutoRotateState() { + if (this.mainApp.appCamera && this.mainApp.appCamera.object) { + return this.mainApp.appCamera.object.useAutoRotationBehavior || false + } + return false + } + + // 获取GameManager实例 + getGameManager() { + return this.mainApp.gameManager + } + + + + // 测试播放所有动画 + testPlayAllAnimations() { + } + + // 播放动画 + playAnimation(animationName?: string, loop: boolean = true) { + } + + + + +// 在MainEditor.ts中完善dispose方法 + async dispose() { + + // 释放引擎资源 + await this.mainApp.dispose(); + + } +} +export default MainEditor diff --git a/src/script/base/Monobehiver.ts b/src/script/base/Monobehiver.ts new file mode 100644 index 0000000..0364fd7 --- /dev/null +++ b/src/script/base/Monobehiver.ts @@ -0,0 +1,9 @@ +import { MainApp } from 'script/core' + +export class Monobehiver { + mainApp!: MainApp + constructor(mainApp: MainApp) { + this.mainApp = mainApp + } + Awake() {} +} diff --git a/src/script/base/index.ts b/src/script/base/index.ts new file mode 100644 index 0000000..a417576 --- /dev/null +++ b/src/script/base/index.ts @@ -0,0 +1 @@ +export { Monobehiver } from './Monobehiver' diff --git a/src/script/core.ts b/src/script/core.ts new file mode 100644 index 0000000..45ad71e --- /dev/null +++ b/src/script/core.ts @@ -0,0 +1,19 @@ +export { AppCamera } from '@/script/public/AppCamera' +export { AppEngin } from '@/script/public/AppEngin' +export { AppEnv } from '@/script/public/AppEnv' +export { AppModel } from '@/script/public/AppModel' +export { AppScene } from '@/script/public/AppScene' +export { AppLight } from '@/script/public/AppLight' +export { MainApp } from '@/script/public/MainApp' +export { AppConfig } from '@/script/public/AppConfig' +export { AppRay } from '@/script/public/AppRay' +export { GameManager } from '@/script/public/GameManager' +export { AppDom } from '@/script/public/AppDom' +export { AppTween } from '@/script/public/AppTween' +export { Dimensions } from '@/script/utils/Dimensions' +export { AppHotspot } from '@/script/public/AppHotspot' +export { ForMatTime } from '@/script/utils/ForMatTime' +export { AppFPS } from '@/script/public/AppFPS' +export { AppGlowLayer } from '@/script/public/AppGlowLayer' +export { AppCustomization } from '@/script/public/AppCustomization' +export * from '@/script/utils' diff --git a/src/script/hotspot/HotSpot.ts b/src/script/hotspot/HotSpot.ts new file mode 100644 index 0000000..8c3e662 --- /dev/null +++ b/src/script/hotspot/HotSpot.ts @@ -0,0 +1,110 @@ +import { Point_Pool } from './Point_Pool' +import { Point } from './Point' +import { + AbstractMesh, + ArcRotateCamera, + Engine, + Matrix, + Scene, + Vector3, + Texture, + StandardMaterial, + MeshBuilder, + TransformNode +} from '@babylonjs/core' +import { HotspotPrams } from './HotspotPrams' +import { GameManager, MainApp } from '@/script/core' + +class HotSpot { + _point_Pool!: Point_Pool + body!: HTMLElement + _camera!: ArcRotateCamera + mainApp!: MainApp + hotspotTexture!: Texture + hotspotMaterial!: StandardMaterial + hotspotContainer!: TransformNode + + constructor(mainAPP: MainApp) { + this.mainApp = mainAPP + } + + Awake() { + this._camera = this.mainApp.appCamera.object + this._point_Pool = new Point_Pool() + + // 创建热点容器 + this.hotspotContainer = new TransformNode('hotspotContainer', this.mainApp.appScene.object) + + // 构建并验证资源路径 + const texturePath = `/src/texture/btn_热点.png` + + try { + // 创建热点纹理 + this.hotspotTexture = new Texture(texturePath, this.mainApp.appScene.object) + this.hotspotTexture.hasAlpha = true + this.hotspotTexture.getAlphaFromRGB = false + + // 创建热点材质 + this.hotspotMaterial = new StandardMaterial('hotspotMaterial', this.mainApp.appScene.object) + this.hotspotMaterial.diffuseTexture = this.hotspotTexture + this.hotspotMaterial.emissiveTexture = this.hotspotTexture + this.hotspotMaterial.opacityTexture = this.hotspotTexture + this.hotspotMaterial.disableLighting = true + this.hotspotMaterial.backFaceCulling = false + + } catch (error: any) { + // 创建默认材质作为后备 + this.hotspotMaterial = new StandardMaterial('hotspotMaterial', this.mainApp.appScene.object) + this.hotspotMaterial.disableLighting = true + this.hotspotMaterial.backFaceCulling = false + } + } + + vector!: Vector3 + halfW!: number + halfH!: number + annotation!: HTMLElement + modedl!: AbstractMesh + + //创建圆点并且生成事件 类型 + Point_Event(prams: HotspotPrams) { + + // 检查纹理是否已加载 + if (this.hotspotTexture && this.hotspotTexture.isReady()) { + // 纹理已准备好,立即创建热点 + this.createPointPlane(prams) + } else { + // 纹理未准备好,等待加载完成 + if (this.hotspotTexture) { + + this.hotspotTexture.onLoadObservable.addOnce(() => { + + this.createPointPlane(prams) + }) + } else { + console.error('热点纹理不存在') + } + } + } + + // 创建点平面的具体实现 + createPointPlane(prams: HotspotPrams) { + let { position, disposition, onload, onCallBack } = prams + let _point = new Point(this.hotspotMaterial, this.hotspotContainer, this.mainApp.appScene.object) + _point.init(position, disposition, onload, onCallBack) + + // 将热点添加到热点池中 + this._point_Pool.Add_point(_point) + + } + + + + Enable_All(visible: boolean) { + if (this._point_Pool) { + this._point_Pool.Enable_All(visible) + } + } +} + +export { HotSpot } diff --git a/src/script/hotspot/HotspotPrams.ts b/src/script/hotspot/HotspotPrams.ts new file mode 100644 index 0000000..a07db9b --- /dev/null +++ b/src/script/hotspot/HotspotPrams.ts @@ -0,0 +1,18 @@ +import { Vector3 } from '@babylonjs/core' +export class HotspotPrams { + constructor( + position: Vector3, + disposition: Vector3, + onload: Function, + onCallBack: Function, + ) { + this.position = position + this.disposition = disposition + this.onload = onload + this.onCallBack = onCallBack + } + position!: Vector3 + disposition!: Vector3 + onload!: Function + onCallBack!: Function +} diff --git a/src/script/hotspot/Point.ts b/src/script/hotspot/Point.ts new file mode 100644 index 0000000..40d6add --- /dev/null +++ b/src/script/hotspot/Point.ts @@ -0,0 +1,94 @@ +import { + Vector3, + ActionManager, + ExecuteCodeAction, + StandardMaterial, + MeshBuilder, + Mesh, + TransformNode, + Scene +} from '@babylonjs/core' + +export class Point { + annotation!: HTMLElement + showBox!: HTMLElement + position!: Vector3 + disposition!: Vector3 + onload!: Function + onCallBack!: Function + offCallBack!: Function + isClick!: boolean + img!: any + plane!: Mesh + spriteBehindObject!: boolean + hotspotMaterial!: StandardMaterial + hotspotContainer!: TransformNode + scene!: Scene + + constructor(hotspotMaterial: StandardMaterial, hotspotContainer: TransformNode, scene: Scene) { + this.hotspotMaterial = hotspotMaterial + this.hotspotContainer = hotspotContainer + this.scene = scene + } + + init( + position: Vector3, + disposition: Vector3, + onload: Function, + onCallBack: Function + ) { + this.position = position + this.disposition = disposition + this.onCallBack = onCallBack + this.onload = onload + + + this.Create_plane() + this.setupEvents() + //this.Create_annotation(onload, onCallBack) + //this.isClick = false + } + + Create_plane() { + // 创建一个平面作为热点 + this.plane = MeshBuilder.CreatePlane( + Math.random().toString(36).slice(-6), + { + size: 0.14, // 热点大小 + sideOrientation: Mesh.DOUBLESIDE + }, + this.scene + ) + + // 设置热点位置 + this.plane.position.copyFrom(this.position) + + // 应用材质 + this.plane.material = this.hotspotMaterial + + // 设置为公告牌模式,让热点始终面向摄像机 + this.plane.billboardMode = Mesh.BILLBOARDMODE_ALL + + // 设置父节点为热点容器 + this.plane.parent = this.hotspotContainer + + // 确保热点可见和可交互 + this.plane.isVisible = true + this.plane.isPickable = true + this.plane.renderingGroupId=2 + + } + + setupEvents() { + if (this.plane && this.onCallBack) { + this.plane.actionManager = new ActionManager(this.scene) + this.plane.actionManager.registerAction(new ExecuteCodeAction( + ActionManager.OnPickTrigger, + () => { + console.log('热点被点击:', this.plane.name) + this.onCallBack(this) + } + )) + } + } +} diff --git a/src/script/hotspot/Point_Pool.ts b/src/script/hotspot/Point_Pool.ts new file mode 100644 index 0000000..cd6c941 --- /dev/null +++ b/src/script/hotspot/Point_Pool.ts @@ -0,0 +1,20 @@ +import { Point } from './Point' + +export class Point_Pool { + points + constructor() { + this.points = new Array() + } + + Add_point(point_Class: Point) { + this.points.push(point_Class) + } + + Enable_All(visible: boolean) { + for (let i = 0, item; (item = this.points[i++]); ) { + if (item.plane) { + item.plane.isVisible = visible + } + } + } +} diff --git a/src/script/hotspot/btn_热点.png b/src/script/hotspot/btn_热点.png new file mode 100644 index 0000000..704efe7 Binary files /dev/null and b/src/script/hotspot/btn_热点.png differ diff --git a/src/script/hotspot/index.ts b/src/script/hotspot/index.ts new file mode 100644 index 0000000..d322c3d --- /dev/null +++ b/src/script/hotspot/index.ts @@ -0,0 +1,3 @@ +export * from './HotSpot' +export * from './Point' +export * from './HotspotPrams' diff --git a/src/script/hotspot/style/point.css b/src/script/hotspot/style/point.css new file mode 100644 index 0000000..fcbf6e9 --- /dev/null +++ b/src/script/hotspot/style/point.css @@ -0,0 +1,157 @@ +/* .canvas { + width: 100%; + height: 100px; + display: block; +} + +.annotation { + position: absolute; + top: 0; + left: 0; + z-index: 0; + margin-left: -10px; + margin-top: -10px; + width: 30px; + height: 30px; + border-radius: 10%; + font-size: 12px; + line-height: 1.2; + transition: opacity 0.5s; + +} + + +.line_Right { + position: absolute; + top: 35px; + left: 55px; + z-index: 0; + margin-left: 30px; + margin-top: -30px; + width: 241px; + height: 104px; + border-radius: 10%; + font-size: 12px; + line-height: 1.2; + transform-origin: 0 0; + display: none; +} + +.line_Left { + position: absolute; + top: 20px; + left: -210px; + z-index: 0; + margin-left: 30px; + margin-top: -30px; + width: 241px; + height: 104px; + border-radius: 10%; + font-size: 12px; + line-height: 1.2; + transform-origin: 100% 0; + display: none; +} + +.ShowBox_left { + position: absolute; + top: 120px; + left: -55px; + z-index: 1; + margin-left: -10px; + margin-top: -10px; + width: 70px; + height: 50px; + border-radius: 10%; + font-size: 12px; + line-height: 50px; + transition: opacity 0.5s; + background-size: 100%; + text-align: center; +} + +.ShowBox_right { + position: absolute; + top: 120px; + left: 240px; + z-index: 1; + margin-left: -10px; + margin-top: -10px; + width: 70px; + height: 50px; + border-radius: 10%; + font-size: 12px; + line-height: 50px; + transition: opacity 0.5s; + background-size: 100%; + text-align: center; +} + +.after { + content: attr(Text); + position: absolute; + top: -110px; + left: 50px; + width: 100px; + height: 100px; + border: 2px solid #fff; + border-radius: .5em; + font-size: 16px; + line-height: 30px; + text-align: center; + background: rgba(0, 0, 0, 1); + +} + +#number { + position: absolute; + z-index: -1; + opacity: 0; +} + +.linimg { + width: 100%; + height: 100%; + + background-size: 100%; +} + +.pointimg { + width: 100%; + height: 100%; + background-size: 100%; + cursor: pointer; + transition: all 0.2s ease-in; + border-radius: 50%; + animation: shrink 1s infinite alternate; +} + + +@keyframes shrink { + 0% { + transform: scale(1); + } + 100% { + transform: scale(0.8); + } +} + +.pointimg:hover { + transform: scale(1.3); +} + +.ChangeShowBox { + position: absolute; + top: -20px; + left: 50px; + z-index: 1; + margin-left: -20px; + margin-top: -60px; + width: 150px; + height: 120px; + border-radius: 10%; + font-size: 12px; + line-height: 1.2; + transition: opacity 0.5s; + background-size: 100%; +} */ \ No newline at end of file diff --git a/src/script/net/config/index.ts b/src/script/net/config/index.ts new file mode 100644 index 0000000..6aa52a9 --- /dev/null +++ b/src/script/net/config/index.ts @@ -0,0 +1,2 @@ + +export { ParamsReq, ParamsRes } from './params' diff --git a/src/script/net/config/params.ts b/src/script/net/config/params.ts new file mode 100644 index 0000000..29fec85 --- /dev/null +++ b/src/script/net/config/params.ts @@ -0,0 +1,33 @@ +//发送请求 地址和参数 +class ParamsReq { + private _url: string = '' + private _parms: any + //进行封装 + constructor(url: string, parms: any) { + this._url = url + this._parms = parms + } + public get url(): string { + return this._url + } + public get parms(): any { + return this._parms + } +} + +class resParams { + data: any = {} + message: string = '' +} + +//接受请求 请求码 和请求回来的参数 +class ParamsRes { + public resCode: number + public resParams: resParams + constructor(resCode: number, resParams: resParams) { + this.resCode = resCode + this.resParams = resParams + } +} + +export { ParamsReq, ParamsRes, resParams } diff --git a/src/script/net/config/ss.json b/src/script/net/config/ss.json new file mode 100644 index 0000000..9b9bd65 --- /dev/null +++ b/src/script/net/config/ss.json @@ -0,0 +1,4 @@ +{"children": +[{"id": "1000", "type": "category", "label": "1671172471589", "children": +[{"id": "1002", "type": "item", "label": "右肺上叶前段", "modelname": "isPickable_右肺上叶前段", "paramsdata": {"color": "#cc5921", "opacity": "1"}}], +"modelname": ""}, {"id": "1001", "type": "category", "label": "1671172471973", "modelname": ""}], "modelurl": "http://192.168.3.151:8084/model/1671171942281-feimoxing.glb"} \ No newline at end of file diff --git a/src/script/net/netrouter/EditorRequest.ts b/src/script/net/netrouter/EditorRequest.ts new file mode 100644 index 0000000..f695787 --- /dev/null +++ b/src/script/net/netrouter/EditorRequest.ts @@ -0,0 +1,27 @@ +import { Request } from '../request' +import { ParamsReq, ParamsRes } from 'script/net/config' + +//资源请求 +export class EditorRequest { + public request: Request = new Request() + + public Post(url: string, parms: any, resFunc: Function, errFunc?: Function) { + const paramsReq = new ParamsReq(url, parms) + + this.request + .post(paramsReq) + .then((res) => { + resFunc(res.data) + }) + .catch((err) => { + errFunc ? err : '' + }) + } + + + public production(parms: any, resFunc: Function, errFunc?: Function) { + this.Post('cpq/3d/create/order', parms, resFunc, errFunc) + } + + +} diff --git a/src/script/net/netrouter/index.ts b/src/script/net/netrouter/index.ts new file mode 100644 index 0000000..87ee9db --- /dev/null +++ b/src/script/net/netrouter/index.ts @@ -0,0 +1,13 @@ +import { EditorRequest } from './EditorRequest' + +let _editorRequest: EditorRequest + +//编辑器的所有请求 +export function editorRequest() { + if (_editorRequest) { + return _editorRequest + } else { + _editorRequest = new EditorRequest() + return _editorRequest + } +} diff --git a/src/script/net/request.ts b/src/script/net/request.ts new file mode 100644 index 0000000..141ee7e --- /dev/null +++ b/src/script/net/request.ts @@ -0,0 +1,40 @@ +import axios from 'axios' +import { ParamsReq } from 'script/net/config' +import { AxiosInstance } from 'axios' +//https://script.jiaweijia.cn/script + +export class Request { + + service: AxiosInstance + // import.meta.env.VITE_BASE_URL + //'https://script.jiaweijia.cn/script' + + + constructor() { + console.log(import.meta.env.VITE_BASE_URL); + this.service = axios.create({ + baseURL: import.meta.env.VITE_BASE_URL, + timeout: 15000, + headers: { + // 这里可设置所有的请求头 + //'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8' //该项建议设置 如果未 POST请求时 数据未做处理时会出现错误,最理想的解决方法就是 直接设置该项 + //"Content-Type": "multipart/form-data" + "Content-Type": "application/json" + //'Cache-Control': 'no-cache' + } + }) + } + get(url: string) { + return this.service.get(url) + } + post(data: ParamsReq) { + console.log(data.url); + return this.service.post(data.url, data.parms) + } + del(url: string) { + return this.service.delete(url) + } + put(data: ParamsReq) { + return this.service.put(data.url, data.parms) + } +} diff --git a/src/script/public/AppCamera.ts b/src/script/public/AppCamera.ts new file mode 100644 index 0000000..2cf9d1d --- /dev/null +++ b/src/script/public/AppCamera.ts @@ -0,0 +1,84 @@ +import { ArcRotateCamera, Tools, Vector3, UniversalCamera } from "@babylonjs/core"; +import { MainApp } from "@/script/public/MainApp"; +import { Monobehiver } from "../base"; +class AppCamera extends Monobehiver { + object!: ArcRotateCamera; + constructor(mainApp: MainApp) { + super(mainApp); + } + + async Awake() { + let scene = this.mainApp.appScene.object; + this.object = new ArcRotateCamera( + 'Camera', + Tools.ToRadians(0), // 水平角度:0度(从正前方看) + Tools.ToRadians(30), // 垂直角度:30度(稍微俯视) + 0, // 距离目标的半径:5 + new Vector3(0.0, 0, 0.0), + scene + ); + + this.object.fov = 0.8; // 设置焦距 + this.object.minZ = 0.001; // 进一步减小近裁剪面距离,防止模型被裁剪 + this.object.maxZ = 10000; + this.object.pinchPrecision = 100; + this.object.wheelPrecision = 60; + this.object.wheelDeltaPercentage = 0.01; + this.object.upperRadiusLimit = 20; // 设置最大距离限制 + this.object.lowerRadiusLimit = 1.0; // 调整最小距离限制,避免过近导致的问题 + + this.object.panningInertia = 0.9; + + // 禁用右键拖拽平移功能 + this.object.panningSensibility = 0; + + this.object.attachControl(this.mainApp.canvas, true); + // 设置相机目标 + this.setTarget(0, 0, 0); + + // 对于ArcRotateCamera,不要直接设置position,而是调整角度和半径 + // this.object.position.set(1, 0, 20) // 删除这行,因为它不起作用 + this.object.position = new Vector3(0, 0, 2) + } + + + + setTarget(x: number, y: number, z: number) { + this.object.target = new Vector3(x, y, z); + } + + // 设置相机位置(对于ArcRotateCamera,通过调整角度和半径) + setCameraPosition(alpha: number, beta: number, radius: number) { + this.object.alpha = Tools.ToRadians(alpha); + this.object.beta = Tools.ToRadians(beta); + this.object.radius = radius; + } + + // 获取当前相机位置信息 + getCameraInfo() { + return { + alpha: Tools.ToDegrees(this.object.alpha), + beta: Tools.ToDegrees(this.object.beta), + radius: this.object.radius, + target: this.object.target + }; + } + + + clean() { + if (this.object) { + this.object.detachControl(); + this.object.dispose(); + } + } + + update() { + + } + + +} + + + +export { AppCamera }; diff --git a/src/script/public/AppConfig.ts b/src/script/public/AppConfig.ts new file mode 100644 index 0000000..79fe59d --- /dev/null +++ b/src/script/public/AppConfig.ts @@ -0,0 +1,11 @@ +export class AppConfig { + static [key: string]: any; + static modelUrlList: string[]; + static animationUrlList: string[]; + static success: Function; + static error: Function; +} + +export class AppParams { + model!: string; +} diff --git a/src/script/public/AppCustomization.ts b/src/script/public/AppCustomization.ts new file mode 100644 index 0000000..5002374 --- /dev/null +++ b/src/script/public/AppCustomization.ts @@ -0,0 +1,534 @@ +import { MainApp } from '@/script/core' +import { Monobehiver } from '@/script/base' +import { + DynamicTexture, + NodeMaterial, + PBRMaterial, + AssetsManager, + Color3, + Texture, +} from '@babylonjs/core' +import { useCustomizationStore } from '@/stores/customization' +import type { CustomizationLayer } from '@/stores/customization' + +class AppCustomization extends Monobehiver { + // 纹理尺寸 + private readonly imprintWidth = 683 + private readonly imprintHeight = 2048 + + // 动态纹理 + imprintTexture!: DynamicTexture + imprintContext!: CanvasRenderingContext2D + + // 材质(可以是NodeMaterial或PBRMaterial) + decalMaterial!: NodeMaterial | PBRMaterial | null + + // 资源管理器 + assetsManager!: AssetsManager + + // 图形资源 + graphics: Array<{ + image: HTMLImageElement + ratio: number + size: number + name: string + url: string + }> = [] + + // 颜色列表 + colors: string[] = [ + 'Azure', 'Black', 'DarkGray', 'DimGray', 'Red', 'FireBrick', + 'DeepPink', 'OrangeRed', 'Orange', 'Gold', 'Yellow', 'RoyalBlue', + 'CornflowerBlue', 'DeepSkyBlue', 'DarkGreen', 'ForestGreen', + 'GreenYellow', 'RebeccaPurple', 'DarkViolet', 'MediumPurple' + ] + + // Store实例 + private customizationStore = useCustomizationStore() + + // 是否正在更新纹理(防止频繁更新) + private isUpdatingTexture = false + + // 保存原始纹理,用于混合 + private originalTextures: Map = new Map() + // 混合后的纹理 + private blendedTexture: DynamicTexture | null = null + + constructor(mainApp: MainApp) { + super(mainApp) + } + + async Awake() { + // 初始化动态纹理 + this.initImprintTexture() + + // 初始化资源管理器 + this.assetsManager = new AssetsManager(this.mainApp.appScene.object) + + // 监听store变化 + this.watchStoreChanges() + + console.log('✅ 定制化系统初始化完成') + } + + /** + * 初始化动态纹理 + */ + private initImprintTexture() { + this.imprintTexture = new DynamicTexture( + 'decalTex', + { width: this.imprintWidth, height: this.imprintHeight }, + this.mainApp.appScene.object + ) + this.imprintContext = this.imprintTexture.getContext() as CanvasRenderingContext2D + + // 设置默认背景色 + this.imprintContext.fillStyle = '#00000000' + this.imprintContext.fillRect(0, 0, this.imprintWidth, this.imprintHeight) + } + + /** + * 监听store变化并更新纹理 + */ + private watchStoreChanges() { + // 监听纹理更新触发标记的变化 + const unwatch = this.customizationStore.$subscribe((mutation, state) => { + // 监听所有customization store的变化 + // 使用防抖,避免频繁更新 + if (this.updateTimer) { + clearTimeout(this.updateTimer) + } + this.updateTimer = setTimeout(() => { + if (!this.isUpdatingTexture) { + this.updateImprintTexture() + + // 更新材质中的纹理引用 + if (this.decalMaterial) { + // 如果是PBR材质,直接更新纹理 + if (this.decalMaterial instanceof PBRMaterial) { + // PBR材质会自动使用更新的纹理引用 + const scene = this.decalMaterial.getScene() + if (scene) { + scene.markAllMaterialsAsDirty(0) // 0表示所有材质 + } + } + // 如果是NodeMaterial,纹理会自动更新 + } + } + }, 100) + }) + + // 保存unwatch以便后续清理 + this.unwatchStore = unwatch + } + + private updateTimer: any = null + private unwatchStore: any = null + + + /** + * 更新印记纹理 + */ + updateImprintTexture() { + if (this.isUpdatingTexture) return + + this.isUpdatingTexture = true + + try { + // 清空画布 + this.imprintContext.clearRect(0, 0, this.imprintWidth, this.imprintHeight) + + const layers = this.customizationStore.layers + + // 遍历所有层并绘制 + for (const layer of layers) { + if (!layer.visible || (!layer.graphic && !layer.rectangle)) { + continue + } + + this.imprintContext.save() + + if (layer.graphic) { + // 绘制图形 + this.drawGraphicLayer(layer) + } else if (layer.rectangle) { + // 绘制矩形 + this.drawRectangleLayer(layer) + } + + this.imprintContext.restore() + } + + // 更新纹理 + this.imprintTexture.update() + } catch (error) { + console.error('更新纹理失败:', error) + } finally { + this.isUpdatingTexture = false + } + } + + /** + * 绘制图形层 + */ + private drawGraphicLayer(layer: CustomizationLayer) { + if (!layer.graphic) return + + // 计算位置偏移 + const graphicU = layer.horizontal * this.imprintWidth * 0.5 + const graphicV = layer.vertical * this.imprintHeight * -0.5 + + // 移动到中心位置 + this.imprintContext.translate( + this.imprintWidth * 0.5 + graphicU, + this.imprintHeight * 0.5 + graphicV + ) + + // 计算绘制位置和尺寸 + const left = layer.size * layer.ratio * -0.5 + const top = layer.size * -0.5 + const width = layer.ratio * layer.size + const height = layer.size + + // 旋转 + this.imprintContext.rotate(layer.rotation) + + // 绘制图像 + this.imprintContext.drawImage(layer.graphic, left, top, width, height) + } + + /** + * 绘制矩形层 + */ + private drawRectangleLayer(layer: CustomizationLayer) { + // 计算矩形位置和尺寸 + const left = (1 - layer.width) * 0.5 * this.imprintWidth + const top = (1 - layer.height) * 0.5 * this.imprintHeight + const width = layer.width * this.imprintWidth + const height = layer.height * this.imprintHeight + + // 计算偏移 + const offsetU = layer.horizontal * this.imprintWidth * 0.5 + const offsetV = layer.vertical * this.imprintHeight * -0.5 + + // 计算矩形中心 + const rectangleU = width * 0.5 + left + const rectangleV = height * 0.5 + top + + // 移动到中心并应用偏移 + this.imprintContext.translate(rectangleU + offsetU, rectangleV + offsetV) + + // 旋转 + this.imprintContext.rotate(layer.rotation) + + // 设置填充颜色 + this.imprintContext.fillStyle = layer.fillStyle || '#00000000' + + // 绘制矩形 + this.imprintContext.fillRect(-width * 0.5, -height * 0.5, width, height) + } + + /** + * 加载资源(图形、图标等) + */ + async loadAssets(serverUrl: string = '') { + return new Promise((resolve, reject) => { + try { + // 加载图形资源 + this.loadGraphicAssets(serverUrl) + + // 加载图标资源 + this.loadIconAssets(serverUrl) + + // 开始加载 + this.assetsManager.load() + + // 错误处理 + this.assetsManager.onTaskErrorObservable.add((task) => { + console.error('资源加载失败:', task.name, task.errorObject) + }) + + // 完成回调 + this.assetsManager.onFinish = (tasks) => { + console.log('✅ 所有资源加载完成') + resolve() + } + } catch (error) { + reject(error) + } + }) + } + + /** + * 加载图形资源 + */ + private loadGraphicAssets(serverUrl: string) { + // 示例图形资源列表,可以根据实际需求修改 + const graphicNames = [ + 'Babylon Logo', + 'Flame Skull', + 'Blue Character', + 'Orange Character', + 'Purple Character', + 'Pony', + 'Rays', + 'Waves' + ] + + graphicNames.forEach((name) => { + const task = this.assetsManager.addImageTask( + `load image_${name}`, + `${serverUrl}assets/textures/${name.toLowerCase().replace(/\s/g, '')}.png` + ) + + task.onSuccess = (task) => { + if (task.image) { + const graphic = { + image: task.image, + ratio: task.image.width / task.image.height, + size: task.image.width, + name: name, + url: task.image.src || '' + } + this.graphics.push(graphic) + + // 添加到store + this.customizationStore.addGraphicAsset({ + name: graphic.name, + image: graphic.image, + ratio: graphic.ratio, + size: graphic.size, + url: graphic.url + }) + } + } + }) + } + + /** + * 加载图标资源 + */ + private loadIconAssets(serverUrl: string) { + // 这里可以加载图标资源,如上下箭头、取消图标等 + // 暂时留空,后续可根据需要添加 + } + + /** + * 创建贴花材质(简化版,直接使用纹理而不需要着色器JSON) + * 如果需要完整功能,可以使用带shaderJsonPath的版本 + */ + createSimpleDecalMaterial(mesh: any) { + if (!mesh || !mesh.material) { + console.warn('网格或材质不存在') + return + } + + try { + // 保存原始材质信息 + const originalMaterial = mesh.material + const baseColorTex = (originalMaterial as any).albedoTexture || (originalMaterial as any).baseColor?.texture + const ormTex = (originalMaterial as any).metallicTexture || (originalMaterial as any).metallicRoughnessTexture + const normalTex = (originalMaterial as any).bumpTexture || (originalMaterial as any).normalTexture + + // 如果原始材质是PBR材质,直接更新纹理 + if (originalMaterial.getClassName && originalMaterial.getClassName().includes('PBR')) { + // 创建一个新的PBR材质来混合贴花 + const newMaterial = new PBRMaterial('decalMaterial_' + mesh.name, this.mainApp.appScene.object) + + // 复制原始纹理 + if (baseColorTex) { + newMaterial.albedoTexture = baseColorTex + } + if (ormTex) { + newMaterial.metallicTexture = ormTex + } + if (normalTex) { + newMaterial.bumpTexture = normalTex + } + + // 将贴花纹理与原始纹理混合 + if (!baseColorTex) { + // 如果原始材质没有纹理,直接用贴花纹理 + newMaterial.albedoTexture = this.imprintTexture + console.log('📝 使用贴花纹理作为albedo纹理(无原始纹理)') + } else { + // 保存原始纹理 + this.originalTextures.set(mesh.name, baseColorTex) + + // 直接保留原始纹理作为albedo + // 注意:PBRMaterial 不支持直接混合两个albedo纹理 + // 这里我们保留原始纹理,贴花效果需要后续通过NodeMaterial或自定义着色器实现 + newMaterial.albedoTexture = baseColorTex + + // 更新贴花纹理内容(虽然当前不直接使用,但保持更新以备将来使用) + this.updateImprintTexture() + + console.log('✅ 保留原始albedo纹理,贴花纹理已准备(当前未直接混合)') + } + + // 更新纹理 + this.updateImprintTexture() + + // 应用新材质 + if (originalMaterial !== newMaterial) { + originalMaterial.dispose() + } + mesh.material = newMaterial + this.decalMaterial = newMaterial + + // 强制刷新材质 + newMaterial.markDirty() + const scene = this.mainApp.appScene.object + scene.markAllMaterialsAsDirty(0) + + console.log('✅ 贴花材质已应用到网格:', mesh.name) + console.log(' 基础纹理:', baseColorTex ? '有' : '无') + console.log(' 贴花纹理:', this.imprintTexture ? '已设置' : '未设置') + } + } catch (error) { + console.error('创建贴花材质失败:', error) + } + } + + /** + * 创建贴花材质(完整版,使用着色器JSON) + * @param baseMaterial 基础材质 + * @param shaderJsonPath 着色器JSON路径 + */ + async createDecalMaterial( + baseMaterial: any, + shaderJsonPath: string + ): Promise { + try { + // 加载着色器JSON + const shaderTask = this.assetsManager.addTextFileTask( + 'load decal shader', + shaderJsonPath + ) + + return new Promise((resolve, reject) => { + shaderTask.onSuccess = () => { + try { + const shaderJson = JSON.parse(shaderTask.text) + const material = NodeMaterial.Parse(shaderJson, this.mainApp.appScene.object) + material.name = 'decalMaterial' + + // 设置纹理 + const decalTexBlock = material.getBlockByName('decalTex') + if (decalTexBlock && (decalTexBlock as any).texture !== undefined) { + (decalTexBlock as any).texture = this.imprintTexture + } + + // 设置基础纹理 + const baseColorBlock = material.getBlockByName('baseColorTex') + if (baseColorBlock && baseMaterial && (baseColorBlock as any).texture !== undefined) { + (baseColorBlock as any).texture = (baseMaterial as any).albedoTexture || (baseMaterial as any).baseColor?.texture + } + + // 更新纹理 + this.updateImprintTexture() + + this.decalMaterial = material + resolve(material) + } catch (error) { + reject(error) + } + } + + shaderTask.onError = () => { + reject(new Error('加载着色器失败')) + } + }) + } catch (error) { + throw new Error(`创建贴花材质失败: ${error}`) + } + } + + /** + * 应用材质到网格 + */ + applyDecalMaterialToMesh(mesh: any) { + if (!this.decalMaterial || !mesh) { + console.warn('材质或网格未准备好') + return + } + + // 如果网格有材质,先释放 + if (mesh.material && mesh.material !== this.decalMaterial) { + mesh.material.dispose() + } + + // 应用新材质 + mesh.material = this.decalMaterial + } + + /** + * 自动为所有加载的网格应用贴花材质 + */ + applyToAllMeshes() { + const meshes = this.mainApp.appScene.object.meshes + console.log('🔍 找到网格数量:', meshes.length) + + // 打印所有网格信息 + meshes.forEach((mesh: any) => { + console.log('网格:', mesh.name, '材质:', mesh.material?.name || '无') + }) + + // 找到主要的网格(通常是有材质的网格) + const mainMeshes = meshes.filter((mesh: any) => { + return mesh.material && !mesh.name.includes('__root__') && mesh.name + }) + + if (mainMeshes.length === 0) { + console.warn('⚠️ 未找到有材质的网格,尝试所有网格...') + // 如果没有找到,尝试所有有名称的网格 + const allNamedMeshes = meshes.filter((mesh: any) => mesh.name && !mesh.name.includes('__root__')) + allNamedMeshes.forEach((mesh: any) => { + console.log('尝试为网格应用材质:', mesh.name) + this.createSimpleDecalMaterial(mesh) + }) + return + } + + // 为主要网格应用贴花材质 + mainMeshes.forEach((mesh: any) => { + console.log('✅ 为网格应用贴花材质:', mesh.name) + this.createSimpleDecalMaterial(mesh) + }) + + console.log('✅ 贴花材质应用完成') + } + + /** + * 获取纹理 + */ + getImprintTexture(): DynamicTexture { + return this.imprintTexture + } + + /** + * 清理资源 + */ + dispose() { + if (this.updateTimer) { + clearTimeout(this.updateTimer) + } + if (this.unwatchStore) { + this.unwatchStore() + } + if (this.imprintTexture) { + this.imprintTexture.dispose() + } + if (this.decalMaterial) { + this.decalMaterial.dispose() + } + // AssetsManager没有dispose方法,只需要清理资源即可 + if (this.assetsManager) { + // 清理所有任务(AssetsManager会自动管理,无需手动清理) + // 如果需要,可以重置资源管理器 + } + } +} + +export { AppCustomization } + diff --git a/src/script/public/AppDom.ts b/src/script/public/AppDom.ts new file mode 100644 index 0000000..5fb5060 --- /dev/null +++ b/src/script/public/AppDom.ts @@ -0,0 +1,85 @@ +declare class LoadText { + [key:string]:any; + dom: HTMLElement | undefined + mode: boolean +} + +export class AppDom { + private _renderDom!: HTMLCanvasElement + private _body!: HTMLBodyElement + + private _load3D!: HTMLElement + private _ui!: HTMLElement + private _panTarget!: HTMLElement + private _fps!: HTMLElement + + private _loadtext: LoadText = { + dom: undefined, + mode: false + } + private _loadsliderbar: LoadText = { + dom: undefined, + value:0, + mode: false + } + private _hotspotContainer!: HTMLElement + + + + public get renderDom(): HTMLCanvasElement { + return this._renderDom && this._renderDom + } + public get body(): HTMLBodyElement { + return this._body && this._body + } + public get loadtext(): any { + return this._loadtext && this._loadtext + } + public get loadsliderbar(): any { + return this._loadsliderbar && this._loadsliderbar + } + public get hotspotContainer(): HTMLElement { + return this._hotspotContainer && this._hotspotContainer + } + + public get load3D(): HTMLElement { + return this._load3D && this._load3D + } + + public get ui(): HTMLElement { + return this._ui && this._ui + } + + + public get panTarget(): any { + return this._panTarget && this._panTarget + } + public get fps(): HTMLElement { + return this._fps && this._fps + } + + constructor() {} + + Awake(): void { + this._renderDom = this.getElment('#renderDom') + this._body = this.getElment('body') + this._loadtext.dom = this.getElment('#loadtext') + this._loadsliderbar.dom = this.getElment('.loadslider-bar') + this._load3D=this.getElment('.load3D') + this._panTarget=this.getElment('.pan-target') + this._ui=this.getElment('.ui') + this._hotspotContainer=this.createElment('div') + this._fps=this.getElment('.fps') + } + + getElment(t: string) { + return document.querySelector(t) as T + } + + createElment(t: string) { + const element = document.createElement(t) + element.className='hotspot-container' + document.querySelector('.app-view')?.appendChild(element) + return element as T + } +} diff --git a/src/script/public/AppEngin.ts b/src/script/public/AppEngin.ts new file mode 100644 index 0000000..4b6ae9b --- /dev/null +++ b/src/script/public/AppEngin.ts @@ -0,0 +1,69 @@ +import { Database, Engine } from '@babylonjs/core' +import { MainApp } from '@/script/core' +import { Monobehiver } from '@/script/base' +class AppEngin extends Monobehiver { + object!: Engine + canvas!: HTMLCanvasElement + constructor(mainApp: MainApp) { + super(mainApp) + } + Awake() { + this.createEngin() + } + createEngin() { + //创建画布引擎 + this.canvas = this.mainApp.appDom.renderDom + + + this.object = new Engine(this.canvas, true, { + preserveDrawingBuffer: false, + stencil: true, + alpha: true // 关键点 + }) + + this.object.setSize(window.innerWidth, window.innerHeight) + this.object.enableOfflineSupport = true //取消缓存 + this.object.setHardwareScalingLevel(1) // 移动设备使用更高的缩放级别 + + this.object.displayLoadingUI() + this.object.hideLoadingUI() + + + + // 防止过多重复触发resize事件 + let resizeTimeout: number | null = null; + window.addEventListener('resize', () => { + if (resizeTimeout) { + clearTimeout(resizeTimeout); + } + resizeTimeout = window.setTimeout(this.handleResize.bind(this), 100); + }) + } + +// 在AppEngin.ts文件中,添加一个方法来获取当前渲染比例 +getRenderedSizeRatio() { + const canvas = this.canvas; + return { + widthRatio: canvas.width / canvas.clientWidth, + heightRatio: canvas.height / canvas.clientHeight + }; +} + + + handleResize() { + if(this.object) { + this.object.setSize(window.innerWidth, window.innerHeight) + this.object.resize() + } + } + + clean() { + this.object && this.object.dispose() + } + + update() { + + } +} + +export { AppEngin } diff --git a/src/script/public/AppEnv.ts b/src/script/public/AppEnv.ts new file mode 100644 index 0000000..c0a7120 --- /dev/null +++ b/src/script/public/AppEnv.ts @@ -0,0 +1,102 @@ +import { + CubeTexture, + Mesh, + BackgroundMaterial, + Texture, + Vector3, + MeshBuilder, + PhotoDome, + StandardMaterial, + PBRMaterial, + Plane, + Animation, + AnimationGroup, +} from '@babylonjs/core'; +import { MainApp } from '@/script/public/MainApp'; +import { Monobehiver } from '../base'; + +class AppEnv extends Monobehiver { + object!: CubeTexture; + sphere: Mesh | null = null; + ground: Mesh | null = null; + isNeishiMode = true; + isTransitioning = false; // 添加过渡状态标记 + + constructor(mainApp: MainApp) { + super(mainApp); + } + + async Awake() { + this.createHDR(); + // this.createPanorama_neishi() + } + + createHDR() { + const reflectionTexture = CubeTexture.CreateFromPrefilteredData( + '/hdr/hdr.env', + this.mainApp.appScene.object + ); + reflectionTexture.level = 1; + reflectionTexture.rotationY = 0; + + this.mainApp.appScene.object.environmentIntensity = 1.5; + this.mainApp.appScene.object.environmentTexture = reflectionTexture; + + // reflectionTexture.anisotropicFilteringLevel = 1; + const box = this.mainApp.appScene.object.createDefaultSkybox( + reflectionTexture, + true, + 512, + 0, + true + ); + if (box) box.visibility = 0; + // 保存环境纹理的引用 + this.object = reflectionTexture; + + + } + + //调整hdr亮度 + changeHDRIntensity(intensity: number) { + this.mainApp.appScene.object.environmentIntensity = intensity; + } + + // 旋转HDR环境贴图 + rotateHDR(angle: number) { + if (this.object) { + this.object.rotationY = angle; + + } + } + + // 旋转全景图 + rotatePanorama_neishi(angle: number) { + console.log(this.photoDome_neishi); + if (this.photoDome_neishi) { + + + // this.photoDome_neishi.mesh.rotation.y = angle; + } + } + + + photoDome_neishi: PhotoDome | null = null; + photoDome_yundong: PhotoDome | null = null; + + + + + + + clean() { + // 如果存在环境纹理,释放它 + if (this.object) { + this.object.dispose(); + this.object = null as any; + } + + } +} + +export { AppEnv }; diff --git a/src/script/public/AppFPS.ts b/src/script/public/AppFPS.ts new file mode 100644 index 0000000..1e5d889 --- /dev/null +++ b/src/script/public/AppFPS.ts @@ -0,0 +1,38 @@ +import { Monobehiver } from "../base"; +import { MainApp } from "./MainApp"; + +export class AppFPS extends Monobehiver { + + fpsDisplay!: HTMLDivElement; + + constructor(mainApp: MainApp) { + super(mainApp) + } + + Awake(): void { + // 创建 FPS 显示元素 + this.createFpsDisplay(); + + } + + createFpsDisplay() { + this.fpsDisplay = document.createElement("div"); + this.fpsDisplay.style.position = "absolute"; + this.fpsDisplay.style.top = "10px"; + this.fpsDisplay.style.left = "10px"; + this.fpsDisplay.style.color = "white"; + this.fpsDisplay.style.background = "rgba(0, 0, 0, 0.5)"; + this.fpsDisplay.style.padding = "5px 10px"; + this.fpsDisplay.style.fontFamily = "Arial, sans-serif"; + this.fpsDisplay.style.borderRadius = "4px"; + this.fpsDisplay.style.zIndex = "100"; + this.fpsDisplay.innerText = "FPS: 0"; + document.body.appendChild(this.fpsDisplay); + } + + + public update() { + const fps = this.mainApp.appEngin.object.getFps().toFixed(2); + this.fpsDisplay.innerText = `FPS: ${fps}`; + } +} \ No newline at end of file diff --git a/src/script/public/AppGlowLayer.ts b/src/script/public/AppGlowLayer.ts new file mode 100644 index 0000000..75d0e02 --- /dev/null +++ b/src/script/public/AppGlowLayer.ts @@ -0,0 +1,65 @@ +import { + AbstractMesh, + BloomEffect, + Color3, + GlowLayer, + HighlightLayer, + LensFlare, + LensFlareSystem, + Mesh, + MeshBuilder, + PBRMaterial, + PointLight, + StandardMaterial, + Vector3 +} from '@babylonjs/core' +import { MainApp } from 'script/core' +import { Monobehiver } from 'script/base' +import { GameManager } from './GameManager' +import { Dictionary } from '../utils' +export class AppGlowLayer extends Monobehiver { + gl!: GlowLayer + index: number = 0 + constructor(mainApp: MainApp) { + super(mainApp) + } + Awake() { + // this.create() + } + create() { + if (this.gl) return + this.gl = new GlowLayer('gl', this.mainApp.appScene.object, { + mainTextureSamples: 10, + mainTextureRatio: 60, + mainTextureFixedSize: 512, + blurKernelSize: 50 + }) + } + //添加需要发光的网格 + addMesh(mesh: Mesh) { + this.create() + console.log(this.gl.removeExcludedMesh); + + this.gl.removeExcludedMesh(mesh) + this.index++ + } + removeMesh(mesh: Mesh) { + this.gl.addExcludedMesh(mesh) + this.index-- + if (this.index <= 0) { + this.clean() + ;(this.gl as any) = null + } + } + + + clean() { + this.gl.dispose() + } + update() {} + + hasModels(): boolean { + console.log(this.index); + return this.index > 0; + } +} diff --git a/src/script/public/AppHotspot.ts b/src/script/public/AppHotspot.ts new file mode 100644 index 0000000..350a3e9 --- /dev/null +++ b/src/script/public/AppHotspot.ts @@ -0,0 +1,145 @@ +import { Color3, PBRMaterial, Vector3 } from '@babylonjs/core' +import { Monobehiver } from '../base' +import { AppConfig } from '@/script/public/AppConfig' +import { MainApp } from '@/script/public/MainApp' +import { Dictionary } from '@/script/utils/Dictionary' +import { Tools } from '@/script/utils/Tools' +import { HotSpot, HotspotPrams, Point } from '../hotspot' +// 在任何文件中 + +import { userSellingPointStore } from '@/stores/zguiy'; + + +export class AppHotspot extends Monobehiver { + hotSpot!: HotSpot + sllingPointStore: any + //偏移量 + offset: number = 0.7 + yundong: boolean = false + + + hotspotDic: Dictionary = new Dictionary() + + constructor(mainApp: MainApp) { + super(mainApp) + this.sllingPointStore = userSellingPointStore() + } + + Awake() { + + const currentModelId = this.mainApp.carModelStore.carModel; + + // 首先隐藏所有其他车型的热点 + this.hotspotDic.Keys().forEach((key: string) => { + if (key !== currentModelId) { + const hotspot = this.hotspotDic.Get(key); + if (hotspot) { + hotspot.Enable_All(false); + } + } + }); + + if (this.hotspotDic.Has(currentModelId)) { + this.hotSpot = this.hotspotDic.Get(currentModelId) + // 显示当前车型的热点 + this.hotSpot.Enable_All(true); + } + else { + const hotspot = new HotSpot(this.mainApp) + hotspot.Awake() + this.hotSpot = hotspot; + + this.initHotSpot(AppConfig.HotSpotList) + + this.hotspotDic.Set(currentModelId, hotspot) + // 新创建的热点默认就是显示的 + } + + } + initHotSpot(hotSpotList: Array) { + + hotSpotList.forEach((hotspot: any) => { + + this.createHotspot(hotspot) + }); + + + } + + createHotspot(hotspot: any) { + + // 使用JSON数据动态创建热点 + const position = new Vector3( + hotspot.position.x, + hotspot.position.y + this.offset, + hotspot.position.z + ); + + const disposition = new Vector3( + hotspot.disposition.x, + hotspot.disposition.y, + hotspot.disposition.z + ); + + + + this.hotSpot.Point_Event( + new HotspotPrams( + position, + disposition, + () => { + }, + async (p: Point) => { + // if (this.sllingPointStore.isOpen) return; + this.sllingPointStore.setTitle(hotspot.title) + this.sllingPointStore.setContent(hotspot.content) + this.sllingPointStore.setIsOpen(true) + } + ) + ) + } + + clean() { + // 首先隐藏所有热点 + this.visible(false); + + // 如果存在热点池 + if (this.hotSpot && this.hotSpot._point_Pool && this.hotSpot._point_Pool.points) { + // 遍历所有热点 + for (let i = 0; i < this.hotSpot._point_Pool.points.length; i++) { + const point = this.hotSpot._point_Pool.points[i]; + + // 清除事件监听器 + if (point.img && point.onCallBack) { + point.img.removeEventListener('mousedown', point.onCallBack); + } + + // 从DOM中移除注释元素 + if (point.annotation && point.annotation.parentNode) { + point.annotation.parentNode.removeChild(point.annotation); + } + + // 释放sprite资源 + if (point.sprite) { + point.sprite.dispose(); + } + } + + // 清空热点池 + this.hotSpot._point_Pool.points = []; + + + } + + console.log('热点资源已释放'); + } + + visible(visible: boolean) { + console.log(visible); + + if (this.hotSpot) { + this.hotSpot.Enable_All(visible) + } + } + +} diff --git a/src/script/public/AppLight.ts b/src/script/public/AppLight.ts new file mode 100644 index 0000000..93dbfb7 --- /dev/null +++ b/src/script/public/AppLight.ts @@ -0,0 +1,410 @@ +import { MainApp } from "@/script/core"; +import { Monobehiver } from "@/script/base"; +import { + Scene, + HemisphericLight, + DirectionalLight, + PointLight, + SpotLight, + Vector3, + Color3, + Light +} from "@babylonjs/core"; +import { GizmoManager, LightGizmo, UtilityLayerRenderer } from "@babylonjs/core"; + +// 灯光类型枚举 +export enum LightType { + DIRECTIONAL = "DirectionalLight", + POINT = "PointLight", + SPOT = "SpotLight", + HEMISPHERIC = "HemisphericLight" +} + +// 灯光配置接口 +interface LightConfig { + name: string; + type: LightType; + direction?: Vector3; + intensity: number; + position: Vector3; + color?: Color3; + angle?: number; // 聚光灯角度 + exponent?: number; // 聚光灯指数 + range?: number; // 点光源范围 +} + +class AppLight extends Monobehiver { + lightList: Array = [] + private lightCounter: number = 0 + + // 默认灯光配置 + private defaultLightConfigs: LightConfig[] = [ + { + name: "onceDirectionalLight", + type: LightType.DIRECTIONAL, + direction: new Vector3(0, -1, 0), + intensity: 1, + position: new Vector3(0, 10, 5), + color: new Color3(1, 1, 1) + }, + { + name: "secondDirectionalLight", + type: LightType.DIRECTIONAL, + direction: new Vector3(1, -1, 0), + intensity: 0.7, + position: new Vector3(-5, 8, 2), + color: new Color3(1, 1, 1) + }, + { + name: "yundongDirLight", + type: LightType.DIRECTIONAL, + direction: new Vector3(0, 1, 0), + intensity: 0.2, + position: new Vector3(0, 0, 0), + color: new Color3(1, 1, 1) + } + ] + + constructor(mainApp: MainApp) { + super(mainApp); + } + + Awake() { + this.createDefaultLights(this.mainApp.appScene.object); + } + + // 创建默认灯光 + createDefaultLights(scene: Scene) { + console.log("创建默认灯光配置"); + + this.defaultLightConfigs.forEach(config => { + this.createLight(scene, config); + }); + } + + // 创建灯光的主方法 + createLight(scene: Scene, config: LightConfig): Light { + let light: Light; + + switch (config.type) { + case LightType.DIRECTIONAL: + light = this.createDirectionalLight(scene, config); + break; + case LightType.POINT: + light = this.createPointLight(scene, config); + break; + case LightType.SPOT: + light = this.createSpotLight(scene, config); + break; + case LightType.HEMISPHERIC: + light = this.createHemisphericLight(scene, config); + break; + default: + throw new Error(`不支持的灯光类型: ${config.type}`); + } + + this.lightList.push(light); + console.log(`✅ 创建灯光: ${config.name} (${config.type})`); + return light; + } + + // 创建平行光 + private createDirectionalLight(scene: Scene, config: LightConfig): DirectionalLight { + const light = new DirectionalLight(config.name, config.direction || new Vector3(0, -1, 0), scene); + light.intensity = config.intensity; + light.position = config.position; + + if (config.color) { + light.diffuse = config.color; + light.specular = config.color; + } + + return light; + } + + // 创建点光源 + private createPointLight(scene: Scene, config: LightConfig): PointLight { + const light = new PointLight(config.name, config.position, scene); + light.intensity = config.intensity; + + if (config.range) { + light.range = config.range; + } + + if (config.color) { + light.diffuse = config.color; + light.specular = config.color; + } + + return light; + } + + // 创建聚光灯 + private createSpotLight(scene: Scene, config: LightConfig): SpotLight { + const light = new SpotLight( + config.name, + config.position, + config.direction || new Vector3(0, -1, 0), + config.angle || Math.PI / 4, + config.exponent || 2, + scene + ); + + light.intensity = config.intensity; + + if (config.color) { + light.diffuse = config.color; + light.specular = config.color; + } + + return light; + } + + // 创建半球光 + private createHemisphericLight(scene: Scene, config: LightConfig): HemisphericLight { + const light = new HemisphericLight(config.name, config.direction || new Vector3(0, 1, 0), scene); + light.intensity = config.intensity; + + if (config.color) { + light.diffuse = config.color; + light.specular = config.color; + } + + return light; + } + + // 动态添加灯光 + addLight(type: LightType, options: { + name?: string; + position?: Vector3; + direction?: Vector3; + intensity?: number; + color?: Color3; + angle?: number; + exponent?: number; + range?: number; + } = {}): Light { + const scene = this.mainApp.appScene.object; + if (!scene) { + throw new Error("场景未初始化"); + } + + // 生成默认名称 + const name = options.name || `${type}_${++this.lightCounter}`; + + // 检查名称是否已存在 + if (this.lightList.find(light => light.name === name)) { + throw new Error(`灯光名称已存在: ${name}`); + } + + const config: LightConfig = { + name, + type, + position: options.position || new Vector3(0, 5, 0), + direction: options.direction, + intensity: options.intensity || 1, + color: options.color || new Color3(1, 1, 1), + angle: options.angle, + exponent: options.exponent, + range: options.range + }; + + return this.createLight(scene, config); + } + + // 删除灯光 + removeLight(lightName: string): boolean { + const lightIndex = this.lightList.findIndex(light => light.name === lightName); + if (lightIndex === -1) { + console.warn(`灯光不存在: ${lightName}`); + return false; + } + + const light = this.lightList[lightIndex]; + + // 从场景中移除 + light.dispose(); + + // 从列表中移除 + this.lightList.splice(lightIndex, 1); + + console.log(`🗑️ 删除灯光: ${lightName}`); + return true; + } + + // 获取灯光类型 + getLightType(light: Light): LightType { + if (light instanceof DirectionalLight) return LightType.DIRECTIONAL; + if (light instanceof PointLight) return LightType.POINT; + if (light instanceof SpotLight) return LightType.SPOT; + if (light instanceof HemisphericLight) return LightType.HEMISPHERIC; + throw new Error(`未知的灯光类型: ${light.constructor.name}`); + } + + // 获取所有灯光信息(增强版) + getAllLights() { + return this.lightList.map((light) => { + const lightType = this.getLightType(light); + const baseInfo = { + id: light.id, + name: light.name, + type: lightType, + intensity: light.intensity, + position: (light as any).position || new Vector3(0, 0, 0), + color: { + r: light.diffuse.r, + g: light.diffuse.g, + b: light.diffuse.b + }, + enabled: light.isEnabled() + }; + + // 根据灯光类型添加特定属性 + switch (lightType) { + case LightType.DIRECTIONAL: + case LightType.SPOT: + return { + ...baseInfo, + direction: (light as DirectionalLight | SpotLight).direction + }; + case LightType.POINT: + return { + ...baseInfo, + range: (light as PointLight).range + }; + case LightType.SPOT: + return { + ...baseInfo, + direction: (light as SpotLight).direction, + angle: (light as SpotLight).angle, + exponent: (light as SpotLight).exponent + }; + default: + return baseInfo; + } + }); + } + + // 根据名称修改灯光属性(增强版) + updateLight(name: string, properties: { + position?: Vector3 | { x: number; y: number; z: number }; + direction?: Vector3 | { x: number; y: number; z: number }; + intensity?: number; + color?: { r: number; g: number; b: number }; + range?: number; + angle?: number; + exponent?: number; + }) { + const targetLight = this.lightList.find(light => light.name === name); + + if (!targetLight) { + console.warn(`灯光不存在: ${name}`); + return; + } + + console.log(`🔧 更新灯光 ${name}:`, properties); + + // 更新位置 + if (properties.position && (targetLight as any).position) { + if (properties.position instanceof Vector3) { + (targetLight as any).position = properties.position.clone(); + } else { + (targetLight as any).position = new Vector3(properties.position.x, properties.position.y, properties.position.z); + } + console.log(`📍 位置已更新:`, (targetLight as any).position); + } + + // 更新方向(仅适用于平行光和聚光灯) + if (properties.direction && (targetLight instanceof DirectionalLight || targetLight instanceof SpotLight)) { + let newDirection: Vector3; + + if (properties.direction instanceof Vector3) { + newDirection = properties.direction.clone(); + } else { + newDirection = new Vector3(properties.direction.x, properties.direction.y, properties.direction.z); + } + + if (newDirection.length() > 0.001) { + newDirection.normalize(); + targetLight.direction = newDirection; + console.log(`🎯 方向已更新:`, newDirection); + } else { + console.warn(`⚠️ 方向向量长度为0,跳过更新`); + } + } + + // 更新强度 + if (typeof properties.intensity === 'number') { + targetLight.intensity = properties.intensity; + console.log(`💡 强度已更新:`, properties.intensity); + } + + // 更新颜色 + if (properties.color) { + targetLight.diffuse = new Color3(properties.color.r, properties.color.g, properties.color.b); + targetLight.specular = new Color3(properties.color.r, properties.color.g, properties.color.b); + console.log(`🎨 颜色已更新:`, properties.color); + } + + // 更新点光源范围 + if (typeof properties.range === 'number' && targetLight instanceof PointLight) { + targetLight.range = properties.range; + console.log(`📏 范围已更新:`, properties.range); + } + + // 更新聚光灯属性 + if (targetLight instanceof SpotLight) { + if (typeof properties.angle === 'number') { + targetLight.angle = properties.angle; + console.log(`🔦 角度已更新:`, properties.angle); + } + if (typeof properties.exponent === 'number') { + targetLight.exponent = properties.exponent; + console.log(`📐 指数已更新:`, properties.exponent); + } + } + + // 强制刷新场景渲染 + try { + const scene = this.mainApp.appScene.object; + if (scene) { + scene.markAllMaterialsAsDirty(); + scene.render(); + } + } catch (error) { + console.warn(`场景刷新失败:`, error); + } + } + + // 保持向后兼容的方法 + setDirectionalLight(light: any) { + console.log(light); + // 这个方法现在需要根据具体的灯光名称来更新 + // 保持原有逻辑但需要适配新的结构 + } + + setIntensity(light: any) { + // 这个方法现在需要根据具体的灯光名称来更新 + // 保持原有逻辑但需要适配新的结构 + } + + excludedMeshesCar(mesh: any) { + // 为所有灯光排除车辆网格 + this.lightList.forEach(light => { + if (light.excludedMeshes) { + light.excludedMeshes.push(mesh); + } + }); + } + + excludedMeshesScene(mesh: any) { + // 为所有灯光排除场景网格 + this.lightList.forEach(light => { + if (light.excludedMeshes) { + light.excludedMeshes.push(mesh); + } + }); + } +} + +export { AppLight }; \ No newline at end of file diff --git a/src/script/public/AppModel.ts b/src/script/public/AppModel.ts new file mode 100644 index 0000000..4844537 --- /dev/null +++ b/src/script/public/AppModel.ts @@ -0,0 +1,70 @@ +import { AbstractMesh, ImportMeshAsync } from "@babylonjs/core"; +import { AppConfig } from "@/script/public/AppConfig"; +import { Dictionary } from "@/script/utils/Dictionary"; +import { MainApp } from "@/script/public/MainApp"; +import "@babylonjs/loaders/gltf"; +import { Monobehiver } from "@/script/base"; + + +interface ModelLoadResult { + success: boolean; + meshes?: AbstractMesh[]; + skeletons?: any[]; + error?: string; +} + +class AppModel extends Monobehiver { + // 模型字典,存储已加载的模型 + private modelDic: Dictionary = new Dictionary(); + // 已加载的网格列表 + private loadedMeshes: AbstractMesh[] = []; + + + constructor(mainApp: MainApp) { + super(mainApp); + + } + + // 加载所有模型 + async loadModel(): Promise { + const modelUrlList = AppConfig.modelUrlList; + if (!modelUrlList?.length) return; + + const loadPromises = modelUrlList.map(url => this.loadSingleModel(url)); + await Promise.allSettled(loadPromises); + + // 模型加载完成后,应用定制化材质 + if (this.mainApp.appCustomization) { + // 延迟一点时间,确保材质已加载 + setTimeout(() => { + this.mainApp.appCustomization.applyToAllMeshes(); + }, 100); + } + } + + // 加载单个模型文件 + private async loadSingleModel(modelUrl: string): Promise { + try { + const { meshes, skeletons } = await ImportMeshAsync(modelUrl, this.mainApp.appScene.object); + + if (!meshes?.length) { + return { success: false, error: '未找到网格' }; + } + + // 将网格添加到已加载列表和模型字典 + this.loadedMeshes.push(...meshes); + this.modelDic.Set(modelUrl, meshes); + + return { success: true, meshes, skeletons }; + } catch (error) { + return { success: false, error: error instanceof Error ? error.message : String(error) }; + } + } + + + + + +} + +export { AppModel }; \ No newline at end of file diff --git a/src/script/public/AppRay.ts b/src/script/public/AppRay.ts new file mode 100644 index 0000000..d8d4b37 --- /dev/null +++ b/src/script/public/AppRay.ts @@ -0,0 +1,221 @@ +import { + type IPointerEvent, + PickingInfo, + PointerEventTypes, + Vector3, + AbstractMesh, + Color3, + PBRMaterial, + StandardMaterial, + HighlightLayer, + PointerInfo, +} from '@babylonjs/core' +import { MainApp } from './MainApp' +import { Monobehiver } from '@/script/base' +import { useMaterialStore } from '@/stores/material' + +class AppRay extends Monobehiver { + oldPoint: Vector3 = Vector3.Zero() + newPoint: Vector3 = Vector3.Zero() + private materialStore = useMaterialStore() + private highlightLayer: HighlightLayer | null = null + private originalMaterial: any = null + private highlightedMesh: AbstractMesh | null = null + + constructor(mainApp: MainApp) { + super(mainApp) + } + + Awake() { + this.setupHighlightLayer() + this.setupUnifiedEventHandling() + this.debugMeshPickableStatus() + } + + // 设置高亮层 + setupHighlightLayer() { + // 高亮层创建已禁用 + return + } + + // 设置统一的事件处理 + setupUnifiedEventHandling() { + // 使用观察者模式而不是直接覆盖事件处理器 + this.mainApp.appScene.object.onPointerObservable.add((pointerInfo: PointerInfo) => { + const { type, event, pickInfo } = pointerInfo; + + // 检查事件类型并转换 + const pointerEvent = event as IPointerEvent; + + // 只处理鼠标和触摸事件 + if (pointerEvent.pointerType !== "mouse" && pointerEvent.pointerType !== "touch") { + return; + } + + // 处理非主要触摸点 + if (pointerEvent.pointerType === "touch" && (pointerEvent as any).isPrimary === false) { + return; + } + + if (type === PointerEventTypes.POINTERDOWN) { + this.oldPoint.set(pointerEvent.clientX, 0, pointerEvent.clientY); + } else if (type === PointerEventTypes.POINTERUP) { + this.newPoint.set(pointerEvent.clientX, 0, pointerEvent.clientY); + const distance = Vector3.Distance(this.oldPoint, this.newPoint); + + // 只有在没有移动的情况下才处理单击 + if (distance < 5) { // 增加一些容差 + this.handleSingleClick(pointerEvent, pickInfo); + } + } + }); + } + + // 处理单击 + handleSingleClick(evt: IPointerEvent, pickInfo: PickingInfo | null) { + console.log('单击事件触发', { pickInfo, mesh: pickInfo?.pickedMesh?.name }); + if (pickInfo && pickInfo.pickedMesh) { + this.handleMaterialSelection(pickInfo.pickedMesh as AbstractMesh); + } + } + + + // 处理材质选择 + handleMaterialSelection(mesh: AbstractMesh) { + try { + console.log('开始处理材质选择:', mesh.name); + + // 清除之前的高亮 + this.clearHighlight() + + // 获取材质信息 + const materialInfo = this.materialStore.getMaterialInfo(mesh) + console.log('材质信息:', materialInfo); + + // 设置选中的材质 + this.materialStore.setSelectedMaterial(materialInfo.materialName) + + // 高亮显示选中的网格 + this.highlightMesh(mesh) + + console.log('材质已选择:', { + meshName: materialInfo.meshName, + materialName: materialInfo.materialName, + hasMaterial: !!materialInfo.material + }) + } catch (error) { + console.error('选择材质失败:', error) + } + } + + // 高亮显示网格 - 已禁用 + highlightMesh(mesh: AbstractMesh) { + // 高亮功能已禁用 + console.log('高亮功能已禁用,跳过高亮:', mesh.name) + return + } + + // 使用材质方式高亮 - 已禁用 + highlightWithMaterial(mesh: AbstractMesh) { + // 材质高亮功能已禁用 + console.log('材质高亮功能已禁用,跳过:', mesh.name) + return + } + + // 清除高亮 + clearHighlight() { + try { + // 清除高亮层 + if (this.highlightLayer && this.highlightedMesh) { + try { + this.highlightLayer.removeMesh(this.highlightedMesh as any) + } catch (error) { + console.warn('高亮层移除失败:', error) + } + } + + // 恢复原始材质 + if (this.highlightedMesh && this.originalMaterial) { + const material = this.highlightedMesh.material as PBRMaterial + if (material && this.originalMaterial.albedoColor) { + material.albedoColor = this.originalMaterial.albedoColor + material.emissiveColor = this.originalMaterial.emissiveColor + } + } + + this.highlightedMesh = null + this.originalMaterial = null + this.materialStore.setHighlighted(false) + } catch (error) { + console.error('清除高亮失败:', error) + } + } + + // 调试网格点击状态 + debugMeshPickableStatus() { + console.log('=== 调试网格点击状态 ==='); + const scene = this.mainApp.appScene.object; + if (!scene) return; + + const allMeshes = scene.meshes; + const hairMeshes: AbstractMesh[] = []; + const pickableMeshes: AbstractMesh[] = []; + const nonPickableMeshes: AbstractMesh[] = []; + + allMeshes.forEach((mesh: AbstractMesh) => { + // 检查是否是头发相关的网格 + if (mesh.name.toLowerCase().includes('hair') || + mesh.name.toLowerCase().includes('head') || + mesh.name.includes('Hair')) { + hairMeshes.push(mesh); + } + + if (mesh.isPickable) { + pickableMeshes.push(mesh); + } else { + nonPickableMeshes.push(mesh); + } + }); + + // 详细输出头发网格信息 + if (hairMeshes.length > 0) { + hairMeshes.forEach((mesh: AbstractMesh, index: number) => { + }); + } + + // 输出不可点击的网格 + if (nonPickableMeshes.length > 0) { + nonPickableMeshes.forEach((mesh, index) => { + }); + } + + } + + // 强制设置头发网格为可点击 + fixHairMeshPickable() { + console.log('=== 修复头发网格点击状态 ==='); + const scene = this.mainApp.appScene.object; + if (!scene) return; + + let fixedCount = 0; + scene.meshes.forEach((mesh: AbstractMesh) => { + // 检查是否是头发相关的网格 + if (mesh.name.toLowerCase().includes('hair') || + mesh.name.toLowerCase().includes('head') || + mesh.name.includes('Hair')) { + + if (!mesh.isPickable) { + mesh.isPickable = true; + fixedCount++; + console.log(`已修复头发网格: ${mesh.name}`); + } + } + }); + + console.log(`共修复了 ${fixedCount} 个头发网格的点击状态`); + console.log('========================'); + } + +} + +export { AppRay } diff --git a/src/script/public/AppScene.ts b/src/script/public/AppScene.ts new file mode 100644 index 0000000..379e541 --- /dev/null +++ b/src/script/public/AppScene.ts @@ -0,0 +1,45 @@ +import { Color4, Scene, PointerEventTypes, ImageProcessingConfiguration } from '@babylonjs/core' +import { MainApp } from '@/script/core' +import { Monobehiver } from '@/script/base' +import { userDragStore, userBottomNavigationStore } from '@/stores/zguiy' + +class AppScene extends Monobehiver { + object!: Scene + isComplate!: boolean + dragStore = userDragStore() + // 鼠标事件 + isMouseDown = false; + bottomNavigationStore: any + dragTimeout: any = null; + constructor(mainApp: MainApp) { + super(mainApp) + } + + Awake() { + + this.bottomNavigationStore = userBottomNavigationStore() + + this.object = new Scene(this.mainApp.appEngin.object) + this.object.autoClear = true + this.object.clearColor = new Color4(0, 0, 0, 0) + + // 优化设置,防止动画卡住 + this.object.autoClear = true + this.object.blockMaterialDirtyMechanism = false // 允许材质更新 + this.object.forceShowBoundingBoxes = false // 不强制显示边界框 + this.object.skipFrustumClipping = true // 禁用视锥裁剪,防止模型显示不全时蒙皮消失 + + } + + getScene() { + return this.object + } + + update() { + this.object.render() + } + clean() { + this.object && this.object.dispose() + } +} +export { AppScene } diff --git a/src/script/public/AppTween.ts b/src/script/public/AppTween.ts new file mode 100644 index 0000000..08996bd --- /dev/null +++ b/src/script/public/AppTween.ts @@ -0,0 +1,27 @@ +import { animate,easeOut } from "popmotion" +import { MainApp } from "@/script/core" +import { Monobehiver } from "@/script/base" + +export class AppTween extends Monobehiver { + + constructor(mainApp: MainApp) { + super(mainApp) + } + + run(form: any, to: any,update:Function,complete:Function,timer=1000) { + animate({ + from: form, + to: to, + duration: timer, + ease:easeOut, + onUpdate: latest => update(latest), + onComplete: () => { + complete() + } + }) + } + + + + +} \ No newline at end of file diff --git a/src/script/public/GameManager.ts b/src/script/public/GameManager.ts new file mode 100644 index 0000000..15499a0 --- /dev/null +++ b/src/script/public/GameManager.ts @@ -0,0 +1,20 @@ +import { AbstractMesh, Color3, PBRMaterial } from "@babylonjs/core"; +import { Monobehiver } from "@/script/base"; +import type { MainApp } from "./MainApp"; + + + +class GameManager extends Monobehiver { + + constructor(mainApp: MainApp) { + super(mainApp) + } + // 主角色模型引用 + private yifu: AbstractMesh | null = null; + + + + +} + +export { GameManager }; \ No newline at end of file diff --git a/src/script/public/MainApp.ts b/src/script/public/MainApp.ts new file mode 100644 index 0000000..730e2c3 --- /dev/null +++ b/src/script/public/MainApp.ts @@ -0,0 +1,183 @@ +import { + AppCamera, + AppEnv, + AppEngin, + AppScene, + GameManager, + AppConfig, + AppDom, + AppTween, + AppRay, + Dimensions, + AppHotspot, + AppGlowLayer, + AppLight, + AppCustomization, + +} from "../core"; +import { AppModel } from '@/script/public/AppModel'; +import { DracoCompression, KhronosTextureContainer2, MeshBuilder, PBRMaterial, PBRMetallicRoughnessMaterial, SceneOptimizer, SceneOptimizerOptions, StandardMaterial } from "@babylonjs/core"; +import { userLoadingStore, userCarStore, userCarModelStore } from '@/stores/zguiy'; + + +class MainApp { + canvas!: HTMLCanvasElement; + appEngin!: AppEngin; + appScene!: AppScene; + appCamera!: AppCamera; + gameManager!: GameManager; + appDom!: AppDom; + appTween!: AppTween; + appModel!: AppModel; + appEnv!: AppEnv; + appRay!: AppRay + isRender: boolean = true; + setInterval: any + dimensions!: Dimensions + carStore!: any + carModelStore!: any + appGlowLayer!: AppGlowLayer + appGlowLayer1!: AppGlowLayer + appLight!: AppLight + appCustomization!: AppCustomization + constructor() { + this.carStore = userCarStore() + this.carModelStore = userCarModelStore() + this.appDom = new AppDom(); + this.appEngin = new AppEngin(this); + this.appScene = new AppScene(this); + this.appCamera = new AppCamera(this); + this.gameManager = new GameManager(this); + this.appTween = new AppTween(this); + this.appModel = new AppModel(this); + this.appEnv = new AppEnv(this); + this.appRay = new AppRay(this); + this.dimensions = new Dimensions(this); + this.appGlowLayer = new AppGlowLayer(this) + this.appLight = new AppLight(this) + this.appCustomization = new AppCustomization(this) + window.addEventListener("resize", this.handleResize.bind(this), false); + + } + + loadAConfig(appConfig: any) { + AppConfig.modelUrlList = appConfig.modelUrlList; + AppConfig.success = appConfig.success || []; + AppConfig.animationUrlList = appConfig.animationUrlList || []; + AppConfig.error = appConfig.error; + } + + async Awake() { + this.loadBabylon() + this.appDom.Awake(); + this.appEngin.Awake(); + this.appScene.Awake(); + this.appCamera.Awake(); + // this.gameManager.Awake(); + this.appEnv.Awake(); + this.appModel.Awake(); + this.appGlowLayer.Awake(); + this.appLight.Awake(); + this.appCustomization.Awake(); + this.appRay.Awake(); + + this.update() + } + + + loadBabylon() { + + DracoCompression.Configuration.decoder.wasmUrl = import.meta.env.BASE_URL + 'bblcdn/draco_wasm_wrapper_gltf.js'; + DracoCompression.Configuration.decoder.wasmBinaryUrl = import.meta.env.BASE_URL + 'bblcdn/draco_decoder_gltf.wasm' + DracoCompression.Configuration.decoder.fallbackUrl = import.meta.env.BASE_URL + 'bblcdn/draco_decoder_gltf.js' + KhronosTextureContainer2.URLConfig.jsDecoderModule = import.meta.env.BASE_URL + ' bblcdn/babylon.ktx2Decoder.js'; + KhronosTextureContainer2.URLConfig.wasmMSCTranscoder = import.meta.env.BASE_URL + 'bblcdn/msc_basis_transcoder.wasm' + KhronosTextureContainer2.URLConfig.jsMSCTranscoder = import.meta.env.BASE_URL + 'bblcdn/msc_basis_transcoder.js' + KhronosTextureContainer2.URLConfig.wasmUASTCToBC7 = import.meta.env.BASE_URL + 'bblcdn/uastc_bc7.wasm' + KhronosTextureContainer2.URLConfig.wasmZSTDDecoder = import.meta.env.BASE_URL + 'bblcdn/zstddec.wasm'; + + } + + + async loadModel() { + try { + this.loadComplate(); + await this.appModel.loadModel(); + // await this.gameManager.Awake(); + + AppConfig.success(); + } catch (error) { + console.error('加载模型过程中出错:', error); + if (AppConfig.error) { + AppConfig.error(error); + } + } + } + + async loadAnimation() { + try { + // await this.gameManager.Awake(); + AppConfig.success(); + } catch (error) { + console.error('加载模型过程中出错:', error); + if (AppConfig.error) { + AppConfig.error(error); + } + } + } + + + loadComplate() { + // 使用直接导入的方式 + const loadingStore = userLoadingStore(); + + if (this.setInterval) { + clearInterval(this.setInterval); + } + + this.setInterval = setInterval(() => { + // 获取当前进度值 + const currentProgress = loadingStore.loadProgress; + + // 如果当前进度小于98,继续增加 + if (currentProgress < 98) { + // 缓慢增加进度,根据当前值确定增量 + const increment = Math.max(0.1, Math.min(0.5, (98 - currentProgress) / 50)); + + + this.appDom.loadsliderbar.value = currentProgress + increment; + loadingStore.setLoadProgress(this.appDom.loadsliderbar.value); + // 同步更新store中的加载进度 + // loadingStore.setLoadProgress(this.appDom.loadsliderbar.value); + } + }, 50); + } + + handleResize() { + this.appEngin.handleResize(); + } + + dispose() { + + return new Promise((resolve, reject) => { + + + resolve(true) + }) + + } + + + update() { + this.appEngin.object.runRenderLoop(() => { + this.appScene.object.render(); + this.appCamera.update(); + + }); + } + unUpdate() { + this.appEngin.object.stopRenderLoop(); + } +} + +export { MainApp }; diff --git a/src/script/utils/Axes.ts b/src/script/utils/Axes.ts new file mode 100644 index 0000000..55a7730 --- /dev/null +++ b/src/script/utils/Axes.ts @@ -0,0 +1,31 @@ +import { Scene, Vector3, MeshBuilder, Color3, StandardMaterial } from "@babylonjs/core"; + +// 创建坐标轴辅助函数 +export const createAxes=(scene: Scene, size: number = 10) => { + // X轴 - 红色 + const xAxis = MeshBuilder.CreateLines("xAxis", { + points: [Vector3.Zero(), new Vector3(size, 0, 0)], + }, scene); + const xMat = new StandardMaterial("xMat", scene); + xMat.diffuseColor = Color3.Red(); + xAxis.color = Color3.Red(); + xAxis.material = xMat; + + // Y轴 - 绿色 + const yAxis = MeshBuilder.CreateLines("yAxis", { + points: [Vector3.Zero(), new Vector3(0, size, 0)], + }, scene); + const yMat = new StandardMaterial("yMat", scene); + yMat.diffuseColor = Color3.Green(); + yAxis.color = Color3.Green(); + yAxis.material = yMat; + + // Z轴 - 蓝色 + const zAxis = MeshBuilder.CreateLines("zAxis", { + points: [Vector3.Zero(), new Vector3(0, 0, size)], + }, scene); + const zMat = new StandardMaterial("zMat", scene); + zMat.diffuseColor = Color3.Blue(); + zAxis.color = Color3.Blue(); + zAxis.material = zMat; +} diff --git a/src/script/utils/ConfigLoading.ts b/src/script/utils/ConfigLoading.ts new file mode 100644 index 0000000..c8fd874 --- /dev/null +++ b/src/script/utils/ConfigLoading.ts @@ -0,0 +1,32 @@ +import { AppConfig } from "@/script/public/AppConfig"; +export class ConfigLoading { + static async load(configPaths: string[]) { + const results = await Promise.all( + configPaths.map(async (configPath) => { + + const response = await fetch(configPath); + if (response.ok) { + return response.json(); + } else { + throw new Error(`Failed to load config from ${configPath}`); + } + }) + ); + + // 创建一个对象来存储加载的配置 + const configData: Record = {}; + + // 将文件名作为键,并赋值到 AppConfig 的对应静态属性 + configPaths.forEach((path, index) => { + const fileName = path.split('/').pop()?.replace('.json', ''); + if (fileName) { + console.log(fileName); + (AppConfig as any)[fileName] = results[index]; // 设置到 AppConfig 静态属性 + configData[fileName] = results[index]; // 存储到 configData 对象 + } + }); + + // 返回包含所有配置项的对象 + return configData; + } +} \ No newline at end of file diff --git a/src/script/utils/Dictionary.ts b/src/script/utils/Dictionary.ts new file mode 100644 index 0000000..095448a --- /dev/null +++ b/src/script/utils/Dictionary.ts @@ -0,0 +1,111 @@ +/** + * 泛型字典类 + * let dictionary = new Dictionary(); // new一个对象 + * // 设置属性 + * dictionary.Set('gandalf', 'gandalf@email.com'); + * dictionary.Set('john', 'johnsnow@email.com'); + * dictionary.Set('tyrion', 'tyrion@email.com'); + * // 调用 + * console.log(dictionary.Size()); + * console.log(dictionary.Values()); + * console.log(dictionary.Get('tyrion')); + */ +export class Dictionary { + /** + * 字典项目 + */ + private items: any = {} + + /** + * 验证指定键是否在字典中 + * @param key 键 + * @returns 是否存在 + */ + public Has(key: string): boolean { + return key in this.items + } + + /** + * 设置键值 + * @param key 键 + * @param value 值 + */ + public Set(key: string, value: T): void { + this.items[key] = value + + } + + /** + * 移除指定键 + * @param key 键 + * @returns 是否移除成功 + */ + public Remove(key: string): boolean { + if (this.Has(key)) { + delete this.items[key] + return true + } + return false + } + + /** + * 查找特定键的值 + * @param key 键 + * @returns 值 + */ + public Get(key: string): T { + return this.Has(key) ? this.items[key] : undefined + } + + /** + * 获取字典所有的键 + * @returns 键数组 + */ + public Keys(): Array { + let values = new Array() //存到数组中返回 + for (let k in this.items) { + if (this.Has(k)) { + values.push(k) + } + } + return values + } + + /** + * 获取字典所有的值 + * @returns 值数组 + */ + public Values(): Array { + // 存到数组中返回 + let values = new Array() + for (let k in this.items) { + if (this.Has(k)) { + values.push(this.items[k]) + } + } + return values + } + + /** + * 获取所有键值 + * @returns 键值对对象 + */ + public GetItems(): object { + return this.items + } + + /** + * 清空字典 + */ + public Clear(): void { + this.items = {} + } + + /** + * 获取字典大小 + * @returns + */ + public Size(): number { + return Object.keys(this.items).length + } +} diff --git a/src/script/utils/Dimensions.ts b/src/script/utils/Dimensions.ts new file mode 100644 index 0000000..e6a2c45 --- /dev/null +++ b/src/script/utils/Dimensions.ts @@ -0,0 +1,673 @@ +import { Color3, Mesh, MeshBuilder, SpriteManager, Sprite, Vector3, Matrix, LinesMesh } from "@babylonjs/core"; +import { Monobehiver } from "../base/Monobehiver"; +import { AppConfig } from "@/script/public/AppConfig"; +import { MainApp } from "@/script/public/MainApp"; + +export class Dimensions extends Monobehiver { + private dimensionLines: (Mesh | LinesMesh)[] = []; + private dimensionLabels: HTMLElement[] = []; + private dimensionSprites: Sprite[] = []; + private lineColor: Color3 = new Color3(0, 0.7, 1); // 默认尺寸线颜色 - 蓝色 + private labelColor: string = "#000000"; // 文字颜色 + private offset: number = 0.05; // 尺寸线与模型的偏移距离 + private scene: any; + private enable: boolean = false; + private dimensionsContainer: HTMLElement; + private spriteManager!: SpriteManager; + private animationSpeed: number = 0.05; // 动画速度 + private animating: boolean = false; // 是否正在动画中 + private animationFrames: Map = new Map(); + + constructor(mainApp: MainApp) { + super(mainApp); + this.dimensionsContainer = document.createElement('div'); + } + + async Awake(): Promise { + this.scene = this.mainApp.appScene.object; + + // 初始化精灵管理器 + this.spriteManager = new SpriteManager( + 'dimensionSpriteManager', + '', // 空图片,因为我们不需要显示精灵本身 + 10, // 最大精灵数量 + 1, // 精灵大小 + this.scene + ); + + // 创建尺寸标签容器 + this.dimensionsContainer.className = 'dimensions-container'; + this.dimensionsContainer.style.position = 'absolute'; + // this.dimensionsContainer.style.zIndex = '99'; + this.dimensionsContainer.style.top = '0'; + this.dimensionsContainer.style.left = '0'; + this.dimensionsContainer.style.width = '100%'; + this.dimensionsContainer.style.height = '100%'; + this.dimensionsContainer.style.pointerEvents = 'none'; + this.dimensionsContainer.style.userSelect = 'none'; + + // 添加到DOM + document.querySelector('.app-view')?.appendChild(this.dimensionsContainer); + + // 添加场景渲染观察者,确保每帧更新标签位置 + this.scene.onBeforeRenderObservable.add(() => { + this.updateDimensionsPosition(); + }); + if (this.enable) { + this.show() + } + else { + this.hide(); + } + } + + /** + * 生成并显示尺寸线和尺寸文本 + */ + show(): void { + // 停止任何正在进行的动画 + this.stopAllAnimations(); + + // 彻底清理所有内容 + this.clearDimensions(); + + // 清理动画数据 + this.animationFrames.clear(); + + // 创建新的尺寸线 + this.createDimensions(); + this.dimensionsContainer.style.display = 'block'; + } + + /** + * 隐藏所有尺寸线和尺寸文本 + */ + hide(): void { + // 先隐藏标签 + this.dimensionLabels.forEach(label => { + label.style.transition = 'opacity 0.5s ease-in-out'; + label.style.opacity = '0'; + }); + + // 启动隐藏动画 + this.startHideAnimation(); + this.dimensionsContainer.style.display = 'none'; + } + + /** + * 启动线条消失动画 + */ + private startHideAnimation(): void { + this.animating = true; + + // 在动画开始前清理所有箭头 + this.clearArrows(); + + // 创建反向动画数据 + this.dimensionLines.forEach(line => { + // 跳过箭头 + if (line.name.includes('arrow')) { + return; + } + + // 获取线条的起点和终点 + const points = line.getVerticesData('position'); + if (!points || points.length < 6) return; + + const start = new Vector3(points[0], points[1], points[2]); + const end = new Vector3(points[3], points[4], points[5]); + + // 存储动画信息 - 注意这里与创建动画相反 + this.animationFrames.set(line, { + start: start.clone(), + end: start.clone(), // 终点变为起点(线条会收缩) + progress: 0, + originalEnd: end.clone() // 存储原始终点 + }); + }); + + // 添加动画更 this.photoDome_yundong.mesh.renderingGroupId = 1;新观察者 + const observer = this.scene.onBeforeRenderObservable.add(() => { + let allCompleted = true; + + // 更新每条线的动画 + this.animationFrames.forEach((data, line) => { + if (data.progress < 1) { + // 更新进度 + data.progress += this.animationSpeed; + if (data.progress > 1) data.progress = 1; + + // 计算当前终点(收缩效果) + const currentEnd = new Vector3( + data.originalEnd.x - (data.originalEnd.x - data.end.x) * data.progress, + data.originalEnd.y - (data.originalEnd.y - data.end.y) * data.progress, + data.originalEnd.z - (data.originalEnd.z - data.end.z) * data.progress + ); + + // 更新线条 + const points = [data.start, currentEnd]; + if (line instanceof LinesMesh) { + MeshBuilder.CreateLines(line.name, { points, instance: line }); + } + + allCompleted = false; + } + }); + + // 移除箭头 + this.dimensionLines.forEach(line => { + if (line.name.includes('arrow')) { + line.dispose(); + } + }); + + // 如果所有线条动画都完成了 + if (allCompleted) { + // 清除所有内容 + this.clearDimensions(); + + // 移除观察者 + this.scene.onBeforeRenderObservable.remove(observer); + this.animating = false; + } + }); + } + + /** + * 清除所有尺寸线和尺寸文本 + */ + private clearDimensions(): void { + // 停止任何正在进行的动画 + this.animating = false; + + // 清除尺寸线(包括箭头) + this.dimensionLines.forEach(line => { + if (line) { + try { + line.dispose(); + } catch (error) { + console.warn('清理线段时发生错误:', error); + } + } + }); + this.dimensionLines = []; + + // 清除尺寸精灵 + this.dimensionSprites.forEach(sprite => { + if (sprite) { + try { + sprite.dispose(); + } catch (error) { + console.warn('清理精灵时发生错误:', error); + } + } + }); + this.dimensionSprites = []; + + // 清除尺寸标签 + this.dimensionLabels.forEach(label => { + if (label && label.parentNode) { + try { + label.parentNode.removeChild(label); + } catch (error) { + console.warn('清理标签时发生错误:', error); + } + } + }); + this.dimensionLabels = []; + + // 清理动画数据 + this.animationFrames.clear(); + } + + left: boolean = false; + /** + * 根据包围盒信息创建尺寸线和文字标注 + */ + private createDimensions(): void { + if (!this.mainApp.boxHelper) return; + + // 得到包围盒的坐标 + const boundingInfo = this.mainApp.boxHelper.parent.getBoundingInfo(); + const min = boundingInfo.boundingBox.minimumWorld; + const max = boundingInfo.boundingBox.maximumWorld; + console.log(AppConfig.Scene.dimensions); + const {x,y,z} = AppConfig.Scene.dimensions; + + //放在右侧 + if (!this.left) { + // 创建宽度标注(X轴方向)- 放到前面 + this.createDimensionLine( + new Vector3(min.x, min.y, min.z - this.offset), + new Vector3(max.x, min.y, min.z - this.offset), + z + ' mm', + 0 + ); + + // 创建高度标注(Y轴方向)- 放到前右 + this.createDimensionLine( + new Vector3(max.x , min.y, max.z+this.offset), + new Vector3(max.x , max.y, max.z+ this.offset), + x + ' mm', + 1 + ); + + // 创建深度标注(Z轴方向)- 放到右侧 + this.createDimensionLine( + new Vector3(max.x - this.offset, min.y, min.z), + new Vector3(max.x - this.offset, min.y, max.z), + x + ' mm', + 2 + ); + } else { + //放在左侧 + // 创建宽度标注(X轴方向)- 放到后面 + this.createDimensionLine( + new Vector3(min.x, min.y, max.z + this.offset), + new Vector3(max.x, min.y, max.z + this.offset), + 5860 + ' mm', + 0 + ); + + // 创建高度标注(Y轴方向)- 放到前右 + this.createDimensionLine( + new Vector3(max.x - this.offset, min.y, min.z), + new Vector3(max.x - this.offset, max.y, min.z), + 1960 + ' mm', + 1 + ); + + // 创建深度标注(Z轴方向)- 放到右侧 + this.createDimensionLine( + new Vector3(max.x - this.offset, min.y, min.z), + new Vector3(max.x - this.offset, min.y, max.z), + 1910 + ' mm', + 2 + ); + } + } + + /** + * 创建一条尺寸线和对应的文字标注 + * @param start 起点位置 + * @param end 终点位置 + * @param text 显示的文本 + * @param dimensionType 维度类型(0=宽度,1=高度,2=深度) + */ + private createDimensionLine(start: Vector3, end: Vector3, text: string, dimensionType: number): void { + // 创建初始线段(只有起点) + const initialPoints = [start, start.clone()]; + const line = MeshBuilder.CreateLines(`dimension_line_${dimensionType}`, { + points: initialPoints, + updatable: true + }, this.scene); + line.color = this.lineColor; + line.isPickable = false; + line.renderingGroupId =1 + // 存储动画信息 + this.animationFrames.set(line, { + start: start.clone(), + end: end.clone(), + progress: 0, + originalEnd: end.clone() + }) + + // 计算文本位置(线段中点) + const textPosition = new Vector3( + (start.x + end.x) / 2, + (start.y + end.y) / 2, + (start.z + end.z) / 2 + ); + + // 创建精灵用于位置跟踪(但初始不显示) + const sprite = new Sprite(`dimension_sprite_${dimensionType}`, this.spriteManager); + sprite.position = textPosition; + sprite.size = 0; + sprite.isPickable = false; + this.dimensionSprites.push(sprite); + + // 创建HTML文本标签(初始不显示) + const label = this.createDimensionLabel(text, dimensionType); + label.style.opacity = '0'; + + // 添加到数组中便于后续管理 + this.dimensionLines.push(line); + + // 启动动画(如果没有在进行) + if (!this.animating) { + this.startAnimation(); + } + } + + /** + * 启动线条生成动画 + */ + private startAnimation(): void { + this.animating = true; + + // 在动画开始前清理所有箭头 + this.clearArrows(); + + // 添加动画更新观察者 + const observer = this.scene.onBeforeRenderObservable.add(() => { + let allCompleted = true; + + // 更新每条线的动画 + this.animationFrames.forEach((data, line) => { + if (data.progress < 1) { + // 更新进度 + data.progress += this.animationSpeed; + if (data.progress > 1) data.progress = 1; + + // 计算当前终点 + const currentEnd = new Vector3( + data.start.x + (data.end.x - data.start.x) * data.progress, + data.start.y + (data.end.y - data.start.y) * data.progress, + data.start.z + (data.end.z - data.start.z) * data.progress + ); + + // 更新线条 + const points = [data.start, currentEnd]; + if (line instanceof LinesMesh) { + MeshBuilder.CreateLines(line.name, { points, instance: line }); + } + + allCompleted = false; + } else if (data.progress === 1 && !line.metadata?.arrowsCreated) { + // 线条完成后创建箭头 + const index = parseInt(line.name.split('_').pop() || '0'); + this.addArrowHeads(data.start, data.end, index); + line.metadata = { arrowsCreated: true }; + } + }); + + // 如果所有线条动画都完成了 + if (allCompleted) { + // 显示标签(淡入效果) + this.dimensionLabels.forEach(label => { + label.style.transition = 'opacity 0.5s ease-in-out'; + label.style.opacity = '1'; + }); + + // 移除观察者 + this.scene.onBeforeRenderObservable.remove(observer); + this.animating = false; + } + }); + } + + /** + * 添加箭头头部 + */ + private addArrowHeads(start: Vector3, end: Vector3, dimensionType: number): void { + // 计算方向向量 + const direction = end.subtract(start).normalize(); + + // 线段尺寸 + const lineLength = 0.03; // 垂直线段的长度 + + // 计算垂直于方向的向量,用于创建垂直线段 + let perpendicular: Vector3; + + // 根据不同维度选择合适的垂直向量 + switch (dimensionType) { + case 0: // X轴(宽度) + perpendicular = new Vector3(0, lineLength, 0); + break; + case 1: // Y轴(高度) + perpendicular = new Vector3(0, 0, lineLength); + break; + case 2: // Z轴(深度) + perpendicular = new Vector3(0, lineLength, 0); + break; + default: + perpendicular = new Vector3(0, lineLength, 0); + } + + // 创建垂直线段(两端各一个) + // 起点的垂直线段 + const startLinePoints = [ + start.add(perpendicular), + start.subtract(perpendicular) + ]; + + const startLine = MeshBuilder.CreateLines(`dimension_arrow_start_${dimensionType}`, { + points: startLinePoints + }, this.scene); + startLine.color = this.lineColor; + startLine.isPickable = false; + startLine.renderingGroupId = 1; + + // 终点的垂直线段 + const endLinePoints = [ + end.add(perpendicular), + end.subtract(perpendicular) + ]; + + const endLine = MeshBuilder.CreateLines(`dimension_arrow_end_${dimensionType}`, { + points: endLinePoints + }, this.scene); + endLine.color = this.lineColor; + endLine.isPickable = false; + endLine.renderingGroupId = 1; + + // 添加到数组中 + this.dimensionLines.push(startLine, endLine); + } + + /** + * 创建HTML文本标签 + * @param text 显示的文本 + * @param dimensionType 维度类型 + */ + private createDimensionLabel(text: string, dimensionType: number): HTMLElement { + // 创建标签元素 + const label = document.createElement('div'); + label.className = 'dimension-label'; + label.id = `dimension_label_${dimensionType}`; + label.textContent = text; + + // 设置标签样式 + label.style.position = 'absolute'; + label.style.color = this.labelColor; + label.style.backgroundColor = 'rgb(255, 255, 255)'; // 浅灰色背景 + label.style.padding = '4px 8px'; + label.style.borderRadius = '4px'; + label.style.fontSize = '14px'; + label.style.fontWeight = 'bold'; + label.style.transform = 'translate(-50%, -50%)'; + label.style.whiteSpace = 'nowrap'; + label.style.pointerEvents = 'none'; + label.style.boxShadow = '0 2px 4px rgba(0, 0, 0, 0.2)'; // 添加阴影效果 + label.style.border = '1px solid rgba(200, 200, 200, 0.5)'; // 添加浅灰色边框 + + // 添加文字阴影提升可读性 + label.style.textShadow = ` + 0 0 2px rgba(255, 255, 255, 0.5), + 0 0 4px rgba(0, 0, 0, 0.2) + `; + + // 添加到容器 + this.dimensionsContainer.appendChild(label); + + // 保存引用 + this.dimensionLabels.push(label); + + return label; + } + + /** + * 更新所有尺寸标签的位置和可见性 + */ + private updateDimensionsPosition(): void { + if (this.dimensionSprites.length === 0) return; + + try { + for (let i = 0; i < this.dimensionSprites.length; i++) { + const sprite = this.dimensionSprites[i]; + const label = this.dimensionLabels[i]; + + if (!sprite || !label) continue; + + // 使用worldToScreen将3D位置转换为屏幕坐标 + const screenPos = this.worldToScreen( + sprite.position, + this.mainApp.appCamera.object, + this.mainApp.appScene.object, + this.mainApp.appEngin.object + ); + + // 计算是否在视线内 + this.updateAnnotationOpacity(sprite); + + // 更新标签位置 + label.style.left = screenPos.x / 2 + 'px'; + label.style.top = screenPos.y / 2 + 'px'; + + // 同步标签的可见性与sprite的可见性 + label.style.display = sprite.isVisible ? 'block' : 'none'; + } + } catch (error) { + console.error("更新尺寸标签位置时发生错误:", error); + } + } + spriteBehindObject: boolean = false; + updateAnnotationOpacity(sprite: Sprite) { + this.spriteBehindObject = + this.distance(this.mainApp.appCamera.object.position, sprite.position) > + this.distance(this.mainApp.appCamera.object.position, Vector3.Zero()) + sprite.size = this.spriteBehindObject ? 0 : 1 + sprite.isVisible = !this.spriteBehindObject + } + + distance(v1: Vector3, v2: Vector3) { + let x = Math.pow(v1.x - v2.x, 2) + let y = Math.pow(v1.y - v2.y, 2) + let z = Math.pow(v1.z - v2.z, 2) + + let distance = Math.sqrt(x + y + z) + return distance + } + + + /** + * 将世界坐标转换为屏幕坐标 + */ + private worldToScreen(point: Vector3, camera: any, scene: any, engine: any): Vector3 { + return Vector3.Project( + point, + Matrix.Identity(), + scene.getTransformMatrix(), + camera.viewport.toGlobal( + engine.getRenderWidth(), + engine.getRenderHeight() + ) + ); + } + + + + /** + * 更新尺寸线和文字位置(当模型尺寸或位置变化时调用) + */ + update(): void { + if (!this.enable) return; + + // 否则只更新标签位置 + this.updateDimensionsPosition(); + } + + + /** + * 切换尺寸线的可见性 + */ + // 定义一个名为 toggle 的方法,接收一个布尔类型的参数 visible + toggle(visible: boolean): void { + // 如果正在动画中,先停止所有动画 + if (this.animating) { + this.stopAllAnimations(); + } + + // 将传入的 visible 参数赋值给实例的 enable 属性 + this.enable = visible; + + // 判断 enable 属性的值 + if (this.enable) { + // 如果 enable 为 true,则调用 show 方法 + this.show(); + } else { + // 如果 enable 为 false,则调用 hide 方法 + this.hide(); + } + } + /** + * 清理资源 + */ + clean(): void { + // 移除场景渲染观察者 + if (this.scene && this.scene.onBeforeRenderObservable) { + this.scene.onBeforeRenderObservable.clear?.(); + } + + this.clearDimensions(); + + // 销毁精灵管理器 + if (this.spriteManager) { + this.spriteManager.dispose(); + } + + // 移除容器 + if (this.dimensionsContainer && this.dimensionsContainer.parentNode) { + this.dimensionsContainer.parentNode.removeChild(this.dimensionsContainer); + } + } + + + /** + * 窗口大小改变时调用 + */ + onResize(): void { + if (this.enable) { + // 窗口大小改变时只需更新标签位置 + this.updateDimensionsPosition(); + } + } + + /** + * 清理所有箭头 + */ + private clearArrows(): void { + this.dimensionLines.forEach(line => { + if (line.name.includes('arrow')) { + line.dispose(); + } + }); + this.dimensionLines = this.dimensionLines.filter(line => !line.name.includes('arrow')); + } + + /** + * 停止所有正在进行的动画 + */ + private stopAllAnimations(): void { + // 停止所有正在进行的动画 + this.animating = false; + + // 安全地清理观察者 + if (this.scene && this.scene.onBeforeRenderObservable) { + try { + // 尝试移除所有与尺寸相关的观察者 + this.scene.onBeforeRenderObservable.clear(); + + // 重新添加位置更新观察者 + this.scene.onBeforeRenderObservable.add(() => { + this.updateDimensionsPosition(); + }); + } catch (error) { + console.warn('清理动画观察者时发生错误:', error); + } + } + + // 清理动画数据 + this.animationFrames.clear(); + } +} diff --git a/src/script/utils/ForMatTime.ts b/src/script/utils/ForMatTime.ts new file mode 100644 index 0000000..b2f4b73 --- /dev/null +++ b/src/script/utils/ForMatTime.ts @@ -0,0 +1,39 @@ +export const ForMatTime = (time: number) => { + const millis = parseInt((time % 1000).toString()) + let second = 0 + let totalMinute = 0 + let minute = 0 + let hour = 0 + let result = '' + const totalSecond = parseInt((time / 1000).toString()) + if (totalSecond > 59) { + // 总秒数大于59 需要计算总分钟 数 + second = parseInt((totalSecond % 60).toString()) + totalMinute = parseInt((totalSecond / 60).toString()) + } else { + second = totalSecond + } + if (totalMinute > 59) { + minute = parseInt((totalMinute % 60).toString()) + } else { + minute = totalMinute + } + if (minute < 10) { + result += '0' + minute + } else { + result += '' + minute + } + if (second < 10) { + result += ':0' + second + } else { + result += ':' + second + } + if (millis < 10) { + result += ':00' + millis + } else if (millis < 100) { + result += ':0' + millis + } else { + result += ':' + millis + } + return result +} diff --git a/src/script/utils/NoEvent.ts b/src/script/utils/NoEvent.ts new file mode 100644 index 0000000..00a1627 --- /dev/null +++ b/src/script/utils/NoEvent.ts @@ -0,0 +1,10 @@ +export const NoEvent = () => { + document.addEventListener('contextmenu', (e)=> { + e.preventDefault(); + }); + // 禁止文字选择 + document.addEventListener('selectstart', (e) => { + e.preventDefault(); + }); +} + \ No newline at end of file diff --git a/src/script/utils/RandomString.ts b/src/script/utils/RandomString.ts new file mode 100644 index 0000000..7f5548e --- /dev/null +++ b/src/script/utils/RandomString.ts @@ -0,0 +1,24 @@ +export const RandomString = (len: number) => { + let _charStr = + 'abacdefghjklmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ0123456789', + min = 0, + max = _charStr.length - 1, + _str = '' //定义随机字符串 变量 + //判断是否指定长度,否则默认长度为15 + len = len || 15 + //循环生成字符串 + for (var i = 0, index; i < len; i++) { + index = (function (randomIndexFunc, i) { + return randomIndexFunc(min, max, i, randomIndexFunc) + })(function (min: number, max: number, i: number, _self: any) { + let indexTemp = Math.floor(Math.random() * (max - min + 1) + min), + numStart = _charStr.length - 10 + if (i == 0 && indexTemp >= numStart) { + indexTemp = _self(min, max, i, _self) + } + return indexTemp + }, i) + _str += _charStr[index] + } + return _str +} diff --git a/src/script/utils/Tools.ts b/src/script/utils/Tools.ts new file mode 100644 index 0000000..ab8b6da --- /dev/null +++ b/src/script/utils/Tools.ts @@ -0,0 +1,127 @@ + +export class Tools { + // static colorToRGB = (color: string): any => { + // let color1, color2, color3 + // color = '' + color + // if (typeof color !== 'string') return + // if (color.charAt(0) == '#') { + // color = color.substring(1) + // } + // if (color.length == 3) { + // color = color[0] + color[0] + color[1] + color[1] + color[2] + color[2] + // } + // if (/^[0-9a-fA-F]{6}$/.test(color)) { + // color1 = parseInt(color.substr(0, 2), 16) + // color2 = parseInt(color.substr(2, 2), 16) + // color3 = parseInt(color.substr(4, 2), 16) + // // return 'rgb(' + color1 + ',' + color2 + ',' + color3 + ',' + opt + ')' + // return new Color3(color1 / 255, color2 / 255, color3 / 255) + // } + // } + + + + static iSAndroid() { + var u = navigator.userAgent + if (u.indexOf('Android') > -1 || u.indexOf('Adr') > -1) { + return true + } else { + return false + } + } + + + //获取地址栏参数,key:参数名称 + static getUrlParams(key: string) { + const paramsString = window.location.search; + + // 将参数部分分割出来并去掉问号 + const searchParams = new URLSearchParams(paramsString); + + // 获取指定名称的参数值 + const encodedValue = searchParams.get(key); + if (!encodedValue) return null + // 解码参数值 + const decodedValue = decodeURIComponent(encodedValue); + if (decodedValue) return decodedValue + return null + } + + static isExistUrl(url: string) { + return fetch(url) + .then(response => { + if (response.ok) { + // 文件存在 + return true; + } else if (response.status === 404) { + // 文件不存在 + return false; + } else { + // 其他错误 + throw new Error("检查文件存在性时出现错误"); + } + }) + .catch(error => { + console.log(111); + + }); + } + + + static isExistFile(filepath:string){ + if(filepath ==null ||filepath ==undefined || filepath =="" ){ + return false + } + var xmlhttp=new XMLHttpRequest(); + xmlhttp.open("GET",filepath ,false); + xmlhttp.send(); + if(xmlhttp.readyState==4){ + if(xmlhttp.status==200) return true; //url存在 + else if(xmlhttp.status==404) return false; //url不存在 + else return false;//其他状态 + } + } + + + + /** + * 判断变量是否为空 + */ + static isEmpty=(val: any)=> { + if (typeof val == "undefined" || val == null || val === "") { + return true; + } + if (typeof val === "number" && val !== 0) return !val; + if (val instanceof Error) return val.message === ""; + switch (Object.prototype.toString.call(val)) { + // String or Array + case "[object String]": + case "[object Array]": + return !val.length; + + // Map or Set or File + case "[object File]": + case "[object Map]": + case "[object Set]": { + return !val.size; + } + // Plain Object + case "[object Object]": { + return !Object.keys(val).length; + } + } + return false; +} + + + + +} +export function waitForme(millisec:number) { + return new Promise(resolve => { + setTimeout(() => { resolve('') }, millisec); + }) +} +export function isPhone() { + return window.innerWidth < 767 +} \ No newline at end of file diff --git a/src/script/utils/Tween.ts b/src/script/utils/Tween.ts new file mode 100644 index 0000000..9842901 --- /dev/null +++ b/src/script/utils/Tween.ts @@ -0,0 +1,20 @@ +import { animate, distance, easeInOut } from "popmotion" +export const run = (form: any, to: any,duration:number, update: any, complete: any) => { + + animate({ + from: form, + to: to, + duration: duration, + onUpdate: update, + onComplete: complete, + ease: easeInOut + }) + +} + +export const distanceV = (form: any, to: any) => { + + + return parseFloat(distance(form, to).toFixed(2)) + +} \ No newline at end of file diff --git a/src/script/utils/index.ts b/src/script/utils/index.ts new file mode 100644 index 0000000..6765351 --- /dev/null +++ b/src/script/utils/index.ts @@ -0,0 +1,2 @@ +export { Dictionary } from './Dictionary' +export { Tools } from './Tools' \ No newline at end of file diff --git a/src/stores/animation.ts b/src/stores/animation.ts new file mode 100644 index 0000000..bce3318 --- /dev/null +++ b/src/stores/animation.ts @@ -0,0 +1,87 @@ +import { defineStore } from 'pinia' +import { ref, computed, readonly } from 'vue' +import { v4 as uuidv4 } from 'uuid'; + +export const useAnimationStore = defineStore('animation', () => { + // ==================== 手语动画栈管理 ==================== + + // 手语动画栈 + const animationList = ref([]) + const maxStackSize = ref(10) + const uuid = ref("") + + // ==================== 手语动画栈方法 ==================== + /** + * 将手语动画推入栈(允许重复) + */ + const pushSignLanguageAnimation=(animation: any)=> { + // 检查栈是否已满 + if (animationList.value.length >= maxStackSize.value) { + // 移除栈底元素(最旧的) + animationList.value.shift() + } + uuid.value = uuidv4() + // 推入新动画(允许重复) + animationList.value.push(animation) + console.log('🎬 Store: 手语动画已入栈:', animation.name, '当前栈大小:', animationList.value.length) + } + + /** + * 从栈中弹出手语动画 + */ + const popSignLanguageAnimation=()=> { + if (animationList.value.length === 0) { + console.warn('🎬 Store: 手语动画栈为空,无法弹出') + return null + } + + const poppedAnimation = animationList.value.pop() + console.log('🎬 Store: 手语动画已出栈:', poppedAnimation?.name, '当前栈大小:', animationList.value.length) + + // 注意:这里不再更新uuid,避免循环触发 + // uuid.value = uuidv4() + + return poppedAnimation || null + } + + + + /** + * 清空手语动画栈 + */ + const clearSignLanguageStack: any | null=()=> { + animationList.value = [] + console.log('🎬 Store: 手语动画栈已清空') + } + + /** + * 获取手语动画栈的副本 + */ + const getSignLanguageStack: any | null=()=> { + return [...animationList.value] + } + + /** + * 设置最大栈大小 + */ + const setMaxStackSize: any | null=(size: number)=> { + maxStackSize.value = Math.max(1, Math.min(size, 50)) + console.log('🎬 Store: 最大栈大小设置为:', maxStackSize.value) + } + + + // ==================== 返回 ==================== + + return { + // 手语动画栈状态 + animationList, + maxStackSize, + uuid, + // 手语动画栈方法 + pushSignLanguageAnimation, + popSignLanguageAnimation, + clearSignLanguageStack, + getSignLanguageStack, + setMaxStackSize + } +}) diff --git a/src/stores/customization.ts b/src/stores/customization.ts new file mode 100644 index 0000000..002bdec --- /dev/null +++ b/src/stores/customization.ts @@ -0,0 +1,304 @@ +import { defineStore } from 'pinia' +import { ref, computed } from 'vue' + +// 定制层接口 +export interface CustomizationLayer { + id: number + name?: string + graphic?: HTMLImageElement + rectangle: boolean + ratio: number + horizontal: number + vertical: number + size: number + rotation: number + width: number + height: number + fillStyle: string + visible: boolean +} + +// 图形资源接口 +export interface GraphicAsset { + name: string + image: HTMLImageElement + ratio: number + size: number + url: string +} + +// 颜色选项 +export const AVAILABLE_COLORS = [ + "Azure", + "Black", + "DarkGray", + "DimGray", + "Red", + "FireBrick", + "DeepPink", + "OrangeRed", + "Orange", + "Gold", + "Yellow", + "RoyalBlue", + "CornflowerBlue", + "DeepSkyBlue", + "DarkGreen", + "ForestGreen", + "GreenYellow", + "RebeccaPurple", + "DarkViolet", + "MediumPurple", +] + +export const useCustomizationStore = defineStore('customization', () => { + // ==================== 状态 ==================== + + // 最大层数 + const maxLayers = ref(5) + + // 当前选中的层 + const currentLayer = ref(undefined) + + // 定制层数组 + const layers = ref([]) + + // 图形资源数组 + const graphics = ref([]) + + // 当前显示模式:'content' | 'controls' + const displayMode = ref<'content' | 'controls'>('content') + + // 是否正在更新纹理 + const isUpdatingTexture = ref(false) + + // 纹理更新触发标记(用于触发纹理重新绘制) + const textureUpdateTrigger = ref(0) + + // ==================== 计算属性 ==================== + + // 当前层信息 + const currentLayerInfo = computed(() => { + if (currentLayer.value === undefined) return null + return layers.value[currentLayer.value] + }) + + // 是否有选中的层 + const hasSelectedLayer = computed(() => currentLayer.value !== undefined) + + // 可见层数量 + const visibleLayersCount = computed(() => + layers.value.filter(layer => layer.visible).length + ) + + // ==================== 动作 ==================== + + // 初始化层数组 + const initializeLayers = () => { + layers.value = [] + for (let i = 0; i < maxLayers.value; i++) { + layers.value.push({ + id: i, + name: undefined, + graphic: undefined, + rectangle: false, + ratio: 1.0, + horizontal: 0.0, + vertical: 0.0, + size: 512, + rotation: 0.0, + width: 1.0, + height: 1.0, + fillStyle: '#00000000', + visible: false + }) + } + } + + // 选择层 + const selectLayer = (layerIndex: number | undefined) => { + if (layerIndex === undefined) { + currentLayer.value = undefined + displayMode.value = 'content' + console.log('清除层选择') + } else if (layerIndex >= 0 && layerIndex < maxLayers.value) { + currentLayer.value = layerIndex + if (layers.value[layerIndex].visible) { + displayMode.value = 'controls' + } else { + displayMode.value = 'content' + } + console.log('选择层:', layerIndex) + } + } + + // 添加内容到层 + const addContentToLayer = (layerIndex: number, content: { + name: string + type: 'color' | 'graphic' + graphic?: HTMLImageElement + fillStyle?: string + }) => { + if (layerIndex >= 0 && layerIndex < maxLayers.value) { + const layer = layers.value[layerIndex] + layer.name = content.name + layer.visible = true + + if (content.type === 'color') { + layer.rectangle = true + layer.fillStyle = content.fillStyle || '#000000' + layer.graphic = undefined + layer.width = 1.0 + layer.height = 1.0 + } else if (content.type === 'graphic' && content.graphic) { + layer.rectangle = false + layer.graphic = content.graphic + layer.ratio = content.graphic.width / content.graphic.height + layer.fillStyle = '#00000000' + } + + // 触发纹理更新 + textureUpdateTrigger.value++ + console.log('添加内容到层:', layerIndex, content) + } + } + + // 更新层参数 + const updateLayerParameter = (layerIndex: number, parameter: keyof CustomizationLayer, value: any) => { + if (layerIndex >= 0 && layerIndex < maxLayers.value) { + const layer = layers.value[layerIndex] + if (parameter in layer) { + (layer as any)[parameter] = value + // 触发纹理更新 + textureUpdateTrigger.value++ + console.log('更新层参数:', layerIndex, parameter, value) + } + } + } + + // 触发纹理更新 + const triggerTextureUpdate = () => { + textureUpdateTrigger.value++ + } + + // 移动层位置 + const moveLayer = (layerIndex: number, direction: 'up' | 'down') => { + if (layerIndex >= 0 && layerIndex < maxLayers.value) { + const temp = layers.value[layerIndex] + + if (direction === 'up' && layerIndex > 0) { + layers.value[layerIndex] = layers.value[layerIndex - 1] + layers.value[layerIndex - 1] = temp + } else if (direction === 'down' && layerIndex < maxLayers.value - 1) { + layers.value[layerIndex] = layers.value[layerIndex + 1] + layers.value[layerIndex + 1] = temp + } + + // 触发纹理更新 + textureUpdateTrigger.value++ + console.log('移动层:', layerIndex, direction) + } + } + + // 删除层内容 + const removeLayerContent = (layerIndex: number) => { + if (layerIndex >= 0 && layerIndex < maxLayers.value) { + const layer = layers.value[layerIndex] + layer.name = undefined + layer.graphic = undefined + layer.rectangle = false + layer.ratio = 1.0 + layer.horizontal = 0.0 + layer.vertical = 0.0 + layer.size = 512 + layer.rotation = 0.0 + layer.width = 1.0 + layer.height = 1.0 + layer.fillStyle = '#00000000' + layer.visible = false + + if (currentLayer.value === layerIndex) { + currentLayer.value = undefined + displayMode.value = 'content' + } + + // 触发纹理更新 + textureUpdateTrigger.value++ + console.log('删除层内容:', layerIndex) + } + } + + // 切换显示模式 + const toggleDisplayMode = () => { + displayMode.value = displayMode.value === 'content' ? 'controls' : 'content' + } + + // 显示内容选择 + const showContentSelection = () => { + displayMode.value = 'content' + } + + // 显示层控制 + const showLayerControls = () => { + displayMode.value = 'controls' + } + + // 添加图形资源 + const addGraphicAsset = (asset: GraphicAsset) => { + graphics.value.push(asset) + console.log('添加图形资源:', asset.name) + } + + // 清空所有层 + const clearAllLayers = () => { + layers.value.forEach(layer => { + layer.name = undefined + layer.graphic = undefined + layer.rectangle = false + layer.ratio = 1.0 + layer.horizontal = 0.0 + layer.vertical = 0.0 + layer.size = 512 + layer.rotation = 0.0 + layer.width = 1.0 + layer.height = 1.0 + layer.fillStyle = '#00000000' + layer.visible = false + }) + currentLayer.value = undefined + displayMode.value = 'content' + console.log('清空所有层') + } + + // ==================== 返回 ==================== + + return { + // 状态 + maxLayers, + currentLayer, + layers, + graphics, + displayMode, + isUpdatingTexture, + textureUpdateTrigger, + + // 计算属性 + currentLayerInfo, + hasSelectedLayer, + visibleLayersCount, + + // 动作 + initializeLayers, + selectLayer, + addContentToLayer, + updateLayerParameter, + moveLayer, + removeLayerContent, + toggleDisplayMode, + showContentSelection, + showLayerControls, + addGraphicAsset, + clearAllLayers, + triggerTextureUpdate + } +}) diff --git a/src/stores/hdr.ts b/src/stores/hdr.ts new file mode 100644 index 0000000..868806b --- /dev/null +++ b/src/stores/hdr.ts @@ -0,0 +1,110 @@ +import { defineStore } from 'pinia' +import { ref } from 'vue' + +export interface HDRSettings { + texture: string + intensity: number + rotation: number +} + +export const useHDRStore = defineStore('hdr', () => { + // HDR设置 + const settings = ref({ + texture: '', + intensity: 1.5, + rotation: 0 + }) + + // 原始HDR设置 + const originalSettings = ref(null) + + // 可用的HDR贴图列表 + const availableHDRs = ref([ + 'assets/hdr/environment1.hdr', + 'assets/hdr/environment2.hdr', + 'assets/hdr/environment3.hdr', + 'assets/hdr/studio.hdr' + ]) + + // 保存原始设置(仅在首次调用时保存) + const saveOriginalSettings = (originalHDRSettings: HDRSettings) => { + if (!originalSettings.value) { + originalSettings.value = { ...originalHDRSettings } + console.log('HDR原始设置已保存:', originalSettings.value) + } + } + + // 设置HDR贴图 + const setHDRTexture = (texture: string) => { + settings.value.texture = texture + } + + // 设置HDR亮度 + const setHDRIntensity = (intensity: number) => { + settings.value.intensity = intensity + } + + // 设置HDR旋转角度 + const setHDRRotation = (rotation: number) => { + settings.value.rotation = rotation + } + + // 检查设置是否有变化 + const hasChanges = (): boolean => { + if (!originalSettings.value) return false + + return settings.value.texture !== originalSettings.value.texture || + settings.value.intensity !== originalSettings.value.intensity || + settings.value.rotation !== originalSettings.value.rotation + } + + // 获取已修改的设置(只返回与原始值不同的属性) + const getModifiedSettings = (): Partial | null => { + if (!originalSettings.value || !hasChanges()) return null + + const modified: Partial = {} + + if (settings.value.texture !== originalSettings.value.texture) { + modified.texture = settings.value.texture + } + if (settings.value.intensity !== originalSettings.value.intensity) { + modified.intensity = settings.value.intensity + } + if (settings.value.rotation !== originalSettings.value.rotation) { + modified.rotation = settings.value.rotation + } + + return Object.keys(modified).length > 0 ? modified : null + } + + // 重置HDR设置到原始值 + const resetToOriginal = () => { + if (originalSettings.value) { + settings.value = { ...originalSettings.value } + console.log('HDR设置已重置为原始值') + } + } + + // 重置HDR设置(保持向后兼容) + const resetHDR = () => { + settings.value = { + texture: '', + intensity: 1.0, + rotation: 0 + } + } + + return { + settings, + originalSettings, + availableHDRs, + saveOriginalSettings, + setHDRTexture, + setHDRIntensity, + setHDRRotation, + hasChanges, + getModifiedSettings, + resetToOriginal, + resetHDR + } +}) \ No newline at end of file diff --git a/src/stores/index.ts b/src/stores/index.ts new file mode 100644 index 0000000..27c377e --- /dev/null +++ b/src/stores/index.ts @@ -0,0 +1,8 @@ +// https://pinia.vuejs.org/ +import { createPinia } from 'pinia'; + +// 创建 +const pinia = createPinia(); + +// 导出 +export default pinia; diff --git a/src/stores/lighting.ts b/src/stores/lighting.ts new file mode 100644 index 0000000..facf232 --- /dev/null +++ b/src/stores/lighting.ts @@ -0,0 +1,289 @@ +import { defineStore } from 'pinia' +import { ref } from 'vue' +import { Vector3 } from 'three' + +// 灯光类型枚举 +export enum LightType { + DIRECTIONAL = "DirectionalLight", + POINT = "PointLight", + SPOT = "SpotLight", + HEMISPHERIC = "HemisphericLight" +} + +export interface LightInfo { + id: string + name: string + type: LightType + intensity: number + position: Vector3 + direction?: Vector3 + color: { r: number; g: number; b: number } + enabled: boolean + // 点光源特有属性 + range?: number + // 聚光灯特有属性 + angle?: number + exponent?: number + decay?: number +} + +export const useLightingStore = defineStore('lighting', () => { + // 场景中的灯光列表 + const lights = ref([]) + + // 原始灯光设置 + const originalLights = ref>(new Map()) + + // 选中的灯光 + const selectedLight = ref(null) + + // 保存原始灯光设置 + const saveOriginalLights = (lightsList: LightInfo[]) => { + lightsList.forEach(light => { + if (!originalLights.value.has(light.id)) { + // 深拷贝灯光信息 + const originalLight: LightInfo = { + id: light.id, + name: light.name, + type: light.type, + intensity: light.intensity, + position: new Vector3(light.position.x, light.position.y, light.position.z), + direction: light.direction ? new Vector3(light.direction.x, light.direction.y, light.direction.z) : undefined, + color: { r: light.color.r, g: light.color.g, b: light.color.b }, + enabled: light.enabled, + range: light.range, + angle: light.angle, + exponent: light.exponent, + decay: light.decay + } + originalLights.value.set(light.id, originalLight) + } + }) + console.log('灯光原始设置已保存:', originalLights.value.size, '个灯光') + } + + // 设置灯光列表 + const setLights = (lightsList: LightInfo[]) => { + lights.value = lightsList + // 自动保存原始设置 + saveOriginalLights(lightsList) + } + + // 添加新灯光到列表 + const addLight = (light: LightInfo) => { + lights.value.push(light) + // 保存原始设置 + saveOriginalLights([light]) + } + + // 从列表中移除灯光 + const removeLight = (lightId: string) => { + const index = lights.value.findIndex(light => light.id === lightId) + if (index !== -1) { + lights.value.splice(index, 1) + originalLights.value.delete(lightId) + + // 如果删除的是当前选中的灯光,清空选择 + if (selectedLight.value?.id === lightId) { + selectedLight.value = null + } + } + } + + // 选择灯光 + const selectLight = (lightId: string) => { + const light = lights.value.find(l => l.id === lightId) + selectedLight.value = light || null + } + + // 更新灯光强度 + const updateLightIntensity = (lightId: string, intensity: number) => { + const light = lights.value.find(l => l.id === lightId) + if (light) { + light.intensity = intensity + } + } + + // 更新灯光位置 + const updateLightPosition = (lightId: string, position: Vector3) => { + const light = lights.value.find(l => l.id === lightId) + if (light) { + light.position = position + } + } + + // 更新灯光方向 + const updateLightDirection = (lightId: string, direction: Vector3) => { + const light = lights.value.find(l => l.id === lightId) + if (light) { + light.direction = direction + } + } + + // 更新灯光颜色 + const updateLightColor = (lightId: string, color: { r: number; g: number; b: number }) => { + const light = lights.value.find(l => l.id === lightId) + if (light) { + light.color = color + } + } + + // 更新点光源范围 + const updateLightRange = (lightId: string, range: number) => { + const light = lights.value.find(l => l.id === lightId) + if (light && light.type === LightType.POINT) { + light.range = range + } + } + + // 更新聚光灯角度 + const updateLightAngle = (lightId: string, angle: number) => { + const light = lights.value.find(l => l.id === lightId) + if (light && light.type === LightType.SPOT) { + light.angle = angle + } + } + + // 更新聚光灯指数 + const updateLightExponent = (lightId: string, exponent: number) => { + const light = lights.value.find(l => l.id === lightId) + if (light && light.type === LightType.SPOT) { + light.exponent = exponent + } + } + + // 更新聚光灯衰减 + const updateLightDecay = (lightId: string, decay: number) => { + const light = lights.value.find(l => l.id === lightId) + if (light && light.type === LightType.SPOT) { + light.decay = decay + } + } + + // 切换灯光启用状态 + const toggleLightEnabled = (lightId: string) => { + const light = lights.value.find(l => l.id === lightId) + if (light) { + light.enabled = !light.enabled + } + } + + // 检查单个灯光是否有变化 + const hasLightChanged = (light: LightInfo): boolean => { + const original = originalLights.value.get(light.id) + if (!original) return false + + return light.intensity !== original.intensity || + light.position.x !== original.position.x || + light.position.y !== original.position.y || + light.position.z !== original.position.z || + light.color.r !== original.color.r || + light.color.g !== original.color.g || + light.color.b !== original.color.b || + light.enabled !== original.enabled || + light.range !== original.range || + light.angle !== original.angle || + light.exponent !== original.exponent || + light.decay !== original.decay + } + + // 检查是否有灯光变化 + const hasChanges = (): boolean => { + return lights.value.some(light => hasLightChanged(light)) + } + + // 获取已修改的灯光配置(只返回与原始值不同的灯光) + const getModifiedLights = (): LightInfo[] | null => { + const modifiedLights = lights.value + .filter(light => hasLightChanged(light)) + .map(light => ({ + id: light.id, + name: light.name, + type: light.type, + intensity: parseFloat(light.intensity.toFixed(2)), + position: new Vector3( + parseFloat(light.position.x.toFixed(2)), + parseFloat(light.position.y.toFixed(2)), + parseFloat(light.position.z.toFixed(2)) + ), + direction: light.direction ? new Vector3( + parseFloat(light.direction.x.toFixed(2)), + parseFloat(light.direction.y.toFixed(2)), + parseFloat(light.direction.z.toFixed(2)) + ) : undefined, + color: { + r: parseFloat(light.color.r.toFixed(3)), + g: parseFloat(light.color.g.toFixed(3)), + b: parseFloat(light.color.b.toFixed(3)) + }, + enabled: light.enabled, + range: light.range, + angle: light.angle, + exponent: light.exponent, + decay: light.decay + })) + + return modifiedLights.length > 0 ? modifiedLights : null + } + + // 重置单个灯光到原始值 + const resetLightToOriginal = (lightId: string): boolean => { + const light = lights.value.find(l => l.id === lightId) + const original = originalLights.value.get(lightId) + + if (!light || !original) return false + + light.intensity = original.intensity + light.position = new Vector3(original.position.x, original.position.y, original.position.z) + light.color = { ...original.color } + light.enabled = original.enabled + light.range = original.range + light.angle = original.angle + light.exponent = original.exponent + light.decay = original.decay + + console.log(`灯光 ${light.name} 已重置为原始值`) + return true + } + + // 重置所有灯光到原始值 + const resetAllLightsToOriginal = () => { + lights.value.forEach(light => { + resetLightToOriginal(light.id) + }) + console.log('所有灯光已重置为原始值') + } + + // 重置所有灯光(保持向后兼容) + const resetLighting = () => { + lights.value = [] + selectedLight.value = null + originalLights.value.clear() + } + + return { + lights, + originalLights, + selectedLight, + saveOriginalLights, + setLights, + addLight, + removeLight, + selectLight, + updateLightIntensity, + updateLightPosition, + updateLightDirection, + updateLightColor, + updateLightRange, + updateLightAngle, + updateLightExponent, + updateLightDecay, + toggleLightEnabled, + hasLightChanged, + hasChanges, + getModifiedLights, + resetLightToOriginal, + resetAllLightsToOriginal, + resetLighting + } +}) \ No newline at end of file diff --git a/src/stores/material.ts b/src/stores/material.ts new file mode 100644 index 0000000..444feba --- /dev/null +++ b/src/stores/material.ts @@ -0,0 +1,74 @@ +import { defineStore } from 'pinia' +import { ref, computed, type Ref, type ComputedRef } from 'vue' +import type { AbstractMesh, Material } from '@babylonjs/core' + +export interface MaterialInfo { + mesh: AbstractMesh | null + material: Material | null + meshName: string + materialName: string +} + +// @ts-ignore - 避免复杂的类型推断问题 +export const useMaterialStore = defineStore('material', () => { + // 状态 + const selectedColor = ref('#ffffff') + const isHighlighted = ref(false) + const selectedMaterial = ref(null) + + // 计算属性 + const currentColor = computed(() => selectedColor.value) + const hasSelectedMaterial = computed(() => selectedMaterial.value !== null) + + // 动作 + const setSelectedMaterial = (name: string | null) => { + selectedMaterial.value = name + console.log('材质已选择:', name) + } + + const setSelectedColor = (color: string) => { + selectedColor.value = color + console.log('颜色已设置:', color) + } + + const setHighlighted = (highlighted: boolean) => { + // 高亮功能已禁用 + console.log('高亮状态设置已禁用') + return + } + + const clearSelection = () => { + selectedColor.value = '#ffffff' + isHighlighted.value = false + selectedMaterial.value = null + console.log('选择已清除') + } + + // 获取材质信息 + const getMaterialInfo = (mesh: AbstractMesh): MaterialInfo => { + return { + mesh: mesh as AbstractMesh, + material: mesh.material, + meshName: mesh.name || 'Unknown', + materialName: mesh.material?.name || 'Unknown' + } + } + + return { + // 状态 + selectedColor, + isHighlighted, + selectedMaterial, + + // 计算属性 + currentColor, + hasSelectedMaterial, + + // 动作 + setSelectedMaterial, + setSelectedColor, + setHighlighted, + clearSelection, + getMaterialInfo + } +}) \ No newline at end of file diff --git a/src/stores/outfit.ts b/src/stores/outfit.ts new file mode 100644 index 0000000..4047065 --- /dev/null +++ b/src/stores/outfit.ts @@ -0,0 +1,147 @@ +import { defineStore } from 'pinia' +import { ref } from 'vue' + +export interface OutfitChangeEvent { + type: 'top' | 'bottom' | 'shoes' | 'accessories' | 'hair' | 'color' + data: any + timestamp: number +} + +export interface OutfitColorState { + top: string + bottom: string + shoes: string + hair: string +} + +export const useOutfitStore = defineStore('outfit', () => { + // 服装切换事件 + const outfitChangeEvent = ref(null) + + // 服装颜色状态 + const outfitColors = ref({ + top: '#4CAF50', + bottom: '#2196F3', + shoes: '#795548', + hair: '#8D6E63' + }) + + // 触发上装切换 + const changeTop = (topIndex: number, color?: string, modelUrl?: string) => { + // 更新颜色状态 + if (color) { + outfitColors.value.top = color + } + + outfitChangeEvent.value = { + type: 'top', + data: { index: topIndex, color: color || outfitColors.value.top, modelUrl }, + timestamp: Date.now() + } + console.log('Pinia: 触发上装切换事件', outfitChangeEvent.value) + } + + // 触发下装切换 + const changeBottom = (bottomIndex: number, color?: string, modelUrl?: string) => { + // 更新颜色状态 + if (color) { + outfitColors.value.bottom = color + } + + outfitChangeEvent.value = { + type: 'bottom', + data: { index: bottomIndex, color: color || outfitColors.value.bottom, modelUrl }, + timestamp: Date.now() + } + console.log('Pinia: 触发下装切换事件', outfitChangeEvent.value) + } + + // 触发鞋子切换 + const changeShoes = (shoeIndex: number, color?: string, modelUrl?: string) => { + // 更新颜色状态 + if (color) { + outfitColors.value.shoes = color + } + + outfitChangeEvent.value = { + type: 'shoes', + data: { index: shoeIndex, color: color || outfitColors.value.shoes, modelUrl }, + timestamp: Date.now() + } + console.log('Pinia: 触发鞋子切换事件', outfitChangeEvent.value) + } + + // 触发配饰切换 + const changeAccessories = (accessoryIndices: number[]) => { + outfitChangeEvent.value = { + type: 'accessories', + data: { indices: accessoryIndices }, + timestamp: Date.now() + } + console.log('Pinia: 触发配饰切换事件', outfitChangeEvent.value) + } + + // 触发发型切换 + const changeHair = (hairIndex: number, color?: string, modelUrl?: string) => { + // 更新颜色状态 + if (color) { + outfitColors.value.hair = color + } + + outfitChangeEvent.value = { + type: 'hair', + data: { index: hairIndex, color: color || outfitColors.value.hair, modelUrl }, + timestamp: Date.now() + } + console.log('Pinia: 触发发型切换事件', outfitChangeEvent.value) + } + + // 触发颜色切换 + const changeColor = (partType: 'top' | 'bottom' | 'shoes' | 'hair', color: string, modelUrl?: string) => { + // 更新对应部位的颜色状态 + outfitColors.value[partType] = color + + outfitChangeEvent.value = { + type: 'color', + data: { partType, color, modelUrl }, + timestamp: Date.now() + } + console.log('Pinia: 触发颜色切换事件', outfitChangeEvent.value) + } + + // 获取指定部位的颜色 + const getOutfitColor = (partType: 'top' | 'bottom' | 'shoes' | 'hair'): string => { + return outfitColors.value[partType] + } + + // 设置指定部位的颜色 + const setOutfitColor = (partType: 'top' | 'bottom' | 'shoes' | 'hair', color: string) => { + outfitColors.value[partType] = color + console.log(`Pinia: 设置${partType}颜色为: ${color}`) + } + + // 重置所有颜色 + const resetOutfitColors = () => { + outfitColors.value = { + top: '#4CAF50', + bottom: '#2196F3', + shoes: '#795548', + hair: '#8D6E63' + } + console.log('Pinia: 重置所有服装颜色') + } + + return { + outfitChangeEvent, + outfitColors, + changeTop, + changeBottom, + changeShoes, + changeAccessories, + changeHair, + changeColor, + getOutfitColor, + setOutfitColor, + resetOutfitColors + } +}) diff --git a/src/stores/panorama.ts b/src/stores/panorama.ts new file mode 100644 index 0000000..bcb9654 --- /dev/null +++ b/src/stores/panorama.ts @@ -0,0 +1,97 @@ +import { defineStore } from 'pinia' +import { ref } from 'vue' + +export interface PanoramaSettings { + texture: string + rotation: number +} + +export const usePanoramaStore = defineStore('panorama', () => { + // 全景图设置 + const settings = ref({ + texture: '', + rotation: 0 + }) + + // 原始全景图设置 + const originalSettings = ref(null) + + // 可用的全景图列表 + const availablePanoramas = ref([ + 'assets/panorama/interior1.jpg', + 'assets/panorama/interior2.jpg', + 'assets/panorama/interior3.jpg', + 'assets/panorama/interior4.jpg' + ]) + + // 保存原始设置(仅在首次调用时保存) + const saveOriginalSettings = (originalPanoramaSettings: PanoramaSettings) => { + if (!originalSettings.value) { + originalSettings.value = { ...originalPanoramaSettings } + console.log('全景图原始设置已保存:', originalSettings.value) + } + } + + // 设置全景图贴图 + const setPanoramaTexture = (texture: string) => { + settings.value.texture = texture + } + + // 设置全景图旋转角度 + const setPanoramaRotation = (rotation: number) => { + settings.value.rotation = rotation + } + + // 检查设置是否有变化 + const hasChanges = (): boolean => { + if (!originalSettings.value) return false + + return settings.value.texture !== originalSettings.value.texture || + settings.value.rotation !== originalSettings.value.rotation + } + + // 获取已修改的设置(只返回与原始值不同的属性) + const getModifiedSettings = (): Partial | null => { + if (!originalSettings.value || !hasChanges()) return null + + const modified: Partial = {} + + if (settings.value.texture !== originalSettings.value.texture) { + modified.texture = settings.value.texture + } + if (settings.value.rotation !== originalSettings.value.rotation) { + modified.rotation = settings.value.rotation + } + + return Object.keys(modified).length > 0 ? modified : null + } + + // 重置全景图设置到原始值 + const resetToOriginal = () => { + if (originalSettings.value) { + settings.value = { ...originalSettings.value } + console.log('全景图设置已重置为原始值') + } + } + + // 重置全景图设置(保持向后兼容) + const resetPanorama = () => { + settings.value = { + texture: '', + rotation: 0 + } + } + + return { + settings, + originalSettings, + availablePanoramas, + saveOriginalSettings, + setPanoramaTexture, + setPanoramaRotation, + hasChanges, + getModifiedSettings, + resetToOriginal, + resetPanorama + } +}) \ No newline at end of file diff --git a/src/stores/zguiy.ts b/src/stores/zguiy.ts new file mode 100644 index 0000000..b7a9183 --- /dev/null +++ b/src/stores/zguiy.ts @@ -0,0 +1,300 @@ +import { defineStore } from 'pinia'; +import { ref } from 'vue'; + + + + + +export const userLoadingStore = defineStore('loadingStore', () => { + + const index = ref(0); + const totle = ref(100); + const step = ref(6); + + const DebugText = ref(''); + const loadProgress = ref(0); + + + const setDebugText = (text: string) => { + + // DebugText.value = text; + if (index.value > totle.value) return; + index.value += (totle.value / step.value); + console.log(DebugText.value, index.value); + + + setLoadProgress(index.value); + DebugText.value = index.value.toFixed(0) + '%'; + } + + const setLoadProgress = (progress: number) => { + loadProgress.value = progress; + DebugText.value = loadProgress.value.toFixed(0) + '%'; + } + + return { + DebugText, + loadProgress, + setDebugText, + setLoadProgress + } + + +}) + +export const userBottomNavigationStore = defineStore('bottomNavigationStore', () => { + + // 底部导航 + const bottomNavigationIndex = ref(0); + + // 切换底部导航 + const setBottomNavigationIndex = (index: number) => { + bottomNavigationIndex.value = index + } + + return { + setBottomNavigationIndex, + bottomNavigationIndex, + } + +}) +//分类导航 +export const userCategoryNavigationStore = defineStore('categoryNavigationStore', () => { + + const categoryNavigationIndex = ref(0); + + const setCategoryNavigationIndex = (index: number) => { + categoryNavigationIndex.value = index + } + + return { + categoryNavigationIndex, + setCategoryNavigationIndex + } +}) + + +//内饰外观 +export const userCarStore = defineStore('carStore', () => { + + const isInterior = ref(false); + + const setView = (isb: boolean) => { + isInterior.value = isb + } + + return { + isInterior, + setView + } +}) + +//车身颜色 +export const userCarColorStore = defineStore('carColorStore', () => { + + const carColor = ref('#FFFFFF'); + + const setCarColor = (color: any) => { + carColor.value = color + } + + return { + carColor, + setCarColor + } +}) + + +//开门关门的pinia +export const userDoorStore = defineStore('doorStore', () => { + + const isDoorOpen = ref(false); + + const setDoorOpen = (isb: boolean) => { + isDoorOpen.value = isb + } + + return { + isDoorOpen, + setDoorOpen + } +}) + + +//卖点:标题,文字内容,开启状态 +export const userSellingPointStore = defineStore('sellingPointStore', () => { + + const title = ref(''); + const content = ref(''); + const isOpen = ref(false); + + const setTitle = (text: string) => { + title.value = text + } + + const setContent = (text: string) => { + content.value = text + } + + const setIsOpen = (status: boolean) => { + isOpen.value = status + } + + return { + title, + content, + isOpen, + setTitle, + setContent, + setIsOpen + } +}) + + +//视频播放的pinia +export const userVideoStore = defineStore('videoStore', () => { + const isVideoVisible = ref(false); + const setVideoVisible = (visible: boolean) => { + isVideoVisible.value = visible + } + return { + isVideoVisible, + setVideoVisible + } +}) + +//视频播放的pinia +export const userMusicStore = defineStore('musicStore', () => { + const isMusicVisible = ref(false); + const setMusicVisible = (visible: boolean) => { + isMusicVisible.value = visible + } + return { + isMusicVisible, + setMusicVisible + } +}) + +//增加一个拖动状态的pinia +export const userDragStore = defineStore('dragStore', () => { + const isDrag = ref(false); + const setDrag = (status: boolean) => { + isDrag.value = status + } + return { + isDrag, + setDrag + } +}) + + +//交互UI点击状态的pinia +export const userInteractStore = defineStore('interactStore', () => { + const isReset = ref(""); + const setReset = () => { + isReset.value = new Date().getTime().toString() + } + return { + isReset, + setReset + } +}) + +//是否清理缓存完成 +export const userCacheStore = defineStore('cacheStore', () => { + const isCache = ref(false); + const setCache = (status: boolean) => { + isCache.value = status + } + return { + isCache, + setCache + } +}) + +//车型选择 +export const userCarModelStore = defineStore('carModelStore', () => { + const carModel = ref(''); + const carLoaded = ref(false); + const setCarModel = (model: string) => { + carModel.value = model + } + const setCarLoaded = (status: boolean) => { + carLoaded.value = status + setTimeout(() => { + carLoaded.value = false + }, 1000); + } + return { + carModel, + setCarModel, + carLoaded, + setCarLoaded + } +}) + +//车灯状态管理 +export const userChedengStore = defineStore('chedengStore', () => { + const isChedeng = ref(false); + const setChedeng = (status: boolean) => { + isChedeng.value = status + } + return { + isChedeng, + setChedeng + } +}) + +//尺寸显示状态管理 +export const userDimensionsStore = defineStore('dimensionsStore', () => { + const isDimensionsVisible = ref(false); + const setDimensionsVisible = (status: boolean) => { + isDimensionsVisible.value = status + } + return { + isDimensionsVisible, + setDimensionsVisible + } +}) + + + +//UGUI状态管理 +export const userUGUIStore = defineStore('uguiStore', () => { + const uguiData = ref(null); + const updateUGUIData =ref("") + + + // 设置UGUI数据 + const setUGUIData = (data: any) => { + uguiData.value = data; + updateUGUIData.value = new Date().getTime().toString() + } + + + + return { + uguiData, + updateUGUIData, + setUGUIData, + + } +}) + +//增加一个product的pinia +export const userProductStore = defineStore('productStore', () => { + const product = ref(null); + const productLabel = ref(null); + const setProduct = (data: any) => { + product.value = data + } + const setProductLabel = (data: any) => { + productLabel.value = data + } + return { + product, + setProduct, + productLabel + } +}) + diff --git a/src/styles/README.md b/src/styles/README.md new file mode 100644 index 0000000..ea86179 --- /dev/null +++ b/src/styles/README.md @@ -0,0 +1,3 @@ +# Styles + +This directory is for configuring the styles of the application. diff --git a/src/styles/settings.scss b/src/styles/settings.scss new file mode 100644 index 0000000..3e36a27 --- /dev/null +++ b/src/styles/settings.scss @@ -0,0 +1,10 @@ +/** + * src/styles/settings.scss + * + * Configures SASS variables and Vuetify overwrites + */ + +// https://vuetifyjs.com/features/sass-variables/` +// @use 'vuetify/settings' with ( +// $color-pack: false +// ); diff --git a/src/typed-router.d.ts b/src/typed-router.d.ts new file mode 100644 index 0000000..0be654b --- /dev/null +++ b/src/typed-router.d.ts @@ -0,0 +1,24 @@ +/* eslint-disable */ +/* prettier-ignore */ +// @ts-nocheck +// Generated by unplugin-vue-router. ‼️ DO NOT MODIFY THIS FILE ‼️ +// It's recommended to commit this file. +// Make sure to add this file to your tsconfig.json file as an "includes" or "files" entry. + +declare module 'vue-router/auto-routes' { + import type { + RouteRecordInfo, + ParamValue, + ParamValueOneOrMore, + ParamValueZeroOrMore, + ParamValueZeroOrOne, + } from 'vue-router' + + /** + * Route name map generated by unplugin-vue-router + */ + export interface RouteNamedMap { + '/MainApp': RouteRecordInfo<'/MainApp', '/MainApp', Record, Record>, + '/View': RouteRecordInfo<'/View', '/View', Record, Record>, + } +} diff --git a/src/types/animation.ts b/src/types/animation.ts new file mode 100644 index 0000000..bde28d1 --- /dev/null +++ b/src/types/animation.ts @@ -0,0 +1,126 @@ +// 动画状态枚举 +export enum AnimationState { + IDLE = 'idle', + PLAYING = 'playing', + PAUSED = 'paused', + STOPPED = 'stopped', + LOADING = 'loading', + ERROR = 'error' +} + +// 动画类型枚举 +export enum AnimationType { + IDLE = 'idle', + WALK = 'walk', + RUN = 'run', + JUMP = 'jump', + DANCE = 'dance', + WAVE = 'wave', + SIT = 'sit', + CUSTOM = 'custom' +} + +// 动画循环模式 +export enum AnimationLoopMode { + ONCE = 'once', + LOOP = 'loop', + PING_PONG = 'pingPong' +} + +// 动画信息接口 +export interface AnimationInfo { + id: string + name: string + type: AnimationType + duration: number // 动画时长(秒) + loopMode: AnimationLoopMode + icon: string + preview?: string // 预览图片URL + description?: string + tags?: readonly string[] +} + +// 动画播放配置 +export interface AnimationPlayConfig { + speed?: number // 播放速度,默认1.0 + loop?: boolean // 是否循环播放 + fadeInTime?: number // 淡入时间(秒) + fadeOutTime?: number // 淡出时间(秒) + weight?: number // 动画权重(用于混合) + startTime?: number // 开始时间 + endTime?: number // 结束时间 +} + +// 当前播放的动画状态 +export interface PlayingAnimation { + info: AnimationInfo + config: AnimationPlayConfig + currentTime: number + progress: number // 0-1 的进度 + startedAt: number // 开始播放的时间戳 + isTransitioning: boolean // 是否在过渡中 +} + +// 动画混合器状态 +export interface AnimationMixer { + id: string + animations: PlayingAnimation[] + masterVolume: number + isEnabled: boolean +} + +// 动画加载状态 +export interface AnimationLoadState { + isLoading: boolean + loadedCount: number + totalCount: number + currentLoading?: string + error?: string +} + +// 动画系统状态 +export interface AnimationSystemState { + // 动画库 + availableAnimations: AnimationInfo[] + + // 当前状态 + currentAnimation: PlayingAnimation | null + animationQueue: AnimationInfo[] + + // 播放状态 + state: AnimationState + isPlaying: boolean + isPaused: boolean + + // 混合器 + mixer: AnimationMixer | null + + // 加载状态 + loadState: AnimationLoadState + + // 设置 + globalSpeed: number + globalVolume: number + autoPlay: boolean + + // 历史记录 + recentlyPlayed: AnimationInfo[] + favorites: AnimationInfo[] +} + +// API 响应类型 +export interface AnimationResponse { + success: boolean + data?: AnimationInfo[] + error?: string + message?: string +} + +// 动画事件类型 +export interface AnimationEvent { + type: 'start' | 'end' | 'pause' | 'resume' | 'progress' | 'error' + animation: AnimationInfo + currentTime?: number + progress?: number + error?: string +} diff --git a/src/types/customization.ts b/src/types/customization.ts new file mode 100644 index 0000000..73a8fa4 --- /dev/null +++ b/src/types/customization.ts @@ -0,0 +1,141 @@ +import type { Scene, Engine, DynamicTexture, NodeMaterial, AbstractMesh } from '@babylonjs/core' + +// 定制功能配置接口 +export interface CustomizationConfig { + server: string + imprintWidth: number + imprintHeight: number + maxLayers: number + defaultBackground: string +} + +// 定制层接口 +export interface CustomizationLayer { + id: number + name?: string + graphic?: HTMLImageElement + rectangle: boolean + ratio: number + horizontal: number + vertical: number + size: number + rotation: number + width: number + height: number + fillStyle: string + visible: boolean +} + +// 图形资源接口 +export interface GraphicAsset { + name: string + image: HTMLImageElement + ratio: number + size: number + url: string +} + +// 材质配置接口 +export interface MaterialConfig { + skateboard: NodeMaterial + decalTexture: DynamicTexture +} + +// GUI配置接口 +export interface GUIConfig { + texture: any // AdvancedDynamicTexture + contentButtons: any[] + buttons: any[] + layerBG: any[] + layerUiGrid: any[] + layoutGrid: any + layersGrid: any + slidersGrid: any + contentButtonsGrid: any + layerColor: string + highlightLayerColor: string +} + +// 资源管理器接口 +export interface AssetManager { + manager: any // BABYLON.AssetsManager + graphics: any[] + skateboard: any + skateboardRoot: AbstractMesh + skateboardMesh: AbstractMesh + decalShaderText: any + decalShaderJson: any + moveUpIcon: any + moveDownIcon: any + cancelIcon: any + addIcon: any + colors: string[] +} + +// 遮罩配置接口 +export interface MaskConfig { + gui: number + product: number +} + +// 屏幕尺寸接口 +export interface ScreenSize { + width: number + height: number + ratio: number +} + +// 定制服务接口 +export interface ICustomizationService { + // 初始化 + initialize(): Promise + + // 资源加载 + loadAssets(): Promise + + // 材质创建 + createMaterials(): Promise + + // GUI创建 + createGUI(): Promise + + // 内容按钮创建 + createContentButtons(): void + + // 纹理更新 + updateImprint(): Promise + + // 层管理 + selectLayer(layerIndex: number): void + addContentToLayer(layerIndex: number, content: any): void + updateLayerParameter(layerIndex: number, parameter: string, value: any): void + moveLayer(layerIndex: number, direction: 'up' | 'down'): void + removeLayerContent(layerIndex: number): void + + // 显示模式切换 + showContentSelection(): void + showLayerControls(): void + + // 视口更新 + updateViewportSize(): void + + // 清理 + dispose(): void +} + +// 定制事件接口 +export interface CustomizationEvent { + type: 'layer_selected' | 'content_added' | 'parameter_changed' | 'layer_moved' | 'content_removed' + layerIndex: number + data?: any +} + +// 定制回调接口 +export interface CustomizationCallbacks { + onLayerSelected?: (layerIndex: number) => void + onContentAdded?: (layerIndex: number, content: any) => void + onParameterChanged?: (layerIndex: number, parameter: string, value: any) => void + onLayerMoved?: (layerIndex: number, direction: 'up' | 'down') => void + onContentRemoved?: (layerIndex: number) => void + onTextureUpdated?: () => void +} diff --git a/src/utils/styleUtils.ts b/src/utils/styleUtils.ts new file mode 100644 index 0000000..c48fd78 --- /dev/null +++ b/src/utils/styleUtils.ts @@ -0,0 +1,50 @@ +// 通用样式工具类 +export class StyleUtils { + // 滚动条隐藏样式 + static getHiddenScrollbarStyles() { + return { + scrollbarWidth: 'none' as const, // Firefox + msOverflowStyle: 'none' as const, // IE and Edge + '&::-webkit-scrollbar': { + display: 'none' // Chrome, Safari, Opera + } + } + } + + // 响应式高度计算 + static getResponsiveHeight(baseHeight: number, breakpoints: { mobile?: number; tablet?: number } = {}) { + return { + desktop: `${baseHeight}px`, + tablet: `${breakpoints.tablet || baseHeight * 0.8}px`, + mobile: `${breakpoints.mobile || baseHeight * 0.6}px` + } + } + + // 通用卡片样式 + static getCardStyles() { + return { + elevation: 1, + hover: true, + class: 'text-center pa-3' + } + } + + // 通用按钮样式 + static getButtonStyles(variant: 'primary' | 'secondary' | 'outlined' = 'primary') { + const baseStyles = { + class: 'flex-grow-1', + prependIcon: variant === 'primary' ? 'mdi-check' : 'mdi-content-save' + } + + switch (variant) { + case 'primary': + return { ...baseStyles, color: 'primary' } + case 'secondary': + return { ...baseStyles, variant: 'outlined' } + case 'outlined': + return { ...baseStyles, variant: 'outlined', class: `${baseStyles.class} mr-2` } + default: + return baseStyles + } + } +} diff --git a/tsconfig.app.json b/tsconfig.app.json new file mode 100644 index 0000000..e14c754 --- /dev/null +++ b/tsconfig.app.json @@ -0,0 +1,14 @@ +{ + "extends": "@vue/tsconfig/tsconfig.dom.json", + "include": ["env.d.ts", "src/**/*", "src/**/*.vue"], + "exclude": ["src/**/__tests__/*"], + "compilerOptions": { + "composite": true, + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + + "baseUrl": ".", + "paths": { + "@/*": ["./src/*"] + } + } +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..5d729df --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,41 @@ +{ + "files": [], + "compilerOptions": { + "target": "esnext", + "useDefineForClassFields": true, + "module": "esnext", + "moduleResolution": "node", + "strict": true, + "jsx": "preserve", + "sourceMap": true, + "resolveJsonModule": true, + "isolatedModules": false, + "esModuleInterop": true, + "lib": [ + "esnext", + "dom" + ], + "skipLibCheck": true, + "baseUrl": "./", + "paths": { + "@/*": [ + "./src/*" + ], + "script/*": [ + "src/script/*" + ] + }, + "types": [ + "vite-plugin-glsl/ext", + "node" + ] + }, + "references": [ + { + "path": "./tsconfig.node.json" + }, + { + "path": "./tsconfig.app.json" + } + ] +} \ No newline at end of file diff --git a/tsconfig.node.json b/tsconfig.node.json new file mode 100644 index 0000000..5a0c6a5 --- /dev/null +++ b/tsconfig.node.json @@ -0,0 +1,19 @@ +{ + "extends": "@tsconfig/node22/tsconfig.json", + "include": [ + "vite.config.*", + "vitest.config.*", + "cypress.config.*", + "nightwatch.conf.*", + "playwright.config.*" + ], + "compilerOptions": { + "composite": true, + "noEmit": true, + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + + "module": "ESNext", + "moduleResolution": "Bundler", + "types": ["node"] + } +} diff --git a/vite.config.mts b/vite.config.mts new file mode 100644 index 0000000..877d5d5 --- /dev/null +++ b/vite.config.mts @@ -0,0 +1,83 @@ +// Node.js built-ins +import { fileURLToPath, resolve, URL } from 'node:url' + +// External dependencies and plugins (alphabetical order) +import Vue from '@vitejs/plugin-vue' +import Fonts from 'unplugin-fonts/vite' +import Components from 'unplugin-vue-components/vite' +import VueRouter from 'unplugin-vue-router/vite' +import { defineConfig } from 'vite' +import Vuetify, { transformAssetUrls } from 'vite-plugin-vuetify' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [ + VueRouter({ + dts: 'src/typed-router.d.ts', + }), + Vue({ + template: { transformAssetUrls }, + }), + // https://github.com/vuetifyjs/vuetify-loader/tree/master/packages/vite-plugin#readme + Vuetify({ + autoImport: true, + styles: { + configFile: 'src/styles/settings.scss', + }, + }), + Components({ + dts: 'src/components.d.ts', + }), + Fonts({ + fontsource: { + families: [ + { + name: 'Roboto', + weights: [100, 300, 400, 500, 700, 900], + styles: ['normal', 'italic'], + }, + ], + }, + }), + ], + optimizeDeps: { + exclude: [ + 'vuetify', + 'vue-router', + 'unplugin-vue-router/runtime', + 'unplugin-vue-router/data-loaders', + 'unplugin-vue-router/data-loaders/basic', + ], + }, + define: { 'process.env': {} }, + resolve: { + alias: { + '@': fileURLToPath(new URL('src', import.meta.url)), + 'components': fileURLToPath(new URL('src/components', import.meta.url)), + 'script': fileURLToPath(new URL('src/script', import.meta.url)), + 'utils': fileURLToPath(new URL('src/utils', import.meta.url)), + }, + extensions: [ + '.js', + '.json', + '.jsx', + '.mjs', + '.ts', + '.tsx', + '.vue', + ], + }, + server: { + port: 3000, + }, + css: { + preprocessorOptions: { + sass: { + api: 'modern-compiler', + }, + scss: { + api: 'modern-compiler', + }, + }, + }, +})