diff --git a/.claude/settings.local.json b/.claude/settings.local.json index d45b72b..67aefde 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -6,7 +6,20 @@ "Bash(do echo \"=== place$i import line ===\" grep -n \"useChenyunStore\\\\|saveChenyunStore\" \"/Users/zhongyidian/工作/育享/沪上又见故人来/shanghai-residences/src/pages/chenyun/place/place$i.tsx\" echo \"=== place$i 继续前进 block ===\" grep -n -A5 \"继续前进\" \"/Users/zhongyidian/工作/育享/沪上又见故人来/shanghai-residences/src/pages/chenyun/place/place$i.tsx\")", "Bash(done)", "Bash(grep -E \"\\\\.tsx$\")", - "Bash(grep -r \"navigate\" /Users/zhongyidian/工作/育享/沪上又见故人来/shanghai-residences/src/pages/chenyun/place/place*.tsx)" + "Bash(grep -r \"navigate\" /Users/zhongyidian/工作/育享/沪上又见故人来/shanghai-residences/src/pages/chenyun/place/place*.tsx)", + "Bash(bun run:*)" + ], + "deny": [ + "Read(public/**)", + "Read(src/assets/images/chenyun/**)", + "Read(src/assets/images/huangyanpei/**)", + "Read(src/assets/images/luxun/**)", + "Read(src/assets/images/maozedong/**)", + "Read(src/assets/images/sunzhongshan/**)", + "Read(src/assets/images/puzzle/**)", + "Read(src/assets/images/zhangleping/place*/**)", + "Read(src/assets/images/zhangleping/reflection/scene*/**)", + "Read(src/assets/images/zhangleping/reflection/home/**)" ] } } diff --git a/.claudeignore b/.claudeignore new file mode 100644 index 0000000..9c68c21 --- /dev/null +++ b/.claudeignore @@ -0,0 +1,13 @@ +public/ +src/assets/images/chenyun/ +src/assets/images/huangyanpei/ +src/assets/images/luxun/ +src/assets/images/maozedong/ +src/assets/images/sunzhongshan/ +src/assets/images/puzzle/ +src/assets/images/nieer/ +src/assets/images/zhangleping/place*/ +src/assets/images/zhangleping/reflection/scene*/ +src/assets/images/zhangleping/reflection/home/ +src/assets/images/zhangleping/张乐平故居底图.png +src/assets/images/zhangleping/张乐平故居效果图.png diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..3af4cca --- /dev/null +++ b/package-lock.json @@ -0,0 +1,6677 @@ +{ + "name": "shanghai-residences", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "shanghai-residences", + "version": "0.0.0", + "dependencies": { + "axios": "^1.12.2", + "clsx": "^2.1.1", + "framer-motion": "^12.23.26", + "html-to-image": "^1.11.13", + "lucide-react": "^0.545.0", + "mammoth": "^1.11.0", + "react": "^19.1.1", + "react-dom": "^19.1.1", + "react-router-dom": "^7.9.4", + "tailwind-merge": "^3.4.0", + "vconsole": "^3.15.1", + "zustand": "^5.0.8" + }, + "devDependencies": { + "@eslint/js": "^9.36.0", + "@storybook/addon-essentials": "^8.4.7", + "@storybook/addon-interactions": "^8.4.7", + "@storybook/addon-links": "^8.4.7", + "@storybook/react": "^8.4.7", + "@storybook/react-vite": "^8.4.7", + "@storybook/test": "^8.4.7", + "@tailwindcss/postcss": "^4.1.14", + "@types/node": "^24.8.0", + "@types/react": "^19.1.16", + "@types/react-dom": "^19.1.9", + "@typescript-eslint/eslint-plugin": "^8.46.1", + "@typescript-eslint/parser": "^8.46.1", + "@vitejs/plugin-react": "^5.0.4", + "autoprefixer": "^10.4.21", + "baseline-browser-mapping": "^2.9.6", + "eslint": "^9.36.0", + "eslint-config-prettier": "^10.1.8", + "eslint-plugin-prettier": "^5.5.5", + "eslint-plugin-react-hooks": "^5.2.0", + "eslint-plugin-react-refresh": "^0.4.22", + "globals": "^16.4.0", + "postcss": "^8.5.6", + "prettier": "^3.8.1", + "storybook": "^8.4.7", + "tailwindcss": "^4.1.14", + "typescript": "^5.9.3", + "typescript-eslint": "^8.46.1", + "vite": "^7.1.7" + }, + "engines": { + "bun": ">=1.0.0" + } + }, + "node_modules/@adobe/css-tools": { + "version": "4.4.4", + "dev": true, + "license": "MIT" + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.27.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.28.6", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.28.6", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.3", + "resolved": "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", + "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.3", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.27.3.tgz", + "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz", + "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.27.3.tgz", + "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz", + "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.3", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", + "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", + "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.3", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz", + "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz", + "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.3", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz", + "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.3", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz", + "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.3", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz", + "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.3", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz", + "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.3", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", + "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.3", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", + "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", + "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz", + "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz", + "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz", + "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz", + "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmmirror.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz", + "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz", + "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.3", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz", + "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.3", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz", + "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.27.3", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz", + "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.1", + "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.2", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.1", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.7", + "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.4.2", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.17.0", + "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.4", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.14.0", + "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.1", + "minimatch": "^3.1.3", + "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/eslintrc/node_modules/ignore": { + "version": "5.3.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@eslint/js": { + "version": "9.39.3", + "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.7", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.4.1", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "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.7", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "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/@isaacs/cliui": { + "version": "8.0.2", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@joshwooding/vite-plugin-react-docgen-typescript": { + "version": "0.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "glob": "^10.0.0", + "magic-string": "^0.27.0", + "react-docgen-typescript": "^2.2.2" + }, + "peerDependencies": { + "typescript": ">= 4.3.x", + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@joshwooding/vite-plugin-react-docgen-typescript/node_modules/magic-string": { + "version": "0.27.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.13" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@mdx-js/react": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdx": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@types/react": ">=16", + "react": ">=16" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "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/@rolldown/pluginutils": { + "version": "1.0.0-rc.3", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/pluginutils": { + "version": "5.3.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.59.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz", + "integrity": "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz", + "integrity": "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz", + "integrity": "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.59.0", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz", + "integrity": "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz", + "integrity": "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.59.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz", + "integrity": "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.59.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz", + "integrity": "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz", + "integrity": "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz", + "integrity": "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz", + "integrity": "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz", + "integrity": "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz", + "integrity": "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz", + "integrity": "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz", + "integrity": "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz", + "integrity": "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz", + "integrity": "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz", + "integrity": "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz", + "integrity": "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz", + "integrity": "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz", + "integrity": "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz", + "integrity": "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz", + "integrity": "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz", + "integrity": "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz", + "integrity": "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@storybook/addon-actions": { + "version": "8.6.14", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/global": "^5.0.0", + "@types/uuid": "^9.0.1", + "dequal": "^2.0.2", + "polished": "^4.2.2", + "uuid": "^9.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.6.14" + } + }, + "node_modules/@storybook/addon-backgrounds": { + "version": "8.6.14", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/global": "^5.0.0", + "memoizerific": "^1.11.3", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.6.14" + } + }, + "node_modules/@storybook/addon-controls": { + "version": "8.6.14", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/global": "^5.0.0", + "dequal": "^2.0.2", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.6.14" + } + }, + "node_modules/@storybook/addon-docs": { + "version": "8.6.14", + "dev": true, + "license": "MIT", + "dependencies": { + "@mdx-js/react": "^3.0.0", + "@storybook/blocks": "8.6.14", + "@storybook/csf-plugin": "8.6.14", + "@storybook/react-dom-shim": "8.6.14", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.6.14" + } + }, + "node_modules/@storybook/addon-docs/node_modules/@storybook/react-dom-shim": { + "version": "8.6.14", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", + "storybook": "^8.6.14" + } + }, + "node_modules/@storybook/addon-essentials": { + "version": "8.6.14", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/addon-actions": "8.6.14", + "@storybook/addon-backgrounds": "8.6.14", + "@storybook/addon-controls": "8.6.14", + "@storybook/addon-docs": "8.6.14", + "@storybook/addon-highlight": "8.6.14", + "@storybook/addon-measure": "8.6.14", + "@storybook/addon-outline": "8.6.14", + "@storybook/addon-toolbars": "8.6.14", + "@storybook/addon-viewport": "8.6.14", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.6.14" + } + }, + "node_modules/@storybook/addon-highlight": { + "version": "8.6.14", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/global": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.6.14" + } + }, + "node_modules/@storybook/addon-interactions": { + "version": "8.6.14", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/global": "^5.0.0", + "@storybook/instrumenter": "8.6.14", + "@storybook/test": "8.6.14", + "polished": "^4.2.2", + "ts-dedent": "^2.2.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.6.14" + } + }, + "node_modules/@storybook/addon-interactions/node_modules/@storybook/test": { + "version": "8.6.14", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/global": "^5.0.0", + "@storybook/instrumenter": "8.6.14", + "@testing-library/dom": "10.4.0", + "@testing-library/jest-dom": "6.5.0", + "@testing-library/user-event": "14.5.2", + "@vitest/expect": "2.0.5", + "@vitest/spy": "2.0.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.6.14" + } + }, + "node_modules/@storybook/addon-links": { + "version": "8.6.17", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/global": "^5.0.0", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", + "storybook": "^8.6.17" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + } + } + }, + "node_modules/@storybook/addon-measure": { + "version": "8.6.14", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/global": "^5.0.0", + "tiny-invariant": "^1.3.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.6.14" + } + }, + "node_modules/@storybook/addon-outline": { + "version": "8.6.14", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/global": "^5.0.0", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.6.14" + } + }, + "node_modules/@storybook/addon-toolbars": { + "version": "8.6.14", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.6.14" + } + }, + "node_modules/@storybook/addon-viewport": { + "version": "8.6.14", + "dev": true, + "license": "MIT", + "dependencies": { + "memoizerific": "^1.11.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.6.14" + } + }, + "node_modules/@storybook/blocks": { + "version": "8.6.14", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/icons": "^1.2.12", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "storybook": "^8.6.14" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/@storybook/builder-vite": { + "version": "8.6.17", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/csf-plugin": "8.6.17", + "browser-assert": "^1.2.1", + "ts-dedent": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.6.17", + "vite": "^4.0.0 || ^5.0.0 || ^6.0.0" + } + }, + "node_modules/@storybook/builder-vite/node_modules/@storybook/csf-plugin": { + "version": "8.6.17", + "dev": true, + "license": "MIT", + "dependencies": { + "unplugin": "^1.3.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.6.17" + } + }, + "node_modules/@storybook/components": { + "version": "8.6.17", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0" + } + }, + "node_modules/@storybook/core": { + "version": "8.6.17", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/theming": "8.6.17", + "better-opn": "^3.0.2", + "browser-assert": "^1.2.1", + "esbuild": "^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0", + "esbuild-register": "^3.5.0", + "jsdoc-type-pratt-parser": "^4.0.0", + "process": "^0.11.10", + "recast": "^0.23.5", + "semver": "^7.6.2", + "util": "^0.12.5", + "ws": "^8.2.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "prettier": "^2 || ^3" + }, + "peerDependenciesMeta": { + "prettier": { + "optional": true + } + } + }, + "node_modules/@storybook/core/node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@storybook/core/node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@storybook/core/node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@storybook/core/node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@storybook/core/node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@storybook/core/node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@storybook/core/node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@storybook/core/node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@storybook/core/node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@storybook/core/node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@storybook/core/node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@storybook/core/node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@storybook/core/node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@storybook/core/node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@storybook/core/node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@storybook/core/node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@storybook/core/node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@storybook/core/node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@storybook/core/node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@storybook/core/node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@storybook/core/node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@storybook/core/node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@storybook/core/node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@storybook/core/node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@storybook/core/node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@storybook/core/node_modules/esbuild": { + "version": "0.25.12", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, + "node_modules/@storybook/core/node_modules/esbuild/node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@storybook/csf-plugin": { + "version": "8.6.14", + "dev": true, + "license": "MIT", + "dependencies": { + "unplugin": "^1.3.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.6.14" + } + }, + "node_modules/@storybook/global": { + "version": "5.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/@storybook/icons": { + "version": "1.6.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta" + } + }, + "node_modules/@storybook/instrumenter": { + "version": "8.6.14", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/global": "^5.0.0", + "@vitest/utils": "^2.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.6.14" + } + }, + "node_modules/@storybook/manager-api": { + "version": "8.6.17", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0" + } + }, + "node_modules/@storybook/preview-api": { + "version": "8.6.17", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0" + } + }, + "node_modules/@storybook/react": { + "version": "8.6.17", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/components": "8.6.17", + "@storybook/global": "^5.0.0", + "@storybook/manager-api": "8.6.17", + "@storybook/preview-api": "8.6.17", + "@storybook/react-dom-shim": "8.6.17", + "@storybook/theming": "8.6.17" + }, + "engines": { + "node": ">=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "@storybook/test": "8.6.17", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", + "storybook": "^8.6.17", + "typescript": ">= 4.2.x" + }, + "peerDependenciesMeta": { + "@storybook/test": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/@storybook/react-dom-shim": { + "version": "8.6.17", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", + "storybook": "^8.6.17" + } + }, + "node_modules/@storybook/react-vite": { + "version": "8.6.17", + "dev": true, + "license": "MIT", + "dependencies": { + "@joshwooding/vite-plugin-react-docgen-typescript": "0.5.0", + "@rollup/pluginutils": "^5.0.2", + "@storybook/builder-vite": "8.6.17", + "@storybook/react": "8.6.17", + "find-up": "^5.0.0", + "magic-string": "^0.30.0", + "react-docgen": "^7.0.0", + "resolve": "^1.22.8", + "tsconfig-paths": "^4.2.0" + }, + "engines": { + "node": ">=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "@storybook/test": "8.6.17", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", + "storybook": "^8.6.17", + "vite": "^4.0.0 || ^5.0.0 || ^6.0.0" + }, + "peerDependenciesMeta": { + "@storybook/test": { + "optional": true + } + } + }, + "node_modules/@storybook/test": { + "version": "8.6.15", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/global": "^5.0.0", + "@storybook/instrumenter": "8.6.15", + "@testing-library/dom": "10.4.0", + "@testing-library/jest-dom": "6.5.0", + "@testing-library/user-event": "14.5.2", + "@vitest/expect": "2.0.5", + "@vitest/spy": "2.0.5" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.6.15" + } + }, + "node_modules/@storybook/test/node_modules/@storybook/instrumenter": { + "version": "8.6.15", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/global": "^5.0.0", + "@vitest/utils": "^2.1.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.6.15" + } + }, + "node_modules/@storybook/theming": { + "version": "8.6.17", + "dev": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0" + } + }, + "node_modules/@tailwindcss/node": { + "version": "4.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "enhanced-resolve": "^5.19.0", + "jiti": "^2.6.1", + "lightningcss": "1.31.1", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.2.1" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.2.1", + "@tailwindcss/oxide-darwin-arm64": "4.2.1", + "@tailwindcss/oxide-darwin-x64": "4.2.1", + "@tailwindcss/oxide-freebsd-x64": "4.2.1", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.2.1", + "@tailwindcss/oxide-linux-arm64-gnu": "4.2.1", + "@tailwindcss/oxide-linux-arm64-musl": "4.2.1", + "@tailwindcss/oxide-linux-x64-gnu": "4.2.1", + "@tailwindcss/oxide-linux-x64-musl": "4.2.1", + "@tailwindcss/oxide-wasm32-wasi": "4.2.1", + "@tailwindcss/oxide-win32-arm64-msvc": "4.2.1", + "@tailwindcss/oxide-win32-x64-msvc": "4.2.1" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.2.1", + "resolved": "https://registry.npmmirror.com/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.2.1.tgz", + "integrity": "sha512-eZ7G1Zm5EC8OOKaesIKuw77jw++QJ2lL9N+dDpdQiAB/c/B2wDh0QPFHbkBVrXnwNugvrbJFk1gK2SsVjwWReg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.2.1", + "resolved": "https://registry.npmmirror.com/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.2.1.tgz", + "integrity": "sha512-q/LHkOstoJ7pI1J0q6djesLzRvQSIfEto148ppAd+BVQK0JYjQIFSK3JgYZJa+Yzi0DDa52ZsQx2rqytBnf8Hw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.2.1", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.2.1", + "resolved": "https://registry.npmmirror.com/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.2.1.tgz", + "integrity": "sha512-5e/AkgYJT/cpbkys/OU2Ei2jdETCLlifwm7ogMC7/hksI2fC3iiq6OcXwjibcIjPung0kRtR3TxEITkqgn0TcA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.2.1", + "resolved": "https://registry.npmmirror.com/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.2.1.tgz", + "integrity": "sha512-Uny1EcVTTmerCKt/1ZuKTkb0x8ZaiuYucg2/kImO5A5Y/kBz41/+j0gxUZl+hTF3xkWpDmHX+TaWhOtba2Fyuw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.2.1", + "resolved": "https://registry.npmmirror.com/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.2.1.tgz", + "integrity": "sha512-CTrwomI+c7n6aSSQlsPL0roRiNMDQ/YzMD9EjcR+H4f0I1SQ8QqIuPnsVp7QgMkC1Qi8rtkekLkOFjo7OlEFRQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.2.1", + "resolved": "https://registry.npmmirror.com/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.2.1.tgz", + "integrity": "sha512-WZA0CHRL/SP1TRbA5mp9htsppSEkWuQ4KsSUumYQnyl8ZdT39ntwqmz4IUHGN6p4XdSlYfJwM4rRzZLShHsGAQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.2.1", + "resolved": "https://registry.npmmirror.com/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.2.1.tgz", + "integrity": "sha512-qMFzxI2YlBOLW5PhblzuSWlWfwLHaneBE0xHzLrBgNtqN6mWfs+qYbhryGSXQjFYB1Dzf5w+LN5qbUTPhW7Y5g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.2.1", + "resolved": "https://registry.npmmirror.com/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.2.1.tgz", + "integrity": "sha512-5r1X2FKnCMUPlXTWRYpHdPYUY6a1Ar/t7P24OuiEdEOmms5lyqjDRvVY1yy9Rmioh+AunQ0rWiOTPE8F9A3v5g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.2.1", + "resolved": "https://registry.npmmirror.com/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.2.1.tgz", + "integrity": "sha512-MGFB5cVPvshR85MTJkEvqDUnuNoysrsRxd6vnk1Lf2tbiqNlXpHYZqkqOQalydienEWOHHFyyuTSYRsLfxFJ2Q==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.8.1", + "@emnapi/runtime": "^1.8.1", + "@emnapi/wasi-threads": "^1.1.0", + "@napi-rs/wasm-runtime": "^1.1.1", + "@tybys/wasm-util": "^0.10.1", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.2.1", + "resolved": "https://registry.npmmirror.com/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.2.1.tgz", + "integrity": "sha512-YlUEHRHBGnCMh4Nj4GnqQyBtsshUPdiNroZj8VPkvTZSoHsilRCwXcVKnG9kyi0ZFAS/3u+qKHBdDc81SADTRA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.2.1", + "resolved": "https://registry.npmmirror.com/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.2.1.tgz", + "integrity": "sha512-rbO34G5sMWWyrN/idLeVxAZgAKWrn5LiR3/I90Q9MkA67s6T1oB0xtTe+0heoBvHSpbU9Mk7i6uwJnpo4u21XQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/postcss": { + "version": "4.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "@tailwindcss/node": "4.2.1", + "@tailwindcss/oxide": "4.2.1", + "postcss": "^8.5.6", + "tailwindcss": "4.2.1" + } + }, + "node_modules/@testing-library/dom": { + "version": "10.4.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.3.0", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@testing-library/jest-dom": { + "version": "6.5.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@adobe/css-tools": "^4.4.0", + "aria-query": "^5.0.0", + "chalk": "^3.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.6.3", + "lodash": "^4.17.21", + "redent": "^3.0.0" + }, + "engines": { + "node": ">=14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/@testing-library/jest-dom/node_modules/chalk": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": { + "version": "0.6.3", + "dev": true, + "license": "MIT" + }, + "node_modules/@testing-library/user-event": { + "version": "14.5.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "peerDependencies": { + "@testing-library/dom": ">=7.21.4" + } + }, + "node_modules/@types/aria-query": { + "version": "5.0.4", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/doctrine": { + "version": "0.0.9", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mdx": { + "version": "2.0.13", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "24.10.14", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@types/react": { + "version": "19.2.14", + "dev": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.3", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, + "node_modules/@types/resolve": { + "version": "1.20.6", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/uuid": { + "version": "9.0.8", + "dev": true, + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.56.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.56.1", + "@typescript-eslint/type-utils": "8.56.1", + "@typescript-eslint/utils": "8.56.1", + "@typescript-eslint/visitor-keys": "8.56.1", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.4.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.56.1", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.56.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.56.1", + "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/typescript-estree": "8.56.1", + "@typescript-eslint/visitor-keys": "8.56.1", + "debug": "^4.4.3" + }, + "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 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.56.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.56.1", + "@typescript-eslint/types": "^8.56.1", + "debug": "^4.4.3" + }, + "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.56.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/visitor-keys": "8.56.1" + }, + "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.56.1", + "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.56.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/typescript-estree": "8.56.1", + "@typescript-eslint/utils": "8.56.1", + "debug": "^4.4.3", + "ts-api-utils": "^2.4.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 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.56.1", + "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.56.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.56.1", + "@typescript-eslint/tsconfig-utils": "8.56.1", + "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/visitor-keys": "8.56.1", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.4.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": "10.2.4", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch/node_modules/brace-expansion": { + "version": "5.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match": { + "version": "4.0.4", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.56.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.56.1", + "@typescript-eslint/types": "8.56.1", + "@typescript-eslint/typescript-estree": "8.56.1" + }, + "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 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.56.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.56.1", + "eslint-visitor-keys": "^5.0.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/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "5.0.1", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "5.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.29.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-rc.3", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.18.0" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/@vitest/expect": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "2.0.5", + "@vitest/utils": "2.0.5", + "chai": "^5.1.1", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/expect/node_modules/@vitest/utils": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "2.0.5", + "estree-walker": "^3.0.3", + "loupe": "^3.1.1", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/expect/node_modules/@vitest/utils/node_modules/@vitest/pretty-format": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/expect/node_modules/@vitest/utils/node_modules/estree-walker": { + "version": "3.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/@vitest/pretty-format": { + "version": "2.1.9", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "2.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyspy": "^3.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "2.1.9", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "2.1.9", + "loupe": "^3.1.2", + "tinyrainbow": "^1.2.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@xmldom/xmldom": { + "version": "0.8.11", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/acorn": { + "version": "8.16.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.14.0", + "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/ansi-regex": { + "version": "5.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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/argparse": { + "version": "1.0.10", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/aria-query": { + "version": "5.3.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/assertion-error": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/ast-types": { + "version": "0.16.1", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "license": "MIT" + }, + "node_modules/autoprefixer": { + "version": "10.4.27", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.28.1", + "caniuse-lite": "^1.0.30001774", + "fraction.js": "^5.3.4", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axios": { + "version": "1.13.5", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.11", + "form-data": "^4.0.5", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "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/baseline-browser-mapping": { + "version": "2.10.0", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/better-opn": { + "version": "3.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "open": "^8.0.4" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/bluebird": { + "version": "3.4.7", + "license": "MIT" + }, + "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/browser-assert": { + "version": "1.2.1", + "dev": true + }, + "node_modules/browserslist": { + "version": "4.28.1", + "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": { + "baseline-browser-mapping": "^2.9.0", + "caniuse-lite": "^1.0.30001759", + "electron-to-chromium": "^1.5.263", + "node-releases": "^2.0.27", + "update-browserslist-db": "^1.2.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001774", + "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/chai": { + "version": "5.3.3", + "dev": true, + "license": "MIT", + "dependencies": { + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "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/check-error": { + "version": "2.1.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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/combined-stream": { + "version": "1.0.8", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "dev": true, + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "1.1.1", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/copy-text-to-clipboard": { + "version": "3.2.2", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/core-js": { + "version": "3.48.0", + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "license": "MIT" + }, + "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/css.escape": { + "version": "1.5.1", + "dev": true, + "license": "MIT" + }, + "node_modules/csstype": { + "version": "3.2.3", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-eql": { + "version": "5.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/dingbat-to-unicode": { + "version": "1.0.1", + "license": "BSD-2-Clause" + }, + "node_modules/doctrine": { + "version": "3.0.0", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-accessibility-api": { + "version": "0.5.16", + "dev": true, + "license": "MIT" + }, + "node_modules/duck": { + "version": "0.1.12", + "license": "BSD", + "dependencies": { + "underscore": "^1.13.1" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.302", + "dev": true, + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "dev": true, + "license": "MIT" + }, + "node_modules/enhanced-resolve": { + "version": "5.19.0", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.27.3", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.3", + "@esbuild/android-arm": "0.27.3", + "@esbuild/android-arm64": "0.27.3", + "@esbuild/android-x64": "0.27.3", + "@esbuild/darwin-arm64": "0.27.3", + "@esbuild/darwin-x64": "0.27.3", + "@esbuild/freebsd-arm64": "0.27.3", + "@esbuild/freebsd-x64": "0.27.3", + "@esbuild/linux-arm": "0.27.3", + "@esbuild/linux-arm64": "0.27.3", + "@esbuild/linux-ia32": "0.27.3", + "@esbuild/linux-loong64": "0.27.3", + "@esbuild/linux-mips64el": "0.27.3", + "@esbuild/linux-ppc64": "0.27.3", + "@esbuild/linux-riscv64": "0.27.3", + "@esbuild/linux-s390x": "0.27.3", + "@esbuild/linux-x64": "0.27.3", + "@esbuild/netbsd-arm64": "0.27.3", + "@esbuild/netbsd-x64": "0.27.3", + "@esbuild/openbsd-arm64": "0.27.3", + "@esbuild/openbsd-x64": "0.27.3", + "@esbuild/openharmony-arm64": "0.27.3", + "@esbuild/sunos-x64": "0.27.3", + "@esbuild/win32-arm64": "0.27.3", + "@esbuild/win32-ia32": "0.27.3", + "@esbuild/win32-x64": "0.27.3" + } + }, + "node_modules/esbuild-register": { + "version": "3.6.0", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.3.4" + }, + "peerDependencies": { + "esbuild": ">=0.12 <1" + } + }, + "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.39.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.1", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.39.3", + "@eslint/plugin-kit": "^0.4.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "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-config-prettier": { + "version": "10.1.8", + "dev": true, + "license": "MIT", + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "funding": { + "url": "https://opencollective.com/eslint-config-prettier" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "5.5.5", + "dev": true, + "license": "MIT", + "dependencies": { + "prettier-linter-helpers": "^1.0.1", + "synckit": "^0.11.12" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-plugin-prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "eslint-config-prettier": ">= 7.0.0 <10.0.0 || >=10.1.0", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.4.26", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": ">=8.40" + } + }, + "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-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/eslint/node_modules/ignore": { + "version": "5.3.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "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/esprima": { + "version": "4.0.1", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.7.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", + "dev": true, + "license": "MIT" + }, + "node_modules/esutils": { + "version": "2.0.3", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-diff": { + "version": "1.3.0", + "dev": true, + "license": "Apache-2.0" + }, + "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/fdir": { + "version": "6.5.0", + "dev": 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/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/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/follow-redirects": { + "version": "1.15.11", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.5", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/form-data": { + "version": "4.0.5", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fraction.js": { + "version": "5.3.4", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/framer-motion": { + "version": "12.34.3", + "license": "MIT", + "dependencies": { + "motion-dom": "^12.34.3", + "motion-utils": "^12.29.2", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "@emotion/is-prop-valid": "*", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/is-prop-valid": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generator-function": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/glob": { + "version": "10.5.0", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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/glob/node_modules/minimatch": { + "version": "9.0.8", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^5.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob/node_modules/minimatch/node_modules/brace-expansion": { + "version": "5.0.3", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/glob/node_modules/minimatch/node_modules/brace-expansion/node_modules/balanced-match": { + "version": "4.0.4", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/globals": { + "version": "16.5.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "dev": true, + "license": "ISC" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/html-to-image": { + "version": "1.11.13", + "resolved": "https://registry.npmmirror.com/html-to-image/-/html-to-image-1.11.13.tgz", + "integrity": "sha512-cuOPoI7WApyhBElTTb9oqsawRvZ0rHhaHwghRLlTuffoD1B2aDemlCruLeZrUIIdvG7gs9xeELEPm6PhuASqrg==", + "license": "MIT" + }, + "node_modules/ignore": { + "version": "7.0.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/immediate": { + "version": "3.0.6", + "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": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "license": "ISC" + }, + "node_modules/is-arguments": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "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-fullwidth-code-point": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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-regex": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jiti": { + "version": "2.6.1", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/js-yaml/node_modules/argparse": { + "version": "2.0.1", + "dev": true, + "license": "Python-2.0" + }, + "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-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/jszip": { + "version": "3.10.1", + "license": "(MIT OR GPL-3.0-or-later)", + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "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/lie": { + "version": "3.3.0", + "license": "MIT", + "dependencies": { + "immediate": "~3.0.5" + } + }, + "node_modules/lightningcss": { + "version": "1.31.1", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.31.1", + "lightningcss-darwin-arm64": "1.31.1", + "lightningcss-darwin-x64": "1.31.1", + "lightningcss-freebsd-x64": "1.31.1", + "lightningcss-linux-arm-gnueabihf": "1.31.1", + "lightningcss-linux-arm64-gnu": "1.31.1", + "lightningcss-linux-arm64-musl": "1.31.1", + "lightningcss-linux-x64-gnu": "1.31.1", + "lightningcss-linux-x64-musl": "1.31.1", + "lightningcss-win32-arm64-msvc": "1.31.1", + "lightningcss-win32-x64-msvc": "1.31.1" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.31.1", + "resolved": "https://registry.npmmirror.com/lightningcss-android-arm64/-/lightningcss-android-arm64-1.31.1.tgz", + "integrity": "sha512-HXJF3x8w9nQ4jbXRiNppBCqeZPIAfUo8zE/kOEGbW5NZvGc/K7nMxbhIr+YlFlHW5mpbg/YFPdbnCh1wAXCKFg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.31.1", + "resolved": "https://registry.npmmirror.com/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.31.1.tgz", + "integrity": "sha512-02uTEqf3vIfNMq3h/z2cJfcOXnQ0GRwQrkmPafhueLb2h7mqEidiCzkE4gBMEH65abHRiQvhdcQ+aP0D0g67sg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.31.1", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.31.1", + "resolved": "https://registry.npmmirror.com/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.31.1.tgz", + "integrity": "sha512-1RINmQKAItO6ISxYgPwszQE1BrsVU5aB45ho6O42mu96UiZBxEXsuQ7cJW4zs4CEodPUioj/QrXW1r9pLUM74A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.31.1", + "resolved": "https://registry.npmmirror.com/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.31.1.tgz", + "integrity": "sha512-OOCm2//MZJ87CdDK62rZIu+aw9gBv4azMJuA8/KB74wmfS3lnC4yoPHm0uXZ/dvNNHmnZnB8XLAZzObeG0nS1g==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.31.1", + "resolved": "https://registry.npmmirror.com/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.31.1.tgz", + "integrity": "sha512-WKyLWztD71rTnou4xAD5kQT+982wvca7E6QoLpoawZ1gP9JM0GJj4Tp5jMUh9B3AitHbRZ2/H3W5xQmdEOUlLg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.31.1", + "resolved": "https://registry.npmmirror.com/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.31.1.tgz", + "integrity": "sha512-mVZ7Pg2zIbe3XlNbZJdjs86YViQFoJSpc41CbVmKBPiGmC4YrfeOyz65ms2qpAobVd7WQsbW4PdsSJEMymyIMg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.31.1", + "resolved": "https://registry.npmmirror.com/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.31.1.tgz", + "integrity": "sha512-xGlFWRMl+0KvUhgySdIaReQdB4FNudfUTARn7q0hh/V67PVGCs3ADFjw+6++kG1RNd0zdGRlEKa+T13/tQjPMA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.31.1", + "resolved": "https://registry.npmmirror.com/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.31.1.tgz", + "integrity": "sha512-eowF8PrKHw9LpoZii5tdZwnBcYDxRw2rRCyvAXLi34iyeYfqCQNA9rmUM0ce62NlPhCvof1+9ivRaTY6pSKDaA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.31.1", + "resolved": "https://registry.npmmirror.com/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.31.1.tgz", + "integrity": "sha512-aJReEbSEQzx1uBlQizAOBSjcmr9dCdL3XuC/6HLXAxmtErsj2ICo5yYggg1qOODQMtnjNQv2UHb9NpOuFtYe4w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.31.1", + "resolved": "https://registry.npmmirror.com/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.31.1.tgz", + "integrity": "sha512-I9aiFrbd7oYHwlnQDqr1Roz+fTz61oDDJX7n9tYF9FJymH1cIN1DtKw3iYt6b8WZgEjoNwVSncwF4wx/ZedMhw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "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.23", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "dev": true, + "license": "MIT" + }, + "node_modules/lop": { + "version": "0.4.2", + "license": "BSD-2-Clause", + "dependencies": { + "duck": "^0.1.12", + "option": "~0.2.1", + "underscore": "^1.13.1" + } + }, + "node_modules/loupe": { + "version": "3.2.1", + "dev": true, + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lucide-react": { + "version": "0.545.0", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/lz-string": { + "version": "1.5.0", + "dev": true, + "license": "MIT", + "bin": { + "lz-string": "bin/bin.js" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/mammoth": { + "version": "1.11.0", + "license": "BSD-2-Clause", + "dependencies": { + "@xmldom/xmldom": "^0.8.6", + "argparse": "~1.0.3", + "base64-js": "^1.5.1", + "bluebird": "~3.4.0", + "dingbat-to-unicode": "^1.0.1", + "jszip": "^3.7.1", + "lop": "^0.4.2", + "path-is-absolute": "^1.0.0", + "underscore": "^1.13.1", + "xmlbuilder": "^10.0.0" + }, + "bin": { + "mammoth": "bin/mammoth" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/map-or-similar": { + "version": "1.5.0", + "dev": true, + "license": "MIT" + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/memoizerific": { + "version": "1.11.3", + "dev": true, + "license": "MIT", + "dependencies": { + "map-or-similar": "^1.5.0" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "3.1.5", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.1.3", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/motion-dom": { + "version": "12.34.3", + "license": "MIT", + "dependencies": { + "motion-utils": "^12.29.2" + } + }, + "node_modules/motion-utils": { + "version": "12.29.2", + "license": "MIT" + }, + "node_modules/ms": { + "version": "2.1.3", + "dev": true, + "license": "MIT" + }, + "node_modules/mutation-observer": { + "version": "1.0.3" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "dev": true, + "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/natural-compare": { + "version": "1.4.0", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.27", + "dev": true, + "license": "MIT" + }, + "node_modules/open": { + "version": "8.4.2", + "dev": true, + "license": "MIT", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/option": { + "version": "0.2.4", + "license": "BSD-2-Clause" + }, + "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-json-from-dist": { + "version": "1.0.1", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/pako": { + "version": "1.0.11", + "license": "(MIT AND Zlib)" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "dev": true, + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "dev": true, + "license": "ISC" + }, + "node_modules/pathval": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.16" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/polished": { + "version": "4.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.17.8" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "dev": true, + "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-value-parser": { + "version": "4.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.8.1", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/pretty-format": { + "version": "27.5.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/process": { + "version": "0.11.10", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "license": "MIT" + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "license": "MIT" + }, + "node_modules/punycode": { + "version": "2.3.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/react": { + "version": "19.2.4", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-docgen": { + "version": "7.1.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.18.9", + "@babel/traverse": "^7.18.9", + "@babel/types": "^7.18.9", + "@types/babel__core": "^7.18.0", + "@types/babel__traverse": "^7.18.0", + "@types/doctrine": "^0.0.9", + "@types/resolve": "^1.20.2", + "doctrine": "^3.0.0", + "resolve": "^1.22.1", + "strip-indent": "^4.0.0" + }, + "engines": { + "node": ">=16.14.0" + } + }, + "node_modules/react-docgen-typescript": { + "version": "2.4.0", + "dev": true, + "license": "MIT", + "peerDependencies": { + "typescript": ">= 4.3.x" + } + }, + "node_modules/react-dom": { + "version": "19.2.4", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.4" + } + }, + "node_modules/react-is": { + "version": "17.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/react-refresh": { + "version": "0.18.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-router": { + "version": "7.13.1", + "license": "MIT", + "dependencies": { + "cookie": "^1.0.1", + "set-cookie-parser": "^2.6.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/react-router-dom": { + "version": "7.13.1", + "license": "MIT", + "dependencies": { + "react-router": "7.13.1" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/recast": { + "version": "0.23.11", + "dev": true, + "license": "MIT", + "dependencies": { + "ast-types": "^0.16.1", + "esprima": "~4.0.0", + "source-map": "~0.6.1", + "tiny-invariant": "^1.3.3", + "tslib": "^2.0.1" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/redent": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/redent/node_modules/strip-indent": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve": { + "version": "1.22.11", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/rollup": { + "version": "4.59.0", + "dev": 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.59.0", + "@rollup/rollup-android-arm64": "4.59.0", + "@rollup/rollup-darwin-arm64": "4.59.0", + "@rollup/rollup-darwin-x64": "4.59.0", + "@rollup/rollup-freebsd-arm64": "4.59.0", + "@rollup/rollup-freebsd-x64": "4.59.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.59.0", + "@rollup/rollup-linux-arm-musleabihf": "4.59.0", + "@rollup/rollup-linux-arm64-gnu": "4.59.0", + "@rollup/rollup-linux-arm64-musl": "4.59.0", + "@rollup/rollup-linux-loong64-gnu": "4.59.0", + "@rollup/rollup-linux-loong64-musl": "4.59.0", + "@rollup/rollup-linux-ppc64-gnu": "4.59.0", + "@rollup/rollup-linux-ppc64-musl": "4.59.0", + "@rollup/rollup-linux-riscv64-gnu": "4.59.0", + "@rollup/rollup-linux-riscv64-musl": "4.59.0", + "@rollup/rollup-linux-s390x-gnu": "4.59.0", + "@rollup/rollup-linux-x64-gnu": "4.59.0", + "@rollup/rollup-linux-x64-musl": "4.59.0", + "@rollup/rollup-openbsd-x64": "4.59.0", + "@rollup/rollup-openharmony-arm64": "4.59.0", + "@rollup/rollup-win32-arm64-msvc": "4.59.0", + "@rollup/rollup-win32-ia32-msvc": "4.59.0", + "@rollup/rollup-win32-x64-gnu": "4.59.0", + "@rollup/rollup-win32-x64-msvc": "4.59.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "license": "MIT" + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/scheduler": { + "version": "0.27.0", + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.7.4", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/set-cookie-parser": { + "version": "2.7.2", + "license": "MIT" + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setimmediate": { + "version": "1.0.5", + "license": "MIT" + }, + "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/signal-exit": { + "version": "4.1.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "license": "BSD-3-Clause" + }, + "node_modules/storybook": { + "version": "8.6.17", + "dev": true, + "license": "MIT", + "dependencies": { + "@storybook/core": "8.6.17" + }, + "bin": { + "getstorybook": "bin/index.cjs", + "sb": "bin/index.cjs", + "storybook": "bin/index.cjs" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "prettier": "^2 || ^3" + }, + "peerDependenciesMeta": { + "prettier": { + "optional": true + } + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.2", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi/node_modules/ansi-regex": { + "version": "6.2.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-indent": { + "version": "4.1.1", + "dev": true, + "license": "MIT", + "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/supports-color": { + "version": "7.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/synckit": { + "version": "0.11.12", + "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/tailwind-merge": { + "version": "3.5.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, + "node_modules/tailwindcss": { + "version": "4.2.1", + "dev": true, + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tiny-invariant": { + "version": "1.3.3", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyrainbow": { + "version": "1.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "3.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/ts-api-utils": { + "version": "2.4.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/ts-dedent": { + "version": "2.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.10" + } + }, + "node_modules/tsconfig-paths": { + "version": "4.2.0", + "dev": true, + "license": "MIT", + "dependencies": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "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.9.3", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.56.1", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.56.1", + "@typescript-eslint/parser": "8.56.1", + "@typescript-eslint/typescript-estree": "8.56.1", + "@typescript-eslint/utils": "8.56.1" + }, + "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 || ^10.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/underscore": { + "version": "1.13.8", + "license": "MIT" + }, + "node_modules/undici-types": { + "version": "7.16.0", + "dev": true, + "license": "MIT" + }, + "node_modules/unplugin": { + "version": "1.16.1", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.14.0", + "webpack-virtual-modules": "^0.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.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": { + "version": "0.12.5", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/uuid": { + "version": "9.0.1", + "dev": true, + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/vconsole": { + "version": "3.15.1", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.17.2", + "copy-text-to-clipboard": "^3.0.1", + "core-js": "^3.11.0", + "mutation-observer": "^1.0.3" + } + }, + "node_modules/vite": { + "version": "7.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.27.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "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/webpack-virtual-modules": { + "version": "0.6.2", + "dev": true, + "license": "MIT" + }, + "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/which-typed-array": { + "version": "1.1.20", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width/node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ws": { + "version": "8.19.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xmlbuilder": { + "version": "10.1.1", + "license": "MIT", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "dev": true, + "license": "ISC" + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zustand": { + "version": "5.0.11", + "license": "MIT", + "engines": { + "node": ">=12.20.0" + }, + "peerDependencies": { + "@types/react": ">=18.0.0", + "immer": ">=9.0.6", + "react": ">=18.0.0", + "use-sync-external-store": ">=1.2.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "immer": { + "optional": true + }, + "react": { + "optional": true + }, + "use-sync-external-store": { + "optional": true + } + } + } + } +} diff --git a/package.json b/package.json index edfafe0..398b7e3 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,7 @@ "axios": "^1.12.2", "clsx": "^2.1.1", "framer-motion": "^12.23.26", + "html-to-image": "^1.11.13", "lucide-react": "^0.545.0", "mammoth": "^1.11.0", "react": "^19.1.1", diff --git a/public/audio/chenyun/mp3_chenyun_40.mp3 b/public/audio/chenyun/mp3_chenyun_40.mp3 index 6c16d39..867426a 100644 Binary files a/public/audio/chenyun/mp3_chenyun_40.mp3 and b/public/audio/chenyun/mp3_chenyun_40.mp3 differ diff --git a/public/audio/huangyanpei/mp3_huangyanpei_31.mp3 b/public/audio/huangyanpei/mp3_huangyanpei_31.mp3 index 2563e62..5d7d876 100644 Binary files a/public/audio/huangyanpei/mp3_huangyanpei_31.mp3 and b/public/audio/huangyanpei/mp3_huangyanpei_31.mp3 differ diff --git a/public/audio/letter/7走向复兴.m4a b/public/audio/letter/7走向复兴.m4a deleted file mode 100644 index d054fec..0000000 Binary files a/public/audio/letter/7走向复兴.m4a and /dev/null differ diff --git a/public/audio/luxun/mp3_luxun_33_02.mp3 b/public/audio/luxun/mp3_luxun_33_02.mp3 index 5a3ff7b..8877b13 100644 Binary files a/public/audio/luxun/mp3_luxun_33_02.mp3 and b/public/audio/luxun/mp3_luxun_33_02.mp3 differ diff --git a/public/audio/sunzhongshan/mp3_sunzhongshan_59.mp3 b/public/audio/sunzhongshan/mp3_sunzhongshan_59.mp3 index af06206..4d1dced 100644 Binary files a/public/audio/sunzhongshan/mp3_sunzhongshan_59.mp3 and b/public/audio/sunzhongshan/mp3_sunzhongshan_59.mp3 differ diff --git a/src/App.tsx b/src/App.tsx index f309251..188964f 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -3,6 +3,7 @@ import { Suspense, useEffect } from 'react' import router from './router' import { ScaleProvider, useScale } from './contexts/ScaleContext' import { RotateHint } from './components/RotateHint' +import { HintHost } from './components' import { useUserStore } from './store' import { getUserDefine } from '@/lib/utils/api-common' import { @@ -62,6 +63,7 @@ function AppContent() { > Loading...}> + diff --git a/src/assets/images/components/letter/动画结束后场景.png b/src/assets/images/components/letter/动画结束后场景.png new file mode 100644 index 0000000..47f6054 Binary files /dev/null and b/src/assets/images/components/letter/动画结束后场景.png differ diff --git a/src/assets/images/components/letter/回信点击.png b/src/assets/images/components/letter/回信点击.png new file mode 100644 index 0000000..fe8accb Binary files /dev/null and b/src/assets/images/components/letter/回信点击.png differ diff --git a/src/assets/images/components/letter/点击信详情-孙中山.png b/src/assets/images/components/letter/点击信详情-孙中山.png new file mode 100644 index 0000000..b3c614b Binary files /dev/null and b/src/assets/images/components/letter/点击信详情-孙中山.png differ diff --git a/src/assets/images/components/letter/点击信详情-张乐平.png b/src/assets/images/components/letter/点击信详情-张乐平.png new file mode 100644 index 0000000..13c7e47 Binary files /dev/null and b/src/assets/images/components/letter/点击信详情-张乐平.png differ diff --git a/src/assets/images/components/letter/点击信详情-毛泽东.png b/src/assets/images/components/letter/点击信详情-毛泽东.png new file mode 100644 index 0000000..425d429 Binary files /dev/null and b/src/assets/images/components/letter/点击信详情-毛泽东.png differ diff --git a/src/assets/images/components/letter/点击信详情-聂耳.png b/src/assets/images/components/letter/点击信详情-聂耳.png new file mode 100644 index 0000000..e4bcbdd Binary files /dev/null and b/src/assets/images/components/letter/点击信详情-聂耳.png differ diff --git a/src/assets/images/components/letter/点击信详情-荣德生.png b/src/assets/images/components/letter/点击信详情-荣德生.png new file mode 100644 index 0000000..a7dab9a Binary files /dev/null and b/src/assets/images/components/letter/点击信详情-荣德生.png differ diff --git a/src/assets/images/components/letter/点击信详情-陈云.png b/src/assets/images/components/letter/点击信详情-陈云.png new file mode 100644 index 0000000..a52e82c Binary files /dev/null and b/src/assets/images/components/letter/点击信详情-陈云.png differ diff --git a/src/assets/images/components/letter/点击信详情-鲁迅.png b/src/assets/images/components/letter/点击信详情-鲁迅.png new file mode 100644 index 0000000..bf51b67 Binary files /dev/null and b/src/assets/images/components/letter/点击信详情-鲁迅.png differ diff --git a/src/assets/images/components/letter/点击信详情-黄炎培.png b/src/assets/images/components/letter/点击信详情-黄炎培.png new file mode 100644 index 0000000..5bf0cd4 Binary files /dev/null and b/src/assets/images/components/letter/点击信详情-黄炎培.png differ diff --git a/src/assets/images/components/letter/点击敬读.png b/src/assets/images/components/letter/点击敬读.png new file mode 100644 index 0000000..974ec88 Binary files /dev/null and b/src/assets/images/components/letter/点击敬读.png differ diff --git a/src/assets/images/components/三毛对话底板.png b/src/assets/images/components/三毛对话底板.png new file mode 100644 index 0000000..25b096e Binary files /dev/null and b/src/assets/images/components/三毛对话底板.png differ diff --git a/src/assets/images/components/光标.png b/src/assets/images/components/光标.png new file mode 100644 index 0000000..5ec4791 Binary files /dev/null and b/src/assets/images/components/光标.png differ diff --git a/src/assets/images/components/提示条.png b/src/assets/images/components/提示条.png new file mode 100644 index 0000000..917bbb2 Binary files /dev/null and b/src/assets/images/components/提示条.png differ diff --git a/src/assets/images/huangyanpei/reflection/components/compute.png b/src/assets/images/huangyanpei/reflection/components/compute.png new file mode 100644 index 0000000..71b3175 Binary files /dev/null and b/src/assets/images/huangyanpei/reflection/components/compute.png differ diff --git a/src/assets/images/nieer/place1/场景1.png b/src/assets/images/nieer/place1/场景1.png new file mode 100644 index 0000000..837754d Binary files /dev/null and b/src/assets/images/nieer/place1/场景1.png differ diff --git a/src/assets/images/nieer/place1/场景1展品1.png b/src/assets/images/nieer/place1/场景1展品1.png new file mode 100644 index 0000000..8bee2ae Binary files /dev/null and b/src/assets/images/nieer/place1/场景1展品1.png differ diff --git a/src/assets/images/nieer/place1/场景1展品2.png b/src/assets/images/nieer/place1/场景1展品2.png new file mode 100644 index 0000000..e570438 Binary files /dev/null and b/src/assets/images/nieer/place1/场景1展品2.png differ diff --git a/src/assets/images/nieer/place1/场景1展品3.png b/src/assets/images/nieer/place1/场景1展品3.png new file mode 100644 index 0000000..1d992ef Binary files /dev/null and b/src/assets/images/nieer/place1/场景1展品3.png differ diff --git a/src/assets/images/nieer/place1/继续前进1.png b/src/assets/images/nieer/place1/继续前进1.png new file mode 100644 index 0000000..276da99 Binary files /dev/null and b/src/assets/images/nieer/place1/继续前进1.png differ diff --git a/src/assets/images/nieer/place2/场景2.png b/src/assets/images/nieer/place2/场景2.png new file mode 100644 index 0000000..71eee9c Binary files /dev/null and b/src/assets/images/nieer/place2/场景2.png differ diff --git a/src/assets/images/nieer/place2/场景2展品1.png b/src/assets/images/nieer/place2/场景2展品1.png new file mode 100644 index 0000000..c6cb2f0 Binary files /dev/null and b/src/assets/images/nieer/place2/场景2展品1.png differ diff --git a/src/assets/images/nieer/place2/场景2展品2.png b/src/assets/images/nieer/place2/场景2展品2.png new file mode 100644 index 0000000..bc22989 Binary files /dev/null and b/src/assets/images/nieer/place2/场景2展品2.png differ diff --git a/src/assets/images/nieer/place3/场景3.png b/src/assets/images/nieer/place3/场景3.png new file mode 100644 index 0000000..dbfbd74 Binary files /dev/null and b/src/assets/images/nieer/place3/场景3.png differ diff --git a/src/assets/images/nieer/place3/场景3展品1.png b/src/assets/images/nieer/place3/场景3展品1.png new file mode 100644 index 0000000..922d160 Binary files /dev/null and b/src/assets/images/nieer/place3/场景3展品1.png differ diff --git a/src/assets/images/nieer/place3/场景3展品2.png b/src/assets/images/nieer/place3/场景3展品2.png new file mode 100644 index 0000000..a71adf2 Binary files /dev/null and b/src/assets/images/nieer/place3/场景3展品2.png differ diff --git a/src/assets/images/nieer/place3/场景3展品3.png b/src/assets/images/nieer/place3/场景3展品3.png new file mode 100644 index 0000000..bb589df Binary files /dev/null and b/src/assets/images/nieer/place3/场景3展品3.png differ diff --git a/src/assets/images/nieer/place4/场景4.png b/src/assets/images/nieer/place4/场景4.png new file mode 100644 index 0000000..980bb31 Binary files /dev/null and b/src/assets/images/nieer/place4/场景4.png differ diff --git a/src/assets/images/nieer/place4/场景4展品1.png b/src/assets/images/nieer/place4/场景4展品1.png new file mode 100644 index 0000000..d54c85b Binary files /dev/null and b/src/assets/images/nieer/place4/场景4展品1.png differ diff --git a/src/assets/images/nieer/place4/场景4展品2.png b/src/assets/images/nieer/place4/场景4展品2.png new file mode 100644 index 0000000..86d9ff2 Binary files /dev/null and b/src/assets/images/nieer/place4/场景4展品2.png differ diff --git a/src/assets/images/nieer/place4/继续前进.png b/src/assets/images/nieer/place4/继续前进.png new file mode 100644 index 0000000..81e1b7d Binary files /dev/null and b/src/assets/images/nieer/place4/继续前进.png differ diff --git a/src/assets/images/nieer/place5/场景5.png b/src/assets/images/nieer/place5/场景5.png new file mode 100644 index 0000000..89c5d47 Binary files /dev/null and b/src/assets/images/nieer/place5/场景5.png differ diff --git a/src/assets/images/nieer/place5/场景5展品1.png b/src/assets/images/nieer/place5/场景5展品1.png new file mode 100644 index 0000000..1a18e18 Binary files /dev/null and b/src/assets/images/nieer/place5/场景5展品1.png differ diff --git a/src/assets/images/nieer/place5/场景5展品2.png b/src/assets/images/nieer/place5/场景5展品2.png new file mode 100644 index 0000000..4bdefd8 Binary files /dev/null and b/src/assets/images/nieer/place5/场景5展品2.png differ diff --git a/src/assets/images/nieer/place5/场景5展品3.png b/src/assets/images/nieer/place5/场景5展品3.png new file mode 100644 index 0000000..f14410e Binary files /dev/null and b/src/assets/images/nieer/place5/场景5展品3.png differ diff --git a/src/assets/images/nieer/place6/场景6.png b/src/assets/images/nieer/place6/场景6.png new file mode 100644 index 0000000..394d906 Binary files /dev/null and b/src/assets/images/nieer/place6/场景6.png differ diff --git a/src/assets/images/nieer/place6/场景6展品1.png b/src/assets/images/nieer/place6/场景6展品1.png new file mode 100644 index 0000000..7990999 Binary files /dev/null and b/src/assets/images/nieer/place6/场景6展品1.png differ diff --git a/src/assets/images/nieer/place6/场景6展品2.png b/src/assets/images/nieer/place6/场景6展品2.png new file mode 100644 index 0000000..92622ad Binary files /dev/null and b/src/assets/images/nieer/place6/场景6展品2.png differ diff --git a/src/assets/images/nieer/reflection/lobby/box/旅行箱内置.png b/src/assets/images/nieer/reflection/lobby/box/旅行箱内置.png new file mode 100644 index 0000000..c73d9cc Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/box/旅行箱内置.png differ diff --git a/src/assets/images/nieer/reflection/lobby/box/音符.png b/src/assets/images/nieer/reflection/lobby/box/音符.png new file mode 100644 index 0000000..d81a38c Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/box/音符.png differ diff --git a/src/assets/images/nieer/reflection/lobby/content/场景1交互.png b/src/assets/images/nieer/reflection/lobby/content/场景1交互.png new file mode 100644 index 0000000..eaf22be Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/content/场景1交互.png differ diff --git a/src/assets/images/nieer/reflection/lobby/content/场景1内容.png b/src/assets/images/nieer/reflection/lobby/content/场景1内容.png new file mode 100644 index 0000000..fae0a8f Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/content/场景1内容.png differ diff --git a/src/assets/images/nieer/reflection/lobby/content/场景2交互.png b/src/assets/images/nieer/reflection/lobby/content/场景2交互.png new file mode 100644 index 0000000..5cd52f7 Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/content/场景2交互.png differ diff --git a/src/assets/images/nieer/reflection/lobby/content/场景2内容.png b/src/assets/images/nieer/reflection/lobby/content/场景2内容.png new file mode 100644 index 0000000..4d405c4 Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/content/场景2内容.png differ diff --git a/src/assets/images/nieer/reflection/lobby/content/场景3内容.png b/src/assets/images/nieer/reflection/lobby/content/场景3内容.png new file mode 100644 index 0000000..608579a Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/content/场景3内容.png differ diff --git a/src/assets/images/nieer/reflection/lobby/content/场景4交互.png b/src/assets/images/nieer/reflection/lobby/content/场景4交互.png new file mode 100644 index 0000000..76c95e2 Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/content/场景4交互.png differ diff --git a/src/assets/images/nieer/reflection/lobby/content/场景4内容.png b/src/assets/images/nieer/reflection/lobby/content/场景4内容.png new file mode 100644 index 0000000..505c377 Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/content/场景4内容.png differ diff --git a/src/assets/images/nieer/reflection/lobby/content/场景5交互可拖拽1.png b/src/assets/images/nieer/reflection/lobby/content/场景5交互可拖拽1.png new file mode 100644 index 0000000..bfb554d Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/content/场景5交互可拖拽1.png differ diff --git a/src/assets/images/nieer/reflection/lobby/content/场景5交互可拖拽2.png b/src/assets/images/nieer/reflection/lobby/content/场景5交互可拖拽2.png new file mode 100644 index 0000000..f09ae81 Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/content/场景5交互可拖拽2.png differ diff --git a/src/assets/images/nieer/reflection/lobby/content/场景5全部反馈.png b/src/assets/images/nieer/reflection/lobby/content/场景5全部反馈.png new file mode 100644 index 0000000..0d13476 Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/content/场景5全部反馈.png differ diff --git a/src/assets/images/nieer/reflection/lobby/content/场景5内容.png b/src/assets/images/nieer/reflection/lobby/content/场景5内容.png new file mode 100644 index 0000000..57b7325 Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/content/场景5内容.png differ diff --git a/src/assets/images/nieer/reflection/lobby/content/场景5待交互.png b/src/assets/images/nieer/reflection/lobby/content/场景5待交互.png new file mode 100644 index 0000000..fc214f8 Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/content/场景5待交互.png differ diff --git a/src/assets/images/nieer/reflection/lobby/content/场景5我制作的明信片.png b/src/assets/images/nieer/reflection/lobby/content/场景5我制作的明信片.png new file mode 100644 index 0000000..3a29507 Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/content/场景5我制作的明信片.png differ diff --git a/src/assets/images/nieer/reflection/lobby/content/场景5有文字反馈.png b/src/assets/images/nieer/reflection/lobby/content/场景5有文字反馈.png new file mode 100644 index 0000000..2d7fb25 Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/content/场景5有文字反馈.png differ diff --git a/src/assets/images/nieer/reflection/lobby/content/场景5有飞机反馈.png b/src/assets/images/nieer/reflection/lobby/content/场景5有飞机反馈.png new file mode 100644 index 0000000..03fd33e Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/content/场景5有飞机反馈.png differ diff --git a/src/assets/images/nieer/reflection/lobby/content/场景6“东风-5C”液体洲际战略核导弹.png b/src/assets/images/nieer/reflection/lobby/content/场景6“东风-5C”液体洲际战略核导弹.png new file mode 100644 index 0000000..276d4c2 Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/content/场景6“东风-5C”液体洲际战略核导弹.png differ diff --git a/src/assets/images/nieer/reflection/lobby/content/场景6两栖突击方队.png b/src/assets/images/nieer/reflection/lobby/content/场景6两栖突击方队.png new file mode 100644 index 0000000..19ef223 Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/content/场景6两栖突击方队.png differ diff --git a/src/assets/images/nieer/reflection/lobby/content/场景6中国人民解放军仪仗方队.png b/src/assets/images/nieer/reflection/lobby/content/场景6中国人民解放军仪仗方队.png new file mode 100644 index 0000000..f6e37ec Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/content/场景6中国人民解放军仪仗方队.png differ diff --git a/src/assets/images/nieer/reflection/lobby/content/场景6内容.png b/src/assets/images/nieer/reflection/lobby/content/场景6内容.png new file mode 100644 index 0000000..08b7195 Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/content/场景6内容.png differ diff --git a/src/assets/images/nieer/reflection/lobby/content/场景6定格底板.png b/src/assets/images/nieer/reflection/lobby/content/场景6定格底板.png new file mode 100644 index 0000000..26ed864 Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/content/场景6定格底板.png differ diff --git a/src/assets/images/nieer/reflection/lobby/content/场景6文字1.png b/src/assets/images/nieer/reflection/lobby/content/场景6文字1.png new file mode 100644 index 0000000..9aeeee1 Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/content/场景6文字1.png differ diff --git a/src/assets/images/nieer/reflection/lobby/content/场景6文字2.png b/src/assets/images/nieer/reflection/lobby/content/场景6文字2.png new file mode 100644 index 0000000..a516e42 Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/content/场景6文字2.png differ diff --git a/src/assets/images/nieer/reflection/lobby/content/场景6文字3.png b/src/assets/images/nieer/reflection/lobby/content/场景6文字3.png new file mode 100644 index 0000000..00b18d9 Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/content/场景6文字3.png differ diff --git a/src/assets/images/nieer/reflection/lobby/content/场景6文字4.png b/src/assets/images/nieer/reflection/lobby/content/场景6文字4.png new file mode 100644 index 0000000..f2a61c9 Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/content/场景6文字4.png differ diff --git a/src/assets/images/nieer/reflection/lobby/content/场景6文字5.png b/src/assets/images/nieer/reflection/lobby/content/场景6文字5.png new file mode 100644 index 0000000..88db261 Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/content/场景6文字5.png differ diff --git a/src/assets/images/nieer/reflection/lobby/content/场景6海上无人作战方队.png b/src/assets/images/nieer/reflection/lobby/content/场景6海上无人作战方队.png new file mode 100644 index 0000000..c9a61c6 Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/content/场景6海上无人作战方队.png differ diff --git a/src/assets/images/nieer/reflection/lobby/content/场景6火箭军方队.png b/src/assets/images/nieer/reflection/lobby/content/场景6火箭军方队.png new file mode 100644 index 0000000..eb9df63 Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/content/场景6火箭军方队.png differ diff --git a/src/assets/images/nieer/reflection/lobby/content/场景6空中护旗梯队.png b/src/assets/images/nieer/reflection/lobby/content/场景6空中护旗梯队.png new file mode 100644 index 0000000..7649d86 Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/content/场景6空中护旗梯队.png differ diff --git a/src/assets/images/nieer/reflection/lobby/dialog/内容框.png b/src/assets/images/nieer/reflection/lobby/dialog/内容框.png new file mode 100644 index 0000000..4042e26 Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/dialog/内容框.png differ diff --git a/src/assets/images/nieer/reflection/lobby/dialog/内容框关闭.png b/src/assets/images/nieer/reflection/lobby/dialog/内容框关闭.png new file mode 100644 index 0000000..045371a Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/dialog/内容框关闭.png differ diff --git a/src/assets/images/nieer/reflection/lobby/dialog/场景交互底板-最后一个.png b/src/assets/images/nieer/reflection/lobby/dialog/场景交互底板-最后一个.png new file mode 100644 index 0000000..cc7f4f6 Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/dialog/场景交互底板-最后一个.png differ diff --git a/src/assets/images/nieer/reflection/lobby/dialog/按钮关闭2.png b/src/assets/images/nieer/reflection/lobby/dialog/按钮关闭2.png new file mode 100644 index 0000000..20dd73e Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/dialog/按钮关闭2.png differ diff --git a/src/assets/images/nieer/reflection/lobby/dialog/竖底板.png b/src/assets/images/nieer/reflection/lobby/dialog/竖底板.png new file mode 100644 index 0000000..517da15 Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/dialog/竖底板.png differ diff --git a/src/assets/images/nieer/reflection/lobby/footer.png b/src/assets/images/nieer/reflection/lobby/footer.png new file mode 100644 index 0000000..3eb3814 Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/footer.png differ diff --git a/src/assets/images/nieer/reflection/lobby/icon/分享.png b/src/assets/images/nieer/reflection/lobby/icon/分享.png new file mode 100644 index 0000000..8ef5dd2 Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/icon/分享.png differ diff --git a/src/assets/images/nieer/reflection/lobby/icon/完成.png b/src/assets/images/nieer/reflection/lobby/icon/完成.png new file mode 100644 index 0000000..cb851e2 Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/icon/完成.png differ diff --git a/src/assets/images/nieer/reflection/lobby/icon/寄语.png b/src/assets/images/nieer/reflection/lobby/icon/寄语.png new file mode 100644 index 0000000..c5fe3a4 Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/icon/寄语.png differ diff --git a/src/assets/images/nieer/reflection/lobby/icon/徽章1.png b/src/assets/images/nieer/reflection/lobby/icon/徽章1.png new file mode 100644 index 0000000..aef5be2 Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/icon/徽章1.png differ diff --git a/src/assets/images/nieer/reflection/lobby/icon/徽章2.png b/src/assets/images/nieer/reflection/lobby/icon/徽章2.png new file mode 100644 index 0000000..2cedcac Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/icon/徽章2.png differ diff --git a/src/assets/images/nieer/reflection/lobby/icon/徽章3.png b/src/assets/images/nieer/reflection/lobby/icon/徽章3.png new file mode 100644 index 0000000..6acceb6 Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/icon/徽章3.png differ diff --git a/src/assets/images/nieer/reflection/lobby/icon/徽章底板.png b/src/assets/images/nieer/reflection/lobby/icon/徽章底板.png new file mode 100644 index 0000000..ac5250c Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/icon/徽章底板.png differ diff --git a/src/assets/images/nieer/reflection/lobby/icon/旅行箱.png b/src/assets/images/nieer/reflection/lobby/icon/旅行箱.png new file mode 100644 index 0000000..4bc99a2 Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/icon/旅行箱.png differ diff --git a/src/assets/images/nieer/reflection/lobby/icon/点击前往.png b/src/assets/images/nieer/reflection/lobby/icon/点击前往.png new file mode 100644 index 0000000..d53f7e4 Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/icon/点击前往.png differ diff --git a/src/assets/images/nieer/reflection/lobby/icon/点此寄语留念.png b/src/assets/images/nieer/reflection/lobby/icon/点此寄语留念.png new file mode 100644 index 0000000..d968013 Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/icon/点此寄语留念.png differ diff --git a/src/assets/images/nieer/reflection/lobby/menu/唱片.png b/src/assets/images/nieer/reflection/lobby/menu/唱片.png new file mode 100644 index 0000000..c69db5a Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/menu/唱片.png differ diff --git a/src/assets/images/nieer/reflection/lobby/menu/喇叭.png b/src/assets/images/nieer/reflection/lobby/menu/喇叭.png new file mode 100644 index 0000000..92b0dec Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/menu/喇叭.png differ diff --git a/src/assets/images/nieer/reflection/lobby/menu/琴弦.png b/src/assets/images/nieer/reflection/lobby/menu/琴弦.png new file mode 100644 index 0000000..cc3ec75 Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/menu/琴弦.png differ diff --git a/src/assets/images/nieer/reflection/lobby/menu/羽毛笔.png b/src/assets/images/nieer/reflection/lobby/menu/羽毛笔.png new file mode 100644 index 0000000..98faa46 Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/menu/羽毛笔.png differ diff --git a/src/assets/images/nieer/reflection/lobby/menu/话筒.png b/src/assets/images/nieer/reflection/lobby/menu/话筒.png new file mode 100644 index 0000000..86e88f1 Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/menu/话筒.png differ diff --git a/src/assets/images/nieer/reflection/lobby/menu/车.png b/src/assets/images/nieer/reflection/lobby/menu/车.png new file mode 100644 index 0000000..b047441 Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/menu/车.png differ diff --git a/src/assets/images/nieer/reflection/lobby/menu/选中光标.png b/src/assets/images/nieer/reflection/lobby/menu/选中光标.png new file mode 100644 index 0000000..27d7411 Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/menu/选中光标.png differ diff --git a/src/assets/images/nieer/reflection/lobby/menu/飞机.png b/src/assets/images/nieer/reflection/lobby/menu/飞机.png new file mode 100644 index 0000000..4377d27 Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/menu/飞机.png differ diff --git a/src/assets/images/nieer/reflection/lobby/menu/黑白-唱片.png b/src/assets/images/nieer/reflection/lobby/menu/黑白-唱片.png new file mode 100644 index 0000000..370b87e Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/menu/黑白-唱片.png differ diff --git a/src/assets/images/nieer/reflection/lobby/menu/黑白-喇叭.png b/src/assets/images/nieer/reflection/lobby/menu/黑白-喇叭.png new file mode 100644 index 0000000..b8aa5dd Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/menu/黑白-喇叭.png differ diff --git a/src/assets/images/nieer/reflection/lobby/menu/黑白-羽毛.png b/src/assets/images/nieer/reflection/lobby/menu/黑白-羽毛.png new file mode 100644 index 0000000..44e7ad6 Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/menu/黑白-羽毛.png differ diff --git a/src/assets/images/nieer/reflection/lobby/menu/黑白-话筒.png b/src/assets/images/nieer/reflection/lobby/menu/黑白-话筒.png new file mode 100644 index 0000000..74c2fc1 Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/menu/黑白-话筒.png differ diff --git a/src/assets/images/nieer/reflection/lobby/menu/黑白-车.png b/src/assets/images/nieer/reflection/lobby/menu/黑白-车.png new file mode 100644 index 0000000..3a5a5a8 Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/menu/黑白-车.png differ diff --git a/src/assets/images/nieer/reflection/lobby/menu/黑白-飞机.png b/src/assets/images/nieer/reflection/lobby/menu/黑白-飞机.png new file mode 100644 index 0000000..5818aa3 Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/menu/黑白-飞机.png differ diff --git a/src/assets/images/nieer/reflection/lobby/piano/弹琴交互1.png b/src/assets/images/nieer/reflection/lobby/piano/弹琴交互1.png new file mode 100644 index 0000000..3b6437d Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/piano/弹琴交互1.png differ diff --git a/src/assets/images/nieer/reflection/lobby/piano/弹琴交互2.png b/src/assets/images/nieer/reflection/lobby/piano/弹琴交互2.png new file mode 100644 index 0000000..dabad6f Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/piano/弹琴交互2.png differ diff --git a/src/assets/images/nieer/reflection/lobby/piano/弹琴交互3.png b/src/assets/images/nieer/reflection/lobby/piano/弹琴交互3.png new file mode 100644 index 0000000..1fd832c Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/piano/弹琴交互3.png differ diff --git a/src/assets/images/nieer/reflection/lobby/piano/弹琴交互4.png b/src/assets/images/nieer/reflection/lobby/piano/弹琴交互4.png new file mode 100644 index 0000000..a375919 Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/piano/弹琴交互4.png differ diff --git a/src/assets/images/nieer/reflection/lobby/piano/弹琴交互5.png b/src/assets/images/nieer/reflection/lobby/piano/弹琴交互5.png new file mode 100644 index 0000000..25600b2 Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/piano/弹琴交互5.png differ diff --git a/src/assets/images/nieer/reflection/lobby/piano/弹琴交互6.png b/src/assets/images/nieer/reflection/lobby/piano/弹琴交互6.png new file mode 100644 index 0000000..8f48cdb Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/piano/弹琴交互6.png differ diff --git a/src/assets/images/nieer/reflection/lobby/piano/弹琴交互7.png b/src/assets/images/nieer/reflection/lobby/piano/弹琴交互7.png new file mode 100644 index 0000000..cf326bd Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/piano/弹琴交互7.png differ diff --git a/src/assets/images/nieer/reflection/lobby/piano/弹琴交互8.png b/src/assets/images/nieer/reflection/lobby/piano/弹琴交互8.png new file mode 100644 index 0000000..c639de0 Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/piano/弹琴交互8.png differ diff --git a/src/assets/images/nieer/reflection/lobby/piano/弹琴交互9.png b/src/assets/images/nieer/reflection/lobby/piano/弹琴交互9.png new file mode 100644 index 0000000..ad1b94c Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/piano/弹琴交互9.png differ diff --git a/src/assets/images/nieer/reflection/lobby/result/聂耳结束场景1.png b/src/assets/images/nieer/reflection/lobby/result/聂耳结束场景1.png new file mode 100644 index 0000000..e0aacf1 Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/result/聂耳结束场景1.png differ diff --git a/src/assets/images/nieer/reflection/lobby/result/聂耳结束场景2.png b/src/assets/images/nieer/reflection/lobby/result/聂耳结束场景2.png new file mode 100644 index 0000000..edd4644 Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/result/聂耳结束场景2.png differ diff --git a/src/assets/images/nieer/reflection/lobby/result/聂耳结束场景3.png b/src/assets/images/nieer/reflection/lobby/result/聂耳结束场景3.png new file mode 100644 index 0000000..4343948 Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/result/聂耳结束场景3.png differ diff --git a/src/assets/images/nieer/reflection/lobby/result/聂耳结束场景4.png b/src/assets/images/nieer/reflection/lobby/result/聂耳结束场景4.png new file mode 100644 index 0000000..8680c54 Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/result/聂耳结束场景4.png differ diff --git a/src/assets/images/nieer/reflection/lobby/result/聂耳结束场景5.png b/src/assets/images/nieer/reflection/lobby/result/聂耳结束场景5.png new file mode 100644 index 0000000..a882c3d Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/result/聂耳结束场景5.png differ diff --git a/src/assets/images/nieer/reflection/lobby/result/聂耳结束场景6.png b/src/assets/images/nieer/reflection/lobby/result/聂耳结束场景6.png new file mode 100644 index 0000000..f4cf91a Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/result/聂耳结束场景6.png differ diff --git a/src/assets/images/nieer/reflection/lobby/select/未选中.png b/src/assets/images/nieer/reflection/lobby/select/未选中.png new file mode 100644 index 0000000..409d15d Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/select/未选中.png differ diff --git a/src/assets/images/nieer/reflection/lobby/select/选中.png b/src/assets/images/nieer/reflection/lobby/select/选中.png new file mode 100644 index 0000000..cf7e974 Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/select/选中.png differ diff --git a/src/assets/images/nieer/reflection/lobby/上海.png b/src/assets/images/nieer/reflection/lobby/上海.png new file mode 100644 index 0000000..5c3452b Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/上海.png differ diff --git a/src/assets/images/nieer/reflection/lobby/利比亚.png b/src/assets/images/nieer/reflection/lobby/利比亚.png new file mode 100644 index 0000000..ceda374 Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/利比亚.png differ diff --git a/src/assets/images/nieer/reflection/lobby/北京.png b/src/assets/images/nieer/reflection/lobby/北京.png new file mode 100644 index 0000000..6f3edb9 Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/北京.png differ diff --git a/src/assets/images/nieer/reflection/lobby/场景首页底图.png b/src/assets/images/nieer/reflection/lobby/场景首页底图.png new file mode 100644 index 0000000..fa60d46 Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/场景首页底图.png differ diff --git a/src/assets/images/nieer/reflection/lobby/欧洲亚洲.png b/src/assets/images/nieer/reflection/lobby/欧洲亚洲.png new file mode 100644 index 0000000..b03ba08 Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/欧洲亚洲.png differ diff --git a/src/assets/images/nieer/reflection/lobby/美国.png b/src/assets/images/nieer/reflection/lobby/美国.png new file mode 100644 index 0000000..d42f5db Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/美国.png differ diff --git a/src/assets/images/nieer/reflection/lobby/贵州.png b/src/assets/images/nieer/reflection/lobby/贵州.png new file mode 100644 index 0000000..7620b85 Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/贵州.png differ diff --git a/src/assets/images/nieer/reflection/lobby/输入.png b/src/assets/images/nieer/reflection/lobby/输入.png new file mode 100644 index 0000000..f6e695a Binary files /dev/null and b/src/assets/images/nieer/reflection/lobby/输入.png differ diff --git a/src/assets/images/nieer/聂耳旧居底图.png b/src/assets/images/nieer/聂耳旧居底图.png new file mode 100644 index 0000000..f77b896 Binary files /dev/null and b/src/assets/images/nieer/聂耳旧居底图.png differ diff --git a/src/assets/images/puzzle/luxun/鲁迅碎片详情.png b/src/assets/images/puzzle/luxun/鲁迅碎片详情.png deleted file mode 100644 index ff05dc4..0000000 Binary files a/src/assets/images/puzzle/luxun/鲁迅碎片详情.png and /dev/null differ diff --git a/src/assets/images/puzzle/maozedong/1.png b/src/assets/images/puzzle/maozedong/1.png new file mode 100644 index 0000000..d008e4d Binary files /dev/null and b/src/assets/images/puzzle/maozedong/1.png differ diff --git a/src/assets/images/puzzle/maozedong/10.png b/src/assets/images/puzzle/maozedong/10.png new file mode 100644 index 0000000..cb3432e Binary files /dev/null and b/src/assets/images/puzzle/maozedong/10.png differ diff --git a/src/assets/images/puzzle/maozedong/11.png b/src/assets/images/puzzle/maozedong/11.png new file mode 100644 index 0000000..a07a464 Binary files /dev/null and b/src/assets/images/puzzle/maozedong/11.png differ diff --git a/src/assets/images/puzzle/maozedong/12.png b/src/assets/images/puzzle/maozedong/12.png new file mode 100644 index 0000000..7eac312 Binary files /dev/null and b/src/assets/images/puzzle/maozedong/12.png differ diff --git a/src/assets/images/puzzle/maozedong/13.png b/src/assets/images/puzzle/maozedong/13.png new file mode 100644 index 0000000..056aac9 Binary files /dev/null and b/src/assets/images/puzzle/maozedong/13.png differ diff --git a/src/assets/images/puzzle/maozedong/14.png b/src/assets/images/puzzle/maozedong/14.png new file mode 100644 index 0000000..1d55f46 Binary files /dev/null and b/src/assets/images/puzzle/maozedong/14.png differ diff --git a/src/assets/images/puzzle/maozedong/15.png b/src/assets/images/puzzle/maozedong/15.png new file mode 100644 index 0000000..ebda505 Binary files /dev/null and b/src/assets/images/puzzle/maozedong/15.png differ diff --git a/src/assets/images/puzzle/maozedong/16.png b/src/assets/images/puzzle/maozedong/16.png new file mode 100644 index 0000000..d7e608d Binary files /dev/null and b/src/assets/images/puzzle/maozedong/16.png differ diff --git a/src/assets/images/puzzle/maozedong/2.png b/src/assets/images/puzzle/maozedong/2.png new file mode 100644 index 0000000..d8b7efc Binary files /dev/null and b/src/assets/images/puzzle/maozedong/2.png differ diff --git a/src/assets/images/puzzle/maozedong/3.png b/src/assets/images/puzzle/maozedong/3.png new file mode 100644 index 0000000..f78bfd7 Binary files /dev/null and b/src/assets/images/puzzle/maozedong/3.png differ diff --git a/src/assets/images/puzzle/maozedong/4.png b/src/assets/images/puzzle/maozedong/4.png new file mode 100644 index 0000000..8c9d7d8 Binary files /dev/null and b/src/assets/images/puzzle/maozedong/4.png differ diff --git a/src/assets/images/puzzle/maozedong/5.png b/src/assets/images/puzzle/maozedong/5.png new file mode 100644 index 0000000..25fbac0 Binary files /dev/null and b/src/assets/images/puzzle/maozedong/5.png differ diff --git a/src/assets/images/puzzle/maozedong/6.png b/src/assets/images/puzzle/maozedong/6.png new file mode 100644 index 0000000..f5a5a13 Binary files /dev/null and b/src/assets/images/puzzle/maozedong/6.png differ diff --git a/src/assets/images/puzzle/maozedong/7.png b/src/assets/images/puzzle/maozedong/7.png new file mode 100644 index 0000000..0f88d7f Binary files /dev/null and b/src/assets/images/puzzle/maozedong/7.png differ diff --git a/src/assets/images/puzzle/maozedong/8.png b/src/assets/images/puzzle/maozedong/8.png new file mode 100644 index 0000000..871815d Binary files /dev/null and b/src/assets/images/puzzle/maozedong/8.png differ diff --git a/src/assets/images/puzzle/maozedong/9.png b/src/assets/images/puzzle/maozedong/9.png new file mode 100644 index 0000000..8d34e39 Binary files /dev/null and b/src/assets/images/puzzle/maozedong/9.png differ diff --git a/src/assets/images/puzzle/maozedong/details/1.png b/src/assets/images/puzzle/maozedong/details/1.png new file mode 100644 index 0000000..7c84ba4 Binary files /dev/null and b/src/assets/images/puzzle/maozedong/details/1.png differ diff --git a/src/assets/images/puzzle/maozedong/details/10.png b/src/assets/images/puzzle/maozedong/details/10.png new file mode 100644 index 0000000..a5db6a1 Binary files /dev/null and b/src/assets/images/puzzle/maozedong/details/10.png differ diff --git a/src/assets/images/puzzle/maozedong/details/11.png b/src/assets/images/puzzle/maozedong/details/11.png new file mode 100644 index 0000000..0d568b5 Binary files /dev/null and b/src/assets/images/puzzle/maozedong/details/11.png differ diff --git a/src/assets/images/puzzle/maozedong/details/12.png b/src/assets/images/puzzle/maozedong/details/12.png new file mode 100644 index 0000000..552ade7 Binary files /dev/null and b/src/assets/images/puzzle/maozedong/details/12.png differ diff --git a/src/assets/images/puzzle/maozedong/details/13.png b/src/assets/images/puzzle/maozedong/details/13.png new file mode 100644 index 0000000..b52920c Binary files /dev/null and b/src/assets/images/puzzle/maozedong/details/13.png differ diff --git a/src/assets/images/puzzle/maozedong/details/14.png b/src/assets/images/puzzle/maozedong/details/14.png new file mode 100644 index 0000000..1ebb275 Binary files /dev/null and b/src/assets/images/puzzle/maozedong/details/14.png differ diff --git a/src/assets/images/puzzle/maozedong/details/15.png b/src/assets/images/puzzle/maozedong/details/15.png new file mode 100644 index 0000000..dfab237 Binary files /dev/null and b/src/assets/images/puzzle/maozedong/details/15.png differ diff --git a/src/assets/images/puzzle/maozedong/details/16.png b/src/assets/images/puzzle/maozedong/details/16.png new file mode 100644 index 0000000..1c366fa Binary files /dev/null and b/src/assets/images/puzzle/maozedong/details/16.png differ diff --git a/src/assets/images/puzzle/maozedong/details/2.png b/src/assets/images/puzzle/maozedong/details/2.png new file mode 100644 index 0000000..aa481d5 Binary files /dev/null and b/src/assets/images/puzzle/maozedong/details/2.png differ diff --git a/src/assets/images/puzzle/maozedong/details/3.png b/src/assets/images/puzzle/maozedong/details/3.png new file mode 100644 index 0000000..379294d Binary files /dev/null and b/src/assets/images/puzzle/maozedong/details/3.png differ diff --git a/src/assets/images/puzzle/maozedong/details/4.png b/src/assets/images/puzzle/maozedong/details/4.png new file mode 100644 index 0000000..de0c9e0 Binary files /dev/null and b/src/assets/images/puzzle/maozedong/details/4.png differ diff --git a/src/assets/images/puzzle/maozedong/details/5.png b/src/assets/images/puzzle/maozedong/details/5.png new file mode 100644 index 0000000..f0fb19b Binary files /dev/null and b/src/assets/images/puzzle/maozedong/details/5.png differ diff --git a/src/assets/images/puzzle/maozedong/details/6.png b/src/assets/images/puzzle/maozedong/details/6.png new file mode 100644 index 0000000..16a4ebf Binary files /dev/null and b/src/assets/images/puzzle/maozedong/details/6.png differ diff --git a/src/assets/images/puzzle/maozedong/details/7.png b/src/assets/images/puzzle/maozedong/details/7.png new file mode 100644 index 0000000..ec9f5f4 Binary files /dev/null and b/src/assets/images/puzzle/maozedong/details/7.png differ diff --git a/src/assets/images/puzzle/maozedong/details/8.png b/src/assets/images/puzzle/maozedong/details/8.png new file mode 100644 index 0000000..8e9d2ad Binary files /dev/null and b/src/assets/images/puzzle/maozedong/details/8.png differ diff --git a/src/assets/images/puzzle/maozedong/details/9.png b/src/assets/images/puzzle/maozedong/details/9.png new file mode 100644 index 0000000..7998857 Binary files /dev/null and b/src/assets/images/puzzle/maozedong/details/9.png differ diff --git a/src/assets/images/puzzle/maozedong/毛泽东碎片底图.png b/src/assets/images/puzzle/maozedong/毛泽东碎片底图.png new file mode 100644 index 0000000..3c46f3e Binary files /dev/null and b/src/assets/images/puzzle/maozedong/毛泽东碎片底图.png differ diff --git a/src/assets/images/puzzle/nieer/1.png b/src/assets/images/puzzle/nieer/1.png new file mode 100644 index 0000000..1e6c304 Binary files /dev/null and b/src/assets/images/puzzle/nieer/1.png differ diff --git a/src/assets/images/puzzle/nieer/10.png b/src/assets/images/puzzle/nieer/10.png new file mode 100644 index 0000000..db8af4f Binary files /dev/null and b/src/assets/images/puzzle/nieer/10.png differ diff --git a/src/assets/images/puzzle/nieer/11.png b/src/assets/images/puzzle/nieer/11.png new file mode 100644 index 0000000..f29674e Binary files /dev/null and b/src/assets/images/puzzle/nieer/11.png differ diff --git a/src/assets/images/puzzle/nieer/12.png b/src/assets/images/puzzle/nieer/12.png new file mode 100644 index 0000000..2f41fb4 Binary files /dev/null and b/src/assets/images/puzzle/nieer/12.png differ diff --git a/src/assets/images/puzzle/nieer/13.png b/src/assets/images/puzzle/nieer/13.png new file mode 100644 index 0000000..ff02aed Binary files /dev/null and b/src/assets/images/puzzle/nieer/13.png differ diff --git a/src/assets/images/puzzle/nieer/14.png b/src/assets/images/puzzle/nieer/14.png new file mode 100644 index 0000000..e716110 Binary files /dev/null and b/src/assets/images/puzzle/nieer/14.png differ diff --git a/src/assets/images/puzzle/nieer/15.png b/src/assets/images/puzzle/nieer/15.png new file mode 100644 index 0000000..dbc8669 Binary files /dev/null and b/src/assets/images/puzzle/nieer/15.png differ diff --git a/src/assets/images/puzzle/nieer/16.png b/src/assets/images/puzzle/nieer/16.png new file mode 100644 index 0000000..3f06cfa Binary files /dev/null and b/src/assets/images/puzzle/nieer/16.png differ diff --git a/src/assets/images/puzzle/nieer/2.png b/src/assets/images/puzzle/nieer/2.png new file mode 100644 index 0000000..41eebfd Binary files /dev/null and b/src/assets/images/puzzle/nieer/2.png differ diff --git a/src/assets/images/puzzle/nieer/3.png b/src/assets/images/puzzle/nieer/3.png new file mode 100644 index 0000000..ff6a9bd Binary files /dev/null and b/src/assets/images/puzzle/nieer/3.png differ diff --git a/src/assets/images/puzzle/nieer/4.png b/src/assets/images/puzzle/nieer/4.png new file mode 100644 index 0000000..9a88b80 Binary files /dev/null and b/src/assets/images/puzzle/nieer/4.png differ diff --git a/src/assets/images/puzzle/nieer/5.png b/src/assets/images/puzzle/nieer/5.png new file mode 100644 index 0000000..b6d619b Binary files /dev/null and b/src/assets/images/puzzle/nieer/5.png differ diff --git a/src/assets/images/puzzle/nieer/6.png b/src/assets/images/puzzle/nieer/6.png new file mode 100644 index 0000000..44bfdde Binary files /dev/null and b/src/assets/images/puzzle/nieer/6.png differ diff --git a/src/assets/images/puzzle/nieer/7.png b/src/assets/images/puzzle/nieer/7.png new file mode 100644 index 0000000..ea77e10 Binary files /dev/null and b/src/assets/images/puzzle/nieer/7.png differ diff --git a/src/assets/images/puzzle/nieer/8.png b/src/assets/images/puzzle/nieer/8.png new file mode 100644 index 0000000..53b017e Binary files /dev/null and b/src/assets/images/puzzle/nieer/8.png differ diff --git a/src/assets/images/puzzle/nieer/9.png b/src/assets/images/puzzle/nieer/9.png new file mode 100644 index 0000000..a283129 Binary files /dev/null and b/src/assets/images/puzzle/nieer/9.png differ diff --git a/src/assets/images/puzzle/nieer/details/1.png b/src/assets/images/puzzle/nieer/details/1.png new file mode 100644 index 0000000..218822c Binary files /dev/null and b/src/assets/images/puzzle/nieer/details/1.png differ diff --git a/src/assets/images/puzzle/nieer/details/10.png b/src/assets/images/puzzle/nieer/details/10.png new file mode 100644 index 0000000..59e7a6a Binary files /dev/null and b/src/assets/images/puzzle/nieer/details/10.png differ diff --git a/src/assets/images/puzzle/nieer/details/11.png b/src/assets/images/puzzle/nieer/details/11.png new file mode 100644 index 0000000..5881483 Binary files /dev/null and b/src/assets/images/puzzle/nieer/details/11.png differ diff --git a/src/assets/images/puzzle/nieer/details/12.png b/src/assets/images/puzzle/nieer/details/12.png new file mode 100644 index 0000000..05f20fa Binary files /dev/null and b/src/assets/images/puzzle/nieer/details/12.png differ diff --git a/src/assets/images/puzzle/nieer/details/13.png b/src/assets/images/puzzle/nieer/details/13.png new file mode 100644 index 0000000..3b80847 Binary files /dev/null and b/src/assets/images/puzzle/nieer/details/13.png differ diff --git a/src/assets/images/puzzle/nieer/details/14.png b/src/assets/images/puzzle/nieer/details/14.png new file mode 100644 index 0000000..55190fa Binary files /dev/null and b/src/assets/images/puzzle/nieer/details/14.png differ diff --git a/src/assets/images/puzzle/nieer/details/15.png b/src/assets/images/puzzle/nieer/details/15.png new file mode 100644 index 0000000..486f529 Binary files /dev/null and b/src/assets/images/puzzle/nieer/details/15.png differ diff --git a/src/assets/images/puzzle/nieer/details/16.png b/src/assets/images/puzzle/nieer/details/16.png new file mode 100644 index 0000000..4305bc0 Binary files /dev/null and b/src/assets/images/puzzle/nieer/details/16.png differ diff --git a/src/assets/images/puzzle/nieer/details/2.png b/src/assets/images/puzzle/nieer/details/2.png new file mode 100644 index 0000000..5f0dad2 Binary files /dev/null and b/src/assets/images/puzzle/nieer/details/2.png differ diff --git a/src/assets/images/puzzle/nieer/details/3.png b/src/assets/images/puzzle/nieer/details/3.png new file mode 100644 index 0000000..997eafa Binary files /dev/null and b/src/assets/images/puzzle/nieer/details/3.png differ diff --git a/src/assets/images/puzzle/nieer/details/4.png b/src/assets/images/puzzle/nieer/details/4.png new file mode 100644 index 0000000..42320b9 Binary files /dev/null and b/src/assets/images/puzzle/nieer/details/4.png differ diff --git a/src/assets/images/puzzle/nieer/details/5.png b/src/assets/images/puzzle/nieer/details/5.png new file mode 100644 index 0000000..15ad3fe Binary files /dev/null and b/src/assets/images/puzzle/nieer/details/5.png differ diff --git a/src/assets/images/puzzle/nieer/details/6.png b/src/assets/images/puzzle/nieer/details/6.png new file mode 100644 index 0000000..1994a5b Binary files /dev/null and b/src/assets/images/puzzle/nieer/details/6.png differ diff --git a/src/assets/images/puzzle/nieer/details/7.png b/src/assets/images/puzzle/nieer/details/7.png new file mode 100644 index 0000000..0c7c3ef Binary files /dev/null and b/src/assets/images/puzzle/nieer/details/7.png differ diff --git a/src/assets/images/puzzle/nieer/details/8.png b/src/assets/images/puzzle/nieer/details/8.png new file mode 100644 index 0000000..30412bd Binary files /dev/null and b/src/assets/images/puzzle/nieer/details/8.png differ diff --git a/src/assets/images/puzzle/nieer/details/9.png b/src/assets/images/puzzle/nieer/details/9.png new file mode 100644 index 0000000..0e35376 Binary files /dev/null and b/src/assets/images/puzzle/nieer/details/9.png differ diff --git a/src/assets/images/puzzle/nieer/聂耳碎片底图.png b/src/assets/images/puzzle/nieer/聂耳碎片底图.png new file mode 100644 index 0000000..1f3006a Binary files /dev/null and b/src/assets/images/puzzle/nieer/聂耳碎片底图.png differ diff --git a/src/assets/images/puzzle/rongdesheng/1.png b/src/assets/images/puzzle/rongdesheng/1.png new file mode 100644 index 0000000..10cc5ef Binary files /dev/null and b/src/assets/images/puzzle/rongdesheng/1.png differ diff --git a/src/assets/images/puzzle/rongdesheng/10.png b/src/assets/images/puzzle/rongdesheng/10.png new file mode 100644 index 0000000..0c49d47 Binary files /dev/null and b/src/assets/images/puzzle/rongdesheng/10.png differ diff --git a/src/assets/images/puzzle/rongdesheng/11.png b/src/assets/images/puzzle/rongdesheng/11.png new file mode 100644 index 0000000..8e2eb08 Binary files /dev/null and b/src/assets/images/puzzle/rongdesheng/11.png differ diff --git a/src/assets/images/puzzle/rongdesheng/12.png b/src/assets/images/puzzle/rongdesheng/12.png new file mode 100644 index 0000000..9f7cef6 Binary files /dev/null and b/src/assets/images/puzzle/rongdesheng/12.png differ diff --git a/src/assets/images/puzzle/rongdesheng/13.png b/src/assets/images/puzzle/rongdesheng/13.png new file mode 100644 index 0000000..1bc34b7 Binary files /dev/null and b/src/assets/images/puzzle/rongdesheng/13.png differ diff --git a/src/assets/images/puzzle/rongdesheng/14.png b/src/assets/images/puzzle/rongdesheng/14.png new file mode 100644 index 0000000..8f820ff Binary files /dev/null and b/src/assets/images/puzzle/rongdesheng/14.png differ diff --git a/src/assets/images/puzzle/rongdesheng/15.png b/src/assets/images/puzzle/rongdesheng/15.png new file mode 100644 index 0000000..6f03493 Binary files /dev/null and b/src/assets/images/puzzle/rongdesheng/15.png differ diff --git a/src/assets/images/puzzle/rongdesheng/16.png b/src/assets/images/puzzle/rongdesheng/16.png new file mode 100644 index 0000000..f7d1146 Binary files /dev/null and b/src/assets/images/puzzle/rongdesheng/16.png differ diff --git a/src/assets/images/puzzle/rongdesheng/2.png b/src/assets/images/puzzle/rongdesheng/2.png new file mode 100644 index 0000000..19a86a9 Binary files /dev/null and b/src/assets/images/puzzle/rongdesheng/2.png differ diff --git a/src/assets/images/puzzle/rongdesheng/3.png b/src/assets/images/puzzle/rongdesheng/3.png new file mode 100644 index 0000000..54599fe Binary files /dev/null and b/src/assets/images/puzzle/rongdesheng/3.png differ diff --git a/src/assets/images/puzzle/rongdesheng/4.png b/src/assets/images/puzzle/rongdesheng/4.png new file mode 100644 index 0000000..b0a2b27 Binary files /dev/null and b/src/assets/images/puzzle/rongdesheng/4.png differ diff --git a/src/assets/images/puzzle/rongdesheng/5.png b/src/assets/images/puzzle/rongdesheng/5.png new file mode 100644 index 0000000..1a04468 Binary files /dev/null and b/src/assets/images/puzzle/rongdesheng/5.png differ diff --git a/src/assets/images/puzzle/rongdesheng/6.png b/src/assets/images/puzzle/rongdesheng/6.png new file mode 100644 index 0000000..aa90a0f Binary files /dev/null and b/src/assets/images/puzzle/rongdesheng/6.png differ diff --git a/src/assets/images/puzzle/rongdesheng/7.png b/src/assets/images/puzzle/rongdesheng/7.png new file mode 100644 index 0000000..ed80be4 Binary files /dev/null and b/src/assets/images/puzzle/rongdesheng/7.png differ diff --git a/src/assets/images/puzzle/rongdesheng/8.png b/src/assets/images/puzzle/rongdesheng/8.png new file mode 100644 index 0000000..5e2d8b7 Binary files /dev/null and b/src/assets/images/puzzle/rongdesheng/8.png differ diff --git a/src/assets/images/puzzle/rongdesheng/9.png b/src/assets/images/puzzle/rongdesheng/9.png new file mode 100644 index 0000000..9a50c5b Binary files /dev/null and b/src/assets/images/puzzle/rongdesheng/9.png differ diff --git a/src/assets/images/puzzle/rongdesheng/details/1.png b/src/assets/images/puzzle/rongdesheng/details/1.png new file mode 100644 index 0000000..6138b7b Binary files /dev/null and b/src/assets/images/puzzle/rongdesheng/details/1.png differ diff --git a/src/assets/images/puzzle/rongdesheng/details/10.png b/src/assets/images/puzzle/rongdesheng/details/10.png new file mode 100644 index 0000000..39f04bc Binary files /dev/null and b/src/assets/images/puzzle/rongdesheng/details/10.png differ diff --git a/src/assets/images/puzzle/rongdesheng/details/11.png b/src/assets/images/puzzle/rongdesheng/details/11.png new file mode 100644 index 0000000..b59f005 Binary files /dev/null and b/src/assets/images/puzzle/rongdesheng/details/11.png differ diff --git a/src/assets/images/puzzle/rongdesheng/details/12.png b/src/assets/images/puzzle/rongdesheng/details/12.png new file mode 100644 index 0000000..c8856d9 Binary files /dev/null and b/src/assets/images/puzzle/rongdesheng/details/12.png differ diff --git a/src/assets/images/puzzle/rongdesheng/details/13.png b/src/assets/images/puzzle/rongdesheng/details/13.png new file mode 100644 index 0000000..6bee422 Binary files /dev/null and b/src/assets/images/puzzle/rongdesheng/details/13.png differ diff --git a/src/assets/images/puzzle/rongdesheng/details/14.png b/src/assets/images/puzzle/rongdesheng/details/14.png new file mode 100644 index 0000000..a246cc4 Binary files /dev/null and b/src/assets/images/puzzle/rongdesheng/details/14.png differ diff --git a/src/assets/images/puzzle/rongdesheng/details/15.png b/src/assets/images/puzzle/rongdesheng/details/15.png new file mode 100644 index 0000000..f598cdc Binary files /dev/null and b/src/assets/images/puzzle/rongdesheng/details/15.png differ diff --git a/src/assets/images/puzzle/rongdesheng/details/16.png b/src/assets/images/puzzle/rongdesheng/details/16.png new file mode 100644 index 0000000..d308ff9 Binary files /dev/null and b/src/assets/images/puzzle/rongdesheng/details/16.png differ diff --git a/src/assets/images/puzzle/rongdesheng/details/2.png b/src/assets/images/puzzle/rongdesheng/details/2.png new file mode 100644 index 0000000..0f047e3 Binary files /dev/null and b/src/assets/images/puzzle/rongdesheng/details/2.png differ diff --git a/src/assets/images/puzzle/rongdesheng/details/3.png b/src/assets/images/puzzle/rongdesheng/details/3.png new file mode 100644 index 0000000..e645840 Binary files /dev/null and b/src/assets/images/puzzle/rongdesheng/details/3.png differ diff --git a/src/assets/images/puzzle/rongdesheng/details/4.png b/src/assets/images/puzzle/rongdesheng/details/4.png new file mode 100644 index 0000000..4ef7a86 Binary files /dev/null and b/src/assets/images/puzzle/rongdesheng/details/4.png differ diff --git a/src/assets/images/puzzle/rongdesheng/details/5.png b/src/assets/images/puzzle/rongdesheng/details/5.png new file mode 100644 index 0000000..ca63cf2 Binary files /dev/null and b/src/assets/images/puzzle/rongdesheng/details/5.png differ diff --git a/src/assets/images/puzzle/rongdesheng/details/6.png b/src/assets/images/puzzle/rongdesheng/details/6.png new file mode 100644 index 0000000..5592266 Binary files /dev/null and b/src/assets/images/puzzle/rongdesheng/details/6.png differ diff --git a/src/assets/images/puzzle/rongdesheng/details/7.png b/src/assets/images/puzzle/rongdesheng/details/7.png new file mode 100644 index 0000000..88cfbf9 Binary files /dev/null and b/src/assets/images/puzzle/rongdesheng/details/7.png differ diff --git a/src/assets/images/puzzle/rongdesheng/details/8.png b/src/assets/images/puzzle/rongdesheng/details/8.png new file mode 100644 index 0000000..593f558 Binary files /dev/null and b/src/assets/images/puzzle/rongdesheng/details/8.png differ diff --git a/src/assets/images/puzzle/rongdesheng/details/9.png b/src/assets/images/puzzle/rongdesheng/details/9.png new file mode 100644 index 0000000..91d7cb0 Binary files /dev/null and b/src/assets/images/puzzle/rongdesheng/details/9.png differ diff --git a/src/assets/images/puzzle/rongdesheng/碎片底图.png b/src/assets/images/puzzle/rongdesheng/碎片底图.png new file mode 100644 index 0000000..8206d31 Binary files /dev/null and b/src/assets/images/puzzle/rongdesheng/碎片底图.png differ diff --git a/src/assets/images/puzzle/sunzhongshan/孙中山碎片详情.png b/src/assets/images/puzzle/sunzhongshan/孙中山碎片详情.png deleted file mode 100644 index c682511..0000000 Binary files a/src/assets/images/puzzle/sunzhongshan/孙中山碎片详情.png and /dev/null differ diff --git a/src/assets/images/puzzle/zhangleping/1.png b/src/assets/images/puzzle/zhangleping/1.png new file mode 100644 index 0000000..c0586da Binary files /dev/null and b/src/assets/images/puzzle/zhangleping/1.png differ diff --git a/src/assets/images/puzzle/zhangleping/10.png b/src/assets/images/puzzle/zhangleping/10.png new file mode 100644 index 0000000..62183f9 Binary files /dev/null and b/src/assets/images/puzzle/zhangleping/10.png differ diff --git a/src/assets/images/puzzle/zhangleping/11.png b/src/assets/images/puzzle/zhangleping/11.png new file mode 100644 index 0000000..84ca105 Binary files /dev/null and b/src/assets/images/puzzle/zhangleping/11.png differ diff --git a/src/assets/images/puzzle/zhangleping/12.png b/src/assets/images/puzzle/zhangleping/12.png new file mode 100644 index 0000000..3b905f2 Binary files /dev/null and b/src/assets/images/puzzle/zhangleping/12.png differ diff --git a/src/assets/images/puzzle/zhangleping/13.png b/src/assets/images/puzzle/zhangleping/13.png new file mode 100644 index 0000000..afe5687 Binary files /dev/null and b/src/assets/images/puzzle/zhangleping/13.png differ diff --git a/src/assets/images/puzzle/zhangleping/14.png b/src/assets/images/puzzle/zhangleping/14.png new file mode 100644 index 0000000..8059891 Binary files /dev/null and b/src/assets/images/puzzle/zhangleping/14.png differ diff --git a/src/assets/images/puzzle/zhangleping/15.png b/src/assets/images/puzzle/zhangleping/15.png new file mode 100644 index 0000000..baa7cf9 Binary files /dev/null and b/src/assets/images/puzzle/zhangleping/15.png differ diff --git a/src/assets/images/puzzle/zhangleping/16.png b/src/assets/images/puzzle/zhangleping/16.png new file mode 100644 index 0000000..37aeb51 Binary files /dev/null and b/src/assets/images/puzzle/zhangleping/16.png differ diff --git a/src/assets/images/puzzle/zhangleping/2.png b/src/assets/images/puzzle/zhangleping/2.png new file mode 100644 index 0000000..38be0de Binary files /dev/null and b/src/assets/images/puzzle/zhangleping/2.png differ diff --git a/src/assets/images/puzzle/zhangleping/3.png b/src/assets/images/puzzle/zhangleping/3.png new file mode 100644 index 0000000..4df353a Binary files /dev/null and b/src/assets/images/puzzle/zhangleping/3.png differ diff --git a/src/assets/images/puzzle/zhangleping/4.png b/src/assets/images/puzzle/zhangleping/4.png new file mode 100644 index 0000000..e20d7a7 Binary files /dev/null and b/src/assets/images/puzzle/zhangleping/4.png differ diff --git a/src/assets/images/puzzle/zhangleping/5.png b/src/assets/images/puzzle/zhangleping/5.png new file mode 100644 index 0000000..aabc8dc Binary files /dev/null and b/src/assets/images/puzzle/zhangleping/5.png differ diff --git a/src/assets/images/puzzle/zhangleping/6.png b/src/assets/images/puzzle/zhangleping/6.png new file mode 100644 index 0000000..eccb9e1 Binary files /dev/null and b/src/assets/images/puzzle/zhangleping/6.png differ diff --git a/src/assets/images/puzzle/zhangleping/7.png b/src/assets/images/puzzle/zhangleping/7.png new file mode 100644 index 0000000..a53fdb8 Binary files /dev/null and b/src/assets/images/puzzle/zhangleping/7.png differ diff --git a/src/assets/images/puzzle/zhangleping/8.png b/src/assets/images/puzzle/zhangleping/8.png new file mode 100644 index 0000000..e4f6e69 Binary files /dev/null and b/src/assets/images/puzzle/zhangleping/8.png differ diff --git a/src/assets/images/puzzle/zhangleping/9.png b/src/assets/images/puzzle/zhangleping/9.png new file mode 100644 index 0000000..0675e8a Binary files /dev/null and b/src/assets/images/puzzle/zhangleping/9.png differ diff --git a/src/assets/images/puzzle/zhangleping/details/1.png b/src/assets/images/puzzle/zhangleping/details/1.png new file mode 100644 index 0000000..e3ce21b Binary files /dev/null and b/src/assets/images/puzzle/zhangleping/details/1.png differ diff --git a/src/assets/images/puzzle/zhangleping/details/10.png b/src/assets/images/puzzle/zhangleping/details/10.png new file mode 100644 index 0000000..b276617 Binary files /dev/null and b/src/assets/images/puzzle/zhangleping/details/10.png differ diff --git a/src/assets/images/puzzle/zhangleping/details/11.png b/src/assets/images/puzzle/zhangleping/details/11.png new file mode 100644 index 0000000..e6bf455 Binary files /dev/null and b/src/assets/images/puzzle/zhangleping/details/11.png differ diff --git a/src/assets/images/puzzle/zhangleping/details/12.png b/src/assets/images/puzzle/zhangleping/details/12.png new file mode 100644 index 0000000..2cd71e2 Binary files /dev/null and b/src/assets/images/puzzle/zhangleping/details/12.png differ diff --git a/src/assets/images/puzzle/zhangleping/details/13.png b/src/assets/images/puzzle/zhangleping/details/13.png new file mode 100644 index 0000000..ec31ea7 Binary files /dev/null and b/src/assets/images/puzzle/zhangleping/details/13.png differ diff --git a/src/assets/images/puzzle/zhangleping/details/14.png b/src/assets/images/puzzle/zhangleping/details/14.png new file mode 100644 index 0000000..0a3d5e0 Binary files /dev/null and b/src/assets/images/puzzle/zhangleping/details/14.png differ diff --git a/src/assets/images/puzzle/zhangleping/details/15.png b/src/assets/images/puzzle/zhangleping/details/15.png new file mode 100644 index 0000000..d333f4e Binary files /dev/null and b/src/assets/images/puzzle/zhangleping/details/15.png differ diff --git a/src/assets/images/puzzle/zhangleping/details/16.png b/src/assets/images/puzzle/zhangleping/details/16.png new file mode 100644 index 0000000..75e254b Binary files /dev/null and b/src/assets/images/puzzle/zhangleping/details/16.png differ diff --git a/src/assets/images/puzzle/zhangleping/details/2.png b/src/assets/images/puzzle/zhangleping/details/2.png new file mode 100644 index 0000000..5492682 Binary files /dev/null and b/src/assets/images/puzzle/zhangleping/details/2.png differ diff --git a/src/assets/images/puzzle/zhangleping/details/3.png b/src/assets/images/puzzle/zhangleping/details/3.png new file mode 100644 index 0000000..c4a55cc Binary files /dev/null and b/src/assets/images/puzzle/zhangleping/details/3.png differ diff --git a/src/assets/images/puzzle/zhangleping/details/4.png b/src/assets/images/puzzle/zhangleping/details/4.png new file mode 100644 index 0000000..f9f771f Binary files /dev/null and b/src/assets/images/puzzle/zhangleping/details/4.png differ diff --git a/src/assets/images/puzzle/zhangleping/details/5.png b/src/assets/images/puzzle/zhangleping/details/5.png new file mode 100644 index 0000000..f4e6c4c Binary files /dev/null and b/src/assets/images/puzzle/zhangleping/details/5.png differ diff --git a/src/assets/images/puzzle/zhangleping/details/6.png b/src/assets/images/puzzle/zhangleping/details/6.png new file mode 100644 index 0000000..065b01b Binary files /dev/null and b/src/assets/images/puzzle/zhangleping/details/6.png differ diff --git a/src/assets/images/puzzle/zhangleping/details/7.png b/src/assets/images/puzzle/zhangleping/details/7.png new file mode 100644 index 0000000..1895d23 Binary files /dev/null and b/src/assets/images/puzzle/zhangleping/details/7.png differ diff --git a/src/assets/images/puzzle/zhangleping/details/8.png b/src/assets/images/puzzle/zhangleping/details/8.png new file mode 100644 index 0000000..a0bfb85 Binary files /dev/null and b/src/assets/images/puzzle/zhangleping/details/8.png differ diff --git a/src/assets/images/puzzle/zhangleping/details/9.png b/src/assets/images/puzzle/zhangleping/details/9.png new file mode 100644 index 0000000..433caac Binary files /dev/null and b/src/assets/images/puzzle/zhangleping/details/9.png differ diff --git a/src/assets/images/puzzle/zhangleping/张乐平碎片底图.png b/src/assets/images/puzzle/zhangleping/张乐平碎片底图.png new file mode 100644 index 0000000..9fd77c9 Binary files /dev/null and b/src/assets/images/puzzle/zhangleping/张乐平碎片底图.png differ diff --git a/src/assets/images/rongdesheng/place1/场景1.png b/src/assets/images/rongdesheng/place1/场景1.png new file mode 100644 index 0000000..c34ea9b Binary files /dev/null and b/src/assets/images/rongdesheng/place1/场景1.png differ diff --git a/src/assets/images/rongdesheng/place1/场景1展品1.png b/src/assets/images/rongdesheng/place1/场景1展品1.png new file mode 100644 index 0000000..5d22e9c Binary files /dev/null and b/src/assets/images/rongdesheng/place1/场景1展品1.png differ diff --git a/src/assets/images/rongdesheng/place1/场景1展品2.png b/src/assets/images/rongdesheng/place1/场景1展品2.png new file mode 100644 index 0000000..2db3e99 Binary files /dev/null and b/src/assets/images/rongdesheng/place1/场景1展品2.png differ diff --git a/src/assets/images/rongdesheng/place2/场景2.png b/src/assets/images/rongdesheng/place2/场景2.png new file mode 100644 index 0000000..f89aac1 Binary files /dev/null and b/src/assets/images/rongdesheng/place2/场景2.png differ diff --git a/src/assets/images/rongdesheng/place2/场景2展品1.png b/src/assets/images/rongdesheng/place2/场景2展品1.png new file mode 100644 index 0000000..5290bf9 Binary files /dev/null and b/src/assets/images/rongdesheng/place2/场景2展品1.png differ diff --git a/src/assets/images/rongdesheng/place2/场景2展品2.png b/src/assets/images/rongdesheng/place2/场景2展品2.png new file mode 100644 index 0000000..6c0379e Binary files /dev/null and b/src/assets/images/rongdesheng/place2/场景2展品2.png differ diff --git a/src/assets/images/rongdesheng/place2/场景2展品3.png b/src/assets/images/rongdesheng/place2/场景2展品3.png new file mode 100644 index 0000000..186d488 Binary files /dev/null and b/src/assets/images/rongdesheng/place2/场景2展品3.png differ diff --git a/src/assets/images/rongdesheng/place2/场景2展品4.png b/src/assets/images/rongdesheng/place2/场景2展品4.png new file mode 100644 index 0000000..c3c11c6 Binary files /dev/null and b/src/assets/images/rongdesheng/place2/场景2展品4.png differ diff --git a/src/assets/images/rongdesheng/place2/场景2展品5.png b/src/assets/images/rongdesheng/place2/场景2展品5.png new file mode 100644 index 0000000..d7701de Binary files /dev/null and b/src/assets/images/rongdesheng/place2/场景2展品5.png differ diff --git a/src/assets/images/rongdesheng/place3/场景3.png b/src/assets/images/rongdesheng/place3/场景3.png new file mode 100644 index 0000000..69850da Binary files /dev/null and b/src/assets/images/rongdesheng/place3/场景3.png differ diff --git a/src/assets/images/rongdesheng/place3/场景3展品1.png b/src/assets/images/rongdesheng/place3/场景3展品1.png new file mode 100644 index 0000000..a371a28 Binary files /dev/null and b/src/assets/images/rongdesheng/place3/场景3展品1.png differ diff --git a/src/assets/images/rongdesheng/place3/场景3展品2.png b/src/assets/images/rongdesheng/place3/场景3展品2.png new file mode 100644 index 0000000..b592e7c Binary files /dev/null and b/src/assets/images/rongdesheng/place3/场景3展品2.png differ diff --git a/src/assets/images/rongdesheng/place3/场景3展品3.png b/src/assets/images/rongdesheng/place3/场景3展品3.png new file mode 100644 index 0000000..0426f60 Binary files /dev/null and b/src/assets/images/rongdesheng/place3/场景3展品3.png differ diff --git a/src/assets/images/rongdesheng/place4/场景4.png b/src/assets/images/rongdesheng/place4/场景4.png new file mode 100644 index 0000000..245ff72 Binary files /dev/null and b/src/assets/images/rongdesheng/place4/场景4.png differ diff --git a/src/assets/images/rongdesheng/place4/场景4展品1.png b/src/assets/images/rongdesheng/place4/场景4展品1.png new file mode 100644 index 0000000..c82cf4a Binary files /dev/null and b/src/assets/images/rongdesheng/place4/场景4展品1.png differ diff --git a/src/assets/images/rongdesheng/place4/场景4展品2.png b/src/assets/images/rongdesheng/place4/场景4展品2.png new file mode 100644 index 0000000..b69301a Binary files /dev/null and b/src/assets/images/rongdesheng/place4/场景4展品2.png differ diff --git a/src/assets/images/rongdesheng/place4/场景4展品3.png b/src/assets/images/rongdesheng/place4/场景4展品3.png new file mode 100644 index 0000000..235631a Binary files /dev/null and b/src/assets/images/rongdesheng/place4/场景4展品3.png differ diff --git a/src/assets/images/rongdesheng/place4/场景4展品4.png b/src/assets/images/rongdesheng/place4/场景4展品4.png new file mode 100644 index 0000000..c32d6fd Binary files /dev/null and b/src/assets/images/rongdesheng/place4/场景4展品4.png differ diff --git a/src/assets/images/rongdesheng/reflection/交互底板.png b/src/assets/images/rongdesheng/reflection/交互底板.png new file mode 100644 index 0000000..4a8d930 Binary files /dev/null and b/src/assets/images/rongdesheng/reflection/交互底板.png differ diff --git a/src/assets/images/rongdesheng/reflection/合成坚守图谱.png b/src/assets/images/rongdesheng/reflection/合成坚守图谱.png new file mode 100644 index 0000000..fdd18f3 Binary files /dev/null and b/src/assets/images/rongdesheng/reflection/合成坚守图谱.png differ diff --git a/src/assets/images/rongdesheng/reflection/场景1结算.png b/src/assets/images/rongdesheng/reflection/场景1结算.png new file mode 100644 index 0000000..9181bcc Binary files /dev/null and b/src/assets/images/rongdesheng/reflection/场景1结算.png differ diff --git a/src/assets/images/rongdesheng/reflection/场景1选中.png b/src/assets/images/rongdesheng/reflection/场景1选中.png new file mode 100644 index 0000000..84ac8ad Binary files /dev/null and b/src/assets/images/rongdesheng/reflection/场景1选中.png differ diff --git a/src/assets/images/rongdesheng/reflection/场景2图.png b/src/assets/images/rongdesheng/reflection/场景2图.png new file mode 100644 index 0000000..0bf7e08 Binary files /dev/null and b/src/assets/images/rongdesheng/reflection/场景2图.png differ diff --git a/src/assets/images/rongdesheng/reflection/场景2结算.png b/src/assets/images/rongdesheng/reflection/场景2结算.png new file mode 100644 index 0000000..9129076 Binary files /dev/null and b/src/assets/images/rongdesheng/reflection/场景2结算.png differ diff --git a/src/assets/images/rongdesheng/reflection/场景2选中.png b/src/assets/images/rongdesheng/reflection/场景2选中.png new file mode 100644 index 0000000..73208bf Binary files /dev/null and b/src/assets/images/rongdesheng/reflection/场景2选中.png differ diff --git a/src/assets/images/rongdesheng/reflection/场景3结算.png b/src/assets/images/rongdesheng/reflection/场景3结算.png new file mode 100644 index 0000000..8e45b5f Binary files /dev/null and b/src/assets/images/rongdesheng/reflection/场景3结算.png differ diff --git a/src/assets/images/rongdesheng/reflection/场景3选中.png b/src/assets/images/rongdesheng/reflection/场景3选中.png new file mode 100644 index 0000000..6538b82 Binary files /dev/null and b/src/assets/images/rongdesheng/reflection/场景3选中.png differ diff --git a/src/assets/images/rongdesheng/reflection/场景4结算.png b/src/assets/images/rongdesheng/reflection/场景4结算.png new file mode 100644 index 0000000..96278e0 Binary files /dev/null and b/src/assets/images/rongdesheng/reflection/场景4结算.png differ diff --git a/src/assets/images/rongdesheng/reflection/场景4选中.png b/src/assets/images/rongdesheng/reflection/场景4选中.png new file mode 100644 index 0000000..19918e0 Binary files /dev/null and b/src/assets/images/rongdesheng/reflection/场景4选中.png differ diff --git a/src/assets/images/rongdesheng/reflection/场景5结算.png b/src/assets/images/rongdesheng/reflection/场景5结算.png new file mode 100644 index 0000000..adb5973 Binary files /dev/null and b/src/assets/images/rongdesheng/reflection/场景5结算.png differ diff --git a/src/assets/images/rongdesheng/reflection/场景5选中.png b/src/assets/images/rongdesheng/reflection/场景5选中.png new file mode 100644 index 0000000..21cec72 Binary files /dev/null and b/src/assets/images/rongdesheng/reflection/场景5选中.png differ diff --git a/src/assets/images/rongdesheng/reflection/场景6.png b/src/assets/images/rongdesheng/reflection/场景6.png new file mode 100644 index 0000000..6ebac49 Binary files /dev/null and b/src/assets/images/rongdesheng/reflection/场景6.png differ diff --git a/src/assets/images/rongdesheng/reflection/已浏览.png b/src/assets/images/rongdesheng/reflection/已浏览.png new file mode 100644 index 0000000..22d2816 Binary files /dev/null and b/src/assets/images/rongdesheng/reflection/已浏览.png differ diff --git a/src/assets/images/rongdesheng/reflection/抬头.png b/src/assets/images/rongdesheng/reflection/抬头.png new file mode 100644 index 0000000..abd4975 Binary files /dev/null and b/src/assets/images/rongdesheng/reflection/抬头.png differ diff --git a/src/assets/images/rongdesheng/reflection/按钮-亮.png b/src/assets/images/rongdesheng/reflection/按钮-亮.png new file mode 100644 index 0000000..875154d Binary files /dev/null and b/src/assets/images/rongdesheng/reflection/按钮-亮.png differ diff --git a/src/assets/images/rongdesheng/reflection/按钮-灰.png b/src/assets/images/rongdesheng/reflection/按钮-灰.png new file mode 100644 index 0000000..11def6b Binary files /dev/null and b/src/assets/images/rongdesheng/reflection/按钮-灰.png differ diff --git a/src/assets/images/rongdesheng/reflection/提示版.png b/src/assets/images/rongdesheng/reflection/提示版.png new file mode 100644 index 0000000..b71847c Binary files /dev/null and b/src/assets/images/rongdesheng/reflection/提示版.png differ diff --git a/src/assets/images/rongdesheng/reflection/未选中模块.png b/src/assets/images/rongdesheng/reflection/未选中模块.png new file mode 100644 index 0000000..22a22e6 Binary files /dev/null and b/src/assets/images/rongdesheng/reflection/未选中模块.png differ diff --git a/src/assets/images/rongdesheng/reflection/标题.png b/src/assets/images/rongdesheng/reflection/标题.png new file mode 100644 index 0000000..674918a Binary files /dev/null and b/src/assets/images/rongdesheng/reflection/标题.png differ diff --git a/src/assets/images/rongdesheng/reflection/正确.png b/src/assets/images/rongdesheng/reflection/正确.png new file mode 100644 index 0000000..16eeeb0 Binary files /dev/null and b/src/assets/images/rongdesheng/reflection/正确.png differ diff --git a/src/assets/images/rongdesheng/reflection/气泡.png b/src/assets/images/rongdesheng/reflection/气泡.png new file mode 100644 index 0000000..8aa710d Binary files /dev/null and b/src/assets/images/rongdesheng/reflection/气泡.png differ diff --git a/src/assets/images/rongdesheng/reflection/选中模块.png b/src/assets/images/rongdesheng/reflection/选中模块.png new file mode 100644 index 0000000..f350a3d Binary files /dev/null and b/src/assets/images/rongdesheng/reflection/选中模块.png differ diff --git a/src/assets/images/rongdesheng/reflection/选项底板-选中.png b/src/assets/images/rongdesheng/reflection/选项底板-选中.png new file mode 100644 index 0000000..9cc4d30 Binary files /dev/null and b/src/assets/images/rongdesheng/reflection/选项底板-选中.png differ diff --git a/src/assets/images/rongdesheng/reflection/选项底板.png b/src/assets/images/rongdesheng/reflection/选项底板.png new file mode 100644 index 0000000..fcaa3b5 Binary files /dev/null and b/src/assets/images/rongdesheng/reflection/选项底板.png differ diff --git a/src/assets/images/rongdesheng/reflection/错误.png b/src/assets/images/rongdesheng/reflection/错误.png new file mode 100644 index 0000000..73391fb Binary files /dev/null and b/src/assets/images/rongdesheng/reflection/错误.png differ diff --git a/src/assets/images/rongdesheng/底图.png b/src/assets/images/rongdesheng/底图.png new file mode 100644 index 0000000..f474bd5 Binary files /dev/null and b/src/assets/images/rongdesheng/底图.png differ diff --git a/src/assets/images/sunzhongshan/reflection/scene2/线索3-详情的详情.png b/src/assets/images/sunzhongshan/reflection/scene2/线索3-详情的详情.png index 2c2c913..6b9dfc1 100644 Binary files a/src/assets/images/sunzhongshan/reflection/scene2/线索3-详情的详情.png and b/src/assets/images/sunzhongshan/reflection/scene2/线索3-详情的详情.png differ diff --git a/src/assets/images/zhangleping/place2/张乐平场景2展品1.png b/src/assets/images/zhangleping/place2/张乐平场景2展品1.png index 93de0e6..7779e83 100644 Binary files a/src/assets/images/zhangleping/place2/张乐平场景2展品1.png and b/src/assets/images/zhangleping/place2/张乐平场景2展品1.png differ diff --git a/src/assets/images/zhangleping/place2/张乐平场景2展品3.png b/src/assets/images/zhangleping/place2/张乐平场景2展品3.png index 7779e83..93de0e6 100644 Binary files a/src/assets/images/zhangleping/place2/张乐平场景2展品3.png and b/src/assets/images/zhangleping/place2/张乐平场景2展品3.png differ diff --git a/src/assets/images/zhangleping/place3/张乐平场景3展品1.png b/src/assets/images/zhangleping/place3/张乐平场景3展品1.png index 421cc82..be7b2d3 100644 Binary files a/src/assets/images/zhangleping/place3/张乐平场景3展品1.png and b/src/assets/images/zhangleping/place3/张乐平场景3展品1.png differ diff --git a/src/assets/images/zhangleping/place3/张乐平场景3展品3.png b/src/assets/images/zhangleping/place3/张乐平场景3展品3.png index be7b2d3..421cc82 100644 Binary files a/src/assets/images/zhangleping/place3/张乐平场景3展品3.png and b/src/assets/images/zhangleping/place3/张乐平场景3展品3.png differ diff --git a/src/assets/images/zhangleping/reflection/clue/内嵌基底1.png b/src/assets/images/zhangleping/reflection/clue/内嵌基底1.png new file mode 100644 index 0000000..3ebc965 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/clue/内嵌基底1.png differ diff --git a/src/assets/images/zhangleping/reflection/clue/内嵌基底2.png b/src/assets/images/zhangleping/reflection/clue/内嵌基底2.png new file mode 100644 index 0000000..ef509d6 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/clue/内嵌基底2.png differ diff --git a/src/assets/images/zhangleping/reflection/clue/内嵌基底3.png b/src/assets/images/zhangleping/reflection/clue/内嵌基底3.png new file mode 100644 index 0000000..54e5188 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/clue/内嵌基底3.png differ diff --git a/src/assets/images/zhangleping/reflection/clue/内嵌基底4.png b/src/assets/images/zhangleping/reflection/clue/内嵌基底4.png new file mode 100644 index 0000000..987651f Binary files /dev/null and b/src/assets/images/zhangleping/reflection/clue/内嵌基底4.png differ diff --git a/src/assets/images/zhangleping/reflection/clue/内嵌基底5.png b/src/assets/images/zhangleping/reflection/clue/内嵌基底5.png new file mode 100644 index 0000000..e1f9023 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/clue/内嵌基底5.png differ diff --git a/src/assets/images/zhangleping/reflection/clue/泡泡.png b/src/assets/images/zhangleping/reflection/clue/泡泡.png new file mode 100644 index 0000000..1232b7a Binary files /dev/null and b/src/assets/images/zhangleping/reflection/clue/泡泡.png differ diff --git a/src/assets/images/zhangleping/reflection/clue/碎片1.png b/src/assets/images/zhangleping/reflection/clue/碎片1.png new file mode 100644 index 0000000..85b63b2 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/clue/碎片1.png differ diff --git a/src/assets/images/zhangleping/reflection/clue/碎片2.png b/src/assets/images/zhangleping/reflection/clue/碎片2.png new file mode 100644 index 0000000..36fbffe Binary files /dev/null and b/src/assets/images/zhangleping/reflection/clue/碎片2.png differ diff --git a/src/assets/images/zhangleping/reflection/clue/碎片3.png b/src/assets/images/zhangleping/reflection/clue/碎片3.png new file mode 100644 index 0000000..0c3c9d9 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/clue/碎片3.png differ diff --git a/src/assets/images/zhangleping/reflection/clue/碎片4.png b/src/assets/images/zhangleping/reflection/clue/碎片4.png new file mode 100644 index 0000000..46b127d Binary files /dev/null and b/src/assets/images/zhangleping/reflection/clue/碎片4.png differ diff --git a/src/assets/images/zhangleping/reflection/clue/碎片5.png b/src/assets/images/zhangleping/reflection/clue/碎片5.png new file mode 100644 index 0000000..8720e14 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/clue/碎片5.png differ diff --git a/src/assets/images/zhangleping/reflection/draw/任务提示.png b/src/assets/images/zhangleping/reflection/draw/任务提示.png new file mode 100644 index 0000000..72d57db Binary files /dev/null and b/src/assets/images/zhangleping/reflection/draw/任务提示.png differ diff --git a/src/assets/images/zhangleping/reflection/draw/写字底板.png b/src/assets/images/zhangleping/reflection/draw/写字底板.png new file mode 100644 index 0000000..67e9952 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/draw/写字底板.png differ diff --git a/src/assets/images/zhangleping/reflection/draw/创作任务面板.png b/src/assets/images/zhangleping/reflection/draw/创作任务面板.png new file mode 100644 index 0000000..f42ead0 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/draw/创作任务面板.png differ diff --git a/src/assets/images/zhangleping/reflection/draw/布景/云端航迹.png b/src/assets/images/zhangleping/reflection/draw/布景/云端航迹.png new file mode 100644 index 0000000..9933ae9 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/draw/布景/云端航迹.png differ diff --git a/src/assets/images/zhangleping/reflection/draw/布景/助农直播.png b/src/assets/images/zhangleping/reflection/draw/布景/助农直播.png new file mode 100644 index 0000000..1d89450 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/draw/布景/助农直播.png differ diff --git a/src/assets/images/zhangleping/reflection/draw/布景/匠心赛场.png b/src/assets/images/zhangleping/reflection/draw/布景/匠心赛场.png new file mode 100644 index 0000000..4c5f4a1 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/draw/布景/匠心赛场.png differ diff --git a/src/assets/images/zhangleping/reflection/draw/布景/垃圾分类.png b/src/assets/images/zhangleping/reflection/draw/布景/垃圾分类.png new file mode 100644 index 0000000..ee8ffd0 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/draw/布景/垃圾分类.png differ diff --git a/src/assets/images/zhangleping/reflection/draw/布景/城际高铁.png b/src/assets/images/zhangleping/reflection/draw/布景/城际高铁.png new file mode 100644 index 0000000..925eca5 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/draw/布景/城际高铁.png differ diff --git a/src/assets/images/zhangleping/reflection/draw/布景/天际航拍.png b/src/assets/images/zhangleping/reflection/draw/布景/天际航拍.png new file mode 100644 index 0000000..9e37825 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/draw/布景/天际航拍.png differ diff --git a/src/assets/images/zhangleping/reflection/draw/布景/智能实训.png b/src/assets/images/zhangleping/reflection/draw/布景/智能实训.png new file mode 100644 index 0000000..ca9f997 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/draw/布景/智能实训.png differ diff --git a/src/assets/images/zhangleping/reflection/draw/布景/暖心社区.png b/src/assets/images/zhangleping/reflection/draw/布景/暖心社区.png new file mode 100644 index 0000000..7bb7e06 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/draw/布景/暖心社区.png differ diff --git a/src/assets/images/zhangleping/reflection/draw/布景/绿色出行.png b/src/assets/images/zhangleping/reflection/draw/布景/绿色出行.png new file mode 100644 index 0000000..2512fc2 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/draw/布景/绿色出行.png differ diff --git a/src/assets/images/zhangleping/reflection/draw/布景/野外旅途.png b/src/assets/images/zhangleping/reflection/draw/布景/野外旅途.png new file mode 100644 index 0000000..02c1a49 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/draw/布景/野外旅途.png differ diff --git a/src/assets/images/zhangleping/reflection/draw/布景/青春展台.png b/src/assets/images/zhangleping/reflection/draw/布景/青春展台.png new file mode 100644 index 0000000..67dbf1f Binary files /dev/null and b/src/assets/images/zhangleping/reflection/draw/布景/青春展台.png differ diff --git a/src/assets/images/zhangleping/reflection/draw/布景条.png b/src/assets/images/zhangleping/reflection/draw/布景条.png new file mode 100644 index 0000000..a67e3a4 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/draw/布景条.png differ diff --git a/src/assets/images/zhangleping/reflection/draw/开始创作.png b/src/assets/images/zhangleping/reflection/draw/开始创作.png new file mode 100644 index 0000000..0f95d2b Binary files /dev/null and b/src/assets/images/zhangleping/reflection/draw/开始创作.png differ diff --git a/src/assets/images/zhangleping/reflection/draw/提交作品.png b/src/assets/images/zhangleping/reflection/draw/提交作品.png new file mode 100644 index 0000000..af8b3d5 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/draw/提交作品.png differ diff --git a/src/assets/images/zhangleping/reflection/draw/替换布景.png b/src/assets/images/zhangleping/reflection/draw/替换布景.png new file mode 100644 index 0000000..d5c084f Binary files /dev/null and b/src/assets/images/zhangleping/reflection/draw/替换布景.png differ diff --git a/src/assets/images/zhangleping/reflection/draw/画布区域参考(素材和人都不出这个区域).png b/src/assets/images/zhangleping/reflection/draw/画布区域参考(素材和人都不出这个区域).png new file mode 100644 index 0000000..bb4bcb7 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/draw/画布区域参考(素材和人都不出这个区域).png differ diff --git a/src/assets/images/zhangleping/reflection/draw/画板底图.png b/src/assets/images/zhangleping/reflection/draw/画板底图.png new file mode 100644 index 0000000..041bcda Binary files /dev/null and b/src/assets/images/zhangleping/reflection/draw/画板底图.png differ diff --git a/src/assets/images/zhangleping/reflection/draw/素材库.png b/src/assets/images/zhangleping/reflection/draw/素材库.png new file mode 100644 index 0000000..48f8a0b Binary files /dev/null and b/src/assets/images/zhangleping/reflection/draw/素材库.png differ diff --git a/src/assets/images/zhangleping/reflection/draw/素材库/垃圾.png b/src/assets/images/zhangleping/reflection/draw/素材库/垃圾.png new file mode 100644 index 0000000..9befd38 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/draw/素材库/垃圾.png differ diff --git a/src/assets/images/zhangleping/reflection/draw/素材库/奖杯.png b/src/assets/images/zhangleping/reflection/draw/素材库/奖杯.png new file mode 100644 index 0000000..3db0192 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/draw/素材库/奖杯.png differ diff --git a/src/assets/images/zhangleping/reflection/draw/素材库/奖状.png b/src/assets/images/zhangleping/reflection/draw/素材库/奖状.png new file mode 100644 index 0000000..5ef2b49 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/draw/素材库/奖状.png differ diff --git a/src/assets/images/zhangleping/reflection/draw/素材库/安全帽.png b/src/assets/images/zhangleping/reflection/draw/素材库/安全帽.png new file mode 100644 index 0000000..3a16946 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/draw/素材库/安全帽.png differ diff --git a/src/assets/images/zhangleping/reflection/draw/素材库/宣传单.png b/src/assets/images/zhangleping/reflection/draw/素材库/宣传单.png new file mode 100644 index 0000000..aeeaf02 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/draw/素材库/宣传单.png differ diff --git a/src/assets/images/zhangleping/reflection/draw/素材库/志愿者.png b/src/assets/images/zhangleping/reflection/draw/素材库/志愿者.png new file mode 100644 index 0000000..98c0eae Binary files /dev/null and b/src/assets/images/zhangleping/reflection/draw/素材库/志愿者.png differ diff --git a/src/assets/images/zhangleping/reflection/draw/素材库/手机.png b/src/assets/images/zhangleping/reflection/draw/素材库/手机.png new file mode 100644 index 0000000..c504a53 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/draw/素材库/手机.png differ diff --git a/src/assets/images/zhangleping/reflection/draw/素材库/无人机.png b/src/assets/images/zhangleping/reflection/draw/素材库/无人机.png new file mode 100644 index 0000000..7abe95c Binary files /dev/null and b/src/assets/images/zhangleping/reflection/draw/素材库/无人机.png differ diff --git a/src/assets/images/zhangleping/reflection/draw/素材库/水.png b/src/assets/images/zhangleping/reflection/draw/素材库/水.png new file mode 100644 index 0000000..4f18ccd Binary files /dev/null and b/src/assets/images/zhangleping/reflection/draw/素材库/水.png differ diff --git a/src/assets/images/zhangleping/reflection/draw/素材库/火车票.png b/src/assets/images/zhangleping/reflection/draw/素材库/火车票.png new file mode 100644 index 0000000..9c8f563 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/draw/素材库/火车票.png differ diff --git a/src/assets/images/zhangleping/reflection/draw/素材库/耳机.png b/src/assets/images/zhangleping/reflection/draw/素材库/耳机.png new file mode 100644 index 0000000..fa39889 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/draw/素材库/耳机.png differ diff --git a/src/assets/images/zhangleping/reflection/draw/素材库/背包.png b/src/assets/images/zhangleping/reflection/draw/素材库/背包.png new file mode 100644 index 0000000..a79a23e Binary files /dev/null and b/src/assets/images/zhangleping/reflection/draw/素材库/背包.png differ diff --git a/src/assets/images/zhangleping/reflection/draw/素材库/苹果.png b/src/assets/images/zhangleping/reflection/draw/素材库/苹果.png new file mode 100644 index 0000000..2c9f4ae Binary files /dev/null and b/src/assets/images/zhangleping/reflection/draw/素材库/苹果.png differ diff --git a/src/assets/images/zhangleping/reflection/draw/素材库/行李箱.png b/src/assets/images/zhangleping/reflection/draw/素材库/行李箱.png new file mode 100644 index 0000000..75d923b Binary files /dev/null and b/src/assets/images/zhangleping/reflection/draw/素材库/行李箱.png differ diff --git a/src/assets/images/zhangleping/reflection/draw/素材库/话筒.png b/src/assets/images/zhangleping/reflection/draw/素材库/话筒.png new file mode 100644 index 0000000..2dd80c1 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/draw/素材库/话筒.png differ diff --git a/src/assets/images/zhangleping/reflection/draw/素材库/贴纸/贴纸垃圾.png b/src/assets/images/zhangleping/reflection/draw/素材库/贴纸/贴纸垃圾.png new file mode 100644 index 0000000..d263f72 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/draw/素材库/贴纸/贴纸垃圾.png differ diff --git a/src/assets/images/zhangleping/reflection/draw/素材库/贴纸/贴纸奖杯.png b/src/assets/images/zhangleping/reflection/draw/素材库/贴纸/贴纸奖杯.png new file mode 100644 index 0000000..1bbed56 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/draw/素材库/贴纸/贴纸奖杯.png differ diff --git a/src/assets/images/zhangleping/reflection/draw/素材库/贴纸/贴纸奖状.png b/src/assets/images/zhangleping/reflection/draw/素材库/贴纸/贴纸奖状.png new file mode 100644 index 0000000..99e521d Binary files /dev/null and b/src/assets/images/zhangleping/reflection/draw/素材库/贴纸/贴纸奖状.png differ diff --git a/src/assets/images/zhangleping/reflection/draw/素材库/贴纸/贴纸宣传单.png b/src/assets/images/zhangleping/reflection/draw/素材库/贴纸/贴纸宣传单.png new file mode 100644 index 0000000..4564c03 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/draw/素材库/贴纸/贴纸宣传单.png differ diff --git a/src/assets/images/zhangleping/reflection/draw/素材库/贴纸/贴纸帽子.png b/src/assets/images/zhangleping/reflection/draw/素材库/贴纸/贴纸帽子.png new file mode 100644 index 0000000..1779106 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/draw/素材库/贴纸/贴纸帽子.png differ diff --git a/src/assets/images/zhangleping/reflection/draw/素材库/贴纸/贴纸志愿者.png b/src/assets/images/zhangleping/reflection/draw/素材库/贴纸/贴纸志愿者.png new file mode 100644 index 0000000..ffa1682 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/draw/素材库/贴纸/贴纸志愿者.png differ diff --git a/src/assets/images/zhangleping/reflection/draw/素材库/贴纸/贴纸手机.png b/src/assets/images/zhangleping/reflection/draw/素材库/贴纸/贴纸手机.png new file mode 100644 index 0000000..d974d98 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/draw/素材库/贴纸/贴纸手机.png differ diff --git a/src/assets/images/zhangleping/reflection/draw/素材库/贴纸/贴纸无人机.png b/src/assets/images/zhangleping/reflection/draw/素材库/贴纸/贴纸无人机.png new file mode 100644 index 0000000..264a12d Binary files /dev/null and b/src/assets/images/zhangleping/reflection/draw/素材库/贴纸/贴纸无人机.png differ diff --git a/src/assets/images/zhangleping/reflection/draw/素材库/贴纸/贴纸火车票.png b/src/assets/images/zhangleping/reflection/draw/素材库/贴纸/贴纸火车票.png new file mode 100644 index 0000000..cdaa8e1 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/draw/素材库/贴纸/贴纸火车票.png differ diff --git a/src/assets/images/zhangleping/reflection/draw/素材库/贴纸/贴纸矿泉水瓶.png b/src/assets/images/zhangleping/reflection/draw/素材库/贴纸/贴纸矿泉水瓶.png new file mode 100644 index 0000000..81ea6a8 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/draw/素材库/贴纸/贴纸矿泉水瓶.png differ diff --git a/src/assets/images/zhangleping/reflection/draw/素材库/贴纸/贴纸耳机.png b/src/assets/images/zhangleping/reflection/draw/素材库/贴纸/贴纸耳机.png new file mode 100644 index 0000000..62cb723 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/draw/素材库/贴纸/贴纸耳机.png differ diff --git a/src/assets/images/zhangleping/reflection/draw/素材库/贴纸/贴纸背包.png b/src/assets/images/zhangleping/reflection/draw/素材库/贴纸/贴纸背包.png new file mode 100644 index 0000000..c66bc6b Binary files /dev/null and b/src/assets/images/zhangleping/reflection/draw/素材库/贴纸/贴纸背包.png differ diff --git a/src/assets/images/zhangleping/reflection/draw/素材库/贴纸/贴纸苹果.png b/src/assets/images/zhangleping/reflection/draw/素材库/贴纸/贴纸苹果.png new file mode 100644 index 0000000..1f54a1c Binary files /dev/null and b/src/assets/images/zhangleping/reflection/draw/素材库/贴纸/贴纸苹果.png differ diff --git a/src/assets/images/zhangleping/reflection/draw/素材库/贴纸/贴纸行李箱.png b/src/assets/images/zhangleping/reflection/draw/素材库/贴纸/贴纸行李箱.png new file mode 100644 index 0000000..e6e4776 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/draw/素材库/贴纸/贴纸行李箱.png differ diff --git a/src/assets/images/zhangleping/reflection/draw/素材库/贴纸/贴纸话筒.png b/src/assets/images/zhangleping/reflection/draw/素材库/贴纸/贴纸话筒.png new file mode 100644 index 0000000..00b104e Binary files /dev/null and b/src/assets/images/zhangleping/reflection/draw/素材库/贴纸/贴纸话筒.png differ diff --git a/src/assets/images/zhangleping/reflection/draw/素材库/贴纸/贴纸车.png b/src/assets/images/zhangleping/reflection/draw/素材库/贴纸/贴纸车.png new file mode 100644 index 0000000..5f43938 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/draw/素材库/贴纸/贴纸车.png differ diff --git a/src/assets/images/zhangleping/reflection/draw/素材库/贴纸/贴纸遥控.png b/src/assets/images/zhangleping/reflection/draw/素材库/贴纸/贴纸遥控.png new file mode 100644 index 0000000..eb2bde1 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/draw/素材库/贴纸/贴纸遥控.png differ diff --git a/src/assets/images/zhangleping/reflection/draw/素材库/贴纸/贴纸飞机票.png b/src/assets/images/zhangleping/reflection/draw/素材库/贴纸/贴纸飞机票.png new file mode 100644 index 0000000..b4e0da5 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/draw/素材库/贴纸/贴纸飞机票.png differ diff --git a/src/assets/images/zhangleping/reflection/draw/素材库/车.png b/src/assets/images/zhangleping/reflection/draw/素材库/车.png new file mode 100644 index 0000000..ce15d4a Binary files /dev/null and b/src/assets/images/zhangleping/reflection/draw/素材库/车.png differ diff --git a/src/assets/images/zhangleping/reflection/draw/素材库/遥控器.png b/src/assets/images/zhangleping/reflection/draw/素材库/遥控器.png new file mode 100644 index 0000000..94ba7f6 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/draw/素材库/遥控器.png differ diff --git a/src/assets/images/zhangleping/reflection/draw/素材库/飞机票.png b/src/assets/images/zhangleping/reflection/draw/素材库/飞机票.png new file mode 100644 index 0000000..9278a61 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/draw/素材库/飞机票.png differ diff --git a/src/assets/images/zhangleping/reflection/draw/素材库条.png b/src/assets/images/zhangleping/reflection/draw/素材库条.png new file mode 100644 index 0000000..20109e9 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/draw/素材库条.png differ diff --git a/src/assets/images/zhangleping/reflection/draw/衣柜.png b/src/assets/images/zhangleping/reflection/draw/衣柜.png new file mode 100644 index 0000000..793caf3 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/draw/衣柜.png differ diff --git a/src/assets/images/zhangleping/reflection/draw/衣柜/休闲.png b/src/assets/images/zhangleping/reflection/draw/衣柜/休闲.png new file mode 100644 index 0000000..50514f7 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/draw/衣柜/休闲.png differ diff --git a/src/assets/images/zhangleping/reflection/draw/衣柜/校服.png b/src/assets/images/zhangleping/reflection/draw/衣柜/校服.png new file mode 100644 index 0000000..8711ce7 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/draw/衣柜/校服.png differ diff --git a/src/assets/images/zhangleping/reflection/draw/衣柜/默认.png b/src/assets/images/zhangleping/reflection/draw/衣柜/默认.png new file mode 100644 index 0000000..ed13078 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/draw/衣柜/默认.png differ diff --git a/src/assets/images/zhangleping/reflection/draw/衣柜条.png b/src/assets/images/zhangleping/reflection/draw/衣柜条.png new file mode 100644 index 0000000..382d4de Binary files /dev/null and b/src/assets/images/zhangleping/reflection/draw/衣柜条.png differ diff --git a/src/assets/images/zhangleping/reflection/draw/返回.png b/src/assets/images/zhangleping/reflection/draw/返回.png new file mode 100644 index 0000000..2bd6dd9 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/draw/返回.png differ diff --git a/src/assets/images/zhangleping/reflection/draw/选中.png b/src/assets/images/zhangleping/reflection/draw/选中.png new file mode 100644 index 0000000..8b5b466 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/draw/选中.png differ diff --git a/src/assets/images/zhangleping/reflection/home/场景1入口.png b/src/assets/images/zhangleping/reflection/home/场景1入口.png new file mode 100644 index 0000000..d87c2ca Binary files /dev/null and b/src/assets/images/zhangleping/reflection/home/场景1入口.png differ diff --git a/src/assets/images/zhangleping/reflection/home/场景2入口.png b/src/assets/images/zhangleping/reflection/home/场景2入口.png new file mode 100644 index 0000000..75a3294 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/home/场景2入口.png differ diff --git a/src/assets/images/zhangleping/reflection/home/场景3入口.png b/src/assets/images/zhangleping/reflection/home/场景3入口.png new file mode 100644 index 0000000..4a18d35 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/home/场景3入口.png differ diff --git a/src/assets/images/zhangleping/reflection/home/场景4入口.png b/src/assets/images/zhangleping/reflection/home/场景4入口.png new file mode 100644 index 0000000..033660b Binary files /dev/null and b/src/assets/images/zhangleping/reflection/home/场景4入口.png differ diff --git a/src/assets/images/zhangleping/reflection/home/场景5入口.png b/src/assets/images/zhangleping/reflection/home/场景5入口.png new file mode 100644 index 0000000..0bb8490 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/home/场景5入口.png differ diff --git a/src/assets/images/zhangleping/reflection/home/导览图底图.png b/src/assets/images/zhangleping/reflection/home/导览图底图.png new file mode 100644 index 0000000..70e549e Binary files /dev/null and b/src/assets/images/zhangleping/reflection/home/导览图底图.png differ diff --git a/src/assets/images/zhangleping/reflection/home/敲章.png b/src/assets/images/zhangleping/reflection/home/敲章.png new file mode 100644 index 0000000..ff59985 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/home/敲章.png differ diff --git a/src/assets/images/zhangleping/reflection/home/未开放.png b/src/assets/images/zhangleping/reflection/home/未开放.png new file mode 100644 index 0000000..65c9f34 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/home/未开放.png differ diff --git a/src/assets/images/zhangleping/reflection/home/点击进入.png b/src/assets/images/zhangleping/reflection/home/点击进入.png new file mode 100644 index 0000000..267c27c Binary files /dev/null and b/src/assets/images/zhangleping/reflection/home/点击进入.png differ diff --git a/src/assets/images/zhangleping/reflection/scene1/bg.png b/src/assets/images/zhangleping/reflection/scene1/bg.png new file mode 100644 index 0000000..e249706 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/scene1/bg.png differ diff --git a/src/assets/images/zhangleping/reflection/scene1/场景-拖拽.png b/src/assets/images/zhangleping/reflection/scene1/场景-拖拽.png new file mode 100644 index 0000000..afa322e Binary files /dev/null and b/src/assets/images/zhangleping/reflection/scene1/场景-拖拽.png differ diff --git a/src/assets/images/zhangleping/reflection/scene1/场景-进入.png b/src/assets/images/zhangleping/reflection/scene1/场景-进入.png new file mode 100644 index 0000000..6201712 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/scene1/场景-进入.png differ diff --git a/src/assets/images/zhangleping/reflection/scene1/场景1展品1.png b/src/assets/images/zhangleping/reflection/scene1/场景1展品1.png new file mode 100644 index 0000000..82fca80 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/scene1/场景1展品1.png differ diff --git a/src/assets/images/zhangleping/reflection/scene1/场景1展品2反面.png b/src/assets/images/zhangleping/reflection/scene1/场景1展品2反面.png new file mode 100644 index 0000000..f0023ff Binary files /dev/null and b/src/assets/images/zhangleping/reflection/scene1/场景1展品2反面.png differ diff --git a/src/assets/images/zhangleping/reflection/scene1/场景1展品2正面.png b/src/assets/images/zhangleping/reflection/scene1/场景1展品2正面.png new file mode 100644 index 0000000..b3ecc9f Binary files /dev/null and b/src/assets/images/zhangleping/reflection/scene1/场景1展品2正面.png differ diff --git a/src/assets/images/zhangleping/reflection/scene1/场景1拖拽1.png b/src/assets/images/zhangleping/reflection/scene1/场景1拖拽1.png new file mode 100644 index 0000000..3cd0bab Binary files /dev/null and b/src/assets/images/zhangleping/reflection/scene1/场景1拖拽1.png differ diff --git a/src/assets/images/zhangleping/reflection/scene1/场景1拖拽2.png b/src/assets/images/zhangleping/reflection/scene1/场景1拖拽2.png new file mode 100644 index 0000000..8059e05 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/scene1/场景1拖拽2.png differ diff --git a/src/assets/images/zhangleping/reflection/scene1/场景1拖拽3.png b/src/assets/images/zhangleping/reflection/scene1/场景1拖拽3.png new file mode 100644 index 0000000..a619422 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/scene1/场景1拖拽3.png differ diff --git a/src/assets/images/zhangleping/reflection/scene1/碎片1详情.png b/src/assets/images/zhangleping/reflection/scene1/碎片1详情.png new file mode 100644 index 0000000..21d9de6 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/scene1/碎片1详情.png differ diff --git a/src/assets/images/zhangleping/reflection/scene2/军民合作修复前.png b/src/assets/images/zhangleping/reflection/scene2/军民合作修复前.png new file mode 100644 index 0000000..b265a4f Binary files /dev/null and b/src/assets/images/zhangleping/reflection/scene2/军民合作修复前.png differ diff --git a/src/assets/images/zhangleping/reflection/scene2/军民合作修复后.png b/src/assets/images/zhangleping/reflection/scene2/军民合作修复后.png new file mode 100644 index 0000000..2e34356 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/scene2/军民合作修复后.png differ diff --git a/src/assets/images/zhangleping/reflection/scene2/军民齐心赶走敌人.png b/src/assets/images/zhangleping/reflection/scene2/军民齐心赶走敌人.png new file mode 100644 index 0000000..472b80e Binary files /dev/null and b/src/assets/images/zhangleping/reflection/scene2/军民齐心赶走敌人.png differ diff --git a/src/assets/images/zhangleping/reflection/scene2/场景-拖拽.png b/src/assets/images/zhangleping/reflection/scene2/场景-拖拽.png new file mode 100644 index 0000000..f6a2c9d Binary files /dev/null and b/src/assets/images/zhangleping/reflection/scene2/场景-拖拽.png differ diff --git a/src/assets/images/zhangleping/reflection/scene2/场景-进入.png b/src/assets/images/zhangleping/reflection/scene2/场景-进入.png new file mode 100644 index 0000000..080b010 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/scene2/场景-进入.png differ diff --git a/src/assets/images/zhangleping/reflection/scene2/场景2展品1.png b/src/assets/images/zhangleping/reflection/scene2/场景2展品1.png new file mode 100644 index 0000000..c786b14 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/scene2/场景2展品1.png differ diff --git a/src/assets/images/zhangleping/reflection/scene2/场景2展品2.png b/src/assets/images/zhangleping/reflection/scene2/场景2展品2.png new file mode 100644 index 0000000..9df2cf1 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/scene2/场景2展品2.png differ diff --git a/src/assets/images/zhangleping/reflection/scene2/场景2展品3.png b/src/assets/images/zhangleping/reflection/scene2/场景2展品3.png new file mode 100644 index 0000000..059813a Binary files /dev/null and b/src/assets/images/zhangleping/reflection/scene2/场景2展品3.png differ diff --git a/src/assets/images/zhangleping/reflection/scene2/场景物品放置效果.png b/src/assets/images/zhangleping/reflection/scene2/场景物品放置效果.png new file mode 100644 index 0000000..4396f74 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/scene2/场景物品放置效果.png differ diff --git a/src/assets/images/zhangleping/reflection/scene2/抗战烽火记忆碎片.png b/src/assets/images/zhangleping/reflection/scene2/抗战烽火记忆碎片.png new file mode 100644 index 0000000..913b52d Binary files /dev/null and b/src/assets/images/zhangleping/reflection/scene2/抗战烽火记忆碎片.png differ diff --git a/src/assets/images/zhangleping/reflection/scene2/拖拽1.png b/src/assets/images/zhangleping/reflection/scene2/拖拽1.png new file mode 100644 index 0000000..297d977 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/scene2/拖拽1.png differ diff --git a/src/assets/images/zhangleping/reflection/scene2/拖拽2.png b/src/assets/images/zhangleping/reflection/scene2/拖拽2.png new file mode 100644 index 0000000..5095933 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/scene2/拖拽2.png differ diff --git a/src/assets/images/zhangleping/reflection/scene2/拖拽3.png b/src/assets/images/zhangleping/reflection/scene2/拖拽3.png new file mode 100644 index 0000000..0dacea1 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/scene2/拖拽3.png differ diff --git a/src/assets/images/zhangleping/reflection/scene2/拖拽区域.png b/src/assets/images/zhangleping/reflection/scene2/拖拽区域.png new file mode 100644 index 0000000..96c64ad Binary files /dev/null and b/src/assets/images/zhangleping/reflection/scene2/拖拽区域.png differ diff --git a/src/assets/images/zhangleping/reflection/scene2/碎片2详情.png b/src/assets/images/zhangleping/reflection/scene2/碎片2详情.png new file mode 100644 index 0000000..8b2ddd7 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/scene2/碎片2详情.png differ diff --git a/src/assets/images/zhangleping/reflection/scene3/场景-点击.png b/src/assets/images/zhangleping/reflection/scene3/场景-点击.png new file mode 100644 index 0000000..78f3167 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/scene3/场景-点击.png differ diff --git a/src/assets/images/zhangleping/reflection/scene3/场景-进入.png b/src/assets/images/zhangleping/reflection/scene3/场景-进入.png new file mode 100644 index 0000000..74858f9 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/scene3/场景-进入.png differ diff --git a/src/assets/images/zhangleping/reflection/scene3/场景3展品1.png b/src/assets/images/zhangleping/reflection/scene3/场景3展品1.png new file mode 100644 index 0000000..d1da1de Binary files /dev/null and b/src/assets/images/zhangleping/reflection/scene3/场景3展品1.png differ diff --git a/src/assets/images/zhangleping/reflection/scene3/场景3展品2.png b/src/assets/images/zhangleping/reflection/scene3/场景3展品2.png new file mode 100644 index 0000000..ecc3264 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/scene3/场景3展品2.png differ diff --git a/src/assets/images/zhangleping/reflection/scene3/场景3展品3.png b/src/assets/images/zhangleping/reflection/scene3/场景3展品3.png new file mode 100644 index 0000000..af2f42e Binary files /dev/null and b/src/assets/images/zhangleping/reflection/scene3/场景3展品3.png differ diff --git a/src/assets/images/zhangleping/reflection/scene3/场景物品放置效果.png b/src/assets/images/zhangleping/reflection/scene3/场景物品放置效果.png new file mode 100644 index 0000000..5bff3ff Binary files /dev/null and b/src/assets/images/zhangleping/reflection/scene3/场景物品放置效果.png differ diff --git a/src/assets/images/zhangleping/reflection/scene3/点击项1.png b/src/assets/images/zhangleping/reflection/scene3/点击项1.png new file mode 100644 index 0000000..337dcf2 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/scene3/点击项1.png differ diff --git a/src/assets/images/zhangleping/reflection/scene3/点击项2.png b/src/assets/images/zhangleping/reflection/scene3/点击项2.png new file mode 100644 index 0000000..ab41144 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/scene3/点击项2.png differ diff --git a/src/assets/images/zhangleping/reflection/scene3/点击项3.png b/src/assets/images/zhangleping/reflection/scene3/点击项3.png new file mode 100644 index 0000000..3cebfb8 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/scene3/点击项3.png differ diff --git a/src/assets/images/zhangleping/reflection/scene3/碎片3详情.png b/src/assets/images/zhangleping/reflection/scene3/碎片3详情.png new file mode 100644 index 0000000..092bb2b Binary files /dev/null and b/src/assets/images/zhangleping/reflection/scene3/碎片3详情.png differ diff --git a/src/assets/images/zhangleping/reflection/scene4/场景-拖拽.png b/src/assets/images/zhangleping/reflection/scene4/场景-拖拽.png new file mode 100644 index 0000000..e40128b Binary files /dev/null and b/src/assets/images/zhangleping/reflection/scene4/场景-拖拽.png differ diff --git a/src/assets/images/zhangleping/reflection/scene4/场景-结果.png b/src/assets/images/zhangleping/reflection/scene4/场景-结果.png new file mode 100644 index 0000000..787f0dd Binary files /dev/null and b/src/assets/images/zhangleping/reflection/scene4/场景-结果.png differ diff --git a/src/assets/images/zhangleping/reflection/scene4/场景-进入.png b/src/assets/images/zhangleping/reflection/scene4/场景-进入.png new file mode 100644 index 0000000..75f46cc Binary files /dev/null and b/src/assets/images/zhangleping/reflection/scene4/场景-进入.png differ diff --git a/src/assets/images/zhangleping/reflection/scene4/场景4展品1.png b/src/assets/images/zhangleping/reflection/scene4/场景4展品1.png new file mode 100644 index 0000000..24fb321 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/scene4/场景4展品1.png differ diff --git a/src/assets/images/zhangleping/reflection/scene4/场景4展品2.png b/src/assets/images/zhangleping/reflection/scene4/场景4展品2.png new file mode 100644 index 0000000..38ba68c Binary files /dev/null and b/src/assets/images/zhangleping/reflection/scene4/场景4展品2.png differ diff --git a/src/assets/images/zhangleping/reflection/scene4/场景4展品3.png b/src/assets/images/zhangleping/reflection/scene4/场景4展品3.png new file mode 100644 index 0000000..649766b Binary files /dev/null and b/src/assets/images/zhangleping/reflection/scene4/场景4展品3.png differ diff --git a/src/assets/images/zhangleping/reflection/scene4/场景物品放置效果.png b/src/assets/images/zhangleping/reflection/scene4/场景物品放置效果.png new file mode 100644 index 0000000..fb711a7 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/scene4/场景物品放置效果.png differ diff --git a/src/assets/images/zhangleping/reflection/scene4/拖拽1.png b/src/assets/images/zhangleping/reflection/scene4/拖拽1.png new file mode 100644 index 0000000..b117ec3 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/scene4/拖拽1.png differ diff --git a/src/assets/images/zhangleping/reflection/scene4/拖拽2.png b/src/assets/images/zhangleping/reflection/scene4/拖拽2.png new file mode 100644 index 0000000..dd52cf7 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/scene4/拖拽2.png differ diff --git a/src/assets/images/zhangleping/reflection/scene4/拖拽3.png b/src/assets/images/zhangleping/reflection/scene4/拖拽3.png new file mode 100644 index 0000000..8a5ea70 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/scene4/拖拽3.png differ diff --git a/src/assets/images/zhangleping/reflection/scene4/画稿完成.png b/src/assets/images/zhangleping/reflection/scene4/画稿完成.png new file mode 100644 index 0000000..d2741a4 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/scene4/画稿完成.png differ diff --git a/src/assets/images/zhangleping/reflection/scene4/画稿未完成.png b/src/assets/images/zhangleping/reflection/scene4/画稿未完成.png new file mode 100644 index 0000000..da3296e Binary files /dev/null and b/src/assets/images/zhangleping/reflection/scene4/画稿未完成.png differ diff --git a/src/assets/images/zhangleping/reflection/scene4/碎片4详情.png b/src/assets/images/zhangleping/reflection/scene4/碎片4详情.png new file mode 100644 index 0000000..1225017 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/scene4/碎片4详情.png differ diff --git a/src/assets/images/zhangleping/reflection/scene5/光圈.png b/src/assets/images/zhangleping/reflection/scene5/光圈.png new file mode 100644 index 0000000..d6c5370 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/scene5/光圈.png differ diff --git a/src/assets/images/zhangleping/reflection/scene5/场景5.png b/src/assets/images/zhangleping/reflection/scene5/场景5.png new file mode 100644 index 0000000..abe4751 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/scene5/场景5.png differ diff --git a/src/assets/images/zhangleping/reflection/scene5/插入碎片前.png b/src/assets/images/zhangleping/reflection/scene5/插入碎片前.png new file mode 100644 index 0000000..9bdc07d Binary files /dev/null and b/src/assets/images/zhangleping/reflection/scene5/插入碎片前.png differ diff --git a/src/assets/images/zhangleping/reflection/scene5/插入碎片后.png b/src/assets/images/zhangleping/reflection/scene5/插入碎片后.png new file mode 100644 index 0000000..c06af57 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/scene5/插入碎片后.png differ diff --git a/src/assets/images/zhangleping/reflection/scene5/画板.png b/src/assets/images/zhangleping/reflection/scene5/画板.png new file mode 100644 index 0000000..15dca52 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/scene5/画板.png differ diff --git a/src/assets/images/zhangleping/reflection/scene5/碎片5详情.png b/src/assets/images/zhangleping/reflection/scene5/碎片5详情.png new file mode 100644 index 0000000..bb7be87 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/scene5/碎片5详情.png differ diff --git a/src/assets/images/zhangleping/reflection/scene5/邮箱.png b/src/assets/images/zhangleping/reflection/scene5/邮箱.png new file mode 100644 index 0000000..f7a4e12 Binary files /dev/null and b/src/assets/images/zhangleping/reflection/scene5/邮箱.png differ diff --git a/src/assets/images/zhangleping/张乐平故居效果图.png b/src/assets/images/zhangleping/张乐平故居效果图.png deleted file mode 100644 index 643e496..0000000 Binary files a/src/assets/images/zhangleping/张乐平故居效果图.png and /dev/null differ diff --git a/src/assets/images/zhangleping/聂耳旧居底图.png b/src/assets/images/zhangleping/聂耳旧居底图.png deleted file mode 100644 index 160920c..0000000 Binary files a/src/assets/images/zhangleping/聂耳旧居底图.png and /dev/null differ diff --git a/src/components/button/FlipActionButton.tsx b/src/components/button/FlipActionButton.tsx new file mode 100644 index 0000000..fd93b4b --- /dev/null +++ b/src/components/button/FlipActionButton.tsx @@ -0,0 +1,46 @@ +import { cn } from '@/lib/utils' +import { forwardRef } from 'react' +import type { BaseButtonProps } from './button.types' + +export type FlipActionButtonProps = Omit + +/** + * 通用动作按钮(建议配合场景自定义 children) + * - 平面风格,结构简单 + * - 强按下反馈(缩放/压暗/内描边) + */ +const FlipActionButton = forwardRef( + ( + { children, className = '', disabled = false, loading = false, type = 'button', ...props }, + ref + ) => { + return ( + + ) + } +) + +FlipActionButton.displayName = 'FlipActionButton' + +export default FlipActionButton diff --git a/src/components/button/index.ts b/src/components/button/index.ts index ff844e3..6e1edc8 100644 --- a/src/components/button/index.ts +++ b/src/components/button/index.ts @@ -1,2 +1,4 @@ export * from './button' export * from './button.types' +export { default as FlipActionButton } from './FlipActionButton' +export type { FlipActionButtonProps } from './FlipActionButton' diff --git a/src/components/clue/ClueBookModal.tsx b/src/components/clue/ClueBookModal.tsx index c23cf96..cd5d3f2 100644 --- a/src/components/clue/ClueBookModal.tsx +++ b/src/components/clue/ClueBookModal.tsx @@ -2,7 +2,7 @@ import { useState, useEffect } from 'react' import { Image } from '@/components' import { getBackgroundImage, getStaticImage } from '@/lib/utils' import { cn } from '@/lib/utils' -import type { Clue } from '@/store/clueStore' +import type { Clue } from '@/store/sunzhongshanStore' export interface ClueBookModalProps { visible: boolean diff --git a/src/components/exhibit/ExhibitFlipOverlay.tsx b/src/components/exhibit/ExhibitFlipOverlay.tsx new file mode 100644 index 0000000..d0ade02 --- /dev/null +++ b/src/components/exhibit/ExhibitFlipOverlay.tsx @@ -0,0 +1,208 @@ +import { cn, getStaticImage } from '@/lib/utils' +import { useEffect, useMemo, useState } from 'react' +import { FlipActionButton, Image } from '@/components' +import { motion } from 'framer-motion' + +const OVERLAY_STYLE: React.CSSProperties = { + position: 'fixed', + inset: 0, + zIndex: 9999, + pointerEvents: 'none', +} + +export interface ExhibitFlipOverlayProps { + /** 展品正面图片地址,可以是静态资源路径或完整 URL */ + src: string + /** 展品翻面(背面)图片地址,可以是静态资源路径或完整 URL */ + flipSrc?: string + /** + * 展品默认展示缩放(用于“默认放大”) + * - 1 表示原尺寸逻辑 + * - > 1 会放大展品展示(仍受 max-w/max-h 约束) + */ + displayScale?: number + /** 展品入场动画播放完成(背景/按钮出现前后) */ + onEnterComplete?: () => void + /** 关闭回调 */ + onClose?: () => void + /** 是否可见,默认 true */ + visible?: boolean + /** 额外的自定义类 */ + className?: string +} + +/** + * 轻量展品翻转层 + * - 不使用 Portal + * - 不支持缩放/拖拽 + * - 点击展品区域翻转显示另一张图(带 3D 翻转动画) + */ +const ExhibitFlipOverlay = ({ + src, + flipSrc, + displayScale = 1, + onEnterComplete, + onClose, + visible = true, + className, +}: ExhibitFlipOverlayProps) => { + const backSrc = getStaticImage('components/close') + + const [mounted, setMounted] = useState(false) + const [flipped, setFlipped] = useState(false) + const [showChrome, setShowChrome] = useState(false) + + useEffect(() => { + setMounted(true) + }, []) + + useEffect(() => { + if (visible) { + setFlipped(false) + setShowChrome(false) + } + }, [visible, src, flipSrc]) + + const frontImageSrc = + src.startsWith('http://') || src.startsWith('https://') || src.startsWith('/') + ? src + : getStaticImage(src) + + const backImageSrc = useMemo(() => { + if (!flipSrc) return null + return flipSrc.startsWith('http://') || + flipSrc.startsWith('https://') || + flipSrc.startsWith('/') + ? flipSrc + : getStaticImage(flipSrc) + }, [flipSrc]) + + const canFlip = Boolean(backImageSrc && backImageSrc !== frontImageSrc) + + if (!mounted || !visible) return null + + return ( +
+
+ {/* 第二段:背景与按钮在展品入场后再出现 */} + {showChrome && ( + <> + + + {onClose && ( + + { + e.stopPropagation() + onClose() + }} + alt="返回" + button + /> + + )} + + )} + +
+ {/* 第一段:像“获得装备”一样先把展品弹出 */} + { + if (!showChrome) { + setShowChrome(true) + onEnterComplete?.() + } + }} + style={{ + transformStyle: 'preserve-3d', + WebkitTransformStyle: 'preserve-3d', + }} + > +
+ 展品 +
+ + {canFlip && ( +
+ 展品背面 +
+ )} +
+ + {showChrome && canFlip && ( + + { + e.stopPropagation() + setFlipped((v) => !v) + }} + > + 翻转一下 + + + )} +
+
+
+ ) +} + +export default ExhibitFlipOverlay diff --git a/src/components/exhibit/index.ts b/src/components/exhibit/index.ts index 85e9ecd..486aeeb 100644 --- a/src/components/exhibit/index.ts +++ b/src/components/exhibit/index.ts @@ -1,4 +1,6 @@ export { default as ExhibitOverlay } from './ExhibitOverlay' export type { ExhibitOverlayProps } from './ExhibitOverlay' +export { default as ExhibitFlipOverlay } from './ExhibitFlipOverlay' +export type { ExhibitFlipOverlayProps } from './ExhibitFlipOverlay' export { default as ExhibitDescriptionNarration } from './ExhibitDescriptionNarration' export type { ExhibitDescriptionNarrationProps } from './ExhibitDescriptionNarration' diff --git a/src/components/guide/GuideSteps.tsx b/src/components/guide/GuideSteps.tsx index 85c7170..0062953 100644 --- a/src/components/guide/GuideSteps.tsx +++ b/src/components/guide/GuideSteps.tsx @@ -39,6 +39,12 @@ interface GuideStepsItemProps { autoPlayOnEnter?: boolean } +/** + * GuideStepsItem 文案长度建议: + * - 不要一句一页,也不要超长导致一页放不下 + * - 推荐每段 1~2 句,建议不超过 70 个中文字符 + */ + const GuideSteps = ({ children, className, diff --git a/src/components/hint/HintHost.tsx b/src/components/hint/HintHost.tsx new file mode 100644 index 0000000..1f03933 --- /dev/null +++ b/src/components/hint/HintHost.tsx @@ -0,0 +1,143 @@ +import { useEffect, useMemo, useState } from 'react' +import { AnimatePresence, motion } from 'framer-motion' +import { cn, getBackgroundImage } from '@/lib/utils' + +export type HintPositionOffset = { + /** 相对窗口中心点的水平偏移(px) */ + x?: number + /** 相对窗口中心点的垂直偏移(px) */ + y?: number +} + +export interface ShowHintOptions { + /** 自动消失时间(ms)。默认 2000 */ + durationMs?: number + /** 是否常驻(常驻时不会自动消失) */ + persistent?: boolean + /** 相对中心点微调位置 */ + offset?: HintPositionOffset + /** 自定义层级(默认 60) */ + zIndex?: number +} + +type HintState = { + visible: boolean + text: string + options: Required> +} + +const DEFAULT_OPTIONS: HintState['options'] = { + durationMs: 2000, + persistent: false, + offset: { x: 0, y: 0 }, + zIndex: 60, +} + +let current: HintState = { + visible: false, + text: '', + options: DEFAULT_OPTIONS, +} + +let hideTimer: number | null = null +const listeners = new Set<(s: HintState) => void>() + +function emit(next: HintState) { + current = next + listeners.forEach((l) => l(current)) +} + +function clearHideTimer() { + if (hideTimer) { + window.clearTimeout(hideTimer) + hideTimer = null + } +} + +export function showHint(text: string, options?: ShowHintOptions) { + if (typeof window === 'undefined') return + + clearHideTimer() + + const mergedOptions: HintState['options'] = { + ...DEFAULT_OPTIONS, + ...(options ?? {}), + offset: { + ...DEFAULT_OPTIONS.offset, + ...(options?.offset ?? {}), + }, + } + + emit({ + visible: true, + text, + options: mergedOptions, + }) + + if (!mergedOptions.persistent) { + hideTimer = window.setTimeout(() => { + hideHint() + }, mergedOptions.durationMs) + } +} + +export function hideHint() { + if (typeof window === 'undefined') return + clearHideTimer() + emit({ ...current, visible: false }) +} + +export function HintHost() { + const [state, setState] = useState(current) + + useEffect(() => { + listeners.add(setState) + return () => { + listeners.delete(setState) + } + }, []) + + const offsetX = state.options.offset.x ?? 0 + const offsetY = state.options.offset.y ?? 0 + + return ( +
+ + {state.visible && state.text && ( + +
+ {state.text} +
+
+ )} +
+
+ ) +} diff --git a/src/components/hint/SceneHint.tsx b/src/components/hint/SceneHint.tsx new file mode 100644 index 0000000..a957fe3 --- /dev/null +++ b/src/components/hint/SceneHint.tsx @@ -0,0 +1,99 @@ +import { useEffect, useMemo, useRef } from 'react' +import { hideHint, showHint } from './HintHost' +import type { HintPositionOffset, ShowHintOptions } from './HintHost' + +export type SceneHintProps = { + /** 是否展示提示 */ + when: boolean + /** 提示文本(建议直接传 string children) */ + children: string + /** 延迟展示(ms) */ + delayMs?: number + /** 自动消失时间(ms)。不传则使用默认值(2000) */ + durationMs?: number + /** 是否常驻 */ + persistent?: boolean + /** 相对中心点微调位置 */ + offset?: HintPositionOffset + /** 自定义层级 */ + zIndex?: number + /** 进入 when=true 时只展示一次(后续 when=true 的 rerender 不会重复触发) */ + once?: boolean + /** + * 触发 key:当此值变化时(且 when=true)会重新触发一次 showHint。 + * 用于“同一个提示需要再次弹出”的场景。 + */ + triggerKey?: string | number + /** when 变为 false / 卸载时是否自动 hide */ + hideOnCleanup?: boolean +} + +export function SceneHint({ + when, + children, + delayMs = 0, + durationMs, + persistent = false, + offset, + zIndex, + once = false, + triggerKey, + hideOnCleanup = true, +}: SceneHintProps) { + const shownOnceRef = useRef(false) + const delayTimerRef = useRef(null) + + const text = useMemo(() => { + return typeof children === 'string' ? children : String(children ?? '') + }, [children]) + + useEffect(() => { + if (!when) { + shownOnceRef.current = false + if (hideOnCleanup) hideHint() + return + } + + if (once && shownOnceRef.current) return + + const options: ShowHintOptions = { + persistent, + ...(durationMs !== undefined ? { durationMs } : null), + ...(offset ? { offset } : null), + ...(zIndex !== undefined ? { zIndex } : null), + } + + if (delayMs > 0) { + delayTimerRef.current = window.setTimeout(() => { + showHint(text, options) + shownOnceRef.current = true + }, delayMs) + } else { + showHint(text, options) + shownOnceRef.current = true + } + + return () => { + if (delayTimerRef.current) { + window.clearTimeout(delayTimerRef.current) + delayTimerRef.current = null + } + if (hideOnCleanup) hideHint() + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [ + when, + text, + delayMs, + durationMs, + persistent, + offset?.x, + offset?.y, + zIndex, + once, + triggerKey, + hideOnCleanup, + ]) + + return null +} diff --git a/src/components/hint/index.ts b/src/components/hint/index.ts new file mode 100644 index 0000000..99eeeb2 --- /dev/null +++ b/src/components/hint/index.ts @@ -0,0 +1,5 @@ +export { HintHost, showHint, hideHint } from './HintHost' +export type { ShowHintOptions, HintPositionOffset } from './HintHost' + +export { SceneHint } from './SceneHint' +export type { SceneHintProps } from './SceneHint' diff --git a/src/components/index.ts b/src/components/index.ts index 8e648bd..01dd5e4 100644 --- a/src/components/index.ts +++ b/src/components/index.ts @@ -3,8 +3,8 @@ export { default as Video } from './video' export type { VideoProps, VideoRef, VideoAnchor, AnchorContext } from './video' // Button components -export { Button, ImageButton } from './button' -export type { BaseButtonProps, ImageButtonProps } from './button' +export { Button, ImageButton, FlipActionButton } from './button' +export type { BaseButtonProps, ImageButtonProps, FlipActionButtonProps } from './button' // Image component export { Image } from './image' @@ -19,6 +19,8 @@ export { GuideSteps, GuideStepsItem, StudyGuideModal } from './guide' // Exhibit overlay export { ExhibitOverlay } from './exhibit' export type { ExhibitOverlayProps } from './exhibit' +export { ExhibitFlipOverlay } from './exhibit' +export type { ExhibitFlipOverlayProps } from './exhibit' // Overlay component export { Overlay } from './overlay' @@ -68,6 +70,12 @@ export type { export { Narration } from './narration' export type { NarrationProps } from './narration' +// Hint (lightweight toast) +export { HintHost, showHint, hideHint } from './hint' +export type { ShowHintOptions, HintPositionOffset } from './hint' +export { SceneHint } from './hint' +export type { SceneHintProps } from './hint' + // Clue components export { ClueHintModal, ClueBookModal } from './clue' export type { ClueHintModalProps, ClueHint, ClueBookModalProps } from './clue' @@ -81,12 +89,25 @@ export { Select } from './select' export type { SelectProps, SelectOption } from './select' // Letter components -export { LetterToChenyun, LetterToSunzhongshan, LetterToHuangyanpei, LetterToLuxun } from './letter' +export { + LetterToChenyun, + LetterToMaozedong, + LetterToSunzhongshan, + LetterToHuangyanpei, + LetterToLuxun, + LetterToZhangleping, + LetterToNieer, + LetterToRongdesheng, +} from './letter' export type { LetterToChenyunProps, + LetterToMaozedongProps, LetterToSunzhongshanProps, LetterToHuangyanpeiProps, LetterToLuxunProps, + LetterToZhanglepingProps, + LetterToNieerProps, + LetterToRongdeshengProps, } from './letter' // Puzzle components diff --git a/src/components/layout/ResidenceLayout.tsx b/src/components/layout/ResidenceLayout.tsx index 614f67e..c39c626 100644 --- a/src/components/layout/ResidenceLayout.tsx +++ b/src/components/layout/ResidenceLayout.tsx @@ -15,7 +15,13 @@ import PuzzlePiecePortal from '@/components/puzzle/PuzzlePiecePortal' * 支持拼图盒功能的故居列表 * 后续如需为其他故居添加拼图盒,只需在此数组中添加对应的故居名称即可 */ -const RESIDENCES_WITH_PUZZLE = ['chenyun', 'huangyanpei', 'sunzhongshan', 'luxun'] as const +const RESIDENCES_WITH_PUZZLE = [ + 'chenyun', + 'huangyanpei', + 'sunzhongshan', + 'luxun', + 'maozedong', +] as const /** * 故居布局组件 diff --git a/src/components/layout/index.ts b/src/components/layout/index.ts index 48148c7..7bd287e 100644 --- a/src/components/layout/index.ts +++ b/src/components/layout/index.ts @@ -9,7 +9,7 @@ export { default as SuccessAlert } from './alert/success-alert' export type { SuccessAlertProps } from './alert/success-alert' export { default as ErrorAlert } from './alert/error-alert' export type { ErrorAlertProps } from './alert/error-alert' -export { DragQuizPanel } from './quiz' +export { DragQuizPanel, BasketQuizPanel } from './quiz' export type { DragQuizPanelProps } from './quiz' // export type { // ClueData, diff --git a/src/components/layout/quiz/BasketQuizPanel.tsx b/src/components/layout/quiz/BasketQuizPanel.tsx new file mode 100644 index 0000000..31aafdd --- /dev/null +++ b/src/components/layout/quiz/BasketQuizPanel.tsx @@ -0,0 +1,180 @@ +import { useEffect, useRef } from 'react' +import { DragFill } from '@/components' +import { cn } from '@/lib/utils' +import type { DragQuizPanelProps } from './types' + +/** + * BasketQuizPanel - 篮子拖拽题面板 + * + * 左右布局:左边篮子放置区,右边选项列表(每个选项单独一行) + */ +const BasketQuizPanel = ({ + visible, + zIndex = 10000, + title, + questionPrefix, + questionSuffix, + options, + blanks, + value, + error, + feedbackType = 'error', + onChange, +}: DragQuizPanelProps) => { + const prevVisibleRef = useRef(visible) + + useEffect(() => { + if (prevVisibleRef.current && !visible && value.length > 0) { + onChange([]) + } + prevVisibleRef.current = visible + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [visible]) + + if (!visible) return null + + const filledValues = new Set(value.map((r) => r.optionValue)) + + return ( +
+
+ {/* 题干卡片 */} +
+
+ {title &&
{title}
} +
+ {questionPrefix && {questionPrefix}} + {questionSuffix && {questionSuffix}} + {error && ( +
+ {error} +
+ )} +
+
+
+ + {/* 左右布局:篮子 + 选项 */} +
+ {/* 左侧:篮子区域 - 每个 blank 都需要 data-blank-id 以支持多选项放入 */} +
+ {/* 隐藏的 blank 锚点,让每个 blank 都能被 DragFill 检测到 */} + {blanks.map((blank) => { + const isFilled = value.some((r) => r.blankId === blank.id) + if (isFilled) return null + return ( +
+ ) + })} + {value.length === 0 ? ( + 请将正确选项拖入此处 + ) : ( + value.map((result) => { + const opt = options.find((o) => o.value === result.optionValue) + return ( +
+
+ + {opt?.label || result.optionValue} + +
+ +
+
+ ) + }) + )} +
+ + {/* 右侧:选项列表,每个选项单独一行 */} +
+ ( +
+ {!(isUsed || filledValues.has(option.value)) && ( +
+ )} + + {option.label} + +
+ )} + renderDragging={(option) => ( +
+
+ + {option.label} + +
+ )} + renderBlank={() =>
} + /> +
+
+
+
+ ) +} + +export default BasketQuizPanel diff --git a/src/components/layout/quiz/DragQuizPanel.tsx b/src/components/layout/quiz/DragQuizPanel.tsx index b5c4bc1..c938a0f 100644 --- a/src/components/layout/quiz/DragQuizPanel.tsx +++ b/src/components/layout/quiz/DragQuizPanel.tsx @@ -12,6 +12,7 @@ const DragQuizPanel = ({ questionSuffix, options, blanks, + blankPrefixes, blankSeparators, value, error, @@ -47,6 +48,7 @@ const DragQuizPanel = ({ const filledValue = filledResult?.optionValue || null return ( + {blankPrefixes?.[index] && {blankPrefixes[index]}} (null) const [error, setError] = useState('') const containerRef = useRef(null) + const middleRef = useRef(null) + const leftColRef = useRef(null) + const rightColRef = useRef(null) + const leftItemRefs = useRef>({}) + const rightItemRefs = useRef>({}) // 当前错误的连线对,用于做红色高亮+抖动反馈 const [errorPairs, setErrorPairs] = useState>([]) + const [leftCenters, setLeftCenters] = useState>({}) + const [rightCenters, setRightCenters] = useState>({}) + const [middleHeight, setMiddleHeight] = useState(300) + const rafIdRef = useRef(null) // 当窗口关闭时,重置状态 useEffect(() => { @@ -163,17 +172,79 @@ const MatchQuizPanel = ({ return matches.some((m) => m.rightId === rightId) } - // 获取左项对应的右项ID - const getMatchedRightId = (leftId: string) => { - const match = matches.find((m) => m.leftId === leftId) - return match?.rightId || null - } + const measureCenters = useCallback(() => { + const middleEl = middleRef.current + if (!middleEl) return - // 获取右项对应的左项ID - const getMatchedLeftId = (rightId: string) => { - const match = matches.find((m) => m.rightId === rightId) - return match?.leftId || null - } + const middleRect = middleEl.getBoundingClientRect() + const nextLeft: Record = {} + const nextRight: Record = {} + + // 显式同步中间连线层高度,避免因 flex/stretch/内容换行导致坐标系基准漂移 + const leftRect = leftColRef.current?.getBoundingClientRect() + const rightRect = rightColRef.current?.getBoundingClientRect() + const nextMiddleHeight = Math.max(leftRect?.height ?? 0, rightRect?.height ?? 0, 300) + setMiddleHeight(nextMiddleHeight) + + for (const item of leftItems) { + const el = leftItemRefs.current[item.id] + if (!el) continue + const rect = el.getBoundingClientRect() + nextLeft[item.id] = rect.top + rect.height / 2 - middleRect.top + } + + for (const item of rightItems) { + const el = rightItemRefs.current[item.id] + if (!el) continue + const rect = el.getBoundingClientRect() + nextRight[item.id] = rect.top + rect.height / 2 - middleRect.top + } + + setLeftCenters(nextLeft) + setRightCenters(nextRight) + }, [leftItems, rightItems]) + + const scheduleMeasure = useCallback(() => { + if (rafIdRef.current !== null) { + cancelAnimationFrame(rafIdRef.current) + rafIdRef.current = null + } + // 双 RAF:等待浏览器完成一帧布局/绘制(含 transform/transition/pulse 的本帧生效) + rafIdRef.current = requestAnimationFrame(() => { + rafIdRef.current = requestAnimationFrame(() => { + rafIdRef.current = null + measureCenters() + }) + }) + }, [measureCenters]) + + // 首次展示、匹配变化、选中/错误状态变化都会影响位置(含动画/缩放),延后一帧再测 + useEffect(() => { + if (!visible) return + scheduleMeasure() + }, [visible, matches.length, errorPairs.length, selectedLeftId, scheduleMeasure]) + + // 监听尺寸变化(窗口 resize / 容器尺寸变化 / 文本换行) + useEffect(() => { + if (!visible) return + const middleEl = middleRef.current + if (!middleEl) return + + const handleResize = () => scheduleMeasure() + window.addEventListener('resize', handleResize) + + const ro = new ResizeObserver(() => scheduleMeasure()) + ro.observe(middleEl) + if (containerRef.current) ro.observe(containerRef.current) + if (leftColRef.current) ro.observe(leftColRef.current) + if (rightColRef.current) ro.observe(rightColRef.current) + + return () => { + window.removeEventListener('resize', handleResize) + if (rafIdRef.current !== null) cancelAnimationFrame(rafIdRef.current) + ro.disconnect() + } + }, [visible, scheduleMeasure]) if (!visible) return null @@ -199,9 +270,9 @@ const MatchQuizPanel = ({
{/* 连线区域 */} -
+
{/* 左列:日期 */} -
+
{leftItems.map((item) => { const isMatched = isLeftItemMatched(item.id) const isSelected = selectedLeftId === item.id @@ -210,6 +281,9 @@ const MatchQuizPanel = ({ return (
{ + leftItemRefs.current[item.id] = el + }} className={cn( 'relative px-4 md:px-6 py-3 md:py-4 rounded-xl border-2 transition-all duration-200', 'text-[20px] md:text-[28px] leading-relaxed cursor-pointer', @@ -221,7 +295,7 @@ const MatchQuizPanel = ({ ? 'bg-[#d4a574] text-[#5c3e2e] border-[#f0be75] shadow-lg scale-105' : isMatched ? 'bg-[#3a3020] text-[#d4c5a9] border-[#8b7355]' - : 'bg-[#d7b888] text-[#5c3e2e] border-[#d4c5a9] hover:bg-gradient-to-r hover:from-[#ddf3e1] hover:to-[#fbdd97] hover:border-[#f0be75]' + : 'bg-[#d7b888] text-[#5c3e2e] border-[#d4c5a9] hover:bg-linear-to-r hover:from-[#ddf3e1] hover:to-[#fbdd97] hover:border-[#f0be75]' )} onClick={() => handleLeftItemClick(item.id)} onTouchStart={(e) => { @@ -249,7 +323,11 @@ const MatchQuizPanel = ({
{/* 中间连线区域(移动端隐藏,桌面端显示) */} -
+
{/* 绘制连线 */} {matches.map((match, index) => { @@ -257,14 +335,9 @@ const MatchQuizPanel = ({ const rightItem = rightItems.find((item) => item.id === match.rightId) if (!leftItem || !rightItem) return null - const leftIndex = leftItems.findIndex((item) => item.id === match.leftId) - const rightIndex = rightItems.findIndex((item) => item.id === match.rightId) - - // 计算连线起点和终点(基于项目高度和间距) - const itemHeight = 80 // 每个项目的大概高度 - const gap = 16 // 项目之间的间距 - const startY = leftIndex * (itemHeight + gap) + itemHeight / 2 - const endY = rightIndex * (itemHeight + gap) + itemHeight / 2 + const startY = leftCenters[match.leftId] + const endY = rightCenters[match.rightId] + if (startY === undefined || endY === undefined) return null return ( {/* 右列:事件 */} -
+
{rightItems.map((item) => { const isMatched = isRightItemMatched(item.id) const isError = errorPairs.some((p) => p.rightId === item.id) @@ -305,6 +378,9 @@ const MatchQuizPanel = ({ return (
{ + rightItemRefs.current[item.id] = el + }} className={cn( 'relative px-4 md:px-6 py-3 md:py-4 rounded-xl border-2 transition-all duration-200', 'text-[20px] md:text-[28px] leading-relaxed', @@ -319,7 +395,7 @@ const MatchQuizPanel = ({ : isMatched ? 'bg-[#3a3020] text-[#d4c5a9] border-[#8b7355]' : selectedLeftId - ? 'bg-[#d7b888] text-[#5c3e2e] border-[#d4c5a9] hover:bg-gradient-to-r hover:from-[#ddf3e1] hover:to-[#fbdd97] hover:border-[#f0be75]' + ? 'bg-[#d7b888] text-[#5c3e2e] border-[#d4c5a9] hover:bg-linear-to-r hover:from-[#ddf3e1] hover:to-[#fbdd97] hover:border-[#f0be75]' : 'bg-[#d7b888]/60 text-[#5c3e2e]/60 border-[#d4c5a9]/60' )} onClick={() => handleRightItemClick(item.id)} diff --git a/src/components/layout/quiz/SingleChoiceQuizPanel.tsx b/src/components/layout/quiz/SingleChoiceQuizPanel.tsx index c81264b..b7e0062 100644 --- a/src/components/layout/quiz/SingleChoiceQuizPanel.tsx +++ b/src/components/layout/quiz/SingleChoiceQuizPanel.tsx @@ -1,5 +1,6 @@ import { useEffect, useState } from 'react' import { SingleChoice } from '@/components' +import SuccessAlert from '@/components/layout/alert/success-alert' import type { SingleChoiceQuizPanelProps } from './types' /** @@ -38,20 +39,38 @@ const SingleChoiceQuizPanel = ({ onWrongSelect, onError, disabled = false, + showSuccessAlert = false, + successAlertProps, + onSuccessContinue, }: SingleChoiceQuizPanelProps) => { const [selectedValue, setSelectedValue] = useState('') const [error, setError] = useState('') + const [successAlertVisible, setSuccessAlertVisible] = useState(false) // 当窗口关闭时,重置内部状态 useEffect(() => { if (!visible) { setSelectedValue('') setError('') + setSuccessAlertVisible(false) } }, [visible]) + // 当成功弹窗显示时,隐藏题目面板,避免双层遮罩叠加 + const shouldRenderQuizPanel = visible && !successAlertVisible + if (!visible) return null + // 约定:显式开启,或传入 title/content 任一文案,即启用答对成功弹窗 + const hasSuccessAlertCopy = + Boolean(successAlertProps?.title) || Boolean(successAlertProps?.content) + const shouldShowSuccessAlert = showSuccessAlert || hasSuccessAlertCopy + + const handleSuccessContinue = () => { + setSuccessAlertVisible(false) + onSuccessContinue?.() + } + // 处理选项点击 const handleOptionClick = (value: string) => { if (disabled) return @@ -69,6 +88,10 @@ const SingleChoiceQuizPanel = ({ setSelectedValue('') setError('') onSubmit?.(value, true) + + if (shouldShowSuccessAlert) { + setSuccessAlertVisible(true) + } } else { // 答题失败:清空状态,执行 onError,允许重新选择 setSelectedValue('') @@ -86,45 +109,61 @@ const SingleChoiceQuizPanel = ({ } return ( -
-
- {/* 题干卡片 */} -
-
{title}
+ <> + {shouldRenderQuizPanel && ( +
+
+ {/* 题干卡片 */} +
+
{title}
- {/* 答案反馈 */} - {error &&
{error}
} -
+ {/* 答案反馈 */} + {error &&
{error}
} +
- {/* 选项区域 */} -
- ( -
handleOptionClick(option.value)} - > -
- {option.label} -
-
- )} - /> + {/* 选项区域 */} +
+ ( +
handleOptionClick(option.value)} + > +
+ {option.label} +
+
+ )} + /> +
+
-
-
+ )} + + {shouldShowSuccessAlert && ( + + )} + ) } diff --git a/src/components/layout/quiz/index.ts b/src/components/layout/quiz/index.ts index 776ed1f..6eb139f 100644 --- a/src/components/layout/quiz/index.ts +++ b/src/components/layout/quiz/index.ts @@ -2,6 +2,7 @@ export { default as SingleChoiceQuizPanel } from './SingleChoiceQuizPanel' export { default as MultipleChoiceQuizPanel } from './MultipleChoiceQuizPanel' export { default as DragQuizPanel } from './DragQuizPanel' +export { default as BasketQuizPanel } from './BasketQuizPanel' export { default as MatchQuizPanel } from './MatchQuizPanel' export { default as SelectFillQuizPanel } from './SelectFillQuizPanel' export type { diff --git a/src/components/layout/quiz/types.ts b/src/components/layout/quiz/types.ts index 52d8355..cad1433 100644 --- a/src/components/layout/quiz/types.ts +++ b/src/components/layout/quiz/types.ts @@ -4,6 +4,7 @@ import { DragFillResult, DragFillBlank, } from '@/components' +import type { SuccessAlertProps } from '@/components/layout/alert/success-alert' /** 拖拽题面板配置 */ export interface DragQuizPanelProps { @@ -21,12 +22,19 @@ export interface DragQuizPanelProps { options: { value: string; label: string }[] /** 空白区域列表 */ blanks: DragFillBlank[] + /** 每个空之前的前缀文本(按 blanks 顺序一一对应) */ + blankPrefixes?: string[] /** 空白之间的分隔符数组(可选,如果不提供则使用默认的"、") */ blankSeparators?: string[] /** 当前值 */ value: DragFillResult[] - /** 错误提示信息 */ + /** + * 提示信息(历史上叫 error,但实际也可能用来展示正确提示) + * 由 feedbackType 控制样式 + */ error?: string + /** 提示类型:success 为正确提示,error 为错误提示 */ + feedbackType?: 'success' | 'error' /** 值变化回调 */ onChange: (value: DragFillResult[]) => void } @@ -53,6 +61,12 @@ export interface SingleChoiceQuizPanelProps { onError?: (error: string) => void /** 是否禁用 */ disabled?: boolean + /** 答对后是否自动显示 SuccessAlert(默认 false;当 successAlertProps.title/content 有值时也会自动显示) */ + showSuccessAlert?: boolean + /** SuccessAlert 的可配置项(除 visible / onContinue / onClose 外) */ + successAlertProps?: Omit + /** 答对弹窗点击继续回调 */ + onSuccessContinue?: () => void } /** 多选题面板配置 */ diff --git a/src/components/letter/LetterTemplate.tsx b/src/components/letter/LetterTemplate.tsx new file mode 100644 index 0000000..ebbbfad --- /dev/null +++ b/src/components/letter/LetterTemplate.tsx @@ -0,0 +1,592 @@ +import { useEffect, useMemo, useRef, useState } from 'react' +import { AnimatePresence, motion } from 'framer-motion' +import { getPublicPath, getStaticImage } from '@/lib/utils' +import { filterInput } from '@/lib/utils/sensitiveWords' +import { Image, Select, Video, type VideoRef } from '@/components' +import { showHint } from '@/components/hint' + +export type LetterFieldType = 'text' | 'input' | 'select' + +export interface LetterFieldOption { + value: string + label: string + disabled?: boolean +} + +export interface LetterFieldHintConfig { + error?: string +} + +export interface LetterFieldConfig { + type?: LetterFieldType + maxLength?: number + placeholder?: string + options?: LetterFieldOption[] + fitContent?: boolean + widthClassName?: string + className?: string + readOnlyFallback?: string + sanitize?: boolean + correctValue?: string + hints?: LetterFieldHintConfig + fontSize?: number +} + +export interface LetterTemplateProps { + visible?: boolean + onClose?: () => void + onSubmit?: (values: string[]) => void + onAnimationEnd?: () => void + title: string + letterContent: string + fields?: + | Record + | ((values: string[]) => Record) + validate?: (values: string[], letterContent: string) => boolean[] + contentClassName?: string + audioSrc?: string + showVideo?: boolean + videoSrc?: string + sceneImageSrc?: string + replyButtonImageSrc?: string + replyImageSrc?: string +} + +const DEFAULT_TEXT_FIELD: LetterFieldConfig = { + type: 'text', + maxLength: 10, + widthClassName: 'w-[100px]', + sanitize: true, +} + +const getPlaceholderCount = (letterContent: string) => (letterContent.match(/____/g) || []).length + +const LetterTemplate = ({ + visible = false, + onClose, + onSubmit, + onAnimationEnd, + title, + letterContent, + fields = {}, + validate, + contentClassName, + audioSrc, + showVideo = true, + videoSrc = 'video/letter/neihua_jixin.mp4', + sceneImageSrc = 'components/letter/动画结束后场景', + replyButtonImageSrc = 'components/letter/点击敬读', + replyImageSrc, +}: LetterTemplateProps) => { + const [blankValues, setBlankValues] = useState([]) + const [blankErrors, setBlankErrors] = useState([]) + const [submitted, setSubmitted] = useState(false) + const [showSendVideo, setShowSendVideo] = useState(false) + const [showScene, setShowScene] = useState(false) + const [showReplyImage, setShowReplyImage] = useState(false) + const sendVideoRef = useRef(null) + const audioRef = useRef(null) + + const resolvedFields = useMemo( + () => (typeof fields === 'function' ? fields(blankValues) : fields), + [fields, blankValues] + ) + + const validateBlanks = () => { + const placeholderCount = getPlaceholderCount(letterContent) + const nextValues = Array.from( + { length: placeholderCount }, + (_, index) => blankValues[index] ?? '' + ) + + const nextErrors = validate + ? validate(nextValues, letterContent) + : nextValues.map((value, index) => { + const field = resolvedFields[index] ?? DEFAULT_TEXT_FIELD + const trimmedValue = value.trim() + const maxLength = field.maxLength ?? 10 + + if (!trimmedValue || trimmedValue.length > maxLength) { + if (!trimmedValue) { + showHint('请填写完整后再提交哦!') + } else { + showHint(`内容过长,请不要超过${maxLength}个字哦!`) + } + return true + } + + if (field.correctValue && trimmedValue !== field.correctValue) { + if (field.hints?.error) { + showHint(field.hints.error) + } + return true + } + + return false + }) + + const hasError = nextErrors.some(Boolean) + if (hasError) { + // 清空所有错误位置的输入 + const cleanedValues = [...blankValues] + nextErrors.forEach((isError, index) => { + if (isError) { + cleanedValues[index] = '' + } + }) + setBlankValues(cleanedValues) + } + + setBlankErrors(nextErrors) + return !hasError + } + + useEffect(() => { + if (!visible) { + setSubmitted(false) + setBlankValues([]) + setBlankErrors([]) + setShowSendVideo(false) + setShowScene(false) + setShowReplyImage(false) + } + }, [visible]) + + // 音频播放逻辑 + useEffect(() => { + const audio = audioRef.current + if (!audio || !audioSrc) return + + if (visible && !showSendVideo) { + audio.currentTime = 0 + audio.play().catch(() => {}) + } else { + audio.pause() + audio.currentTime = 0 + } + }, [visible, showSendVideo, audioSrc]) + + useEffect(() => { + const audio = audioRef.current + return () => { + if (audio) { + audio.pause() + audio.currentTime = 0 + } + } + }, []) + + const updateBlank = (index: number, value: string) => { + const field = resolvedFields[index] ?? DEFAULT_TEXT_FIELD + const nextValue = field.sanitize === false ? value : filterInput(value) + const nextValues = [...blankValues] + nextValues[index] = nextValue + setBlankValues(nextValues) + + // correctValue 字段:输入过程中不标红,由 blur / select 触发校验; + // 若当前已标红且值匹配正确答案,则清除标红 + if (field.correctValue) { + if (nextValue.trim() === field.correctValue && blankErrors[index]) { + const nextErrors = [...blankErrors] + nextErrors[index] = false + setBlankErrors(nextErrors) + } + return + } + + // 无 correctValue 字段:实时校验空 / 超长 + const trimmedValue = nextValue.trim() + const maxLength = field.maxLength ?? 10 + const isError = !trimmedValue || trimmedValue.length > maxLength + if (blankErrors[index] !== isError) { + const nextErrors = [...blankErrors] + nextErrors[index] = isError + setBlankErrors(nextErrors) + } + } + + const handleSelectChange = (index: number, value: string) => { + updateBlank(index, value) + + const field = resolvedFields[index] + if (!field?.correctValue) return + + if (value !== field.correctValue) { + if (field.hints?.error) { + showHint(field.hints.error) + } + + const nextValues = [...blankValues] + nextValues[index] = '' + setBlankValues(nextValues) + + const nextErrors = [...blankErrors] + nextErrors[index] = true + setBlankErrors(nextErrors) + } + } + + const handleInputBlur = (index: number) => { + const field = resolvedFields[index] + if (!field?.correctValue) return + + const value = (blankValues[index] ?? '').trim() + if (value && value !== field.correctValue) { + if (field.hints?.error) { + showHint(field.hints.error) + } + + const nextValues = [...blankValues] + nextValues[index] = '' + setBlankValues(nextValues) + + const nextErrors = [...blankErrors] + nextErrors[index] = true + setBlankErrors(nextErrors) + } + } + + const handleSendVideoCanPlay = () => { + if (showSendVideo && sendVideoRef.current) { + sendVideoRef.current.play().catch(() => {}) + } + } + + const renderLine = (readonly: boolean) => { + let placeholderIndex = 0 + let bodyStarted = false + + return letterContent.split('\n').map((line, lineIndex) => { + const trimmedLine = line.trim() + const isSalutationLine = trimmedLine.endsWith(':') || trimmedLine.endsWith(':') + + if (isSalutationLine) { + bodyStarted = true + } + + const needsIndent = bodyStarted && trimmedLine !== '' && !isSalutationLine + const segments = line.split('____') + const linePrefix = needsIndent ? '  ' : '' + + return ( +
+ {segments.map((part, partIndex) => { + const isLast = partIndex === segments.length - 1 + if (isLast) { + return ( + + {partIndex === 0 ? `${linePrefix}${part}` : part} + + ) + } + + const currentIndex = placeholderIndex++ + const field = resolvedFields[currentIndex] ?? DEFAULT_TEXT_FIELD + const fieldValue = blankValues[currentIndex] ?? '' + + if (readonly) { + const displayValue = + field.type === 'select' + ? field.options?.find((option) => option.value === fieldValue)?.label || + fieldValue + : fieldValue + + return ( + + {partIndex === 0 ? `${linePrefix}${part}` : part} + {displayValue || field.readOnlyFallback || '  '} + + ) + } + + if (field.type === 'select') { + return ( + + {partIndex === 0 ? `${linePrefix}${part}` : part} + updateBlank(currentIndex, e.target.value)} + onBlur={() => handleInputBlur(currentIndex)} + /> + + ) + })} +
+ ) + }) + } + + return ( + + {visible && ( + <> + {audioSrc && ( + + ) +} + +export default LetterTemplate diff --git a/src/components/letter/LetterToChenyun.tsx b/src/components/letter/LetterToChenyun.tsx index a91c02a..e1a2ffd 100644 --- a/src/components/letter/LetterToChenyun.tsx +++ b/src/components/letter/LetterToChenyun.tsx @@ -1,68 +1,17 @@ -import { useEffect, useState } from 'react' -import { AnimatePresence, motion } from 'framer-motion' -import { getStaticImage } from '@/lib/utils' -import { Image } from '@/components' +import LetterTemplate, { type LetterFieldConfig } from './LetterTemplate' export interface LetterToChenyunProps { - /** 是否可见 */ visible?: boolean - /** 关闭回调 */ onClose?: () => void - /** 提交回调 */ onSubmit?: (values: string[]) => void + onAnimationEnd?: () => void + audioSrc?: string + showVideo?: boolean + videoSrc?: string + replyImageSrc?: string } -/** - * LetterToChenyun 组件 - 寄给陈云爷爷的信 - * 包含飞入和放大动画 - */ -const LetterToChenyun = ({ visible = false, onClose, onSubmit }: LetterToChenyunProps) => { - // 下划线可填写内容 - const [blankValues, setBlankValues] = useState([]) - // 每个空的校验状态:true 表示该空当前不符合要求(为空或超过 10 个字) - const [blankErrors, setBlankErrors] = useState([]) - - // 是否已提交:提交后隐藏编辑信件,展示只读信件 - const [submitted, setSubmitted] = useState(false) - - // 校验输入:不能为空、每个不超过 10 个字符 - const validateBlanks = () => { - // 计算占位总数,防止有些没被输入过而是 undefined - const placeholderCount = (letterContent.match(/____/g) || []).length - - const nextErrors: boolean[] = Array(placeholderCount).fill(false) - const nextValues: string[] = [...blankValues] - let hasError = false - - for (let i = 0; i < placeholderCount; i++) { - const raw = blankValues[i] || '' - const v = raw.trim() - - // 为空 或 超过 10 个字,都视为不符合要求:清空并标红 - if (!v || v.length > 10) { - nextValues[i] = '' - nextErrors[i] = true - hasError = true - } - } - - setBlankValues(nextValues) - setBlankErrors(nextErrors) - - return !hasError - } - - // 弹窗关闭后重置内容,方便下次重新填写 - useEffect(() => { - if (!visible) { - setSubmitted(false) - setBlankValues([]) - setBlankErrors([]) - } - }, [visible]) - - // 信件内容模板(根据设计稿) - const letterContent = `敬爱的陈云爷爷: +const letterContent = `敬爱的陈云爷爷: 您好! 我是____专业的学生。今天,我怀着崇敬又激动的心情,参观了位于上海市青浦区练塘镇的陈云纪念馆,学习了您“不唯上、不唯书、只唯____”的做事准则,还有“综合平衡”“人民至上”的经济思想。我深刻体会到,这些精神不仅是建设年代的智慧结晶,更是新时代指引我们前行的思想灯塔。 @@ -71,250 +20,63 @@ const LetterToChenyun = ({ visible = false, onClose, onSubmit }: LetterToChenyun 站在新时代的起点,我一定以____为志向,勤学苦练,传承精神,让您的务实担当在青春里扎根,让奋斗在建设祖国的实践中绽放光彩!` +const fields: Record = { + 0: { + type: 'input', + maxLength: 12, + widthClassName: 'w-[120px]', + readOnlyFallback: '实践', + }, + 1: { + type: 'input', + maxLength: 12, + widthClassName: 'w-[120px]', + readOnlyFallback: '勤学钻研', + }, + 2: { + type: 'input', + maxLength: 12, + widthClassName: 'w-[120px]', + readOnlyFallback: '人民利益', + }, + 3: { + type: 'input', + maxLength: 12, + widthClassName: 'w-[120px]', + readOnlyFallback: '专业', + }, + 4: { + type: 'input', + maxLength: 12, + widthClassName: 'w-[120px]', + readOnlyFallback: '实干报国', + }, +} + +const LetterToChenyun = ({ + visible = false, + onClose, + onSubmit, + onAnimationEnd, + audioSrc = 'audio/letter/8如愿.m4a', + showVideo = true, + videoSrc = 'video/letter/neihua_jixin.mp4', + replyImageSrc = 'components/letter/点击信详情-陈云', +}: LetterToChenyunProps) => { return ( - - {visible && ( - <> - {/* 遮罩层 */} - - - {/* 信件容器 */} - -
e.stopPropagation()} - style={{ perspective: '1200px' }} - > - {/* 编辑态 / 只读态:Y 轴翻转切换 */} - - {/* 前面:编辑态 */} -
- {/* 编辑态:信纸背景 */} - 信纸 - - {/* 标题 - 垂直显示在左侧 */} -
-
- 寄给陈云的信 -
-
- - {/* 信件内容区域(可编辑) */} -
-
- {(() => { - let placeholderIndex = 0 - let foundNiHao = false - return letterContent.split('\n').map((line, lineIndex) => { - // 检测是否已经找到"您好"行 - if (line.includes('您好')) { - foundNiHao = true - } - - // "您好"行之后的非空行需要首行缩进 - const needsIndent = - foundNiHao && line.trim() !== '' && !line.includes('您好') - - const segments = line.split('____') - return ( -
- {segments.map((part, partIndex) => { - const isLast = partIndex === segments.length - 1 - if (isLast) { - return {part} - } - - const currentIndex = placeholderIndex++ - return ( - - {part} - { - const next = [...blankValues] - next[currentIndex] = e.target.value - setBlankValues(next) - - // 用户再次输入时,清除该空的错误高亮 - if (blankErrors[currentIndex]) { - const nextErrs = [...blankErrors] - nextErrs[currentIndex] = false - setBlankErrors(nextErrs) - } - }} - /> - - ) - })} -
- ) - }) - })()} -
-
- - {/* 笔的图片 */} -
- 笔 -
- - {/* 提交按钮:切换到只读信件态 */} -
- 可提交状态 { - if (!validateBlanks()) return - setSubmitted(true) - }} - button - /> -
-
- - {/* 背面:只读态 */} -
- {/* 只读态:新背景 */} - 信件 - 信纸 { - setSubmitted(false) - }} - /> - - {/* 信件内容区域(只读) */} -
-
- {(() => { - let placeholderIndex = 0 - let foundNiHao = false - return letterContent.split('\n').map((line, lineIndex) => { - if (line.includes('您好')) { - foundNiHao = true - } - - const needsIndent = - foundNiHao && line.trim() !== '' && !line.includes('您好') - - const segments = line.split('____') - return ( -
- {segments.map((part, partIndex) => { - const isLast = partIndex === segments.length - 1 - if (isLast) { - return {part} - } - - const currentIndex = placeholderIndex++ - const value = blankValues[currentIndex] ?? '' - - return ( - - {part} - {value || '  '} - - ) - })} -
- ) - }) - })()} -
-
- - {/* 寄出按钮:关闭窗口 */} -
- 寄出 { - onSubmit?.(blankValues) - }} - button - /> -
-
-
-
-
- - )} -
+ ) } diff --git a/src/components/letter/LetterToHuangyanpei.tsx b/src/components/letter/LetterToHuangyanpei.tsx index 0f4a47b..9018db7 100644 --- a/src/components/letter/LetterToHuangyanpei.tsx +++ b/src/components/letter/LetterToHuangyanpei.tsx @@ -1,396 +1,94 @@ -import { useEffect, useState } from 'react' -import { AnimatePresence, motion } from 'framer-motion' -import { getStaticImage } from '@/lib/utils' -import { Image, Select } from '@/components' -import { filterInput } from '@/lib/utils/sensitiveWords' +import LetterTemplate, { type LetterFieldConfig } from './LetterTemplate' export interface LetterToHuangyanpeiProps { - /** 是否可见 */ visible?: boolean - /** 关闭回调 */ onClose?: () => void - /** 提交回调 */ onSubmit?: (values: string[]) => void + onAnimationEnd?: () => void + audioSrc?: string + showVideo?: boolean + videoSrc?: string + replyImageSrc?: string } -/** - * LetterToHuangyanpei 组件 - 写给黄炎培先生的信 - * 包含飞入和放大动画 - */ -const LetterToHuangyanpei = ({ visible = false, onClose, onSubmit }: LetterToHuangyanpeiProps) => { - // 下划线可填写内容 - const [blankValues, setBlankValues] = useState([]) - // 每个空的校验状态:true 表示该空当前不符合要求 - const [blankErrors, setBlankErrors] = useState([]) - - // 是否已提交:提交后隐藏编辑信件,展示只读信件 - const [submitted, setSubmitted] = useState(false) - - // 填空类型定义:0=填空1(限填),1=填空2(任填),2=填空3(任填),3=填空4(限填) - const BLANK_1_ANSWER = '手脑并用' - const BLANK_4_ANSWER = '有业者乐业' - - // 填空1的选项 - const BLANK_1_OPTIONS = [ - '手脑并用', - '有业者乐业', - // "知行合一", - // "学以致用", - // "理论实践" - ] - - // 填空4的选项 - const BLANK_4_OPTIONS = [ - '手脑并用', - '有业者乐业', - // "有业者敬业", - // "有业者精业", - // "有业者成业", - ] - - // 校验输入:确保所有填空符合标准 - const validateBlanks = () => { - // 计算占位总数,防止有些没被输入过而是 undefined - const placeholderCount = (letterContent.match(/____/g) || []).length - - const nextErrors: boolean[] = Array(placeholderCount).fill(false) - const nextValues: string[] = [...blankValues] - let hasError = false - - for (let i = 0; i < placeholderCount; i++) { - const raw = nextValues[i] || '' - const v = raw.trim() - - if (i === 0) { - // 填空1:限填,必须选择"手脑并用" - if (!v || v !== BLANK_1_ANSWER) { - nextValues[i] = '' - nextErrors[i] = true - hasError = true - } - } else if (i === 1 || i === 2) { - // 填空2、3:任填,不能为空,不超过20个字 - if (!v || v.length > 20) { - nextValues[i] = '' - nextErrors[i] = true - hasError = true - } - } else if (i === 3) { - // 填空4:限填,必须选择"有业者乐业" - if (!v || v !== BLANK_4_ANSWER) { - nextValues[i] = '' - nextErrors[i] = true - hasError = true - } - } - } - - setBlankValues(nextValues) - setBlankErrors(nextErrors) - - return !hasError - } - - // 弹窗关闭后重置内容,方便下次重新填写 - useEffect(() => { - if (!visible) { - setSubmitted(false) - setBlankValues([]) - setBlankErrors([]) - } - }, [visible]) - - // 信件内容模板(根据设计稿) - const letterContent = `敬爱的黄炎培先生: +const commonSelectField: LetterFieldConfig = { + type: 'select', + placeholder: '请选择', + fitContent: false, + className: '!w-[120px] !min-w-[120px] shrink-0 px-0', + options: [ + { value: '手脑并用', label: '手脑并用' }, + { value: '有业者乐业', label: '有业者乐业' }, + ], +} +const letterContent = `敬爱的黄炎培先生: 您好! -今天,我循着您的足迹,走进了川沙小学堂的新式课堂,亲历了中华职业学校"手脑并用"的实训时光。那些您为破除旧教育桎梏的奔走、为推广职业教育的坚守、为支援国家危亡的热忱,不再是书本上的文字,而是可感可触的精神力量,深深烙印在我心中。 +今天,我循着您的足迹,走进了川沙小学堂的新式课堂,亲历了中华职业学校“手脑并用”的实训时光。那些您为破除旧教育桎梏的奔走、为推广职业教育的坚守、为支援国家危亡的热忱,不再是书本上的文字,而是可感可触的精神力量,深深烙印在我心中。 -我终于明白,您喊出的"双手万能、____",不是一句口号,而是我们的立身之本;您践行的"教育救国、实业报国",不是一段历史,而是我们这代人接续的使命;您坚守的"因时求变",不是一种选择,而是我们面对未来的底气。 +我终于明白,您喊出的“双手万能、____”,不是一句口号,而是我们的立身之本;您践行的“教育救国、实业报国”,不是一段历史,而是我们这代人接续的使命;您坚守的“因时求变”,不是一种选择,而是我们面对未来的底气。 我是____专业的学生,今后,我会在实训课堂上精益求精,像当年中华职校的学长学姐那样,把技能练到极致;我会在志愿服务中践行担当,用所学知识为身边人、为社会做实事;我更会紧跟时代步伐,努力成为____领域的技能人才,为中国制造升级、为民族产业振兴添砖加瓦! -请您放心,您播下的职教火种,我们会让它在新时代燃烧得更旺;您毕生追求的"无业者有业、____"的愿景,我们会用青春和汗水去实现!` +请您放心,您播下的职教火种,我们会让它在新时代燃烧得更旺;您毕生追求的“使无业者有业,使____”的愿景,我们会用青春和汗水去实现!` +const fields: Record = { + 0: { + ...commonSelectField, + correctValue: '手脑并用', + hints: { + error: '“双手万能、手脑并用”是黄炎培职业教育思想的核心理念之一。', + }, + readOnlyFallback: '手脑并用', + }, + 1: { + type: 'input', + maxLength: 12, + widthClassName: 'w-[120px]', + readOnlyFallback: '', + }, + 2: { + type: 'input', + maxLength: 12, + widthClassName: 'w-[120px]', + readOnlyFallback: '', + }, + 3: { + ...commonSelectField, + correctValue: '有业者乐业', + hints: { + error: '黄炎培把职业教育的目的概括为“使无业者有业,使有业者乐业”。', + }, + readOnlyFallback: '有业者乐业', + }, +} + +const LetterToHuangyanpei = ({ + visible = false, + onClose, + onSubmit, + onAnimationEnd, + audioSrc = 'audio/letter/4不忘初心.m4a', + showVideo = true, + videoSrc = 'video/letter/neihua_jixin.mp4', + replyImageSrc = 'components/letter/点击信详情-黄炎培', +}: LetterToHuangyanpeiProps) => { return ( - - {visible && ( - <> - {/* 遮罩层 */} - - - {/* 信件容器 */} - -
e.stopPropagation()} - style={{ perspective: '1200px' }} - > - {/* 编辑态 / 只读态:Y 轴翻转切换 */} - - {/* 前面:编辑态 */} -
- {/* 编辑态:信纸背景 */} - 信纸 - - {/* 标题 - 垂直显示在左侧 */} -
-
- 写给黄炎培先生的信 -
-
- - {/* 信件内容区域(可编辑) */} -
-
- {(() => { - let placeholderIndex = 0 - let foundNiHao = false - return letterContent.split('\n').map((line, lineIndex) => { - // 检测是否已经找到"您好"行 - if (line.includes('您好')) { - foundNiHao = true - } - - // "您好"行之后的非空行需要首行缩进 - const needsIndent = - foundNiHao && line.trim() !== '' && !line.includes('您好') - - const segments = line.split('____') - return ( -
- {segments.map((part, partIndex) => { - const isLast = partIndex === segments.length - 1 - if (isLast) { - return {part} - } - - const currentIndex = placeholderIndex++ - const isLimitedFill = currentIndex === 0 || currentIndex === 3 // 填空1和填空4为限填 - const options = - currentIndex === 0 ? BLANK_1_OPTIONS : BLANK_4_OPTIONS - - return ( - - {part} - {isLimitedFill ? ( - // 限填:下拉选择 - { - const rawValue = e.target.value - // 应用敏感词过滤 - const filteredValue = filterInput(rawValue) - - const next = [...blankValues] - next[currentIndex] = filteredValue - setBlankValues(next) - - // 用户再次输入时,清除该空的错误高亮 - if (blankErrors[currentIndex]) { - const nextErrs = [...blankErrors] - nextErrs[currentIndex] = false - setBlankErrors(nextErrs) - } - }} - /> - )} - - ) - })} -
- ) - }) - })()} -
-
- - {/* 笔的图片 */} -
- 笔 -
- - {/* 提交按钮:切换到只读信件态 */} -
- 可提交状态 { - if (!validateBlanks()) return - setSubmitted(true) - }} - button - /> -
-
- - {/* 背面:只读态 */} -
- {/* 只读态:新背景 */} - 信件 - 信纸 { - setSubmitted(false) - }} - /> - - {/* 信件内容区域(只读) */} -
-
- {(() => { - let placeholderIndex = 0 - let foundNiHao = false - return letterContent.split('\n').map((line, lineIndex) => { - if (line.includes('您好')) { - foundNiHao = true - } - - const needsIndent = - foundNiHao && line.trim() !== '' && !line.includes('您好') - - const segments = line.split('____') - return ( -
- {segments.map((part, partIndex) => { - const isLast = partIndex === segments.length - 1 - if (isLast) { - return {part} - } - - const currentIndex = placeholderIndex++ - const value = blankValues[currentIndex] ?? '' - - return ( - - {part} - {value || '  '} - - ) - })} -
- ) - }) - })()} -
-
- - {/* 寄出按钮:关闭窗口 */} -
- 寄出 { - // 寄出前再次校验,确保所有填空符合标准 - if (validateBlanks()) { - onSubmit?.(blankValues) - } - }} - button - /> -
-
-
-
-
- - )} -
+ ) } diff --git a/src/components/letter/LetterToLuxun.tsx b/src/components/letter/LetterToLuxun.tsx index 41f8521..7ed421e 100644 --- a/src/components/letter/LetterToLuxun.tsx +++ b/src/components/letter/LetterToLuxun.tsx @@ -1,397 +1,128 @@ -import { useEffect, useState } from 'react' -import { AnimatePresence, motion } from 'framer-motion' -import { getStaticImage } from '@/lib/utils' -import { Image, Select } from '@/components' +import LetterTemplate, { type LetterFieldConfig } from './LetterTemplate' export interface LetterToLuxunProps { - /** 是否可见 */ visible?: boolean - /** 关闭回调 */ onClose?: () => void - /** 提交回调 */ onSubmit?: (values: string[]) => void + onAnimationEnd?: () => void + audioSrc?: string + showVideo?: boolean + videoSrc?: string + replyImageSrc?: string } -/** - * LetterToLuxun 组件 - 写给鲁迅先生的信 - * 包含飞入和放大动画 - */ -const LetterToLuxun = ({ visible = false, onClose, onSubmit }: LetterToLuxunProps) => { - // 下划线可填写内容 - const [blankValues, setBlankValues] = useState([]) - // 每个空的校验状态:true 表示该空当前不符合要求(为空或超过 10 个字) - const [blankErrors, setBlankErrors] = useState([]) +const commonSelectField: LetterFieldConfig = { + type: 'select', + placeholder: '请选择', + fitContent: false, + className: '!w-[120px] !min-w-[120px] shrink-0 px-0', + options: [ + { value: '旨在立人', label: '旨在立人' }, + { value: '批判求真', label: '批判求真' }, + ], +} - // 是否已提交:提交后隐藏编辑信件,展示只读信件 - const [submitted, setSubmitted] = useState(false) - - // 填空类型定义:0=填空1(限填),1=填空2(限填),其他=任填 - const BLANK_1_ANSWER = '首在立人' - const BLANK_2_ANSWER = '批判求真' - - // 填空1的选项 - const BLANK_1_OPTIONS = [ - '首在立人', - '批判求真', - // 可以添加其他选项 - ] - - // 填空2的选项 - const BLANK_2_OPTIONS = [ - '首在立人', - '批判求真', - // 可以添加其他选项 - ] - - // 校验输入:确保所有填空符合标准 - const validateBlanks = () => { - // 计算占位总数,防止有些没被输入过而是 undefined - const placeholderCount = (letterContent.match(/____/g) || []).length - - const nextErrors: boolean[] = Array(placeholderCount).fill(false) - const nextValues: string[] = [...blankValues] - let hasError = false - - for (let i = 0; i < placeholderCount; i++) { - const raw = nextValues[i] || '' - const v = raw.trim() - - if (i === 0) { - // 填空1:限填,必须选择"首在立人" - if (!v || v !== BLANK_1_ANSWER) { - nextValues[i] = '' - nextErrors[i] = true - hasError = true - } - } else if (i === 1) { - // 填空2:限填,必须选择"批判求真" - if (!v || v !== BLANK_2_ANSWER) { - nextValues[i] = '' - nextErrors[i] = true - hasError = true - } - } else { - // 其他填空:任填,不能为空,不超过 10 个字 - if (!v || v.length > 10) { - nextValues[i] = '' - nextErrors[i] = true - hasError = true - } - } - } - - setBlankValues(nextValues) - setBlankErrors(nextErrors) - - return !hasError - } - - // 弹窗关闭后重置内容,方便下次重新填写 - useEffect(() => { - if (!visible) { - setSubmitted(false) - setBlankValues([]) - setBlankErrors([]) - } - }, [visible]) - - // 信件内容模板(根据设计稿) - const letterContent = `敬爱的鲁迅先生: +const letterContent = `敬爱的鲁迅先生: 您好! -今天,我怀着崇敬的心情走进大陆新村9号,看着您亲手撰写的《呐喊》《且介亭杂文》《故事新编》等作品,您编辑的《萌芽》《前哨》等杂志,您翻译的《艺术论》《死魂灵》等译文,仿佛能看到您"吾将上下而求索"的身影。在这场跨越时空的对话中,我终于明白您坚守的"____",不是抽象的理念,而是我们安身立命的根本;您秉持的"____",不是无谓的锋芒,而是我们直面现实的勇气。 +今天,我怀着崇敬的心情走进大陆新村 9 号,看着您亲手撰写的《呐喊》《且介亭杂文》《故事新编》等作品,您编辑的《萌芽》《前哨》等杂志,您翻译的《艺术论》《死魂灵》等译文,仿佛能看到您“吾将上下而求索”的身影。在这场跨越时空的对话中,我终于明白您坚守的“____”,不是抽象的理念,而是我们安身立命的根本;您秉持的“____”,不是无谓的锋芒,而是我们直面现实的勇气。 -我是____专业的学生,今后,我会以您"____千夫指"的骨气,在是非面前坚守立场,不随波逐流;我会以您"俯首甘为____"的热忱,参与____活动,用微光温暖他人;我更会记住您"____,走的人多了,便成了路"的箴言,在专业领域勇于探索,努力用____为民族复兴、文化繁荣添砖加瓦。 +我是____专业的学生,今后,我会以您“____于夫指”的骨气,在是非面前坚守立场,不随波逐流;我会以您“俯首甘为____”的热忱,参与____活动,用微光温暖他人;我更会记住您“____,走的人多了,也便成了路”的箴言,在专业领域勇于探索,努力用____为民族复兴、文化繁荣添砖加瓦。 -请您放心,您播下的"立人"火种,我们会让它在新时代燎原;您毕生追求的"人国"愿景,我们会用青春和奋斗去守护!` +请您放心,您播下的“立人”火种,我们会让它在新时代燎原;您毕生追求的“人国”愿景,我们会用青春和奋斗去守护!` +const fields: Record = { + 0: { + ...commonSelectField, + correctValue: '旨在立人', + hints: { + error: '请你结合上下文和所学在想想吧!', + }, + readOnlyFallback: '旨在立人', + }, + 1: { + ...commonSelectField, + correctValue: '批判求真', + hints: { + error: '请你结合上下文和所学在想想吧!', + }, + readOnlyFallback: '批判求真', + }, + 2: { + type: 'input', + maxLength: 12, + widthClassName: 'w-[120px]', + readOnlyFallback: '中文', + }, + 3: { + type: 'input', + maxLength: 12, + widthClassName: 'w-[120px]', + correctValue: '横眉冷对', + readOnlyFallback: '横眉冷对', + hints: { + error: '“横眉冷对于夫指,俯首甘为孺子牛”出自鲁迅先生的《自嘲》一诗。', + }, + }, + 4: { + type: 'input', + maxLength: 12, + widthClassName: 'w-[120px]', + correctValue: '孺子牛', + readOnlyFallback: '孺子牛', + hints: { + error: '“横眉冷对于夫指,俯首甘为孺子牛”出自鲁迅先生的《自嘲》一诗。', + }, + }, + 5: { + type: 'input', + maxLength: 12, + widthClassName: 'w-[120px]', + readOnlyFallback: '志愿服务', + }, + 6: { + type: 'input', + maxLength: 16, + widthClassName: 'w-[120px]', + correctValue: '世上本没有路', + readOnlyFallback: '世上本没有路', + hints: { + error: '鲁迅在小说《故乡》中写道:“地上本没有路,走的人多了,也便成了路。”', + }, + }, + 7: { + type: 'input', + maxLength: 12, + widthClassName: 'w-[120px]', + readOnlyFallback: '专业所长', + }, +} + +const LetterToLuxun = ({ + visible = false, + onClose, + onSubmit, + onAnimationEnd, + audioSrc = 'audio/letter/3我和我的祖国.m4a', + showVideo = true, + videoSrc = 'video/letter/neihua_jixin.mp4', + replyImageSrc = 'components/letter/点击信详情-鲁迅', +}: LetterToLuxunProps) => { return ( - - {visible && ( - <> - {/* 遮罩层 */} - - - {/* 信件容器 */} - -
e.stopPropagation()} - style={{ perspective: '1200px' }} - > - {/* 编辑态 / 只读态:Y 轴翻转切换 */} - - {/* 前面:编辑态 */} -
- {/* 编辑态:信纸背景 */} - 信纸 - - {/* 标题 - 垂直显示在左侧 */} -
-
- 写给鲁迅先生的信 -
-
- - {/* 信件内容区域(可编辑) */} -
-
- {(() => { - let placeholderIndex = 0 - let foundNiHao = false - return letterContent.split('\n').map((line, lineIndex) => { - // 检测是否已经找到"您好"行 - if (line.includes('您好')) { - foundNiHao = true - } - - // "您好"行之后的非空行需要首行缩进 - const needsIndent = - foundNiHao && line.trim() !== '' && !line.includes('您好') - - const segments = line.split('____') - return ( -
- {segments.map((part, partIndex) => { - const isLast = partIndex === segments.length - 1 - if (isLast) { - return {part} - } - - const currentIndex = placeholderIndex++ - const isLimitedFill = currentIndex === 0 || currentIndex === 1 // 填空1和填空2为限填 - const options = - currentIndex === 0 ? BLANK_1_OPTIONS : BLANK_2_OPTIONS - - return ( - - {part} - {isLimitedFill ? ( - // 限填:下拉选择 - { - const next = [...blankValues] - next[currentIndex] = e.target.value - setBlankValues(next) - - // 用户再次输入时,清除该空的错误高亮 - if (blankErrors[currentIndex]) { - const nextErrs = [...blankErrors] - nextErrs[currentIndex] = false - setBlankErrors(nextErrs) - } - }} - /> - )} - - ) - })} -
- ) - }) - })()} -
-
- - {/* 笔的图片 */} -
- 笔 -
- - {/* 提交按钮:切换到只读信件态 */} -
- 可提交状态 { - if (!validateBlanks()) return - setSubmitted(true) - }} - button - /> -
- - {/* 寄信图标(可选,如果需要的话) */} - {/*
- 寄信 -
*/} -
- - {/* 背面:只读态 */} -
- {/* 只读态:新背景 */} - 信件 - 信纸 { - setSubmitted(false) - }} - /> - - {/* 信件内容区域(只读) */} -
-
- {(() => { - let placeholderIndex = 0 - let foundNiHao = false - return letterContent.split('\n').map((line, lineIndex) => { - if (line.includes('您好')) { - foundNiHao = true - } - - const needsIndent = - foundNiHao && line.trim() !== '' && !line.includes('您好') - - const segments = line.split('____') - return ( -
- {segments.map((part, partIndex) => { - const isLast = partIndex === segments.length - 1 - if (isLast) { - return {part} - } - - const currentIndex = placeholderIndex++ - const value = blankValues[currentIndex] ?? '' - - return ( - - {part} - {value || '  '} - - ) - })} -
- ) - }) - })()} -
-
- - {/* 寄出按钮:关闭窗口 */} -
- 寄出 { - onSubmit?.(blankValues) - }} - button - /> -
-
-
-
-
- - )} -
+ ) } diff --git a/src/components/letter/LetterToMaozedong.tsx b/src/components/letter/LetterToMaozedong.tsx new file mode 100644 index 0000000..4b27c4e --- /dev/null +++ b/src/components/letter/LetterToMaozedong.tsx @@ -0,0 +1,150 @@ +import LetterTemplate, { type LetterFieldConfig } from './LetterTemplate' + +export interface LetterToMaozedongProps { + visible?: boolean + onClose?: () => void + onSubmit?: (values: string[]) => void + onAnimationEnd?: () => void + audioSrc?: string + showVideo?: boolean + videoSrc?: string + replyImageSrc?: string +} + +const commonSelectField: LetterFieldConfig = { + type: 'select', + placeholder: '请选择', + fitContent: false, + className: '!w-[120px] !min-w-[120px] shrink-0 px-0', + options: [ + { value: '实事求是', label: '实事求是' }, + { value: '群众路线', label: '群众路线' }, + { value: '独立自主', label: '独立自主' }, + ], +} + +const letterContent = `敬爱的毛泽东主席: + +您好! + +我是____专业的学生。今天,我怀着崇敬又激动的心情,参观了位于茂名北路120弄甲秀里的上海毛泽东旧居陈列馆,学习了毛泽东思想活的灵魂——____、____、____。我深刻体会到,这十二个字不仅是革命年代的智慧结晶,更是新时代指引我们前行的思想灯塔。 + +作为中职生,我深知“____”要求我们在专业学习中脚踏实地,掌握扎实技能;“____”提醒我们,未来无论从事什么职业,都要以服务社会、贡献他人为己任;而“独立自主”则激励我们,在技术革新中____,像C919大飞机团队那样,用____本领(结合所学专业)为推进中国式现代化贡献自己的力量! + +站在新时代的起点,我一定以____为志向,勤学苦练,精益求精,让____精神在手中传承,让青春在建设祖国的实践中绽放光彩!` + +const fields: Record = { + 0: { + type: 'input', + maxLength: 12, + widthClassName: 'w-[120px]', + readOnlyFallback: '计算机', + }, + 1: { + ...commonSelectField, + correctValue: '实事求是', + hints: { + error: '再想想哦,这里强调的是毛泽东思想活的灵魂之一“实事求是”。', + }, + readOnlyFallback: '实事求是', + }, + 2: { + ...commonSelectField, + correctValue: '群众路线', + hints: { + error: '再想想哦,这里对应的是毛泽东思想活的灵魂之一“群众路线”。', + }, + readOnlyFallback: '群众路线', + }, + 3: { + ...commonSelectField, + correctValue: '独立自主', + hints: { + error: '再想想哦,这里对应的是毛泽东思想活的灵魂之一“独立自主”。', + }, + readOnlyFallback: '独立自主', + }, + 4: { + type: 'select', + placeholder: '请选择', + fitContent: false, + className: '!w-[120px] !min-w-[120px] shrink-0 px-0', + options: [ + { value: '实事求是', label: '实事求是' }, + { value: '群众路线', label: '群众路线' }, + ], + correctValue: '实事求是', + hints: { + error: '再想想哦,这里强调的是在专业学习中脚踏实地、掌握扎实技能。', + }, + readOnlyFallback: '实事求是', + }, + 5: { + type: 'select', + placeholder: '请选择', + fitContent: false, + className: '!w-[120px] !min-w-[120px] shrink-0 px-0', + options: [ + { value: '实事求是', label: '实事求是' }, + { value: '群众路线', label: '群众路线' }, + ], + correctValue: '群众路线', + hints: { + error: '再想想哦,这里对应的是服务社会、贡献他人的“群众路线”精神。', + }, + readOnlyFallback: '群众路线', + }, + 6: { + type: 'input', + maxLength: 12, + widthClassName: 'w-[120px]', + readOnlyFallback: '勇于突破', + }, + 7: { + type: 'input', + maxLength: 14, + widthClassName: 'w-[120px]', + readOnlyFallback: '专业技能', + }, + 8: { + type: 'input', + maxLength: 12, + widthClassName: 'w-[120px]', + readOnlyFallback: '技能报国', + }, + 9: { + type: 'input', + maxLength: 12, + widthClassName: 'w-[120px]', + readOnlyFallback: '实事求是', + }, +} + +const LetterToMaozedong = ({ + visible = false, + onClose, + onSubmit, + onAnimationEnd, + audioSrc = 'audio/letter/1东方红.m4a', + showVideo = true, + videoSrc = 'video/letter/neihua_jixin.mp4', + replyImageSrc = 'components/letter/点击信详情-毛泽东', +}: LetterToMaozedongProps) => { + return ( + + ) +} + +export default LetterToMaozedong diff --git a/src/components/letter/LetterToNieer.tsx b/src/components/letter/LetterToNieer.tsx new file mode 100644 index 0000000..e89f4bb --- /dev/null +++ b/src/components/letter/LetterToNieer.tsx @@ -0,0 +1,109 @@ +import LetterTemplate, { type LetterFieldConfig } from './LetterTemplate' + +export interface LetterToNieerProps { + visible?: boolean + onClose?: () => void + onSubmit?: (values: string[]) => void + onAnimationEnd?: () => void + audioSrc?: string + showVideo?: boolean + videoSrc?: string + replyImageSrc?: string +} + +const commonSelectField: LetterFieldConfig = { + type: 'select', + placeholder: '请选择', + fitContent: false, + className: '!w-[120px] !min-w-[120px] shrink-0 px-0', + options: [ + { value: '音乐救国', label: '音乐救国' }, + { value: '为人民而歌', label: '为人民而歌' }, + { value: '探索创新', label: '探索创新' }, + ], +} + +const letterContent = `敬爱的聂耳先生: + +您好! + +今天,我循着激昂的旋律走进您的旧居与国歌展示馆,看着您手写的《义勇军进行曲》曲谱、创作的《开矿歌》《卖报歌》等作品手稿,仿佛能看到您在亭子间熬夜打磨旋律的身影。在这场跨越时空的对话中,我终于明白:您坚守的“____”,不是空洞的口号,而是以音符为武器的担当;您秉持的“____”,不是简单的创作理念,而是扎根生活、传递真情的初心;您践行的“____”,不是盲目的尝试,而是紧跟时代、突破自我的勇气。 + +我是____专业的学生,今后,我会以您“勤学苦练”的毅力,在专业技能上精益求精,就像您每天坚持练习小提琴,打磨每一个音符;我会以您“心系民众”的热忱,参与____活动,用自己的所长温暖他人;我更会记住您“以旋律传力量”的智慧,在时代浪潮中坚守初心,努力用____为民族复兴、国家强盛添砖加瓦。 + +请您放心,您谱写的“起来!不愿做奴隶的人们!”的呐喊,我们从未忘记;您用青春铸就的爱国精神,我们会笃实践行!正如您所期盼的,这激昂的国歌旋律,永远是我们前行的号角!` + +const fields: Record = { + 0: { + ...commonSelectField, + correctValue: '音乐救国', + hints: { + error: '请结合专家的解读和聂耳的创作经历再想想吧!', + }, + readOnlyFallback: '音乐救国', + }, + 1: { + ...commonSelectField, + correctValue: '为人民而歌', + hints: { + error: '请结合专家的解读和聂耳的创作经历再想想吧!', + }, + readOnlyFallback: '为人民而歌', + }, + 2: { + ...commonSelectField, + correctValue: '探索创新', + hints: { + error: '请结合专家的解读和聂耳的创作经历再想想吧!', + }, + readOnlyFallback: '探索创新', + }, + 3: { + type: 'input', + maxLength: 12, + widthClassName: 'w-[120px]', + readOnlyFallback: '音乐', + }, + 4: { + type: 'input', + maxLength: 12, + widthClassName: 'w-[120px]', + readOnlyFallback: '志愿服务', + }, + 5: { + type: 'input', + maxLength: 12, + widthClassName: 'w-[120px]', + readOnlyFallback: '专业所长', + }, +} + +const LetterToNieer = ({ + visible = false, + onClose, + onSubmit, + onAnimationEnd, + audioSrc = 'audio/letter/5我爱你中国.m4a', + showVideo = true, + videoSrc = 'video/letter/neihua_jixin.mp4', + replyImageSrc = 'components/letter/点击信详情-聂耳', +}: LetterToNieerProps) => { + return ( + + ) +} + +export default LetterToNieer diff --git a/src/components/letter/LetterToRongdesheng.tsx b/src/components/letter/LetterToRongdesheng.tsx new file mode 100644 index 0000000..0920c5a --- /dev/null +++ b/src/components/letter/LetterToRongdesheng.tsx @@ -0,0 +1,100 @@ +import LetterTemplate, { type LetterFieldConfig } from './LetterTemplate' + +export interface LetterToRongdeshengProps { + visible?: boolean + onClose?: () => void + onSubmit?: (values: string[]) => void + onAnimationEnd?: () => void + audioSrc?: string + showVideo?: boolean + videoSrc?: string + replyImageSrc?: string +} + +const commonSelectField: LetterFieldConfig = { + type: 'select', + placeholder: '请选择', + fitContent: false, + className: '!w-[120px] !min-w-[120px] shrink-0 px-0', + options: [ + { value: '国家', label: '国家' }, + { value: '个人', label: '个人' }, + ], +} + +const letterContent = `敬爱的荣德生先生: +您好! + +我是____专业的学生。今天,我怀着崇敬的心情参观了您的旧居,了解了您从钱庄学徒到“面粉大王”“纺织巨子”的传奇一生,读懂了您“____”的初心与担当。您在民族危亡时的气节、在艰难时局中的坚守、在事业成功后的奉献,都让我深受震撼。 + +作为新时代青年学生,我会在专业学习中____,像您当年那样钻研实业、精益求精,练就过硬的专业本领;树立正确的财富观和事业观;未来无论从事什么工作,都要把助力____发展放在首位,将个人理想与民族复兴紧密结合;面对困难与挑战时,我会以您为榜样,____,敢于攻坚克难,用自己的专业能力为中国式现代化建设贡献青春力量! + +站在新时代的起点,我一定铭记您的精神,勤学苦练、笃行实干,让实业报国的种子在心中扎根,让奋斗成为青春最亮丽的底色,努力成为一名有理想、有本领、有担当的新时代青年!` + +const fields: Record = { + 0: { + type: 'input', + maxLength: 12, + widthClassName: 'w-[120px]', + readOnlyFallback: '计算机', + }, + 1: { + type: 'input', + maxLength: 16, + widthClassName: 'w-[120px]', + correctValue: '实业救国', + readOnlyFallback: '实业救国', + hints: { + error: '“实业救国”是荣德生先生一生坚守的初心,也是他毕生践行的信念。', + }, + }, + 2: { + type: 'input', + maxLength: 12, + widthClassName: 'w-[120px]', + readOnlyFallback: '努力', + }, + 3: { + ...commonSelectField, + correctValue: '国家', + readOnlyFallback: '国家', + hints: { + error: '青年学生应该将个人理想融入国家发展之中。请你再想想吧!', + }, + }, + 4: { + type: 'input', + maxLength: 12, + widthClassName: 'w-[120px]', + readOnlyFallback: '', + }, +} + +const LetterToRongdesheng = ({ + visible = false, + onClose, + onSubmit, + onAnimationEnd, + audioSrc = 'audio/letter/7走向复兴.mp3', + showVideo = true, + videoSrc = 'video/letter/neihua_jixin.mp4', + replyImageSrc = 'components/letter/点击信详情-荣德生', +}: LetterToRongdeshengProps) => { + return ( + + ) +} + +export default LetterToRongdesheng diff --git a/src/components/letter/LetterToSunzhongshan.tsx b/src/components/letter/LetterToSunzhongshan.tsx index 0d0233d..57ee0a2 100644 --- a/src/components/letter/LetterToSunzhongshan.tsx +++ b/src/components/letter/LetterToSunzhongshan.tsx @@ -1,435 +1,112 @@ -import { useEffect, useState } from 'react' -import { AnimatePresence, motion } from 'framer-motion' -import { getStaticImage } from '@/lib/utils' -import { Image, Select } from '@/components' -import { ErrorAlert } from '@/components/layout' +import LetterTemplate, { type LetterFieldConfig } from './LetterTemplate' export interface LetterToSunzhongshanProps { - /** 是否可见 */ visible?: boolean - /** 关闭回调 */ onClose?: () => void - /** 提交回调 */ onSubmit?: (values: string[]) => void + onAnimationEnd?: () => void + audioSrc?: string + showVideo?: boolean + videoSrc?: string + replyImageSrc?: string +} + +const commonSelectField: LetterFieldConfig = { + type: 'select', + placeholder: '请选择', + fitContent: false, + className: '!w-[120px] !min-w-[120px] shrink-0 px-0', + options: [ + { value: '天下为公', label: '天下为公' }, + { value: '敢为天下先', label: '敢为天下先' }, + { value: '振兴中华', label: '振兴中华' }, + ], +} + +const letterContent = `敬爱的孙中山先生: +您好! + +今天,我怀着崇敬的心情走进香山路 7 号,看着您亲手设计的房屋、勾画的《中国铁路全图》、撰写的《实业计划》手稿,仿佛能看到您为“振兴中华”奔走的身影。在李教授的解读中,我终于明白:您喊出的“____”,不是遥远的历史,而是我们这代人正在接续的接力;您追求的“____”,不是抽象的理念,而是从服务身边人、做好专业事开始的担当;您秉持的“____”,不是过去的选择,而是面对未来时必须有的勇气。 + +我是____专业的学生,今后,我会以您“知难行易”的信念,在专业学习中攻克难题,就像您当年为了革命理想屡败屡战;我会以您“心系民众”的情怀,参与____,帮身边人解决实际困难;我更会记住您“适乎世界之潮流”的智慧,紧跟时代步伐,努力用____为民族复兴添砖加瓦。 + +请您放心,“革命尚未成功,同志仍须努力”的嘱托,我们从未忘记;“振兴中华”的初心,我们会用一生践行!` + +const fields: Record = { + 0: { + ...commonSelectField, + correctValue: '振兴中华', + hints: { + error: '再想想哦,这里强调的是孙中山先生一生为之奋斗的理想。', + }, + readOnlyFallback: '振兴中华', + }, + 1: { + ...commonSelectField, + correctValue: '天下为公', + hints: { + error: '再想想哦,这里强调的是孙中山先生心系国家与人民的博大胸怀。', + }, + readOnlyFallback: '天下为公', + }, + 2: { + ...commonSelectField, + correctValue: '敢为天下先', + hints: { + error: '再想想哦,这里对应的是孙中山先生敢于探索新道路的胆识。', + }, + readOnlyFallback: '敢为天下先', + }, + 3: { + type: 'input', + maxLength: 12, + widthClassName: 'w-[120px]', + readOnlyFallback: '政治', + }, + 4: { + type: 'input', + maxLength: 12, + widthClassName: 'w-[120px]', + readOnlyFallback: '实践担当', + }, + 5: { + type: 'input', + maxLength: 12, + widthClassName: 'w-[120px]', + readOnlyFallback: '时代发展', + }, + 6: { + type: 'input', + maxLength: 12, + widthClassName: 'w-[120px]', + readOnlyFallback: '所学本领', + }, } -/** - * LetterToSunzhongshan 组件 - 写给孙中山爷爷的信 - * 包含飞入和放大动画 - */ const LetterToSunzhongshan = ({ visible = false, onClose, onSubmit, + onAnimationEnd, + audioSrc = 'audio/letter/2理想.m4a', + showVideo = true, + videoSrc = 'video/letter/neihua_jixin.mp4', + replyImageSrc = 'components/letter/点击信详情-孙中山', }: LetterToSunzhongshanProps) => { - // 下划线可填写内容 - const [blankValues, setBlankValues] = useState([]) - // 每个空的校验状态:true 表示该空当前不符合要求(为空或超过 10 个字) - const [blankErrors, setBlankErrors] = useState([]) - - // 是否已提交:提交后隐藏编辑信件,展示只读信件 - const [submitted, setSubmitted] = useState(false) - - // ErrorAlert 相关状态 - const [showErrorAlert, setShowErrorAlert] = useState(false) - const [errorAlertText, setErrorAlertText] = useState('') - - // 前三个空的正确答案 - const BLANK_0_ANSWER = '振兴中华' - const BLANK_1_ANSWER = '天下为公' - const BLANK_2_ANSWER = '与时俱进' - // 最后一个空的正确答案 - const LAST_BLANK_ANSWER = '仍需努力' - - // 前三个空的选项(所有空都用这三个选项) - const SELECT_OPTIONS = [ - { value: '振兴中华', label: '振兴中华' }, - { value: '天下为公', label: '天下为公' }, - { value: '与时俱进', label: '与时俱进' }, - ] - - // 校验输入:前三个空必须选择正确答案,最后一个空必须是"仍需努力",其他空不能为空且不超过 10 个字符 - const validateBlanks = () => { - // 计算占位总数,防止有些没被输入过而是 undefined - const placeholderCount = (letterContent.match(/____/g) || []).length - - const nextErrors: boolean[] = Array(placeholderCount).fill(false) - const nextValues: string[] = [...blankValues] - let hasError = false - - for (let i = 0; i < placeholderCount; i++) { - const raw = blankValues[i] || '' - const v = raw.trim() - - if (i < 3) { - // 前三个空:必须选择正确答案(已在 onChange 中验证,这里只检查是否为空) - if (!v) { - nextValues[i] = '' - nextErrors[i] = true - hasError = true - } - } else if (i === placeholderCount - 1) { - // 最后一个空:必须是"仍需努力" - if (!v || v !== LAST_BLANK_ANSWER) { - nextValues[i] = '' - nextErrors[i] = true - hasError = true - } - } else { - // 其他空:不能为空,不超过 10 个字 - if (!v || v.length > 10) { - nextValues[i] = '' - nextErrors[i] = true - hasError = true - } - } - } - - setBlankValues(nextValues) - setBlankErrors(nextErrors) - - return !hasError - } - - // 弹窗关闭后重置内容,方便下次重新填写 - useEffect(() => { - if (!visible) { - setSubmitted(false) - setBlankValues([]) - setBlankErrors([]) - setShowErrorAlert(false) - setErrorAlertText('') - } - }, [visible]) - - // 信件内容模板(根据设计稿) - const letterContent = `敬爱的孙中山先生: - -您好! - -今天,我怀着崇敬的心情走进香山路7号,看着您亲手设计的房屋、勾画的《中国铁路全图》、撰写的《实业计划》手稿,仿佛能看到您为“振兴中华”奔走的身影。在这场跨越时空的对话中,我终于明白,您喊出的“____”,不是遥远的历史,而是我们这代人正在接续的接力;您追求的“____”,不是抽象的理念,而是从服务身边人、做好专业事开始的担当;您秉持的“____”,不是过去的选择,而是面对未来时必须有的勇气。 - -我是____专业的学生,今后,我会以您“知难行易”的信念,在专业学习中攻克难题,就像您当年为了革命理想屡败屡战;我会以您“心系民众”的情怀,参与____,帮身边人解决实际困难;我更会记住您“适乎世界之潮流”的智慧,紧跟时代步伐,努力用____为民族复兴添砖加瓦。 - -请您放心,“革命尚未成功,同志____”的嘱托,我们从未忘记;“振兴中华”的初心,我们会用一生践行!` - return ( - - {visible && ( - <> - {/* 遮罩层 */} - - - {/* 信件容器 */} - -
e.stopPropagation()} - style={{ perspective: '1200px' }} - > - {/* 编辑态 / 只读态:Y 轴翻转切换 */} - - {/* 前面:编辑态 */} -
- {/* 编辑态:信纸背景 */} - 信纸 - - {/* 标题 - 垂直显示在左侧 */} -
-
- 写给孙中山先生的信 -
-
- - {/* 信件内容区域(可编辑) */} -
-
- {(() => { - let placeholderIndex = 0 - let foundNiHao = false - return letterContent.split('\n').map((line, lineIndex) => { - // 检测是否已经找到"您好"行 - if (line.includes('您好')) { - foundNiHao = true - } - - // "您好"行之后的非空行需要首行缩进 - const needsIndent = - foundNiHao && line.trim() !== '' && !line.includes('您好') - - const segments = line.split('____') - return ( -
- {segments.map((part, partIndex) => { - const isLast = partIndex === segments.length - 1 - if (isLast) { - return {part} - } - - const currentIndex = placeholderIndex++ - const isSelectFill = currentIndex < 3 // 前三个空使用 Select - - return ( - - {part} - {isSelectFill ? ( - // 前三个空:下拉选择 - { - const next = [...blankValues] - next[currentIndex] = e.target.value - setBlankValues(next) - - // 用户再次输入时,清除该空的错误高亮 - if (blankErrors[currentIndex]) { - const nextErrs = [...blankErrors] - nextErrs[currentIndex] = false - setBlankErrors(nextErrs) - } - }} - /> - )} - - ) - })} -
- ) - }) - })()} -
-
- - {/* 笔的图片 */} -
- 笔 -
- - {/* 提交按钮:切换到只读信件态 */} -
- 可提交状态 { - if (!validateBlanks()) return - setSubmitted(true) - }} - button - /> -
- - {/* 寄信图标(可选,如果需要的话) */} - {/*
- 寄信 -
*/} -
- - {/* 背面:只读态 */} -
- {/* 只读态:新背景 */} - 信件 - 信纸 { - setSubmitted(false) - }} - /> - - {/* 信件内容区域(只读) */} -
-
- {(() => { - let placeholderIndex = 0 - let foundNiHao = false - return letterContent.split('\n').map((line, lineIndex) => { - if (line.includes('您好')) { - foundNiHao = true - } - - const needsIndent = - foundNiHao && line.trim() !== '' && !line.includes('您好') - - const segments = line.split('____') - return ( -
- {segments.map((part, partIndex) => { - const isLast = partIndex === segments.length - 1 - if (isLast) { - return {part} - } - - const currentIndex = placeholderIndex++ - const value = blankValues[currentIndex] ?? '' - - return ( - - {part} - {value || '  '} - - ) - })} -
- ) - }) - })()} -
-
- - {/* 寄出按钮:关闭窗口 */} -
- 寄出 { - onSubmit?.(blankValues) - }} - button - /> -
-
-
-
-
- - {/* 错误提示弹窗 */} - setShowErrorAlert(false)} - onMaskClick={() => setShowErrorAlert(false)} - zIndex={10002} - /> - - )} -
+ ) } diff --git a/src/components/letter/LetterToZhangleping.tsx b/src/components/letter/LetterToZhangleping.tsx new file mode 100644 index 0000000..8afb71d --- /dev/null +++ b/src/components/letter/LetterToZhangleping.tsx @@ -0,0 +1,123 @@ +import LetterTemplate, { type LetterFieldConfig } from './LetterTemplate' + +export interface LetterToZhanglepingProps { + visible?: boolean + onClose?: () => void + onSubmit?: (values: string[]) => void + onAnimationEnd?: () => void + audioSrc?: string + showVideo?: boolean + videoSrc?: string + replyImageSrc?: string +} + +const letterContent = `敬爱的张乐平先生: +您好! + +今天,我循着您的笔墨足迹,走进了这座充满着您创作的温度的故居。看着三毛从流浪儿到戴红领巾的成长画卷,了解到您“艺术源于生活”的创作坚持,我终于明白:您坚守的“____”,不是简单的创作技巧,而是扎根现实、传递真情的态度;您追求的“____”,不是刻意的形式简化,而是以少胜多、直击人心的智慧;您传递的“____”,不是空洞的道德说教,而是藏在细节中的悲悯与坚守。 + +我是____专业的学生,今后,我会践行您“笔耕不辍”的坚持,在专业学习中打磨____技能,就像您六十多年如一日坚守漫画创作;我会学习您“贴近生活”的真诚,用____帮助身边有需要的人,让美好在细微处传递;我更会传承您“笔墨随时代”的智慧,紧跟潮流,努力用____传递正能量。请您放心,您笔下的善良与勇敢和您坚守的真诚与热爱,会在我们新时代青年的传承下焕发新的光彩!` + +const fields: Record = { + 0: { + type: 'select', + placeholder: '请选择', + fitContent: false, + className: '!w-[120px] !min-w-[120px] shrink-0 px-0', + options: [ + { value: '源于生活', label: '源于生活' }, + { value: '化繁为简', label: '化繁为简' }, + { value: '向善向美', label: '向善向美' }, + ], + correctValue: '源于生活', + hints: { + error: '请你结合上下文和所学再想想吧!', + }, + readOnlyFallback: '源于生活', + }, + 1: { + type: 'select', + placeholder: '请选择', + fitContent: false, + className: '!w-[120px] !min-w-[120px] shrink-0 px-0', + options: [ + { value: '源于生活', label: '源于生活' }, + { value: '化繁为简', label: '化繁为简' }, + { value: '向善向美', label: '向善向美' }, + ], + correctValue: '化繁为简', + hints: { + error: '请你结合上下文和所学再想想吧!', + }, + readOnlyFallback: '化繁为简', + }, + 2: { + type: 'select', + placeholder: '请选择', + fitContent: false, + className: '!w-[120px] !min-w-[120px] shrink-0 px-0', + options: [ + { value: '源于生活', label: '源于生活' }, + { value: '化繁为简', label: '化繁为简' }, + { value: '向善向美', label: '向善向美' }, + ], + correctValue: '向善向美', + hints: { + error: '请你结合上下文和所学再想想吧!', + }, + readOnlyFallback: '向善向美', + }, + 3: { + type: 'input', + maxLength: 12, + widthClassName: 'w-[120px]', + readOnlyFallback: '美术', + }, + 4: { + type: 'input', + maxLength: 12, + widthClassName: 'w-[120px]', + readOnlyFallback: '创作', + }, + 5: { + type: 'input', + maxLength: 12, + widthClassName: 'w-[120px]', + readOnlyFallback: '行动', + }, + 6: { + type: 'input', + maxLength: 12, + widthClassName: 'w-[120px]', + readOnlyFallback: '作品', + }, +} + +const LetterToZhangleping = ({ + visible = false, + onClose, + onSubmit, + onAnimationEnd, + audioSrc = 'audio/letter/6灯火里的中国.m4a', + showVideo = true, + videoSrc = 'video/letter/neihua_jixin.mp4', + replyImageSrc = 'components/letter/点击信详情-张乐平', +}: LetterToZhanglepingProps) => { + return ( + + ) +} + +export default LetterToZhangleping diff --git a/src/components/letter/index.ts b/src/components/letter/index.ts index ea64631..1c6930d 100644 --- a/src/components/letter/index.ts +++ b/src/components/letter/index.ts @@ -1,6 +1,9 @@ export { default as LetterToChenyun } from './LetterToChenyun' export type { LetterToChenyunProps } from './LetterToChenyun' +export { default as LetterToMaozedong } from './LetterToMaozedong' +export type { LetterToMaozedongProps } from './LetterToMaozedong' + export { default as LetterToSunzhongshan } from './LetterToSunzhongshan' export type { LetterToSunzhongshanProps } from './LetterToSunzhongshan' @@ -9,3 +12,12 @@ export type { LetterToHuangyanpeiProps } from './LetterToHuangyanpei' export { default as LetterToLuxun } from './LetterToLuxun' export type { LetterToLuxunProps } from './LetterToLuxun' + +export { default as LetterToZhangleping } from './LetterToZhangleping' +export type { LetterToZhanglepingProps } from './LetterToZhangleping' + +export { default as LetterToNieer } from './LetterToNieer' +export type { LetterToNieerProps } from './LetterToNieer' + +export { default as LetterToRongdesheng } from './LetterToRongdesheng' +export type { LetterToRongdeshengProps } from './LetterToRongdesheng' diff --git a/src/components/overlay/EndingOverlay.tsx b/src/components/overlay/EndingOverlay.tsx index 75bc18f..836dcd1 100644 --- a/src/components/overlay/EndingOverlay.tsx +++ b/src/components/overlay/EndingOverlay.tsx @@ -114,10 +114,10 @@ export const EndingOverlay = ({ if (!visible) return null return ( -
+
{/* 文本内容层 */}
{ huangyanpei: '黄炎培', luxun: '鲁迅', sunzhongshan: '孙中山', + maozedong: '毛泽东', } return nameMap[residence] || residence @@ -262,7 +263,7 @@ const PuzzleSystem = ({ visible, onClose, residence }: PuzzleSystemProps) => {
{/* SVG拼图容器 - 使用3D变换和缩放 */} -
+
( )} > {renderOption - ? renderOption(option, isUsed) + ? renderOption(option, isUsed, isDragging) : defaultRenderOption(option, isUsed)}
) @@ -515,7 +515,7 @@ const DragFill = forwardRef( dragPosition && createPortal(
ReactNode + renderOption?: (option: DragFillOption, isUsed: boolean, isDragging: boolean) => ReactNode /** 自定义渲染空白区域 */ renderBlank?: (blank: DragFillBlank, filledValue: string | null, isHovered: boolean) => ReactNode /** 自定义渲染拖拽中的元素 */ diff --git a/src/components/select/select.tsx b/src/components/select/select.tsx index 9a18aa0..643b459 100644 --- a/src/components/select/select.tsx +++ b/src/components/select/select.tsx @@ -34,6 +34,7 @@ const Select = forwardRef( fitContent = false, minWidth, maxWidth, + fontSize = 26, }, ref ) => { @@ -41,7 +42,6 @@ const Select = forwardRef( const [focusedIndex, setFocusedIndex] = useState(-1) const triggerRef = useRef(null) const dropdownRef = useRef(null) - const measureRef = useRef(null) const [dropdownPosition, setDropdownPosition] = useState<{ top: number left: number @@ -49,30 +49,23 @@ const Select = forwardRef( } | null>(null) const [contentWidth, setContentWidth] = useState(null) - // 获取当前选中的选项 const selectedOption = options.find((opt) => opt.value === value) - // 计算内容宽度(用于 fitContent) const calculateContentWidth = useCallback(() => { if (!fitContent || !triggerRef.current) return - // 获取触发器的计算样式,用于匹配字体 const triggerStyles = window.getComputedStyle(triggerRef.current) - - // 创建一个临时元素来测量所有选项的宽度 const tempElement = document.createElement('span') tempElement.style.visibility = 'hidden' tempElement.style.position = 'absolute' tempElement.style.whiteSpace = 'nowrap' - tempElement.style.fontSize = triggerStyles.fontSize + tempElement.style.fontSize = fontSize ? `${fontSize}px` : triggerStyles.fontSize tempElement.style.fontFamily = triggerStyles.fontFamily tempElement.style.fontWeight = triggerStyles.fontWeight - tempElement.style.padding = '8px 12px' // 与选项 padding 一致 (py-2 px-3) + tempElement.style.padding = '8px 12px' document.body.appendChild(tempElement) let calculatedWidth = 0 - - // 测量所有选项和占位符的宽度 const textsToMeasure = [placeholder, ...options.map((opt) => opt.label)] textsToMeasure.forEach((text) => { @@ -85,7 +78,6 @@ const Select = forwardRef( document.body.removeChild(tempElement) - // 应用最小和最大宽度限制 if (minWidth !== undefined && calculatedWidth < minWidth) { calculatedWidth = minWidth } @@ -94,61 +86,48 @@ const Select = forwardRef( } setContentWidth(calculatedWidth) - }, [fitContent, options, placeholder, minWidth, maxWidth]) + }, [fitContent, maxWidth, minWidth, options, placeholder]) - // 计算下拉菜单位置 const updateDropdownPosition = useCallback(() => { if (!triggerRef.current) return const rect = triggerRef.current.getBoundingClientRect() - let width = rect.width - - // 如果启用 fitContent,使用计算出的内容宽度 - if (fitContent && contentWidth !== null) { - // width = contentWidth; - width = 0 - } + const width = fitContent && contentWidth !== null ? contentWidth : rect.width setDropdownPosition({ top: rect.bottom + window.scrollY, left: rect.left + window.scrollX, - width: width, + width, }) - }, [fitContent, contentWidth]) + }, [contentWidth, fitContent]) - // 打开下拉菜单 const handleOpen = useCallback(() => { if (disabled) return - // 如果启用 fitContent,先计算内容宽度 + if (fitContent) { calculateContentWidth() } - // 使用 setTimeout 确保内容宽度计算完成后再更新位置 + setTimeout(() => { updateDropdownPosition() setIsOpen(true) setFocusedIndex(value ? options.findIndex((opt) => opt.value === value) : -1) }, 0) - }, [disabled, fitContent, calculateContentWidth, updateDropdownPosition, value, options]) + }, [calculateContentWidth, disabled, fitContent, options, updateDropdownPosition, value]) - // 关闭下拉菜单 const handleClose = useCallback(() => { setIsOpen(false) setFocusedIndex(-1) }, []) - // 选择选项 const handleSelect = useCallback( (optionValue: string) => { - if (onChange) { - onChange(optionValue) - } + onChange?.(optionValue) handleClose() }, - [onChange, handleClose] + [handleClose, onChange] ) - // 点击外部关闭 useEffect(() => { if (!isOpen) return @@ -180,9 +159,8 @@ const Select = forwardRef( window.removeEventListener('scroll', handleScroll, true) window.removeEventListener('resize', handleResize) } - }, [isOpen, handleClose, updateDropdownPosition]) + }, [handleClose, isOpen, updateDropdownPosition]) - // 键盘导航 useEffect(() => { if (!isOpen) return @@ -231,9 +209,8 @@ const Select = forwardRef( return () => { document.removeEventListener('keydown', handleKeyDown) } - }, [isOpen, focusedIndex, options, handleSelect, handleClose]) + }, [focusedIndex, handleClose, handleSelect, isOpen, options]) - // 滚动到选中项 useEffect(() => { if (isOpen && focusedIndex >= 0 && dropdownRef.current) { const optionElement = dropdownRef.current.querySelector( @@ -246,24 +223,12 @@ const Select = forwardRef( }) } } - }, [isOpen, focusedIndex]) + }, [focusedIndex, isOpen]) + + const displayText = selectedOption ? selectedOption.label : placeholder return ( <> - {/* 隐藏的测量元素(用于 fitContent 模式) */} - {fitContent && ( -