From d721965e8d7305f9327feea9393d62086780c6f3 Mon Sep 17 00:00:00 2001 From: iammm0 Date: Mon, 25 May 2026 17:42:44 +0800 Subject: [PATCH] Add Heguang Tongkun landing page with light theme and refined UI. Ship the full Vite/React marketing site with white-background styling, softer gradients, rounded typography, and section layout updates from the design pass. Co-authored-by: Cursor --- .gitignore | 6 + README.md | 29 + index.html | 24 + package-lock.json | 2578 ++++++++++++++++++++++++++++++ package.json | 29 + postcss.config.mjs | 9 + public/icon.svg | 12 + public/logo.png | Bin 0 -> 21658 bytes src/App.tsx | 25 + src/components/About.tsx | 87 + src/components/Applications.tsx | 115 ++ src/components/CTA.tsx | 61 + src/components/Footer.tsx | 103 ++ src/components/Hero.tsx | 159 ++ src/components/Logo.tsx | 34 + src/components/Navbar.tsx | 110 ++ src/components/PointCloudOrb.tsx | 99 ++ src/components/Section.tsx | 54 + src/components/Technology.tsx | 96 ++ src/components/Workflow.tsx | 88 + src/index.css | 113 ++ src/main.tsx | 10 + src/vite-env.d.ts | 1 + tailwind.config.ts | 70 + tsconfig.json | 23 + tsconfig.node.json | 10 + vite.config.ts | 16 + 27 files changed, 3961 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 index.html create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 postcss.config.mjs create mode 100644 public/icon.svg create mode 100644 public/logo.png create mode 100644 src/App.tsx create mode 100644 src/components/About.tsx create mode 100644 src/components/Applications.tsx create mode 100644 src/components/CTA.tsx create mode 100644 src/components/Footer.tsx create mode 100644 src/components/Hero.tsx create mode 100644 src/components/Logo.tsx create mode 100644 src/components/Navbar.tsx create mode 100644 src/components/PointCloudOrb.tsx create mode 100644 src/components/Section.tsx create mode 100644 src/components/Technology.tsx create mode 100644 src/components/Workflow.tsx create mode 100644 src/index.css create mode 100644 src/main.tsx create mode 100644 src/vite-env.d.ts create mode 100644 tailwind.config.ts create mode 100644 tsconfig.json create mode 100644 tsconfig.node.json create mode 100644 vite.config.ts diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b67db25 --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +node_modules +dist +.DS_Store +*.local +.env +.env.* diff --git a/README.md b/README.md new file mode 100644 index 0000000..4c81d57 --- /dev/null +++ b/README.md @@ -0,0 +1,29 @@ +# 和光同坤 · 官网 (Landing Page) + +> 和光同坤的公司官网,展示我们端到端的 3D 扫描 / 重建 / 编辑 / 打印 技术,以及面向面部、足部、指甲三大行业的应用矩阵。 + +## 技术栈 + +- React 18 +- Vite 5 +- TypeScript +- TailwindCSS +- Framer Motion +- lucide-react + +## 本地开发 + +```bash +cd sfm/web/landing +npm install +npm run dev +``` + +打开 http://localhost:5173 即可预览。 + +## 构建产物 + +```bash +npm run build +npm run preview +``` diff --git a/index.html b/index.html new file mode 100644 index 0000000..6d93f4b --- /dev/null +++ b/index.html @@ -0,0 +1,24 @@ + + + + + + + + + + + + 和光同坤 · 把现实世界 3D 化,让它可编辑、可打印 + + +
+ + + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..bd87ecc --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2578 @@ +{ + "name": "heguang-landing", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "heguang-landing", + "version": "0.1.0", + "dependencies": { + "clsx": "^2.1.1", + "framer-motion": "^11.11.9", + "lucide-react": "^0.454.0", + "react": "^18.3.1", + "react-dom": "^18.3.1" + }, + "devDependencies": { + "@types/node": "^20.16.13", + "@types/react": "^18.3.12", + "@types/react-dom": "^18.3.1", + "@vitejs/plugin-react": "^4.3.3", + "autoprefixer": "^10.4.20", + "postcss": "^8.4.47", + "tailwindcss": "^3.4.14", + "typescript": "^5.6.3", + "vite": "^5.4.10" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "dev": true, + "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.3", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.3.tgz", + "integrity": "sha512-LIVqM46zQWZhj17qA8wb4nW/ixr2y1Nw+r1etiAWgRM6U1IqP+LNhL1yg440jYZR72jCWcWbLWzIosH+uP1fqg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "dev": true, + "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/generator": { + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "dev": true, + "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", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "dev": true, + "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-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "dev": true, + "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", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "dev": true, + "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", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz", + "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.3.tgz", + "integrity": "sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==", + "dev": true, + "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", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", + "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", + "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "dev": true, + "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", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "dev": true, + "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", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "dev": true, + "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.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.27", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", + "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", + "dev": true + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.4.tgz", + "integrity": "sha512-F5QXMSiFebS9hKZj02XhWLLnRpJ3B3AROP0tWbFBSj+6kCbg5m9j5JoHKd4mmSVy5mS/IMQloYgYxCuJC0fxEQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.4.tgz", + "integrity": "sha512-GxxTKApUpzRhof7poWvCJHRF51C67u1R7D6DiluBE8wKU1u5GWE8t+v81JvJYtbawoBFX1hLv5Ei4eVjkWokaw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.4.tgz", + "integrity": "sha512-tua0TaJxMOB1R0V0RS1jFZ/RpURFDJIOR2A6jWwQeawuFyS4gBW+rntLRaQd0EQ4bd6Vp44Z2rXW+YYDBsj6IA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.4.tgz", + "integrity": "sha512-CSKq7MsP+5PFIcydhAiR1K0UhEI1A2jWXVKHPCBZ151yOutENwvnPocgVHkivu2kviURtCEB6zUQw0vs8RrhMg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.4.tgz", + "integrity": "sha512-+O8OkVdyvXMtJEciu2wS/pzm1IxntEEQx3z5TAVy4l32G0etZn+RsA48ARRrFm6Ri8fvqPQfgrvNxSjKAbnd3g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.4.tgz", + "integrity": "sha512-Iw3oMskH3AfNuhU0MSN7vNbdi4me/NiYo2azqPz/Le16zHSa+3RRmliCMWWQmh4lcndccU40xcJuTYJZxNo/lw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.4.tgz", + "integrity": "sha512-EIPRXTVQpHyF8WOo219AD2yEltPehLTcTMz2fn6JsatLYSzQf00hj3rulF+yauOlF9/FtM2WpkT/hJh/KJFGhA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.4.tgz", + "integrity": "sha512-J3Yh9PzzF1Ovah2At+lHiGQdsYgArxBbXv/zHfSyaiFQEqvNv7DcW98pCrmdjCZBrqBiKrKKe2V+aaSGWuBe/w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.4.tgz", + "integrity": "sha512-BFDEZMYfUvLn37ONE1yMBojPxnMlTFsdyNoqncT0qFq1mAfllL+ATMMJd8TeuVMiX84s1KbcxcZbXInmcO2mRg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.4.tgz", + "integrity": "sha512-pc9EYOSlOgdQ2uPl1o9PF6/kLSgaUosia7gOuS8mB69IxJvlclko1MECXysjs5ryez1/5zjYqx3+xYU0TU6R1A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.4.tgz", + "integrity": "sha512-NxnomyxYerDh5n4iLrNa+sH+Z+U4BMEE46V2PgQ/hoB909i8gV1M5wPojWg9fk1jWpO3IQnOs20K4wyZuFLEFQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.4.tgz", + "integrity": "sha512-nbJnQ8a3z1mtmrwImCYhc6BGpThAyYVRQxw9uKSKG4wR6aAYno9sVjJ0zaZcW9BPJX1GbrDPf+SvdWjgTuDmnw==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.4.tgz", + "integrity": "sha512-2EU6acNrQLd8tYvo/LXW535wupT3m6fo7HKo6lr7ktQoItxTyOL1ZCR/GfGCuXl2vR+zmfI6eRXkSemafv+iVg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.4.tgz", + "integrity": "sha512-WeBtoMuaMxiiIrO2IYP3xs6GMWkJP2C0EoT8beTLkUPmzV1i/UcOSVw1d5r9KBODtHKilG5yFxsGRnBbK3wJ4A==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.4.tgz", + "integrity": "sha512-FJHFfqpKUI3A10WrWKiFbBZ7yVbGT4q4B5o1qKFFojqpaYoh9LrQgqWCmmcxQzVSXYtyB5bzkXrYzlHTs21MYA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.4.tgz", + "integrity": "sha512-mcEl6CUT5IAUmQf1m9FYSmVqCJlpQ8r8eyftFUHG8i9OhY7BkBXSUdnLH5DOf0wCOjcP9v/QO93zpmF1SptCCw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.4.tgz", + "integrity": "sha512-ynt3JxVd2w2buzoKDWIyiV1pJW93xlQic1THVLXilz429oijRpSHivZAgp65KBu+cMcgf1eVVjdnTLvPxgCuoQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.4.tgz", + "integrity": "sha512-Boiz5+MsaROEWDf+GGEwF8VMHGhlUoQMtIPjOgA5fv4osupqTVnJteQNKJwUcnUog2G55jYXH7KZFFiJe0TEzQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.4.tgz", + "integrity": "sha512-+qfSY27qIrFfI/Hom04KYFw3GKZSGU4lXus51wsb5EuySfFlWRwjkKWoE9emgRw/ukoT4Udsj4W/+xxG8VbPKg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.4.tgz", + "integrity": "sha512-VpTfOPHgVXEBeeR8hZ2O0F3aSso+JDWqTWmTmzcQKted54IAdUVbxE+j/MVxUsKa8L20HJhv3vUezVPoquqWjA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.4.tgz", + "integrity": "sha512-IPOsh5aRYuLv/nkU51X10Bf75Bsf6+gZdx1X+QP5QM6lIJFHHqbHLG0uJn/hWthzo13UAc2umiUorqZy3axoZg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.4.tgz", + "integrity": "sha512-4QzE9E81OohJ/HKzHhsqU+zcYYojVOXlFMs1DdyMT6qXl/niOH7AVElmmEdUNHHS/oRkc++d5k6Vy85zFs0DEw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.4.tgz", + "integrity": "sha512-zTPgT1YuHHcd+Tmx7h8aml0FWFVelV5N54oHow9SLj+GfoDy/huQ+UV396N/C7KpMDMiPspRktzM1/0r1usYEA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.4.tgz", + "integrity": "sha512-DRS4G7mi9lJxqEDezIkKCaUIKCrLUUDCUaCsTPCi/rtqaC6D/jjwslMQyiDU50Ka0JKpeXeRBFBAXwArY52vBw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.4.tgz", + "integrity": "sha512-QVTUovf40zgTqlFVrKA1uXMVvU2QWEFWfAH8Wdc48IxLvrJMQVMBRjuQyUpzZCDkakImib9eVazbWlC6ksWtJw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "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", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true + }, + "node_modules/@types/node": { + "version": "20.19.41", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.41.tgz", + "integrity": "sha512-ECymXOukMnOoVkC2bb1Vc/w/836DXncOg5m8Xj1RH7xSHZJWNYY6Zh7EH477vcnD5egKNNfy2RpNOmuChhFPgQ==", + "dev": true, + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/prop-types": { + "version": "15.7.15", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", + "dev": true + }, + "node_modules/@types/react": { + "version": "18.3.29", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.29.tgz", + "integrity": "sha512-ch0qJdr2JY0r04NXSprbK6TXOgnaJ1Tz23fm5W+z0/CBah6BSBc3n96h7K9GOtwh0HrilNWHIBzE1Ko4Dcw/Wg==", + "dev": true, + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", + "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", + "dev": true, + "peerDependencies": { + "@types/react": "^18.0.0" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", + "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.28.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.27", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.17.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true + }, + "node_modules/autoprefixer": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.5.0.tgz", + "integrity": "sha512-FMhOoZV4+qR6aTUALKX2rEqGG+oyATvwBt9IIzVR5rMa2HRWPkxf+P+PAJLD1I/H5/II+HuZcBJYEFBpq39ong==", + "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" + } + ], + "dependencies": { + "browserslist": "^4.28.2", + "caniuse-lite": "^1.0.30001787", + "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/baseline-browser-mapping": { + "version": "2.10.32", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.32.tgz", + "integrity": "sha512-wbPvpyjJPC0zdfdKXxqEL3Ea+bOMD/87X4lftiJkkaBiuG6ALQy1SLmEd7BSmVCuwCQsBrCamgBoLyfFDD1EPg==", + "dev": true, + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", + "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", + "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" + } + ], + "dependencies": { + "baseline-browser-mapping": "^2.10.12", + "caniuse-lite": "^1.0.30001782", + "electron-to-chromium": "^1.5.328", + "node-releases": "^2.0.36", + "update-browserslist-db": "^1.2.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001793", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001793.tgz", + "integrity": "sha512-iwSsYWaCOoh26cV8NwNRViHlrfUvYsHDfRVcbtmw0Kg6PJIZZXwMkj1442FYLBGkeUf1juAsU3DTfxW579mrPA==", + "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" + } + ] + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "dev": true + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, + "node_modules/electron-to-chromium": { + "version": "1.5.361", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.361.tgz", + "integrity": "sha512-Q6Hts7N9FnJc5LeGRINFvLhCI9xZmNtTDe5ZbcVezQz7cU4a8Aua3GH1b8J2XY8Al9PF+OCwYqhgsOOheMdvkA==", + "dev": true + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fraction.js": { + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", + "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/framer-motion": { + "version": "11.18.2", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-11.18.2.tgz", + "integrity": "sha512-5F5Och7wrvtLVElIpclDT0CBzMVg3dL22B64aZwHtsIY8RB4mXICLrkajK4G9R+ieSAGcgrLeae2SeUTg2pr6w==", + "dependencies": { + "motion-dom": "^11.18.1", + "motion-utils": "^11.18.1", + "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", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/hasown": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz", + "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", + "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", + "dev": true, + "dependencies": { + "hasown": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/jiti": { + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", + "dev": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lucide-react": { + "version": "0.454.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.454.0.tgz", + "integrity": "sha512-hw7zMDwykCLnEzgncEEjHeA6+45aeEzRYuKHuyRSOPkhko+J3ySGjGIzu+mmMfDFG1vazHepMaYFYHbTFAZAAQ==", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/motion-dom": { + "version": "11.18.1", + "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-11.18.1.tgz", + "integrity": "sha512-g76KvA001z+atjfxczdRtw/RXOM3OMSdd1f4DL77qCTF/+avrRJiawSG4yDibEQ215sr9kpinSlX2pCTJ9zbhw==", + "dependencies": { + "motion-utils": "^11.18.1" + } + }, + "node_modules/motion-utils": { + "version": "11.18.1", + "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-11.18.1.tgz", + "integrity": "sha512-49Kt+HKjtbJKLtgO/LKj9Ld+6vw9BjH5d9sc40R/kVyH8GLAXgT42M2NnuPcJNuA3s9ZfZBUcwIgpmZWGEE+hA==" + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", + "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-releases": { + "version": "2.0.46", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.46.tgz", + "integrity": "sha512-GYVXHE2KnrzAfsAjl4uP++evGFCrAU1jta4ubEjIG7YWt/64Gqv66a30yKwWczVjA6j3bM4nBwH7Pk1JmDHaxQ==", + "dev": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss": { + "version": "8.5.15", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", + "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", + "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" + } + ], + "dependencies": { + "nanoid": "^3.3.12", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.1.0.tgz", + "integrity": "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", + "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "lilconfig": "^3.1.1" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "jiti": ">=1.21.0", + "postcss": ">=8.0.9", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-refresh": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", + "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", + "dev": true, + "dependencies": { + "es-errors": "^1.3.0", + "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/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "4.60.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.4.tgz", + "integrity": "sha512-WHeFSbZYsPu3+bLoNRUuAO+wavNlocOPf3wSHTP7hcFKVnJeWsYlCDbr3mTS14FCizf9ccIxXA8sGL8zKeQN3g==", + "dev": true, + "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.60.4", + "@rollup/rollup-android-arm64": "4.60.4", + "@rollup/rollup-darwin-arm64": "4.60.4", + "@rollup/rollup-darwin-x64": "4.60.4", + "@rollup/rollup-freebsd-arm64": "4.60.4", + "@rollup/rollup-freebsd-x64": "4.60.4", + "@rollup/rollup-linux-arm-gnueabihf": "4.60.4", + "@rollup/rollup-linux-arm-musleabihf": "4.60.4", + "@rollup/rollup-linux-arm64-gnu": "4.60.4", + "@rollup/rollup-linux-arm64-musl": "4.60.4", + "@rollup/rollup-linux-loong64-gnu": "4.60.4", + "@rollup/rollup-linux-loong64-musl": "4.60.4", + "@rollup/rollup-linux-ppc64-gnu": "4.60.4", + "@rollup/rollup-linux-ppc64-musl": "4.60.4", + "@rollup/rollup-linux-riscv64-gnu": "4.60.4", + "@rollup/rollup-linux-riscv64-musl": "4.60.4", + "@rollup/rollup-linux-s390x-gnu": "4.60.4", + "@rollup/rollup-linux-x64-gnu": "4.60.4", + "@rollup/rollup-linux-x64-musl": "4.60.4", + "@rollup/rollup-openbsd-x64": "4.60.4", + "@rollup/rollup-openharmony-arm64": "4.60.4", + "@rollup/rollup-win32-arm64-msvc": "4.60.4", + "@rollup/rollup-win32-ia32-msvc": "4.60.4", + "@rollup/rollup-win32-x64-gnu": "4.60.4", + "@rollup/rollup-win32-x64-msvc": "4.60.4", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sucrase": { + "version": "3.35.1", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz", + "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "tinyglobby": "^0.2.11", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwindcss": { + "version": "3.4.19", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.19.tgz", + "integrity": "sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==", + "dev": true, + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.6.0", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.2", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.7", + "lilconfig": "^3.1.3", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.47", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.2 || ^5.0 || ^6.0", + "postcss-nested": "^6.2.0", + "postcss-selector-parser": "^6.1.2", + "resolve": "^1.22.8", + "sucrase": "^3.35.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", + "dev": true, + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "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" + } + ], + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/vite": { + "version": "5.4.21", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", + "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", + "dev": true, + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..20d1df1 --- /dev/null +++ b/package.json @@ -0,0 +1,29 @@ +{ + "name": "heguang-landing", + "version": "0.1.0", + "private": true, + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview" + }, + "dependencies": { + "clsx": "^2.1.1", + "framer-motion": "^11.11.9", + "lucide-react": "^0.454.0", + "react": "^18.3.1", + "react-dom": "^18.3.1" + }, + "devDependencies": { + "@types/node": "^20.16.13", + "@types/react": "^18.3.12", + "@types/react-dom": "^18.3.1", + "@vitejs/plugin-react": "^4.3.3", + "autoprefixer": "^10.4.20", + "postcss": "^8.4.47", + "tailwindcss": "^3.4.14", + "typescript": "^5.6.3", + "vite": "^5.4.10" + } +} diff --git a/postcss.config.mjs b/postcss.config.mjs new file mode 100644 index 0000000..2ef30fc --- /dev/null +++ b/postcss.config.mjs @@ -0,0 +1,9 @@ +/** @type {import('postcss-load-config').Config} */ +const config = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +}; + +export default config; diff --git a/public/icon.svg b/public/icon.svg new file mode 100644 index 0000000..8d8a736 --- /dev/null +++ b/public/icon.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/public/logo.png b/public/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..a2a23093effec12057e35041351b0127916a0ef4 GIT binary patch literal 21658 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 literal 0 HcmV?d00001 diff --git a/src/App.tsx b/src/App.tsx new file mode 100644 index 0000000..e8ec1d3 --- /dev/null +++ b/src/App.tsx @@ -0,0 +1,25 @@ +import { Navbar } from "@/components/Navbar"; +import { Hero } from "@/components/Hero"; +import { Technology } from "@/components/Technology"; +import { Applications } from "@/components/Applications"; +import { Workflow } from "@/components/Workflow"; +import { About } from "@/components/About"; +import { CTA } from "@/components/CTA"; +import { Footer } from "@/components/Footer"; + +export default function App() { + return ( +
+ +
+ + + + + + +
+
+
+ ); +} diff --git a/src/components/About.tsx b/src/components/About.tsx new file mode 100644 index 0000000..daebbf9 --- /dev/null +++ b/src/components/About.tsx @@ -0,0 +1,87 @@ +import { Section } from "./Section"; + +const PILLARS = [ + { + k: "长期主义的几何 AI", + v: "我们持续投入在点云补全、Mesh 补全、隐式表面与神经表征等长期技术上,把扫描的「残缺现实」补成「完整可造物」。", + }, + { + k: "跨平台 SDK 沉淀", + v: "重建管线已经在 iOS、安卓、鸿蒙、桌面与服务器上跑通,我们把同一套底层能力封装成 SDK,让上层应用可以快速迭代。", + }, + { + k: "面向真实场景", + v: "我们不做 demo,只做能落地的扫描:从医疗美学到鞋垫、甲片,都在用真实用户的数据持续迭代精度与体验。", + }, +]; + +export function About() { + return ( +
+ 一支专注于几何 AI + 的 3D 团队 + + } + description="我们相信:当扫描足够便利、补全足够智能、编辑足够直观,3D 就会像今天的拍照一样,成为每个人的日常工具。" + > +
+
+
+

+ 我们的技术底座是一套自研的 Structure-from-Motion 与 + TSDF 实时融合管线,覆盖从相机标定、跟踪、稠密重建到纹理映射的 + 全流程;在此之上,我们用神经网络去补全扫描盲区, + 把原本不可打印的「残缺扫描」变成完整、闭合、可制造的 3D 模型。 +

+

+ 在产品侧,我们把这套技术包装成「颜究所」「足部扫描」「指甲扫描」 + 三个垂直应用,并将通用扫描 + 网页编辑 + + 3D 打印的能力,开放给所有下载我们 App 的用户。 +

+
+ +
+ {[ + "Structure from Motion", + "Point Cloud Completion", + "Neural Mesh Completion", + "Real-time TSDF Fusion", + "ARKit / ARCore", + "iOS · Android · HarmonyOS", + "WebGL 编辑器", + "3D 打印工艺适配", + ].map((tag) => ( + + {tag} + + ))} +
+
+ +
+ {PILLARS.map((p) => ( +
+
+ {p.k} +
+
+ {p.v} +
+
+ ))} +
+
+
+ ); +} diff --git a/src/components/Applications.tsx b/src/components/Applications.tsx new file mode 100644 index 0000000..c6555e4 --- /dev/null +++ b/src/components/Applications.tsx @@ -0,0 +1,115 @@ +import { ArrowUpRight, ScanFace, Footprints, Hand } from "lucide-react"; +import { Section } from "./Section"; + +type AppCard = { + brand: string; + brandEn: string; + tagline: string; + desc: string; + icon: typeof ScanFace; + bullets: string[]; + gradient: string; + ring: string; +}; + +const APPS: AppCard[] = [ + { + brand: "颜究所", + brandEn: "face3dapp", + tagline: "3D 面部记录 / 对比 / 捏脸", + desc: + "毫米级人脸 3D 重建,记录皮肤、轮廓、表情随时间的变化,并支持在 3D 模型上自由「捏脸」与美学方案预演。", + icon: ScanFace, + bullets: ["52 维 ARKit 表情融合", "面部对齐与多次扫描对比", "AR 捏脸与方案预演"], + gradient: "from-cyan/18 via-cyan/6 to-transparent", + ring: "ring-orange-200/60", + }, + { + brand: "足部扫描", + brandEn: "Foot Scan · Insole", + tagline: "鞋垫 / 矫形垫 定制", + desc: + "通过手机扫描足底足弓三维结构,自动分析压力分布与足型特征,一键生成可 3D 打印 / CNC 加工的个性化鞋垫模型。", + icon: Footprints, + bullets: ["足弓 / 足型自动分析", "鞋垫模板自动生成", "面向矫形医师的协作"], + gradient: "from-violet/18 via-violet/6 to-transparent", + ring: "ring-rose-200/60", + }, + { + brand: "指甲扫描", + brandEn: "Nail Scan · Custom", + tagline: "美甲分割 / 定制甲片", + desc: + "手部 3D 扫描 + 指甲实例分割,精确获取每一片指甲的形状与曲率,生成贴合度与美观度兼具的定制甲片。", + icon: Hand, + bullets: ["十指实例分割", "曲率与厚度精准建模", "甲片图案 / 材质在线预览"], + gradient: "from-cyan/18 via-cyan/6 to-transparent", + ring: "ring-orange-200/60", + }, +]; + +export function Applications() { + return ( +
+ 三大行业应用, + 已经在用我们的 3D 技术 + + } + description="我们把 3D 扫描与几何补全能力,落到「面部美学、足部健康、指甲定制」三个高价值定制化场景。" + > +
+ {APPS.map((app) => ( +
+
+
+
+
+ +
+ +
+ +

+ {app.brand} +

+
+ {app.brandEn} +
+
+ {app.tagline} +
+ +

+ {app.desc} +

+ +
    + {app.bullets.map((b) => ( +
  • + + {b} +
  • + ))} +
+
+
+ ))} +
+
+ ); +} diff --git a/src/components/CTA.tsx b/src/components/CTA.tsx new file mode 100644 index 0000000..f322331 --- /dev/null +++ b/src/components/CTA.tsx @@ -0,0 +1,61 @@ +import { ArrowRight, Download, Upload } from "lucide-react"; + +export function CTA() { + return ( +
+
+
+
+
+ +
+
+ + Get Started +
+

+ 准备好把你身边的世界, + 变成可打印的 3D 模型 + 了吗? +

+

+ 下载我们的通用 3D 扫描 App,扫一次,补全一次,在浏览器里编辑一次, + 然后把它打印出来 —— 整个过程不到 10 分钟。 +

+ + + +
+ iOS 14+ + + Android 9+ + + HarmonyOS + + Chrome / Safari (Web 编辑器) +
+
+
+
+
+ ); +} diff --git a/src/components/Footer.tsx b/src/components/Footer.tsx new file mode 100644 index 0000000..ecce9e1 --- /dev/null +++ b/src/components/Footer.tsx @@ -0,0 +1,103 @@ +import { Mail, Github, Globe } from "lucide-react"; +import { Logo } from "./Logo"; + +const LINKS: { title: string; items: { label: string; href: string }[] }[] = [ + { + title: "产品", + items: [ + { label: "颜究所 face3dapp", href: "#applications" }, + { label: "足部扫描", href: "#applications" }, + { label: "指甲扫描", href: "#applications" }, + { label: "通用 3D 扫描 App", href: "#cta" }, + ], + }, + { + title: "技术", + items: [ + { label: "3D 扫描重建", href: "#technology" }, + { label: "点云 / Mesh 补全", href: "#technology" }, + { label: "Web 3D 编辑器", href: "#workflow" }, + { label: "3D 打印工作流", href: "#workflow" }, + ], + }, + { + title: "公司", + items: [ + { label: "关于我们", href: "#about" }, + { label: "工作流", href: "#workflow" }, + { label: "加入我们", href: "#" }, + { label: "联系我们", href: "mailto:hello@heguangtongkun.com" }, + ], + }, +]; + +export function Footer() { + return ( +
+
+
+
+ +

+ 和光同坤 · 致力于把现实世界扫描成完整、可编辑、可打印的 3D 模型。 +

+ +
+ {[ + { href: "mailto:hello@heguangtongkun.com", label: "Email", Icon: Mail }, + { href: "#", label: "GitHub", Icon: Github }, + { href: "#", label: "Website", Icon: Globe }, + ].map(({ href, label, Icon }) => ( + + + + ))} +
+
+ +
+ {LINKS.map((col) => ( +
+
+ {col.title} +
+ +
+ ))} +
+
+ +
+
© {new Date().getFullYear()} 和光同坤. All rights reserved.
+ +
+
+
+ ); +} diff --git a/src/components/Hero.tsx b/src/components/Hero.tsx new file mode 100644 index 0000000..7e32761 --- /dev/null +++ b/src/components/Hero.tsx @@ -0,0 +1,159 @@ +"use client"; + +import { ArrowRight, Download, Upload, Sparkles } from "lucide-react"; +import { motion } from "framer-motion"; +import { PointCloudOrb } from "./PointCloudOrb"; + +export function Hero() { + return ( +
+
+
+
+
+
+
+ +
+
+ + + 自研 SfM · 神经网格补全 · 端到端 3D 工作流 + + + + 把现实世界 3D 化, +
+ 让它可编辑、 + 可打印。 +
+ + + 我们用一部手机完成专业级 3D 扫描,用 AI + 自动补全点云与网格的缺失部分,再让你在浏览器里编辑、定制、一键 + 3D 打印 —— 把扫描到的现实,变成可创造的实物。 + + + + + + 下载 3D 扫描 App + + + + + 在线上传你的模型 + + + + + {[ + { v: "<60s", k: "完成一次手机扫描" }, + { v: "0.3mm", k: "重建精度可达" }, + { v: "3 行业", k: "已落地定制化场景" }, + ].map((s) => ( +
+
+ {s.v} +
+
{s.k}
+
+ ))} +
+
+ + + + + + + +
+
+ ); +} + +function FloatingChip({ + className = "", + label, + sub, + color, +}: { + className?: string; + label: string; + sub: string; + color: "cyan" | "violet"; +}) { + const dot = + color === "cyan" + ? "bg-cyan shadow-[0_0_16px_rgba(251,146,60,0.45)]" + : "bg-violet shadow-[0_0_16px_rgba(251,113,133,0.4)]"; + return ( + + ); +} diff --git a/src/components/Logo.tsx b/src/components/Logo.tsx new file mode 100644 index 0000000..b84ae0d --- /dev/null +++ b/src/components/Logo.tsx @@ -0,0 +1,34 @@ +import { clsx } from "clsx"; + +interface LogoProps { + className?: string; + withWordmark?: boolean; +} + +export function Logo({ className, withWordmark = true }: LogoProps) { + return ( +
+ + {withWordmark + + {withWordmark && ( +
+ + 和光同坤 + + + HeGuang TongKun + +
+ )} +
+ ); +} diff --git a/src/components/Navbar.tsx b/src/components/Navbar.tsx new file mode 100644 index 0000000..34f1239 --- /dev/null +++ b/src/components/Navbar.tsx @@ -0,0 +1,110 @@ +"use client"; + +import { useEffect, useState } from "react"; +import { clsx } from "clsx"; +import { Menu, X } from "lucide-react"; +import { Logo } from "./Logo"; + +const NAV_ITEMS = [ + { href: "#technology", label: "核心技术" }, + { href: "#applications", label: "行业应用" }, + { href: "#workflow", label: "工作流" }, + { href: "#about", label: "关于我们" }, +]; + +export function Navbar() { + const [scrolled, setScrolled] = useState(false); + const [open, setOpen] = useState(false); + + useEffect(() => { + const onScroll = () => setScrolled(window.scrollY > 12); + onScroll(); + window.addEventListener("scroll", onScroll, { passive: true }); + return () => window.removeEventListener("scroll", onScroll); + }, []); + + return ( +
+
+ + + + + + + + + +
+ + {open && ( + + )} +
+ ); +} diff --git a/src/components/PointCloudOrb.tsx b/src/components/PointCloudOrb.tsx new file mode 100644 index 0000000..9aa31af --- /dev/null +++ b/src/components/PointCloudOrb.tsx @@ -0,0 +1,99 @@ +"use client"; + +import { useMemo } from "react"; + +/** + * Decorative "point cloud" orb composed of SVG dots arranged on a Fibonacci + * sphere and projected onto 2D. Rotation/float animation is purely CSS so it + * stays lightweight and avoids pulling in a 3D renderer. + */ +export function PointCloudOrb() { + const points = useMemo(() => generateSpherePoints(720, 1), []); + + return ( +
+ {/* Outer glow */} +
+
+ + {/* Rotating wireframe rings */} +
+ + + + + + + + + + {[0, 30, 60, 90, 120, 150].map((deg) => ( + + ))} + +
+ + {/* Point cloud */} +
+ + + + + + + + + {points.map((p, i) => { + // depth-based opacity & size for fake perspective + const depth = (p.z + 1) / 2; // 0..1 + const r = 0.005 + depth * 0.012; + const opacity = 0.15 + depth * 0.85; + return ( + + ); + })} + +
+ + {/* Inner glow pulse */} +
+ + {/* Scan ring */} +
+
+
+ ); +} + +function generateSpherePoints(count: number, radius = 1) { + const points: { x: number; y: number; z: number }[] = []; + const phi = Math.PI * (3 - Math.sqrt(5)); // golden angle + + for (let i = 0; i < count; i++) { + const y = 1 - (i / (count - 1)) * 2; // y from 1 to -1 + const r = Math.sqrt(1 - y * y); + const theta = phi * i; + const x = Math.cos(theta) * r; + const z = Math.sin(theta) * r; + points.push({ x: x * radius, y: y * radius, z: z * radius }); + } + return points; +} diff --git a/src/components/Section.tsx b/src/components/Section.tsx new file mode 100644 index 0000000..b3d410b --- /dev/null +++ b/src/components/Section.tsx @@ -0,0 +1,54 @@ +import { clsx } from "clsx"; +import type { ReactNode } from "react"; + +interface SectionProps { + id?: string; + eyebrow?: string; + title: ReactNode; + description?: ReactNode; + align?: "left" | "center"; + className?: string; + children: ReactNode; +} + +export function Section({ + id, + eyebrow, + title, + description, + align = "center", + className, + children, +}: SectionProps) { + return ( +
+
+
+ {eyebrow && ( +
+ + {eyebrow} +
+ )} +

+ {title} +

+ {description && ( +

+ {description} +

+ )} +
+ {children} +
+
+ ); +} diff --git a/src/components/Technology.tsx b/src/components/Technology.tsx new file mode 100644 index 0000000..2b5cd69 --- /dev/null +++ b/src/components/Technology.tsx @@ -0,0 +1,96 @@ +import { ScanLine, Sparkles, Pencil, Printer } from "lucide-react"; +import { Section } from "./Section"; + +const FEATURES = [ + { + icon: ScanLine, + title: "高精度 3D 扫描", + desc: + "基于自研 SfM 与多视图融合算法,在手机端即可完成毫米级精度的点云与网格重建,无需专业硬件。", + accent: "from-cyan/20 via-cyan/8 to-transparent", + iconColor: "text-cyan", + }, + { + icon: Sparkles, + title: "AI 点云 / Mesh 补全", + desc: + "深度学习驱动的几何补全,自动修复扫描盲区、空洞与噪点,把残缺的扫描变成完整、闭合、水密的可打印模型。", + accent: "from-violet/20 via-violet/8 to-transparent", + iconColor: "text-violet", + }, + { + icon: Pencil, + title: "可视化在线编辑", + desc: + "浏览器内的轻量 3D 编辑器,支持裁切、雕刻、变形、纹理调整、对齐与测量,所见即所得。", + accent: "from-cyan/20 via-cyan/8 to-transparent", + iconColor: "text-cyan", + }, + { + icon: Printer, + title: "一键 3D 打印就绪", + desc: + "自动检查水密性、厚度与悬空,输出 STL / OBJ / PLY,直接送入桌面打印机或工业产线。", + accent: "from-violet/20 via-violet/8 to-transparent", + iconColor: "text-violet", + }, +]; + +export function Technology() { + return ( +
+ 一套从扫描到打印 + 的端到端技术栈 + + } + description="我们长期投入到点云与网格的几何补全研究,让每一次扫描都能成为可创造的实物。" + > +
+ {FEATURES.map((f) => ( +
+
+
+
+ +
+

+ {f.title} +

+

+ {f.desc} +

+
+
+ ))} +
+ +
+ {[ + { v: "SfM", k: "自研多视图重建管线" }, + { v: "TSDF", k: "实时融合 / 流式建网" }, + { v: "Neural", k: "Mesh 补全网络" }, + { v: "iOS · 安卓 · HarmonyOS", k: "跨平台移动 SDK" }, + ].map((m) => ( +
+
+ {m.v} +
+
{m.k}
+
+ ))} +
+
+ ); +} diff --git a/src/components/Workflow.tsx b/src/components/Workflow.tsx new file mode 100644 index 0000000..db74bb7 --- /dev/null +++ b/src/components/Workflow.tsx @@ -0,0 +1,88 @@ +import { Smartphone, Upload, Wand2, MousePointerSquareDashed, Printer } from "lucide-react"; +import { Section } from "./Section"; + +const STEPS = [ + { + icon: Smartphone, + title: "用手机扫描", + desc: + "下载通用 3D 扫描 App,围绕物体走一圈即可在端侧实时重建出点云与初始网格。", + }, + { + icon: Upload, + title: "上传到云端", + desc: + "把扫描结果一键同步到我们的 Web 平台,无需复杂导出与转换。", + }, + { + icon: Wand2, + title: "AI 自动补全", + desc: + "我们的神经网格补全模型自动修复扫描盲区与空洞,生成完整、闭合的可打印模型。", + }, + { + icon: MousePointerSquareDashed, + title: "浏览器内编辑", + desc: + "在 Web 编辑器里裁切、变形、雕刻,添加文字与纹理,所见即所得。", + }, + { + icon: Printer, + title: "一键 3D 打印", + desc: + "导出 STL / OBJ / PLY,送入桌面打印机,或对接我们的合作打印工厂。", + }, +]; + +export function Workflow() { + return ( +
+ 通用 3D 扫描器 × 网页编辑 × + 3D 打印 + + } + description="对所有 App 用户开放:从一个普通物体的手机扫描,到最终拿在手里的实物,只需五步。" + > +
+
+ +
    + {STEPS.map((s, i) => ( +
  1. +
    +
    +
    +
    + +
    + + {i + 1} + +
    +

    + {s.title} +

    +

    + {s.desc} +

    +
    +
  2. + ))} +
+
+ +
+

+ 面向所有 App 用户开放。{" "} + 无论你扫描的是手办、家具一角、文物碎片,还是想做一个属于自己的纪念品, + 都可以在这里完成「扫描 → 补全 → 编辑 → 打印」的完整闭环。 +

+
+
+ ); +} diff --git a/src/index.css b/src/index.css new file mode 100644 index 0000000..37c9b3f --- /dev/null +++ b/src/index.css @@ -0,0 +1,113 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +:root { + color-scheme: light; + --bg: #ffffff; + --bg-soft: #f8fafc; + --fg: #0f172a; + --fg-muted: #64748b; + --accent-cyan: #f97316; + --accent-violet: #ef4444; +} + +html, +body { + background: var(--bg); + color: var(--fg); + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +body { + font-feature-settings: "rlig" 1, "calt" 1; + text-rendering: optimizeLegibility; + letter-spacing: 0.015em; +} + +::selection { + background: rgba(249, 115, 22, 0.22); + color: #0f172a; +} + +::-webkit-scrollbar { + width: 10px; + height: 10px; +} +::-webkit-scrollbar-track { + background: #f8fafc; +} +::-webkit-scrollbar-thumb { + background: linear-gradient(180deg, #e2e8f0, #cbd5e1); + border-radius: 6px; +} +::-webkit-scrollbar-thumb:hover { + background: linear-gradient(180deg, #fdba74, #fb923c 45%, #fb7185); +} + +.bg-line-grid { + background-image: + linear-gradient(rgba(15, 23, 42, 0.04) 1px, transparent 1px), + linear-gradient(90deg, rgba(15, 23, 42, 0.04) 1px, transparent 1px); + background-size: 56px 56px; +} + +.text-brand-gradient { + background: linear-gradient( + 106deg, + #e84832 0%, + #ec5f30 18%, + #f07432 38%, + #f38834 58%, + #f69a3c 78%, + #f9ad52 100% + ); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; + color: transparent; +} + +.glass { + background: linear-gradient( + 180deg, + rgba(255, 255, 255, 0.95) 0%, + rgba(248, 250, 252, 0.92) 100% + ); + border: 1px solid rgba(15, 23, 42, 0.08); + backdrop-filter: blur(16px); + -webkit-backdrop-filter: blur(16px); + box-shadow: 0 1px 3px rgba(15, 23, 42, 0.04); +} + +.heading-display { + font-weight: 600; + letter-spacing: 0.01em; + line-height: 1.18; + color: #0f172a; +} + +.ring-soft { + box-shadow: + inset 0 1px 0 rgba(255, 255, 255, 0.8), + 0 1px 2px rgba(15, 23, 42, 0.05); +} + +.container-x { + max-width: 1200px; + margin-left: auto; + margin-right: auto; + padding-left: 1.25rem; + padding-right: 1.25rem; +} +@media (min-width: 768px) { + .container-x { + padding-left: 2rem; + padding-right: 2rem; + } +} + +html { + scroll-behavior: smooth; +} diff --git a/src/main.tsx b/src/main.tsx new file mode 100644 index 0000000..65dc4ec --- /dev/null +++ b/src/main.tsx @@ -0,0 +1,10 @@ +import { StrictMode } from "react"; +import { createRoot } from "react-dom/client"; +import App from "./App"; +import "./index.css"; + +createRoot(document.getElementById("root")!).render( + + + +); diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/tailwind.config.ts b/tailwind.config.ts new file mode 100644 index 0000000..e92deb3 --- /dev/null +++ b/tailwind.config.ts @@ -0,0 +1,70 @@ +import type { Config } from "tailwindcss"; + +const config: Config = { + content: ["./index.html", "./src/**/*.{js,ts,jsx,tsx}"], + theme: { + extend: { + colors: { + ink: { + 950: "#FFFFFF", + 900: "#F8FAFC", + 800: "#F1F5F9", + 700: "#E2E8F0", + 600: "#CBD5E1", + }, + cyan: { + DEFAULT: "#F97316", + soft: "#FDBA74", + }, + violet: { + DEFAULT: "#EF4444", + soft: "#FCA5A5", + }, + }, + fontFamily: { + sans: [ + "Plus Jakarta Sans", + "Noto Sans SC", + "PingFang SC", + "Hiragino Sans GB", + "Microsoft YaHei", + "ui-sans-serif", + "system-ui", + "sans-serif", + ], + mono: ["ui-monospace", "SFMono-Regular", "Menlo", "monospace"], + }, + backgroundImage: { + "grid-fade": + "radial-gradient(ellipse at center, rgba(251,146,60,0.06) 0%, transparent 75%)", + "brand-gradient": + "linear-gradient(106deg, #E84832 0%, #EC5F30 22%, #F07432 48%, #F38834 72%, #F9AD52 100%)", + "brand-gradient-soft": + "linear-gradient(106deg, rgba(232,72,50,0.28) 0%, rgba(240,116,50,0.20) 50%, rgba(249,173,82,0.16) 100%)", + "ambient-top": + "radial-gradient(ellipse 90% 70% at 50% -8%, rgba(254,215,170,0.38) 0%, rgba(251,146,60,0.14) 38%, transparent 72%)", + "ambient-bottom": + "radial-gradient(ellipse 85% 65% at 50% 108%, rgba(251,113,133,0.22) 0%, rgba(248,113,113,0.10) 42%, transparent 74%)", + }, + boxShadow: { + "glow-cyan": "0 0 72px -18px rgba(251,146,60,0.28)", + "glow-violet": "0 0 72px -18px rgba(251,113,133,0.24)", + "glow-soft": "0 0 100px -24px rgba(251,146,60,0.18)", + }, + animation: { + "spin-slow": "spin 16s linear infinite", + float: "float 8s ease-in-out infinite", + "pulse-slow": "pulse 4s cubic-bezier(0.4, 0, 0.6, 1) infinite", + }, + keyframes: { + float: { + "0%, 100%": { transform: "translateY(0px)" }, + "50%": { transform: "translateY(-14px)" }, + }, + }, + }, + }, + plugins: [], +}; + +export default config; diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..d541922 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "paths": { + "@/*": ["./src/*"] + } + }, + "include": ["src"] +} diff --git a/tsconfig.node.json b/tsconfig.node.json new file mode 100644 index 0000000..7366cef --- /dev/null +++ b/tsconfig.node.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "target": "ES2022", + "lib": ["ES2023"], + "module": "ESNext", + "skipLibCheck": true, + "moduleResolution": "bundler" + }, + "include": ["vite.config.ts"] +} diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000..2969a03 --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,16 @@ +import { defineConfig } from "vite"; +import react from "@vitejs/plugin-react"; +import path from "path"; + +export default defineConfig({ + plugins: [react()], + server: { + port: 5173, + strictPort: false, + }, + resolve: { + alias: { + "@": path.resolve(__dirname, "./src"), + }, + }, +});